内容正文:
<C语言程序设计教程>清华大学出版社(第3版)
第十一章 复杂数据类型 章节过关卷
考试时间:90分钟 满分:100分
姓名 班级 学号
1、 选择题(共10题,每小题2分,共20分)
1、 若有以下定义:能给成员变量正确赋值的是 。
struct t {char s[10];int a;float b;}t1,*p=&t1;
A、
B、 p.a=1
C、 *(p).b=3.14
D、 t1.s=”li”
E、 t1.a=2
A、
2、 下面打算为float说明一个新类型名F的语句中,正确是的 。
A、
B、 typedef float=F;
C、 typedef F float
D、 typedef float F;
E、 typedef float F
3、
4、 若有以下定义,则下列表达式中值不为5的是 。
struct T{ int x,y;}s[3]={1,3,5,7,9,11},*p=s;
A、
B、 ++p->x
C、 s[1].y-2
D、 (++p)->x
E、 p->y *2-1
5、
6、 在C语言中,关于结构体和联合体以下说法错误的是 。
A、 联合体的所有成员共享一块内存。
B、 结构体可以使用位域,但联合体不能。
C、 结构体的大小内存等于所有成员大小之和。
D、 联合体的成员同一时间只能使用其中一个成员。
7、 以下关于枚举型说法正确的是 。
A、 枚举数据类型的成员可以是字符串
B、 枚举数据类型成员的值可以重复
C、 枚举数据类型成员,在没有给成员赋值的情况下,默认从0开始依次递增
D、 枚举数据类型的成员在定义后可以被修改
8、 若有以下定义语句,则输出结果正确的是 。
enum stat { ID,RUN,STO=6,ERR};
printf("%d,%d
",RUN*2,ERR/2);
A、2,3 B、4,3 C、2,1 D、4,2原创精品资源学科网独家享有版权,侵权必究!
9、 若有以下定义语句,则输出结果正确的是 。
typedef int L; typedef char C;
L a=2; C b='2';
printf("%d",a+b);
A、4 B、52 C、50 D、语法有误
10、 若有以下节点,则能正确将p所指节点插入到q所指节点后面去的语句是 。
A、 q=q->next,q->next=p;
B、 h->next=p,q=q->next,p->next=q;
C、 p->next=h,h=p,q=q->next;
D、 q=q->next,h->next=p,p->next=q;
11、 关于单链表的基本操作,以下说法错误的是 。
A、 在链表中,如果要删除一个节点,必须要知道删除节点的前驱节点。
B、 释放链表空间用free()函数
C、 链表的内存空间是连续,类似于数组。
D、 链表的节点至少要包含一个数据域和一个指向下一个节点的指针域。
12、 若有以下节点,要删除q所指向的节点,则不正确语句是 。
h
A、 p=q->next,free(q);
B、 p->next=q->next,free(q);
C、 q=q->next,p->next=q,free(q);
D、 q=q->next,h->next=q,free(q);
原创精品资源学科网独家享有版权,侵权必究!
二、填空题(共6空,每空2分,共12分)
1、若有以下定义:
struct sk{int xh; char name[10];}s1,*p;
p=&s1;则以下对结构体变量s1中成员xh的引用方式有s1.xh, 、 。
2、 若有以下定义:struct sk{int xh; char name[10];}s1;想为结构体定义别名为STUDENT,则定义语句 。
3、 若有以下定义:struct sk{int xh; char name[10];}s1;要给数组name赋值为”zhang”,则语句为 。
4、 若有定义结构体指针struct s1 *r, 如何为r开辟空间 。
5、 若有以下定义:union t{char str[4];float x,int b[2];}t1,*p=&t1;则sizeof(p)值为 。
三、程序运行题(共6题,每小题3分,共18分)
1、以下程序的运行结果是 。
#include<stdio.h>
void main()
{ struct stu
{ int xh;
char name[20];
int sex;
union {long L; double a; };
}stu1;
printf("%d
",sizeof(stu1)); }
2、 以下程序的运行结果是 。
#include<stdio.h>
void main()
{ union
{long i; char c[4]; 原创精品资源学科网独家享有版权,侵权必究!
}s1,*b=&s1;
s1.i=8;
b->c[1]=2;
printf("i=%d,%d,%d
",s1.i,b->c[0],(*b).c[1]); }
3、 以下程序的运行结果是 。
#include<stdio.h>
void main()
{ struct x
{ char c[4], *p; }s1={"123","456"};
struct y
{ char *cp;
struct x s1; }s2={"abc",{"def","ghi"}};
printf("%c,%s
",s1.c[0],s1.p++);
printf("%c,%s
",*s1.p,s1.c);
printf("%s,%s
",s2.cp,++s2.s1.p);
printf("%s,%s
",++s2.cp,s2.s1.c); }
4、 以下程序的运行结果是 。
#include<stdio.h>
#include<string.h>
struct stu {char name[20];double cj;}s1,*p=&s1;
void f1(struct stu s1)
{ strcpy(s1.name,"zhao");s1.cj=99.73; }
void f2(struct stu *q)
{ strcpy(q->name,"lin");s1.cj=96.53; }
void main()
{ strcpy(s1.name,"wang"),s1.cj=86.50;
f1(s1);
printf("%s,%f
",s1.name,s1.cj);
f2(p);
printf("%s,%f
",p->name,p->cj); }原创精品资源学科网独家享有版权,侵权必究!
5、 以下程序的运行结果是 。
#include<stdio.h>
struct s
{ char x[2];
short int y;};
union
{ int a;
short b[2];
struct s d;}st,*p=&st;
void main()
{ st.a=0xabcd1234;
printf("%x,%x
",p->a,p->b[0]);
printf("%x,%x
",p->d.x[1],p->d.y);}
6、 以下程序的运行结果是 。
#include<stdio.h>
enum weekday {sum=7,mon=1,tue,wed,thu,fri,sat};
void main()
{ char str[7][10]={"wang","zhang","lin","zhao","shi","yang","liu"},(*p)[10]=str;
int i;
for(i=tue;i<fri;i++)
printf("%s",*(p+i)); }
四、程序填空题(共6空,每空5分,共30分)
1、程序功能:用尾插法创建带头节点的单链表,以输入的姓名为空串结束。请填空。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu
{ long xh;
char xm[10]; 原创精品资源学科网独家享有版权,侵权必究!
float cj;
struct stu *next; };
typedef STU struct stu
STU *create( )
{ char xm[10];
STU *p,*q,*h;
h= ;
if((h==NULL) return h;
p=h;
gets(xm);
while(*xm!='\0')
{ if((q=(STU *)malloc(LEN))==NULL) break;
scanf("%d,%f",&q->xh,&q->cj);
strcpy(q->xm,xm);
;
gets(xm); }
p->next=NULL;
return h; }
int main()
{ STU *p,*head;
;
p=head->next;
for(;p!=NULL;p=p->next)
printf("%d,%s,%.2f
",p->xh,p->xm,p->cj);
return 0; }
2、函数功能:输出并删除成绩不合格的学生信息节点。请填空。
#include<stdio.h>
struct stu
{ long xh; 原创精品资源学科网独家享有版权,侵权必究!
char xm[10];
float cj;
struct stu *next; };
void prin_del(struct stu **h)
{ struct stu *p,*q;
while(p!=NULL)
if(p->cj>60) q=p,p=p->next;
else if(p==*h) { printf("%d,%s,%.2f
",p->xh,p->xm,p->cj);
*h=(*h->next);
free(p);p=*h; }
else { printf("%d,%s,%.2f
",p->xh,p->xm,p->cj);
;
free(p);
p=p->next;} }
五、程序改错题(共20分,一题两处错误)
1、函数功能是插入法排序,将不带头节点的单链表按成绩升序排序。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 struct stu
L2 { long xh;
L3 char xm[10];
L4 float cj;
L5 struct stu *next; };
L6 struct stu ascend(struct stu *h)
L7 { struct stu *p,*q,*r;
L8 if(h==NULL) return h;
L9 p=h->next;
L10 h->next=NULL;
L11 while(p!=NULL)
L12 { for(q=h;p->cj>q->cj&&q!=NULL;q=q->next) r=q; 原创精品资源学科网独家享有版权,侵权必究!
L13 if(q==h)
L14 { h=p;
L15 p=p->next;
L16 h->next=q; }
L17 else { r->next=p;r=p;p=p->next;
L18 q->next=r;} }
L19 return h; }
2、程序功能:输入学生姓名,能查询总成绩,能连续进行查询,直到输入0时结束。请找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)原创精品资源学科网独家享有版权,侵权必究!
L1 #include<stdio.h>
L2 #include<string.h>
L3 struct stu
L4 {char *name;float cj;
L5 }s[]={“wang”,586.0,”zhao”,523.5,”li”,548.5};
L6 void main()
L7 { char xm[20];
L8 int i;
L9 gtes(xm);
L10 while(strcmp(xm,”0”)!=0)
L11 { for(i=0;i<3;i++)
L12 if(xm==s[i].name)
L13 { printf(“%s,%f”,s[i].name,s[i].cj);
L14 continue;}
L15 if(i>3) printf(“没有找到”); }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$
<C语言程序设计教程>清华大学出版社(第3版)
第十一章 复杂数据类型 章节过关卷
考试时间:90分钟 满分:100分
姓名 班级 学号
1、 选择题(共10题,每小题2分,共20分)
1、 若有以下定义:能给成员变量正确赋值的是 。
struct t {char s[10];int a;float b;}t1,*p=&t1;
A、
B、 p.a=1
C、 *(p).b=3.14
D、 t1.s=”li”
E、 t1.a=2
A、
【答案】D
【解析】结构体变量的引用方法有:结构体变量名.成员名、结构体指针->成员名、
(*结构体指针).成员名。其中C选项,s定义为字符数组,赋值应用赋值函数strcpy来实现,strcpy(t1.s,”li”)。故选D。
2、 下面打算为float说明一个新类型名F的语句中,正确是的 。
A、
B、 typedef float=F;
C、 typedef F float
D、 typedef float F;
E、 typedef float F
【答案】C
【解析】别名定义格式:typedef 类型名 类型名别名;故选C。
3、 若有以下定义,则下列表达式中值不为5的是 。
struct T{ int x,y;}s[3]={1,3,5,7,9,11},*p=s;
A、
B、 ++p->x
C、 s[1].y-2
D、 (++p)->x
E、 p->y *2-1
4、
【答案】A
【解析】A选项优先级++(p->x),p->x值为1,加1后等于2。故选A。
5、 在C语言中,关于结构体和联合体以下说法错误的是 。
A、 联合体的所有成员共享一块内存。
B、 结构体可以使用位域,但联合体不能。
C、 结构体的大小内存等于所有成员大小之和。
D、 联合体的成员同一时间只能使用其中一个成员。
【答案】B原创精品资源学科网独家享有版权,侵权必究!
【解析】联合体也能使用位域。故选B。
6、 以下关于枚举型说法正确的是 。
A、 枚举数据类型的成员可以是字符串
B、 枚举数据类型成员的值可以重复
C、 枚举数据类型成员,在没有给成员赋值的情况下,默认从0开始依次递增
D、 枚举数据类型的成员在定义后可以被修改
【答案】C
【解析】A选项枚举数据类型的成员不可以是字符串,B选项枚举数据类型成员的值不可以重复,D选项枚举数据类型的成员是整数常量,定义后不可以修改。故选C。
7、 若有以下定义语句,则输出结果正确的是 。
enum stat { ID,RUN,STO=6,ERR};
printf("%d,%d
",RUN*2,ERR/2);
A、2,3 B、4,3 C、2,1 D、4,2
【答案】A
【解析】C、枚举数据类型成员,在没有给成员赋值的情况下,默认从0开始依次递增,但是在赋值后,后面的成员跟着前面的值依次递增,因此ERR值为7。故选A
8、 若有以下定义语句,则输出结果正确的是 。
typedef int L; typedef char C;
L a=2; C b='2';
printf("%d",a+b);
A、4 B、52 C、50 D、语法有误
【答案】B
【解析】L是int的别名,C是char的别名,用%d输出值,’2’的ASCII值为50。故选B。
9、 若有以下节点,则能正确将p所指节点插入到q所指节点后面去的语句是 。
原创精品资源学科网独家享有版权,侵权必究!
A、 q=q->next,q->next=p;
B、 h->next=p,q=q->next,p->next=q;
C、 p->next=h,h=p,q=q->next;
D、 q=q->next,h->next=p,p->next=q;
【答案】D
【解析】A选项,将P指向的节点插入到最后一个节点后,B选项丢掉一个节点,不符合题意,C选项将P指向的节点插入到最前面。均不符合题意。故选D。
10、 关于单链表的基本操作,以下说法错误的是 。
A、 在链表中,如果要删除一个节点,必须要知道删除节点的前驱节点。
B、 释放链表空间用free()函数
C、 链表的内存空间是连续,类似于数组。
D、 链表的节点至少要包含一个数据域和一个指向下一个节点的指针域。
【答案】C
【解析】链表节点是动态分配的,内存不连续。
11、 若有以下节点,要删除q所指向的节点,则不正确语句是 。
h
A、 p=q->next,free(q);
B、 p->next=q->next,free(q);
C、 q=q->next,p->next=q,free(q);
D、 q=q->next,h->next=q,free(q);
【答案】A
【解析】A选项中,q还是在h链表中,如果被释放,则h所指向的节点,指针域找不到后续节点。故选A。
二、填空题(共6空,每空2分,共12分)
1、若有以下定义:
struct sk{int xh; char name[10];}s1,*p;原创精品资源学科网独家享有版权,侵权必究!
p=&s1;则以下对结构体变量s1中成员xh的引用方式有s1.xh, 、 。
【答案】p->xh (*p).xh
2、 若有以下定义:struct sk{int xh; char name[10];}s1;想为结构体定义别名为STUDENT,则定义语句 。
【答案】typedef STUDENT struct sk
3、 若有以下定义:struct sk{int xh; char name[10];}s1;要给数组name赋值为”zhang”,则语句为 。
【答案】strcpy(s1.name,"zhang");
4、 若有定义结构体指针struct s1 *r, 如何为r开辟空间 。
【答案】r=(struct s1 *)malloc(sizeof(struct s1));
5、 若有以下定义:union t{char str[4];float x,int b[2];}t1,*p=&t1;则sizeof(p)值为 。
【答案】4
三、程序运行题(共6题,每小题3分,共18分)
1、以下程序的运行结果是 。
#include<stdio.h>
void main()
{ struct stu
{ int xh;
char name[20];
int sex;
union {long L; double a; };
}stu1;
printf("%d
",sizeof(stu1)); }
【答案】40
2、 以下程序的运行结果是 。
#include<stdio.h>
void main()原创精品资源学科网独家享有版权,侵权必究!
{ union
{long i; char c[4];
}s1,*b=&s1;
s1.i=8;
b->c[1]=2;
printf("i=%d,%d,%d
",s1.i,b->c[0],(*b).c[1]); }
【答案】i=520,8,2
3、 以下程序的运行结果是 。
#include<stdio.h>
void main()
{ struct x
{ char c[4], *p; }s1={"123","456"};
struct y
{ char *cp;
struct x s1; }s2={"abc",{"def","ghi"}};
printf("%c,%s
",s1.c[0],s1.p++);
printf("%c,%s
",*s1.p,s1.c);
printf("%s,%s
",s2.cp,++s2.s1.p);
printf("%s,%s
",++s2.cp,s2.s1.c); }
【答案】1,456
5,123
abc,hi
bc,def
4、 以下程序的运行结果是 。
#include<stdio.h>
#include<string.h>
struct stu {char name[20];double cj;}s1,*p=&s1;
void f1(struct stu s1)
{ strcpy(s1.name,"zhao");s1.cj=99.73; }
void f2(struct stu *q) 原创精品资源学科网独家享有版权,侵权必究!
{ strcpy(q->name,"lin");s1.cj=96.53; }
void main()
{ strcpy(s1.name,"wang"),s1.cj=86.50;
f1(s1);
printf("%s,%f
",s1.name,s1.cj);
f2(p);
printf("%s,%f
",p->name,p->cj); }
【答案】wang,86.500000
lin,96.530000
5、 以下程序的运行结果是 。
#include<stdio.h>
struct s
{ char x[2];
short int y;};
union
{ int a;
short b[2];
struct s d;}st,*p=&st;
void main()
{ st.a=0xabcd1234;
printf("%x,%x
",p->a,p->b[0]);
printf("%x,%x
",p->d.x[1],p->d.y);}
【答案】abcd1234,1234
12,ffffabcd
6、 以下程序的运行结果是 。
#include<stdio.h>
enum weekday {sum=7,mon=1,tue,wed,thu,fri,sat};
void main()
{ char str[7][10]={"wang","zhang","lin","zhao","shi","yang","liu"},(*p)[10]=str;
int i; 原创精品资源学科网独家享有版权,侵权必究!
for(i=tue;i<fri;i++)
printf("%s",*(p+i)); }
【答案】linzhaoshi
四、程序填空题(共6空,每空5分,共30分)
1、程序功能:用尾插法创建带头节点的单链表,以输入的姓名为空串结束。请填空。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu
{ long xh;
char xm[10];
float cj;
struct stu *next; };
typedef STU struct stu
STU *create( )
{ char xm[10];
STU *p,*q,*h;
h= ;
if((h==NULL) return h;
p=h;
gets(xm);
while(*xm!='\0')
{ if((q=(STU *)malloc(LEN))==NULL) break;
scanf("%d,%f",&q->xh,&q->cj);
strcpy(q->xm,xm);
;
gets(xm); }
p->next=NULL; 原创精品资源学科网独家享有版权,侵权必究!
return h; }
int main()
{ STU *p,*head;
;
p=head->next;
for(;p!=NULL;p=p->next)
printf("%d,%s,%.2f
",p->xh,p->xm,p->cj);
return 0; }
【答案】(1)#define LEN sizeof(struct stu) (2) (STU *)malloc(LEN)
(3)p->next=q,p=q (4)head=create( );
2、函数功能:输出并删除成绩不合格的学生信息节点。请填空。
#include<stdio.h>
struct stu
{ long xh;
char xm[10];
float cj;
struct stu *next; };
void prin_del(struct stu **h)
{ struct stu *p,*q;
while(p!=NULL)
if(p->cj>60) q=p,p=p->next;
else if(p==*h) { printf("%d,%s,%.2f
",p->xh,p->xm,p->cj);
*h=(*h->next);
free(p);p=*h; }
else { printf("%d,%s,%.2f
",p->xh,p->xm,p->cj);
;
free(p);
p=p->next;} }
【答案】 p=*h; q->next=p->next 原创精品资源学科网独家享有版权,侵权必究!
五、程序改错题(共20分,一题两处错误)
1、函数功能是插入法排序,将不带头节点的单链表按成绩升序排序。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 struct stu
L2 { long xh;
L3 char xm[10];
L4 float cj;
L5 struct stu *next; };
L6 struct stu ascend(struct stu *h)
L7 { struct stu *p,*q,*r;
L8 if(h==NULL) return h;
L9 p=h->next;
L10 h->next=NULL;
L11 while(p!=NULL)
L12 { for(q=h;p->cj>q->cj&&q!=NULL;q=q->next) r=q;
L13 if(q==h)
L14 { h=p;
L15 p=p->next;
L16 h->next=q; }
L17 else { r->next=p;r=p;p=p->next;
L18 q->next=r;} }
L19 return h; }
【答案】 L6 struct stu *ascend(struct stu *h)
L18 r->next=q;} }
2、程序功能:输入学生姓名,能查询总成绩,能连续进行查询,直到输入0时结束。请找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)原创精品资源学科网独家享有版权,侵权必究!
L1 #include<stdio.h>
L2 #include<string.h>
L3 struct stu
L4 {char *name;float cj; 原创精品资源学科网独家享有版权,侵权必究!
L5 }s[]={“wang”,586.0,”zhao”,523.5,”li”,548.5};
L6 void main()
L7 { char xm[20];
L8 int i;
L9 gtes(xm);
L10 while(strcmp(xm,”0”)!=0)
L11 { for(i=0;i<3;i++)
L12 if(xm==s[i].name)
L13 { printf(“%s,%f”,s[i].name,s[i].cj);
L14 continue;}
L15 if(i>3) printf(“没有找到”); }
【答案】 L12 strcmp(xm,s[i].name)==0
L14 break;
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$