计算机二级c语言上机题库.docx
2011全国计算机二级C语言上机参考题库注意:填空题填好答案要去掉下划线.改错题*found*下面的一行为错误地方,直接按答案更正即可。程序题答案只填在花括号中.(记得保存)第01套:-、填空题:程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参filename所指文件中最后个学生的数据,即用新的学生数据覆盖该学生原来的数据,其它学生的数据不变。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:include <stdio. h>ttdefine N 5typedef struct student long sno;char name10;float score3; STU;void fun(char *filename, STU n)FILE *fp:/*found*/fp = fopen(_1_,"rb+”);/*found*/fseek(_2_,-(long)sizeof (STU), SEEK_END);/*found*/fwrite (&n, sizeof (STU),1,3);fclose(fp);)main()STU tN=10001,*MaChao*,91,92,77,10002,"CaoKai”,75,60,88,10003,"LiSi”,85,70,78,10004,"FangFang”,90,82,87,10005,*ZhangSan*,95,80,88;STU n=10006/ZhaoSi55,70,68, ssN;int i, j; FILE *fp;fp = fopenCstudent.dat","wb");fwrite(t, sizeof (STU), N, fp);fclose(fp);fp = fopenCstudent.dat","rb");fread(ss, sizeof(STU), N, fp);fclose(fp);printf(*nThe original data :nn*);for (j=0; j<N; j+)printf(*nNo:%ld Name:%-8s Scores: ssj. sno, ssj.name); for (i=0; i<3; i+) printf(*%6.2f *, ssj.scorei);printf(*n*);fun("student, dat”, n);printf(*nThe data after modifing :nn*):fp = fopenCstudcnt.dat","rb");fread(ss, sizeof(STU), N, fp);fclose(fp);for (j=0; j<N; j+)printf (*nNo:%ld Name:%-8s Scores:*, ssj. sno, ssj. name); for (i=0; i<3; i+) printf(*%6.2f ”, ssj.scorei);printf ('n");解题答案:/*第空*/fp = fopen(filename,"rb+”);/*第二空*/fseek(fp,"(long)sizeof(STU), SEEK_END);/*第三空*/fwrite(&n, sizeof (STU),1, fp);二、改错题:给定程序M0DI1.C中的函数Creatlink的功能是创建带头结点的单向链表,并为各结点数据域赋0到m-1的值。请改正函数Creatlink中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:include <stdio.h>include <stdlib. h>typedef struct aaint data;struct aa *next; NODE;NODE *Creatlink(int n, int m)(NODE *h=NULL,*p,*s;int i;/*found*/p=(NODE)malloc(sizeof(NODE);h=p;p->next=NULL;for(i=l; i<=n; i+)s=(NODE *) ma Hoc (sizeof (NODE);s->data=rand()%m; s->next=p->next;p->next=s; p=p->next;/*found*/return p;)out link(NODE *h)NODE *p;p=h->next;printf(*nnTHE LIST :nn HEAD ");while(p)printf(*->%d *,p->data);p=p->next;)printf('n");main()NODE *head;head=Creat1i nk(8,22);out link(head);)解题答案:/*found*/ p=(NODE *)malloc(sizeof(NODE);/* found*/ return h;三、程序题:请编写函数fun,函数的功能是:统计一行字符串中单词的个数,作为函数值返回.一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格.注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>include <string. h>#define N 80int fun(char *s)main()char 1ineN; int num=0;void NONO ();printf("Enter a string :n"); gets(1ine);num=fun(1ine);printf(*The number of word is :%dnn*, num);NONO O :)void NONO ()/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/ FILE *rf,*wf ; int i, num ; char lineN,*p ;rf = fopen ("in. dat","r");wf = fopen("out. dat","w");for(i =0; i <10; i+)fgets(line, N, rf);p = strchr (1 ine,'n');if(p != NULL)*p =0;num = fun(line);fprintf(wf,"%dn", num);)fclose(rf); fclose(wf);)参考答案:int fun( char *s)(int k =1;while(*s)(if(*s =*) k-H-;S-H-;)return k;#抑#阴#抑#第02套:一、填空题:给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到文件myflle4.txt中,用T作为字符串输入结束的标志.然后将文件的内容读出显示在屏幕上。文件的读写分别由自定义函数ReadText和WriteText实现。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:include <stdio.h>#include <string. h>#include <stdlib. h>void WriteText(FILE *);void ReadText(FILE );mainOFILE *fp;if (fp=fopen(*myfi 1 e4. txt","w")二二NULL)printf(* open fail!n*); exit(0);Wri teText(fp);fclose(fp);if (fp=fopenCxmyfile4. txt","r")=NULL)printf(* open fail!n*); exit(0);ReadText(fp);fclose(fp);/*found*/void WriteText(FILE 1)char str81;printf(*nEnter string with -1 to end :n");gets(str);while(strcmp(str,*-1*)!=0)/*foun(j*/fputs(2, fw); fputs('n", fw);gets (str);)void ReadText(FILE *fr)char str81;printf(*nRead file and output to screen :n");fgets (str,81, fr);while(!feof(fr)/*found*/printf (飞s",3);fgets(str,81, fr);)解题答案:/*第一空*/void WriteText(FILE *fw)/*第二空*/fputs(str, fw); fputs ("n", fw);/*第三空*/ printf str);二、改错题:给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为:7654321时,t中的数为:7531 o请改正程序中的错误,使它能得出1E确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio. h>/*found*/ void fun (long s, long t)long sl=10;*t = s %10; while (s >0)s = s/100;*t = s%10* si +*t;/*found*/ si = sl*100;main()long s, t;printf(*nPlease enter s:"); scanf&s);fun (s,&t);printf(*The result is:%ldn*, t);解题答案:/*found*/void fun (long s, long *t)/*founcj*/ sl=sl*10;三、程序题:函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的千位和十位上。例如,当a=45, b=12时,调用该函数后,c=1524o注意:部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。请勿改动主函数main和其它函数中的任何内容,仅在函数ftin的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>void fun(int a, int b, long *c)()mainOint a, b; long c;void NONO ();printf(*Input a, b:");scanf ("%d,%d",&a,&b);fun (a, b,&c);printf(*The result is:%ldn*, c);NONO O :)void NONO ()/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/ FILE *rf,*wf ;int i, a, b ; long c ;rf = fopen(*in. dat*,"r");wf = fopen(*out. dat","w");for(i =0; i <10; i+)fscanf(rf,&a,&b);fun (a, b,&c);fprintf (wf,*a=%d, b=%d, c=%ldn*, a, b, c);fclose (rf);fclose(wf);)解题答案:(*c=(b/l0)*1000+(a%10)*100+(b%10)*10+(a/10);)#阴的#制牌#抑蝴#然的#曲#第03套:一、填空题:给定程序中,函数fun的功能是:将自然数110以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果.注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:include <math. h>include <stdio. h> int fun(char *fname)FILE *fp; int i, n; float x;if(fp=fopen(fname,"w")=NULL) return 0;for(i=l;i<=10;i+)/*found*/ fprintf(1,*%d%fn*» i, sqrt(double)i);printf(*nSucceed!n"):/*found*/2;printf(*nThe data in file :n");/*found*/if(fp=fopen(3,"r")=NULL)return 0;f scanf (fp,*%d%f *,&n,&x);whiledfeof (fp)printf(*%d n, x); fscanf (fp,&n,&x);fclose(fp);return 1;)mainOchar fname=*myfile3. txt*; fun(fname);)解题答案:/*第一空*/fprintf(fp,%fn*, i, sqrt(double)i);printf(*nSucceed!n");/*第-空*/ fclose(fp);/*第三空*/ if (fp=fopen(fname,*r*)=NULL)改错题:给定程序MODI1.C中fun函数的功能是:将n个无序整数从小到大排序。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:include <stdio. h>ttinclude <stdlib. h> fun (int n, int *a)int i, j, p, t;for (j =0; j<n-l ; j+)p = J;/*found*/ for (i=j+l; i<n-l ; i+) if (ap>ai)/*found*/ t=i;if (p!=j)t = aj; aj= ap; ap= t;)putarr(int n, int *z)int i;for (i =1; i <= n; i+, z+)printf (*%4d*,*z);if (!(i%10) printf(*n*); printf(*n*);)mainOint aa20=9,3,0,4,1,2,5,6,8,10,7, n=ll;printf(*nnBefore sorting %d numbers:n*» n); putarr(n, aa);fun (n, aa);printf(*nAfter sorting %d numbers:n*, n); putarr(n, aa);)解题答案:#include <stdio.h>ttinclude <stdlib. h> fun (int n, int *a)int i, j, p, t:for (j =0; j<n-l ; j+)p = J;/*found*/ for(i=j+l;i<n;i+)/*found*/ p=i ;三、程序题:函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上。例如,当a=45,b=12时,调用该函数后,c=2514。注意:部分源程序存在文件PROGLC中。数据文件IN.DAT中的数据不得修改。请勿改动主函数main和其它函数中的任何内容,仅在函数ftin的花括号中填入你编写的若干语句。给定源程序:#include <stdio. h> void fun(int a, int b, long *c)()mai n ()int a, b; long c;void NONO ();printf(*Input a, b:");scanf(*%d,%d*,&a,&b);fun (a, b,&c);printf(*The result is:%ldn*, c);NONO();void NONO ()/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/ FILE *rf,*wf ;int i, a, b ; long c ;rf = fopenCin.dat","r");wf = fopen("out. dat","w");for(i =0; i <10; i+)fscanf(rf,"%d,%d",&a,&b);fun (a, b,&c);fprintf (wf,“a=%d, b=%d, c=%ldn”, a, b, c);fclose(rf);fclose (wf);)解题答案:(# c=(b%10)*1000+(a%l0)*100+(b/10)*10+a/10;)# #%#阴曲#曲#能第04套:一、填空题:程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。请在程序的卜划线处填入正确的内容并把卜划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:include <stdio. h># define N 5typedef struct student long sno;char name10;float score3; STU;void fun(char *filename)FILE *fp; int i, j;STU sN, t;/*found*/fp = fopen(filename,_1.);fread(s, sizeof(STU), N, fp);fclose(fp);for (i=0; i<N-l; i+)for (j=i+l; j<N; j+)/*found*/if (si. sno _2_ sj. sno)t = si; si= sj; sj= t;fp = fopen(filename,"wb");/*found*/_3_(s, sizeof(STU), N, fp);/*二进制输出*/fclose(fp);)mainOSTU tN=10005,*ZhangSan",95,80,88,10003,"LiSi”,85,70,78,10002,*CaoKai*,75,60,88,10004,"FangFang”,90,82,87,10001,*MaChao91,92,77, ssN;int i, j; FILE *fp;fp = fopen ("student, dat","wb");fwrite(t, sizeof(STU),5, fp);fclose(fp);printf(*nnThe original data :nn");for (j=0; j<N; j+)printf(*nNo:%ld Name:%-8s Scores:*, tj.sno, tj. name);for (i=0; i<3; i+) printf (*%6.2f ”, tj. scorei);printf(*n*);)fun ("student, dat");printf(*nnThe data after sorting :nn*);fp = fopen (*student, dat*,"rb");fread(ss, sizeof(STU),5, fp);fclose(fp);for (j=0; j<N; j+)printf (*nNo:%ld Name:%-8s Scores: ssj. sno, ssj. name);for (i=0; i<3; i+) printf(*%6.2f ”, ssj. scorei);printf ("n");)解题答案:/*第一空*/fp = fopen(filename,"rb");/*第二空*/if (si. sno > sj. sno)/*第三空*/fwrite(s, sizeof (STU), N, fp);/二进制输出*/改错题:给定程序MODH.C中函数fun的功能是:在字符串的最前端加入n个*号,形成二、新串,并且覆盖原串。注意:字符串的长度最长允许为79。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:ttinclude <stdio. h>ttinclude <string. h>void fun (char s口,int n)(char a80,*p;int i;/*found*/s 二p;for(i=0; i<n; i+) ai=*;doai=*p;i+;/*found*/while (*p+)ai=0;strcpy (s, a);)mainOint n; char s80;printf(*nEnter a string :"); gets(s);printf(*nThe string "%s"n', s);printf(*nEnter n (number of *):; scanf&n);fun(s,n);printf(*nThe string after insert :"%s"n", s);解题答案:/*found*/P=s;/* found*/while(*p+);三、程序题:请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主:函数的age数组中:要求函数把0至9岁年龄段的人数放在d0中,把10至19岁年龄段的人数放在dl中,把20至29岁年龄段的人数放在d中,其余依此类推,把100岁(含100似上年龄的人数都放在310中。结果在主函数中输出。注意:部分源程序在文件PROG 1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio. h>define N 50define M 11 void fun(int *a, int *b)( double rnd()static t=29, c=217, m=1024, r=0; r=(r*t+c)%m; return(double)r/m);)main()int ageN, i, dM;void NONO (int dM);for (i=0; i<N; i+)agei=(int)(115*rnd();printf(*The original data :n");for(i=0;i<N;i+) printf(i+l)%10=0?*%4dn*:*%4d*,agei);printf(*nn*); fun(age, d);for (i=0;i<10; i+)printf (*%4d%4d :%4dn*» i*10, i*10+9, di);printf(*0ver 100:%4dn*, d10);NONO(d);)void NONO(int dM)/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/ FILE *wf ; int i ;wf = fopen ("out. dat","w");for(i =0; i <10; i+) fprintf(wf,"%4d%4d :%4dn*, i*10, i*10+9, di);fprintf (wf,“ Over 100:%4dn*, d10);fclose (wf);)参考答案:void fun( int *a, int *b)( int i,j ;for(i =0; i < M ; i+) bi=0;for(i =0; i< N ; i+)j = ai/10;if(j>10) b|M- ll+;elsebj-H-;) double md() static t=29,c=217,m=1024,n=0;r=(r*t-H:)%m; relum(double)r/m);#阴#«#阴附第05套:一、填空题:给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据域中的数据递增有序链接。函数 fun的功能是:把形参x的值放入一个新结点并插入到链表中,插入后各结点数据域的值仍保持递增有序。请在程序的卜划线处填入正确的内容并把卜划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>#include <stdlib.h>#defineN 8typedef struct list(int data;struct list *next;)SLIST;void fun(SLIST *h, int x)SLIST*p,*q,*s;s=(SLIST *)malloc(sizeof(SLIST);s->data=I;q=h;p=h->next;while(p!=NULL && x>p->data)/*!qund*/q=2;p=p->next;)s->next=p;/*fou*/q->next=3;)SLIST *creatlist(int *a)SLIST*h,*p,*q; int i;h=p=(SLIST*)malloc(sizeof(SLIST);fbr(i=O; i<N; i+)q=(SLIST *)malloc(sizeof(SLIST);q->data=ai; p->next=q; p=q;p->next=O;return h;void outlist(SLIST *h)SLIST*p;p=h->next;if(p=NULL) printf("nThe list is NULL!nM);elseprintf("nHead");do printf(,->%d,',p->data); p=p->next; while(p!=NULL);printf(H->Endn'*);1main()(SLIST*head; int x;int aN=11,12,15,18,19,22,25,29);head=creatlist(a);printf("nThe list before inserting:nM); outlist(head);printf("nEnter a number :"); scanf(,%d,&x);fun(head,x);prinlf("nThe list after insertingAn"); outlist(head);)解题答案:/*第一空*/s->daa=x;/*第二空*/q=P;/*第三空*/q->next=s;二、改错题:给定程序M0DI1.C中函数fun的功能是:计算正整数num的各位上的数字之积。例如,若输入:252,则输出应该是:20o若输入:202,则输出应该是:0。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>long fun (long num)long k;dok*=num%10;/*found*/num=10;(while(num);return (k);main()long n ;printf(MnPlease enter a number:*); scanf(H%ld'&n);printf(Hn%ldn",fun(n);)解题答案:/*found*/long k=l;/* found*/num/=10;三、程序题:请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回。例如:若有5门课程的成绩是:90.5,72,80,61.5,55则函数的值为:九80。注意:部分源程序存在文件PROG 1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>float fun (float *a, int n) main()float score30=90.5,72,80,61.5,55), aver;void NONO ();aver = fun(score,5);printf(MnAverage score is:%5.2fnH, aver);NONO ();)void NONO ()/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/ FILE *fp,*wf;int i, j ;float aver, score5;fp = fopen("in.dat","r");wf = fopcn(,'out.dat","wM);for(i =0; i <10;i+)for(j =0; j <5; j+) fscanf(fp/,%f,",&score(j);aver= fun(score,5);fprintf(wf,"%5.2fn' aver);fclose(fp); fclose(wf);解题答案:int i;float ave=0.0;for(i=0; i<n; i+)ave=ave+ai; ave=av