习题参考答案
for(i=0;i 注意:本题中getchar()的作用是吸收键入给第一个scanf函数的字符串尾部的回车符,如果无getchar(),则将无法正确输入字符给变量ch。 6、输入一行字符,计算其中大写字母、小写字母、数字、空格及其他字符的数目。 #include {int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20]; printf(\ while((s[i]=getchar())!='\\n') i++; p=s; /*使p指向数组s的首地址*/ while(*p!='\\n') { if(('A'<=*p)&&(*p<='Z')) ++upper; else if(('a'<=*p)&&(*p<='z')) ++lower; else if(*p==' ') ++space; else if((*p<='9')&&(*p>='0')) ++digit; else ++other; p++; } printf(\ printf(\} 7、从一个给定的字符串中找出某一子字符串的位置(从1开始)。例如子串“efg”在字符串“abcdefghijk”中位置为5。若字符串中没有指定的子串,则标记为0。 #include char str1[20],str2[20],str3[20]; char *p1=str1,*p3=str3,*p=str1; printf(\ gets(str1); 310 习题参考答案 printf(\ gets(str2); n=strlen(str2); while(*p1!='\\0') { for(i=0;i } *p3='\\0'; /* 在新生成的字符串尾添加结束符 */ if(strcmp(str3,str2)==0) /*新生成的字符串存放在str3中*/ { printf(\ p1='\\0'; } else { p1++; /*使p指向字符串str1的下一字符*/ p=p1; p3=str3; /*使p3重新指向数组str3首地址*/ } } if(*p1=='\\0') printf(\} 注意:由于gets函数可以接收带有空格的字符串,所以本题中采用gets而未采用不可接收带空格字符串的函数scanf。 8、编程删除字符串中的所有空白字符。 main() {char str1[20],str2[20]; char *p1,*p2; printf(\ gets(str1); /* str1用于存放原始字符串 */ p1=str1; p2=str2; /* str2用于存放去掉空格后的字符串,使p2指向str2 */ while(*p1!='\\0') { if(*p1!=' ') { *p2=*p1++; /* 将原始字符串中的字符依次赋值给str2 */ p2++; } else p1++; /* 遇空格符,只移动指针p1,而不把空格符赋值给str2 */ p3++; 311 习题参考答案 } printf(\} 9、有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 main() { int i,num[20],*p,n=0,m,k; printf(\ scanf(\ for(i=0;i num[i]=i+1; /* 以1至n为序给每个人编号 */ p=num; m=0; /* m为退出人数 */ i=0; /* i为每次循环时的计数变量 */ k=0; /* k为按1,2,3报数时的计数变量 */ while(m if(k==3) /* 本if分支对退出的人的编号赋值为0 */ { *(p+i)=0; k=0; /* 重新从1到3报数 */ m++; /* 退出人数加1 */ } i++; if(i==n) i=0; /*报数到一圈人的尾部时,i恢复为0,也即使人围成一圈*/ } while(*p==0) p++; printf(\} 10、有一个字符串,包含n个字符。编程实现:将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 main() { char str1[20],str2[20]; char *p=str1; int n,m,i; printf(\ gets(str1); n=strlen(str1); printf(\ scanf(\ if(n printf(\ else { for(i=0;i 312 习题参考答案 *(str2+i)=*(p+m-1+i); *(str2+i)='\\0'; } printf(\} 习 题 8 一、选择题 1、C 2、A 3、D 4、D 5、A 6、A 7、A 8、C 9、A 10、B 11、B 12、C 13、B 14、C 15、B 16、C 17、B 18、D 19、B 20、B 二、填空题 1、main 2、scanf gets 3、2 4、auto 5、1,2 6、3235 7、5,25 8、15 9、3 10、6,720 11、9 12、[1] x [2] x-f(x)/f1(x) 三、改错题 1、参考答案与分析: 分析: 第1处错误:题目中已经告诉我们“函数void dbubble(int *f,int n)的功能是”,但在程序的第2行定义函数时头部就与题目要求不一致,因此,第1处错误就在第2 行,只要将第2行改成“void dbubble(int *f,int n)”即可。 第2处错误:在函数dbubble()中的第二个内循环(反向冒泡),题目要求很清楚:“从f[n-2]开始(i=n-2),比较f[i]与f[i+1],若f[i]小于f[i-1],则交换f[i]和f[i-1]两个元素的值,”,所以,其中的“if(f[j]>f[j-1])”应改成“if(f[j] 第3处错误:在主函数中定义数组时使用了“int a[n]={4,7,-3,2,10,17,1,6,9,-4};”这样的形式,其中n是变量,而根据数组的定义我们知道,在定义数组时[]中表示的是数组元素的个数,必须由“常量表达式”组成,而不能是变量。因此,只要将n改成10即可。 第4处错误:在主函数中,调用函数dbubble()时调用方式不对。原调用方式是“void dbubble(n,a);”,此处有两个错误,一是以语句方式调用函数时,其前面不能有“void”,应去掉;二是实参的顺序与函数dbubble()定义时的顺序不一致。因此,本错误应改成“dbubble(a,n);”。 2、参考答案与分析: 分析: 第1处错误:在函数find()的头部定义出错。函数头部定义为“void find(int a[5][])”,在二维数组的名字作为形参时,必须明确第二维的大小,第一维可以省略;但不能省略第二维中的每行的元素个数。因此,可以改成“void find(int a[][5])”或“void find(int a[5][5])”。 第2处错误: 这处错误应在计算列元素之和的语句“for(row=0;row<5;row++) sum2+=a[j][row];”中。由于要求的是列元素之和,则列下标不应该变,而变化的是行下标。因此,可以将本处错误改成“for(row=0;row<5;row++) sum2+=a[row][j];”。 第3处错误: 在C语言中,判断两个整数是否相等用的运算符是“==”,而“=”是赋值运算符,所以这处错误在“if(sum1=sum2) printf(\”语句中。应该改成“if(sum1==sum2) printf(\”。 第4处错误:这处错误出现在主函数中,在调用find()函数时,由于定义find()函数时形参只有一个,即二维数组的数组名,但在调用时却有两个实参,显然是错误的。应将语句“find(a,5);”改成“find(a);” 313 习题参考答案 四、编程题 1、参考答案: #include int jiec(int k); /*声明函数*/ float s=0; printf(“ 计算代数式的值\\n\\n”); for(k=1;k<=M;k++) s+= 1.0/jiec(k); /*函数以表达式方式调用*/ printf(“计算结果为:s=%f\\n”,s); } int jiec(k) /*计算阶乘值的函数,函数名前的int表示返回值的类型*/ int k; { int s,i; s=1; for(i=1;i<=k;i++) s*=i; /*计算1*2*3*?*k,并将计算结果赋值给变量s*/ return(s); /*将计算得的阶乘值返回调用函数(这里是主函数)*/ } 2、参考答案: #include { int j,k=0; /*计数变量k清零*/ for(j=2;j<=sqrt(n);j++) if(n%j==0) k++; if(k!=0) return(0); else return(1); } main() { int n,k; printf(“Please input n:”); scanf(“%d”,&n); k=shushu(n); if(k==0) printf(“\\nNO!”); else printf(“\\nYes!”); } 3、参考答案: int str_len(char *str) {int k=0; while(*str!=?\\0?) {k++; str++; } 314