第9章结构体类型与共用体类型习
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
及
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
第九章结构体类型与公用体类型习题及其答案
9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。
解:#include "stdio.h"
struct date
{
char month[10] ;
int daynumber ;
}
main()
{
int i ;
date a[12]
={{"January",31},{"February",29},{"March",31},{"
Aprial",30},{"May",31},{"June",30},{"july",31},{&qu
ot;August",31},{"September",30},{"October",31},{"Novemb
er",30},{"December",31}} ;
for(i=0;i<12;i++);
printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; }
思考:如何对结构体变量进行初始化,对结构体变量的引用为何要体现为分量(或成员)的引用,
9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。
解:#include "stdio.h"
#include "math.h"
struct point
{
float x ;
float y ;
float z ;
}
void main()
{
double d1,d2,d ;
point p1,p2 ;
printf("请输入第一个点的坐标:");
scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z);
printf("请输入第二个点的坐标:");
scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z);
d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z);
d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);
d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*(p2.z-p1.z));
printf("第一个点到原点的距离:%f\n",d1);
printf("第二个点到原点的距离:%f\n",d2);
printf("两点间的距离:%f\n",d);
}
9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。
解:#include "stdio.h"
struct AddressBook
{
char name[10] ;
char address[30] ;
char mailnumber[7] ;
char telphone[12] ;
char byphone[16] ;
char movephone[1] ;
}
void main()
{
int i ;
AddressBook fd[10] ;
for(i=0;i<10;i++)
{
printf("请输入第%d个朋友的信息:\n",i+1);
printf("姓名:");
scanf("%s",&fd[i].name) ;
printf("地址:");
scanf("%s",&fd[i].address) ;
printf("邮编:");
scanf("%s",&fd[i].mailnumber) ;
printf("电话:");
scanf("%s",&fd[i].telphone) ;
printf("传呼:");
scanf("%s",&fd[i].byphone) ;
printf("手机:");
scanf("%s",&fd[i].movephone) ;
}
for(i=0;i<10;i++)
{
printf("\n第%d个朋友的信息:\姓名:%s\n 地址:%s\n 邮
编:%s\n 电话:%s\n 传呼:%s\n 手
机:%s\n",i+1,fd[i].name,fd[i].address,fd[i].mailnumber,fd[i].telphone,fd[i].byphone,fd[i].
movephone) ;
}
}
思考:结构体类型变量的分量可以是各种基本数据类型(整型、实型、字符型等)或数组类型,是否可以是另一结构体类型,
9-6 用一个数组存放图书信息,每本图书包含书名、作者、出版年月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书的信息,按出版年月排序后输出。
解:#include "stdio.h"
#include "string.h"
struct Book
{
char booktitle[30] ;
char author[10] ;
char publishday[10] ;
char publishunit[22] ;
char lendno[16] ;
char stockno[11] ;
}
#define N 100 //假设图书数量不超过110册 main()
{
int i,j,k,n;
Book ts[N] ,t;
printf("请输入欲处理的图书数量:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入第%d本书的信息:\n",i+1); printf("书名:");
scanf("%s",&ts[i].booktitle) ;
printf("作者:");
scanf("%s",&ts[i].author) ;
printf("出版年月:");
scanf("%s",&ts[i].publishday) ;
printf("出版社:");
scanf("%s",&ts[i].publishunit) ;
printf("借出数:");
scanf("%s",&ts[i].lendno) ;
printf("库存数:");
scanf("%s",&ts[i].stockno) ;
}
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(ts[k].publishday,ts[j].publishday)<0) k=j ; {t=ts[i],ts[i]=ts[j];ts[j]=t;}
}
printf("\n排序后的图书信息:");
for(i=0;i<n;i++)
{
printf("\n书名: %s, 作者: %s, 出版年月: %s, 出版社: %s, 借出数: %s,
库存
数:%s\n",ts[i].booktitle,ts[i].author,ts[i].publishday,ts[i].publishunit,ts[i].lendno,ts[i].stock
no) ;
}
}
思考:在此程序中,ts[N]是一个什么类型的数组,每个数组的元素大约需占多少字节50
void main()
{
int i,n;
struct registerable ts[N] ;
printf("请输入欲录入人员数量:") ;
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入第%d个人的信息:\n",i+1);
printf("姓名:") ;
scanf("%s",ts[i].name);
printf("性别:") ;
scanf("%s",ts[i].sex);
printf("年龄:") ;
scanf("%s",ts[i].age);
printf("婚否(y/n):") ;
scanf("%s",ts[i].marry);
if(ts[i].marry==„y?||ts[i].marry==„Y?)
{
printf("妻子姓名:");
scanf("%s",&ts[i].wifename);
printf("妻子年龄:");
scanf("%s",&ts[i].wifeage);
}
else
{
ts[i].wifename=" " ;
ts[i].wifeage=0 ;
}
}
printf("\n通信录信息
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
:");
printf("\n 姓名 性别 年龄 婚否 妻子姓名 妻子年龄\n") ;
for(i=0;i<n;i++)
{
printf("%8s %c %d %c %8s %d\n",ts[i].name,ts[i].sex,ts[i].age,ts[i]
.marry,ts[i].wifename,ts[i].wifeage);
}
}
思考: 结构体类型变量的分量与其对应类型的一般变量的区别是什么,在使用中有何不同,
9-8 定义一函数output(),输出学生的成绩数组。成绩数组中有20个学生的数据记录,每个记录包括学号、姓名及三门课的成绩。 解:#include "stdio.h"
#include "string.h"
#define STT struct student
STT
{
int no ;
char name[8] ;
int c[3] ;
}
#define N 20
output(STT a[N])
{
int i;
printf("\n学生成绩信息表\n") ;
printf(" 学号 姓名 成绩1 成绩2 成绩3\n") ;
for(i=0;i<N;i++)
{
printf("%6d %8s %3d %3d %3d\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a
[i].c[2]);
}
}
void main()
{
int i ;
STT cs[N] ;
printf("请输入学生的学号、姓名、成绩:");
for(i=0;i<N;i++)
{
printf("第%d个人的信息:\n",i+1);
printf("学号:");
scanf("%d",&cs[i].no) ;
printf("姓名:");
scanf("%d",&cs[i].name) ;
printf("成绩:");
scanf("%d,%d,%d",&cs[i].c[0],&cs[i].c[1],&cs[i].c[2]) ;
}
output(cs) ;
}
思考:能想象在此程序中与结构体STT等同功能语句吗,如果不用结构体,程序怎样描述,
9-9 在上题基础上,定义一个输出函数intput(),用来输入20个学生的数据到成绩数组。
解:#include "stdio.h"
#include "string.h"
#define STT struct student
STT
{
int no ;
char name[8] ;
int c[3] ;
};
#define N 20
int i;
output(STT a[N])
{
printf("\n学生成绩信息表\n") ;
printf(" 学号 姓名 成绩1 成绩2 成绩3\n") ;
for(i=0;i<N;i++)
{
printf("%6d %8s %3d %3d %3d\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a
[i].c[2]);
}
}
input(STT a[N])
{
printf("请输入学生的学号、姓名、成绩:");
for(i=0;i<N;i++)
{
printf("第%d个人的信息:\n",i+1);
printf("学号:");
scanf("%d",&a[i].no) ;
printf("姓名:");
scanf("%d",&a[i].name) ;
printf("成绩:");
scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]) ;
}
}
void main()
{
STT cs[N] ;
input(cs) ;
output(cs);
}
思考:函数的参数可以是结构体类型变量或数组,函数的返回类型也可以是结构体类型吗,
9-10 有十个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生的数据,要求求出:
(1) 每门课的平均成绩。
(2) 每个学生的总分及平均成绩。
解:#include "stdio.h"
#include "string.h"
#define STT struct student
STT
{
int no;
char name[8] ;
int c[3];
int total;
float aver;
};
#define N 10
int i ;
void output(STT a[N])
{
printf("\n学生成绩信息表\n") ;
printf(" 学号 姓名 成绩1 成绩2 成绩3 总分 平均成绩 \n") ;
for(i=0;i<N;i++)
{
printf("%6d %8s %3d %3d %3d %3d %6.2f
\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2],a[i].total ,a[i].aver); }
}
void input(STT a[N])
{
printf("请输入学生的学号、姓名、成绩:");
for(i=0;i<N;i++)
{
printf("第%d个人的信息:\n",i+1);
printf("学号:");
scanf("%d",&a[i].no) ;
printf("姓名:");
scanf("%d",&a[i].name) ;
printf("三门课成绩:");
scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]) ;
a[i].total=a[i].c[0]+a[i].c[1]+a[i].c[2];
a[i].aver=a[i].total/N;
}
}
void main()
{
STT cs[N],av;
input(cs) ;
for(i=0;i<N;i++)
{
av.c[0]=av.c[0]+cs[i].c[0];
av.c[1]=av.c[1]+cs[i].c[1];
av.c[2]=av.c[2]+cs[i].c[2];
av.aver=av.aver+cs[i].aver ;
}
output(cs) ;
printf(" %8s %3d %3d %3d %6.2f\n",av.name,av.c[0]/N,av.c
[1]/N,av.c[2]/N,av.aver/N) ;
}
思考:在此程序中,av是否可以不是结构体类型,若是,请改用其它数据形式进行处理。
9-11 在上题的基础上,要求求出:
(1) 平均分最高的学生的数据。
(2) 每门课高于平均成绩的学生人数。
(3) 每个学生第一门课程与平均成绩的分差。
解:#include "stdio.h"
#include "string.h"
#define STT struct student
STT
{
int no;
char name[8] ;
int c[3];
int total;
float aver,dfen;
};
#define N 3
int i ,j;
void output(STT a[N])
{
printf("\n学生成绩信息表\n") ;
printf(" 学号 姓名 成绩1 成绩2 成绩3 总分 平均成绩 分差\n") ;
for(i=0;i<N;i++)
{
printf("%6d %8s %3d %3d %3d %3d %6.2f %6.2f\n",a[i].no,a[i].n
ame,a[i].c[0],a[i].c[1],a[i].c[2],a[i].total,a[i].aver,a[i].dfen); }
}
void input(STT a[N])
{
printf("请输入学生的学号、姓名、成绩:");
for(i=0;i<N;i++)
{
printf("第%d个人的信息:\n",i+1);
printf("学号:");
scanf("%d",&a[i].no) ;
printf("姓名:");
scanf("%d",&a[i].name) ;
printf("三门课成绩:");
scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]) ;
a[i].total=a[i].c[0]+a[i].c[1]+a[i].c[2];
a[i].aver=a[i].total/N;
}
}
void main()
{
STT cs[N],av;
int max_i=0,rnum[3]={0,0,0};
input(cs) ;
for(i=0;i<N;i++)
{
av.c[0]=av.c[0]+cs[i].c[0];
av.c[1]=av.c[1]+cs[i].c[1];
av.c[2]=av.c[2]+cs[i].c[2];
av.aver=av.aver+cs[i].aver ;
if(av.aver<cs[i].aver)
{
av.aver=cs[i].aver;
max_i=i ; //记录平均分最高的学生
}
}
for(i=0;i<3;i++)
av.c[i]=av.c[i]/N;
for(i=0;i<N;i++)
{
for(j=0;j<3;j++)
if(cs[i].c[j]>av.c[j]) rnum[j]++ ;//统计每门课高于平均成绩的人数
cs[i].dfen=cs[i].c[0]-av.c[0];//计算每个学生第一门课与第一门课平均成绩的分差
}
output(cs) ;
printf(" %8s %3d %3d %3d %6.2f\n",av.name,av.c[0]/N,av.c
[1]/N,av.c[2]/N,av.aver/N) ;
printf("%6d %8s %3d %3d %3d %3d %6.2f %6.2f\n",cs[max_i].no,cs[
max_i].no,cs[max_i].name,cs[max_i].c[0],cs[max_i].c[1],cs[max_i].c[2],cs[max_i].total,cs[max_i
].aver,cs[max_i].dfen) ;
}
思考:如果要计算每个学生第一门课程与该学生的平均成绩的分差,此程序应如何改动,
9-12 有若干个运动员,每个运动员包括编号、姓名、性别、年龄、身高、体重等信息。若性别为男,则运动项目为长跑、登上;若性别为女,则运动项目为短跑、跳绳。用一个函数输入运动员的信息,用另一个函数求每个项目的平均成绩,在用另一个函数输出运动员信息。
解:#include "stdio.h"
#include "string.h"
#define ATH struct athlete
ATH
{
int no ;
char name[8];
char sex;
int age ;
float high ;
float weight ;
float event1 ;
float event2 ;
};
#define N 100
int i ;
output(ATH a[N])
{
printf("\n运动员情况信息表\n");
printf(" 编号 姓名 性别 年龄 身高 体重 长跑 登山 短跑 跳绳\n");
for(i=0;i<N;i++)
{
if(a[i].sex==„m?||a[i].sex==„M?)
printf(" %6d %8s %c %3d %5.1f %5.1f %6.2f %6.2f\n",a[i].no,a[i].name,a[i].sex,
a[i].age,a[i].high,a[i].weight,a[i].event1,a[i].event2); else
printf(" %6d %8s %c %3d %5.1f %5.1f %6.2f %6.2f\n",a[i].no,a[i].name,a[i].sex,
a[i].age,a[i].high,a[i].weight,a[i].event1,a[i].event2); }
}
input(ATH a[N])
{
printf("请输入运动员的编号、姓名等相关信息:\n");
for(i=0;i<N;i++)
{
printf("第%d个运动员:\n",i+1);
printf("编号:");
scanf("%d",&a[i].no);
printf("姓名:");
scanf("%d",&a[i].name);
printf("性别:");
scanf("%d",&a[i].sex);
printf("年龄:");
scanf("%d",&a[i].age);
printf("身高:");
scanf("%d",&a[i].high);
printf("体重:");
scanf("%d",&a[i].weight);
if(a[i].sex==„m?||a[i].sex==„M?)
{
printf("输入该运动员的“长跑”与“登山”的成绩:") ; scanf("%f,%f",&a[i].event1,&a[i].event2) ;
}
else
{
printf("输入该运动员的“短跑”与“跳绳”的成绩:") ; scanf("%f,%f",&a[i].event1,&a[i].event2) ;
}
}
}
void main()
{
int msun=0,wsun=0 ;
ATH cs[N],mav,wav;
mav.event1=0; mav.event2=0;
wav.event1=0; wav.event2=0;
input(cs);
for(i=0;i<N;i++)
{
if(cs[i].sex==„m?||cs[i].sex==„M?)
{
msun=msun+1;
mav.event1=mav.event1+cs[i].event1;
mav.event2=mav.event2+cs[i].event2;
}
else
{
wsun=wsun+1 ;
mav.event1=mav.event1+cs[i].event1;
mav.event2=mav.event2+cs[i].event2;
}
}
mav.event1/=msun;mav.event2/=msun;
wav.event1/=wsun;wav.event2/=wsun;
output(cs) ;
printf("平均成绩:\n 长跑=%6.2f, 登山=%6.2f,短跑=%6.2f,跳绳=%6.2f\n
",mav.event1,mav.event2,wav.event1,wav.event2); }
9-13 编写程序,用结构体类型实现复数的加、减、乘、除运算,每种运算用函数完成。
解:#include "stdio.h"
struct complex
{
float real ;
float imag ;
};
struct complex add(struct complex a ,struct complex b)
{
struct complex temp ;
temp.real=a.real+b.real ;
temp.imag=a.imag+b.imag ;
return temp ;
}
struct complex sub(struct complex a ,struct complex b) {
struct complex temp ;
temp.real=a.real-b.real ;
temp.imag=a.imag-b.imag ;
return temp ;
}
struct complex mul(struct complex a ,struct complex b) {
struct complex temp ;
temp.real=a.real*b.real-a.imag*b.imag; temp.imag=a.real*b.imag+a.imag*b.real; return
temp ;
}
struct complex div(struct complex a ,struct complex b) {
struct complex temp ;
float t ;
t=(b.real*b.real+b.imag*b.imag);
temp.real=(a.real*b.real+a.imag*b.imag)/t; temp.imag=(b.real*a.imag-a.real*b.imag)/t;
return temp ;
}
struct complex disp(struct complex t)
{
printf("%8.3f",t.real) ;
if(t.imag>0) printf("+") ;
if(t.imag!=0)
printf("%8.3f\n",t.imag) ;
return t ;
}
void main()
{
struct complex x,y ;
struct complex s1,s2,s3,s4;
printf("请输入第一个数的实部,虚部:");
scanf("%f,%f",&x.real,&x.imag);
printf("请输入第二个数的实部,虚部:");
scanf("%f,%f",&y.real,&y.imag);
s1=add(x,y);
s2=sub(x,y);
s3=mul(x,y);
s4=div(x,y);
printf("所求复数的和=");disp(s1);
printf("所求复数的差=");disp(s2);
printf("所求复数的积=");disp(s3);
printf("所求复数的商=");disp(s4);
}
思考: 函数在返回时,传给调用函数的值是一个吗,为什么,结构体类型也可以作为返
回类型吗,
9-14 编写程序,计算四边形的面积和周长,要求用结构体类型描述四边形。
解:#include "stdio.h"
#include "math.h"
struct point //点的结构体
{
float x;
float y ;
};
struct sbx //四边形结构体用四个顶点表示
{
struct point p[4] ;
};
float dist(struct point p1 ,struct point p2) //求两点距离
{
float x=0;
x=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)) ;
return x ;
}
void main()
{
struct sbx a ;
float zc,mj ;
int i ;
float d01,d12,d23,d30,d02;
float c1,c2;
for( i=0;i<4;i++)
{
printf("请输入第%d个点的坐标:\n",i+1);
printf("(x,y)");
scanf("%f,%f",&a.p[i].x,&a.p[i].y);
}
/*计算四边形的周长*/
d01=dist(a.p[0],a.p[1]);
d12=dist(a.p[1],a.p[2]);
d23=dist(a.p[2],a.p[3]);
d30=dist(a.p[3],a.p[0]);
zc=d01+d12+d23+d30;
/*计算面积(将四边形分割为俩个三角形)*/
d02=dist(a.p[0],a.p[2]) ;
c1=(d01+d12+d02)/2;
c2=(d30+d23+d02)/2;
mj=sqrt(c1*(c1-d01)*(c1-d12)*(c1-d02))+sqrt(c2*(c2-d30)*(c2-d23)*(c2-d02));
/*输出结果*/
printf("周长=%7.2f,面积=%7.2f\n",zc,mj);
}
思考:如果把此题中的四边形改为平行四边形,程序该如何改写, 9-15 编写程序,用枚
举类型实现俩个数的加、减、乘、除运算,每
种运算用函数完成,并请考虑多个数的运算如何实现。 解:#include "stdio.h"
float add(float a,float b)
{
float temp ;
temp=a+b;
return temp ;
}
float sub(float a,float b)
{
float temp ;
temp=a-b;
return temp ;
}
float mul(float a,float b)
{
float temp ;
temp=a*b;
return temp ;
}
float div(float a,float b)
{
float temp ;
temp=a/b;
return temp ;
}
void main()
{
enum yunsuanfu{a,b,c,d}js; //用a,b,c,d分别表示加、减、乘、除 float x,y,s;
printf("输入第一个数据:");
scanf("%f",&x);
printf("输入第二个数据:");
scanf("%f",&y);
for(js=a;js<=d;js++)
{
switch(js)
{
case a:s=add(x,y) ;printf("所求的和=");break;
case b:s=sub(x,y) ;printf("所求的差=");break;
case c:s=mul(x,y) ;printf("所求的积=");break;
case d:s=div(x,y) ;printf("所求的商=");
}
printf("%8.3f\n",s) ;
}
}
思考:在此程序中若将主函数中的枚举类型改为字符类型进行处理,程序如下:
#include "stdio.h"
float add(float a,float b)
{
float temp ;
temp=a+b;
return temp ;
}
float sub(float a,float b)
{
float temp ;
temp=a-b;
return temp ;
}
float mul(float a,float b)
{
float temp ;
temp=a*b;
return temp ;
}
float div(float a,float b)
{
float temp ;
temp=a/b;
return temp ;
}
void main()
{
char js;
float x,y,s;
printf("输入第一个数据:");
scanf("%f",&x);
printf("运算符:");
js=getchar();
printf("输入数据第二个数据:");
scanf("%f",&y);
switch(js)
{
case „+?:s=add(x,y) ;printf("所求的和=");break;
case „-?:s=sub(x,y) ;printf("所求的差=");break;
case „*?:s=mul(x,y) ;printf("所求的积=");break;
case „/?:s=div(x,y) ;printf("所求的商=");
}
printf("%8.3f\n",s) ;
}
你认为主要区别是什么,各有何特点,
9-16 某水果经销8种水果。编写程序,设置每种水果的单价,输入一顾客购买的各种水果的重量,计算该顾客购买这些水果的总费用。
解:#include "stdio.h"
struct fruit
{
char name[10] ;
float price ;
}
void main()
{
struct fruit
as[8]={{"name1",1.3},{"name2",2.8},{"name3",2.1},{&qu
ot;name4",4.5},{"name5",0.8},{"name6",3.0},{"name7"
;,11.2},{"name8",6.6}} ;
int i;
float wt,sum=0;
for(i=0;i<8;i++)
{
printf("请输入第%d种水果的质量:",i+1);
scanf("%f",&wt);
sum=sum+wt*as[i].price;
}
printf("总费用=%f\n",sum);
}
思考:结构体类型的数组进行初始化时,主要应注意哪些问题, 9-17 某单位工资构成包括职务工资、岗位津贴、效益工资及其它,扣款包括水电费、保险金及公积金。用结构体数组描述全部员工的工资数据。编写程序,计算工资总额,某个员工的应发工资及该单位的平均工资。
解:#include "stdio.h"
struct salary
{
float zwgz ;
float gwjt ;
float xygz ;
float qt ;
float sdf ;
float bxj ;
float gjj ;
};
#define N 30
void main()
{
struct salary wk[N];
float yf[N],sf[N];
float zgz=0,pjgz=0;
int i=0;
for( i=0;i<N;i++)
{
printf("请输入第%d个工人的工资情况\n",i+1);
printf("职务工资、岗位津贴、效益工资、其它,水电费、保险金、公积金分别如下\n");
scanf("%f,%f,%f,%f,%f,%f,%f",&wk[i].zwgz,&wk[i].gwjt,&wk[i].x
ygz,&wk[i].qt,&wk[i].sdf,&wk[i].bxj,&wk[i].gjj);
}
/*计算应发工资、实发工资、总工资和平均工资*/
for(i=0;i<N;i++)
{
yf[i]=wk[i].zwgz+wk[i].gwjt+wk[i].xygz+wk[i].qt;
sf[i]=yf[i]-wk[i].sdf-wk[i].bxj-wk[i].gjj ;
zgz+=sf[i];
}
pjgz=zgz/N;
/*输出结果*/
for(i=0;i<N;i++)
printf("第%d个工人的应发工资为%4.2f 实发工资
为%4.2f\n",i+1,yf[i],sf[i]);
printf("单位应发的工资总额为%6.2f\n",zgz);
printf("该单位的平均为%4.2f\n",pjgz);
}
思考 :在使用结构体数组时,主要要注意哪些问题,
9-18 编写演讲比赛评分程序,假定有30个选手、8个评委,选手的得分是去掉最高分和
最低分的平均分。计算出每个选手的得分及本次比赛的平均分,并从高分到低分输出所有选手的得分情况。 解:#include "stdio.h"
#include "string.h"
struct perform
{
char name[10];
float score[8];
float df;
};
#define N 30
void main()
{
struct perform xch[N];
float max,min,t,av=0;
char tn[10];
int i=0,j=0;
printf("请输入每个选手的姓名及8位评委的打分:\n"); for(i=0;i<N;i++)
{
printf("第%d个选手:\n",i+1);
printf("姓名:");
scanf("%s",&xch[i].name);
printf("评委的打分(8位,之间用空格分隔):"); for(j=0;j<8;j++)
scanf("%f",&xch[i].score[j]);
}
/*求每位选手的得分*/
for(i=0;i<N;i++)
{
xch[i].df=0;
max=xch[i].score[0];
min=xch[i].score[0];
for(j=0;j<8;j++) //求选手总得分、最高分和最低分 {
xch[i].df+=xch[i].score[j];
if(max<xch[i].score[j]) max=xch[i].score[j]; if(min>xch[i].score[j])
min=xch[i].score[j];
}
xch[i].df=(xch[i].df-max-min)/6; //计算选手的得分 av+=xch[i].df ; //累加每个选手的得分
}
av/=N ;//求出所有选手的平均分
/*根据选手得分进行排序*/
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(xch[j].df>xch[i].df)
{
t=xch[i].df ;xch[i].df>xch[j].df;xch[j].df=t;
strcpy(tn,xch[i].name);
strcpy(xch[i].name,xch[j].name);
strcpy(xch[j].name,tn);
}
for(i=0;i<N;i++) //输出结果
printf("%s,%f",xch[i].name,xch[i].df);
}
思考:程序中变量t和字符数组tn的作用是什么,当含有数组成员的结构体又被定义为数组时,应注意哪些问题,
9-19 编写n个学生、m门课程的成绩处理程序:
(1) 实际学生人数、课程门数由键盘输入。
(2) 每个学生包括学号、姓名、成绩等信息,成绩中要求包含课程的名称,用结构体描述。所有学生数据用结构体数据描述
(3) 求出每个学生的总成绩及平均成绩。
(4) 将学生数据按总成绩排序。
(5) 求出每门课程的平均成绩及不及格的人数。
本题与习题8-21是同一个问题,只是引入结构体实现。
另请读者考虑,排序时总成绩相同,如何进一步处理。比如我们可在按某门课程的成绩排序。
解: (略)
思考:此题与习题8-19是同一个问题,用结构体进行处理后,比较数组与结构体的异同特性,试想这样的问题用数组或结构体哪个处理更合适,
9-20 改写本章例9-10程序,要求函数之间用参数传递数据。 解:#include"stdio.h"
#define M 200
struct dst /*定义日期结构体*/
{int year;
int month;
int day;
};
struct cst /*定义描述小朋友数据的结构体*/
{ int no;
char name[12];
char sex;
int age;
float height;
float weight;
struct dst bdate;
struct dst edate;
};
void input(struct cst all[],int n ) /*登录函数*/
{ int i;
for(i=0;i<n;i++)
{ printf("依次输入第%d个小朋友的数据:\n",i);
scanf("%d%s%c%f%f%f%d%d%d%d%d%d",&all[i].no,all[i].name,
&all[i].sex,
&all[i].age,&all[i].height,&all[i].weight,&all[i].bdate.year,&all[i].bdate
.month,&all[i].bdate.day,&all[i].edate.year,&all[i].edate.month,&all[i].edate.d
ay);
}
}
void sort(struct cst all[],int n) /*依身高排序函数*/
{
int i,j;
int k;
struct cst t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(all[j].height>all[k].height) k=j;
t=all[i];all[i]=all[k];all[k]=t;
}
}
void output(struct cst all[],int n ) /*输出函数*/
{ int i;
printf("编号 姓名 性别 年龄 身高 体重 出生日期 入园日期 \n");
for(i=0;i<n;i++)
{
printf("%4d%10s%8d%8.1f%8.2f%8.2f%6d/%2d%/2d%6d/%2d/%2d",all[i].no,all[i
].name,all[i].age,all[i].sex,all[i].height,all[i].weight,all[i].bdate.year,all[i].bdate.month,all[i].bdate.
day,all[i].edate.year,all[i].edate.month,all[i].edate.day);
printf("\n");
}
}
main( )
{
struct cst all[M];/*定义描述所有小朋友数据的外部结构体数组*/ input(all,M );/*调用登录函数 */
sort(all,M );/*调用依身高排序函数 */
output(all,M);/*再次调用输出函数 */
}
思考:依身高排序函数采用的是什么排序
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,试用其它排序方法编写依年龄排序函数。