第 9章 结构体类型与共用体类型第 9章 结构体类型与共用体类型
9.1 结构体类型
9.2 结构体数组
9.3 共用体类型
9.4 枚举类型
9.5 程序设计举例第 9章 结构体类型与共用体类型
9.1 结构体类型
9.1.1 结构体类型的定义结构体类型定义用关键字 struct标识,形式为:
struct 标识符
{成员表 };
第 9章 结构体类型与共用体类型例如,定义结构体类型,描述下列数据 。
(1) 学生情况,包含学生的学号,姓名,性别,年龄,C语言课程成绩:
struct student
{int no; /*学号 */
char name[ 8]; /*姓名 */
char sex; /*性别 */
int age; /*年龄 */
float cscore; /*C成绩 */
};
第 9章 结构体类型与共用体类型如考虑 30门课程成绩,加上总成绩与平均成绩,可作如下定义:
struct student
{int no; /*学号 */
char name[ 8]; /*姓名 */
char sex; /*性别 */
int age; /*年龄 */
float score[ 31]; /*30门课程成绩 */
float tcj,acj; /*总成绩,平均成绩 */
};
第 9章 结构体类型与共用体类型
(2) 个人数据,包含姓名、性别、年龄、身高、体重、住址,
struct person
{char name[ 8]; /*姓名 */
char sex; /*性别 */
int age; /*年龄 */
float height; /*身高 */
float weight; /*体重 */
char add[ 40]; /*住址 */
};
第 9章 结构体类型与共用体类型
(3) 平面上的点,
struct point2
{float x; /*横坐标 */
float y; /*纵坐标 */
};
如考虑空间中的点,可作如下定义,
struct point3
{float x; /*X坐标 */
float y; /*Y坐标 */
float z; /*Z坐标 */
};
第 9章 结构体类型与共用体类型
(4) 日期,包括年,月,日,
struct date
{int year; /*年 */
month; /*月 */
day; /*日 */
};
如考虑时间,可作如下定义:
struct time
{int hh; /*时 */
int mm; /*分 */
int ss; /*秒 */
};
第 9章 结构体类型与共用体类型
(5) 复数,
struct complex
{float re; /*实部 */
float ie; /*虚部 */
};
第 9章 结构体类型与共用体类型
(6) 三角形,
struct sjx
{float a,b,c; /*三边 */};
第 9章 结构体类型与共用体类型
9.1.2 结构体变量的定义
(1) 先定义结构体类型,再定义结构体变量。
形式为:
① struct
{成员表 };
② struct 标识符 变量表;
例如,对以上定义的结构体类型,我们可以定义如下一些结构体变量:
struct student zhang; /*张同学情况 */
struct person p[ 100]; /*100个人的数据 */
struct point2 p1,p2; /*平面上的两个点 */
struct point3 po1,po2; /*空间上的两个点 */
第 9章 结构体类型与共用体类型
(2) 定义结构体类型的同时定义结构体变量。
形式为:
struct
{成员表 } 变量表;
例如,对以上定义的结构体变量,我们可以在定义结构体类型的同时定义如下:
① struct student
{ int no;
char name[ 8];
char sex;
int age;
float cscore;
} zhang; /*张同学情况 */
第 9章 结构体类型与共用体类型
② struct person
{char name[ 8];
char sex;
int age;
float height;
float weight;
char add[ 40];
} p[ 100]; /*100个人的数据 */
第 9章 结构体类型与共用体类型
③ struct point2
{float x;
float y;
} p1,p2; /*平面上的两个点 */
struct point3
{float x;
float y;
float z;
} po1,po2; /*空间上的两个点 */
第 9章 结构体类型与共用体类型
(3) 直接定义结构体变量。
形式为:
struct
{成员表 } 变量表;
直接定义结构体变量,在关键字 struct后无标识符,
不出现结构体名,仅给出成员表及变量表。 例如,对以上定义的结构体变量,我们可以直接定义如下:
第 9章 结构体类型与共用体类型
① struct
{ int no;
char name[ 8];
char sex;
int age;
float cscore;
} zhang; /*张同学情况 */
第 9章 结构体类型与共用体类型
② struct
{char name[ 8];
char sex;
int age;
float height;
float weight;
char add[ 40];
} p[ 100]; /*100个人的数据 */
第 9章 结构体类型与共用体类型
③ struct
{float x;
float y;
} p1,p2; /*平面上的两个点 */
struct
{float x;
float y;
float z;
} po1,po2; /*空间上的两个点 */
第 9章 结构体类型与共用体类型如果重命名了结构体类型,则可以用新类型名来定义结构体变量。
例如:
typedef struct
{char name[ 8];
char sex;
int age;
float height;
float weight;
char add[ 40];
} persont; /*将结构体类型命名为 persont*/
persont p[ 100]; /*100个人的数据 */
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型
9.1.4 结构体变量的初始化初始化格式:
存储类别 struct
{成员表 } 结构体变量 ={初始化数据表 };
初始化数据表是相应成员的初值表。
第 9章 结构体类型与共用体类型例如:
(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。
第 9章 结构体类型与共用体类型
(2) static struct point2
{float x;
float y;
} p1={2.5,19.8};
p1.x初值 2.5,p1.y初值 19.8。
第 9章 结构体类型与共用体类型例 9 – 1 求某同学上学期 8门课程的总成绩与平均成绩 。
/*程序 9 - 1,求某同学的总成绩与平均成绩 */
main(
{struct st
{char xm[ 8];
float cj[ 9];
float tcj,acj;
} stu;
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型例 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);
}
第 9章 结构体类型与共用体类型运行结果:
请输入第一点的坐标,1,1
请输入第二点的坐标,3,3
两点之间的距离 =2.828
第 9章 结构体类型与共用体类型例 9 – 3 复数的加减运算。
/*程序 9 - 3,复数的加减运算 */
main(
{struct complex
{float re;
float ie;
} x,y; /*输入变量 */
struct complex s1,s2; /*输出变量 */
printf( ″请输入第一个复数的实部,虚部,″);
scanf( ″%f,%f″,&x.re,&x.ie);
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);
}
第 9章 结构体类型与共用体类型运行结果:
请输入第一个复数的实部,虚部,3.2,4.3
请输入第二个复数实部,虚部,2.1,3.1
所求复数的和 = 5.3+ 7.5 i
所求复数的差 = 1.1+ 1.2 i
第 9章 结构体类型与共用体类型
9.1.5
例 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));
return( d);
}
第 9章 结构体类型与共用体类型例 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); /*调用函数求差 */
第 9章 结构体类型与共用体类型
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) /*求两个复数和的函数 */
struct complex xx,xy;
{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章 结构体类型与共用体类型
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] ;
};
第 9章 结构体类型与共用体类型我们也可采用如下的嵌套结构体形式:
struct person
{char name[ 8];
char sex;
int age;
struct date
{int year;
month;
day;
} birthday; /*增加的结构体成员 */
float height;
float weight;
char add[ 40];
};
第 9章 结构体类型与共用体类型
9.2 结构体数组结构体数组的定义与结构体变量的定义一样有以下三种形式:
(1) Struct
{成员表 } ;
struct 标识符 数组名 [ 常量 ] ;
(2) struct
{成员表 } 数组名 [ 常量 ] ;
(3) struct
{成员表 } 数组名[常量];
第 9章 结构体类型与共用体类型例如,100个同学的情况,我们可以定义结构体数组 allst描述:
struct student
{int no;
char name[ 8];
char sex;
int age;
float score[ 31];
float tcj,acj;
} allst[ 100];
第 9章 结构体类型与共用体类型对结构体数组 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章 结构体类型与共用体类型例 9 – 6 用结构体数组处理全班 50个同学的 C语言课程成绩 。
/*程序 9 - 6,用结构体数组处理 C语言成绩,排序输出 */
# define STT struct student
STT
{char xm[ 8];
float c; };
main(
{STT cs[ 51]; /*存放 50个同学的姓名,C成绩 */
int i;
int flag;
STT t; /*排序时用于交换数据 */
for( i=1; i <50; i++) /*输入 50个同学的姓名,C成绩 */
第 9章 结构体类型与共用体类型
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 %6d\n″,cs[ i],xm,cs[ i],c,i);
}
第 9章 结构体类型与共用体类型例 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++)
第 9章 结构体类型与共用体类型
{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章 结构体类型与共用体类型
9.3 共用体类型
9.3.1 共用体类型的定义共用体类型定义用关键字 union标识,形式为:
union 标识符
{成员表 };
第 9章 结构体类型与共用体类型标识符给出共用体名,是共用体类型名的主体,定义的共用体类型由,union 标识符,标识。例如,定义一个共用体类型,要求包含一个整型成员,一个字符型成员和一个单精度型成员:
union icf
{int i;
char c;
float f;
};
第 9章 结构体类型与共用体类型
9.3.2 共用体变量的定义
(1) 先定义共用体类型,再定义共用体变量:
① union
{成员表 };
② union 共用体名 变量表;
(2) 定义共用体类型的同时定义共用体变量:
union
{成员表 } 变量表;
(3) 直接定义共用体变量:
union {成员表 } 变量表;
第 9章 结构体类型与共用体类型
9.3.3 共用体变量的引用共用体变量不能直接使用,只能使用里面的某个成员,其成员同样通过点运算描述 。 形式为:
共用体变量名,
例如,定义上面共用体类型变量 x,x占有 4个字节的空间,x.i 表示其整型成员,x.c表示其字符型成员,
x.f表示其单精度型成员 。
第 9章 结构体类型与共用体类型说明:
(1) 共用体变量中,可以包含若干个成员及若干种类型,但共用体成员不能同时使用 。 在每一时刻,只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型 。
(2) 共用体变量中起作用的成员值是最后一次存放的成员值,即共用体变量所有成员共用同一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值 。
(3) 共用体变量的地址和它的各个成员的地址相同。
第 9章 结构体类型与共用体类型
(4) 不能对共用体变量初始化和赋值,也不能企图引用共用体变量名来得到某成员的值 。
(5) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型 。
(6) 共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至还可以定义共用体数组 。
第 9章 结构体类型与共用体类型例 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];
第 9章 结构体类型与共用体类型
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);
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型
9.4 枚举类型
9.4.1 枚举类型的定义枚举类型定义用关键字 enum标识,形式为:
enum
{枚举数据表 };
标识符用来区分不同的枚举类型,定义的枚举类型用
enum标识符,标识。
枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,从 0开始,依次递增。
第 9章 结构体类型与共用体类型例如:
(1) 定义枚举类型 status,包含复制与删除两种状态:
enum status
{copy,delete};
枚举类型 status仅有两个数据,一个是 copy,一个是 delete,序号为 0,1,代表复制与删除 。
第 9章 结构体类型与共用体类型
(2) 定义枚举类型 color,包含红,黄,蓝,白,黑五种颜色:
enum color
{red,yellow,blue,white,black};
枚举类型 color有 red,yellow,blue,white,black
五个数据,序号为 0,1,2,3,4,代表红,黄,
蓝,白,黑五种颜色 。
第 9章 结构体类型与共用体类型
(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章 结构体类型与共用体类型
9.4.2 枚举类型变量的定义
(1) 先定义枚举类型,再定义枚举类型变量:
enum 标识符 {枚举数据表 };
enum 标识符 变量表;
(2) 在定义枚举类型的同时定义枚举类型变量:
enum 标识符 {枚举数据表 } 变量表;
(3) 直接定义枚举类型变量:
enum {枚举数据表 } 变量表;
第 9章 结构体类型与共用体类型例如,对枚举类型 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;
枚举类型数据可以进行赋值运算 。 枚举类型是有序类型,
枚举类型数据还可以进行关系运算 。 枚举类型数据的比较转化成对序号进行比较,只有同一种枚举类型的数据才能进行比较 。
第 9章 结构体类型与共用体类型将枚举型数据按整型格式输出,可得到整数值
( 枚举变量值的序号 ) 。
使用强制类型转换,可将整数值 ( 枚举值序号 ) 转换成对应枚举值 。 例如:
c1=( enum color ) 2; /*c1得到枚举值 blue*/
枚举类型数据不能直接输入输出 。 枚举类型数据输入时,先输入其序号,再进行强制类型转换完成 。 输出时,采用开关语句先进行判断,再转化成对应字符串输出 。
第 9章 结构体类型与共用体类型例 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); /*输出一种取法 */
}
}
不用枚举类型:
第 9章 结构体类型与共用体类型采用枚举类型来描述数据 。 设用 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++)
第 9章 结构体类型与共用体类型
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;
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型
9.5 程序设计举例例 9 - 10 编写程序,登录幼儿园 200个小朋友的数据:
编号,姓名,性别,年龄,身高,体重,出生日期,入园日期,分别按身高,年龄排序输出 。
/*程序 9 - 10,幼儿园小朋友数据登录,排序 */
# define M 200
struct dst
{int year;
int month;
int day; };
第 9章 结构体类型与共用体类型
struct cst
{int no;
char name[ 12];
char sex;
float age;
float height;
float weight;
dst bdate;
dst edate; };
struct cst all[ M];
main(
{void input( ); /*调用函数申明 */
void sort1( );
void sort2( );
void output( );
第 9章 结构体类型与共用体类型
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
第 9章 结构体类型与共用体类型
[ 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;
}
}
第 9章 结构体类型与共用体类型
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;
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型例 9 - 11 编写程序,实现复数的乘法运算。
/*程序 9 - 5,采用函数实现复数的乘法运算 */
struct complex
{float re;
float ie; } ;
main(
{struct complex x,y;
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);
}
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型例 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( );
第 9章 结构体类型与共用体类型
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]);
}
}
第 9章 结构体类型与共用体类型
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
第 9章 结构体类型与共用体类型
{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;
第 9章 结构体类型与共用体类型
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″);
}
}
9.1 结构体类型
9.2 结构体数组
9.3 共用体类型
9.4 枚举类型
9.5 程序设计举例第 9章 结构体类型与共用体类型
9.1 结构体类型
9.1.1 结构体类型的定义结构体类型定义用关键字 struct标识,形式为:
struct 标识符
{成员表 };
第 9章 结构体类型与共用体类型例如,定义结构体类型,描述下列数据 。
(1) 学生情况,包含学生的学号,姓名,性别,年龄,C语言课程成绩:
struct student
{int no; /*学号 */
char name[ 8]; /*姓名 */
char sex; /*性别 */
int age; /*年龄 */
float cscore; /*C成绩 */
};
第 9章 结构体类型与共用体类型如考虑 30门课程成绩,加上总成绩与平均成绩,可作如下定义:
struct student
{int no; /*学号 */
char name[ 8]; /*姓名 */
char sex; /*性别 */
int age; /*年龄 */
float score[ 31]; /*30门课程成绩 */
float tcj,acj; /*总成绩,平均成绩 */
};
第 9章 结构体类型与共用体类型
(2) 个人数据,包含姓名、性别、年龄、身高、体重、住址,
struct person
{char name[ 8]; /*姓名 */
char sex; /*性别 */
int age; /*年龄 */
float height; /*身高 */
float weight; /*体重 */
char add[ 40]; /*住址 */
};
第 9章 结构体类型与共用体类型
(3) 平面上的点,
struct point2
{float x; /*横坐标 */
float y; /*纵坐标 */
};
如考虑空间中的点,可作如下定义,
struct point3
{float x; /*X坐标 */
float y; /*Y坐标 */
float z; /*Z坐标 */
};
第 9章 结构体类型与共用体类型
(4) 日期,包括年,月,日,
struct date
{int year; /*年 */
month; /*月 */
day; /*日 */
};
如考虑时间,可作如下定义:
struct time
{int hh; /*时 */
int mm; /*分 */
int ss; /*秒 */
};
第 9章 结构体类型与共用体类型
(5) 复数,
struct complex
{float re; /*实部 */
float ie; /*虚部 */
};
第 9章 结构体类型与共用体类型
(6) 三角形,
struct sjx
{float a,b,c; /*三边 */};
第 9章 结构体类型与共用体类型
9.1.2 结构体变量的定义
(1) 先定义结构体类型,再定义结构体变量。
形式为:
① struct
{成员表 };
② struct 标识符 变量表;
例如,对以上定义的结构体类型,我们可以定义如下一些结构体变量:
struct student zhang; /*张同学情况 */
struct person p[ 100]; /*100个人的数据 */
struct point2 p1,p2; /*平面上的两个点 */
struct point3 po1,po2; /*空间上的两个点 */
第 9章 结构体类型与共用体类型
(2) 定义结构体类型的同时定义结构体变量。
形式为:
struct
{成员表 } 变量表;
例如,对以上定义的结构体变量,我们可以在定义结构体类型的同时定义如下:
① struct student
{ int no;
char name[ 8];
char sex;
int age;
float cscore;
} zhang; /*张同学情况 */
第 9章 结构体类型与共用体类型
② struct person
{char name[ 8];
char sex;
int age;
float height;
float weight;
char add[ 40];
} p[ 100]; /*100个人的数据 */
第 9章 结构体类型与共用体类型
③ struct point2
{float x;
float y;
} p1,p2; /*平面上的两个点 */
struct point3
{float x;
float y;
float z;
} po1,po2; /*空间上的两个点 */
第 9章 结构体类型与共用体类型
(3) 直接定义结构体变量。
形式为:
struct
{成员表 } 变量表;
直接定义结构体变量,在关键字 struct后无标识符,
不出现结构体名,仅给出成员表及变量表。 例如,对以上定义的结构体变量,我们可以直接定义如下:
第 9章 结构体类型与共用体类型
① struct
{ int no;
char name[ 8];
char sex;
int age;
float cscore;
} zhang; /*张同学情况 */
第 9章 结构体类型与共用体类型
② struct
{char name[ 8];
char sex;
int age;
float height;
float weight;
char add[ 40];
} p[ 100]; /*100个人的数据 */
第 9章 结构体类型与共用体类型
③ struct
{float x;
float y;
} p1,p2; /*平面上的两个点 */
struct
{float x;
float y;
float z;
} po1,po2; /*空间上的两个点 */
第 9章 结构体类型与共用体类型如果重命名了结构体类型,则可以用新类型名来定义结构体变量。
例如:
typedef struct
{char name[ 8];
char sex;
int age;
float height;
float weight;
char add[ 40];
} persont; /*将结构体类型命名为 persont*/
persont p[ 100]; /*100个人的数据 */
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型
9.1.4 结构体变量的初始化初始化格式:
存储类别 struct
{成员表 } 结构体变量 ={初始化数据表 };
初始化数据表是相应成员的初值表。
第 9章 结构体类型与共用体类型例如:
(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。
第 9章 结构体类型与共用体类型
(2) static struct point2
{float x;
float y;
} p1={2.5,19.8};
p1.x初值 2.5,p1.y初值 19.8。
第 9章 结构体类型与共用体类型例 9 – 1 求某同学上学期 8门课程的总成绩与平均成绩 。
/*程序 9 - 1,求某同学的总成绩与平均成绩 */
main(
{struct st
{char xm[ 8];
float cj[ 9];
float tcj,acj;
} stu;
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型例 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);
}
第 9章 结构体类型与共用体类型运行结果:
请输入第一点的坐标,1,1
请输入第二点的坐标,3,3
两点之间的距离 =2.828
第 9章 结构体类型与共用体类型例 9 – 3 复数的加减运算。
/*程序 9 - 3,复数的加减运算 */
main(
{struct complex
{float re;
float ie;
} x,y; /*输入变量 */
struct complex s1,s2; /*输出变量 */
printf( ″请输入第一个复数的实部,虚部,″);
scanf( ″%f,%f″,&x.re,&x.ie);
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);
}
第 9章 结构体类型与共用体类型运行结果:
请输入第一个复数的实部,虚部,3.2,4.3
请输入第二个复数实部,虚部,2.1,3.1
所求复数的和 = 5.3+ 7.5 i
所求复数的差 = 1.1+ 1.2 i
第 9章 结构体类型与共用体类型
9.1.5
例 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));
return( d);
}
第 9章 结构体类型与共用体类型例 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); /*调用函数求差 */
第 9章 结构体类型与共用体类型
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) /*求两个复数和的函数 */
struct complex xx,xy;
{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章 结构体类型与共用体类型
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] ;
};
第 9章 结构体类型与共用体类型我们也可采用如下的嵌套结构体形式:
struct person
{char name[ 8];
char sex;
int age;
struct date
{int year;
month;
day;
} birthday; /*增加的结构体成员 */
float height;
float weight;
char add[ 40];
};
第 9章 结构体类型与共用体类型
9.2 结构体数组结构体数组的定义与结构体变量的定义一样有以下三种形式:
(1) Struct
{成员表 } ;
struct 标识符 数组名 [ 常量 ] ;
(2) struct
{成员表 } 数组名 [ 常量 ] ;
(3) struct
{成员表 } 数组名[常量];
第 9章 结构体类型与共用体类型例如,100个同学的情况,我们可以定义结构体数组 allst描述:
struct student
{int no;
char name[ 8];
char sex;
int age;
float score[ 31];
float tcj,acj;
} allst[ 100];
第 9章 结构体类型与共用体类型对结构体数组 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章 结构体类型与共用体类型例 9 – 6 用结构体数组处理全班 50个同学的 C语言课程成绩 。
/*程序 9 - 6,用结构体数组处理 C语言成绩,排序输出 */
# define STT struct student
STT
{char xm[ 8];
float c; };
main(
{STT cs[ 51]; /*存放 50个同学的姓名,C成绩 */
int i;
int flag;
STT t; /*排序时用于交换数据 */
for( i=1; i <50; i++) /*输入 50个同学的姓名,C成绩 */
第 9章 结构体类型与共用体类型
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 %6d\n″,cs[ i],xm,cs[ i],c,i);
}
第 9章 结构体类型与共用体类型例 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++)
第 9章 结构体类型与共用体类型
{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章 结构体类型与共用体类型
9.3 共用体类型
9.3.1 共用体类型的定义共用体类型定义用关键字 union标识,形式为:
union 标识符
{成员表 };
第 9章 结构体类型与共用体类型标识符给出共用体名,是共用体类型名的主体,定义的共用体类型由,union 标识符,标识。例如,定义一个共用体类型,要求包含一个整型成员,一个字符型成员和一个单精度型成员:
union icf
{int i;
char c;
float f;
};
第 9章 结构体类型与共用体类型
9.3.2 共用体变量的定义
(1) 先定义共用体类型,再定义共用体变量:
① union
{成员表 };
② union 共用体名 变量表;
(2) 定义共用体类型的同时定义共用体变量:
union
{成员表 } 变量表;
(3) 直接定义共用体变量:
union {成员表 } 变量表;
第 9章 结构体类型与共用体类型
9.3.3 共用体变量的引用共用体变量不能直接使用,只能使用里面的某个成员,其成员同样通过点运算描述 。 形式为:
共用体变量名,
例如,定义上面共用体类型变量 x,x占有 4个字节的空间,x.i 表示其整型成员,x.c表示其字符型成员,
x.f表示其单精度型成员 。
第 9章 结构体类型与共用体类型说明:
(1) 共用体变量中,可以包含若干个成员及若干种类型,但共用体成员不能同时使用 。 在每一时刻,只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型 。
(2) 共用体变量中起作用的成员值是最后一次存放的成员值,即共用体变量所有成员共用同一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值 。
(3) 共用体变量的地址和它的各个成员的地址相同。
第 9章 结构体类型与共用体类型
(4) 不能对共用体变量初始化和赋值,也不能企图引用共用体变量名来得到某成员的值 。
(5) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型 。
(6) 共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至还可以定义共用体数组 。
第 9章 结构体类型与共用体类型例 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];
第 9章 结构体类型与共用体类型
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);
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型
9.4 枚举类型
9.4.1 枚举类型的定义枚举类型定义用关键字 enum标识,形式为:
enum
{枚举数据表 };
标识符用来区分不同的枚举类型,定义的枚举类型用
enum标识符,标识。
枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,从 0开始,依次递增。
第 9章 结构体类型与共用体类型例如:
(1) 定义枚举类型 status,包含复制与删除两种状态:
enum status
{copy,delete};
枚举类型 status仅有两个数据,一个是 copy,一个是 delete,序号为 0,1,代表复制与删除 。
第 9章 结构体类型与共用体类型
(2) 定义枚举类型 color,包含红,黄,蓝,白,黑五种颜色:
enum color
{red,yellow,blue,white,black};
枚举类型 color有 red,yellow,blue,white,black
五个数据,序号为 0,1,2,3,4,代表红,黄,
蓝,白,黑五种颜色 。
第 9章 结构体类型与共用体类型
(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章 结构体类型与共用体类型
9.4.2 枚举类型变量的定义
(1) 先定义枚举类型,再定义枚举类型变量:
enum 标识符 {枚举数据表 };
enum 标识符 变量表;
(2) 在定义枚举类型的同时定义枚举类型变量:
enum 标识符 {枚举数据表 } 变量表;
(3) 直接定义枚举类型变量:
enum {枚举数据表 } 变量表;
第 9章 结构体类型与共用体类型例如,对枚举类型 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;
枚举类型数据可以进行赋值运算 。 枚举类型是有序类型,
枚举类型数据还可以进行关系运算 。 枚举类型数据的比较转化成对序号进行比较,只有同一种枚举类型的数据才能进行比较 。
第 9章 结构体类型与共用体类型将枚举型数据按整型格式输出,可得到整数值
( 枚举变量值的序号 ) 。
使用强制类型转换,可将整数值 ( 枚举值序号 ) 转换成对应枚举值 。 例如:
c1=( enum color ) 2; /*c1得到枚举值 blue*/
枚举类型数据不能直接输入输出 。 枚举类型数据输入时,先输入其序号,再进行强制类型转换完成 。 输出时,采用开关语句先进行判断,再转化成对应字符串输出 。
第 9章 结构体类型与共用体类型例 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); /*输出一种取法 */
}
}
不用枚举类型:
第 9章 结构体类型与共用体类型采用枚举类型来描述数据 。 设用 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++)
第 9章 结构体类型与共用体类型
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;
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型
9.5 程序设计举例例 9 - 10 编写程序,登录幼儿园 200个小朋友的数据:
编号,姓名,性别,年龄,身高,体重,出生日期,入园日期,分别按身高,年龄排序输出 。
/*程序 9 - 10,幼儿园小朋友数据登录,排序 */
# define M 200
struct dst
{int year;
int month;
int day; };
第 9章 结构体类型与共用体类型
struct cst
{int no;
char name[ 12];
char sex;
float age;
float height;
float weight;
dst bdate;
dst edate; };
struct cst all[ M];
main(
{void input( ); /*调用函数申明 */
void sort1( );
void sort2( );
void output( );
第 9章 结构体类型与共用体类型
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
第 9章 结构体类型与共用体类型
[ 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;
}
}
第 9章 结构体类型与共用体类型
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;
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型例 9 - 11 编写程序,实现复数的乘法运算。
/*程序 9 - 5,采用函数实现复数的乘法运算 */
struct complex
{float re;
float ie; } ;
main(
{struct complex x,y;
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);
}
第 9章 结构体类型与共用体类型
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章 结构体类型与共用体类型例 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( );
第 9章 结构体类型与共用体类型
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]);
}
}
第 9章 结构体类型与共用体类型
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
第 9章 结构体类型与共用体类型
{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;
第 9章 结构体类型与共用体类型
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″);
}
}