【真题1】 下列给定程序中,函数fun()的功能是:应用递归算法求某数a 的平方 根。求平方根的迭代公式如下:x1=(x0+a/x0)/2) 。例如,2 的平方根为 1.414214。 #include < math.h > #include < stdio.h > __【1】__ fun(double a, double x0) { double x1, y; __【2】__; if(fabs(x1-x0)>=0.00001) __【3】__; else y=x1; return y; } main() { double x; printf("Enter x:"); scanf("%lf",&x); printf("The square root of %lf is %1f\n", x, fun(x,1.0)); } (2011年2月) 解析: 填空1:这里要问的是函数的类型,由主函数main()对函数的调用可以 得到函数的类型是double型的,当然也可以由函数的返回值语句得到。 填空2:我们看到在下一条语句中已经开始对变量x1 的值进行比较了,所以这 里要对x1 进行赋值,由题意可知x1=(x0+a/x0)/2.0。 填空3:用C 语言求平方根的方法一般有两种经典的算法,它们分别是迭代法 和递归法,本题要求用递归法。该程序采用了if语句,程序的含义是当迭代结 果差小于误差时进行循环。 答案:【1】double 【2】x1=(x0+a/x0)/2.0 【3】y=fun(a,x1) 【真题2】 给定程序modi.c 中,函数fun 的功能是:判断字符ch 是否与str 字符 串中的某个字符相同;若相同,什么也不做,若不同,则将其插在串的最后。 请改 正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数, #include < conio.h > #include < stdio.h > #include < string.h > /************found************/ void fun(char str,char ch) { while (*str && *str!=ch) str++; /************found************/ if (*str==ch) { str[0]=ch; /************found************/ str[1]='0'; } } main() { char s[81], c; clrscr(); printf("\nPlease enter a string:\n"); gets(s); printf("\n Please enter the character to search:"); c=getchar(); fun(s,c); printf("\nThe result is %s\n",s); } (2011年2月) 解析: 本题着重考察考生对C 语言中函数形式参数的用法以及一些简单算法的 掌握情况。 从主函数中可以看出,str 是一个字符串,因此在fun 函数的参数表中应将str 改为字符指针或字符数组,即把"void fun(char str, char ch )"语句改为 "void fun(char *str, char ch )"或相同作用的语句。 从题义得知,若字符ch 与字符串str 中的某个字符相同,什么也不做;若不 同,则插在str 的最后。因此fun函数中先设置了一个循环从字符串str 中寻找 字符ch,如果找到则中断循环并保留字符ch的地址,否则一直循环到串尾。 因此通过判断*str 的内容即可判断是否已找到字符ch,而原程序中的"if (*str == ch )"语句与题义相反,应改为" if (*str != ch )"或相同作用的语句。 如果没有找到字符ch,则在while循环后str 指针指向字符串结束符0x00, 此时应将字符ch 写入这里并在下一地址写入一个字符串结束符0x00,所以原 程序中的"str[1] = '0';"语句是没有意义的,应改为"str[1] = '\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]; printf("Enter a string:\n"); gets(s); fun(s); printf("The string after deleted:\n"); puts(s); } (2011年2月) 解析: 本题的考核点是在字符串中删除字符的算法。 解题思路:从原字符串中 的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组 覆盖原串。 void fun(char *a) { char b[81]; int i=0, j=0; /*查找出字符串数组a 中第一个不为“*”的字符,并用j 返回其下标*/ while ((a[j]!='\0') && (a[j]=='*')) j++; /*将字符串a 中第一个不为“*”开始的所有字符全部复制到字符串b 中*/ while (a[j]!='\0') {b[i]=a[j]; j++; i++;} b[i]='\0'; i=0; j=0; /*将字符串b 中的所有字符复制到a 字符串中覆盖原串*/ while (b[i]!='\0') {a[j]=b[i]; i++; j++;} a[j]='\0'; } |