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 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(old {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 二 _________ ;} 因篇幅问题不能全部显示,请点此查看更多更全内容