【真题1】 18 请补充函数fun(),该函数的功能是:把字符下标为非素数的字符从 字符串str 中删除,把字符下标为素数的字符重新保存在字符串str中。字符串str 从键盘输入,其长度作为参数传入函数fun()。 例如,输入“abcdefghijkl”,输出 “cdfhl”。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何 内容,仅在函数fun 的横线上填入所编写的若干表达式或语句。 试题程序: #include < stdio.h > #define N 80 void fun(char s[],int n) { int i, j, k, flag; 【1】; for(i=0; i< n; i++) { if(i >1) s[k++]=s[i]; flag=1; for(【2】; j< i&&flag; j++) if(i%j==0) { flag=0; 【3】; } } s[k]='\0'; } main() { int i=0,strlen=0; char str[N]; clrscr(); printf("\n Input a string:\n"); gets(str); while(str[i]!='\0') { strlen++; i++; } fun(str, strlen); printf("\n*** display string ***\n"); puts(str); } (2011年2月) 解析: 填空1:变量k声明时没有初始化,所以要在使用前初始化为0。填空 2:如果一个数能被除了1 和其自身之外的数整除,即余数为0,则这个数不是 素数。所以除数j从2 开始取数。填空3:如果当前字符的下标为非素数,则应 将此字符删除,所以变量k减1,使下一个字符覆盖它,达到删除的目的。 答案:【1】k=0 【2】j=2 【3】k-- 【真题2】 给定程序modi.c 中,函数fun 的功能是:将一个由八进制数字组成的 字符串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5 位8 进制数字。 例如,若输入77777,则输出将是32767。 请改正程序中的错误,使 它能得出正确结果。 注意:不要改动main 函数, #include < stdio.h > int fun(char *p) {int n; /************found************/ n=*p-'o'; p++; while (*p!=0) { /************found************/ n=n*7+*p-'o'; p++; } return n; } main() {char s[6];int i;int n; printf("Enter a string(0catal digits): ");gets(s); if(strlen(s) >5){printf("Error:String too longer !\n\n");exit(0);} for (i=0;s[i];i++) if(s[i]< '0'||s[i] >'7') {printf("Error:%c not is ocatal digits!\n\n",s[i]);exit(0);} printf("The original string:");puts(s); n=fun(s); printf("\n%s is convered to integer number: %d\n\n",s,n); } (2011年2月) 解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。 八进制转换成十进制的方法是:例如 77777=7*8^4+7*8^3+7*8^2+7*8^1+7*8^0 本题中的第一个错误:题中要求将一个由八进制数字字符组成的字符串转换为 等值的十进制数,思路应是:先将字符串中相应的字符减去字符0的ASCII 值,得出该字符的八进制数,然后乘以8 的次幂之和,即可求得该数的十进制 数,所以程序中语句"n=*p-'o';"应改为"n=*p-'0';"; 本题中的第二个错误与第一个错误相似,另外,八进制转换成十进制应乘以8 的次幂,所以应将程序中语句"n=n*7+*p-'o';"改为"n=n*8+*p-'0';"。 解决问题的方法是多种多样的,同一个问题的答案不止一个。 【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是: 将字符串中前面所有连续的*号全部移动到字符串的尾部。 例如,字符串中的内容 为:*******A*BC*DEF*G****,移动后,字符串中的内容应当是: A*BC*DEF*G***********。在编写函数时,不得使用C 语言提供的字符串函 数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中 的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。 #include < stdio.h > #include < conio.h > void fun(char *a) {……} main() { char s[81],*p; printf("Enter a string:\n");gets(s); fun(s); printf("The string after moveing:\n");puts(s); } (2011年2月) 解析: 本题的考核点是移动字符串中字符的算法。 解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的 所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最 后将新串覆盖原串。 本评析仅供参考。 void fun(char *a) { char b[81]; int i=0,j=0,s=0,k; while (a[i]=='*') /*统计原串串首连续*的个数*/ {i++;s++;} while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/ {b[j]=a[i];j++;i++;} for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b后*/ {b[j]='*';j++;} b[j]='\0'; i=0;j=0; while (b[j]) /*将字符串b中的所有字符复制到a字符串中覆盖原串*/ {a[i]=b[j];i++;j++;} } |