{ int i,a[3][3]={1,2,3,4,5,6,7,8,9},sum=0; for(i=1;i<=3;i++) sum+=a[i][i]; printf(\ }
解答:C语言中数组元素的下标是从0开始的,所以循环变量i的取值应该是0到2。 答案:
错误行:将语句for(i=1;i<=3;i++) sum+=a[i][i]; 修改为:for(i=0;i<3;i++) sum+=a[i][i]; 5. 程序设计题
(1)输入10个整型数存入一维数组,输出值和下标都为奇数的元素个数。 解答: main()
{ int a[10],i,num=0;
printf(\ for(i=0;i<10;i++) scanf(\ for(i=0;i<10;i++)
if(i%2==1&&a[i]%2==1) num++; printf(\ }
(2)从键盘输入任意10个数并存放到数组中,然后计算它们的平均值,找出其中的最大数和最小数,并显示结果。
解答: main()
{ float a[10],ave=0,max,min; int i;
printf(\ for(i=0;i<10;i++) scanf(\ max=a[0];min=a[0]; for(i=0;i<10;i++) { ave+=a[i];
if(maxa[i]) min=a[i]; }
ave/=10;
printf(\}
(3)有5个学生,每个学生有四门课程,将有不及格课程的学生成绩输出。 解答: main()
{ int a[5][4]={{78,87,93,65}, {66,57,70,86}, {69,99,76,76},
82
{78,59,87,90}, {90,67,97,87}}; int i,j,k;
for(i=0;i<5;i++) for(j=0;j<4;j++) if(a[i][j]<60)
{ printf(\ for(k=0;k<4;k++)
printf(\ printf(\ break; } }
(4)已知两个升序序列,将它们合并成一个升序序列并输出。
解答:用数组a、b分别存放两个已知的升序序列,然后用下列方法将数组a、b中的元素逐个插入到数组c中。
?a[i]c[k]???b[j]a[i]?b[j]a[i]?b[j]
其中i、j、k的初值都为0,插入后k的值加1,i或j的值加1。 main()
{ int a[4]={1,3,5,7}; int b[5]={2,4,6,8,10}; int c[20],i=0,j=0,k=0; while(i<4&&j<5)
if(a[i]
printf(\ printf(\}
(5)从键盘上输入一个字符串,统计字符串中的字符个数。不许使用求字符串长度函数strlen()。 解答:
#include \main()
{ char str[81],*p=str; int num=0;
printf(\ gets(str);
while(*p++) num++;
printf(\
83
}
(6)输入一个字符串存入数组a,对字符串中的每个字符用加3的方法加密并存入数组b,再对b中的字符串解密存入数组c,最后依次输出数组a、b、c中的字符串。
解答:
#include \main()
{ char a[81],b[81],c[81]; char *pa=a,*pb=b,*pc=c; printf(\ gets(a);
while(*pa) {*pb=*pa+3; pa++;pb++;} *pb='\\0'; pb=b;
while(*pb) {*pc=*pb-3; pb++;pc++;} *pc='\\0';
printf(\ printf(\ printf(\}
(7)输入一个字符串,输出每个大写英文字母出现的次数。
解答:定义一个有26个元素的一维整型数组num,依次用来存放各个大写英文字母出现的个数。由于各大写英文字母的ASCII码与'A'的ASCII码的差,正好是用来存放该大写英文字母个数的数组元素的下标,所以,若当前字符*p为大写英文字母,则执行num[*p-'A']++即可使指定的数组元素值加1。
#include \main()
{ char str[81],*p=str; int num[26]={0},i;
printf(\ gets(str); while(*p)
{ if(*p>='A'&&*p<='Z') num[*p-'A']++; p++; }
for(i='A';i<='Z';i++) printf(\ printf(\ for(i=0;i<26;i++)
printf(\ printf(\}
(8)把从键盘输入的字符串逆置存放并输出。
解答:定义两个字符指针变量p和q,分别指向第一个字符和最后一个字符,交换p和q指向的字符,然后 p指向下一个字符,q指向前一个字符,再交换p和q指向的字符,如
84
此下去,直到p>=q为止。
#include \main()
{ char str[81],*p,*q,ch;
printf(\ gets(str); p=str;q=p; while(*q) q++; q--;
while(p (9)输出4×4阶矩阵的主次对角线元素之和。 解答:矩阵主对角线上的元素,其行标和列标相等,矩阵次对角线上的元素,其行标与列标之和为3,用二维数组a[4][4]来表示4×4阶矩,所以,对满足行标和列标相等或行标与列标之和为3的二维数组元素求和即可。 main() { int a[4][4],i,j,sum=0; printf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) scanf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) if(i==j||i+j==3) sum+=a[i][j]; printf(\} (10)统计一个英文句子中含有英文单词的个数,单词之间用空格隔开。 解答:单词的个数可以由空格出现的次数决定(连续的若干空格作为出现一次空格,一行开头的空格不统计在内)。如果当前字符不是空格,而它前面的字符是空格,则表示新单词开始,此时计数器加1。如果当前字符和它前面的字符都不是空格,则意味着仍然是原来单词的继续,计数器不能加1。前一个字符是否为空格,可以用一个变量word来标识,若word=0,则表示前一个字符为空格,若word=1,则表示前一个字符不为空格。 #include \main() { char str[81],*p=str; int num=0,word=0; printf(\ gets(str); while(*p) { if(*p==' ') word=0; else if(word==0) { num++; word=1;} 85 p++; } printf(\} (11)从键盘上输入四个字符串(长度小于80),对其进行升序排序并输出。 解答:利用选择排序法进行排序,用strcmp()函数进行比较,用strcpy()函数进行交换。 #include \#include \main() { char str[4][81],temp[81]; int i,j; printf(\ for(i=0;i<4;i++) gets(str[i]); for(i=0;i<3;i++) for(j=i+1;j<4;j++) if(strcmp(str[i],str[j])>0) { strcpy(temp,str[i]); strcpy(str[i],str[j]); strcpy(str[j],temp); } printf(\ for(i=0;i<4;i++) puts(str[i]); } (12)已知一个排好序的数组,输入一个数,要求按原来排序的规律将它插入到数组中。 解答:从数组的最后一个元素开始,逐个进行输入数和数组元素值的比较,若输入数小于数组元素值(假设原来升序排序),则数组元素值后移一个位置,否则将输入数存入当前数组元素的后一个元素。 main() { int a[10]={1,3,5,7,9,11},n=6,i,num; printf(\ scanf(\ i=n-1; while(a[i]>num&&i>=0) {a[i+1]=a[i];i--;} a[i+1]=num; printf(\ for(i=0;i<=n;i++) printf(\ printf(\} (13)编写程序,实现两个字符串的比较。不许使用字符串比较函数strcmp()。 86