【真题1】 给定程序的功能是调用fun 函数建立班级通讯录。通讯录中记录每位学 生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作 为一个数据块写到名为myfile5.dat 的二进制文件中。 #include < stdio.h > #include < stdlib.h > #define N 5 typedef struct { int num; char name[10]; char tel[10]; }STYPE; void check(); /**********found**********/ 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; i<N; i++) /**********found**********/ fwrite(&std[i], sizeof(STYPE), 1, ___【3】___); fclose(fp); return (1); } main() {STYPE s[10]={{1,"aaaaa","111111"}, {2,"bbbbb","222222"}, {3,"ccccc","333333"}, {4,"ddddd","444444"}, {5,"eeeee","555555"}}; int k; k=fun(s); if (k==1) {printf("Succeed!"); check();} else printf("Fail!"); } void check() { FILE *fp; int i; STYPE s[10]; 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; i<N; i++) { fread(&s[i],sizeof(STYPE), 1, fp); printf("%6d %s %s\n", s[i].num, s[i].name, s[i].tel); } fclose(fp); } (2011年2月) 解析: 本题考核点为结构体和文件的操作等。 题中第一空填"STYPE":typedef可以用来声明新的类型名来代替已有的类型 名,此题用"STYPE"来代替未命名的结构体。 题中第二空填"FILE":"FILE"关键字用于声明文件指针。 题中第三空填"fp":fwrite函数的一般调用形式为: fwrite(buffer,size,count,fp); 其中buffer:是一个指针,是要输出数据的地址;size:是要写的字节数; count:要进行读写多少个size字节的数据项;fp:文件型指针。 答案:【1】STYPE 【2】FILE 【3】fp 【真题2】 给定程序modi.c 中,函数fun 的功能是:在字符串str中找出ASCII 码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。 例如,调用fun 函数之前给字符串输入:ABCDeFGH,调用后字符中的内容为: eABCDFGH。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数。 #include < stdio.h > fun(char *p) { char max,*q; int i=0; max=p[i]; while (p[i]!=0) { if (max< p[i]) { max=p[i]; /************found************/ p=q+i; } i++; } /************found************/ while (q< p) { *q=*(q-1); q--; } p[0]=max; } main() {char str[80]; printf("Enter a string:");gets(str); printf("\nThe original string:"); puts(str); fun(str); printf("\nThe string after moving:"); puts(str); printf("\n\n"); } (2011年2月) 解析: 本题着重考察考生对C 语言中指针以及一些简单算法的掌握情况。 本题中的第一个错误:由程序可知,指针p指向字符串的首地址,指针q指向 字符串中最大的字符,所以程序中的语句"p=q+i;"应改为"q=p+i;"; 本题中的第二个错误:由题意可知,在找出最大字符后,应将其放在第一个位 置上,并将该字符前的原字符向后移动,当q大于或等于p时,移动字符,反 之,退出循环,所以程序中语句"while (q< p)"应改为"while (q >p)"。 【真题3】 请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数 (不得调用C 语言提供的将字符串转换为整数的函数)。例如,若输入字符串"- 1234",则函数把它转换为整数值 -1234。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容, 仅在函数fun 的花括号中填 入你编写的若干语句。 #include < stdio.h > #include < string.h > long fun(char *p) {……} main() /* 主函数 */ { char s[6]; long n; printf("Enter a string:\n") ; gets(s); n = fun(s); printf("%ld\n", n); } (2011年2月) 解析: 本题的考核点是指针、ASCII码、循环语句及条件语句的使用。 解题思 路:通过循环语句移动指针,取出指针所在位置上的字符,先判断其为正负号 还是为数字字符,如果为数字字符则将其转化为相应的数值,否则作正负标 记。 long fun(char *p) { long n=0; int flag=0; /*通过循环语句移动指针,取出指针所在位置上的字符*/ while(*p!='\0') { if(*p=='-') /*判断其是否为负号*/ flag=1; else if (*p=='+') /*判断其是否为正号*/ flag=0; else /*判断其是否为数字字符*/ n=n*10+(*p-'0'); /*将数字字符转化为相应的数值*/ p++; } if (flag==1) n=-n; return n; } |