《C语言程序设计上机指导书》1上机7结构体与共用体一、目的掌握结构体类型、共用体类型以及相应类型变量的定义方法和引用方法。学习运用链表解决实际问题。二、要求1.掌握结构体类型与结构体变量的定义、引用和初始化方法。2.熟悉结构体与共用体的区别。三、内容及步骤1、程序s7-1.c是按学生姓名查询其排名和平均成绩,查询可连续进行,直到键入0时结束。试完善该程序。#includestdio.h#includestring.h#defineNUM4structstudent{intrank;char*name;floatscore;};structstudentstu[]={3,”Tom”,89.5,4,”Mary”,76.5,1,”Jack”,98.0,2,”Jim”,92.0};voidmain(){charstr[10];inti;do{printf(“Enteraname:”);……}}【指导】连续查询可以在do循环语句中实现。其算法步骤如下:①输入一个学生姓名;②与已知结构体数组中的姓名进行比较。如果找到与输入的学生姓名相同者,则输出该学生的姓名、排名和平均成绩;③如果查找的人数大于等于NUM,则输出:Notfound;④如果输入的学生姓名是0,则结束查询,程序运行结束;否则转向①继续执行。注意:这里的转向构成了循环,可以用循环语句实现。《C语言程序设计上机指导书》2源程序s7-1.c:#includestdio.h#includestring.h#defineNUM4structstudent{intrank;char*name;floatscore;};structstudentstu[]={3,Tom,89.5,4,Mary,76.5,1,Jack,98.0,2,Jim,92.0};voidmain(){charstr[10];inti;do{printf(Enteraname:);scanf(%s,str);for(i=0;i4;i++)if(!strcmp(str,stu[i].name))printf(%s的排名:%d,平均分为:%.1f\n,str,stu[i].rank,stu[i].score);}while(*str!='0');}《C语言程序设计上机指导书》32、有4名学生,每人有两门课程的考试成绩。试完善程序s7-2.c,编写函数index()检查总分高于160分和任意一科不及格的两类学生,将结果输出到屏幕上,并写出运行结果。#includestdio.hstructstudent{charname[10];intnum;floatscore1;floatscore2;}stu[4]={{“李一”,1,84.0,82.0},{“王二”,2,71.0,73.0},{“赵三”,3,90.0,68.0},{“刘四”,4,67.0,56.0}};voidmain(){structstudent*p;intindex(structstudent*pt);p=stu;index(p);}【指导】①调用函数index()时,实参是结构体指针变量。因此,定义函数index()时,形参也应该是一个同类型的结构体指针变量,例如structstudent*pt。②程序要检查两类学生:总分高于160分和任意一科不及格的。可以分别用两条for循环语句for(i=0;i4;i++,pt++)来实现。③总分高于160分可以表示为pt-score1+pt-score2160;任意一科不及格可以表示为pt-score160||pt-score260。intindex(structstudent*pt){inti;floatsum;printf(总分高于160的学生有:);for(i=0;i4;i++){sum=stu[i].score1+stu[i].score2;if(sum160)printf(%s\n,stu[i].name);}printf(不及格的学生有:);for(i=0;i4;i++)if(stu[i].score160||stu[i].score260)printf(%s\n,stu[i].name);return0;}《C语言程序设计上机指导书》43、分析并测试下列程序的输出结果。#includestdio.hvoidmain(){union{inta;intb;}s[3],*p;intn=1,k;for(k=0;k3;k++){s[k].a=n;s[k].b=s[k].a*2;n+=2;}p=s;printf(%d,%d\n,p-a,++p-a);}程序输出的结果为:共用体所有元素共用一个储存区域,故a,b没有区别。【指导】注意理解共用体的内存分配和正确使用。四、编程1.结构体变量的成员包括年、月、日,输入日期并计算该日是当年中第几天。源程序1:#includestdio.hstructdate{intyear;intmonth;intday;}a;voidmain(){inti=0;printf(请输入日期,用空格间隔\n);scanf(%d%d%d,&a.year,&a.month,&a.day);switch(a.month){case12:i=30;case11:i+=31;case10:i+=30;case9:i+=31;case8:i+=31;case7:i+=30;case6:i+=31;case5:i+=30;case4:i+=31;case3:(a.year%400==0)||(a.year%4==0&&a.year%100==0)?(i+=29):(i+=28);《C语言程序设计上机指导书》52.使用结构体变量输入学生姓名、学号及三门课的成绩,计算各自的平均成绩。源程序2:#includestdio.hstructstudent{charname[20];intnum[20];floatscore1,score2,score3;}a[3];voidmain(){inti;floatsum[3];for(i=0;i3;i++){printf(请输入学生姓名:);gets(a[i].name);printf(请输入学生学号:);gets(a[i].num);printf(请输入学生成绩:);scanf(%f%f%f,&a[i].score1,&a[i].score2,&a[i].score3);sum[i]=a[i].score1+a[i].score2+a[i].score3;getchar();}for(i=0;i3;i++)printf(%s的平均成绩是:%.1f\n,a[i].name,sum[i]/3);}《C语言程序设计上机指导书》6