1、国家二级 C语言机试(结构体、共用体与文件)模拟试卷 2及答案与解析 一、选择题 1 有以下程序 #include main() char a=4; printf(“%dn“, a=a #include struct A int a; char b10; double c; ; void f(struct A t); main() struct A a=1001,“ZhangDa“,1098.0; f(a); printf(“%d,%s,%6.1fn“, a.a,a.b,a.c); void f(struct A t) t.a=1002; strcpy(t.b,“ChangRong“); t.
2、c=1202.0; 程序运行后的输出结果是( )。 ( A) 1001,ZhangDa,1098.0 ( B) 1002,ChangRong,1202.0 ( C) 1001,ChangRong,1098.0 ( D) 1002,ZhangDa,1202.0 5 有以下程序 #include main() int a=5,b=1,t; t=(ayear=1980; ( D) *pw.year=1980; 8 以下叙述中错误的是( )。 ( A)可以通过 typedef增加新的类型 ( B)可以用 typedef将已存在的类型用一个新的名字来代表 ( C)用 typedef定义新的类型名后,原有
3、类型名仍有效 ( D)用 typedef可以为各种类型起别名,但不能为变量起别名 9 有以下程序 #include struct tt int x; struct tt *y; *p; struct tt a4=20,a+1,15,a+2,30,a+3,17,a; main() int i; p=a; for(i=1; ix ); p=p-y; 程序的运行结果是( )。 ( A) 20,15, ( B) 30,17 ( C) 15,30, ( D) 20,30, 10 有以下程序 #include main() struct STU char name9; char sex; double s
4、core2; ; struct STU a=“Zhao“, m, 85.0, 90.0, b=“Qian“, f, 95.0, 92.0; b=a; printf(“%s,%c,%2.0f,%2.0fn“, b.name, b.sex, b.score0, b.score1); 程序的运行结果是( )。 ( A) Zhao,m,85,90 ( B) Qian,m,85,90 ( C) Zhao,f,95,92 ( D) Qian,f,95,92 11 有以下程序 #include main() FILE *f; f=fopen(“filea.txt“,“w“); fprintf(f,“abc“
5、); fclose(f); 若文本文件 filea.txt中原有内容为: hello,则运行以上程序后,文件 filea.txt中的内容为( )。 ( A) abc ( B) abclo ( C) helloabc ( D) abchello 12 设有定义: struct char mark12; int num1; double num2; t1,t2; 若变量均已正确赋初值,则以下语句中错误的是( )。 ( A) t2.mark=t1.mark; ( B) t2.num1=t1.num1; ( C) t1=t2; ( D) t2.num2=t1.num2; 13 有以下程序 #inclu
6、de #include struct A int a; char b10; double c; void f(struct A t); main() struct A a=1001,“ZhangDa“,1098.0; f(a); printf(“%d,%s,%6.1fn“, a.a,a.b,a.c); void f(struct A t) t.a=1002; strcpy(t.b,“ChangRong“); t.c=1202.0; 程序运行后的输出结果是( )。 ( A) 1001,ZhangDa,1098.0 ( B) 1002,ChangRong,1202.0 ( C) 1001,Chan
7、gRong,1098.0 ( D) 1002,ZhangDa,1202.0 14 有以下程序 #include #include typedef struct char 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 main() FILE *fp;char str10; fp=fopen(“myfile.dat“,“w“); fputs(“abc“,fp); fclose
8、(fp); fp=fopen(“myfile.dat“,“a+“); fprintf(fp,“%d“,28); rewind(fp); fscanf(fp,“%s“,str); puts(str); fclose(fp); 程序运行后的输出结果是( )。 ( A) abc28 ( B) 28c ( C) abc ( D)因类型不一致而出错 17 若有以下程序 #include #include #include struct stu char *name, gender; int score; ; main() struct stu a=NULL, m, 290, b; a.name=(cha
9、r *)malloc(10); strcpy(a.name, “Zhao“); b = a; b.gender = f; b.score = 350; strcpy(b.name, “Qian“); printf( “%s,%c,%d,“, a.name, a.gender, a.score ); printf( “%s,%c,%dn“, b.name, b.gender, b.score ); 则程序的输出结果是( )。 ( A) Qian,m,290,Qian,f,350 ( B) Zhao,m,290,Qian,f,350 ( C) Qian,f,350,Qian,f,350 ( D)
10、Zhao,m,290,Zhao,f,350 18 若有以下程序 #include #include #include typedef struct stu char *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); strcpy( a.name, “Zhao“ ); b = a; f(b.name); b.gender = f; b.score = 350;
11、 printf(“%s,%c,%d,“, a.name, a.gender, a.score); printf(“%s,%c,%dn“, b.name, b.gender, b.score); 则程序的输出结果是( ) 。 ( A) Zhao,m,290,Zhao,f,350 ( B) Zhao,m,290,Qian,f,350 ( C) Qian,f,350,Qian,f,350 ( D) Qian,m,290,Qian,f,350 19 若有定义 typedef int* T; T a10; 则 a的定义与下面哪个语句等价( )。 ( A) int *a10; ( B) int (*a)1
12、0; ( C) int *a; ( D) int a10; 20 若有以下程序 #include main() int c; c= 105; printf(“%dn“, c); 则程序的输出结果是( )。 ( A) 15 ( B) 10000 ( C) 5 ( D) 105 21 若有以下程序 #include main() FILE *fp; int i, a6=1,2,3,4,5,6,k; fp = fopen(“data.dat“, “w+“); for (i=0; i typedef struct stu char name10, gender; int score; STU; voi
13、d f(STU a, STU b) b = a; printf( “%s,%c,%d,“, b.name, b.gender, b.score ); main() STU a=“Zhao“, m, 290, b=“Qian“, f, 350; f(a,b); printf(“%s,%c,%dn“, b.name, b.gender, b.score); 则程序的输出结果是( )。 ( A) Zhao,m,290,Qian,f,350 ( B) Zhao,m,290,Zhao,m,290 ( C) Qian,f,350,Qian,f,350 ( D) Zhao,m,290,Zhao,f,350
14、23 若有以下程序 #include #include typedef struct stu char name10, gender; int score; STU; void f( char *p ) strcpy( p, “Qian“ ); main() STU a=“Zhao“, m, 290, b; b=a; f(b.name); b.gender = f; b.score = 350; printf(“%s,%c,%d,“, a.name, a.gender, a.score); printf(“%s,%c,%dn“, b.name, b.gender, b.score); 则程序的
15、输出结果是( )。 ( A) Zhao,m,290,Qian,f,350 ( B) Zhao,m,290,Zhao,m,290 ( C) Qian,f,350,Qian,f,350 ( D) Zhao,m,290,Zhao,f,350 24 若有定义 typedef char T10; T *a; 上述定义中 a的类型与下面选项中完全相同的是( )。 ( A) char *a10; ( B) char (*a)10; ( C) char *a; ( D) char a10; 25 若有以下程序 #include main() int c; c = 13|5; printf(“%dn“, c);
16、 则程序的输出结果是( )。 ( A) 13 ( B) 15 ( C) 18 ( D) 5 26 若有以下程序 #include main() FILE *fp; int i, a6=1,2,3,4,5,6, k; fp = fopen(“data.dat“, “w+b“); for (i=0; i #include void fun(int *p1,int *p2,int *s ) s=( int * )malloc( sizeof(int) ); *s = *p1 + *(p2+); main() int a2=1,2 , b2=10,20, *s=a; fun( a,b,s ); pri
17、ntf(“%dn“, *s ); 程序运行后的输出结果是( )。 ( A) 1 ( B) 10 ( C) 11 ( D) 2 29 以下程序依次把从终端输入的字符存放到 f文件中,用 #作为结束输入的标志 , 则在横线处应填入的选项是 #include main() FILE *fp; char ch; fp=fopen( “fname“, “w“ ); while( ( ch=getchar() !=# ) fputc( _ ); fclose(fp); ( )。 ( A) ch, fp ( B) fp, ch ( C) ch ( D) ch, “fname“ 30 有以下程序 #inclu
18、de main() int i=0; i = i; printf(“%dn“,i); 程序运行后的输出结果是( )。 ( A) -1 ( B) 0 ( C) 1 ( D) 8 国家二级 C语言机试(结构体、共用体与文件)模拟试卷 2答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 左移运算符 “s.year,所以答案选 A。 【知识模块 】 结构体、共用体与文件 8 【正确答案】 A 【试题解析】 typedef为类型定义符,使用的一般形式为 “typedef 原类型名 新类型名 ;“,它用于给已知类型取别名,作用仅仅是用 “新类型名 “代替 “原类型名 “,并没有产生新的数据类型,
19、答案选 A。 【知识模块】 结构体、共用体与文件 9 【正确答案】 A 【试题解析】 语句 “p=a;“将指针 p指向了结构体数组 a的首地址,此时 p-x与a0.x等价,值为 20,执行语句 “p=p-y;“则将指针 p指向了 a+1,即数组 a第二个元素的 地址,此时 p-x与 a1.x等价,值为 15,所以答案选 A。 【知识模块】 结构体、共用体与文件 10 【正确答案】 A 【试题解析】 同类型的结构体之间可以直接赋值,所以语句 “b=a;“的作用是把结构体 a中的数据赋值给结构体 b,所以答案选 A。 【知识模块】 结构体、共用体与文件 11 【正确答案】 A 【试题解析】 该程序
20、段的作用是将字符串 “abc“写入到文件 filea.txt中,由于打开文件时以只写方式打开,打开已经存在的文件会先把文件长度清 0后再写入数据,所以运行结束 后,文件 filea.txt中的数据为 “abc“,答案选 A)。 【知识模块】 结构体、共用体与文件 12 【正确答案】 A 【试题解析】 同类型的结构体之间可以直接赋值,数组却不可以,答案选 A。 【知识模块】 结构体、共用体与文件 13 【正确答案】 A 【试题解析】 函数 f()传递的参数为结构体变量,也是一种值传参,形参的变化不能影响到实参,所以调用函数 f(a)对 a中的数据没有影响。所以输出结果为选项A)。 【知识模块】
21、结构体、共用体与文件 14 【正确答案】 A 【试题解析】 结构体是用户自己定义的一种数据类型,使用方法和 C语言中的基本数据类型一致。函数 f()中将结构体 b中成员的数据分别赋值给 a,所以函数的返回值为 a即 “Zhao“,?m?,85,90。 【知识模块】 结构体、共用体与文件 15 【正确答案】 A 【试题解析】 任何一个数值跟自身的异或运算结果均为 0,答案选 A。 【知识模块】 结构体、共用体与文件 16 【正确答案】 A 【试题解析】 该程序段的逻辑是:先以只写方式 “w“打开文件 myfile.dat,写入字符 串 “abc“,后以附加方式打开 “a+“可读写的文件,往文件末
22、尾追加字符串“28“,之后将文件指针 fp指向文件首,读取所有写入的字符,所以答案选 A。 【知识模块】 结构体、共用体与文件 17 【正确答案】 A 【试题解析】 语句 “a.name=(char *)malloc(10); strcpy(a.name, “Zhao“);“将字符串 “Zhao“赋值给了 a中的字符指针 a.name,之后把结构体 a中的数据赋值给 b,然后改变 b的 gender、 score这两个成员的值,而 b.name和 a.name指向同一块内存地址,所以当执行语句 “strcpy(b.name, “Qian“);“时, b.name和 a.name的值均为 “Qi
23、an“,所以最终结构体变量 a的数据为 “Qian“,?m?,290, b中的数据为“Qian“,?f?,350。 【知识模块】 结构体、共用体与文件 18 【正确答案】 A 【试题解析】 语句 “b=a;“把结构体 a中的数据赋值给 b,由于结构体的 name成员为一指针变量,所以 b.name和 a.name指向同一块内存地址,调用函数f(b.name)后,形参指针指向 的变化不能改变实参指针指向的变化,所以 b.name和a.name的仍然相同,值均为 “Zhao“,所以最终结构体变量 a的数据为“Zhao“,?m?,290, b中的数据为 “Zhao“, ?f?,350。 【知识模块】
24、 结构体、共用体与文件 19 【正确答案】 A 【试题解析】 typedef为类型定义符,使用的一般形式为 “typedef 原类型名 新类型名 ;“,作用仅仅是用 “新类型名 “代替 “原类型名 “,所以 T与 int*等价,语句 “T a10;“与 “int* a10;“等价,答案选 A。 【知识模块】 结构体、共用体与文件 20 【正确答案】 A 【试题解析】 异或运算符的运算规则是参与运算的两个数相对应的二进制位相异或运算,当两个对应的二进制位相异时,结果为 1。 10的二进制数为 1010, 5的二进制数为 0101, 10100101=1111,对应十进制数值为 15,答案选 A。
25、 【知识模块】 结构体、共用体与文件 21 【正确答案】 A 【试题解析】 句 “ fseek(fp, 0L, 0);“将文件指针 fp指向文件首,然后再往当前地址内写入数据,由于每次循环 都将文件指针置于文件首后再写,之前写入的数据会被新写入的数据覆盖,所以循环执行完毕之后,文件中最终写入的数据为 6,输出结果为选项 A)。 【知识模块】 结构体、共用体与文件 22 【正确答案】 A 【试题解析】 同类型的结构体之间可以直接赋值,所以函数 f()中把结构体变量 a中的数据整体赋值给了结构体变量 b,所以第一次输出结果为 Zhao,m,290,。函数f()传递的参数为结构体变量,也是一种值传参
26、,形参的变化不能影响到实参,所以主函数中调用函数 f(a,b)对 b中的数据没有影响,所以第二次的输出 结果为Qian,f,350,答案选 A。 【知识模块】 结构体、共用体与文件 23 【正确答案】 A 【试题解析】 同类型的结构体之间可以直接赋值,所以主函数中把结构体变量 a中的数据整体赋值给了结构体变量 b。函数 f()的作用是给 b.name赋值为 “Qian“(注意这里结构体的第一个称为为数组而不是指针,所以 a.name与 b.name指向不同的内存空间),所以输出结果为选项 A)。 【知识模块】 结构体、共用体与文件 24 【正确答案】 A 【试题解析】 typedef为类型定义
27、符 ,作用是用 “新类型名 “代替 “原类型名 “,即为现有类型定义容易记忆的类型名。 typedef能够隐藏复合类型,比如指针和数组,定义语句 “ typedef char T10; “表明类型 T就代表了具有 10个元素的字符数组,所以语句 “T *a;“则表示定义了具有 10个元素并且每个元素都为指针类型的数组 a,所以答案选 A。 【知识模块】 结构体、共用体与文件 25 【正确答案】 A 【试题解析】 按位或运算 “|“的运算规则是:只要对应的二进制位有一个为 1时,结果就为 1。 13的二进制数为 1101, 5的 二进制数为 0101,1101|0101=1101,对应十进制数为
28、 13,所以答案选 A。 【知识模块】 结构体、共用体与文件 26 【正确答案】 A 【试题解析】 语句 “ fseek(fp, 0L, 0);“将文件指针 fp指向文件首,然后再往当前地址内写入数据,由于每次循环都将文件指针置于文件首后再写,之前写入的数据会被新写入的数据覆盖,而写入顺序为按照数组逆序写入,所以循环执行完毕之后,文件中最终写入的数据为 1,输出结果为选项 A)。 【知识模块】 结构体、共用体与文件 27 【正确答 案】 A 【试题解析】 选项 B)定义成员变量 m的语句后少了一个分号,选项 C)定义完结构体也没有加上分号,选项 D)定义结构体变量时需要加上 struct,所以
29、答案选 A)。 【知识模块】 结构体、共用体与文件 28 【正确答案】 A 【试题解析】 函数 fun()的作用是将 s重新指向一个内存空间并重新赋值,但是函数传递过程中形参只是实参的一个副本,如果形参和实参为两个地址,则形参指针指向的变化不能影响到实参指针的指向,所以函数 fun()并不能改变 s的指向,所以输出结果为 1,答案选 A。 【 知识模块】 结构体、共用体与文件 29 【正确答案】 A 【试题解析】 fputc()函数的一般形式为 fputc(字符量 ,文件指针 );,所以填入的内容应该为 ch,fp,答案选 A。 【知识模块】 结构体、共用体与文件 30 【正确答案】 A 【试题解析】 计算机系统中,数值一律使用补码进行表示和存储,补码可以将符号位和数值位进行统一处理,正数的补码和原码相同,负数的补码是原码除符号位外的其他位取反再整体加 1所得。取反运算符 “的运算规则是对参与运算的数的各二进制位按位求反, 0的二进 制表示(篇幅有限,这里用八位表示)为00000000,取反后为 11111111,符号位为 1,所以 “11111111“是一个负数的补码,对应原码为 10000001,对应十进制数值为 -1,答案选 A。 【知识模块】 结构体、共用体与文件