2017年全国计算机等级考试C语言上机考试题库-1-20套.doc
优质文本2017年全国计算机等级考试C语言上机考试题库 学生练习用第一套至第二十套第一套:1、程序填空程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参所指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其他学生的数据不变。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include <stdio.h>#define N 5typedef struct student long sno; char name10; 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, 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; 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 = fopen("student.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"); -【参考答案】(1) (2)fp (3)fp【解题思路】填空1:本空是对文本文件的翻开,所指的文件中的最后数据要进行重写,因此首先是要翻开,因而本空填写。填空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 <stdio.h>#include <stdlib.h>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; i<=n; i+) s=(NODE *)malloc(sizeof(NODE); s->data=rand()%m; s->next=p->next; p->next=s; p=p->next; /*found*/ return p;outlink(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=Creatlink(8,22); outlink(head);-【参考答案】1p=(NODE *)malloc(sizeof(NODE);2return h;【考点分析】 此题考查:变量赋初值;for循环语句;函数返回值。【解题思路】1由变量定义可知p为指向结点的指针。指向刚分配的结构指针,所以应改为p(NODE *)malloc(sizeof(NODE)。2在动态分配内存的下一行语句是,使用临时结构指针变量h保存p指针的初始位置,最后返回不能使用p,是因为p的位置已经发生了变化,所以应改为return h。3、程序设计请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有假设干个空格隔开,一行的开始没有空格。注意:局部源程序在文件PROG1.C中。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的假设干语句。-#include<string.h>#include<stdio.h>#define N 80int fun(char *s) void main() FILE *wf; char lineN; 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);/*/-【参考答案】int fun(char *s) int i,j=0; for(i=0;si!='0'i+) if(si!=' '&&(si+1=' '|si+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 <stdlib.h>#include <stdio.h>#define N 10double fun(double x,double *y) int i,j; double av;/*found*/ av=_1_;/*found*/ for(i=0; i<N; i+) av=av+_2_; for(i=j=0; i<N; i+)/*found*/ if(xi>av) y_3_= xi; yj=-1; return av;main() int i; double xN,yN; for(i=0; i<N; i+) xi=rand()%50; printf("%4.0f ",xi); printf("n"); printf("nThe average is: %fn",fun(x,y); for(i=0; yi>=0; i+) printf("%5.1f ",yi); printf("n");-【参考答案】10.0 2xi/N 3j+【解题思路】填空1:通过读上面的程序可以看出此空考的是给变量赋初值,av代表的是平均值,因此av的初值应该是0.0。填空2:通过for循环可知,此空代表求平均值,因此应该填写xi/N。填空3:先把大于平均值的数放在形参y所指数组中,然后使下标值加1,因此此空应该填j+。2、程序改错以下给定程序中,函数fun的功能是:根据整型参数m,计算如下公式的值。例如,假设m2000,那么应输出0.000160。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!-#include <stdlib.h>#include <conio.h>#include <stdio.h>/*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)double fun(int m)(2)for(i=100;i<=m;i+=100)【解题思路】(1)题目要求在函数fun中求级数前m项和,可用循环语句,每次计算级数中的一项,然后累加。第一处错误在于定义fun(int m),由函数的返回值可知应该定义为double fun(int m)。(2)for(i100,i<=m,i+=100)中是一个简单的语法错误。for循环语句的形式为for(表达式1;表达式2;表达式3) ,其表达式之间应以";"相隔。3、程序设计学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。注意:局部源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的假设干语句。-#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#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 original data*n"); for(i=0;i<N;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(STU a,STU *s) int i; *s=a0; /*先认为第1个值最小*/ for(i=0;i<N;i+) /*如果在循环的过程中再发现比第1个值更小的那么赋给*s*/ if(s->s>ai.s) *s=ai;【解题思路】找出结构体数组元素中的最小值。先认为第1个值最小,即*sa0;,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。另外,此题还涉及结构体中的指向运算符,请考生注意。第三套1、程序填空给定程序中,函数fun的功能是:计算x所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。例如,有10个正数:46、30、32、40、6、17、45、15、48、26,平均值为30.500000。主函数中输出m30。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include <stdlib.h>#include <stdio.h>#define N 10double fun(double x,double *av) int i,j; double d,s; s=0; for(i=0; i<N; i+) s = s +xi;/*found*/ _1_=s/N; d=32767; for(i=0; i<N; 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; i<N; i+) xi=rand()%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、 程序修改以下给定程序中,函数fun的功能是:根据整型形参n,计算如下公式的值。例如,假设n10,那么应输出0.617977。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!-#include <stdlib.h>#include <conio.h>#include <stdio.h>/*found*/int fun(int n) float A=1;int i;/*found*/ for(i=2;i<n;i+) A=1.0/(1+A); return A;void main() int n; system("CLS"); printf("nPlease enter n: "); scanf("%d",&n); printf("A%d=%lfn",n,fun(n);-【参考答案】(1)float fun(int n)(2)for(i=2;i<=n;i+)【解题思路】(1)根据函数的返回值可知,函数应定义为float型。(2)该题中函数fun的作用是计算数列前n项的和,而数列的组成方式是:第n项的分母是1加第n1项的值,分子为1,如果循环累加按for(i2;i<n;i)执行,当输入n2时循环不会执行,程序将得不到想要的结果,因此循环变量的取值范围应包括2。3、 程序设计以下程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a N,int m),该函数的功能是使数组右上半三角元素中的值乘以m。例如,假设m的值为2,a数组中的值为:那么返回主程序后a数组中的值应为: 注意:局部源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的假设干语句。-#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 5void fun(int aN, int m) main() int aNN,m, i, j; FILE *out; printf("*The array*n"); for(i=0;i<N;i+) for(j=0;j<N;j+) aij=rand()%20; printf("%4d", aij); printf("n"); m=rand()%4; printf("m=%4dn",m); fun(a,m); printf("THE RESULTn"); for(i=0;i<N;i+) for(j=0;j<N;j+) printf("%4d",aij); printf("n"); /*/ out=fopen("out.dat","w"); for(i=0;i<N;i+) for(j=0;j<N;j+)aij=i*j; fun(a,8); for(i=0;i<N;i+) for(j=0;j<N;j+)fprintf(out,"%4d",aij);fprintf(out,"n"); fclose(out); /*/-【参考答案】void fun(int aN, int m) int i,j; for(j=0;j<N;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、15、48、26,平均值为30.500000。移动后的输出为:46、32、40、45、48、30、6、17、15、26。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include <stdlib.h>#include <stdio.h>#define N 10double fun(double *x) int i, j; double s, av, yN; s=0; for(i=0; i<N; i+) s=s+xi;/*found*/ av=_1_; for(i=j=0; i<N; i+) if( xi>av )/*found*/ y_2_=xi; xi=-1; for(i=0; i<N; i+)/*found*/ if( xi!= _3_) yj+=xi; for(i=0; i<N; i+)xi = yi; return av;main() int i; double xN; for(i=0; i<N; 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; i<N; i+) printf("%5.0f ",xi); printf("n");-【参考答案】(1)s/N (2)j+ (3)-1【解题思路】填空1:由原程序可知,av代表的是平均值,而平均值的求法是所有数的总和除以数的个数,因而本空应该填写s/N。填空2:y数组代表暂时存放x数组,if(xi>av)表达的是当x数组中的数大于平均值时,应该把这些大于平均值的数放在y数组的前半局部,因而此空应该填yj+。填空3:此空说明当xi不等于什么时,xi中的数要赋值给y数组,由题意可知此空只能填写-1。2、 程序修改以下给定程序的功能是:读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里"单词"是指由空格隔开的字符串)。例如,假设输入"I am a student to take the examination",那么应输出"I Am A Student To Take The Examination"。请改正程序中的错误,使程序能得出正确的结果。注意:局部源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!-#include <stdlib.h>#include <string.h>#include <conio.h>#include <ctype.h>#include <stdio.h>#include <string.h>/*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);-