1、国家二级 C语言机试(结构体、共用体与文件)模拟试卷 4及答案与解析 一、选择题 1 有以下程序 #include main() FILE *fp; int i, a6=1,2,3,4,5,6, k; fp = fopen(“data.dat“, “w+b“); fwrite( for (i=1; i的优先级高于 +)( )。 ( A) (+p)- n ( B) p+ -n ( C) p -n+ ( D) (*p).n+ 4 标准库函数 fgets( s,n,f )的功能是( )。 ( A)从文件 f中读取长度不超过 n-1的字符串存入指针 s所指的内存 ( B)从文件 f中读取长度为 n的字
2、符串存入指针 s所指的内存 ( C)从文件 f中读取 n个字符串存入指针 s所指的内存 ( D)从文件 f中读取 n-1个字符串存入指针 s所指的内存 5 有以下程序 #include main() char c=A; int x=36, b; b= (x2) int age; ST; main() ST stud10= “Adum“, 15, “Muty“, 16, “Paul“, 17, “Johu“, 14, ; 程序运行后不能输出字符 u的语句是( )。 ( A) printf(“%cn“, stud0.name3 ); ( B) printf(“%cn“, stud3.name3 )
3、; ( C) printf(“%cn“, stud2.name2 ); ( D) printf(“%cn“, stud1.name1 ); 7 以下叙述正确的是( )。 ( A) EOF只能作为文本文件的结束标志,其值为 -1 ( B) EOF可以作为所有文件的结束标志 ( C) EOF只能 作为二进制文件的结束标志 ( D)任何文件都不能用 EOF作为文件的结束标志 8 以下叙述正确的是( )。 ( A)在 C语言中调用 fopen函数就可把程序中要读、写的文件与磁盘上实际的数据文件联系起来 ( B) fopen函数的调用形式为: fopen(文件名 ) ( C) fopen函数的返回值为
4、NULL时,则成功打开指定的文件 ( D) fopen函数的返回值必须赋给一个任意类型的指针变量 9 以下不能对文件进行输出的库函数是( )。 ( A) fpout ( B) fputc ( C) fwrite ( D) fprintf 10 有以下程序 #include struct link int data; struct link* next; ; main() struct link *h,a ,b; h= a.data=10; a.next= b.data=20; 程序运行时不能输出 10,20的语句是( )。 ( A) printf(“%d,%d n“,h-data,a.next
5、.data); ( B) printf(“%d,%d n“,a.data,(*a.next).data); ( C) printf(“%d,%d n“,h-data,(*a.next).data); ( D) printf(“%d,%d n“,a.data,a.next-data); 11 有以下程序 #include main() int a=3 ,b=3; printf(“%d n“,a 程序运行后的输出结果是( ) ( A) 3 ( B) 1 ( C) 0 ( D) 6 12 设有以下程序段 struct person char name10; char sex; float weigh
6、t; zhangsan, *ptr; ptr = 若要从键盘读入姓名给结构体变量 zhangsan的 name成员,输入项错误的是( )。 ( A) scanf(“%s“, zhangsan-name); ( B) scanf(“%s“, zhangsan.name); ( C) scanf(“%s“, ptr-name); ( D) scanf(“%s“, (*ptr).name); 13 有如下程序 #include struct person char name10; int age; main() struct person room4 = “Zhang“, 19, “Li“, 20,
7、 “Wang“, 17, “Zhao“, 18; printf(“%s:%dn“, (room+2)-name, room-age); 程序运行后的输出结果是( )。 ( A) Wang:19 ( B) Wang:17 ( C) Li:20 ( D) Li:19 14 有如下程序 #include struct pair int first, second; ; struct pair get_min_max(int* array, int len) int i; struct pair res; res.first = array0; res.second = array0; for (i=
8、1; i res.second) res.second = arrayi; return res; main() int array5 = 9, 1, 3, 4; struct pair min_max = get_min_max(array, 5); printf(“min=%d,max=%dn“, min_max.first, min_max.second); 程序运行后的输出结果是( )。 ( A) min=0,max=9 ( B) min=1,max=9 ( C) min=1,max=4 ( D) min=0,max=4 15 有如下程序 #include main() int a =
9、 8, b; b = (a 2) % 2; printf(“%d,%dn“, a, b); 程序运行后的输出结果是( )。 ( A) 8,0 ( B) 4,0 ( C) 4,1 ( D) 8,1 16 以下选项中叙述正确的是( )。 ( A)文件指针是指针类型的变量 ( B)文件指针可同时指向不同文件 ( C)文件指针的值是文件在计算机磁盘中的路径信息 ( D)调用 fscanf函数可以向文本文件中写入任意字符 17 有如下程序 #include struct S int x, y; ; main() struct S data2 = 4, 3, 1, 9; int i; for (i=0;
10、i 1); printf(“n“); 程序运行后的输出结果是( )。 ( A) 4,1;1,4; ( B) 4,1;2,4; ( C) 4,3;1,9; ( D) 4,3;2,3; 18 有如下程序 #include #include struct S char name10; ; void change(struct S *data, int value) strcpy(data-name, “*“); value = 13; main() struct S input; int num = 4; strcpy(input.name, “THIS“); change( printf(“%s,
11、%dn“, input.name, num); 程序运行后的输出结果是( )。 ( A) *,4 ( B) *,13 ( C) THIS,4 ( D) THIS,13 19 有如下程序 #include #include struct S char name10; ; main() struct S s1, s2; strcpy(s1.name, “12345“); strcpy(s2.name, “ABC“); s1 = s2; printf(“%sn“, s1.name); 程序运行后的输出结果是( )。 ( A) ABC ( B) ABC45 ( C) 12345 ( D) ABC12
12、20 有如下程序 #include main() int i, array5 = 3, 5, 10, 4; for (i=0; i main() int i; FILE* fp; for (i=0; i #include #include main() char *p1,*p2; p1=p2=(char *)malloc(sizeof(char)*10); strcpy(p1,“malloc“); strcpy(p2,p1+1); printf(“%c%cn“,p10,p20); 程序的运行结果是( )。 ( A) aa ( B) ma ( C) am ( D) mm 23 设有定义: str
13、uct int n; float x; s2,m2=10,2.8,0,0.0;则以下赋值语句中正确的是( )。 ( A) s0=m1; ( B) s=m; ( C) s.n=m.n; ( D) s2.x=m2.x; 24 有以下程序 #include struct S int a; int *b; main() int x1 =3,4,x2 =6,7; struct S x =1,x1,2,x2; printf(“%d,%dn“,*x0.b,*x1.b); 程序的运行结果是( )。 ( A) 3,6 ( B) 1,2 ( C) 4,7 ( D)变量的地址值 25 有以下程序 #include
14、#include typedef struct char name10; char sex; int age; STU; void fun(STU *t) strcpy(*t).name,“Tong“); (*t).age+; main() STU s2=“Hua“,m,18,“Qin“,f,19; fun(s+1); printf(“%s,%d,%s,%dn“,s0.name,s0.age,s1.name ,s1.age ); 程序运行后的输出结果是( )。 ( A) Hua,18,Tong,20 ( B) Hua,18,Qin,19 ( C) Tong,19,Qin,19 ( D) Hua
15、,19,Tong,19 26 以下不属于 C语言位运算符的是( )。 ( A) ! ( B) | ( C) ( D) 27 有以下程序段 FILE *fp; if( (fp=fopen(“test.txt“, “w“) = NULL) printf(“不能打开文件! “); exit(0); else printf(“成功打开文件! “); 若指定文件 test.txt不存在,且无其他异常,则以下叙述错误的是( )。 ( A)输出 “不能打开文件! “ ( B)输出 “成功打开文件! “ ( C)系统将按指定文件名新建文件 ( D)系统将为写操作建立文本文件 28 设有如下语句 typedef
16、 struct Date int year; int month; int day; DATE; 则以下叙述中错误的是( )。 ( A) DATE是用户定义的结构体变量 ( B) struct Date是用户定义的结构体类型 ( C) DATE是用户说明的新结构体类型名 ( D) struct是结构体类型的关键字 29 设有如下定义 struct int n; char c; a2,*p=a; 则以下错误引用结构体成员 n的是( )。 ( A) (*a)-n ( B) a0.n ( C) p-n ( D) (*p).n 30 有以下程序 #include #include typedef st
17、ruct char name10; char sex; int age; STU; void fun(STU t) strcpy(t.name,“Tong“); t.age+; main() STU s2=“Hua“,m,18,“Qin“,f,19; fun(s1); printf(“%s,%d,%s,%dn“,s0.name,s0.age,s1.name ,s1.age ); 程序运行后的输出结果是( )。 ( A) Hua,18,Qin,19 ( B) Hua,18,Tong,20 ( C) Tong,19,Qin,19 ( D) Hua,19,Tong,19 31 设有定义: int a
18、=64,b=8;,则表达式 (a if( (fp=fopen(“test.txt“, “w“) = NULL) printf(“不能打开文件! “); exit(0); else printf(“成功打开文件! “); 若文件 test.txt已存在,则以下叙述正确的是( )。 ( A)程序运行后,文件 test.txt中的原有内容将全部消失 ( B)程序运行时,会因文件存在而出错 ( C)对文件 test.txt进行写操作后,可以随机进行读取 ( D)对文件 test.txt写入的内容总是被添加到文件尾部 国家二级 C语言机试(结构体、共 用体与文件)模拟试卷 4答案与解析 一、选择题 1
19、【正确答案】 A 【试题解析】 该段代码以读写的方式 “wb+“打开二进制文件 data.dat,并将数组a的第一个元素写入文件,接下来的 for循环是用 fread()函数不断读取当前文件中的数据,将该数据和数组 a的下一个元素累加后又用 fwrite()函数写入到文件当中(语句 “fseek(fp, 0L, 0);“和 “rewind(fp)“的作用是将文件指针移动至文件首),所以最终文件内记录的是数组 a中所有元素之和,答案选 A。 【知识模块】 结构体、 共用体与文件 2 【正确答案】 A 【试题解析】 完成对文件的操作后,必须要关闭当前文件,以免文件数据的丢失,而且 fopen(文件
20、名 , fp)与 fclose(fp)必须成对出现,不管对该文件有没有进行对操作,答案选 A。 【知识模块】 结构体、共用体与文件 3 【正确答案】 A 【试题解析】 语句 “p=“表示将指针 p指向了结构体数组 a的首地址,所以(+p)-n值为 6, p+-n相当于 p-n,p+,值为 5, p-n+值为 5, (*p).n+相当于 p-n+,值 为 5,答案选 A。 【知识模块】 结构体、共用体与文件 4 【正确答案】 A 【试题解析】 函数 fgets(s,n,f)的功能是从 f指向的文件中读取一个长度为 n-1的字符串,将其存入 s指向的存储区中,答案选 A。 【知识模块】 结构体、共
21、用体与文件 5 【正确答案】 A 【试题解析】 逻辑与 “将结点 b连接到了结点 a的后面, a.next-data与 b.data等价为 20,选项 A)中引用语句不正确,应该为a.next-data,所以答案选 A)。 【知识模块】 结构体、共用体与文件 11 【正确答案】 A 【试题解析】 按位与 “则将 data指向的结构体变量中的name值变为 “*“;函数 change()的第二个参数为值传参,所以对 num的值没有改变,输出结果为 4,答案选 A。 【知识模块】 结构体、共用体与文件 19 【正确答案】 A 【试题解析】 同类型的结构体变量之间可以直接赋值,所以答案选 A。 【知
22、识模块】 结构体、共用体与文件 20 【正确答案】 A 【试题解析】 按位与 “strcpy(p1, “malloc“);“将指针 p1和 p2指向同一块新分配的内存并存入字符串 “malloc“,所以 p1i与p2i永远相等,语句 “strcpy(p2,p1+1);“即将字符串第 2个字符 往后的字符串赋值给该 p2指向的地址,执行结束后该内存块内的数据为 “alloc“,所以答案选 A。 【知识模块】 结构体、共用体与文件 23 【正确答案】 A 【试题解析】 同类型的结构体变量之间可以直接赋值但是数组却不可以,选项B)错误;结构体的数组名仍然为一指针常量,引用其成员变量的时候要使用指向运
23、算符 “-“,选项 C)错误;数组的下标的下限为 0,上限为 n-1,其中 n为数组的维数,选项 D)引用数组越界,所以答案选 A)。 【知识模块】 结构体、共用体与文件 24 【正确答案】 A 【试题解析】 数组名为一个指针常量,指向该数组的首地址,所以 *x0.b与 *x1即 x10等价,值为 3, *x1.b与 *x2即 x20等价,值为 6,答案选 A。 【知识模块】 结构体、共用体与文件 25 【正确答案】 A 【试题解析】 结构体数组名作为函数参数为地址传参,函数 fun()的作用是把当前指针指向的结构体变量中的 name赋值为 “Tong“,并让成员变量 age自增 1,调用函数
24、时传递的是数组第二个元素的地址,所以改变的是第二个元素的值,答案选 A。 【知识模块】 结构体、 共用体与文件 26 【正确答案】 A 【试题解析】 !为逻辑非运算符,不是位运算符,答案选 A。 【知识模块】 结构体、共用体与文件 27 【正确答案】 A 【试题解析】 若指定的文件不存在,则文件打开失败,函数 fopen()返回指针为空( NULL),执行选择结构的 if支句,输出 “不能打开文件! “,答案选 A。 【知识模块】 结构体、共用体与文件 28 【正确答案】 A 【试题解析】 该定义语句把结构体 struct Date命名为一个新的类型名 “DATE“,DATE相当 于 “str
25、uct Date“,是结构体类型名,选项 A)描述错误,答案选 A)。 【知识模块】 结构体、共用体与文件 29 【正确答案】 A 【试题解析】 结构体变量对其成员变量的引用用 “.“运算符,而结构体指针引用成员变量使用指向运算符 “-“, (*a)与 a0等价,引用成员变量 n应该使用 “.“运算符,所以答案选 A。 【知识模块】 结构体、共用体与文件 30 【正确答案】 A 【试题解析】 结构体变量名作为函数参数是值传递,形参数据的改变不会影响到实参数据,所以函数调用结束后 数组 s中的数据没有变化,输出结果为选项 A)。 【知识模块】 结构体、共用体与文件 31 【正确答案】 A 【试题解析】 变量 a对应的二进制数值为 01000000,变量 b对应的二进制数值为 00001000, 01000000&00001000的结果为 0, 0100000|00001000的结果为非 0,而 a&b的值 1, a|b的值为 1,所以表达式 “(a&b)|(a&b)“的值为 1,表达式“(a|b)&(a|b)“的值也为 1,答案选 A。 【知识模块】 结构体、共用体与文件 32 【 正确答案】 A 【试题解析】 文件以只写方式打开 “w“,若成功打开已存在的文件时会把文件长度清零,即文件中的原有的内容会全部消失,答案选 A。 【知识模块】 结构体、共用体与文件