【真题1】 规定输入的字符串中只包含字母和*号。函数fun 的功能是:将字符串中 前面所有连续的*号全部移动到字符串的尾部。 例如,字符串中的内容为:*******A*BC*DEF*G****,移动后,字符串中的内 容应当是:A*BC*DEF*G***********。 #include < stdio.h >#include < conio.h >void fun(char *a) { char b[81]; int i=0,j=0,s=0,k; while (a[i]__1____'*') /*统计原串串首连续*的个数*/ {i++;s++;} while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/ {b[j]=a[i];j++;i++;} for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b 后*/ {b[j]='*';j++;} b[j]=__2____; i=0;j=0; while (b[j]) /*将字符串b中的所有字符复制到a 字符串中覆盖原串*/ {a[i]=b[j];i++;j++;} } main() { char s[81],*p; printf("Enter a string:\n");gets(s); fun(s); printf("The string after moveing:\n");puts(s); } (2011年2月) 解析: 本题的考核点是移动字符串中字符的算法。 解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的 所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最 后将新串覆盖原串。 答案:【1】== 【2】' \ 0' 【真题2】 给定程序modi.c 中fun 函数的功能是:计算1+2+3+……+n 的和 值。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数, #include < stdio.h >/************found************/ fun (int n) { double t; /************found************/ if (n==0) return(1); else t=fun(n-1)+n; return t; } main() { int n; printf("Enter n: "); scanf("%d",&n); printf("\ns=%f\n",fun(n)); } (2011年2月) 解析: 本题着重考察考生对C 语言中递归算法的掌握情况。 本题中的第一个错误:由主函数中可得,fun 函数应返回一个float或double 型的值,所以程序中语句"fun (int n)"应改为"float fun (int n)"或相同作用的 语句。 本题中的第二个错误:由题意可知,求1 到n 的和,当n 为1 时,和为1,不 断递归,以此求出当n 为n 时的和值,所以程序中语句"if (n==0)"应改为"if (n==1)"。 【真题3】 请编写一个函数 int un(int *s,int *t,int *k),用来求出数组中值最大 的元素在数组中的下标并存放在k 所指的存储单元中,并且将最大值增添在数组的最 后。形参t 所指存储单元中存放数组中数据的个数。 例如,数组中的数据如下: 876 675 896 101 301 401 980 431 451 777 则输出最大值的下标为:6,数组中的内容为: 876 675 896 101 301 401 980 431 451 777 980 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#define N 80 void fun(int *s,int *t,int *k) {……} main() { int a[N]={876,675,896,101,301,401,980,431,451,777},i,n,mi; n=10; printf("\nThe original data:\n"); for(i=0;i< n;i++)printf("%4d",a[i]);printf("\n"); fun(a,&n,&mi); printf("The index of max is: %d\n",mi); printf("The result :\n"); for(i=0;i< n;i++)printf("%4d",a[i]);printf("\n"); } (2011年2月) 解析: 本题的考核点是求数组中最大元素的下标,并将最大值增添在数组的最 后的算法。 提示思路:先通过一指针变量来记录数组中最大值的下标,然后再将最大值放 在数组的最后,使数组长度增1。 void fun(int *s,int *t,int *k) { int i=0; *k=0; /*从前往后顺序比较s 数组中的元素,并将每次比较过程中较大的那个元素的 下标存放在指针k 中*/ for (i=1;i< *t;i++) if (s[*k]< s[i]) *k=i; s[*t]=s[*k];/*将找到的最大值添加在数组的最后*/ *t=*t+1;/*数组长度增1*/ } |