全国计算机等级考试C语言上机考试题库120套.docx
- 文档编号:4234085
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:115
- 大小:104.44KB
全国计算机等级考试C语言上机考试题库120套.docx
《全国计算机等级考试C语言上机考试题库120套.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试C语言上机考试题库120套.docx(115页珍藏版)》请在冰点文库上搜索。
全国计算机等级考试C语言上机考试题库120套
2017年全国计算机等级考试C语言上机考试题库
学生练习用第一套至第二十套
第一套:
1、程序填空
程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。
所有学生数据均以二进制方式输出到文件中。
函数fun的功能是重写形参filename所指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其他学生的数据不变。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include
#defineN5
typedefstructstudent{
longsno;
charname[10];
floatscore[3];
}STU;
voidfun(char*filename,STUn)
{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()
{STUt[N]={{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}};
STUn={10006,"ZhaoSi",55,70,68},ss[N];
inti,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("\nTheoriginaldata:
\n\n");
for(j=0;j {printf("\nNo: %ldName: %-8sScores: ",ss[j].sno,ss[j].name); for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]); printf("\n"); } fun("student.dat",n); printf("\nThedataaftermodifing: \n\n"); fp=fopen("student.dat","rb"); fread(ss,sizeof(STU),N,fp); fclose(fp); for(j=0;j {printf("\nNo: %ldName: %-8sScores: ",ss[j].sno,ss[j].name); for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]); printf("\n"); } } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 (1)filename (2)fp (3)fp 【解题思路】 填空1: 本空是对文本文件的打开,filename所指的文件中的最后数据要进行重写,因此首先是要打开,因而本空填写filename。 填空2: fseek 功能是重定位流上的文件指针。 用法: int fseek(FILE *stream, long offset, int fromwhere);本空应该填写fp。 填空3: 因为题目中要对所有学生数据均以二进制方式输出到文件中,因此本空填写fp。 知识点讲解: 函数名: fseek 功 能: 重定位流上的文件指针。 用 法: int fseek(FILE *stream, long offset, int fromwhere)。 描 述: 函数设置文件指针stream的位置。 如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。 如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。 返回值: 成功,返回0;否则返回非0值。 2、程序改错 下列给定程序中函数Creatlink的功能是: 创建带头结点的单向链表,并为各结点数据域赋0到m-1的值。 请改正函数Creatlink中指定部位的错误,使它能得出正确的结果。 注意: 部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构! ----------------------------------------------------------------------------------------------------------------- #include #include typedefstructaa {intdata; structaa*next; }NODE; NODE*Creatlink(intn,intm) {NODE*h=NULL,*p,*s; inti; /**********found***********/ p=(NODE)malloc(sizeof(NODE)); h=p; p->next=NULL; for(i=1;i<=n;i++) {s=(NODE*)malloc(sizeof(NODE)); s->data=rand()%m;s->next=p->next; p->next=s;p=p->next; } /**********found***********/ returnp; } outlink(NODE*h) {NODE*p; p=h->next; printf("\n\nTHELIST: \n\nHEAD"); while(p) {printf("->%d",p->data); p=p->next; } printf("\n"); } main() {NODE*head; head=Creatlink(8,22); outlink(head); } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 (1)p=(NODE *)malloc(sizeof(NODE)); (2)return h; 【考点分析】 本题考查: 变量赋初值;for循环语句;函数返回值。 【解题思路】 (1)由变量定义可知p为指向结点的指针。 指向刚分配的结构指针,所以应改为p=(NODE *)malloc(sizeof(NODE))。 (2)在动态分配内存的下一行语句是,使用临时结构指针变量h保存p指针的初始位置,最后返回不能使用p,是因为p的位置已经发生了变化,所以应改为return h。 3、程序设计 请编写函数fun,该函数的功能是: 统计一行字符串中单词的个数,作为函数值返回。 字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。 注意: 部分源程序在文件PROG1.C中。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 ----------------------------------------------------------------------------------------------------------------- #include #include #defineN80 intfun(char*s) { } voidmain() { FILE*wf; charline[N]; intnum=0; printf("Enterastring: \n"); gets(line); num=fun(line); printf("Thenumberofwordis: %d\n\n",num); /******************************/ wf=fopen("out.dat","w"); fprintf(wf,"%d",fun("abigcar")); fclose(wf); /*****************************/ } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 int fun(char *s) { int i,j=0; for(i=0;s[i]! ='\0';i++) if(s[i]! =' '&&(s[i+1]==' '||s[i+1]=='\0')) /*如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束*/ j++; return j; /*返回单词个数*/ } 【解题思路】 要判断单词的个数,首先想到的是程序怎样识别出一个单词,如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束,因此程序使用for循环语句遍历整个字符串,用if条件语句判断当前字符是否表示一个单词的结束,如果当前字符表示一个单词结束,则存放单词个数的变量加1,最后返回单词的个数。 第二套 1、程序填空 给定程序中,函数fun的功能是: 计算形参x所指数组中N个数的平均值(规定所有数均为正数),作为函数值返回,并将大于平均值的数放在形参y所指数组中,在主函数中输出。 例如,有10个正数: 46、30、32、40、6、17、45、15、48、26,其平均值为30.500000。 主函数中输出: 46 32 40 45 48。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意: 部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! ----------------------------------------------------------------------------------------------------------------- #include #include #defineN10 doublefun(doublex[],double*y) {inti,j;doubleav; /**********found**********/ av=__1__; /**********found**********/ for(i=0;i av=av+__2__; for(i=j=0;i /**********found**********/ if(x[i]>av)y[__3__]=x[i]; y[j]=-1; returnav; } main() {inti;doublex[N],y[N]; for(i=0;i printf("\n"); printf("\nTheaverageis: %f\n",fun(x,y)); for(i=0;y[i]>=0;i++)printf("%5.1f",y[i]); printf("\n"); } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 (1)0.0 (2)x[i]/N (3)j++ 【解题思路】 填空1: 通过读上面的程序可以看出此空考的是给变量赋初值,av代表的是平均值,因此av的初值应该是0.0。 填空2: 通过for循环可知,此空代表求平均值,因此应该填写x[i]/N。 填空3: 先把大于平均值的数放在形参y所指数组中,然后使下标值加1,因此此空应该填j++。 2、程序改错 下列给定程序中,函数fun的功能是: 根据整型参数m,计算如下公式的值。 例如,若m=2000,则应输出0.000160。 请改正程序中的错误,使它能得出正确的结果。 注意: 部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构! ----------------------------------------------------------------------------------------------------------------- #include #include #include /*************found**************/ fun(intm) {doubley=0,d; inti; /*************found**************/ for(i=100,i<=m,i+=100) {d=(double)i*(double)i; y+=1.0/d; } return(y); } voidmain() {intn=2000; system("CLS"); printf("\nTheresultis%1f\n",fun(n)); } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 (1)double fun(int m) (2)for(i=100;i<=m;i+=100) 【解题思路】 (1)题目要求在函数fun中求级数前m项和,可用循环语句,每次计算级数中的一项,然后累加。 第一处错误在于定义fun(int m),由函数的返回值可知应该定义为double fun(int m)。 (2)for(i=100,i<=m,i+=100)中是一个简单的语法错误。 for循环语句的形式为for(表达式1;表达式2;表达式3) ,其表达式之间应以";"相隔。 3、程序设计 已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。 请编写函数fun,该函数的功能是: 找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。 已给出函数的首部,请完成该函数。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 ----------------------------------------------------------------------------------------------------------------- #include #include #include #include #defineN10 typedefstructss {charnum[10]; ints; }STU; fun(STUa[],STU*s) { } voidmain() { FILE*wf; STUa[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77}, {"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}},m; inti; system("CLS"); printf("*****Theoriginaldata*****\n"); for(i=0;i printf("No=%sMark=%d\n",a[i].num,a[i].s); fun(a,&m); printf("*****THERESULT*****\n"); printf("Thelowest: %s,%d\n",m.num,m.s); /******************************/ wf=fopen("out.dat","w"); fprintf(wf,"%s,%d",m.num,m.s); fclose(wf); /*****************************/ } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 fun(STU a[],STU *s) { int i; *s=a[0]; /*先认为第1个值最小*/ for(i=0;i if(s->s>a[i].s) *s=a[i]; } 【解题思路】 找出结构体数组元素中的最小值。 先认为第1个值最小,即*s=a[0];,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。 另外,本题还涉及结构体中的指向运算符,请考生注意。 第三套 1、程序填空 给定程序中,函数fun的功能是: 计算x所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。 例如,有10个正数: 46、30、32、40、6、17、45、15、48、26,平均值为30.500000。 主函数中输出m=30。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意: 部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! ----------------------------------------------------------------------------------------------------------------- #include #include #defineN10 doublefun(doublex[],double*av) {inti,j;doubled,s; s=0; for(i=0;i /**********found**********/ __1__=s/N; d=32767; for(i=0;i if(x[i]<*av&&*av-x[i]<=d){ /**********found**********/ d=*av-x[i]; j=__2__; } /**********found**********/ return__3__; } main() {inti;doublex[N],av,m; for(i=0;i printf("\n"); m=fun(x,&av); printf("\nTheaverageis: %f\n",av); printf("m=%5.1f",m); printf("\n"); } ----------------------------------------------------------------------------------------------------------------- 【参考答案】 (1)*av (2)i (3)x[j] 【解题思路】 填空1: 从原程序中可以看出*av代表的是平均值,而s/N表示的就是平均值,因此本空应该填*av。 填空2: if语句来判断找最接近平均值的数,因而此空应该填i。 填空3: 题目要求将小于平均值且最接近平均值的数作为函数返回,而j表达的是最接近平均值的数在数组中的下标,因而本空应该填写x[j]。 2、程序修改 下列给定程序中,函数fun的功能是: 根据整型形参n,计算如下公式的值。 例如,若n=10,则应输出0.617977。 请改正程序中的错误,使它能得出正确的结果。 注意: 部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构! ----------------------------------------------------------------------------------------------------------------- #include #include #include /*************found**************/ intfun(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国 计算机等级考试 语言 上机 考试 题库 120