第9章_结构体类型与共用体类型
第 9章 结构体类型与共用体类型 93>.1 结构体类型
9.2 结构体数组
9.3 共用体类型
9.4 枚举类型
9.5 程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
举例
结构体类型 9.1
9.1.1 结构体类型的定义
形式为: 结构体类型定义用关键字struct标识,
struct 标识符
{成员
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
};
例如, 定义结构体类型, 描述下列数据。
(1) 学生情况, 包含学生的学号、 姓名、 性别、 年龄、C语言
课程成绩:
struct student
{int no; /*学号*/
char name〔8〕; /*姓名*/
char sex; /*性别*/
int age; /*年龄*/
float cscore; /*C成绩*/
};
如考虑30门课程成绩, 加上总成绩与平均成绩,可作如下定义:
struct student
{int no; /*学号*/
char name〔8〕; /*姓名*/
char sex; /*性别*/
int age; /*年龄*/
float score〔31〕; /*30门课程成绩*/
float tcj, acj; /*总成绩, 平均成绩*/
};
(2) 个人数据,包含姓名、性别、年龄、身高、体重、住址:
struct person
{char name〔8〕; /*姓名*/
; /*性别*/ char sex
int age; /*年龄*/
float height; /*身高*/ float weight; /*体重*/ char add〔40〕; /*住址*/ };
(3) 平面上的点:
struct point2
{float x; /*横坐标*/
float y; /*纵坐标*/
};
如考虑空间中的点, 可作如下定义: struct point3
{float x; /*X坐标*/
float y; /*Y坐标*/
float z; /*Z坐标*/ };
(4) 日期, 包括年、 月、 日: struct date
{int year; /*年*/ month; /*月*/
day; /*日*/
};
时间, 可作如下定义: 如考虑
struct time
; /*时*/ {int hh
int mm; /*分*/
int ss; /*秒*/ };
(5) 复数:
struct complex
{float re; /*实部*/ float ie; /*虚部*/ };
(6) 三角形:
struct sjx
{float a, b, c; /*三边*/};
9.1.2 结构体变量的定义
(1) 先定义结构体类型, 再定义结构体变量。
形式为:
? struct 标识符
{成员表};
? struct 标识符 变量表;
例如,对以上定义的结构体类型,我们可以定义如下一些结构体变
量:
struct student zhang; /*张同学情况*/
struct person p〔100〕; /*100个人的数据*/
struct point2 p1, p2; /*平面上的两个点*/
struct point3 po1, po2; /*空间上的两个点*/
(2) 定义结构体类型的同时定义结构体变量。
形式为:
struct 标识符
{成员表} 变量表;
例如, 对以上定义的结构体变量,我们可以在定义结构体类型的
同时定义如下:
? struct student
{ int no;
char name〔8〕;
char sex;
int age;
float cscore;
} zhang; /*张同学情况*/
? struct person
{char name〔8〕;
char sex;
int age;
float height;
float weight;
char add〔40〕;
} p〔100〕; /*100个人的数据*/ ? struct point2 {float x;
float y;
, p2; /*平面上的两个点*/ } p1
struct point3
; {float x
float y;
float z;
} po1, po2; /*空间上的两个点*/
(3) 直接定义结构体变量。
形式为:
struct
{成员表} 变量表;
直接定义结构体变量, 在关键字struct后无标识符,不出现结构
体名, 仅给出成员表及变量表。 例如,对以上定义的结构体变量, 我们可以
直接定义如下:
? struct
{ int no;
char name〔8〕;
char sex;
int age;
float cscore; } zhang; /*张同学情况*/ ? struct
{char name〔8〕; char sex;
int age;
float height;
float weight;
char add〔40〕;
〔100〕; /*100个人的数据*/ } p
? struct
{float x;
float y;
} p1, p2; /*平面上的两个点*/
struct
{float x;
float y;
float z;
} po1, po2; /*空间上的两个点*/
如果重命名了结构体类型, 则可以用新类型名来定义结构体变量。
例如:
typedef struct
{char name〔8〕; char sex;
int age;
float height;
float weight;
char add〔40〕;
} persont; /*将结构体类型命名为persont*/ persont p〔100〕; /*100个人的数据*/
9.1.3 结构体变量的引用
结构体的分量称为字段变量。字段变量通过结构体变量名、 成员名
(字段名)与点运算来描述。
字段变量的形式为:结构体变量名.成员名 例如:
(1) struct student类型变量zhang, 其所有分量如下:
zhang.no, zhang.name, zhang.sex, zhang.age, zhang.cscore
(2) struct point2类型变量p1, 其所有分量如下:
p1.x, p1.y
(3) struct point2类型变量p2, 其所有分量如下:
p2.x, p2.y
9.1.4 结构体变量的初始化
初始化
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
:
存储类别 struct 结构体名
{成员表} 结构体变量={初始化数据表};
初始化数据表是相应成员的初值表。
例如:
(1) extern struct student {int no;
char name〔8〕;
int age;
float cscore;
} zhang={9901,〃zhangsan〃,′m′,19,95};
zhang.no初值9901, zhang.name初值〃zhangsan〃,
zhang.sex初值′m′, zhang.age初值19, zhang.cscore 初值95。 (2) static struct point2 {float x;
; float y
} p1={2.5, 19.8};
, p1.y初值19.8。 p1.x初值2.5
例 9 – 1 求某同学上学期8门课程的总成绩与平均成绩。 /*程序9 - 1, 求某同学的总成绩与平均成绩*/ main( )
{struct st
{char xm〔8〕;
float cj〔9〕;
float tcj, acj;
} stu;
int i;
scanf(〃%s〃, stu.xm); /*输入*/
for(i=1; i<=8;i++)
scan(〃%f〃, &stu.cj〔i〕); stu.tcj=0.0; /*求总成绩*/
for(i=1; i<=8;i++)
stu.tcj+=stu.cj〔i〕;
stu.acj=stu.tcj〔i〕/8; /*求平均成绩*/ printf(〃%s的总成绩=%6.2f, 平均成绩=%6.2f〃,stu.tcj, stu.acj);
/*输出*/
}
输入数据: CHEN 80 86 79 98 88 72 96 66 运行结果: CHEN的总成绩=577.00, 平均成绩= 72.13 例 9 – 2 求平面上两点之间的距离。
程序9 - 2, 求平面上两点之间的距离*/ /*
main( )
{struct point
{float x;
float y;
}p1, p2;
float d;
printf(〃请输入第一点的坐标: 〃); scanf(〃%f, %f〃, &p1.x, &p1.y); printf(〃请输入第二点的坐标: 〃); scanf(〃%f, %f〃, &p2.x, &p2.y); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
printf(〃两点之间的距离=%8.3f〃, d); }
运行结果:
请输入第一点的坐标: 1, 1
请输入第二点的坐标: 3, 3
两点之间的距离=2.828
例 9 – 3 复数的加减运算。
/*程序9 - 3, 复数的加减运算 */
main( )
{struct complex
{float re;
float ie;
} x, y; /*输入变量*/
s2; /*输出变量*/ struct complex s1,
printf(〃请输入第一个复数的实部, 虚部: 〃);
(〃%f, %f〃, &x.re, &x.ie); scanf
printf(〃请输入第二个复数实部, 虚部: 〃); scanf(〃%f, %f〃, &y.re, &y.ie); s1.re=x.re+y.re; /*求和*/
s1.ie=x.ie+y.ie;
s2.re=x.re-y.re; /*求差*/
s2.ie=x.ie-y.ie;
printf(〃所求复数的和=%8.3f+%8.3f i \n〃, s1.re , s1.ie);
printf(〃所求复数的差=%8.3f+%8.3f i \n〃, s2.re , s2.ie);
}
运行结果:
请输入第一个复数的实部, 虚部: 3.2, 4.3 请输入第二个复数实部, 虚部: 2.1, 3.1 所求复数的和= 5.3+ 7.5 i
所求复数的差= 1.1+ 1.2 i
9.1.5 结构体作函数
参数
转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应
例 9 – 4 将例9 - 2中求平面上两点之间的距离改用函数实现。 struct point
{float x;
float y;
};
float p1p2(p1, p2)/*求平面上两点之间距离的函数*/ struct point p1, p2;
; {float d
d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
(d); return
}
例 9 – 5 将例9 - 3中复数的加减运算改用函数实现。 /*程序9 - 5, 采用函数实现复数的加减运算 */ struct complex
{float re;
float ie; } ;
main( )
{struct complex x, y;
struct complex s1, s2;
struct complex csum( ); /*调用函数申明*/ struct complex csub( );
printf(〃请输入第一个复数的实部, 虚部: 〃); scanf(〃%f, %f〃, &x.re, &x.ie); printf(〃请输入第二个复数实部, 虚部: 〃);
scanf(〃%f, %f〃, &y.re, &y.ie); s1=csum(x, y); /*调用函数求和*/
s2=csub(x, y); /*调用函数求差*/
printf(〃所求复数的和=%8.3f+%8.3f i \n〃, s1.re , s1.ie); printf(〃所求复数的差=%8.3f+%8.3f i \n〃, s2.re , s2.ie); }
struct complex csum(xx, xy)/*求两个复数和的函数*/
xy; struct complex xx,
{struct complex t;
t.re=xx.re+xy.re;
t.ie=xx.ie+xy.ie;
return(t);
}
struct complex csub(xx, xy)/*求两个复数差的函数*/ struct complex xx, xy;
{struct complex t;
t.re=xx.re-xy.re;
t.ie=xx.ie-+xy.ie;
return(t);
}
9.1.6 嵌套结构体
例如,在描述个人数据时, 假如除了年龄,还需描述出生日期。 我们需在
前面的定义中增加一日期结构体成员,形成嵌套结构体类型person。
struct date
{int year;
month;
day;
};
struct person {char name〔8〕; char sex;
; int age
struct date birthday; /*增加的结构体成员*/
float height;
float weight; char add〔40〕; };
我们也可采用如下的嵌套结构体形式:
struct person {char name〔8〕; char sex;
int age;
struct date
{int year;
month;
day;
} birthday; /*增加的结构体成员*/
float height;
float weight;
char add〔40〕;
};
9.2 结构体数组
结构体数组的定义与结构体变量的定义一样有以下三种形式: (1) Struct 标识符
{成员表} ;
struct 标识符 数组名〔常量〕;
标识符 (2) struct
{成员表} 数组名〔常量〕;
(3) struct
{成员表} 数组名〔常量〕;
例如,100个同学的情况, 我们可以定义结构体数组allst描述:
struct student
{int no;
char name〔8〕;
char sex;
int age;
float score〔31〕;
float tcj, acj;
} allst〔100〕;
对结构体数组allst的操作要转化成对allst〔i〕进行操作,而
allst〔i〕的操作要转化成对allst〔i〕.no、allst〔i〕.name、allst〔i〕.sex、
allst〔i〕.age、allst〔i〕.score、allst〔i〕.tcj、allst〔i〕.acj进行
操作。allst〔i〕.no、allst〔i〕.name、allst〔i〕.sex、allst〔i〕.age、
allst〔i〕.score、allst〔i〕.tcj、allst〔i〕.acj相当于对应基类型的量。
例 9 – 6 用结构体数组处理全班50个同学的C语言课程成绩。 /*程序9 - 6, 用结构体数组处理C语言成绩, 排序输出*/ ,define STT struct student
STT
{char xm〔8〕;
float c; };
main( )
〔51〕; /*存放50个同学的姓名、 C成绩*/ {STT cs
int i;
; int flag
STT t; /*排序时用于交换数据*/
for(i=1; i <50; i++)/*输入50个同学的姓名、 C成绩*/
scanf(〃%s%f〃, &cs〔i〕.xm, &cs〔i〕. c); do /*冒泡排序*/
{flag=1;
for(i=1; i <49; i++)
if(cs〔i+1〕. c>cs〔i〕. c)
{t=cs〔i〕; cs〔i〕=cs〔i+1〕; cs〔i+1〕=t;
flag=0;
}
}while(~flag);
printf(〃排序后的C语言成绩如下: \n〃); /*输出*/ printf(〃 姓名 分数 名次\n〃);
for(i=1; i <50; i++)
printf(〃%8s%6.1f %6>6d\n〃, cs〔i〕.xm, cs〔i〕. c, i);
}
例 9 - 7 假设有5个候选人,有20人参加投票,规定只能在5个
候选人中选一个,多选或选这5人以外者均为废票。 试用结构体数组编写程序,
统计出5位候选人各人所得 票数。
/*程序9 - 7, 统计候选人得票数*/
struct ttt
{char name〔12〕;
int count;
};
main( )
{struct ttt dp〔5〕={{〃Zhang〃, 0}, {〃Li〃, 0}, {〃Wang〃,
0}, {〃Liu〃, 0}, {〃 Zhao〃, 0}};
char tp〔10〕;
int i, j;
for(i=1; i<=20; i++)
{scanf (〃%s〃, tp);
for(j=0; j<5; j++)
if(strcmp(tp, dp〔i〕.name)= =0)dp〔j〕.count++;
}
for(i=0; i<5; i++)
printf(〃%s的得票数=%d\n〃, dp〔i〕.name, dp〔i〕.count);
}
输入数据: Zhang Li Wang Liu Zhao Zhao Li Li Zhang Li Zhang
Li Liu Li Zhang Liu Li Li Zhang
运行结果:
Zhang的得票数=5
Li的得票数=8
Wang的得票数=1
Liu的得票数=3
Zhao的得票数=2
9.3 共用体类型
共用体类型的定义 9.3.1
共用体类型定义用关键字union标识, 形式为:
标识符 union
{成员表};
标识符给出共用体名, 是共用体类型名的主体, 定义的共用体类
型由“union 标识符”标识。例如,定义一个共用体类型,
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
包含一个整型
成员,一个字符型成员和一个单精度型成员: union icf
{int i;
char c;
float f;
};
9.3.2 共用体变量的定义
(1) 先定义共用体类型, 再定义共用体变量: ? union 共用体名
{成员表};
? union 共用体名 变量表;
(2) 定义共用体类型的同时定义共用体变量:
union 共用体名
{成员表} 变量表;
(3) 直接定义共用体变量:
union {成员表} 变量表;
9.3.3 共用体变量的引用
共用体变量不能直接使用,只能使用里面的某个成员,其成员同样通过点运算描述。形式为:
共用体变量名.成员名
例如,定义上面共用体类型变量x ,x占有4个字节的空间,x.i 表
其字符型成员,x.f表示其单精度型成员。 示其整型成员,x.c表示
说明:
(1) 共用体变量中,可以包含若干个成员及若干种类型,但共用体成员不能同时使用。在每一时刻,只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型。
(2) 共用体变量中起作用的成员值是最后一次存放的成员值,即共用体变量所有成员共用同一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值。
(3) 共用体变量的地址和它的各个成员的地址相同。
(4) 不能对共用体变量初始化和赋值,也不能企图引用共用体变量名来得到某成员的值。
(5) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型。
(6) 共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至还可以定义共用体数组。
例 9 - 8 设有若干教师的数据,包含有教师编号、姓名、职称,
若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数
目。
/*程序9 - 8, 输入输出教师信息*/
union cf
{char clname〔30〕; /*所讲课程*/
int num; /*论文数目*/
};
struct teachers
{int no; /*编号*/
char name〔12〕; /*姓名*/
char zc; /*职称*/
union cf x; /*可变字段, 为所讲课程或论文数目*/ } teach〔3〕;
main( )
{int i;
for(i=0; i<3; i++)
{scanf(〃%d, %s, %c〃, &teach〔i〕.no, teach〔i〕.name,
&teach〔i〕.zc);
if (teach〔i〕.zc= =′L′)/*L表示讲师*/
scanf(〃%s〃, &teach〔i〕.x .clname);
else if (teach〔i〕.zc= =′P′ )/*P表示教授*/
scanf (〃%d〃, &teach〔i〕.x .num);
else printf (〃input data error\n〃);
}
for(i=0; i<3; i++)
{printf (〃%d %s %c〃, teach〔i〕.No, teach〔i〕.name,teach〔i〕.zc);
if (teach〔i〕.zc= =′L′)printf (〃%s\n〃, teach〔i〕.x.. clname);
else if (teach〔i〕.name= =′P′)printf (;%d\n;, teach〔i〕.x. num);
else printf(〃data error\n〃);
}
}
枚举类型 9.4
9.4.1 枚举类型的定义
枚举类型定义用关键字enum标识,形式为:
enum 标识符
{枚举数据表};
标识符用来区分不同的枚举类型,定义的枚举类型用enum标识符”标识。
枚举数据(枚举常量)是一些特定的标识符, 标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。
例如:
(1) 定义枚举类型status, 包含复制与删除两种状态:
enum status
{copy, delete};
枚举类型status仅有两个数据,一个是copy,一个是delete, 序
号为0、 1, 代表复制与删除。
(2) 定义枚举类型color,包含红、黄、蓝、白、黑五种颜色:
enum color
{red, yellow, blue, white, black};
枚举类型color有red、 yellow、 blue、 white、 black五个数据, 序号为0、 1、 2、 3、 4, 代表红、 黄、 蓝、 白、 黑五种颜色。
(3) 定义枚举类型weekday, 包含一周的七天:
enum weekday
{sun, mon, tue, wed, thu, fri, sat};
枚举类型weekday有sun、 mon、 tue、 wed、 thu、 fri、sat
序号为0、 1、 2、 3、4、 5、 6, 代表一周中的星期天、星期七个数据,
一、星期二、星期三、星期四、 星期五、星期六。
在定义枚举类型时,程序员可在枚举数据时通过“=”号自己规定序号,并影响后面的枚举数据的序号,后继序号以此递增。例如:
enum status
{copy=6, delete};
则copy的序号为6, delete的序号为7。
9.4.2 枚举类型变量的定义
(1) 先定义枚举类型, 再定义枚举类型变量:
enum 标识符 {枚举数据表};
enum 标识符 变量表;
(2) 在定义枚举类型的同时定义枚举类型变量:
enum 标识符 {枚举数据表} 变量表;
(3) 直接定义枚举类型变量:
enum {枚举数据表} 变量表;
例如, 对枚举类型enum color, 定义枚举变量c1、 c2: enum color {red, yellow, blue, white, black};
enum color c1, c2;
或enum color {red,yellow,blue,white,black} c1, c2;
或enum {red, yellow, blue, white, black} c1, c2;
枚举类型数据可以进行赋值运算。枚举类型是有序类型, 枚举类型数据还可以进行关系运算。枚举类型数据的比较转化成对序号进行比较, 只有同一种枚举类型的数据才能进行比较。
将枚举型数据按整型格式输出,可得到整数值(枚举变量值的序
号)。
使用强制类型转换,可将整数值(枚举值序号)转换成对应枚举值。
例如:
c1=(enum color )2; /*c1得到枚举值blue*/
枚举类型数据不能直接输入输出。枚举类型数据输入时,先输入其序号,再进行强制类型转换完成。输出时,采用开关语句先进行判断,再转化成对应字符串输出。
例 9 – 9 某口袋中有红、 黄、 蓝、 白、 黑五种颜色的球若干个,每次从口袋中取出三个球,问得到三种不同颜色的球有多少种取法,并输出每种组合结果。
for (n=0, i=1; i<=5; i++) /*取第一个球*/
for (j=1; j<=5; j++) /*取第二个球*/
if (i~=j) /*第一个与第二个不同色*/
{for(k=1; k<=5; k++)/*取第三个球*/
if((k~=i) && (k~=j))
{n++; /*统计有多少种取法*/
printf (〃%d, %d, %d\n〃, i, j, k); /*输
出一种取法*/
}
}
不用枚举类型:
采用枚举类型来描述数据。设用red表示红色球,yellow表示黄
色球,blue表示蓝色球,white 表示白色球, black表示黑色球。 /*程序9 - 9, 三种不同颜色球的取法 */
( ) main
{enum color {red, yellow, blue, white, black}; enum color i, j, k, l;
int n, m;
for(n=0, i=red; i<=black; i++)
for(j=red; j<=black; ; j++)
if(i~=j)
{for(k=red; k<=black; k++)
if((k~=i)&&(k![KG-*4]=j))
{n++;
printf(〃%4d〃, n);
for(m=1; m<=3; m++)
{switch(m)
{case 1: 1=i; berak;
case 2: 1=j; berak;
case 3: 1=k; berak;
}
switch(l)/*间接输出*/
{case red: printf(〃%8s〃, 〃red〃), break;
case yellow: printf(〃%8s〃, 〃yellow〃); break;
case blue: printf(〃%8s〃), 〃blue〃); break;
case white: printf(〃%8s〃, 〃white〃); break;;
case black: printf(〃%8s〃, 〃black〃); break;
}
}
printf(〃\n〃);
}
}
printf(〃总的取法有%d种\n〃, n);
}
9.5 程序设计举例
例 9 - 10 编写程序,登录幼儿园200个小朋友的数据:编号、
姓名、性别、年龄、 身高、体重、出生日期、入园日期,分别按身高、年龄排
序输出。
/*程序9 - 10 , 幼儿园小朋友数据登录、 排序*/
,define M 200
struct dst
{int year;
int month;
int day; };
struct cst
{int no;
char name〔12〕;
char sex;
float age;
float height;
float weight;
; dst bdate
dst edate; };
M〕; struct cst all〔
main( )
{void input( ); /*调用函数申明*/ void sort1( );
void sort2( );
void output( );
input( ); /*调用登录函数 */ sort1( ); /*调用身高排序函数 */ printf(〃幼儿园小朋友一览(依身高排序): \n〃);
output( ); /*调用输出函数 */ printf(〃\n〃);
sort2( ); /*调用年龄排序函数 */ printf(〃幼儿园小朋友一览(依年龄排序): \n〃);
output( ); /*再次调用输出函数 */
printf(〃\n〃);
}
void input( )/*登录函数*/
{int i;
for(i=0; i<M; 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.day);
}
}
void sort1( )/*依身高排序函数*/
{int i, j;
int k;
struct cst t;
for(i=0; i<M-1; i++)
{k=i;
for(j=i; j<M; j++)
if(all〔j〕.height>all〔k〕.height) k=j;
t=all〔i〕; all〔i〕=all〔k〕; all〔k〕=t;
}
}
void sort1( )/*依年龄排序函数*/
{int i, j;
int k;
struct cst t;
for(i=0; i<M-1; i++)
{k=i;
for(j=i; j<M; j++)
if(all〔j〕.age>all〔k〕.age) k=j;
t=all〔i〕; all〔i〕=all〔k〕; all〔k〕=t;
}
}
void output( )/*输出函数*/
{int i;
printf(〃 编号 姓名 性别 年龄 身高 体重 出生日期 入园日期 \n〃)
for(i=0; i<M; i++)
{printf(〃%4d%10s%8d%8.1f%8.2f%8.2f%4d, %2d%, 2d%4d, %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〃);
}
}
例 9 - 11 编写程序, 实现复数的乘法运算。 /*程序9 - 5, 采用函数实现复数的乘法运算 */ struct complex
{float re;
float ie; } ;
main( )
t complex x, y; {struc
struct complex m;
); /*调用函数申明*/ struct complex compm(
printf(〃请输入第一个复数的实部, 虚部: 〃); scanf(〃%f, %f〃, &x.re, &x.ie); printf(〃请输入第二个复数实部, 虚部: 〃); scanf(〃%f, %f〃, &y.re, &y.ie); m=compm(x, y); /*调用函数求积*/
printf(〃所求复数的积=%8.3f+%8.3f i \n〃, s1.re , s1.ie);
}
struct complex compm(xx, xy)/*求两个复数积的函数*/ struct complex xx, xy;
{struct complex t;
t.re=xx.re*xy.re-xx.ie*xy.ie;
t.ie=xx.re*xy.ie+xx.ie*xy.re;
return(t);
}
例 9 - 12 某班有50个学生,期终考试8门课程。求每个学生总
成绩、平均成绩,并按总成绩高分到低分输出。 /*程序9 - 12 , 成绩处理程序*/
struct cjst
{char xm〔12〕;
float cj〔9〕;
} cjs〔51〕; /*存放输入数据的结构体数组*/ float tacj〔51〕〔3〕; /*存放总成绩、 平均成绩*/
( ) main
{void input( ); /*调用函数申明*/
( ); void count
void sort( );
void output( );
input( ); /*调用输入函数*/
count( ); /*调用计算函数*/
sort( ); /*调用排序函数*/
output( ); /*调用输出函数*/
}
void input( ); /*输入函数*/
{int i, j;
for(i=1; i<=50; i++)
{printf(〃请输入第%d个学生姓名, 8门课的成绩: \n〃);
scanf(〃%s〃, cjs〔i〕.xm);
for(j=1; j<=8; j++)
scanf(〃%f〃, &cjs〔i〕.cj〔j〕); }
}
void count( ); /*计算函数*/
{int i, j;
for(i=1; i<=50; i++)
{tacj〔i〕〔1〕=0;
for(j=1; j<=8; j++)
tacj〔i〕〔1〕+=cjs〔i〕.cj〔j〕;
tacj〔i〕〔2〕=tacj〔i〕〔1〕/8;
}
}
void sort( )/*排序函数*/
{int i , flag;
struct cjst tt;
float tc;
do
{flag=0;
for(i=1; i<=50; i++)
if(tacj〔i+1〕〔1〕>tacj〔i〕〔1〕)
{tt=cjs〔i〕); cjs〔i=cjs〔i+1〕; cjs〔i+1〕=t; /*交换原始
数据*/
tc=tacj〔i〕〔1〕; tacj〔i〕〔1〕=tacj〔i+1〕〔1〕; tacj〔i+1〕
〔
1〕=tc; /*交换总成绩*/
tc=tacj〔i〕〔2〕; tacj〔i〕〔2〕=tacj〔i+1〕〔2〕; tacj〔i+1〕
〔
2〕=tc; /*交换平均成绩*/
flag=1;
}
}while(flag==1);
}
void output( )/*输出函数*/
; {int i
printf(〃50个学生成绩处理结果如下: \n〃); printf(〃 姓名 课程1 课程2 课程3 课程4 课程5 课程6 课程
7 课程8 总成绩 平均成绩 名次\n〃);
for(i=1; i<=50; i++)
{printf(〃%8s〃, cjs〔i〕.xm);
for(j=1; j<=8; j++)
printf(〃%7.2f 〃, cjs〔i〕.cj〔j〕);
printf(〃%7.2f%7.2f%5d〃, tacj〔i〕〔1〕, tacj〔i〕〔2〕, i);
printf(〃\n〃);
}
}