《2017年全国计算机等级考试C语言上机考试题库-1-20套.doc》由会员分享,可在线阅读,更多相关《2017年全国计算机等级考试C语言上机考试题库-1-20套.doc(76页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、优质文本2017年全国计算机等级考试C语言上机考试题库 学生练习用第一套至第二十套第一套:1、程序填空程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参所指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其他学生的数据不变。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include #define N 5typedef struct student long sno; char name1
2、0; float score3; STU;void fun(char *, 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,
3、 82, 87, 10005,ZhangSan, 95, 80, 88; STU n=10006,ZhaoSi, 55, 70, 68, ssN; int i,j; FILE *fp; fp = fopen(student.dat, wb); fwrite(t, sizeof(STU), N, fp); fclose(fp); fp = fopen(student.dat, rb); fread(ss, sizeof(STU), N, fp); fclose(fp); printf(nThe original data :nn); for (j=0; jN; j+) printf(nNo: %
4、ld Name: %-8s Scores: ,ssj.sno, ssj.name); for (i=0; i3; i+) printf(%6.2f , ssj.scorei); printf(n); fun(student.dat, n); printf(nThe data after modifing :nn); fp = fopen(student.dat, rb); fread(ss, sizeof(STU), N, fp); fclose(fp); for (j=0; jN; j+) printf(nNo: %ld Name: %-8s Scores: ,ssj.sno, ssj.na
5、me); for (i=0; i3; i+) printf(%6.2f , ssj.scorei); printf(n); -【参考答案】(1)(2)fp(3)fp【解题思路】填空1:本空是对文本文件的翻开,所指的文件中的最后数据要进行重写,因此首先是要翻开,因而本空填写。填空2:fseek功能是重定位流上的文件指针。用法:intfseek(FILE*stream,longoffset,intfromwhere);本空应该填写fp。填空3:因为题目中要对所有学生数据均以二进制方式输出到文件中,因此本空填写fp。知识点讲解:函数名:fseek功能:重定位流上的文件指针。用法:intfseek(F
6、ILE*stream,longoffset,intfromwhere)。描述:函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比方offset超过文件自身大小),那么不改变stream指向的位置。返回值:成功,返回0;否那么返回非0值。2、程序改错以下给定程序中函数Creatlink的功能是:创立带头结点的单向链表,并为各结点数据域赋0到m-1的值。请改正函数Creatlink中指定部位的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改
7、程序的结构!-#include #include typedef struct aa int 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=1; idata=rand()%m; s-next=p-next; p-next=s; p=p-next; /*found*/ return p;outlink(NODE *h) NODE *p; p=h-
8、next; printf(nnTHE LIST :nn HEAD ); while(p) printf(-%d ,p-data); p=p-next; printf(n);main() NODE *head; head=Creatlink(8,22); outlink(head);-【参考答案】1p=(NODE*)malloc(sizeof(NODE);2returnh;【考点分析】此题考查:变量赋初值;for循环语句;函数返回值。【解题思路】1由变量定义可知p为指向结点的指针。指向刚分配的结构指针,所以应改为p(NODE*)malloc(sizeof(NODE)。2在动态分配内存的下一行语句
9、是,使用临时结构指针变量h保存p指针的初始位置,最后返回不能使用p,是因为p的位置已经发生了变化,所以应改为returnh。3、程序设计请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有假设干个空格隔开,一行的开始没有空格。注意:局部源程序在文件PROG1.C中。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的假设干语句。-#include#include#define N 80int fun(char *s) void main() FILE *wf; char lineN
10、; int num=0; printf(Enter a string:n ); gets(line); num=fun(line); printf(The number of word is:%dnn ,num);/*/ wf=fopen(out.dat,w); fprintf(wf,%d,fun(a big car); fclose(wf);/*/-【参考答案】intfun(char*s)inti,j=0;for(i=0;si!=0;i+)if(si!=&(si+1=|si+1=0)/*如果一个字母的下一个字符为空格或者结束标记,那么表示一个单词结束*/j+;returnj;/*返回单词个数
11、*/【解题思路】要判断单词的个数,首先想到的是程序怎样识别出一个单词,如果一个字母的下一个字符为空格或者结束标记,那么表示一个单词结束,因此程序使用for循环语句遍历整个字符串,用if条件语句判断当前字符是否表示一个单词的结束,如果当前字符表示一个单词结束,那么存放单词个数的变量加1,最后返回单词的个数。第二套1、程序填空给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),作为函数值返回,并将大于平均值的数放在形参y所指数组中,在主函数中输出。例如,有10个正数:46、30、32、40、6、17、45、15、48、26,其平均值为30.500000。主函数
12、中输出:4632404548。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include #include #define N 10double fun(double x,double *y) int i,j; double av;/*found*/ av=_1_;/*found*/ for(i=0; iN; i+) av=av+_2_; for(i=j=0; iav) y_3_= xi; yj=-1; return av;main() int i; double xN,yN; for
13、(i=0; i=0; i+) printf(%5.1f ,yi); printf(n);-【参考答案】10.02xi/N3j+【解题思路】填空1:通过读上面的程序可以看出此空考的是给变量赋初值,av代表的是平均值,因此av的初值应该是0.0。填空2:通过for循环可知,此空代表求平均值,因此应该填写xi/N。填空3:先把大于平均值的数放在形参y所指数组中,然后使下标值加1,因此此空应该填j+。2、程序改错以下给定程序中,函数fun的功能是:根据整型参数m,计算如下公式的值。例如,假设m2000,那么应输出0.000160。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI
14、1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!-#include #include #include /*found*/fun (int m) double y=0, d; int i;/*found*/ for(i=100,i=m,i+=100) d=(double)i*(double)i; y+=1.0/d; return(y);void main() int n=2000; system(CLS); printf(nThe result is %1fn,fun(n);-【参考答案】(1)doublefun(intm)(2)for(i=100;i=m;i+=100)
15、【解题思路】(1)题目要求在函数fun中求级数前m项和,可用循环语句,每次计算级数中的一项,然后累加。第一处错误在于定义fun(intm),由函数的返回值可知应该定义为doublefun(intm)。(2)for(i100,i=m,i+=100)中是一个简单的语法错误。for循环语句的形式为for(表达式1;表达式2;表达式3),其表达式之间应以;相隔。3、程序设计学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。注意:局部源程序在文件PROG1
16、.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的假设干语句。-#include#include#include#include#define N 10typedef struct ss char num10; int s; STU;fun(STU a, STU *s) void main() FILE *wf; STU aN= A01,81, A02,89, A03,66, A04,87, A05,77, A06,90, A07,79, A08,61, A09,80, A10,71,m; int i; system(CLS); printf(*The
17、original data*n); for(i=0;iN;i+) printf(No=%s Mark=%dn, ai.num,ai.s); fun(a,&m); printf(*THE RESULT*n); printf(The lowest :%s, %dn,m.num,m.s);/*/ wf=fopen(out.dat,w); fprintf(wf,%s, %d,m.num,m.s); fclose(wf);/*/-【参考答案】fun(STUa,STU*s)inti;*s=a0;/*先认为第1个值最小*/for(i=0;isai.s)*s=ai;【解题思路】找出结构体数组元素中的最小值。先
18、认为第1个值最小,即*sa0;,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。另外,此题还涉及结构体中的指向运算符,请考生注意。第三套1、程序填空给定程序中,函数fun的功能是:计算x所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。例如,有10个正数:46、30、32、40、6、17、45、15、48、26,平均值为30.500000。主函数中输出m30。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得
19、增行或删行,也不得更改程序的结构!-#include #include #define N 10double fun(double x,double *av) int i,j; double d,s; s=0; for(i=0; iN; i+) s = s +xi;/*found*/ _1_=s/N; d=32767; for(i=0; iN; i+) if(xi*av & *av - xi=d)/*found*/ d=*av-xi; j=_2_; /*found*/ return _3_;main() int i; double xN,av,m; for(i=0; iN; i+) xi=ra
20、nd()%50; printf(%4.0f ,xi); printf(n); m=fun(x,&av); printf(nThe average is: %fn,av); printf(m=%5.1f ,m); printf(n);-【参考答案】(1)*av(2)i(3)xj【解题思路】填空1:从原程序中可以看出*av代表的是平均值,而s/N表示的就是平均值,因此本空应该填*av。填空2:if语句来判断找最接近平均值的数,因而此空应该填i。填空3:题目要求将小于平均值且最接近平均值的数作为函数返回,而j表达的是最接近平均值的数在数组中的下标,因而本空应该填写xj。2、 程序修改以下给定程序中,
21、函数fun的功能是:根据整型形参n,计算如下公式的值。例如,假设n10,那么应输出0.617977。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!-#include #include #include /*found*/int fun(int n) float A=1;int i;/*found*/ for(i=2;in;i+) A=1.0/(1+A); return A;void main() int n; system(CLS); printf(nPlease enter n: ); scanf
22、(%d,&n); printf(A%d=%lfn,n,fun(n);-【参考答案】(1)floatfun(intn)(2)for(i=2;i=n;i+)【解题思路】(1)根据函数的返回值可知,函数应定义为float型。(2)该题中函数fun的作用是计算数列前n项的和,而数列的组成方式是:第n项的分母是1加第n1项的值,分子为1,如果循环累加按for(i2;in;i)执行,当输入n2时循环不会执行,程序将得不到想要的结果,因此循环变量的取值范围应包括2。3、 程序设计以下程序定义了NN的二维数组,并在主函数中自动赋值。请编写函数fun(intaN,intm),该函数的功能是使数组右上半三角元素中
23、的值乘以m。例如,假设m的值为2,a数组中的值为:那么返回主程序后a数组中的值应为:注意:局部源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的假设干语句。-#include #include #include #include #define N 5void fun(int aN, int m) main() int aNN,m, i, j; FILE *out; printf(*The array*n); for(i=0;iN;i+) for(j=0;jN;j+) aij=rand()%20; printf(%4d, aij);
24、 printf(n); m=rand()%4; printf(m=%4dn,m); fun(a,m); printf(THE RESULTn); for(i=0;iN;i+) for(j=0;jN;j+) printf(%4d,aij); printf(n); /*/ out=fopen(out.dat,w); for(i=0;iN;i+) for(j=0;jN;j+)aij=i*j; fun(a,8); for(i=0;iN;i+) for(j=0;jN;j+)fprintf(out,%4d,aij);fprintf(out,n); fclose(out); /*/-【参考答案】voidfu
25、n(intaN,intm)inti,j;for(j=0;jN;j+)for(i=0;i=j;i+)aij=aij*m;/*右上半三角元素中的值乘以m*/【解题思路】本程序实现将矩阵中右上半三角元素中的值乘以m,使用循环语句遍历数组元素,第1个循环用于控制行坐标,第2个循环用于控制列下标。第四套1、 程序填空给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于平均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。例如,有10个正数:46、30、32、40、6、17、45
26、、15、48、26,平均值为30.500000。移动后的输出为:46、32、40、45、48、30、6、17、15、26。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include #include #define N 10double fun(double *x) int i, j; double s, av, yN; s=0; for(i=0; iN; i+) s=s+xi;/*found*/ av=_1_; for(i=j=0; iav )/*found*/ y_2_=xi; x
27、i=-1; for(i=0; iN; i+)/*found*/ if( xi!= _3_) yj+=xi; for(i=0; iN; i+)xi = yi; return av;main() int i; double xN; for(i=0; iN; i+) xi=rand()%50; printf(%4.0f ,xi); printf(n); printf(nThe average is: %fn,fun(x); printf(nThe result :n,fun(x); for(i=0; iav)表达的是当x数组中的数大于平均值时,应该把这些大于平均值的数放在y数组的前半局部,因而此空应
28、该填yj+。填空3:此空说明当xi不等于什么时,xi中的数要赋值给y数组,由题意可知此空只能填写-1。2、 程序修改以下给定程序的功能是:读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里单词是指由空格隔开的字符串)。例如,假设输入Iamastudenttotaketheexamination,那么应输出IAmAStudentToTakeTheExamination。请改正程序中的错误,使程序能得出正确的结果。注意:局部源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!-#include #include #include #
29、include #include #include /*found*/void upfst(char p) int k=0; for ( ;*p;p+) if (k) if (*p= ) k=0; else if (*p!= ) k=1;*p=toupper(*p);void main()char chrstr81;system(CLS); printf(nPlease enter an English text line: );gets(chrstr);printf(nBofore changing:n %s,chrstr);upfst(chrstr);printf(nAfter changing:n %sn,chrstr);-