1、二级 C 语言-600 及答案解析(总分:60.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:20.00)1.给定程序的功能是调用 fun 函数建立班级通讯录。通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为 myfile5.dat 的二进制文件中。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 不得增行或删行,也不得更改程序的结构。 #includestdio.h #includestdlib.h #defineN 5 typedef struct int num; char name10
2、; char tel10; STYPE; void check(); /*foun*/ int fun( 1*std) /*found*/ 2*fp;int i; if(fp=fopen(“myfile5.dat“,“wb“)=NULL) return(0); printf(“/nOutput data to file!/n“); for(i=0;iN;i+) /*foun*/ fwrite( fclose(fp); return(1); main() STYPE s10=1,“aaaaa“,“111111“),1,“bbbbb“, “222222“,1,“ccccc“,“333333“),1
3、,“ddddd“, “444444“,1,“eeeee“,“555555“); int k; k=fun(s); if(k=1) printf(“Succeed!“);check(); else printf(“Fail!“); void check() FILE*fp;int i; STYPE s10; if(fp=fopen(“myfile5.dat“,“rb“)=NULL) printf(“Fail!/n“);exit(0); printf(“/nRead file and output to screen:/n“); printf(“/n num name tel/n“); for(i
4、=0;iN;i+) fread( printf(“%6d %s %s/n“,si.num,si.name, si.tel); fclose(fp); (分数:20.00)二、程序修改题(总题数:1,分数:20.00)2.给定程序 MODI1.C 中函数 fun 的功能是:先将在字符串 s 中的字符按正序存放到 t 串中,然后把 s 中的字符按逆序连接到 t 串的后面。 例如,当 s 中的字符串为:“ABCDE“时,则 t 中的字符串应为:“ABCDEEDCBA“。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 #includ
5、estdio.h #includestring.h void fun(char*s,char *t) int i,s1; s1=strlen(s); /*found*/ for(i=0;i=s1;i+) ti=si; for(i=0;i ts1+i=ss1-i-1;/*found*/ts1=“/0“;main()char s100,t100;printf(“/nPlease enter string s:“);scanf(“%s“,);fun(s,t);printf(“The result is:%s/n“,t);(1)for(i=0;i=s1;i+)应改为 for(i=0;i=s1;i+)(
6、2)ts1=“/0“应改为 t2*s1=“/0“或 ts1+s1=“/0“解析 本题中函数的功能是先将字符串 s 中的字符按正序存放到 t 串中,然后把 s 中的字符按逆序连接到 t 串的后面。首先由字符串的第一个标识正序取 s 中的字符串存放到 t 串中,然后由 s 串尾开始,逆序取字符并存放到 t 串中。(1)编译程序后可知,for(i=0;i=s1;i+)这一行有错误,原因是 s1 变量没有定义,显然这个循环的目的是将 s 字符串的内容复制至 t 字符串。这里的循环变量 i 的最大值是 s 字符串的长度 s1,因此第一个标识下是将 s1 改为 s1。(2)题目要求将 s 中的字符复制至
7、t 字符串之后,还需将 s 按逆序连接到 t 串的后面,第二个循环已经完成了逆序接到 t 字符串的工作,最后是确定字符串的结尾,即字符串应该以“/0”结束。此时,字符串 t的长度是 2*s1。显然 ts1=“/0“的话字符串长度仍然是 s1,故第二个标识下是将 ts1=“/0“改成t2*s1=“/0“或者 ts1+s1=“/0“。考点 函数功能;逻辑关系。(分数:20.00)_三、程序设计题(总题数:1,分数:20.00)3.函数 fun 的功能是:将两个两位数的正整数 a、b 合并形成一个整数放在 c 中。合并的方式是:将 a 数的十位和个位数依次放在 c 数的千位和十位上,b 数的十位和个
8、位数依次放在 c 数的百位和个位上。 例如,当 a=45,b=12 时,调用该函数后,c=4152。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入要编写的若干语句。 #includestdio.h void fun(int a,int b,long*c) main() int a,b;long c; void NONO(); prinff(“Input a,b:“);scanf(“%d,%df“, fun(a,b, printf(“The result is:%d/n“,c); NONO(); void NONO() /*本函数用于打开文件,输入数据,调用
9、函数,输出数据,关闭文件。*/ FILE *rf,*wf; inti,a,b;long c; rf=fopen(“in.dat“,“r“); wf=fopen(“out.dat“,“w“); for(i=0;i10;i+) fscanf(rf,“%d,%d“, fun(a,b, fprinff(wf,“a=%d,b=%d,c=%ld/n“,a,b,c); fclose(rf); fclose(wf); (分数:20.00)_二级 C 语言-600 答案解析(总分:60.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:20.00)1.给定程序的功能是调用 fun 函数建立班级通讯录
10、。通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为 myfile5.dat 的二进制文件中。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 不得增行或删行,也不得更改程序的结构。 #includestdio.h #includestdlib.h #defineN 5 typedef struct int num; char name10; char tel10; STYPE; void check(); /*foun*/ int fun( 1*std) /*found*/ 2*fp;int i; if(fp
11、=fopen(“myfile5.dat“,“wb“)=NULL) return(0); printf(“/nOutput data to file!/n“); for(i=0;iN;i+) /*foun*/ fwrite( fclose(fp); return(1); main() STYPE s10=1,“aaaaa“,“111111“),1,“bbbbb“, “222222“,1,“ccccc“,“333333“),1,“ddddd“, “444444“,1,“eeeee“,“555555“); int k; k=fun(s); if(k=1) printf(“Succeed!“);che
12、ck(); else printf(“Fail!“); void check() FILE*fp;int i; STYPE s10; if(fp=fopen(“myfile5.dat“,“rb“)=NULL) printf(“Fail!/n“);exit(0); printf(“/nRead file and output to screen:/n“); printf(“/n num name tel/n“); for(i=0;iN;i+) fread( printf(“%6d %s %s/n“,si.num,si.name, si.tel); fclose(fp); (分数:20.00)解析
13、:STYPE FILE fp 解析 本题要求调用 fun 函数建立班级通讯录,将结构体数组 s 的内容存储到文件 myfile5.dat 中。文件操作首先是打开文件,然后向文件中写入内容。 第一空:在 main 函数中,观察 fun 函数调用 k=fun(s),由 s 的定义可知 s 是 STYPE 结构体数组,即传入fun 函数的参数是 STYPE 结构体数组的首地址,因此 fun()函数的参数是 STYPE 结构体指针。故(1)处应该为 int fun(STYPE*std)。 第二空:在 C 语言中,fopen 函数的调用形式是:FILE fp=fopen(文件名,文件使用方式),在 fu
14、n()函数体内部,由 if(fp=fopen(“myfile5.dat“,“wb“)=NULL)可知,fp 是一个指向 FILE 类型的指针变量。因此(2)处是指针变量 fp 的定义,即 FILE*fp。 第三空:fwrite 函数的调用形式是:fwrite(buffer,size,count,fp),buffer 是一个指针,指向输入数据存放在内存区的起始地址,size 是要输入的字节数,count 是要输入大小为 size 个字节的数据块的个数,fp 是文件指针。因此(3)处应该添加文件指针。由前面的定义可知,fun 函数内的文件指针是 fp,即(3)处是。fwrite( s1=strle
15、n(s); /*found*/ for(i=0;i=s1;i+) ti=si; for(i=0;i ts1+i=ss1-i-1;/*found*/ts1=“/0“;main()char s100,t100;printf(“/nPlease enter string s:“);scanf(“%s“,);fun(s,t);printf(“The result is:%s/n“,t);(1)for(i=0;i=s1;i+)应改为 for(i=0;i=s1;i+)(2)ts1=“/0“应改为 t2*s1=“/0“或 ts1+s1=“/0“解析 本题中函数的功能是先将字符串 s 中的字符按正序存放到 t
16、 串中,然后把 s 中的字符按逆序连接到 t 串的后面。首先由字符串的第一个标识正序取 s 中的字符串存放到 t 串中,然后由 s 串尾开始,逆序取字符并存放到 t 串中。(1)编译程序后可知,for(i=0;i=s1;i+)这一行有错误,原因是 s1 变量没有定义,显然这个循环的目的是将 s 字符串的内容复制至 t 字符串。这里的循环变量 i 的最大值是 s 字符串的长度 s1,因此第一个标识下是将 s1 改为 s1。(2)题目要求将 s 中的字符复制至 t 字符串之后,还需将 s 按逆序连接到 t 串的后面,第二个循环已经完成了逆序接到 t 字符串的工作,最后是确定字符串的结尾,即字符串应
17、该以“/0”结束。此时,字符串 t的长度是 2*s1。显然 ts1=“/0“的话字符串长度仍然是 s1,故第二个标识下是将 ts1=“/0“改成t2*s1=“/0“或者 ts1+s1=“/0“。考点 函数功能;逻辑关系。(分数:20.00)_正确答案:()解析:(1)for(i=0;i=s1;i+)应改为 for(i=0;i=s1;i+) (2)ts1=“/0“应改为 t2*s1=“/0“或 ts1+s1=“/0“ 解析 本题中函数的功能是先将字符串 s 中的字符按正序存放到 t 串中,然后把 s 中的字符按逆序连接到 t 串的后面。首先由字符串的第一个标识正序取s 中的字符串存放到 t 串中
18、,然后由 s 串尾开始,逆序取字符并存放到 t 串中。 (1)编译程序后可知,for(i=0;i=s1;i+)这一行有错误,原因是 s1 变量没有定义,显然这个循环的目的是将 s 字符串的内容复制至 t 字符串。这里的循环变量 i 的最大值是 s 字符串的长度 s1,因此第一个标识下是将 s1 改为 s1。 (2)题目要求将 s 中的字符复制至 t 字符串之后,还需将 s 按逆序连接到 t 串的后面,第二个循环已经完成了逆序接到 t 字符串的工作,最后是确定字符串的结尾,即字符串应该以“/0”结束。此时,字符串 t的长度是 2*s1。显然 ts1=“/0“的话字符串长度仍然是 s1,故第二个标
19、识下是将 ts1=“/0“改成t2*s1=“/0“或者 ts1+s1=“/0“。 考点 函数功能;逻辑关系。三、程序设计题(总题数:1,分数:20.00)3.函数 fun 的功能是:将两个两位数的正整数 a、b 合并形成一个整数放在 c 中。合并的方式是:将 a 数的十位和个位数依次放在 c 数的千位和十位上,b 数的十位和个位数依次放在 c 数的百位和个位上。 例如,当 a=45,b=12 时,调用该函数后,c=4152。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入要编写的若干语句。 #includestdio.h void fun(int a,int
20、 b,long*c) main() int a,b;long c; void NONO(); prinff(“Input a,b:“);scanf(“%d,%df“, fun(a,b, printf(“The result is:%d/n“,c); NONO(); void NONO() /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/ FILE *rf,*wf; inti,a,b;long c; rf=fopen(“in.dat“,“r“); wf=fopen(“out.dat“,“w“); for(i=0;i10;i+) fscanf(rf,“%d,%d“, fun(a
21、,b, fprinff(wf,“a=%d,b=%d,c=%ld/n“,a,b,c); fclose(rf); fclose(wf); (分数:20.00)_正确答案:()解析:*c=(a/10)*1000+(b/10)*100+(a%10)*10+(b%10); 解析 该程序功能是将正整数 a、b 合并形成一个新整数。本类型题首先要考虑整数的数位分离,然后要进行数位合成。也就是先将数字的各数位拆开,改变排列顺序后,再组合成新的数字。 (1)分解两位数的正整数 n 的个位和十位数,可分别用 n%10 和 n/10 实现。 (2)设 x0、x1、x2、x3 为一位数,则 x0、x110、x2100、x31000,可以分别使 x0、x1、x2、x3 构成个、十、百、千带权数,而 x0+x110 十 x2100+x31000 构成四位数。本题最多只考虑四位数。 考点 逻辑关系:运算符。