1、国家二级 C语言机试(选择题)模拟试卷 62及答案与解析 一、选择题 1 以下关于 typedef的叙述错误的是 ( )。 ( A)用 typedef可以增加新类型 ( B) typedef只是将已存在的类型用一个新的名字来代表 ( C)用 typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名 ( D)用 typedef为类型说明一个新名,通常可以增加程序的可读性 2 若有以下语句: typedef struct S int g; char h; T; 以下 叙述中正确的是 ( )。 ( A)可用 S定义结构体变量 ( B)可用 T定义结构体变量 ( C) S是 struct
2、类型的变量 ( D) T是 struct S类型的变量 3 设有以下语句: typedef struct TT char c; int a4; CIN; 则下列叙述中正确的是 ( )。 ( A) CIN是 struct TT类型的变量 ( B) TT是 struct类型的变量 ( C)可以用 TT定义结构体变量 ( D)可以用 CIN定义结构体变量 4 若有定义: typedef int* T; T a10; 则 a的定义与下面哪个语句等价 ( )。 ( A) int(*a)10; ( B) int *a10; ( C) int *a; ( D) int a10; 5 若有定义: typede
3、f char T10; T *a: 上述定义中 a的类型与下面选项中完全相同的是 ( )。 ( A) char a10; ( B) char(*a)10; ( C) char *a; ( D) char*a10; 6 以下结构体说明和变量定义中,正确的是 ( )。 ( A) typedef struct abeint 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 ab
4、cint n; double m; ; abc x, y; 7 以下叙述中正确的是 ( )。 ( A)使用 typedef说明新类型名时,其格式是: typedef新类型名原类型名; ( B)在程序中,允许用 typedef来说明一种新的类型名 ( C)使用 typedef说明新类型名时,后面不能加分号 ( D)在使用 typedef改变原类型的名称后,只能使用新的类型名 8 以下叙述中正确的是 ( )。 ( A)使用 typedef定义新类型名后,新类型名与原类型名实际上是等价的 ( B)结构体类型中的各个成分均不能是数组或指针 ( C)结构体类型的变量,不能在声明结构体类型时一起定义 (
5、D) 元素为结构体类型的数组,只能在声明过结构体类型之后单独进行定义 9 有以下程序: main( ) struet STU char name9; char sex; double score2; ; struet STU a=“Zhao“, m, 85 0, 90 0, b=“Qian“, f, 95 0, 92 0; b=a; printf(“ s, c, 2 of, 2 of n“, b name, b sex, b score0,b 8core1); 程序的运行结果是 ( )。 ( A) Qian, m, 85, 90 ( B) Zhao, m, 85, 90 ( C) Zhao,
6、f, 95, 92 ( D) Qian, f, 95, 92 10 以下结构体类型说明和变量定义中正确的是 ( )。 ( A) struet REC; int n; char c; ; REC tl, t2; ( B) typedef struet int n; char c; REC; REC tl, t2; ( C) typedef struct REC int n=0; char c=A; t1, t2; ( D) struct int n; char c; REC REC t1, t2 11 以下叙述中正确的是 ( )。 ( A)结构体类型中各个成分的类型必须是一致的 ( B)结构体类
7、型中的成分只能是 C语言中预先定义的基本数据类型 ( C)在定义结构体类型时,编译程序就为它分配了内存空间 ( D)一个结构体类型可以由多个称为成员 (或域 )的成分组成 12 下面结构体的定义语句中,错误的是 ( )。 ( A) struet ord int x; int y; int z; struet ord a; ( B) struct ord int x; int Y; int z; ; struet ord a; ( C) struet ord int x; int Y; int z; a; ( D) struct int x; int y; int z; a; 13 设有定义:
8、struet complex int real, unreal; datal=1, 8, data2; 则以下赋值语句中错误的是 ( )。 ( A) data2=(2, 6); ( B) data2=datal; ( C) data2 real=datal real; ( D) data2 real=datal unreal; 14 有以下程序: #include #include struet A int a; char b10; double c; ; struct A f(struet A t); main( ) 8truet A at=1001, “ZhangDa“, 1098 0;
9、a=f(a); printf(“ d, s, 6 1f n“, a a, a b, a c); struet A f(struet A t) t a=1002; strepy(t b, “ChangRong“); t c=1202 0: return t; 程序运行后的输出结果是 ( )。 ( A) 1002, ZhangDa, 1202 0 ( B) 1002, ChangRong, 1202 0 ( C) 1001, ChangRong, 1098 0 ( D) 1001, ZhangDa, 1098 0 15 有以下程序段: struet st int x; int *y; *pt; i
10、nt a= 1, 2, b=3, 4; struer st c2: 10, a, 20, b; pt=c; 以下选项中表达式的值为 11的是 ( )。 ( A) +pt- x ( B) pt- x ( C) *pt- y ( D) (pt+)- x 16 有以下程序: #inelude struet S int n; int a20; ; void f(int *a, int n) int i; for(i=0; i n-1; i+) ai+=i; main( ) int i; struct S s=10, 2, 3, 1, 6, 8, 7, 5, 4, 10, 9; f(s a, s 11)
11、; for(i=0; i s n; i+) printf(“ d, “, s ai); 程序运行后的输出结果是 ( )。 ( A) 2, 3, 1, 6, 8, 7, 5, 4, 10, 9, ( B) 3, 4, 2, 7, 9, 8, 6, 5, 11, 10, ( C) 2, 4, 3, 9, 12, 12, 11, 11, 18, 9, ( D) 1, 2, 3, 6, 8, 7, 5, 4, 10, 9, 17 有以下程序: #include #include typedef struetchar name9; char sex; float score2; STU; void f(
12、STUa) 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; main( ) STU c=“Qian“, f, 95 0, 92 0; f; printf(“ s, c, 2 of, 2 of n“, c name, c sex, c score0,c score1); 程序的运行结果是 ( )。 ( A) Zhao, m, 85, 90 ( B) Qian, m, 85, 90 ( C) Zhao, f, 95, 92 (
13、D) Qian, f, 95, 92 18 有以下程序: #include #include struct A int a; char b10; double c; ; void f(struet A t); main( ) struet A a=1001, “ZhangDa“, 1098 0; f(a); printf(“ d, s, 6 1f n“, a a, a b, a c); void f(struet A t) t a=1002: strcpy(t b, “ChangRong“); t c=1202 0: 程序运行后的输出结果是 ( )。 ( A) 1002, ZhangDa, 1
14、202 0 ( B) 1002, ChangRong, 1202.0 ( C) 1001, ChangRong, 1098.0 ( D) 1001, ZhangDa, 1098.0 19 有以下定义和语句: struet workers int hum; char name20; char c; strllet int day: int month; int year; s; ; struet worker8 w *pw; pw=&w; 能给 w中 year成员赋 1980的语句是 ( )。 ( A) pw一 year=1980; ( B) w year=1980; ( C) w s year
15、=1980: ( D) *pw year=1980; 20 有以下程序: #include struet tt int x; struet tt*y; *p; struet tt a4=20, a+1, 15, a+2, 30, a+3, 17, a; main() int i; p=a; for(i=1; i =2; i+) printf(“ d, “, P- x); P=P- y; 程序的运行结果是 ( )。 ( A) 20, 30, ( B) 30, 17 ( C) 15, 30, ( D) 20, 15, 21 有以下程序: include struct S int a, b; dat
16、a2=10, 100, 20, 200; main( ) struet S p=data1; printf(“ d n“, +(P a); 程序运行后的输出结果是 ( )。 ( A) 10 ( B) 11 ( C) 20 ( D) 21 22 有以下程序: #include struet ord int x, y; dt2=1, 2, 3, 4; main( ) struet ord *p=dt: printf(“ d, “, +(P- x); printf(“ d n“, +(P- Y); 程序运行后的输出结果是 ( )。 ( A) 3 4 ( B) 4, 1 ( C) 2, 3 ( D)
17、1, 2 23 有以下结构体说明、变量定义和赋值语句: struct STD char name10; int age; char sex; s5, *ps; ps=&s0; 则以下 scanf函数调用语句有错误的是 ( )。 ( A) scanf(“ s“, s0 name); ( B) scanf(“ d“, s0 age); ( C) scanf(“ c“, &(p8- sex); ( D) scanf(“ d“, ps- age); 24 有以下程序: #include, typedef structint b, p; A; void f(A c) *注意: c是结构变量名 * int
18、 j; c b+=1; c p+=2; main() int i; A a=1, 2; f(a); printf(“ d, d n“, a b, a P); 程序运行后的输出结果是 ( )。 ( A) 2, 4 ( B) l, 2 ( C) 1, 4 ( D) 2 3 25 有以下程序: iachde struct S int n; int a20; ; void f(struct S *P) int i, j, t; for(i=0; i P- n-1; i+) for(j=i+1; j P- n; j+) if(p- ai P- aj)t=p- ai; P- ai=P- aj; P- aj
19、=t; main() int i; struct S s=10, 2, 3, 1, 6, 8, 7, 5, 4, 10, 9; f(&8); for(i=0; i s n; i+)printf(“ d, “, s ai); 程序运行后的输出结果是 ( )。 ( A) 2, 3, 1, 6, 8, 7, 5, 4, 10, 9, ( B) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( C) I, 2, 3, 4, 5, 6, 7, 8, 9, 10, ( D) 10, 9, 8, 7, 6, 1, 2, 3, 4, 5, 26 有以下程序: #include #include
20、 typedef structchar name9; char sex; int score2; 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 scoreii =b scorei; return a; main() STU c=“Qi,m“, f, 95, 92, d; d=f(c); printf(“ s, c, d, d, “, d name, d sex, d score0, d score1); printf(“ s, c
21、, d, d n“, c name, c sex, c score0, c score1); 程序运行后的输出结果是 ( )。 ( A) Zhao, m, 85, 90, Qiaul, f, 95, 92 ( B) Zhao, m, 85, 90, Zhao, m, 85, 90 ( C) Qian, f, 95, 92, Qian, f, 95, 92 ( D) Qian, f, 95, 92, Zhao, m, 85 90 27 为了建立如图所示的存储结构 (即每个节点含两个域, data是数据域, next是指向节点的指针域 ),则在 【 _】 _处应填入的选项是 ( )。 Struct
22、 linkchar data;【 _】_node; 18 ( A) link next; ( B) struct link*next: ( C) link*next; ( D) struct link next: 28 程序中已构成如下图所示的不带头节点的单向链表结构,指针变量 s、 p、 q均已正确定义,并用于指向链表节点,指针变量 S总是作为指针指向链表的第一个节 点。 若有以下程序段: q=s; s=s-next; p=s; while(P-next)p=p-next; p-next=q; q-next=NULL; 该程序段实现的功能是 ( )。 ( A)删除尾节点 ( B)尾节点成为首
23、节点 ( C)删除首节点 ( D)首节点成为尾节点 29 假定已建立以下链表结构,且指针 p和 q已指向如图所示的节点: 则以下选项中可将 q所指节点从链表中删除并释放该节点的语句组是 ( )。 ( A) p-next=q-next; free(q); ( B) p=q-next; free(q); ( C) p=q; free(q); ( D) (*p) next=(*q) next; free(p); 国家二级 C语言机试(选择题)模拟试卷 62答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 typedef并不是增加了新类型,而是用一个新名字替代已存在的类型,不能为变量说明一个
24、新名,使用 typedef可以增强移植性。所以 A选项错误。 2 【正确答案】 B 【试题解析】 本题考查 typedef重新声明一种结构体类型。 T为结构体类型名,而不是结构体变量,所以 B选 项正确。 3 【正确答案】 D 【试题解析】 本题考查 typedef重新声明一种结构体类型,其中 CIN为结构体类型名,而不是结构体变量,所以 D选项正确。 4 【正确答案】 B 【试题解析】 本题考查 typedef的使用方法。 typedef对已存在的类型使用一个新的名字,其中本题中 “int*”用 T来代替,所以定义 T a10;就相当于 int *a10;,因此选项 B正确。 5 【正确答案
25、】 D 【试题解析】 本题考查 typedef的使用方法。 typedef并不创建新的类型, 只是对已存在的类型使用一个新名字,在出现新名字的地方可以直接替换为原先的类型来处理。因此选项 D正确。 6 【正确答案】 A 【试题解析】 本题考查 typedef的使用方法。 typedef对已存在的类型使用一个新的名字,选项 A中的 “ABC”为新的类型别名,定义正确。 7 【正确答案】 B 【试题解析】 本题考查 typedef的使用方法。 typedef对已存在的类型使用一个新的名字,选项 A中新类型名应该在原类型名之后, C选项中后面要加分号, D选项中可以使用原类型名。 8 【正确答案】
26、A 【试题解析】 本题考查 typedef的使用方法。 typedef对已存在的类型使用一个新的名字,结构体类型中的成分可以是数组和指针,所以 B选项错误;结构体类型的变量可以在声明结构体的时候一起定义,所以 C选项错误; D选项中二者可以一起定义。 9 【正确答案】 B 【试题解析】 本题考查结构体初始化操作。本题中可以直接将结构体 a赋值给b,所以输出的结果和 a一样,故选项 B正确。 10 【正确答案】 B 【试题解析】 本题考查结构体的相关知识。选项 A中的 “struct REC”后面不能有分 号, C选项中的 “typedef stmct REC”的后面也不能有分号,选项 D中的
27、REC已经是结构体变量,不能当做结构体类型来使用。 11 【正确答案】 D 【试题解析】 本题考查结构体类型。结构体类型中的成分可以是结构体,所以 B选项错误;定义结构体时编译程序并不会给它分配内存空间,所以 C选项错误;结构体中各个成分的类型可以是不一样的,所以 A选项错误。 12 【正确答案】 A 【试题解析】 A选项错误,不能在定义结构体的同时,又用结构体类型名定义变量。 B、 C、 D选项是定义结构体类型变量的 三种形式: B选项是先定义结构体类型,再定义结构体类型变量。 C选项是直接定义结构体类型变量。 D选项是在定义结构体类型的同时定义结构体类型变量。 13 【正确答案】 A 【试
28、题解析】 A选项中可以在声明变量的同时为 data2赋值,但是 “data2=(2,6);应写作 data2= 2,6 A选项。 14 【正确答案】 B 【试题解析】 本题考查结构体变量的引用以及作为函数参数的用法。题目虽然看似复杂,其实比较容易, f函数的参数是结构体变量,然后对参数重新赋值并返回,所以该题目的答案为 B选项。 15 【正确答案】 A 【试题解析】 本题考查结构体数组初始化以及结构体变量的引用方法。题目中定义了一个结构体数组 c并初始化,指针 pt指向 c的第一个元素,那么 pt-x为10, +pt-x为 11, *pt-y为 1, (pt+)-x为 20,所以答案为 A。
29、16 【正确答案】 C 【试题解析】 题目中定义了一个结构体类型 s,然后定义了一个结构体变量 s并初始化,执行 f函数后,将 s中的每个元素都加上 i。这里需要注意,最后一个元素没有加 i,所以最终答案为 C选项。 17 【正确答案】 D 【试题解析】 本题考查结构体的相关操作以及传值、传址的区别。该题中调用 f函数后,会生成参数 c的一个副本,而不会改变 c的值,所以 c值维持原值,故选项 D正确。 18 【正确答案】 D 【试题解析】 本题考查结构体的相关操作以及传值、传址的区别。该题中调用 f函数后,会生成参数 a的一个副本,而不会改变 a的值,所以 a值维持原值,故选项 D正确。 1
30、9 【正确答案】 C 【试题解析】 本题考查结构体变量的引用。题目中定义了一个结构体,其中结构体中的变量又是一个结构体, w为外层结构体,如果给内层结构 体赋值, C先要得到内层结构体变量,即 w s。若要给 year赋值,表示为 w s year即可,故选项 C正确。 20 【正确答案】 D 【试题解析】 本题考查结构体变量的引用以及结构体数组的用法。 p指向 a数组的第一个元素,所以 p一 x为 20,然后 p=p-y后, p指向数组 a的第二个元素,所以输出 15,故选项 D正确。 21 【正确答案】 D 【试题解析】 声明 data是结构 s数组。初始化 da-ta0 a=10;dat
31、a0 b=100; data1 a=20; data1 b=200。主函数中 p=data1,即p a=data1 a; p b=data1 b。执行语句 “printf(“ d n“, +(p a); ”打印输出时 p a先增 1再打印。 p a=data1 a=20,先增 l等于 2l。 22 【正确答案】 C 【试题解析】 本题考查结构体数组的相关操作。 dt为结构体数组,那么指针 p指向了结构体数组的一个元素,所以 p-x为 1, p-y为 2,因此结果为 2, 3选项C正确。 23 【正确答案】 D 【试题解析】 本题考查结构体的相关知识。题目中需要输入 一个变量, scanf要求参
32、数为指针,而 D选项中的 “ps-age”为一个变量,不是指针,所以错误。 24 【正确答案】 B 【试题解析】 结构体变量可以作为函数的参数和返回值。作为函数的实参时,可以实现函数的传值调用。当使用结构体变量作为函数的形参时,实参也应该是结构体变量名,以实现传值调用。实参将复制副本给形参,在被调用函数中改变形参值对于调用函数中的实参没有影响。所以选择 B。 25 【正确答案】 C 【试题解析】 本题的子函数 f的功能是对结构体变量 s中第二个成员数组中所有的数据进行从 小到大的冒泡排序,所以结果是 C。 26 【正确答案】 A 【试题解析】 本题考查的是函数调用时的参数传递问题。程序在调用函
33、数 f时,传给函数 f的参数只是结构变量 c在栈中的一个副本,函数 f所做的所有操作只是针对这个数据副本进行的修改,这些都不会影响变量 c的值。 27 【正确答案】 B 【试题解析】 本题主要考查链表中节点的概念,属于基础知识,其中指针域应该是指向下个节点,所以答案为 B。 28 【正确答案】 D 【试题解析】 本题考查链表的操作。本题中首先是 s指向了它的下个节点,题目中说明了 s总是指向链表的第一个节点,然后 while循环找到链表的最后一个元素,接着最后一个元素指向了之前链表的首节点,之前的首节点又指向了空节点,所以本题实现的效果是使首节点成为尾节点。故选项 D正确。 29 【正确答案】 A 【试题解析】 本题考查删除链表中的节点操作,其方法是将要删除节点的上个节点的下个节点指向要删除节点的下个节点,然后释放要删除的节点,所以选项 A正确。