计算机等级考试二级C语言上机题集(第56~60套)
第56套
1.程序填空题
给定程序中,函数fun的功能是:在带头结点的单向链表中,查找数据域中值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回值为0。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h> #include <stdlib.h> #define N 8 typedef struct list { int data; struct list *next; } SLIST; SLIST *creatlist(char *); void outlist(SLIST *); int fun(SLIST *h, char ch) { SLIST *p; int n=0; p=h->next; /**********found**********/ while(p!=___1___) { n++; /**********found**********/ if (p->data==ch) return ___2___; else p=p->next; } return 0; } int main() { SLIST *head; int k; char ch; char a[N]={'m','p','g','a','w','x','r','d'}; head=creatlist(a); outlist(head); printf("Enter a letter:"); scanf("%c",&ch); /**********found**********/ k=fun(___3___); if (k==0) printf("\nNot found!\n"); else printf("The sequence number is : %d\n",k); return 0; } SLIST *creatlist(char *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i<N; 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("\nThe list is NULL!\n"); else { printf("\nHead"); do { printf("->%c",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } }
2.程序修改题
给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和a[0]中的数对调,次大数与a[1]中的数对调。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h> #define N 20 void fun(int *a, int n) { int i, m, t, k ; for(i=0;i<2;i++) { /**********found**********/ m=0; for(k=i+1;k<n;k++) /**********found**********/ if(a[k]>a[m]) k=m; t=a[i];a[i]=a[m];a[m]=t; } } int main() { int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i; for ( i=0; i<n; i++ ) printf("%d ", b[i]); printf("\n"); fun ( b, n ); for ( i=0; i<n; i++ ) printf("%d ", b[i]); printf("\n"); return 0; }
3.程序设计题
编写函数fun,它的功能是:求出n位整数w(w>10)的后n-1位的数作为函数值返回。
例如,若w值为5923,则函数返回923;w为923,函数返回23。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h> void NONO(void); unsigned fun(unsigned w) { } int main() { unsigned x; printf("Enter a unsigned integer number :" ); scanf("%u", &x ); printf("The original data is : %u\n", x); if (x < 10) printf ("Data error !"); else printf("The result : %u\n", fun(x)); NONO(); return 0; } void NONO(void) {/* 请在此函数内打开文件,输入测试数据,调用 fun 函数, 输出数据,关闭文件。 */ unsigned x ; int i ; FILE *rf, *wf ; rf = fopen("in.dat","r") ; wf = fopen("out.dat","w") ; for(i = 0 ; i < 20 ; i++) { fscanf(rf, "%u", &x) ; fprintf(wf, "%u\n", fun(x)) ; } fclose(rf) ; fclose(wf) ; }
1.(1)NULL (2)n (3)head,ch 2. m=i; if (a[k]>a[m]) m=k; 3. unsigned fun(unsigned w) { unsigned x=0,d,p=1; while (w>=10) { d=w%10; x=p*d+x; p=p*10; w=w/10; } return x; }
第57套
1.程序填空题
给定程序中已建立一个带头结点的单向链表,在main函数中将多次调用函数fun,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h> #include <stdlib.h> #define N 8 typedef struct list { int data; struct list *next; } SLIST; void fun(SLIST *p) { SLIST *t, *s; t=p->next; s=p; while(t->next != NULL) { s=t; /**********found**********/ t=t->___1___; } /**********found**********/ printf(" %d ",___2___); s->next=NULL; /**********found**********/ free(___3___); } SLIST *creatlist(int *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i<N; 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("\nThe list is NULL!\n"); else { printf("\nHead"); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } int main() { SLIST *head; int a[N]={11,12,15,18,19,22,25,29}; head=creatlist(a); printf("\nOutput from head:\n"); outlist(head); printf("\nOutput from tail: \n"); while (head->next != NULL) { fun(head); printf("\n\n"); printf("\nOutput from head again :\n"); outlist(head); } return 0; }
2.程序修改题
给定程序的功能是:读入一个整数k(2<=k<=10000),打印它的所有质因子(即所有为素数的因子)。
例如,若输入整数:2310,则应输出:2、3、5、7、11。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h> /************found************/ IsPrime (int n); { int i, m; m = 1; for ( i = 2; i < n; i++ ) /************found************/ if !( n%i ) { m = 0; break ; } return ( m ); } int main() { int j, k; printf( "\nPlease enter an integer number between 2 and 10000: " ); scanf( "%d", &k ); printf( "\nThe prime factor(s) of %d is( are ):", k ); for (j=2; j<=k; j++) if ((!(k%j)) && (IsPrime(j))) printf("\n %4d",j); printf("\n"); return 0; }
3.程序设计题
已知学生的记录由学号和学习成绩构成,N名学生的数据已存入结构体数组a中。编写函数fun,它的功能是:找出成绩最高的学生记录,通过形参返回(规定只有一个最高分)。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h> #include <string.h> #define N 10 typedef struct ss { char num[10]; int s; } STU; void NONO(void); void fun(STU a[], STU *s) { } int main() { STU a[N]={{"A01",81},{"A02",89},{"A03",66}, {"A04",87},{"A05",77},{"A06",90}, {"A07",79},{"A08",61},{"A09",80}, {"A10",71} }, m ; int i; printf("***** The original data *****\n"); for ( i=0; i< N; i++ ) printf("No = %s Mark = %d\n", a[i].num,a[i].s); fun ( a, &m ); printf ("***** THE RESULT *****\n"); printf ("The top : %s , %d\n",m.num, m.s); NONO( ); return 0; } void NONO(void) {/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *rf, *wf ; STU a[N], m ; int i ; rf = fopen("in.dat","r") ; wf = fopen("out.dat","w") ; for(i = 0 ; i < 10; i++) fscanf(rf, "%s %d", a[i].num, &a[i].s) ; fun(a, &m) ; fprintf (wf, "The top : %s, %d\n", m.num, m.s) ; fclose(rf) ; fclose(wf) ; }
1.(1)next (2)t->data (3)t 2. int IsPrime (int n) if (!(n%i)) 或 if (n%i==0) 3. void fun(STU a[], STU *s) { int i; *s=a[0]; for (i=1;i<N;i++) if (s->s<a[i].s) *s=a[i]; }
第58套
1.程序填空题
给定程序中,函数fun的功能是:对形参ss所指字符串数组中的M个字符串按长度由短到长进行排序。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h> #include <string.h> #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, k, n[M]; char t[N]; for(i=0; i<M; i++) n[i]=strlen(ss[i]); for(i=0; i<M-1; i++) { k=i; /**********found**********/ for(j=___1___; j<M; j++) /**********found**********/ if(n[k]>n[j]) ___2___; if(k!=i) { strcpy(t,ss[i]); strcpy(ss[i],ss[k]); /**********found**********/ strcpy(ss[k],___3___); n[k]=n[i]; } } } int main() { char ss[M][N]={"shanghai","guangzhou", "beijing","tianjing","cchongqing"}; int i; printf("\nThe original strings are :\n"); for(i=0; i<M; i++) printf("%s\n",ss[i]); printf("\n"); fun(ss); printf("\nThe result :\n"); for(i=0; i<M; i++) printf("%s\n",ss[i]); return 0; }
2.程序修改题
给定程序中,函数fun的功能是:求出两个非零正整数的最大公约数,并作为函数值返回。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h> int fun(int a,int b) { int r,t; if(a<b) { /************found************/ t=a; b=a; a=t; } r=a%b; while(r!=0) { a=b; b=r; r=a%b; } /************found************/ return(a); } int main() { int num1, num2,a; printf("Input num1 num2: "); scanf("%d%d",&num1,&num2); printf("num1= %d num2= %d\n\n",num1,num2); a=fun(num1,num2); printf("The maximun common divisor is %d\n\n",a); return 0; }
3.程序设计题
假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:ABCDEFG。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h> void NONO(void); void fun(char *str) { } int main() { char s[81]; printf("Enter a string:\n"); gets(s); fun( s ); printf("The string after deleted:\n"); puts(s); NONO(); return 0; } void NONO(void) {/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *in, *out ; int i ; char s[81] ; in = fopen("in.dat","r") ; out = fopen("out.dat","w") ; for(i = 0 ; i < 10 ; i++) { fscanf(in, "%s", s) ; fun(s) ; fprintf(out, "%s\n", s) ; } fclose(in) ; fclose(out) ; }
1.(1)i+1 (2)k=j (3)t 2. t=a; a=b; b=t; return(b); 3. void fun(char *str) { int i,j; for (i=0,j=0; str[i]!='\0';i++) if (str[i]!='*') str[j++]=str[i]; str[j]='\0'; }
第59套
1.程序填空题
给定程序中,函数fun的功能是:求出形参ss所指字符串中最长字符串的长度,将其余字符串左边用字符“*”补齐,使其与最长的字符串等长。ss所指字符串数组中共有M个字符串,且串长<N。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h> #include <string.h> #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, k=0, n, m, len; for(i=0; i<M; i++) { len=strlen(ss[i]); if(i==0) n=len; if(len>n) { /**********found**********/ n=len; ___1___=i; } } for(i=0; i<M; i++) if (i!=k) { m=n; len=strlen(ss[i]); /**********found**********/ for(j=___2___; j>=0; j--) ss[i][m--]=ss[i][j]; for(j=0; j<n-len; j++) /**********found**********/ ___3___='*'; } } int main() { char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"}; int i; printf("\nThe original strings are :\n"); for(i=0; i<M; i++) printf("%s\n",ss[i]); printf("\n"); fun(ss); printf("\nThe result:\n"); for(i=0; i<M; i++) printf("%s\n",ss[i]); return 0; }
2.程序修改题
给定程序中,函数fun的功能是:用递归算法计算斐波那契数列中第n项的值,从第1项起,斐波那契数列为:1、1、2、3、5、8、13、21、……。
例如,若n=7,该项的斐波那契数值为13。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h> 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)); } int 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); return 0; }
3.程序设计题
某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程成绩已在主函数中给出。编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。
例如,学生的成绩为:85.4,76,69.5,85,91,72,64.5,87.5,平均分应为:78.875。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h> #define N 8 typedef struct { char num[10]; double s[N]; double ave; }STREC; void NONO(void); void fun(STREC *p) { } int 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<N;i++) printf("%4.1f\n",s.s[i]); printf("\nave=%7.3f\n",s.ave); NONO(); return 0; } void NONO(void) {/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */ STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5}; int i; FILE *wf; wf = fopen("out.dat", "w") ; fun(&s); fprintf(wf,"The %s's student data:\n",s.num); for(i=0;i<N;i++) fprintf(wf,"%4.1f\n",s.s[i]); fprintf(wf,"ave=%7.3f\n",s.ave); fclose(wf) ; }
1.(1)k (2)len (3)ss[i][j] 2. switch(g) case 1 :case 2 : return 1 ; 3. void fun(STREC *p) { int i; double sum=0.0; for (i=0;i<N;i++) sum+=p->s[i]; p->ave=sum/N; }
第60套
1.程序填空题
给定程序中,函数fun的功能是:进行字母转换。若形参ch是小写英文字母,则转换为对应的大写英文字母;若ch中是大写英文字母,则转换为对应的小写英文字母;若是其它字符则保持不变。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h> #include <ctype.h> char fun(char ch) { /**********found**********/ if ((ch>='a')___1___(ch<='z')) return ch -'a' + 'A'; if ( isupper(ch) ) /**********found**********/ return ch +'a'-___2___ ; /**********found**********/ return ___3___; } int main() { char c1, c2; printf("\nThe result :\n"); c1='w'; c2 = fun(c1); printf("c1=%c c2=%c\n", c1, c2); c1='W'; c2 = fun(c1); printf("c1=%c c2=%c\n", c1, c2); c1='8'; c2 = fun(c1); printf("c1=%c c2=%c\n", c1, c2); return 0; }
2.程序修改题
给定程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。
例如,若k=500,则函数值为4622。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h> int fun(int k) { int m=0,mc=0; while ((k>=2)&&(mc<10)) { /************found************/ if ((k%13=0)||(k%17=0)) { m=m+k; mc++; } /************found************/ k++; } return m; } int main() { printf("%d\n",fun(500)); return 0; }
3.程序设计题
假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了字符串中的前导*号之外,将串中其它*号(中间和尾部的*号)全部删除。
例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****ABCDEFG。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h> void NONO(void); void fun(char *str) { } int main() { char s[81]; printf("Enter a string:\n"); gets(s); fun( s ); printf("The string after deleted:\n"); puts(s); NONO(); return 0; } void NONO(void) {/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *in, *out ; int i ; char s[81] ; in = fopen("in.dat","r") ; out = fopen("out.dat","w") ; for(i = 0 ; i < 10 ; i++) { fscanf(in, "%s", s) ; fun(s) ; fprintf(out, "%s\n", s) ; } fclose(in) ; fclose(out) ; }
1.(1)&& (2)'A' (3)ch 2. if ((k%13==0)||(k%17==0)) k--; 3. void fun(char *str) { int i,j; i=0; while (str[i]=='*') i++; for (j=i; str[i]!='\0';i++) if (str[i]!='*') str[j++]=str[i]; str[j]='\0'; }