【真题1】 请补充函数fun(),该函数的功能是:按‘0’到‘9’统计一个字符串中的奇 数数字字符各自出现的次数,结果保存在数组num 中。注意:不能使用字符串库函 数。 例如:输入“x=112385713.456+0.909*bc”,结果为:1=3,3=2,5= 2,7=1,9=2。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数 中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题程 序: #include< stdio.h > #define N 1000 void fun(char *tt,int num[]) { int i,j; int bb[10]; char *p=tt; for(i=0;i< 10;i++) { num[i]=0; bb[i]=0; } while(【1】) { if(*p >='0'&&*p< ='9') 【2】; p++; } for(i=1,j=0;i< 10;i=i+2,j++) 【3】; } main() { char str[N]; int num[10],k; printf("\nPlease enter a char string:"); gets(str); printf("\n**The original string**\n"); puts(str); fun(str,num); printf("\n**The number of letter**\n"); for(k=0;k< 5;k++) { printf("\n"); printf("%d=%d",2*k+1,num[k]); } printf("\n"); return; } (2011年2月) 解析: 填空1:通过移动指针p,指向字符串tt中的各个字符,当指针p所指 的字符为'\0'时,即指向字符串tt的最后一个字符,while循环结束。填空2: 将字符串中的数字字符'0'到'9'的个数都保存在数组bb[10]中。*p-'0'实现将字 符'0'的个数保存在bb[0]中,将字符'1'的个数保存在bb[1]中,依此类推,直 到将字符'9'的个数保存在bb[9]中。填空3:由于奇数数字字符的个数存于 bb[1]、bb[3]、bb[5]、bb[7]、bb[9]中,所以for 循环的目的是将这些元素 分别赋给num[0]、num[1]、num[2]、num[3]、num[4]。 答案:【1】*p 【2】bb[*p-'0']++ 【3】num[j]=bb[i] 【真题2】 给定程序modi.c 中函数fun的功能是:依次取出字符串中所有数字字 符,形成新的字符串,并取代原字符串。请改正函数fun 中指定部位的错误,使它能 得出正确的结果。 注意:不要改动main 函数, #include < stdio.h > #include < conio.h > void fun(char *s) { int i,j; for(i=0,j=0; s[i]!='\0'; i++) if(s[i] >='0' && s[i]< ='9') /**********found**********/ s[j]=s[i]; /**********found**********/ s[j]="\0"; } main() { char item[80]; clrscr(); printf("\nEnter a string : ");gets(item); printf("\n\nThe string is : \"%s\"\n",item); fun(item); printf("\n\nThe string of changing is : \"%s\"\n",item ); } (2011年2月) 解析: 本题的考核点是取出字符串中的数字字符形成新的字符串。 解题思路:通过一个for 循环,从字符串中的第一个字符开始查找,将数字字符 重新赋给该字符数组。 程序中的第一个错误:s[j]=s[i];只是对s[0]循环赋值,其值为最后一个数字 字符,其余的数字字符并没有保存下来,此处给s[0]赋值后,下一个数字字符 应该是赋给s[1],依次类推,所以,给s[j]赋值后j应当加1,即:j++,或 者++j也可以写在一起为:s[j++]=s[i];。 程序中的第二个错误:s[j]="\0";是想给数组加上空字符作为字符串的结束标 志,但是在C 语言中,字符应当用单引号引起来,双引号表示字符串。 本评析仅供参考。 【真题3】 请编写一个函数fun(),它的功能是:比较两个字符串的长度,(不得调 用C 语言提供的求字符串长度的函数),函数返回较短的字符串。若两个字符串长度 相等,则返回第1 个字符串。 例如,输入nanjing < CR > nanchang < CR >(< CR >为回车键),函数将返 回nanjing。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编 写的若干语句。 试题程序: #include< stdio.h >char *fun(char *s, char *t) {……} main() { char a[20],b[10],*p,*q; int i; printf("Input 1th string: "); gets(a); printf("Input 2th string: "); gets(b); printf("%s",fun(a,b)); } (2011年2月) 解析: char *fun(char *s, char *t) { int i,j; for(i=0;s[i]!= '\0';i++); /*求字符串的长度*/ for(j=0;t[j]!= '\0';j++); if(i< =j) /*比较两个字符串的长度*/ return s; /*函数返回较短的字符串,若两个字符串长度相等,则返回第1 个字 符串*/ else return t; } 本题中,第1个for 循环的作用是求出s 的字符个数i,第2 个for循环的作用 是求出t的字符个数j,因为任何循环都要控制一条语句,所以在每一个for 循 环条件后面必须要有一个分号。 本题也可用如下技巧: #include< string.h > /*一定要注意在最前面加#include< string.h >*/ char *fun(char *s,char *t) { if(strlen(s) >=strlen(t) return s; else return t; } |