实验十五结构体和共用体 级 姓名 指导老师 成绩 第 机房 号机器时间: 实验目的:1.理解结构体和共用体的定义方式和内存分配情况, 2.掌握指向结构体的类型数据的指针定义与使用 3.掌握链表的建立、插入和删除等操作, 实验要求:上机实验前,认真预习实验内容,先人工分析程序写出应得分析结果,然 上机运行、调试程序,得出最终正确结果 实验内容 、读程序 要求:编辑下面源程序,并且读懂与分析运行程序,上机运行程序,并与分析结果相 对比 #inc stdio. h> void fint x,y }cnum[2]={1,3,2,7}; printf ("\nsa", cnum[o] y/cnum[o]. x*cnum[1].x) 分析结果 includesstdio h main() I static struct s Isxl=f"abc","def"); static struct sy (char *cp; struct sx sx2
实验十五 结构体和共用体 班级______________姓名___________指导老师_____________成绩___________ 第_____________机房___________号机器 时间:________________________ 实验目的:1. 理解结构体和共用体的定义方式和内存分配情况。 2. 掌握指向结构体的类型数据的指针定义与使用。 3. 掌握链表的建立、插入和删除等操作。 实验要求:上机实验前,认真预习实验内容,先人工分析程序写出应得分析结果,然 后上机运行、调试程序,得出最终正确结果。 实 验 内 容 一、读程序 要求:编辑下面源程序,并且读懂与分析运行程序,上机运行程序,并与分析结果相 对比。 1. #include void main( ) { struct complex {int x,y; }cnum[2]={1,3,2,7}; printf(“\n%d”,cnum[0].y/cnum[0].x*cnum[1].x); } 分析结果 运行结果 2. include main() { static struct SX {char c[4],*x; }sx1={“abc”,”def”}; static struct SY {char *cp; struct SX sx2;
第一部分c语言程序设计上机指导 printf("sxl.c[o]=sc\t *sxl. x=&s\n",sxl.c[o],*sxl.x) printf("syl. cp=ss\t syl sx2. x=%s\n", syl. cp, syl sx2.x) printf("++sy1 cp=ss\t ++syl sx2.x=x\n",++sy1 cp, ++sy1 sx2.x) 分析结果 运行结果 include union [2] printf("g. i=%x\n",g. i printf(”g,s[0]=影x,g.s[1]=旨x\n”,g.s[0],g.s[1]) g.s[0]=1;g.s[1]=0; printf("g. i=x\n", g. i) 运行结果 #include struct stru void func(struct stru b) cntf("\nd, sc/n void func(struct stru b) [b b.c=y′ 析结果
第一部分 C 语言程序设计上机指导 ·83· ·83· }sy1={“ghi”,{“jkl”,”mno”}}; printf(“sx1.c[0]=%c\t *sx1.x=%s\n”,sx1.c[0],*sx1.x); printf(“sx1.c=%s\t sx1.x=%s\n”,sx1.c,sx1.x); printf(“sy1.cp=%s\t sy1.sx2.x=%s\n”,sy1.cp,sy1.sx2.x); printf(“++sy1.cp=%s\t ++sy1.sx2.x=%x\n”,++sy1.cp,++sy1.sx2.x); } 分析结果 运行结果 3. # include void main( ) { union {char s[2]; int i; }g; g.i=0x4142; printf(“g. i=%x\n”,g. i); printf(“g. s[0]=%x, g. s[1]=%x\n”, g. s[0],g.s[1]); g.s[0]=1; g.s[1]=0; printf(“g. i=%x\n”, g. i); } 分析结果 运行结果 4. #include struct stru {int x; char c; }; void func(struct stru b); void main( ) {struct stru a={10,’x’}; func(a); printf(“\n%d,%c/n”,a.x,a.c); } void func(struct stru b) {b.x=20; b.c=’y’; } 分析结果 运行结果
·84· C语言程序设计上机指导与同步训练 #include struct data fint int void main () int i, j struct data array [n], temp; printf("输入10个整数:") scanf("d", &array [i]. num) for(i=0;iarray [j+1]. num Temp=array [jl j+1] printf(输出结果\n"); printf(”序号值原序号\n”); printf ("83d84ds4d\n",i, array [i]. num, array [i]. no)i printf("\n”) #include int y; }s【2]={{1,2},{3,4}},*p=s printf(Mnd",++p→x) printf("\ntd”,(++p)→x) 两条 printf语句改为一条: printf"hn%d%d”,++p→x,(+p)→x),重新运行程序
·84· C 语言程序设计上机指导与同步训练 ·84· 5. #include #define n 10 struct data {int no; int num; }; void main() { int i,j; struct data array[n],temp; printf(“输入 10 个整数:”); for(i=0;iarray[j+1].num) {temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } printf(“输出结果\n”); printf(“序号 值 原序号\n”); for(i=0;i main() {struct {int x; int y; }s[2]={{1,2},{3,4}},*p=s; printf(“\n%d”,++p→x); printf(“\n%d”,(++p)→x); } 两条 printf 语句改为一条:printf(“\n%d,%d”, ++p→x, (++p) →x);重新运行程序。 分析结果 运行结果
第一部分c语言程序设计上机指导 分析结果 运行结果 #include stdio int x Jin in e. ln 析结果 二、完成程序 要求:依据题目要求,分析已给出的语句,填写空白。但是不要增行或删行,不要改 动程序的结构 编程:输入一个长整数,分别取出该数各字节的值。 void main() union data vali int i, ns=sizeof(long) printf("输入一个长整数:”); printf("各字节如下:;\n) printf("第d个字节:号s\n”,i,va1.s[i])
第一部分 C 语言程序设计上机指导 ·85· ·85· 分析结果 运行结果 7. #include void main() { struct example { union { int x; int y; }in; int a; int b; }e; e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(“\n%d,%d”,e.in.x, e.in.y); } 分析结果 运行结果 二、完成程序 要求:依据题目要求,分析已给出的语句,填写空白。但是不要增行或删行,不要改 动程序的结构。 1. 编程:输入一个长整数,分别取出该数各字节的值。 #include union data { char s[5]; long n; }; void main() { union data val; int i, ns=sizeof(long); printf(“输入一个长整数:”); scanf( ); printf(“各字节如下:;\n) for(i=0;i<ns;i++) printf(“第%d 个字节:%s\n”, i, val.s[i]); printf(“\n”); }
C语言程序设计上机指导与同步训练 2.编程:输入一串整数,以0标识结束,将输入的整数构成一个单链表并显示输出 #include #define null 0 struct node int da struct node *nexti int d; struct node *h=null, *r,*s: printf("创建单链表\n”); printf(“输入整数:”) scant(wd”,&d); if(d==) break if(h==null) h=s;r=s;/*h指向单链表的第一个节点*/ x->next=s;x=s;/*r始终指向最后一个结点*/ 3.输入三角形三边长的值ab,c,求周长和面积 #include float b main( truct triand printf(tra.a=旨f,tra.b=旨f,tra.c=号f\n”,tra.a,tra.b,tra.c); Ecom(tra) printf("%d\n",tra. a)
·86· C 语言程序设计上机指导与同步训练 ·86· 2. 编程:输入一串整数,以 0 标识结束,将输入的整数构成一个单链表并显示输出。 #include #include #define null 0 struct node { int data; struct node *next; }; struct node *create ( ) { int d; struct node *h=null,*r,*s; printf(“创建单链表\n”); while(1) {printf(“输入整数:”); scanf(“%d”,&d); if(d==0) break; ______________; s->data=d;s->next=null; if(h==null) { h=s;r=s; /*h 指向单链表的第一个节点*/ } else { r->next=s;r=s; /*r 始终指向最后一个结点*/ } } return h; } 3. 输入三角形三边长的值 a,b,c, 求周长和面积。 #include { float a; float b; float c; }; main( ) { struct triangle tra; tra.a=13.5; tra.b=16.5; tra.c=21; printf(“tra.a=%f,tra.b=%f,tra.c=%f\n”,tra.a,tra.b,tra.c); fcom(tra); printf(“%d\n”,tra.a);
第一部分c语言程序设计上机指导 87 int fcom(d) iangle d 4.输入年、月、日后,计算它是该年的第几天 struct date int month static int day tab[2][13]={{0,31,28,31,30,31,30,31, 31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}}; i int i, leap struct date *pd; printf("Enter year/month/day: " scanf(”d/器d/暑d",&(*pd).year,&(*pd). month,&(*pd.day) 1eap=pd→year4=0&pa→year暑1001=0lpd→year8400==0 pd-yesterday= for (i=0; i struct studentinf [long student num har name [10] int age. float score char addr [30]i void print score(struct studentinfo *st printf("852f", st->score);I [struct studentinfo stu=(20050506, "Li",18,'M, 86.,"Rm305 Bldg4")
第一部分 C 语言程序设计上机指导 ·87· ·87· } int fcom(d) struct triangle d; { float p,s; p=d.a+d.b+d.c; p=p/2; s=p*(p-d.a)*(p-d.b)*(p-d.c); s= ; printf(“perimeter=%f,area=%f”,p,s); } 4. 输入年、月、日后,计算它是该年的第几天。 #include struct date { int day; int month; int year; int yesterday; char mon_name[3]; }; static int day_tab[2][13]={{0,31,28,31,30,31,30,31, 31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}}; main( ) { int i, leap; struct date *pd; printf(“Enter year/month/day:”): scanf(“%d/%d/%d”,&(*pd).year,&(*pd).month,&(*pd.day); leap=pd→year%4==0&&pd→year%100!=0¦¦pd→year%400==0; pd→yesterday=____________; for(i=0;i struct studentinfo {long student_num; char name[10]; char sex; int age; float score; char addr[30]; }; void print_score(struct studentinfo *st) {printf(“%5.2f”,st->score);} main() {struct studentinfo stu={20050506, “Li”,18, ‘M’,86.5, “Rm305 Bldg4”};
C语言程序设计上机指导与同步训练 6.建立一个链表并遍历。 #include #define n 4 main( istruct node [char ch struct node *nexti *first, *last, *p int i char ch p=(struct node*)malloc(sizeof (struct node)) ch=getchar( )i p->ch=ch; p->next=null first=last=p i=2;ic last->next=p p=firs while(pl=null) lputchar(p->ch)i putchar(') 7.有N个学生,每个学生的信息包括:学号、性别、姓名、四门课的成绩,从键盘上 输入N个学生的信息,要求输出总平均成绩最高的学生信息,包括学号、性别、姓名和平 均成绩。 #include #define n 3 struct student I long stunum; char sex char name[15]i nt score [4] float average main( i int i,j,index float sum, max struct student starr [201 88
·88· C 语言程序设计上机指导与同步训练 ·88· ______________; } 6. 建立一个链表并遍历。 #include #define n 4 main( ) {struct node {char ch; struct node *next; }*first,*last,*p; int i; char ch; p=(struct node*)malloc(sizeof(struct node)); ch=getchar( ); p->ch=ch; p->next=null; first=last=p; for(i=2;ich=ch; p->_______; last->next=p; last=p; } p=first; while(p!=null) {putchar(p->ch); putchar(‘’); p=_______; } } 7. 有 N 个学生,每个学生的信息包括:学号、性别、姓名、四门课的成绩,从键盘上 输入 N 个学生的信息,要求输出总平均成绩最高的学生信息,包括学号、性别、姓名和平 均成绩。 #include #define n 3 struct student { long stunum; char sex; char name[15]; int score[4]; float average; }; main( ) { int i,j,index; float sum,max; struct student stuarr[20];
第一部分c语言程序设计上机指导 for(i=0: i main ( int("an”,ize0f(m) 运行结果 错误 错误所在: #include I union example
第一部分 C 语言程序设计上机指导 ·89· ·89· for(i=0;imax) {max=stuarr[i].average; index=i; } printf(“总平均成绩最高的学生信息是学号=%ld 性别 =%c 姓名=%s 平均成 绩=%4.1f”,stuarr[index].stunum,stuarr[index].sex,stuarr[index]. name,stuarr[index].average); } 三、调试程序 要求:调试运行下列程序是否正确,若有错,写出错在何处?填写正确的运行结果。 1. #include main () { union { long a; int b[5]; char c; } m printf(“%d\n”,sizeof(m)); } 正确 运行结果: 错误所在: 错误 应改为: 2. #include main() { union example
C语言程序设计上机指导与同步训练 int xi b e. in ate.b printf ("\ngd, d",e.in.x,e. in y) 运行结果: 错误所在 #include union DATE int k[5] char c struct date int cat double dog printf("\nsd\n",sizeof (date)+sizeof (max)) 行结果 错误所在 错误 4 #include struct st nt yi p ints[1={10,20,30,40}; struct st a【[]={1,&s【0],2,&s[1],3,&s[2],4,&s[3]}
·90· C 语言程序设计上机指导与同步训练 ·90· { struct { int x; int y; }in ; int a; int b; } e; e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(“\n%d,%d”,e.in.x,e.in.y); } 3. #include union DATE { long i; int k[5]; char c; }max; struct date { int cat; int cow; double dog; } too ; void main ( ) { printf(“\n%d\n”,sizeof(date)+sizeof(max)); } 正确 运行结果: 错误所在: 错误 应改为: 4. #include struct st {int x; int y; }*p; int s[ ]={10,20,30,40}; struct st a[ ]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]}; 正确 运行结果: 错误所在: 错误 应改为:
第一部分c语言程序设计上机指导 printf("\nd",p→x) printf("\n暑d",(++p)→x) printf("\n d",++(*(++ p)-y) 错误所在 错误 5.该 delete函数实现将链表中的指定数值的结点删除掉,找出其中的错误语句。 struct list *delete(head struct list *head int key; void free( struct list p,g; while(p!=NULL&&p->datal=key) g-p p=p>next if(p==NULL) return(NULL)i if(p=shead eseq→next=p free (p)i return(head) 正确 错误 错误所在 应改为 #include struct sI [char*sl nt 1 struct s *sI s1a[]={{"abcd",1,a+1},{"efgh”,2,a+2},{"ijk1”,3,a}
第一部分 C 语言程序设计上机指导 ·91· ·91· void main( ) {p= a; printf("\n %d", p→x); printf("\n %d",(++ p)→x); printf("\n %d",*(++ p)→y); printf("\n %d",++(*(++ p)→y)); } 正确 运行结果: 错误所在: 错误 应改为: 5. 该 delete 函数实现将链表中的指定数值的结点删除掉,找出其中的错误语句。 struct list *delete(head,key) struct list *head; int key; { void free( ); struct list p,q; p=head; while(p!=NULL&&p->data!=key) { q=p; p=p->next; } } if(p==NULL) return(NULL); if(p==head) h=head→next; else q→next=p→next; free(p); return(head); } 正确 运行结果: 错误所在: 错误 应改为: 6. #include struct s1 {char *s1; int i; struct s1 *s1p; }; main( ) { s1 a[ ]={{“abcd”,1,a+1},{“efgh”,2,a+2},{“ijkl”,3,a} };