国家二级C语言机试(结构体、共同体、位运算及文件操作)模拟试卷13
(总分50, 做题时间90分钟)
1. 选择题
1. 
下列说法正确的是(    )。
A 使用typedef可以定义新的数据类型
B 使用struct可以定义新的数据类型
C 使用typedef可以对现有类型起别名,但不能定义数据类型
D 使用new关键字可以定义新的数据类型
    分值: 2
答案:C
解析:C语言中只能通过struct关键字定义新的结构体,使用typedef对现有类型起别名,但不能定义新的数据类型,所以答案C正确。
2. 
以下说法正确的是(  )。
A typedef和struct可以联合使用来定义新数据类型
B typedef只能单独使用
C struct只能单独使用
D 以上说法都不正确
    分值: 2
答案:D
解析:typedef和struct可以联合使用来定义新的结构体,但不能定义新的数据类型。所以A,B,C选项的说法均不正确。答案选D项。
3. 
若typedef char T[3];T*a;上述定义中a的类型与下面选项中完全相同的是(  )。
A char(*A)[3];
B char*a;
C char a[3];
D char*a[3];
    分值: 2
答案:D
解析:C语言允许用typed说明一种新类型名。题目中利用typedef定义了字符数组类型T,而后定义了该类型的指针a,因此a为指针数组。
4. 
关于printf函数正确的是关于typedef的叙述中正确的是(  )。
A 在使用typedef改变原类型的名称后,只能使用新的类型名
B 使用typedef说明新类型名时,后面不能加分号
C 在程序中,允许用typedef来说明一种新的类型名
D 使用typedef说明新类型名时,其格式是:typedef新类型名原类型名
    分值: 2
答案:C
解析:C语言允许用typedef说明一种新类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。
5. 
对以下程序段的叙述中正确的是(  )。typedef struct NODE{int num;struct NODE*next;}mynode;
A 以上的说明形式非法
B NODE是一个结构体类型
C mynode是一个结构体类型
D mynode是一个结构体变量
    分值: 2
答案:C
解析:本题考查结构体和typedef类型定义。本题的声明代码相当于两部分,首先定义street NODE,然后是以typedef定义mynode类型,因此mynode是结构体类型NODE的别名或标识度。选项C正确,其他选项错误。
6. 
以下程序的输出结果是(  )。struct STR{int a,b;}data[2]={10,100,20,200};main(){struct STR p=data[1];printf(''%d\n'',++(p.a));}
A 11
B 20
C 21
D 10
    分值: 2
答案:C
解析:在题目中定义了结构体STR类型的数组变量data,并对其赋初值。在程序中定义了指向结构体STR类型的变量p,并把数组data的第二个元素data[1]的值赋给它,所以此时成员变量p.a的值等于20,在输出时分别加1,所以输入结果为选项C。
7. 
以下程序的输出结果是( )。 struct STR{int n;int a[20];}; void f(struct STR*p) {int i,j,t; for(i=0;i一1;i++) for(j=i+1;jn;j++) if(p一>a[i]>p一>a[j]){t=p一>a[i];p一>a[i]=p一>a[j];p一>a[j]=t;} l } main() {int i;struct STR s={10,{2,3,1,6,8,7,5,4,10,9}}; f(&s); for(i=0;i<s.n;i++)printf(''%d,'',s.a[i]); }
A 10,9,8,7,6,5,4,3,2,1,
B 10,9,8,7,6,1,2,3,4,5,
C 2,3,1,6,8,7,5,4,10,9,
D 1,2,3,4,5,6,7,8,9,10,
    分值: 2
答案:D
解析:题目中函数的功能使用了结构体指针变量实现对一维数组的元素从小到大排序。用关系表达式p一>a[i]>p一>a[j]实现一维数组中相邻元素两两比较,大的元素向后移,小的元素向前移。在主函数中语句f(&s);的功能实现对结构体变量s中一维数组的元素从小到大的排序,所以循环语句的输出结果为1,2,3,4,5,6,7,8,9,10。
8. 
设struct STR{char name[10];int age;char sex;}s[5],*ps;ps=&s[0];则以下scanf函数调用语句有错误的是(  )。
A scanf(''%c'',&(ps一>sex));
B scan(''%d'',&s[0].age);
C scanf(''%s'',s[0].name);
D scanf(''%d'',ps一>age);
    分值: 2
答案:D
解析:题目中程序段定义了结构体变量数组s[5]和指针变量ps,然后ps指向数组s[5]中的第一个元素,因而ps一>age引用s[0].age。因为在输入scanf()函数中,第2个参数应该表示为地址变量,而选项D表示的值,而不是一个地址值。
9. 
以下程序的输出结果是( )。 #include #include struet A {int a;char b[10];double c;}; struet A f(struet A t); main() {struct A a={1001,''Bob'',1098.0}; a=f(a);printf(''%d,%s,%6.1f\n'',a→a,a→b,a→c);} struct A f(struct A t) {t.a=1002;strcpy(t.b,''Mike'');t.c=1202.0;return t;}
A 1002,Bob,1202.0
B 1002,Mike,1202.0
C 1001,Mike,1098.0
D 1001,Bob,1098.0
    分值: 2
答案:B
解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数f(a),在函数f(a)中对结构体变量a的各个成员重新进行了赋值操作,并把其值输出。
10. 
以下程序的输出结果是( )。 #includestruct STR{int x,y;}dt[2]={1,2,3,4};main(){struct STR*p=dt; printf(''%d,'',++(p一>x));printf(''%d\n'',++(p一>y));}
A 1,2
B 2,3
C 3,4
D 4,1
    分值: 2
答案:B
解析:在题目中首先定义了结构体ORD,并定义了ORD类型的数组变量dt,并对其赋初值。在程序中定义了指向结构体时类型的指针变量P,并且它指向变量数组dt的第一个元素dt[0],所以此时成员变量P->x的值等于1,成员变量!>->7的值等于2,在输出时分别加1,输出结果为选项B。
11. 
有下列程序的输出结果是(  )。struct S{int n;int a[20];};void f(int*a,int n){int i;for(i=0;i<n一1;i++)a[i]+=i;}main(){int i;struet S s={10,{1,2,3,4,5,6,7,8,9,10}};f(s.a,s.n);for(i=0;i<s.13;i++)printf(''%d,'',s.a[i]);}
A 2,4,6,8,10,12,14,16,18,10
B 2,3,1,6,8,7,5,4,10,9,
C 1,3,5,7,9,1 l,13,15,17,10,
D 1,2,3,6,8,7,5,4,10,9,
    分值: 2
答案:C
解析:题目中子函数的功能是对数组a[]的每一个元素加上其下标的值。所以主函数中f(s.a,s.n)语句会调用f(int*a,int n)函数,此时指针a指向数组s.a={1,2,3,4,5,6,7,8,9,10},n=10;也就是说从0开始到8对数组中的每一个元素加上其下标值。
12. 
关于结构体类型的叙述中正确的是(  )。
A 结构体类型中的成员不能是数组或指针
B 结构体类型的变量,不能在声明结构体类型组成时一起定义
C 使用typedef定义新类型名后,新类型名与原类型名实际上是等价的
D 元素为结构体类型的数组,只能在声明过结构体类型之后,单独进行定义
    分值: 2
答案:C
解析:c语言允许用typedef说明一种新类型名,形式是typedef类型名标识符,typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新韵数据类型,原有类型名依然有效。结构体变量定义有下面三种形式:(1)先定义结构,再说明结构变量。(2)在定义结构类型的同时说明结构变量。(3)直接说明结构变量。
13. 
关于结构体函数的叙述中正确的是(  )。
A 即使是同类型的结构体变量。也不能进行整体赋值
B 结构体数组名不能作为实参传给函数
C 结构体变量的地址不能作为实参传给函数
D 结构体中可以含有指向本结构体的指针成员
    分值: 2
答案:D
解析:C语言中的结构体变量包含若干成员,这些成员可以是所有变量类型,甚至可以是正在定义的结构体类型指针。用结构体变量作实参时,取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。结构体数组作为参数时,采取了“地址传递”的方式,形参须为同类型的结构指针或者形参结构数组。
14. 
以下程序的输出结果是(  )。main(){unsigned char a=2,b=4,c=5,d;d=a|b;d&=c;printf(''%d\n'',d);}
A 0
B 2
C 4
D 8
    分值: 2
答案:C
解析:本题考查位运算,C语言中的|为按位或运算,&为按位与运算,按位与(&)运算符的作用是:把参加运算的两个运算数按对应的二进制位分别进行“与”运算,当两个相应的位都
为1时,该位的结果为1;否则为0。按位或(|)的运算规则是:参加运算的两个运算数中,只要两个相应的二进制位中一个为1,则该位的运算结果即为1;只有当两个相应位的数都为0时,该位的运算结果才为0。首先d=2|4值为6,d=6&5值为4。