![]() ![]() |
|
二级C语言教程章节测试14.结构体与共用体及用户定义类型 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:07:49 文章录入:杜斌 责任编辑:杜斌 | |
|
|
(1)有以下程序段 typedef struct NODE { int num; struct NODE *next; } OLD; 以下叙述中正确的是 A)以上的说明形式非法 B)NODE是一个结构体类型 C)OLD是一个结构体类型 D)OLD是一个结构体变量 (2)有以下程序 # include struct STU { int num; float TotalScore; }; void f(struct STU p) { struct STU s[2]={{20044,550},{20045,537}}; p.num = s[1].num; p.TotalScore = s[1].TotalScore; } main() { struct STU s[2]={{20041,703},{20042,580}}; f(s[0]); printf("%d %3.0f\n", s[0].num, s[0].TotalScore); } 程序运行后的输出结果是 A)20045 537 B)20044 550 C)20042 580 D)20041 703 (3)有以下程序 (4)有以下程序 (8)以下对结构体类型变量td的定义中,错误的是
(10) A) char * B) struct node C) struct node* D) char (11) A) *s B) s C) *s++ D)(*s)++ (12) A) p->next B) p C) s D) s->next (13) 设有以下语句 typedef struct S { int g; char h;} T; 则下面叙述中正确的是 A) 可用S定义结构体变量 B)可以用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量 (14) 有以下程序 struc STU { char name[10]; int num; }; void f1(struct STU C) { struct STU b={“LiSiGuo”,2042}; c=b; } void f2(struct STU *C) { struct STU b={“SunDan”,2044}; *c=b; } main() { struct STU a={“YangSan”,2041},b={“WangYin”,2043}; f1(A) ;f2(&B) ; printf(“%d %d\n”,a.num,b.num); } 执行后的输出结果是 A)2041 2044 B)2041 2043 C)2042 2044 D)2042 2043 (15) 有以下程序 struct STU { char name[10]; int num; int Score; }; main() { struct STU s[5]={{“YangSan”,20041,703},{“LiSiGuo”,20042,580}, {“wangYin”,20043,680},{“SunDan”,20044,550}, {“Penghua”,20045,537}},*p[5],*t; int i,j; for(i=0;i<5;i++) p[i]=&s[i]; for(i=0;i<4;i++) for(j=i+1;j<5;j++) if(p[i]->Score>p[j]->Score) { t=p[i];p[i]=p[j];p[j]=t;} printf(“5d %d\n”,s[1].Score,p[1]->Score); } 执行后输出结果是 A) 550 550 B) 680 680 C) 580 550 D) 580 680 (16) 有以下程序 #include struct NODE{ int num; struct NODE *next; }; main() { struct NODE *p,*q,*r; int sum=0; p=(struct NODE *)malloc(sizeof(struct NODE)); q=(struct NODE *)malloc(sizeof(struct NODE)); r=(struct NODE *)malloc(sizeof(struct NODE)); p->num=1;q->num=2;r->num=3; p->next=q;q->next=r;r->next=NULL; sum+=q->next->num;sum+=p->num; printf(“%d\n”,sum); } 执行后的输出结果是 A) 3 B) 4 C) 5 D) 6 (17) 以下选项中不能正确把c1定义成结构体变量的是 A) typedef struct B) struct color cl { int red; { int red; int green; int green; int blue; int blue; } COLOR; }; COLOR cl; C) struct color D) struct { int red; { int red; int green; int green; int blue; int blue; } c l; } c l ; (18) 有以下程序 struct s { int x,y;} data[2]={10,100,20,200}; main () { struct s *p=data; printf("%d\n",++(p->x)); } 程序运行后的输出结果是 A) 10 B) 11 C) 20 D)21 (19) 有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中的三个连续结点。 struct node { int data struct node *next ; } *p, *q, *r; 现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下错误的程序段是
(20) 设有如下说明 typedef struct { int n; char c; double x;}STD; 则以下选项中,能正确定义结构体数组并赋初值的语句是 A) STD tt[2]={{1,'A',62},{2, 'B',75}}; B) STD tt[2]={1,"A",62},2, "B",75}; C) struct tt[2]={{1,'A'},{2, 'B'}}; D)structtt[2]={{1,"A",62.5},{2, "B",75.0}}; (21) 有以下程序 main() { union { unsigned int n; unsigned char c; }u1; ul.c=`A`; printf("%c\n",u1.n); } 执行后输出结果是 A) 产生语法错 B) 随机值 C) A D) 65 (22)若要说明一个类型名STP,使得定义语句STP s等价于char *s,以下选项中正确的是 A) typedef STP char *s; B) typedef *char STP; C) typedef stp *char; D) typedef char* STP; (23) 设有如下定义 struct ss { char name[10]; int age; char sex; }std[3],*p=std; 下面各输入语句中错误的是 A) scanf("%d",&(*p).age); B) scanf("%s",&std.name); C) scanf("%c",&std[0].sex) D) scanf("%c",&(p->sex)); (24) 有以下程序 struct STU { char num[10]; float score[3]; }; main() { struct stu s[3]={{“20021”,90,95,85}, {“20022”,95,80,75}, {“20023”,100,95,90}},*p=s; int i; float sum=0; for(i=0;i<3,i++) sum=sum+p->score[i]; printf(“%6.2f\n”,sum); } 程序运行后的输出结果是 A) 260.00 B) 270.00 C) 280.00 D) 285.00 (25) 设有如下定义: struck sk { int a; float b; }data; int *p; 若要使P指向data中的a域,正确的赋值语句是 A) p=&a; B) p=data.a; C) p=&data.a; D) *p=data.a; (26) 有以下程序 #include struct NODE { int num; struct NODE *next; }; main() { struct NODE *p,*Q,*R; p=(struct NODE*)malloc(sizeof(struct NODE)); q=(struct NODE*)malloc(sizeof(struct NODE)); r=(struct NODE*)malloc(sizeof(struct NODE)); p->num=10; q->num=20; r->num=30; p->next=q;q->next=r; printf(“%d\n”,p->num+q->next->num); } 程序运行后的输出结果是 A) 10 B) 20 C) 30 D) 40 (27) 若有以下说明和定义 typedef int *INTEGER; INTEGER p,*q; 以下叙述正确的是 A) P是int型变量 B) p是基类型为int的指针变量 C) q是基类型为int的指针变量 D) 程序中可用INTEGER代替int类型名 (28) 若有下面的说明和定义: struct test { int ml; char m2; float m3; union uu {char ul[5]; int u2[2];} ua; } myaa; 则sizeof(struct test )的值是 A) 12 B) 16 C) 14 D) 9 (29) 若以下定义: struct link { int data; struck link *next; }a,b,c,*p,*q; 且变量a和b之间已有如下图所示的链表结构: a b data next data next
(30) 设有以下说明语句 typedef struct { int n; char ch[8]; }PER; 则下面叙述中正确的是 A) PER 是结构体变量名 B) PER是结构体类型名 C) typedef struct 是结构体类型 D) struct 是结构体类型名 (31) 以下各选项企图说明一种新的类型名,其中正确的是 A) typedef v1 int; B) typedef v2=int; C) typedefv1 int v3; D) typedef v4: int; (32) 以下程序的输出结果是 struct HAR { int x, y; struct HAR *p;} h[2]; main() { h[0],x=1;h[0];y=2; h[1],x=3;h[1];y=4; h[0],p=&h[1],p=h; printf(“%d %d \n”,(h[0],p)->x,(h[1],p)->y); } A) 12 B) 23 C) 14 D) 32 (33) 以下程序的输出结果是 union myun { struct { int x, y, z; } u; int k; } a; main() { a.u.x=4; a.u.y=5; a.u.z=6; a.k=0; printf(%d\n”,a.u.x); } A) 4 B) 5 C) 6 D) 0 (34) 设有以下说明语句 struct ex { int x ; float y; char z ;} example; 则下面的叙述中不正确的是 A) struct结构体类型的关键字 B) example是结构体类型名 C) x,y,z都是结构体成员名 D) struct ex是结构体类型 (35) 以下程序的输出是 A) 10 B) 11 C) 51 D) 60 struct st { int x; int *y;} *p; int dt[4]={ 10,20,30,40 }; struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0],}; main() { p=aa; printf(“%d\n”,++(p->x)); } (36) 假定建立了以下链表结构,指针p、q分别指向如图所示的结点,则以下可以将q所指结点从链表中删除并释放该结点的语句组是 A) free(q); p->next=q->next; B)(*p).next=(*q).next; free(q); C) q=(*q).next; (*p).next=q; free(q); D) q=q->next; p->next=q; p=p->next; free(p) ![]() (37) 有如下定义 struct person{char name[9]; int age;}; strict person class[10]={“Johu”, 17, “Paul”, 19 “Mary”, 18, “Adam 16,}; 根据上述定义,能输出字母M的语句是 A) prinft(“%c\n”,class[3].mane); B) pfintf(“%c\n”,class[3].name[1]); C) prinft(“%c\n”,class[2].name[1]); D) printf(“%^c\n”,class[2].name[0]); (38) 以下对结构体类型变量的定义中,不正确的是 A) typedef struct aa B) #define AA struct aa { int n; AA {int n; float m; float m; }AA; }td1; AA td1; C) struct D) struct { int n; { int n; float m; float m; }aa; }td1; stuct aa td1; (39) 若已建立如下图所示的单向链表结构, ![]() 在该链表结构中,指针p、s分别指向图中所示结点,则不能将s所指的结点插入到链表末尾仍构成单向链表的语句组是 A) p =p->next; s->next=p; p->next=s; B) p =p->next; s->next=p->next; p->next=s; C) s->next=NULL; p=p->next; p->next=s; D) p=(*p).next; (*s).next=(*p).next; (*p).next=s; (40) 下列程序的输出结果是 A) 5 B) 6 C) 7 D) 8 struct abc { int a, b, c; }; main() { struct abc s[2]={{1,2,3},{4,5,6}}; int t; t=s[0],a+s[1],b; printf("%d \n",t); }
(41) 有以下结构体说明和变量的定义,且如下图所示指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是 A) a.next=q; B) p.next=&b; C) p->next=&b; D) (*p).next=q; struct node { char data; struct node *next; { a,b,*p=&a,*q=&b; data next data next ![]() (42) 变量a所占内存字节数是 A) 4 B) 5 C) 6 D) 8 union U { char st[4]; int i; long l; }; struct A { int c; union U u; }a; (43) 以下选项中,能定义s为合法的结构体变量的是 A) typedef struct abc B) struct { double a; { double a; char b[10]; char b[10]; } s; } s; C) struct ABC D) typedef ABC { double a; { double a; char b[10]; char b[10]; } } ABC s; ABC s; (44) 以下程序的输出结果是 A) 2 B) 1 C)0 D)不确定 main() { union { char i[2]; int k; }r; r.i[0]=2; r.i[1]=0; printf{“%d\n”,r.k}; } (45) 设有以下定义或语句,则输出的结果是(指针变量占两个字节) A) 20 B) 16 C) 14 D)12 struct date { long *cat; struct date *next; double dog; }too; printf(“%d\n”,sizeof(too)); (46) 有以下程序 #include struct stu { int num; char name[10]; int age; }; void fun(struct stu *p) { printf("%s\n",(*p).name); } main() { struct stu students[3]={ {9801,"Zhang",20}, {9802,"Wang",19}, {9803,"Zhao",18} }; fun(students+2); } 输出结果是 A) Zhang B)Zhao C) Wang D) 18 (47) 设有以下说明和定义: typedef union { long i; int k[5]; char c; }DATE; struct date { int cat; DATE cow; double dog; } too; DATE max; 则下列语句的执行结果是 printf ("%d",sizeof (struct date ) +sizeof(max)); A) 26 B) 30 C) 18 D) 8 (48) 设有如下定义: struct sk {int a;float b;}data,*p; 若有p=&data;,则对data中的a域的正确引用是 A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a (49) 若程序中有下面的说明和定义 struct abc {int x;char y;} struct abc s1,s2; 则会发生的情况是 A) 编译进错 B) 程序将顺利编译`连接`执行 C) 能顺利通过编译`连接`但不能执行 D) 能顺利通过编译`但连接出错 (50) 若有下面的说明和定义,则sizeof(struct aa) 的值是 struct aa { int r1;double r2; float r3; union uu{char u1[5]; long u2[2]; } ua; } mya; A)30 B)29 C)24 D)22
(51) 字符'0'的ASCII码的十进制数为48,且数组的第0个元素在低位,则以下程序的输出结果是 #include main() { union { int i[2]; long k; char c[4]; }r,*s=&r; s->i[0]=0x39; s->i[1]=0x38; printf("%c\n",s->c[0]) } A) 39 B) 9 C) 38 D) 8 (52) 设有以下定义: typedef union { long i;int k[5];char c;}DATE; struct date { int cat;DATE cow;double dog;}too; DATE max; 则下列语句的执行结果是 printf("%d",sizeof(struct date)+sizeof(max)); A) 25 B) 30 C) 18 D) 8 (53) 根据下面的定义,能打印出字母M的语句是 A) printf("%c\n",class[3].name); D) printf("%c\n",class[2].name[0]); B) printf("%c\n",class[3].name[1]); C) printf("%c\n",class[2].name[1]); struct person { char name[9]; int age;}; struct person class[10]={"John",17, "Paul",19, "Mary",18, "Adam",16}; (54) 下面程序的输出是 A) 0 B) 1 C) 3 D) 6 main() { struct cmplx { int x; int y; } cnum[2]={1,3, 2,7}; printf("%d\n",cnum[0].y /cnum[0].x * cnum[1].x);} (55) 已知字符0的ASCII码为十六进制的30,下面程序的输出是 A) 6 B) 9 C) 0 D) 3 main() { union { unsigned char c; unsigned int i[4]; } z; z.i[0]=0x39; z.i[1]=0x36; printf("%c\n",z.c);} (56) 下面程序的输出是 A) 32 B) 16 C) 8 D) 24 typedef union { long x[2]; int y[4]; char z[8]; } MYTYPE; MYTYPE them; main() { printf("%d\n", sizeof(them));} (57) 若已建立下面的链表结构,指针p、s分别指向图中所示的结点,则不能将s所指的结点插入到链表末尾的语句组是 A) s->next=NULL; p=p->next; p->next=s; B) p=p->next; s->next=p->next; p->next=s; C) p=p->next; s->next=p; p->next=s; D) p=(*p).next; (*s).next=(*p).next; (*p).next=s; (58) 下面程序的输出结果为 struct st { int x; int *y; } *p; int dt[4]={10,20,30,40}; struct st aa[4]={ 50,&dt[0],60,&dt[1], 70,&dt[2],80,&dt[3] }; main() { p=aa; printf("%d\n", ++p->x ); printf("%d\n", (++p)->x); printf("%d\n", ++( *p->y)); } A) 10 B) 50 C) 51 D) 60 20 60 60 70 20 21 21 31 (59) 有以下程序: #include union pw { int i; char ch[2]; } a; main() { a.ch[0]=13; a.ch[1]=0; printf("%d\n",a.i); } 程序的输出结果是(注意: ch[0]在低字节,ch[1]在高字节。) A) 13 B) 14 C) 208 D) 209 (60) 设有以下语句: struct st {int n; struct st *next;}; static struct st a[3]={5,&a[1],7,&a[2],9,'\0'},*p; p=&a[0]; 则表达式 【60】 的值是6。 A)p + + ->n B) p->n + + C) (*p).n + + D) + + p->n
二、填空题: (1)以下程序运行后的输出结果是 【1】 。 struct NODE { int num; struct NODE *next; } ; main() { struct NODE s[3]={{1, '\0'},{2, '\0'},{3, '\0'}}, *p, *q, *r; int sum=0; s[0].next=s+1; s[1].next=s+2; s[2].next=s; p=s; q=p->next; r=q->next; sum+=q->next->num; sum+=r->next->next->num; printf("%d\n", sum); } (2)以下程序运行后的输出结果是【2】 。 struct NODE { int k; struct NODE *link; }; main() { struct NODE m[5],*p=m,*q=m+4; int i=0; while(p!=q) { p->k=++i; p++; q->k=i++; q--; } q->k=i; for(i=0;i<5;i++) printf("%d",m[i].k); printf("\n"); } (3) 以下程序的运行结果是【3】 # include typedef struct student{ char name[10]; long sno; float score; }STU; main( ) { STU a={“zhangsan”,2001,95},b={“Shangxian”,2002,90},c={“Anhua”,2003,95},d,*p=&d; d=a; if(strcmp(a.name,b.name)>0) d=b; if(strcmp(c.name,d.name)>0) d=c; printf(“%ld%s\n”,d.sno,p->name); } (4) 已有定义如下: struct node { int data; struct node *next;| } *p; 以下语句调用malloc函数,使指针p指向一个具有struct node类型的动态存储空间。 请填空。 p=(struct node *) malloc( 【4】 ); (5) 设有以下定义 struct ss { int info;struct ss *link;}x,y,z; ![]() 且已建立如下图所示链表结构:请写出删除点y的赋值语句【5】 。 (6) 下面程序的运行结果是: [6] 。 typedef union student { char name[10]; long sno; char sex; float score[4]; }STU; main() { STU a[5]; printf(“%d\n”,sizeof(a)); } (7) 以下定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针.请将定义补充完整。 struct node {int info; 【7】 link; } (8) 以下程序段用于构成一个简单的单向链表,请填空。 struct STRU { int x, y ; float rate; 【8】 p; } a, b; a.x=0; a.y=0; a.rate=0; a.p=&b; b.x=0; b.y=0; b.rate=0; b.p=NULL; (9) 若有如下结构体说明: struct STRU { int a, b ; char c; double d: struct STRU p1,p2; }; 请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型 【9】 t[20]; (10) 以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。 struct st { char name[20]; double score; }; main() { struct st ex; printf(“ex size: %d\n”,sizeof(【10】 )); }
(11) 设有以下结构类型说明和变量定义,则变量a在内存所占字节数是 [11] 。 Struct stud { char num[6]; int s[4]; double ave; } a,*p; (12) 有以下定义和语句,则sizeof(a)的值是 【12】 ,而sizeof(a.share)的值是 【13】 struct date{ int day; int month; int year; union{int share1 float share2; }share; }a; (13) 若以下定义和语句,则sizeof(a)的值是 【14】 ,而sizeof(b)的值是 【15】 struct { int day; char mouth; int year;} a, *b; b=&a; (14) 变量root有如图所示有存储结构,其中sp是指向字符串的指针域,next 是指向该结构的指针域,data用以存放整型数. 请填空 , 完成此结构的类型说明和变量root的定义 sp next data ┌─┬─┬─┐ root│ │ │ │ └─┴─┴─┘ struct list { char *sp; 【16】 ; 【17】 ; }root; (15) 有以下说明定义和语句,可用a.day引用结构体成员day, 请写出引用结构体成员a.day的其它两种形式 【18】 、【19】 。 struct{int day;char mouth;int year;}a,*b; b=&a; (16) 现有如图所示的存储结构,每个结点含两个域,data是指向字符串的指针域,next是指向结点的指针域。请填空完成此结构的类型定义和说明。 struct link {【20】 ; 【21】;} *head; (17) 以下函数creat用来建立一个带头结点的单向链表,新产生的结点总是插在链表的末尾。单向链表的头指针作为函数值返回.请填空: #include struct list { char data; struct list * next; }; struct list * creat() { struct list * h,* p,* q; char ch; h=【22】 malloc(sizeof(struct list)); p=q=h; ch=getchar(); while(ch!='?') { p=【23】 malloc(sizeof(struct list)); p->data=ch; p->next=p; q=p; ch=getchar(); } p->next='\0'; 【24】 (18) 下面min3函数的功能是:计算单向循环链表first中每3个相邻结点数据域中值的和,返回其中最小的值。请填空。 struct node {int data; struct node * link;}; int min3(struct node * first) { struct node *p=first; int m,m3=p->data+p->link->data+p->link->link->data; for(p=p->link; p! =first; p= 【25】 ) int m,m3=p->data+p->link->data+p->link->link->data; { m=p->data+p->link->data+p->link->link->data; if( 【26】 ) m3=m;} return(m3);} (19) 若有以下说明和定义语句,则变量w在内存中所占的字节数是 【27】 。 union aa { float x, y; char c[6]; }; struct st { union aa v; float w[5]; double ave; } w; (20) 为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是向结点的指针域),请填空。 data next struct link { char data; 【28】 } node; (21) 以下程序建立了一个带有头结点的单向链表,链表结点中的数据通过键盘输入,当输入数据为-1时,表示输入结束(链表头结点的data 域不放数据,表空的条件是ph->next = = NULL). #include struct list { int data;struct list *next;}; 【29】 creatlist() { struct list *p,*q,*ph; int a; ph=(struct list *) malloc(sizeof(struct list)); p=q=ph; printf("Input an integer number,enter –1 to end:\n"); scanf("%d",&a): while(a!=-1) { p=(struct list *)malloc(sizeof(struct list)); p->data=a; q->next=p; 【30】 =p; scanf("%d",&a); } p->next='\0'; return(ph); } main() { struct list *head; head=creatlist();}
答案: 一、选择题: 1) C 2) D 3) A 4) B 5) C 6) C 7) D 8) C 9) D 10) C 11) A 12) B 13) B 14) A 15) C 16) B 17) B 18) B 19) A 20) B 21) A 22) D 23) B 24) B 25) C 26) D 27) B 28) A 29) D 30) B 31) C 32) D 33) D 34) B 35) C 36) B 37) D 38) C 39) A 40) B 41) B 42) C 43) B 44) A 45) D 46) B 47) B 48) B 49) A 50) D 51) B 52) B 53) D 54) D 55) B 56) C 57) C 58) C 59) A 60) D 二、填空题: (1) 5 (2) 13431 (3) 2002Shangxian (4) sizeof(struct node ) (5) x,link=&z或x.link=y.ink (6) 80 (7) struct node * (8) Struct STRU* (9) Struct STRU (10) struct st 或ex (11) 22 (12) 10 (13) 4 (14) 5 (15) 2 (16) struct list *next (17) int data (18) (*b).day (19) b->day (20) char *data (21) struct link *next (22) (struct list *) (23) (struct list *) (24) return(h); 或 return h; (25) p->link (26) mm或m<=m3或m3>=m (27) 34 (28) struct link *next (29) struct list * (30) q |
|
![]() ![]() |