1、国家二级 C语言(结构体、共用体、位运算及文件操作)机试模拟试卷 4及答案与解析 一、选择题 1 以下叙述中错误的是 ( A)可以用 typedef将己存在的类型用一个新的名字来代表 ( B)可以通过 typedef增加新的类型 ( C)用 typedef定义新的类型名后,原有类型名仍有效 ( D)用 typedef可以为各种类型起别名,但不能为变量起别名 2 以下叙述中错误的是 ( A)可以用 typedef将已存在的类型用一个新的名字来代表 ( B)可以通过 typedef增加新的类型 ( C)用 typedef定义新的类型名后,原有类型名仍有效 ( D)用 typedef可以为各种类型起
2、别名,但不能为变量起别名 3 以下结构体说明和变量定义中,正确的是 ( A) typedef struct abcint n; double m; ABC; ABC x, y; ( B) struct abcint n; double m; struct abc x, y; ( C) struct ABCint n; double m; struct ABC x, y; ( D) struct abcint n; double m; ; abc x, y; 4 有以下程序段 Typedef struct NODE int num; struct NODE*next; OLD; 以下叙述中正确的
3、是 ( A)以上的说明形式非法 ( B) NODE是一个结构体类型 ( C) OLD是一个结构型类型 ( D) OLD是一个结构变量 5 有以下程序 struct Sint a, b; )data2=10, 100, 20, 200; main() struct S p=data1; printf(“ d n“, +(p a); 程序运行后的输出结 果是 ( A) 11 ( B) 20 ( C) 21 ( D) 10 6 有以下程序 #include stdio h #include string h typedef structchar name9; char sex; int score2
4、; )STU; STU f(STU a) STU b=“Zhao“, m, 85, 90; int i; strcpy(a name, b name); a sex=b sex; for(i=0; i 2; i+)a scorei=b scorei; retum a; main() STU c=“Qian“, f ( A) Zhao, m, 85, 90, Zhao, m, 85, 90 ( B) Qian, f, 95, 92, Qian, f, 95, 92 ( C) Zhao, m, 85, 90, Qian, f, 95, 92 ( D) Qian, f, 95, 92, Zhao,
5、m, 85, 90 7 若有以下语句 typedefstruct Sint g; char h; )T;以下叙述中正确的是 ( A)可用 S定义结构体变量 ( B) S是 struct类型的变量 ( C) T是 struct S类型 的变量 ( D)可用 T定义结构体变量 8 有以下程序 #include struct ordint x, y; )dt2=1, 2, 3, 4); main()struct ord*p=dt; printf(“ d“, +(p- x)=printf(“ d n“, +(p- y); 程序运行后的输出结果是 ( A) 4, 1 ( B) 2, 3 ( C) 3,
6、4 ( D) 1, 2 9 有下列程序: #include stdio h #include string h typedef structchar name9; char sex; float score2; STU; STU f(STU a) STU b=“Zhao“, m, 85 0, 90 0; int i; strcpy(a name, b name); a sex=b sex; for(i=0; i 2; i+)a scorei=b scorei; return a; main() STU c=“Q ( A) Qian, m, 85, 90 ( B) Zhao, f, 95, 92
7、 ( C) Zhao, m, 85, 90 ( D) Qian, f, 95, 92 10 有以下定义和语句: struct workers int num; char name20; char c; struct int day; int month; int year; s; ; struct workers w*pw; pw=&w; 能给 w中 year成员赋 1980的语句是 ( A) w year=1980; ( B) pw- year=1980; ( C) w s year=1980; ( D) *pw year=1980; 11 设有定义: structchar mark12;
8、int num1; double num2; t1, t2;若变量均已正确赋初值,则以下语句中错误的是 ( A) t2 num1=t1 num1; ( B) t2 mark=t1 mark; ( C) t1=t2; ( D) t2 num2=t1 num2; 12 若有以下程序 typedef struct stuchar*name, gender; int score; STU; void f(char*p)p=(char*)malloc(10); strcpy(p, “Qian“); main()STU a=NULL, m, 290, b; a name=(char*)malloc(10)
9、; strcpy(a name, “Zhao“); b=a; f(b name); b gender=f; b score=350; printf(“ s, c, d, “, a ( A) Zhao, m, 290, Qian, f, 350 ( B) Qian, f, 350, Qian, f, 350 ( C) Qian, m, 290, Qian, f, 350 ( D) Zhao, m, 290, Zhao, f, 350 13 为了建立如图所示的存储结构 (即 每个结点含两个域, data是数据域, next是指向结点的指针域 ),则在 _处应填入的选项是 Struct linkch
10、ar data;_node; ( A) struct link*next; ( B) link next; ( C) link*next; ( D) struct link next; 14 以下叙述中正确的是 ( A)结构体类型中的各个成分均不能是数组或指针 ( B)结构体类型的变量,不能在声明结构体类型组成时一起定义 ( C)使用 typedef定义新类型名后,新类型 名与原类型名实际上是等价的 ( D)元素为结构体类型的数组,只能在声明过结构体类型之后,单独进行定义 15 设有如下的说明和定义 structint a; char*s; x, *p=&x; x a=4;x s=“hello
11、“;则以下叙述中正确的是 ( A)语句 +p- a;的效果是使 p增 1 ( B) (p+)- a与 p+- a都是合语法的表达式,但二者不等价 ( C)语句 *p- s+;等价于 (*p)- s+; ( D)语句 +p- a;的效果是使成员 a增 1 16 有以下程序 #include stdio h struct STUchar name9; char sex; int score2; ; void f(struct STU a) struct STU b=“zhao“, m, 85, 90; a1=b; main() struct STU c2=“Qian“, f, 95, 92, “S
12、un“, m, 98, 99; f(c); printf(“ s, c, d, d, “, c0 name, c0 sex, c0 sc ( A) Qian, f, 95, 92, Sun, m, 98, 99 ( B) Zhao, m, 85, 90, Sun, m, 98, 99 ( C) Qian, f, 95, 92, Zhao, m, 85, 90 ( D) Zhao, m, 85, 90, Qian, f, 95, 92 17 有以下程序 main()unsigned char a=2, b=4, c=5, d; d=a|b; d&=c; printf(“ d n“, d); 程序
13、运行后的输出结果是 ( A) 3 ( B) 5 ( C) 4 ( D) 6 18 若有以下程序段 int r=8: printf(“ d n“, r 1); 输出结果是 ( A) 8 ( B) 4 ( C) 16 ( D) 2 19 有以下程序 #include stdio_h main() char a=4; printf(“ d n“, a=a 1); ( A) 8 ( B) 16 ( C) 40 ( D) 4 20 若有以下程序 main()int c; c=105; printf(“ d n“, c); 则程序的输出结果是 ( A) 15 ( B) 10000 ( C) 5 ( D)
14、105 21 有以下程序 main()int i=1; i=ii; printf(“ d n“, i); 程序运行后的输出结果是 ( A) -1 ( B) 0 ( C) 1 ( D) 7 22 下列关于 C语言文件的叙述中正确的是 ( A)文件由结构序列组成,可以构成二进制文件或文本文件 ( B)文件由一系列数据依次排列组成,只能构成二进制文件 ( C)文件由数据序列组成,可以构成二进制文件或文本文件 ( D)文件由字符序列组成,其类型只能是文本文件 23 以下函数不能用于向文件中写入数据的是 ( A) fwrite ( B) fputc ( C) flell ( D) fprintf 24
15、有以下程序 #include stdio h main() FILE*fp; int i, a6=1, 2, 3, 4, 5, 6; fp=fopen(“d2 dat“, “w+ ); for(i=0; i 6; i+)fprintf(fp, “ d n“, ai); rewind(fp); for(i=0; i 6; i+)fscanf(fp“ d“, &a5-i); fclose(fp); for(i=0; i 6; i+)printf(“ d“, ai); ( A) 1, 2, 3, 4, 5, 6 ( B) 6, 5, 4, 3, 2, 1, ( C) 4, 5, 6, 1, 2, 3
16、, ( D) 1, 2, 3, 3, 2, 1, 25 有下列程序: #include stdio h main() FILE*fp; int a10=1, 2, 3), i, n; fp=fopen(“d1 dat“, “w“); for(i=0; i 3; i+)fprintf(fp“ d“, ai); fprintf(fp, “ n“); fclose(fp); fp=open(“d1 dat“, “r“); fscanf(fp“ d“, &n); fclose(fp); printf(“ d n“, n); 程序的运行结果是 ( A) 12300 ( B) 123 ( C) 1 ( D
17、) 321 26 有下列程序: #include stdiO-h main() FILE*rp; int k, n, a6=1, 2, 3, 4, 5, 6: fp=fopen(“d2 dat“, “w“); fprintf(fp, “ d d d n“, a0, a1, a2); fprintf(fp, “ d d d n“, a3, a4, a5); fclose(fp); fp=fopen(“d2 dat“, “r“); fscanf(fp, “ d d“, &k, &n); printf(“ d d n“, k, n); fc ( A) 1 4 ( B) 123 456 ( C) 12
18、3 4 ( D) 1 2 27 有以下程序 #include stdio h main() FILE*fp; char str10; fp=fopen(“myfile dat“, “w“); fputs(”abc“,f1); fclose(fp); rp。 fopen(“myfiIe dat“, “a+“); fprintf(fp, “ d“, 28); rewind(fp); fscanf(fp, “ s“, str); puts(str); fclose(fp); 程序运行后的输出结果是 ( A) 28c ( B) abc28 ( C) abc ( D)因类型不一致而出错 28 下面关于
19、“EOF”的叙述,正确的是 ( A) EOF的值等于 0 ( B)文本文件和二进制文件都可以用 EOF作为文件结束标志 ( C) EOF是在库函数文件中定义的符号常量 ( D)对于文本 文件, fgetc函数读入最后一个字符时,返回值是 EOF 国家二级 C语言(结构体、共用体、位运算及文件操作)机试模拟试卷 4答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 C语言允许用 typedef说明一种薪类型名,说明新类型名的语句一般形式为: typedef 类型名 标识符;在此, “类型名 ”必须是在此语句之前已有定义的类型标识符。 “标误符 ”是一个用户定义标识符,用作新的类型名。 t
20、ypedef语句的作用仅仅是用 “标识符 ”来代表已存在的 “类型名 ”,并未产生新的数据类型,原有类型名依然有效 。 【知识模块】 结构体、共用体、位运算及文件操作 2 【正确答案】 B 【试题解析】 C语言允许用 typedef说明一种新类型名: typedef 类型名 标识符;其中 “类型名 ”必须是在此语句之前已定义的类型标识符: “标识符 ”是一个用户定义标识符,用作新的类型名; typedef语句的作用仅仅是用 “标识符 ”来代表已存在的 “类型名 ”,并未产生新的数据类型;原有类型名依然有效。 【知识模块】 结构体、共用体、位运算及文件操作 3 【正确答案】 A 【试题解析】 选
21、项 B)中结构体定义 中每个成员后面的分号都不能省略, double m后没分号,因此错误。选项 C)结构体类型定义完毕后, 外没加分号。选项 D)中定义变量要加上关键字 struct。 【知识模块】 结构体、共用体、位运算及文件操作 4 【正确答案】 C 【试题解析】 本题考查结构体和 typedf类型定义。本题的声明代码相当于两部分,首先定义 stmct NODE,然后是一 typedef定义 OLD类型,因此 OLD是结构体类型。选项 C)正确,其他选项错误。 【知识模块】 结构体、共用体、位运算及文件操作 5 【正 确答案】 C 【试题解析】 在题目中定义了结构体 S类型的数组变量 d
22、ata,并对其赋初值。在程序中定义了指向结构体 S类型的变量 p,并把数组 data的第二个元素 data1的值赋给它,所以此时成员变量 p, a的值等于 20,在输出时分别加 1,所以输入结果为选项 A)。 【知识模块】 结构体、共用体、位运算及文件操作 6 【正确答案】 C 【试题解析】 在 C语言中,函数实参与形参之间数据的传递是传值,也就是说在用实参调用形参时,是把实参的值拷贝一份给形参,而实参的值并不变化,仍是原来的值。所以对 于本题来说,在主函数中调 f(e)后,实参 e的值并不会变化,仍是原值。在函数 f中把局部变量 b的值依次返回给变量 d。 【知识模块】 结构体、共用体、位运
23、算及文件操作 7 【正确答案】 D 【试题解析】 本题考查 typedef, T是 struct S的新名称,因此可用 T定义结构体变量,但是 T并不是变量,只是 struct S的新名称。 【知识模块】 结构体、共用体、位运算及文件操作 8 【正确答案】 B 【试题解析】 在题目中定义了结构体 ord类型的数组变量 dt,并对其赋初值。在程序中 定义了指向结构体 ord类型的指针变量 p,并且它指向变量数组 dt的第一个元素 dt0,所以此时成员变量 p- x的值等于 1,成员变量 p- y的值等于 2,在输出时分别加 1,所以输出结果为选项 B)。 【知识模块】 结构体、共用体、位运算及文
24、件操作 9 【正确答案】 D 【试题解析】 f()函数的功能是对形参 a的各个成员用结构体变量 b的各个成员进行赋值后,然后返回变量 a。在主函数中调用 f(c)函数时,将 STU类型的结构体变量 c的值传递给形参 a,函数 f()在对 a的各个成员进行重新赋值后,再将返回变量a的值传给 d,最后输出结构变量 d的各个成员的值。 【知识模块】 结构体、共用体、位运算及文件操作 10 【正确答案】 C 【试题解析】 本题主要考查的是结构体变量的嵌套定义,也就是说一个结构体变量也可以是一个结构体。在本题中 works这个结构体中包含了结构体 s。所以对结构体变量 w中 year成员的引用是 w s
25、 ycar。 【知识模块】 结构体、共用体、位运算及文件操作 11 【正确答案】 B 【试题解析】 这个题目主要涉及到结构体的定义与赋值操作。根据题意结构体变量 t1, t2的成 员变量 mark是字符数组,对于字符数组之间的赋值操作应该使用循环语句对每个字符进行赋值,而选项 A)是用数组名实现字符数组之间的赋值操作,是错误的。 【知识模块】 结构体、共用体、位运算及文件操作 12 【正确答案】 D 【试题解析】 函数 f(char*p)的主要功能申请字符串的存储空间,然后存入字符串 “Qian“。但当程序调用结束以后,形参指针变量 p撤销,存储的字符串地址丢失,而不能更改实参指针的值。主函数
26、中结构体变量定义同时赋初值,初始情况其 name指针成员存储空,而后语句为其分配存储空间 ,存入字符串 “Zhao”。执行 “b=a; ”语句后, b的数据和 a的数据相同,调用函数 f以后, b的 name成员的值没变。 【知识模块】 结构体、共用体、位运算及文件操作 13 【正确答案】 A 【试题解析】 单链表为动态分配的存储空间,在分配时,每个结点之间可以是不连续的 (结点内是连续的 )。结点之间的联系用指针实现,即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域,该指针为了保持链表中结点的地址,因此其基类型和结点的类型相同,选项为 A。 【知
27、识 模块】 结构体、共用体、位运算及文件操作 14 【正确答案】 C 【试题解析】 C语言允许用 typedef说明一种新类型名, typedef语句的作用仅仅是用 “标识符 ”来代表已存在的 “类型名 ”,并未产生新的数据类型,原有类型名依然有效。结构体变量定义有下面三种形式: (1)先定义结构,再说明结构变量。 (2)在定义结构类型的同时说明结构变量。 (3)直接说明结构变量。 【知识模块】 结构体、共用体、位运算及文件操作 15 【正确答案】 D 【试题解析】 p- a得到 p指向的结构体变量 中的成员 a的值。 p- a+得到 p指向的结构体变量中的成员 a的值,用完该值后使 p- a
28、加 1。 +p- a得到 p指向的结构体变量中的成员 a的值使之加 1(先加 )。由此可见指向运算符 -优先级高于+,因此 *p- s+相当于 *(p- s)+,结合性自右至左,因此 p+- a和 (p+)- a等价。 【知识模块】 结构体、共用体、位运算及文件操作 16 【正确答案】 C 【试题解析】 在主函数中,定义了结构体 STU数组 c2,并对其赋初始值。执行 f(c)时,在函数 f()中,把结构体变量 b的值赋 给了 c1。 【知识模块】 结构体、共用体、位运算及文件操作 17 【正确答案】 C 【试题解析】 本题考查位运算,为按位或运算, &为按位与运算,按位与 ( )运算符的作用
29、是:把参加运算的两个运算数按对应的二进制位分别进行 “与 ”运算,当两个相应的位都为 1时,该位的结果为 1;否则为 0。按位或 (!)的运算规则是:参加运算的两个运算数中,只要两个相应的二进制位中一个为 1,则该位的运算结果即为 1;只有当两个相应位的数都为 0时,该位的运算结果才为 0。首先 d=2|4值为 6, d=6&5值为 4。 【知 识模块】 结构体、共用体、位运算及文件操作 18 【正确答案】 B 【试题解析】 定义了整型变量 r,其值等于 8,在输出语句中,把变量 r值向右移动一位,在 C语言中把变量向右移动一位,相当于其值除以 2,所以在题中把变量 r的值 8除 2,得到其值
30、等于 4。 【知识模块】 结构体、共用体、位运算及文件操作 19 【正确答案】 A 【试题解析】 本题主要考查按位右移运算。 a=4的二进制为 00000100, a 1后为 00001000,其值为十进制数值 8。 【知识模块】 结构体、共用体、位运算 及文件操作 20 【正确答案】 A 【试题解析】 按位异或 ()的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为 0;若数不同,该位的结果为 1。整数 10和 5的二进制编码分别为 1010和 0101,异或结果为 1111,其十进制数据位 15。 【知识模块】 结构体、共用体、位运算及文件操作 21 【正确答
31、案】 B 【试题解析】 按位异或 ()的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为 0;若数不同,该位的结果为 1。本题中表达 式 ii的值必为 0,因为 i的各个位置的二进制值相同。 【知识模块】 结构体、共用体、位运算及文件操作 22 【正确答案】 C 【试题解析】 在 C语言中,对输入、输出的数据都按 “数据流 ”的形式进行处理。数据可以按文本形式或二进制和二进剃文件。 【知识模块】 结构体、共用体、位运算及文件操作 23 【正确答案】 C 【试题解析】 本题考查文件操作。 ftell函数返回文件指针的当前位置,其他的都写文件函数。 【知识模块】 结构
32、体、共用体、位运算及文件操作 24 【正确答案 】 B 【试题解析】 在程序中定义了一个整型数组 a6,并对它赋初值,并以写入的方式打开了文件 d2 dat。然后利用一个 for循环把数组 a中的元素数据写入文件d2 dat中,调用函数 rewind把将文件内部的位置指针重新指向一个文件的开头,再利用 for循环语句把文件中的数据依次写入到倒守排列的数组 a中,最后输出数组 a中的数组元素。 【知识模块】 结构体、共用体、位运算及文件操作 25 【正确答案】 B 【试题解析】 本题考查以读和写的方式打开文件对文件内容操作的不同,fp=fopen(“dl dat“, “w“);以可写的方式为输出
33、建立靳文本文件,调用 printf,输出 “123”, fp=fopen(“dl, dat“, “r“);以只读的方式打开文本文件,不能对文件内容进行操作。 【知识模块】 结构体、共用体、位运算及文件操作 26 【正确答案】 B 【试题解析】 用文件函数 fopen打开 d2 dat文件并把数组 a6中的元素分两行写入到 d2 dat文件中,关闭文件。然后再次打开文件 d2 dat,用 fscanf()函数读取文件 d2 dat中的数据,因为每行没有分隔符,所以每 一行会被认为是一个完整的数,并存入到变量 k和 n中,输出变量 k和 n的值为 123456。 【知识模块】 结构体、共用体、位运算及文件操作 27 【正确答案】 B 【试题解析】 在程序中首先把字符串 abc写入到文件 myfile dat中,然后再把整数 28追加到字符串 abc的后面,最后把文件 myfile dat的内容读入到字符串 str中,并把其内容输出。 【知识模块】 结构体、共用体、位运算及文件操作 28 【正确答案】 C 【试题解析】 EOF是在 stdio h库函数文件中定义的符 号常量,其值等于 -1。EOF用作文件结束标志,在二进制或者文本文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用 fgetc函数,每读写一次,该指针均向后移动, 【知识模块】 结构体、共用体、位运算及文件操作
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1