11.1 结构体
11.2 共用体
11.3 枚举类型
11.4 自定义类型
11.1 结构体
1. 结构体类型的定义
struct student
{ int num;
char sex;
char name[20];
float score;
};
2. 结构体类型变量的定义、引用和初始化
struct student st1,st2;
st1.num=2016;
st1.sex='M';
strcpy(st1.name,"LiMing");
st1.score=82.5;
scanf("%d",&st2.num);
st2.sex=getchar();
gets(st2.name);
scanf("%f",&st2.score);
printf("%d,%c,%s,%f\n",st1.num,
st1.sex,st1.name,st1.score);
struct student
{int num;
char sex, name[20];
float score;
} st1,st2;
struct
{int num;
char sex, name[20];
float score;
} st1,st2;
struct date
{int month;
int day;
int year;
};
struct student
{char name[20];
struct date birthday;
char addr[30];
} student1, student2;
student1.birthday.month=5;
例1
struct student
{ int num;
char sex, name[20];
float score;
} st1={2016,'M', "LiMing",82.5};
main
{ printf("%d,%c,%s,%f\n", st1.num,st1.sex,st1.name,st1.score);
}
3.结构体数组
struct student
{ int num;
char sex;
char name[20];
float score;
} stu1[30];
例2 对候选人得票的统计程序。设有三个候选人,十个投票人, 每次输入一个得票的候选人名字,要求最后输出各人得票结果。
#include "string.h"
struct per
{char name[20];
int count;
} a[3]={"li",0,"zhang",0,"feng",0};
main( )
{int i,j;
char name[20];
for(i=1;i<=10;i++)
{gets(name);
for(j=0;j<3;j++)
if(strcmp(name,a[j].name)= =0)a[j].count++;
}
for(j=0;j<3;j++)
printf("%5s:%d\n",a[j].name,a[j].count);
}
4.指向结构体类型数据的指针
(1) 指向结构体变量的指针
例3
main( )
{struct student
{int num;
char sex, name[20];
float score;
} st1,*p;
p=&st1;
st1.num=2016;
(*p).sex='M';
strcpy(p->name,"LiMing");
p->score=82.5;
printf("%d,%c,%s,%f\n",p->num,p->sex,p->name,p->score);
}
(2)指向结构体数组的指针
例4
struct student
{int num;
char name[20];
char sex;
int age;
};
struct student stu[3]={{10101,"li lin",'M',18},
{10102,"zhangfan",'M',19},
{10105,"wangming",'F',20}};
main( )
{struct student *p;
for(p=stu;p<stu+3;p++)
printf("%5d%-20s%2c%4d\n",p->num,p->name,
p->sex,p->age);
}
(3)用指向结构体的指针作函数参数
例5 有一个结构体变量stu,内含学生学号、姓名和三门课的成绩,要求在main函数中赋以值,在另一函数print中将它们打印输出。
#include "string.h"
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{int num;
char name[20];
float score[3];
};
main( )
{ void print(struct student *p);
struct student stu;
stu.num=12345;
strcpy(stu.name,"li lin");
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.6;
print(&stu);
}
void print(struct student *p)
{printf (format, p->num, p->name, p->score[0], p->score[1],
p->score[2]);
}
例6 有30名学生,每个学生包括学号、姓名、成绩,要求找出成绩最高者的学号、姓名和成绩。
main( )
{struct stu
{int n;
char na[20];
int s;
};
struct stu t[30],*p;
int i,k;
for(i=0;i<30;i++)
scanf("%d%s%d",&t[i].n,t[i].na,&t[i].s);
k=0;
for(i=1;i<30;i++)
if(t[i].s>t[k].s)k=i;
p=t+k;
printf("%d %s %4d\n",p->n,p->na,p->s);
}
11.2 共用体
union tt
{ int i;
char ch;
float f;
};
union tt a,b,c;
a.ch='x';
a.i=28;
a.f=6.6;
b=a;
11.3 枚举类型
enum weekday{sun,mon,tue,wed,thu,fri,sat};
enum weekday day1,day2;
day1=sun;
day2=(enum weekday)2;
scanf("%d",&n);
switch(n)
{case 1:day1=mon;break;
case 2:day1=tue;break;
…… ……
}
printf("%d\n",day2);
switch(day1)
{case mon: printf("mon\n");break;
…… ……
}
11.4 定义类型名
typedef 已定义类型名 新类型名
typedef int INTEGER;
typedef char CH;
INTEGER i, j;
CH a,b;
typedef enum weekday WK;
WK day1,day2;
typedef int NUM[100];
NUM n;