第4章 数组 - 44584

{ str[i]=getchar();

if(str[i]==’\\n’) break; }

str[i]= ④ ; ptr=str;

while(*ptr) putchar( ⑤ ); }

解答:根据while(*ptr)可知,字符串末尾应有’\\0’,所以第一个空应填’\\0’。当ptr所指向的字符不为’\\0’时,将其输出,并且使ptr指向下一个字符,所以第二个空应填*ptr++。

答案:④ ’\\0’ ⑤ *ptr++

(5)下列程序的功能是将数组a的元素按行求和并存储到数组s中。 main()

{ int s[3]={0};

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i,j;

for(i=0;i<3;i++) { for(j=0;j<4;j++)

⑥ ; printf(\ } }

解答:根据题意,应将第i行累加到数组元素s[i]中。程序中的外循环次数是行数,内循环次数是列数,所以应填s[i]+=a[i][j](或s[i]=s[i]+a[i][j])。

答案:⑥ s[i]+=a[i][j](或s[i]=s[i]+a[i][j]) 4. 程序改错题(下列每小题有一个错误,找出并改正) (1)下列程序的功能是输入一个字符串,然后再输出。 main()

{ char a[20]; int i=0;

scanf(\

while(a[i]) printf(\ }

解答:使用scanf()函数时,输入项是地址,数组名本身就是地址,对数组名进行取地址运算没有意义。

答案:错误行:scanf(\修改为:scanf(\(2)下列程序的功能是复制字符串a 到b中。 main()

{ char *str1=a,*str2,a[20]=\ str2=b;

while(*str2++=*str1++); } 解答:程序中用数组名a初始化指针变量str1,但此时数组a还没有定义,C语言规定,变量或数组必须先定义后使用,所以,必须先定义数组a,然后再定义指针变量str1,并用a对其初始化。

78

答案:

错误行:char *str1=a,*str2,a[20]=\修改为:char a[20]=\(3)下列程序的功能是统计字符串中空格数。 #include \ main()

{ int num=0;

char a[81],*str=a,ch; gets(a);

while((ch=*str++)!=’\\0’) if(ch=’ ’) num++; printf(\ } 解答:“=”是赋值运算符,程序中进行条件判断应使用关系运算符“==”。 答案:错误行:if(ch=’ ’) num++; 修改为:if(ch==’ ’) num++; (4)下列程序的功能是将字符串str中小写字母的个数、大写字母的个数和数字字符的个数分别存入a[0]、a[1]和a[2]中。

#include \ main()

{ char str[80]; int a[3],i=0; gets(str);

for(;str[i]!=’\\0’;i++)

if(str[i]>= ’a’&&str[i]<=’z’) a[0]++;

else if(str[i]>= ’A’&&str[i]<= ’Z’) a[1]++; else if(str[i]>= ’0’&&str[i]<= ’9’) a[2]++; for(i=0;i<3;i++)

printf(\ }

解答:数组a在定义时没有初始化,所以数组元素的初始值是随机的,因此,得到的统计结果不正确。

答案:错误行:int a[3],i=0; 修改为:int a[3]={0},i=0; (5)下列程序的功能是计算3×3矩阵的主对角线元素之和。 main()

{ 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个整型数存入一维数组,输出值和下标都为奇数的元素个数。

79

解答: 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}, {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(\

80

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(\ }

(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);

81

联系客服:779662525#qq.com(#替换为@)