当i=1时,n[0]=n[1]+1=3,n[1]=n[1]+1=3。 答案:3
(3)下列程序的运行结果是 main()
{ int a[]={2,4,6,8,10}; int y=1,x,*p; p=&a[1];
for(x=0;x<3;x++) y+=*(p+x);
printf(\
解答:程序的功能是把数组a中下标为1、2和3的元素值累加到变量y上,即: y=1+4+6+8=19。 答案:19
(4)下列程序的运行结果是 main() { int i,c;
char num[][4]={\ for(i=0;i<4;i++)
{ c=num[0][i]+num[1][i]-2*’A’; printf(\ } } 解答:程序的功能是从左向右依次输出两个字符串对应字符的ASCII码之和与130的差值。
答案:2 5 5 8
(5)下列程序的运行结果是 main()
{ char a[]=\ int i,j,k;
for(i=0;i<5;i++) { printf(\
for(j=0;j
解答:此程序的功能是输出5行“*”号,每行有5个“*”,且从上到下每行向右挫一列。
答案: ***** ***** ***** ***** *****
(6)下列程序的功能是
77
main()
{ int i,a[10],*p=&a[9];
for(i=0;i<10;i++) scanf(\ for(;p>=a;p--) printf(\ }
答案:该程序把从键盘输入的10个整型数按相反的顺序输出。 (7)下列程序的运行结果是 main()
{ char ch[2][5]={\ int i,j,s;
for(i=0;i<2;i++) p[i]=ch[i]; for(i=0;i<2;i++) { s=0;
for(j=0;ch[i][j]!=’\\0’;j++) s=s*10+ch[i][j]-’0’; printf(\ } }
解答:程序的功能是把数字串转换成对应的数值。 答案:6937 8254
(8)下列程序的运行结果是 #include \ main()
{ int i,k,a[10],p[3]; k=5;
for ( i=0;i<10;i++) a[i]=i;
for(i=0;i<3;i++) p[i]=a[i*(i+1)]; for( i=0;i<3;i++) k+=p[i]*2;
printf(\ }
解答:由于k=5+(p[0]+p[1]+p[2])*2,且p[i]=a[i*(i+1)]=i*(i+1),所以k的值为 5+(0+2+6)*2=21。 答案:21
(9)下列程序的运行结果是 #include \ main( )
{ int a=2,*p,**pp; pp=&p; p=&a; a++;
printf(\ }
78
解答:由于p指向a,pp又指向p,所以a、*p和**pp等价,其值都为3。 答案:3,3,3
(10)下列程序的运行结果是 main( )
{ int a[6],i;
for(i=0;i<6;i++)
{ a[i]=9*(i-2+4*(i>3))%5; printf(\ } }
解答:程序的功能是:i的值从0到5,依次输出表达式9*(i-2+4*(i>3))%5的值。 答案:-3 –4 0 4 4 3
3. 程序填空题(在下列程序的 处填上正确的内容,使程序完整) (1)下列程序的功能是输出数组s中最大元素的下标。 main() { int k,i;
int s[]={3,-8,7,2,-1,4}; for(i=0,k=i;i<6;i++)
if(s[i]>s[k]) ① ; printf(\ }
解答:程序输出的是最大元素的下标,所以,应将i值赋给k,即k=i。 答案:① k=i
(2)下列程序的功能是将一个字符串str的内容颠倒过来。 #include \ main()
{ int i,j,k;
char str[]=\
for(i=0,j= ② ;i 解答:由于C语言中数组元素的下标从0开始,所以j的值应为字符串长度减1,即strlen(str)-1。 答案:② strlen(str)-1 (3)下列程序的功能是把输入的十进制长整型数以十六进制数的形式输出。 main() { char b[]=\ int c[64],d,i=0,base=16; long n; scanf(\ do {c[i]= ③ ;i++;n=n/base; }while(n!=0); for(--i;i>=0;--i) { d=c[i];printf(\ 79 } 解答:进制转换的算法是除以基数取余,所以应填nose。 答案:③ nose (4)下列程序的功能是从键盘输入若干个字符(以回车键作为结束)组成一个字符串存入一个字符数组,然后输出该数组中的字符串。 #include \ main() { char str[81],*ptr; int i; for(i=0;i<80;i++) { 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()函数时,输入项是地址,数组名本身就是地址,对数组名进行取地址运算没有意义。 80 答案:错误行:scanf(\修改为:scanf(\ (2)下列程序的功能是复制字符串a 到b中。 main() { char *str1=a,*str2,a[20]=\ str2=b; while(*str2++=*str1++); } 解答:程序中用数组名a初始化指针变量str1,但此时数组a还没有定义,C语言规定,变量或数组必须先定义后使用,所以,必须先定义数组a,然后再定义指针变量str1,并用a对其初始化。 答案: 错误行: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() 81