全国计算机二级C题库第51--60套 |
本题目如果下载后发现有错误的地方,请联系网站管理员:QQ121431055
考试时,上机操作题目有三套,基本操作题、简单应用题、综合应用题 第51套: 给定程序中,函数fun的功能是:计算出形参s所指字符串中包含的单词个数, 作为函数值返回。为便于统计,规定各单词之间用空格隔开。 例如,形参s所指的字符串为:This is a C language program.,函数 的返回值为6。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include int fun(char *s) { int n=0, flag=0; while(*s!='\0') { if(*s!=' ' && flag==0) { /**********found**********/ __1__ ; flag=1;} /**********found**********/ if (*s==' ') flag= __2__ ; /**********found**********/ __3__ ; } return n; } main() { char str[81]; int n; printf("\nEnter a line text:\n"); gets(str); n=fun(str); printf("\nThere are %d words in this text.\n\n",n); } 解题思路: 本题是统计字符串中包含的单词个数。 第一处:单词个数用变量n来统计,当当前字母不是空格且flag状态标志为0时,则单词数 就加1,将状态标志flag置为1,所以应填:n++。 第二处:当当前字符是空格时,flag状态标志置0,所以应填:0。 第三处:到字符串下一个位置,所以应填:s++。 *************************************************** 给定程序MODI1.C中函数 fun 的功能是:从n(形参)个学生的成绩中统计出低 于平均分的学生人数,此人数由函数值返回,平均分存放在形参aver所指的存储单 元中。 例如,若输入 8 名学生的成绩:80.5 60 72 90.5 98 51.5 88 64 则低于平均分的学生人数为: 4 (平均分为:75.5625 )。 请改正程序中的错误,使它能统计出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include #define N 20 int fun ( float *s, int n, float *aver ) { float ave, t = 0.0 ; int count = 0, k, i ; for ( k = 0 ; k < n ; k++ ) /**************found**************/ t = s[k] ; ave = t / n ; for ( i = 0 ; i < n ; i++ ) if ( s[ i ] < ave ) count++ ; /**************found**************/ *aver = Ave ; return count ; } main() { float s[30], aver ; int m, i ; printf ( "\nPlease enter m: " ) ; scanf ("%d", &m ) ; printf ( "\nPlease enter %d mark :\n ", m ) ; for( i = 0 ; i < m ; i++ ) scanf ( "%f", s + i ) ; printf( "\nThe number of students : %d \n" , fun ( s, m, &aver ) ); printf( "Ave = %f\n", aver ) ; } 解题思路: 第一处:应求累加和,而不赋值,所以应改为t+=s[k];。 第二处:ave不需要取地址,直接赋给*aver就可以了。 *************************************************** 请编写函数fun,其功能是求出数组的最大元素在数组中的下标并存放在k所 指的存储单元中。 例如, 输入如下整数: 876 675 896 101 301 401 980 431 451 777 则输出结果为: 6, 980 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include int fun(int *s, int t, int *k) { } main( ) { int a[10]={876,675,896,101,301,401,980,431,451,777}, k ; fun(a, 10, &k) ; printf("%d, %d\n", k, a[k]) ; NONO( ) ; } 解题思路: 本题是考察考生如何在指定的数组找出最大元素值的下标,通过形参*k返回到主程序中。 给出的程序是使用for循环语句进行处理的,在循环之前,首先把数组的第一个元素值赋给 最大值变量max,位置pos为0,然后通过循环依次判断下一元素值是否大于最大值max,如果大 于,那么把这个数重新赋给max,位置i赋给pos,循环结果,即可得到最大值的位置pos,最后 执行语句*k=pos就可以实现返回了。 参考答案: int fun(int *s, int t, int *k) { int i, pos = 0, max = *s ; for(i = 1 ; i < t ; i++) { if(max < *(s + i)) { max = *(s + i) ; pos = i ; } } *k = pos ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第52套: 给定程序中,函数fun的功能是:将N×N矩阵中元素的值按列右移1个位置, 右边被移出矩阵的元素绕回左边。例如,N=3,有下列矩阵 1 2 3 4 5 6 7 8 9 计算结果为 3 1 2 6 4 5 9 7 8 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #define N 4 void fun(int (*t)[N]) { int i, j, x; /**********found**********/ for(i=0; i<___1___; i++) { /**********found**********/ x=t[i][___2___] ; for(j=N-1; j>=1; j--) t[i][j]=t[i][j-1]; /**********found**********/ t[i][___3___]=x; } } main() { int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j; printf("The original array:\n"); for(i=0; i { for(j=0; j } fun(t); printf("\nThe result is:\n"); for(i=0; i { for(j=0; j } } 解题思路: 第一处:函数fun是对N×N矩阵进行操作,for循环的终止值为N。 第二处:把最后一列的元素值赋值给临时变量x保存用来交换,所以应填:N-1。 第三处:第1列元素值使用x替换,由于C语言的下标是从0开始的,所以应填:0。 *************************************************** 例如,若q的值为: 50.0,则函数值为: 49.394948。 请改正程序中的错误,使程序能输出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include double fun( double q ) { int n; double s,t; n = 2; s = 2.0; while (s<=q) { t=s; /************found************/ s=s+(n+1)/n; n++; } printf("n=%d\n",n); /************found************/ return s; } main ( ) { printf("%f\n", fun(50)); } 解题思路: 第一处:如果两个整数类型相除,结果仍为整数,所以必须转换其中一个数的类型,所以 应改为:s+=(float)(n+1)/n;。 第二处:返回结果错误,应改为:return t;。 *************************************************** 编写函数fun,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果 由函数返回。其中Fibonacci数列F(n)的定义为: F(0)=0,F(1)=1 F(n)=F(n-1)+F(n-2) 例如:当t = 1000时,函数值为:1597。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include #include int fun( int t) { } main() /* 主函数 */ { int n; n=1000; printf("n = %d, f = %d\n",n, fun(n)); NONO(); } 解题思路: 本题是考察考生用递推算法来求出斐波那契数列中每项的值。给出的程序就是用变量f、f0 和f1来表示递推的过程,给变量f0和f1最初分别置数列中第1项和第2项的值0和1,然后进入循 环,执行语句f=f0+f1;将所得和值存入f中,这就是数列的第3项,把f1的值移入f0中,将f的 值移入f1中,为求数列的下一列作好准备;接着进入下一次循环,通过语句f=f0+f1求得数列的 第4项,不断重复以上步骤,每重复一次就依次求得数列的下一项,直至某项满足要为止。 参考答案: int fun( int t) { int f0 = 0, f1 = 1, f ; do { f = f0 + f1 ; f0 = f1 ; f1 = f ; } while(f < t) ; return f ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第53套: 函数fun的功能是:计算 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include double fun(double x) { double f, t; int n; f = 1.0 + x; /**********found**********/ t = ___1___; n = 1; do { n++; /**********found**********/ t *= (-1.0)*x/___2___; f += t; } /**********found**********/ while (___3___ >= 1e-6); return f; } main() { double x, y; x=2.5; y = fun(x); printf("\nThe result is :\n"); printf("x=% } 解题思路: 第一处:根据公式可知,变量t的值为x。 第二处:根据公式可知,此处应该除以n,所以应填:n。 第三处:根据试题中条件的要求,所以应填:fabs(t)。 *************************************************** 给定程序MODI1.C中函数fun的功能是: 求整数x的y次方的低3位值。例如,整 数5的6次方为15625, 此值的低3位值为625。 请改正函数fun中指定部位的错误, 使它能得出正确的结果。 注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构! 给定源程序: #include long fun(int x,int y,long *p ) { int i; long t=1; /**************found**************/ for(i=1; i t=t*x; *p=t; /**************found**************/ t=t/1000; return t; } main() { long t,r; int x,y; printf("\nInput x and y: "); scanf("%ld%ld",&x,&y); t=fun(x,y,&r); printf("\n\nx=%d, y=%d, r=%ld, last=%ld\n\n",x, y,r,t ); } 解题思路: 第一处:错误在for循环语句上,根据试题要求,终止条件应该是i<=y。 第二处:要取低3位的值时,应模1000取余数,而不是整除1000取商。 *************************************************** 例如, 在主函数中从键盘给x输入0.21后,输出为:s=1.100000。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的 花括号中填入你编写的若干语句。 给定源程序: #include #include double fun(double x) { } main() { double x,s; printf("Input x: "); scanf("%lf",&x); s=fun(x); printf("s=%f\n",s); NONO(); } 解题思路: 本题是根据给定的公式进行计算。具体操作请看答案程序中的说明。 参考答案: double fun(double x) { int n=1; /* 循环计数*/ double sn=1; /* 累计数*/ double xn=1,xn1=0; /*x的n值,以及x的n-1值;*/ while(fabs(xn-xn1)>=0.000001)/*绝对值是否满足条件*/ { xn=xn*x*(0.5-n+1)/n; /*表达式分解以后xn=(xn-1)*x*(0.5-n+1)/n*/ n+=1; sn+=xn; /*sn累加上xn*/ } return(sn); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第54套: 给定程序中,函数fun的功能是:计算出带有头结点的单向链表中各结点数据 域中值之和作为函数值返回。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; SLIST *creatlist(int *); void outlist(SLIST *); int fun( SLIST *h) { SLIST *p; int s=0; p=h->next; while(p) { /**********found**********/ s+= p->___1___; /**********found**********/ p=p->___2___; } return s; }
main() { SLIST *head; int a[N]={12,87,45,32,91,16,20,48}; head=creatlist(a); outlist(head); /**********found**********/ printf("\nsum=%d\n", fun(___3___)); } SLIST *creatlist(int a[]) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i { q=(SLIST *)malloc(sizeof(SLIST)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } 解题思路: 本题是计算出带有头结点的单向链表中各结点数据域中值之和。 第一处:累加数据域中的值,所以应填:data。 第二处:指定p的下一个指针,所以应填:next。 第三处:函数调用,在主函数中已经给出了head,所以应填:head。 *************************************************** 给定程序MODI1.C中函数fun的功能是:将s所指字符串中出现的与t1所指字符 串相同的子串全部替换成t2所指字符串,所形成的新串放在w所指的数组中。在此 处,要求t1和t2所指字符串的长度相同。 例如,当s所指字符串中的内容为:"abcdabfab",t1所指子串中的内容为: "ab",t2所指子串中的内容为:"99"时, 结果在w所指的数组中的内容应为: "99cd 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include int fun (char *s, char *t1, char *t2 , char *w)
{ int i; char *p , *r, *a; strcpy( w, s ); while ( *w ) { p = w; r = t1; /************found************/ while ( r ) if ( *r == *p ) { r++; p++; } else break; if ( *r == '\0' ) { a = w; r = t2; while ( *r ){ /************found************/ *a = *r; a++; r++ } w += strlen(t2) ; } else w++; } } main() { char s[100], t1[100], t2[100], w[100]; printf("\nPlease enter string S:"); scanf("%s", s); printf("\nPlease enter substring t1:"); scanf("%s", t1); printf("\nPlease enter substring t2:"); scanf("%s", t2); if ( strlen(t1)==strlen(t2) ) { fun( s, t1, t2, w); printf("\nThe result is : %s\n", w); } else printf("Error : strlen(t1) != strlen(t2)\n"); } 解题思路: 第一处:判断字符串当前字符是否是字符串结束符,所以应改为:while(*r)。 第二处:语句后缺少分号。 *************************************************** 函数fun的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符 形成的新串放在t所指数组中。 例如,当s所指字符串中的内容为:"ABCDEFGHIJK", 在t所指数组中的内容应是:"BDFHJ"。 注意: 部分源程序存在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include #include void fun(char *s, char t[])
{ } main() { char s[100], t[100]; printf("\nPlease enter string S:"); scanf("%s", s); fun(s, t); printf("\nThe result is: %s\n", t); NONO(); } 解题思路: 本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问 题。 参考答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 1 ; i < strlen(s); i+=2) t[j++] = s[i] ; t[j] = 0 ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第55套: 给定程序中,函数fun的功能是:判断形参s所指字符串是否是"回文" (Palindrome),若是,函数返回值为1;不是,函数返回值为0。"回文" 是正读和反读都一样的字符串(不区分大小写字母)。 例如,LEVEL和Level是"回文",而LEVLEV不是"回文"。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #include int fun(char *s) { char *lp,*rp; /**********found**********/ lp= __1__ ; rp=s+strlen(s)-1; while((toupper(*lp)==toupper(*rp)) && (lp /**********found**********/ lp++; rp __2__ ; } /**********found**********/ if(lp else return 1; } main() { char s[81]; printf("Enter a string: "); scanf("%s",s); if(fun(s)) printf("\n\"%s\" is a Palindrome.\n\n",s); else printf("\n\"%s\" isn't a Palindrome.\n\n",s); } 解题思路: 本题是判断字符串是否是“回文”。
第一处:根据函数体fun中,对变量lp的使用可知,lp应指向形参s,所以应填:s。 第二处:rp是指向字符串的尾指针,当每做一次循环rp指向就要指向前一个字符,所以应 填:--。 第三处:当lp和rp相等时,则表示字符串是回文并返回1,否则就返回0,所以应填:return 0。 *************************************************** 给定程序MODI1.C中fun函数的功能是:求出以下分数序列的前n项之和。 2 3 5 8 13 21 ┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , …… 1 2 3 5 8 13 和值通过函数值返回main函数。 例如,若 n = 5,则应输出: 8.391667。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include /**************found**************/ fun (int n ) { int a = 2, b = 1, c, k ; double s=0.0 ; for ( k = 1; k <= n; k++ ) { s = s + 1.0 * a / b ; /**************found**************/ c = a; a += b; b += c; } return(s) ; } main( ) { int n = 5 ; printf( "\nThe value of function is: %lf\n", fun ( n ) ) ; } 解题思路: 第一处:由于计算的实型值要通过函数返回,所以必须定义函数的返回类型,只要int或void 可以省略,其他都要定义类型。由于返回是实型值,所以应在数名前加上double或float等定义。 第二处:根据公式可知,在for循环内b的值应是c。 *************************************************** 请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指 的数组中。例如,若输入17, 5,则应输出:19, 23, 29, 31, 37。函数fun中给 出的语句仅供参考。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun(int m, int k, int xx[]) { /* 以下代码仅供参考 */
int i, j=1, t=m+1; while(j<=k) { /* 以下完成判断素数,并存放到数组xx中 */ } } main() { int m, n, zz[1000] ; printf( "\nPlease enter two integers:") ; scanf("%d%d", &m, &n ) ; fun( m, n, zz) ; for( m = 0 ; m < n ; m++ ) printf("%d ", zz[m]) ; printf("\n") ; NONO( ) ; } 解题思路: 本题是考察考生如何判断一个数是素数,再判断所求出的素数是否符合题义要求,如果符 合,则存入指定的数组xx中保存,最后由形参xx返回。 本题是用while循环语句分别求出5个符合题义的素数。其中,j是控制变量,m是所求素数 要大于这个数且还要紧靠这个数,k是所求素数的个数,j是当前所求第几个素数。其中while 循环体中的for循环语句是判断t是否是素数。 参考答案: void fun(int m, int k, int xx[]) { /* 以下代码仅供参考 */ int i, j=1, t=m+1; while(j<=k) { /* 以下完成判断素数,并存放到数组xx中 */
for(i = 2 ; i < t; i++) if(t % i==0) break; if(i==t) { xx[j-1] = i; j++; } t++; } } } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第56套: 给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到 文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读出显 示在屏幕上。文件的读写分别由自定义函数ReadText和WriteText实现。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include
#include #include void WriteText(FILE *); void ReadText(FILE *); main() { FILE *fp; if((fp=fopen("myfile4.txt","w"))==NULL) { printf(" open fail!!\n"); exit(0); } WriteText(fp); fclose(fp); if((fp=fopen("myfile4.txt","r"))==NULL) { printf(" open fail!!\n"); exit(0); } ReadText(fp); fclose(fp); } /**********found**********/ void WriteText(FILE ___1___) { char str[81]; printf("\nEnter string with -1 to end :\n"); gets(str); while(strcmp(str,"-1")!=0) { /**********found**********/ fputs(___2___,fw); fputs("\n",fw); gets(str); } } void ReadText(FILE *fr) { char str[81]; printf("\nRead file and output to screen :\n"); fgets(str,81,fr); while( !feof(fr) ) { /**********found**********/ printf("%s",___3___); fgets(str,81,fr); } } 解题思路: 本题要求是把键盘上输入的内容写到指定的文件中。程序中共有三处要填上适当的内容, 使程序能运行出正确的结果。 第一处:要求填写文件流的自变量名,在这个函数中,已有的语句fputs("\n",fw);分析可 知:由于文件流变量fw在函数体没有定义过,所以本处应填*fw或fw[]。 第二处:通过while循环语句,把键盘上输入的内容,要写入到指定的文件中,键盘上输入 的内容已存入字符串str变量中,因此,本处应填写str。 第三处:要把已存入文件中的内容,再从文件中读出且已存入字符串变量str中,最后在屏 幕显示出来,因此,此处应填写str。 *************************************************** 给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位
上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。 例如,当s中的数为:7654321时,t中的数为:7531。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include /************found************/ void fun (long s, long t) { long sl=10; *t = s % 10; while ( s > 0) { s = s/100; *t = s * sl + *t; /************found************/ \TAB sl = sl*100; } } main() { long s, t; printf("\nPlease enter s:"); scanf("%ld", &s); fun(s, &t); printf("The result is: %ld\n", t); } 解题思路: 第一处:在函数fun中使用了*t,但在函数定义时没有使用*t,所以应改为:void fun(long s,long *t)。 第二处:每循环一次,sl的值就乘以10,所以应改为:sl=sl*10;。 *************************************************** 函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。 合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上, b数的十位 和个位数依次放在c数的千位和十位上。 例如,当a=45,b=12时,调用该函数后,c=1524。 注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun(int a, int b, long *c) { } main() { int a,b; long c; printf("Input a, b:"); scanf("%d,%d", &a, &b); fun(a, b, &c); printf("The result is: %ld\n", c); NONO();
} 解题思路: 本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。 取a十位数字的方法:a/10 取a个位数字的方法:a 参考答案: void fun(int a, int b, long *c) { *c=(b/10)*1000+(a)*100+(b)*10+(a/10); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第57套: 函数fun的功能是:把形参a所指数组中的最小值放在元素a[0]中,接着把 形参a所指数组中的最大值放在a[1]元素中;再把a所指数组元素中的次小值放 在a[2]中,把a所指数组元素中的次大值放在a[3];其余以此类推。例如:若a 所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7;则按规则移动 后,数据排列为:1、9、2、8、3、7、4、6、5。形参n中存放a所指数组中数 据的个数。 注意:规定fun函数中的max存放当前所找的最大值,px存放当前所找最大 值的下标。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: # include #define N 9 void fun(int a[], int n) { int i,j, max, min, px, pn, t; for (i=0; i { /**********found**********/ max = min = ___1___; px = pn = i; for (j=i+1; j /**********found**********/ if (max<___2___) { max = a[j]; px = j; } /**********found**********/ if (min>___3___) { min = a[j]; pn = j; } } if (pn != i) { t = a[i]; a[i] = min; a[pn] = t; if (px == i) px =pn; } if (px != i+1) { t = a[i+1]; a[i+1] = max; a[px] = t; } } } main() { int b[N]={9,1,4,2,3,6,5,8,7}, i; printf("\nThe original data :\n"); for (i=0; i fun(b, N); printf("\nThe data after moving :\n");
for (i=0; i } 解题思路: 第一处:外循环每循环一次均把数组a当前位置的值,分别赋值给max和min变量,所以应填: a[i]。 第二处:判断max是否小于a[j],若小于,则把a[j]赋值给max,所以应填:a[j]。 第三处:判断min是否大于a[j],若大于,则把a[j]赋值给min,所以应填:a[j]。 *************************************************** 给定程序MODI1.C中函数fun的功能是:用递归算法计算斐波拉契数列中第n 项的值。从第1项起,斐波拉契数列为:1、1、2、3、5、8、13、21、…… 例如,若给n输入7,该项的斐波拉契数值为:13。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #include long fun(int g) { /**********found**********/ switch(g); { case 0: return 0; /**********found**********/ case 1 ;case 2 : return 1 ; } return( fun(g-1)+fun(g-2) ); } main() { long fib; int n; printf("Input n: "); scanf("%d",&n); printf("n = %d\n",n); fib=fun(n); printf("fib = %d\n\n",fib); } 解题思路: 第一处:switch后有多余的分号。 第二处:case 1后没有返回语句,也应该为return 1;。所以应改为:case 1: return 1; case 2:return 1;。 *************************************************** 某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已 在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的 ave成员中。 例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当 是:78.875。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun部位中填入你编 写的若干语句。 给定源程序: #include
#define N 8 typedef struct { char num[10]; double s[N]; double ave; } STREC; void fun(STREC *a) { } main() { STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5}; int i; fun( &s ); printf("The %s's student data:\n", s.num); for(i=0;i printf("% printf("\nave=% NONO(); } 解题思路: 本题是求记录结构中学生课程成绩的平均值,其结果仍放在该记录结构中。 参考答案: void fun(STREC *a) { int i ; for(i = 0 ; i < N ; i++) a->ave = a->ave + a->s[i] ; a->ave /= N ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第58套: 给定程序中,函数fun的功能是:把形参s所指字符串中最右边的n个字符复制 到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个
字符串复制到形参t所指字符数组中。 例如,形参s所指的字符串为:abcdefgh,n的值为5,程序执行后t所指字符数 组中的字符串应为:defgh。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 80 void fun(char *s, int n, char *t) { int len,i,j=0; len=strlen(s); /**********found**********/ if(n>=len) strcpy(__1__); else { /**********found**********/ for(i=len-n; i<=len-1; i++) t[j++]= __2__ ; /**********found**********/ t[j]= __3__ ; } } main() { char s[N],t[N]; int n; printf("Enter a string: ");gets(s); printf( "Enter n:"); scanf("%d",&n); fun(s,n,t); printf("The string t : "); puts(t); } 解题思路: 本题是根据要求来复制字符串。 第一处:当给定的长度n大于该字符串s的长度,那么把该字符串直接拷贝到t就可以了,所 以应填:t,s。 第二处:使用for循环语句,把最右边n个字符依次添加到t中,所以应填:s[i]。 第三处:字符串操作结束,需要到t加一个字符串结束符,所以应填:'\0'。 *************************************************** 给定程序MODI1.C中函数fun的功能是:找出一个大于形参m且紧随m的素数, 并作为函数值返回。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include int fun(int m) { int i, k ; for (i = m + 1 ; ; i++) { for (k = 2 ; k < i ; k++)
/**************found**************/ if (i % k != 0) break ; /**************found**************/ if (k < i) return(i); } } void main() { int n ; n = fun(20) ; printf("n=%d\n", n) ; } 解题思路: 第一处:判断素数的条件是一个数i除自身或1除外不被任何数k整除的数,如果一个数i被 另一个数k取模,模值等于零,那么这个不是素数并退出循环体,所以应改为if(i%k==0)。 第二处:如果i不被循环中任一个k值不整除,那么循环结束后k的值应该等于i,所以应改 为if(k==i)或if(k>=i)也可以。 *************************************************** 请编写函数fun,它的功能是:求出能整除形参x且不是偶数的各整数,并按从 小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。 例如,若 x 中的值为: 35,则有 4 个数符合要求,它们是: 1, 5, 7, 35。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun ( int x, int pp[], int *n ) { } main( ) { int x, aa[1000], n, i ; printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ; fun(x, aa, &n ) ; for( i = 0 ; i < n ; i++ ) printf("%d ", aa[i]) ; printf("\n") ; NONO( ) ; } 解题思路: 本题是求出能整除形参x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中, 这些除数的个数通过形参n返回。 参考答案: void fun ( int x, int pp[], int *n ) { int i; *n=0; for(i=1; i <= x; i++) if((x % i== 0) && (i % 2)) pp[(*n)++]=i; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第59套: 给定程序中,函数fun的功能是:在3×4的矩阵中找出在行上最大、在列上最 小的那个元素,若没有符合条件的元素则输出相应信息。 例如,有下列矩阵: 1 2 13 4 7 8 10 6
3 5 9 7 程序执行结果为:find: a[2][2]=9 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #define M 3 #define N 4 void fun(int (*a)[N]) { int i=0,j,find=0,rmax,c,k; while( (i { rmax=a[i][0]; c=0; for(j=1; j /**********found**********/ rmax=a[i][j]; c= __1__ ; } find=1; k=0; while(k /**********found**********/ if (k!=i && a[k][c]<=rmax) find= __2__ ; k++; } if(find) printf("find: a[%d][%d]=%d\n",i,c,a[i][c]); /**********found**********/ __3__ ; } if(!find) printf("not found!\n"); } main() { int x[M][N],i,j; printf("Enter number for array:\n"); for(i=0; i for(j=0; j printf("The array:\n"); for(i=0; i { for(j=0; j } fun(x); } 解题思路: 本题是在矩阵中找出在行上最大、在列上最小的那个元素。 第一处:找出行上最大的数,并该位置j(列)保存在c中,所以应填:j。 第二处:使用while循环语句和控制变量find,如果该数不是列是最小数,那么把find置0, 所以应填:0。
第三处:i是while的控制变量,所以每做一次循环,该数均要加1,所以应填:i++。 *************************************************** 给定程序MODI1.C中函数fun的功能是:根据整型形参m的值,计算如下公式的 值。 1 1 1 t = 1 - ----- - ----- - …… - ----- 2*2 3* 例如,若 m 中的值为: 5,则应输出: 0.536389。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include double fun ( int m ) { double y = 1.0 ; int i ; /**************found**************/ for(i = 2 ; i < m ; i++) /**************found**************/ y -= 1 /(i * i) ; return( y ) ; } main( ) { int n = 5 ; printf( "\nThe result is %lf\n", fun ( n ) ) ; } 解题思路: 第一处:使用for循环计算公式,必须计算到m,所以应改为for(i=2; i<=m; i++)。 第二处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改 为y-=1./(i*i)。 *************************************************** m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均 分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。 例如,当score数组中的数据为:10、20、30、40、50、60、70、80、90时, 函数返回的人数应该是4, below中的数据应为: 10、20、30、40。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include #include int fun(int score[], int m, int below[]) { } main( ) { int i, n, below[9] ; int score[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90} ; n = fun(score, 9, below) ;
printf( "\nBelow the average score are: " ) ; for (i = 0 ; i < n ; i++) printf("%d ", below[i]) ; NONO() ; } 解题思路: 本题是计算平均成绩,再把低于平均成绩的分数存入依次数组below中。 参考答案: int fun(int score[], int m, int below[]) { float av=0.0 ; int i, j=0 ; for(i=0; i av /= m; for(i=0; i if(av>score[i]) below[j++]=score[i]; return j; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第60套: 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按 num成员进行升序排列。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include typedef struct { int num; char name[10]; }PERSON; /**********found**********/ void fun(PERSON ___1___) { /**********found**********/ ___2___ temp; if(std[0].num>std[1].num) { temp=std[0]; std[0]=std[1]; std[1]=temp; } if(std[0].num>std[2].num) { temp=std[0]; std[0]=std[2]; std[2]=temp; } if(std[1].num>std[2].num) { temp=std[1]; std[1]=std[2]; std[2]=temp; } } main() { PERSON std[ ]={ 5,"Zhanghu",2,"WangLi",6,"LinMin" }; int i; /**********found**********/ fun(___3___); printf("\nThe result is :\n"); for(i=0; i<3; i++) printf("%d,%s\n",std[i].num,std[i].name); } 解题思路: 本题是要求对结构体数组中的三个元素按num成员升序排列。
第一处:由于在函数体fun中,已经使用了std变量,所以应填:*std。 第二处:由于temp是存放交换记录的中间变量,所以应填:PERSON。 第三处:函数的调用,所以应填:std。 *************************************************** 给定程序MODI1.C中函数fun的功能是:将 m(1≤m≤10)个字符串连接起来, 组成一个新串,放入pt所指存储区中。 例如:把3个串:"abc","CD","EF"连接起来,结果是 "abcCDEF"。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include int fun ( char str[][10], int m, char *pt ) { /************found************/ Int k, q, i ; for ( k = 0; k < m; k++ ) { q = strlen ( str [k] ); for (i=0; i /************found************/ pt[i] = str[k,i] ; pt += q ; pt[0] = 0 ; } } main( ) { int m, h ; char s[10][10], p[120] ; printf( "\nPlease enter m:" ) ; scanf("%d", &m) ; gets(s[0]) ; printf( "\nPlease enter %d string:\n", m ) ; for ( h = 0; h < m; h++ ) gets( s[h]) ; fun(s, m, p) ; printf( "\nThe result is : %s\n", p) ; } 解题思路: 第一处:保留字int错写成Int。 第二处:字符数组的字符串书写格式错误。 *************************************************** 程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数 fun( int a[][N]),函数的功能是:使数组左下三角元素中的值全部置成0 。 例如:a 数组中的值为 | 1 9 7 | | 0 9 7 | a = | 2 3 8 | 则返回主程序后a数组中的值应为 | 0 0 8 | | 4 5 6 | | 0 0 0 | 注意: 部分源程序存在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。 给定源程序: #include #include #define N 5 int fun ( int a[][N] ) { } main ( ) { int a[N][N], i, j; printf("***** The array *****\n"); for ( i =0; i { for ( j =0; j { a[i][j] = rand(); printf( "M", a[i][j] ); } printf("\n"); } fun ( a ); printf ("THE RESULT\n"); for ( i =0; i { for ( j =0; j printf("\n"); } NONO( ); } 解题思路: 本题是利用两重循环给二维数组左下三角元素中的值全部置成0。 参考答案: int fun ( int a[][N] ) { int i, j; for(i = 0 ; i < N ; i++) for(j = 0 ; j <= i; j++) a[i][j] = 0 ; } |