1、二级 C语言分类模拟题 232及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.给定程序中,函数 fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数 atoi和 atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在 下的 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include stdio.h #include stdlib.h void fun(char
2、 *s,int a,double f) /*found*/ _ fp; char str100,str1100,str2100; int a1;double f1; fp=fopen(“file1.txt“,“w“); fprintf(fp,“%s %d %f/n“,s,a,f); /*found*/ _; fp=fopen(“file1.txt“,“r“); /*found*/ fscanf(_,“%s%s%s“,str,str1,str2); fclose(fp); a1=atoi(str1); f1=atof(str2); printf(“/nThe result:/n/n%s %d %
3、f/n“,str,a1,f1); main() char a10=“Hello!“;int b=12345; double c=98.76; fun(a,b,c); (分数:30.00)_二、程序修改题(总题数:1,分数:30.00)2.给定程序 MODI1.C中函数 fun的功能是:对 N名学生的学习成绩,按从高到低的顺序找出前 m(m10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构! #include stdio.
4、h #include stdlib.h #include string.h #define N 10 typedef struct ss char num10; int s; STU; STU *fun(STU a,int m) STU bN,*t; int i,j,k; /*found*/ t=(STU *)calloc(sizeof(STU),m) for(i=0;iN;i+) bi=ai; for(k=0;km;k+) for(i=j:0;iN;i+) if(bi.sbj.s) j=i; /*found*/ t(k)=b(j); bj.s=0; return t; outresult(S
5、TU a,FILE *pf) int i; for(i=0;iN;i+) fprintf(pf,“No=%s Mark=%d/n“,ai.num,ai.s); fprintf(pf,“/n/n“); main() STU aN=“A01“,81,“A02“,89,“A03“,66,“A04“,87,“A05“,77,“A06“,90,“A07“,79,“A08“,61,“A09“,80,“A10“,71; STU *pOrder; int i,m; printf(“* The Original data */n“); outresult(a,stdout); printf(“/nGive th
6、e number of the students who have better score:“); scanf(“%d“, while(m10) printf(“/nGive the number of the students who have better score:“); scanf(“%d“, pOrder=fun(a,m); printf(“* THE RESULT */n“); printf(“The top:/n“); for(i=0;im;i+) printf(“%s %d/n“,pOrderi.num, pOrderi.s); free (pOrder); (分数:30.
7、00)_三、程序设计题(总题数:1,分数:40.00)3.请编写函数 fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 例如,一维数组中的数据是:2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。 删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10。 注意:部分源程序在文件 PROG1.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include stdio .h #define N 80 int fun(
8、int a,int n) main() int aN=2,2,2,3,4,4,5,6,6,6,6,7,7, 8,9, 9,10,10,10,10,i,n=20;void NONO(); printf(“The original data:/n“); for(i=0;in;i+)printf(“%3d“,ai); n=fun(a,n); printf(“/n/nThe data after deleted:/n“); for(i=0;in;i+)printf(“%3d“,ai);printf(“/n/n“); NONO(); void NONO() /* 请在此函数内打开文件,输入测试数据,调用
9、 fun函数,输出数据,关闭文件。 */ FILE *rf,*wf;int aN,n,i,j; rf=fopen(“in.dat“,“r“); wf=fopen(“out.dat“,“w“); for(i=0;i5;i+) fscanf(rf,“%d“, for(j=0;jn;j+) fscanf(rf,“%d“, n=fun(a,n); for(j=0;jn;j+) fprintf(wf,“%4d“,aj); fprintf(wf,“/n“); fclose(rf);fclose(wf); (分数:40.00)_二级 C语言分类模拟题 232答案解析(总分:100.00,做题时间:90 分钟
10、)一、程序填空题(总题数:1,分数:30.00)1.给定程序中,函数 fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数 atoi和 atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在 下的 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include stdio.h #include stdlib.h void fun(char *s,int a,double f) /*found*/ _ fp; char
11、str100,str1100,str2100; int a1;double f1; fp=fopen(“file1.txt“,“w“); fprintf(fp,“%s %d %f/n“,s,a,f); /*found*/ _; fp=fopen(“file1.txt“,“r“); /*found*/ fscanf(_,“%s%s%s“,str,str1,str2); fclose(fp); a1=atoi(str1); f1=atof(str2); printf(“/nThe result:/n/n%s %d %f/n“,str,a1,f1); main() char a10=“Hello!“
12、;int b=12345; double c=98.76; fun(a,b,c); (分数:30.00)_正确答案:()解析:(1)FILE* (2)fclose(fp) (3)fp 答案考生文件夹 解析 本题中函数 fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数 atoi和 atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 第一空:“fp=fopen(“file1.txt“,“w“);”可知 fp是文件型指针,故第一空处 fb的定义应为“FILE*”。第二空:第二处的后面一句是“fp=fopen(“file1.
13、txt“,“r“);”再次打开 file1.txt,因此在第二次打开file1.txt之前必须将文件关闭,故第二处是关闭文件,即“fclose(fp)”。 第三空:fscanf 的调用形式是:fscanf(fp,格式字符串,输入列表),因此第三空处应为“fp”,从文件中读出字符串、整数、浮点数。 考点 数据类型和常量、变量、文件。二、程序修改题(总题数:1,分数:30.00)2.给定程序 MODI1.C中函数 fun的功能是:对 N名学生的学习成绩,按从高到低的顺序找出前 m(m10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 请改正函数 fu
14、n中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构! #include stdio.h #include stdlib.h #include string.h #define N 10 typedef struct ss char num10; int s; STU; STU *fun(STU a,int m) STU bN,*t; int i,j,k; /*found*/ t=(STU *)calloc(sizeof(STU),m) for(i=0;iN;i+) bi=ai; for(k=0;km;k+) for(i=j:0;iN;
15、i+) if(bi.sbj.s) j=i; /*found*/ t(k)=b(j); bj.s=0; return t; outresult(STU a,FILE *pf) int i; for(i=0;iN;i+) fprintf(pf,“No=%s Mark=%d/n“,ai.num,ai.s); fprintf(pf,“/n/n“); main() STU aN=“A01“,81,“A02“,89,“A03“,66,“A04“,87,“A05“,77,“A06“,90,“A07“,79,“A08“,61,“A09“,80,“A10“,71; STU *pOrder; int i,m; p
16、rintf(“* The Original data */n“); outresult(a,stdout); printf(“/nGive the number of the students who have better score:“); scanf(“%d“, while(m10) printf(“/nGive the number of the students who have better score:“); scanf(“%d“, pOrder=fun(a,m); printf(“* THE RESULT */n“); printf(“The top:/n“); for(i=0
17、;im;i+) printf(“%s %d/n“,pOrderi.num, pOrderi.s); free (pOrder); (分数:30.00)_正确答案:()解析:(1)t=(STU*)calloc(sizeof(STU),m); (2)tk=bj; 答案考生文件夹 解析 本题中函数的功能是按学习成绩从高到低的顺序找出前 m(m10)名学生。利用循环结构实现对定义的结构体中的成绩域进行排序。 (1)题干中要求结构体 STU类型的 m个学生放在动态分配的连续存储区中,“t=(STU*)calloc(sizeof(STU),m)”语句没有使用分号“;”结束,因此需要在语句结尾处加分号。ca
18、lloc 函数是 C语言的动态分配函数,分配存储空间。 (2)第二个标识下是将 b数组拷贝到 t数组,在 C语言中,数组元素的访问使用中括号“”而不是元括弧“()”,因此第二标识下应改成“tk=bj;”。 考点 结构体数组、动态内存分配。三、程序设计题(总题数:1,分数:40.00)3.请编写函数 fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 例如,一维数组中的数据是:2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。 删除后,数组中的内容应该是:2 3 4 5 6 7 8 9
19、 10。 注意:部分源程序在文件 PROG1.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include stdio .h #define N 80 int fun(int a,int n) main() int aN=2,2,2,3,4,4,5,6,6,6,6,7,7, 8,9, 9,10,10,10,10,i,n=20;void NONO(); printf(“The original data:/n“); for(i=0;in;i+)printf(“%3d“,ai); n=fun(a,n); printf(“/n/nThe
20、data after deleted:/n“); for(i=0;in;i+)printf(“%3d“,ai);printf(“/n/n“); NONO(); void NONO() /* 请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 */ FILE *rf,*wf;int aN,n,i,j; rf=fopen(“in.dat“,“r“); wf=fopen(“out.dat“,“w“); for(i=0;i5;i+) fscanf(rf,“%d“, for(j=0;jn;j+) fscanf(rf,“%d“, n=fun(a,n); for(j=0;jn;j+)
21、 fprintf(wf,“%4d“,aj); fprintf(wf,“/n“); fclose(rf);fclose(wf); (分数:40.00)_正确答案:()解析:int i,t,j=0,*p=a; t=p0; /设置临时变量 t初值指向第一数组值 for(i=0;i=n;i+) if(t=pi) /当临时变量与数组中的某个值相同则跳出,比较下一个元素 else /如果临时变量与数组中值不同,则对临时变量重新赋值 aj=t; t=pi; j+; if(i=n) aj=t; return j; 答案考生文件夹 解析 该程序功能是删去一维数组中所有相同的数,使之只剩一个。解题思路是,首先在函数中定义临时变量指向每一个元素,然后在循环过程中将临时值和其他元素进行比较,如果相同,那么跳过相同字符。 (1)首先,设置一个临时变量,初值设置为一维数组的第一个元素。 (2)然后,依次将数组的元素与临时变量比较,如果相同,则继续取数组下一个元素与临时变量比较;如果不同,则将临时变量的值赋值到数组的第一个元素,同时将此与临时变量不同的数组元素赋值给临时变量。 (3)循环执行,直到所有的数据处理完毕。 考点 for 循环结构、if 语句及其构成的选择。