第六章:数组
一维数组:
1、定义一个10个元素的整数数组,赋值为1-10,按如下格式输出数组中的全部数据。
a[0]=1 a[1]=2 …………
2、打印出Fibonacci数列:从第3个数开始的每个数的值为前两个数之和。
1 1
2
3 5 8 ……
3、输入10个学生的成绩到一个数组中,查找出最低分数及最高分数,计算出总分以及平
均分,计算出及格人数以及成绩在平均分以上的人数。
4、有一个数组,内放10个整数。要求找出最小的数和它的下标,然后把它和数组中最前
面的元素对换位置,找出最大的数和它的下标,然后把它和数组中最后面的元素对换位置。
5、利用随机函数产生10个1-100随机数,并存入数组中。
注解:产生随机数的方法
1)包含库文件#include "Stdlib.h"
使用用randomize()随机种子函数及随机数生产函数random(101),参数表示范围2)使用用randomize()随机种子函数
随机数生产函数rand (),无参数,产生int数据类型范围内的随机数
6、将数组中所有元素的值向后移动一位,最后一个元素的值移动到第一个元素中;(将数
组中所有元素的值向前移动一位,第一个元素的值移动到最后一个元素中)
7、将数组中元素的值先按原序输出,逆置(第一个与最后一个交换,第二个与倒数第二个
交换,依次类推)后再输出一次;
8、将一个数组中的元素反向复制到另一个数组中,输出这两个数组。
9、编程输入一个小写字母,以该字母为第一个字母按字母表逆序输出字母表中所有小写字
母。(例:输入m ,则输出:mlkjihgfedcbazyxwvutsrqpon)(利用数组或不利用数组两种方式编程)
10、输入一个数,在数组中找到第一个比它大的数,将输入的数据插入到这个数的前面。
11、将两个数组中的元素交叉复制到一个新的数组中。
12、定义一个整数数组,求出奇数和偶数个数
13、有30个0-9之间的数字,分别统计0-9出现的次数
14、用筛选法求100之内的素数
筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛子。具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
15、下面的程序从键盘接收任意5个数放入数组A中,假设这5个数为:8 1 4 2 5,则要输
出一个具有如下内容的方阵。
16、十五个猴子围成一圈选大王,依次1-7 循环报数,报到7 的猴子被淘汰,直到最后一
只猴子成为大王。问,哪只猴子最后能成为大王?(有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数,凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。问此人原来的位置是多少号?)
17、有N个数已按由小到大的顺序排好,要求输入一个数,把它插入到原有序列中,而且
仍然保持有序。
18、查找出圆环中(一维数组)中任意四个相邻数之和的最大值,输出起始位置和终止位置
以及这四个数。
19、将一个数组中序号为单和双的分别复制到另外两个数组中。
20、将一个数组中的最大数和第二大数分别找出来。
21、数组中记录有一个单位200职工的年龄,编程统计出各年龄段的人数。
22、将数组中每一个数出现的次数统计出来。
字符串专题:
23、编写程序将字符串中的元音字母输出。例如字符串为“boy and girl”, 则输出为:oai
24、从键盘上任意输入一个字符串S,输出其中的数字字符。例如输入为:sd12we$*55abc8,
则输出结果为:12558
25、统计26个英文字符在一个字符串中出现的次数。
26、将两个字符串连接起来。(连接到第一个字符串的后面,不使用strcat函数)
27、编程:在一字符串中查找某个指定的字符,找到则输出字符第一次出现的位置,未找到
则输出“not found”。
28、判断字符串sub是否是字符串str的子串。
29、将两个字符串合并到一个新的字符串中。
30、删除一个字符串中所有数字字符。(注意删除后字符的移位)
31、统计一个字符串中单词的个数。(以空格作为分隔符)
32、比较三个字符串,将最大的字符串输出。
33、将输入的10个字符串的字符数保存在一个数组中。
排序专题:
34、冒泡排序:
(1)从第一个开始,每相邻两个数进行比较,较小的排前面,大的放后面,第一轮后最大的排最后;第二轮除最后一个数,前面的数按第一轮方式交换,依次类推,完成排序。
(2)将数组中第一个数与后面的每一个数比较,如果较小就交换,第一轮结束后,最小的数在最前面;第二轮从第二个数开始,将第二个数与其后每一个数比较,较小就交换,依次类推,完成排序。
35、对100个100以内的随机数按从大到小的顺序排序,输出所有不重复的数据。(去除重
复数据后输出。)
36、统计一个单位职工的年龄,要求把相同年龄最多的那个年龄找出来(可能有几个这样的
年龄),并统计出现的次数。
37、选择法排序:是对冒泡法排序的改进,在每一轮的比较中找到最小值(或最大值),然
后与最前面的元素进行交换,第二轮排除第一个元素继续上述算法,相对于冒泡排序在于减少了很多不必要的数据交换。
38、利用选择法对100个学生成绩按照从大到小的顺序排序,并统计及格与不及格成绩的人
数、总分、平均分。
39、插入法排序:将10个-50到+50之间的随机数按从小到大的顺序插入到数组中。(插入
法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序)
40、利用插入法将数组a中的所有元素按顺序插入到数组b中(a数组保持不变,b数组排
序),输出两个数组的值。
(shell排序法不常用到,学生自查资料;另外在函数讲解后再学习快速排序法)
二维数组:
41、定义一个五行六列的二维数组,给每一个元素赋值为一个100以内的随机数(赋值为行
号与列号之和),按矩阵形式输出该数组。
42、定义a数组为三行五列,定义b数组为五行三列,将a数组的值转置后赋值给b数组。
按矩阵形式打印出两个数组。
43、将含100个元素的一维数组的值按顺序复制到二维数组中,打印出两个数组出来。
44、查找二维数组中最大值的行号与列号。
45、查找二维数组中每一行的最大值,并求出它们的和。
46、打印杨辉三角形的前10行。
47、打印如下图所示数字方阵:
48、把一个二维实型数组a按照第0列的元素进行排序(由小到大排序,用冒泡法或选择法)。
例如:如果a[i][0]大于a[i+1][0],则i行与i+1行中所有元素都要进行对换。
49、查找二维数组中每一列的最小值,打印出它的位置和值。(扩展:查找二维数组中的鞍
点:一个数在行中是最大的,在列中是最小的)
50、有 N个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。
51、输出“魔方阵(奇数)”。
介绍:
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数
减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则
2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最
后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数
放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
简单图示如下:
填魔术方阵的方法以奇数最为简单,第一个数字放在第一行第一列的正中央,然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:
数组复习
52、从键盘输入若干个整数,其值在0至4范围内,用-1作为输入结束的标志。统计每个
整数的个数。
53、定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每
五个数求出一个平均值,放在另一个数组中并输出。
54、通过赋初值按行顺序为一个二维数组赋予2、4、6、...等偶数,然后按列的顺序输出该
数组。
55、通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后分别输出该数组
的左下半三角、右上半三角、对角线、最外圈数值。
56、数组a包括10个整数,把a中所有的后项除以前项之商保留2位小数存入数组b,并
按每行3个元素的格式输出数组b。
57、从键盘输入两个字符串a和b,要求不用库函数strcat把串b的前五个字符连接到串a
中;如果b的长度小于5,则把b的所有元素都连接到a中。
58、若输入7 4 8 9 1 5,则输出:
5 7 4 8 9 1
1 5 7 4 8 9
9 1 5 7 4 8
8 9 1 5 7 4
4 8 9 1
5 7
7 4 8 9 1 5
59、把两个已按升序排列的数组合并成一个升序数组
60、编程打印用户指定的n阶顺时针螺旋方阵(n<10)。
61、生成并打印某数列的前20项,该数列第1,2项分别为0和1,以后每个奇数编号的项是前
两项之和,偶数编号的项是前两项差的绝对值。生成的20个数存在一维数组x中,并按每行4项的形式输出。
参考答案
第9题:
第13题:
#include "Stdlib.h"
int main(void)
{
int a[30],b[10]={0},i;
randomize();
for(i=0;i<30;i++){
a[i]=random(10);
printf("%d ",a[i]);
}
for(i=0;i<30;i++){ b[a[i]]++; }
for(i=0;i<10;i++) { printf("\n%d : %d", i ,b[i]); } getch();
}
第14题:
int main(void)
{
int a[100]={0},i,j,t;
for(i=1;i<100;i++) {
a[i]=i+1;
printf("%d ",a[i]);
}
for(i=0;i<100;i++) {
if(a[i]!=0) {
t=a[i];
for(j=i+1;j<100;j++) {
if(a[j]%t==0)
a[j]=0;
}
}
}
printf("\n");
for(i=0;i<100;i++) {
if (a[i]) printf("%d ",a[i]);
}
getch();
return 0;
}
第16题:
int main(void)
{
int a[15],i,j,count,del=0;
for(i=0;i<15;i++) {
a[i]=i+1;
}
i=0;count=0;
while(del!=14) {
if(a[i]!=0) {
count++;
if(count%7==0)
{a[i]=0;del++;}
}
i++;
if(i>14) i=0;
}
for(j=0;j<15;j++)
printf("%d ",a[j]);
getch();
return 0;
}
第28题:
int main(void)
{
char str[100],sub[50];
int i,j,len;
printf("input str:");
gets(str);
printf("input sub:");
gets(sub);
len=strlen(sub);
i=0;
while(str[i]!='\0')
{
if(str[i]==sub[0])
{
j=0;
while(sub[j]!='\0')
{
if(sub[j]!=str[i+j])
break;
j++;
}
}
if(j==len)
{
printf("yes,from:%d\n");
break;
}
i++;
}
if(str[i]=='\0')
printf("not\n");
getch();
return 0;
}
第30题:
main()
{
char a[100];
int i,j;
gets(a);
i=0;
while(a[i]!='\0')
{
if(a[i]>=48&&a[i]<=57)
{
j=i;
while(a[j]!='\0')
{
a[j]=a[j+1];
j++;
}
i--;
}
i++;
}
puts(a);
getch();
}
第34题:
方法一:
int main(void)
{
int a[10];
int i,j,t;
printf("input 10 numbers :\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if (a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
getch();
return 0;
}
方法二:
int main(void)
{
int a[10];
int i,j,t;
printf("input 10 numbers :\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<10;j++)
for(i=j;i<10;i++)
if (a[j]>a[i])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
getch();
return 0;
}
第36题:
#include "stdlib.h"
int main(void)
{
int a[100]={0},i,j,t,count,curr,max;
randomize();
for(i=0;i<100;i++)
{
a[i]=random(40)+20;
printf("%d ",a[i]);
}
for(i=0;i<100;i++)
{
for(j=0;j<100-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("\n\n");
for(i=0;i<100;i++)
{
printf("%d ",a[i]);
}
t=a[0];
count=0;max=0;
for(i=0;i<100;i++)
{
if(a[i]==t)
{
count++;
}
else
{
if(count>max)
{ max=count; curr=a[i-1];}
t=a[i];
count=1;
}
}
printf("\n\n");
printf("numbers of %d: %d",curr,max); getch();
return 0;
}
第37题:
#include "stdlib.h"
int main(void)
{
int a[20],i,j,k,t;
randomize();
for(i=0;i<20;i++)
{
a[i]=random(100);
printf("%d ",a[i]);
}
for(i=0;i<20;i++)
{
k=i;
for(j=i;j<20;j++)
{
if(a[j] k=j; } if(k!=i) { t=a[i]; a[i]=a[k]; a[k]=t; } } printf("\n"); for(t=0;t<20;t++) { printf("%d ",a[t]); } getch(); } 第39题: #include "Stdlib.h" int main(void) { int a[10]={0},i,j,k,t,ran; randomize(); for(i=0;i<10;i++){ ran=random(101)-50; printf("%d ",ran); j=i-1;