【真题1】 给定程序功能是用冒泡法对6个字符串进行排序。 #include < stdio.h >#define MAXLINE 20 fun ( char *pstr[6]) { int i, j ; char *p ; for (i = 0 ; i < 5 ; i++ ) { for (j = i + 1; j < 6; j++) { /**************found**************/ if(strcmp(*(pstr+i),___1___) >0) { p = *(pstr + i) ; /**************found**************/ pstr[i] = ___2___ ; /**************found**************/ *(pstr + j) = ___3___ ; } } } } main( ) { int i ; char *pstr[6], str[6][MAXLINE] ; for(i = 0; i < 6 ; i++) pstr[i] = str[i] ; printf( "\nEnter 6 string(1 string at each line): \n" ) ; for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ; fun(pstr) ; printf("The strings after sorting:\n") ; for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ; } (2011年2月) 解析: 首先,我们必须先读懂题中程序的大致意思,这是正确填空的重要前 提。 程序中的重要思想如下: 1、建立了一个二维字符串数组,用于存放用户输入的6 个字符串; 2、建立了一个指针数组,目的是用6 个指针分别指向6 个字符串; 3、函数fun()的形参只有一个,即指针数组pstr[],这表明要想在函数fun() 中对6 个字符串进行操作,只能通过pstr[]中的6个指针。 题中第一个空填"*(pstr+j)":观察源程序可以发现,在程序中使用strcmp() 函数是为了判断字符串str[i]与str[i+1]两者的大小,在fun()函数中只能通过 指针来表达各个字符串,所以应当填"*(pstr+j)"。 题中第二个空填"pstr[j]":对两个字符进行比较后,若pstr[i]中的字符比 pstr[j]中的字符大,则将pstr[j]中的字符赋给pstr[i]。 题中第三个空填"p":对两个字符进行比较后,若pstr[i]中的字符比pstr[j]中 的字符大,则将pstr[j]和pstr[i]的内容进行交换。 答案:【1】*(pstr+j) 【2】pstr[j] 【3】p 【真题2】 下列给定程序中函数fun()的功能是:在字符串的最前端加入n 个*号, 形成新串,并且覆盖原串。 注意:字符串的长度最长允许79。 请改正函数fun()中的错误,使它能得出正确的结果。 注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include < stdio.h >#include < string.h >#include < conio.h >/**********************found***********************/ void fun(char s[],int n) { char a[80],*p; int i; /**********************found***********************/ s=p; for(i=0;i< n;i++) a[i]= '*'; do {a[i]=*p; /**********************found***********************/ i++; }while(*p); a[i]=0; strcpy(s,a); } main() {int n;char s[80]; clrscr(); printf("\nEnter a string: ");gets(s); printf("\nThe string\%s\n",s); printf("\nEnter n (number of*):"); scanf("%d",&n); fun(s,n); printf("\nThe string after inster:\%s\n",s); } (2011年2月) 解析: (1)错误:void fun(char s[],int n) 正确:void fun(char *s,int n) (2)错误:s=p; 正确:p=s; (3)错误:i++; 正确:i++;p++; (4)错误:a[i]=0; 正确:a[i]= '\0'; 在本题中,s是数组名,代表数组首地址,在编译时对s 数组分配了一段内存单 元,因此在程序运行期间s 是一个常量,不能再被赋值。因此s=p是错误的, 如果把"char s[];"改成"char *s;",则程序正确。此时s 是指向字符数组的指 针变量,p=s 是合法的,它将字符串的首地址赋给指针变量p,然后在printf 函数语句中输出字符串s。因此,应当弄清楚字符数组与字符指针变量用法的区 别。 【真题3】 请编写一个函数fun,它的功能是:根据以下公式求π 的值(要求满足精 度0.0005, 即某项小于0.0005 时停止迭代): π 1 1×2 1×2×3 1×2×3×4 1×2×…×n ─ = 1 + ─ + ── + ──── + ───── + …… + ──────── 2 3 3×5 3×5×7 3×5×7×9 3×5×…×(2n+1) 程序运行后,如果输入精度0.0005,则程序输出为3.14…。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#include < math.h >double fun ( double eps) {……} main( ) { double x; printf("Input eps:") ; scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x)); } (2011年2月) 解析: 本题的考核点是求π 的值的算法及循环语句的使用。 解题思路:通过循环语句判断公式中某项是否在精度范围之内,以控制迭代。 #include < stdio.h > #include < math.h > double fun ( double eps) { int n=0; double down=1,up=1; double one ,pi=0; one = (double)up/(double)down; while(one >=eps) { /*通过循环语句判断公式中某项是否在精度范围之内*/ pi+=one; n++; up=up*n; down=down*(2*n+1); one=(double)up/(double)down; } return pi*2; } |