搜索
您的当前位置:首页正文

C语言程序设计实例教程第2版习题答案作者李红第9章结构体和共用体.doc

来源:筏尚旅游网
9.4课后习题

9.4.1项目练习

一. 练习目的

1. 进一步巩固结构体类型和共用体类型的定义与引川 2. 进一步复习链表的建立过程

3. 进一步巩固枚举类型的定义与枚举元索的引用方法 二. 练习内容

1. 用结构体变量表示平面上的一个点(横坐标和纵坐标),输入两个点,求两点Z间的 距离。

#include \"stdio.h\" include \"math.h\" struct pin {float x; float y; }a,b; main()

{

printfC*请输入a点的横纵坐标:“); scanf(\"%f%f\"/&a.x,&a.y); printfC'Xn\");

printf(\"请输入b点的横纵坐标 scanf(,,%f%f\"/&b.x,&b.y); printf(\"\\nn);

printff\"输出 a、b 两点之间的距离是:%f\getch(); }

2. 16个同学围成一-圈,从笫1个人开始按1、2、3的顺序报号,凡报到3者退出圈子。 找

出最后昭在圈子中的人原来的序号。 ttinclude \"stdio.h\" #include \"stdlib.h\"

#define LEN sizeof(struct game) struct game{

int num;

struct game *next;}; struct game *creat() { struct game *head,*p;

head=p=(struct game *) malloc(LEN); p->num=l; int i=2;

while(i<=16)

{ p・>next=(struct game *) malloc(LEN);

p->next-:>nu m=i;

i++; p=p->n ext;

}

p->next=head; return(head);} struct game *delete(struct game *head) { struct game *pl=head,*p2=head,*x; int k=l;

while(pl->next!=pl) {

if(k==3) {

x=pl; pl=pl->next;

p2・>n ext=pl; free(x); x=NULL; k=0; } else {

P2=pl; pl=pl->next;

}

pl->next=NULL; return(pl);

}

void print(struct game *head) { struct game *p;

p=head; while(p!=NULL) {

printf(\"%d\\p=p->n ext; }

printfCAn\"); }

main()

{ struct game *pt,*p;

pt=creat(); p=delete(pt); print(p); free(p); getch(); }

3. 建立一个链表,每个结点包含的成员为:职工号、工资。用malloc函数开辟新结点。 要

求链表包含5个结点,从键盘输入结点中的数据。然后把这些结点的数据打印出来。耍求 用函数creat来建立函数,用list函数来输出数据。这5个职工的号码为10,11,12,13,14。用 insert函数來新增一•个职工的数据,这个新结点,按职工号顺序插入。用delete函数來删除 一个结点。

# in elude #include

struct Worker { int num; float pay;

struct Worker *next;

}; int n; int main() {

struct Worker *head,*create(void); void list(struct Worker*); head=create(); list(head); return 0; }

struct Worker *create(void) {

struct Worker *head, *pl, *p2; printf(\"create a linked list:\\n\"); head=0; n=0;

pl=p2=(struct Worker*)malloc(sizeof(struct Worker)); scanf(\"%d%f\"z&pl->numz&pl->pay); while(pl->num!=0) { n++;

讦(n二=l)head 二 pl;

else p2->next=pl;

p2=pl;

pl=(struct Worker*)malloc(sizeof(struct Worker)); scanf(\"%d%f\}

p2・>n ext=0; free(pl); return head;

void list(struct Worker *p) {

printff'The linked list:\\n\"); while( p!=0) {

printf(\"\\n%\%f\p=p->n ext; } }

9.4.2练习题

一 •填空题

1. 若程序中有下面的说明和定义

struct abc

{int x;char y;} struct abc sl,s2;

则会发生的情况是(A )0

(A)

编译出错 (B)程序将顺利编译、连接、执行

(C)能顺利通过编译、连接、但不能执行 (D)能顺利通过编译,但连接出错

2. 以下scanf函数调用语句屮对结构体变量成员的不正确引用是(D )。 struct pupil

{ char name[20]; int age; int sex;} pup[5],*p; p=pup; (A) scanf(\"%s\(B) scanf(\"%cT,&pup[O].age); (C) scanf(”%d”,&(p・>sex));

(D) scanf(\"%d\

3. 以下对结构体变量stul中成员age的非法引用是(B )。 struc stude nt

{int age; int num; }stulz*P; p=&stul; (A) stul.age

(B) student.age

(C) p->age (D) (*p).age

4. 设有以下说明和定义语句,贝U下面表达式中值为3的是(D )0 struct s

{int il; struct s *i2;};

struct s a[3]={l,&a[l],2,&a[2],3/&a[O]},*ptr; ptr=&a[l];

(A) ptr->il++ (B) ptr++->il (C) *ptr->il (D) ++ptr->il

5. 若要利用下面的程序片段使指针变量p指向一•个存储整型变量的存储单元,则空中应填

入的内容是(D )o

int *p; p= __________________ malloc(sizeof(int)); (A) int

(B) int *

(C) (*int) (D) (int *)

6. 设有如下定义: struct sk

{int n; float x;}data,*p;

若要使p指向data中的n域,正确的赋值语句是(C )。

(A) p二&data.n;

(B) *p=data.n;

(C) p=(struct sk *)&data.n; (D) p=(struct sk *)data.n;

7. 设有以下语句: struct st

{int n; struct st *next; };

struct st a[3]={5,&a[l],7,&a⑵,9,、0'},*p; p=&a[0];则以卜•表达式的值为 6 的是(D )。 (A) p++->n

(B) p->n++

(C) (*p).n++

(D) ++p->n

&以下程序的输出结果是(C )。

struct stu {int x; int *y;

}*p;

int dt[4]={10,20,30,40};

struct stu a[4]={50,&dt[0],60,&dt⑴,70,&dt[2],80,&dt[3]}; main()

{ p=a; printf(H%d\,,/(++p)->x); printf(\"%d\\n,,/++(*p->y));} (A) 50,20,20

(B) 50,20,21

(C) 51,60,21

(D) 51,60,31

9. 以下对C语言屮共用体类型数据的叙述正确的是(C )o

(A)可以对共有体变量名直接赋值 (B) —个共用体变量中可以同时存放其所有成员

(C) 一个共有体变量中不能同时存放其所有成员 (D) 共用体类型定义中不能出现结构体类型的成员

10. 当说明一个共用体变量时系统分配给它的内存是(C )o

(A)各成员所需内存量的总和 (B)结构中第一个成员所需内存量

(C)成员中占•内存罐最人者所需的容罐 (D)结构屮最示一个成员所需内存罐 11. 若有下而的说明和定义,则sizeof(struct aa)的值是(D )。

struct aa

{int rl;double r2; float r3;

union uu{char ul[5]; long u2[2];} ua; }mya; (A) 30

(B) 29

(C) 24

(D) 22

12. 字符O的ASCII码的十进制数为48,且数组的第0个元素在低位,则以下程序的输出结果

是(B )。

main()

{union {int i[2];long k;char c[4];}r,*s=&r; s->i[0]=0x39;

s->i[l]=0x3 & printf(ll%cll/s->c[O]); (A) 39 getch();}

13-设冇以下定义:

DATE max;

(B) 9

(C)

38

(D) 8

typedef union {long i;int k[5];char c;}DZYTE; struct date {int cat;DATE cow;double dog;}too;

则下列语句的执行结果是(A )o

(A) 25 (B) 30 (C) printf(,,%d,,,sizeof(struct date)+sizeof(max));

18

(D)

8

(B) enum a {one=9,two=-l,three}; (A) enum a二{one,two,three};

14. 以下対枚举类型名的定义中正确的是(B )o

,,,,(C) enum a二{”one”,”two“/three”}; (D) enum a {\"one7two7three,'};

15. 设有定义enum date {year, month, day} d ;则卜列叙述屮正确的是( A )。 (A) date是类型、d是变量、year是常量 (B) date是类型、d和year是变量 (C) date和d是类型、year是常最 (D) date和d是变量、year是常量

16. 设有定义enum date {year, month, day} d ;则正确的表达式是(B )。

(A) year=l (B) d=year (C) d=\"yearn (D) date=\"year\" 二•填空题

1.若有定义: struct num {int a; int b; float f; }n={l,3,5.0};

struct num *pn=&n;

则表达式pn->b/n.a*++pn->b的值是( 12 )。表达式(*pn).a+pn->f的值是 (0 )o

3. 以下程序的运行结果是(7,3 )。 struct ks

{int a; int *b; }s[4],*p; main() {int n

printf(H\\n\"); for(i=0;i<4;i++) {s[i].a=n;

s[i].b=&s[i].a; n二 n+2; } P=&s[O]; p++;

pnntf(\"%d/%d\\n\getchf);}

4. 结构数组屮存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请 在 ______ 内填入正确内容。 struct man{

char name[20];

int age; }person[]={llli=ming,\\18/ \"wang-hua11,!^ zhang-pingu,20 };

main()

{struct man *p,*q; int old=0 p=pers on;

for( !=person⑶ ;p++) if(oldage)

{q=p; (old 二 p->age) _______ ;} prin tf(\"%s %d':

___________ ); }

5. _______________________________ 以下程序段的功能是统计链表中结点的个数,

其中first为指向第一个结点 的指针(链表不带头结点)。请在 内填入正确内容。 struct link {char data;

struct link *next;

}; • • • •

struct link *p,*first; int c=0; p=first;

whil e( !=NULL ________ )

{ C++ _____________ ;

p 二 _________ ;}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top