1.10 结构体
在解决实际问题的过程中常常会遇到这样的问题,如存储一个公司员工的基本信息,包括姓名、性别、年龄、月薪等,其中的信息需要使用字符数组、整型、指针类型等,有的读者一开始会想到用数组类存储,但是细想就知道不能使用数组,因为数组只能用来存储相同类型的数据,而这里的数据类型显然不止一种。我们不希望在存储员工信息的时候使用单个变量来分别表示每类信息,因为这样不能够很好地反映出它们之间的内在联系。为了能够将这些不同类型的元素放到一起,可以利用C语言中的结构体将这些元素类型“封装”在一起,得到一种新的自定义数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。定义结构体的一般形式为:
struct结构体名{
成员类型成员名;
……
成员类型成员名;
};
结构体名是自定义的标识符,但是要遵循自定义标识符的命名规则。其中的成员类型可以是任何基本数据类型,也可以是指针或数组等复合数据类型,还可以是结构体或共用体。
接下来用结构体按照如下的方式来描述公司员工的基本信息。
struct personnel{
char name[20];
char sex[10];
int age;
float salary;
};
定义了这种结构体之后,该如何来定义结构体变量呢?看看下面几种定义结构体变量的实现方法。
struct结构体名{
成员类型成员名;
……
成员类型成员名;
}变量名1,变量名2……;
也可以去掉结构体名,直接定义结构体变量。
struct{
成员类型成员名;
……
成员类型成员名;
}变量名1,变量名2……;
还可以先定义结构体,再定义结构体变量。
struct结构体名{
成员类型成员名;
……
成员类型成员名;
};
struct结构体名变量名1,变量名2……;
对于结构体成员的引用,读者可以在编程中根据自己的习惯选择相应的引用方式。值得注意的一点是,结构体为它的每一个成员都分配存储空间,这与接下来所要讲的共用体是不同的。通过前面的介绍,我们对结构体有了一个初步的了解,接下来看一段代码,以加深对结构体的理解。
include<stdio.h>
struct personnel{
char name[20];
char sex[10];
int age;
double salary;
};
void input(struct personnel pers[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请依次输入员工的姓名,性别,年龄,月薪:");
scanf("%s%s%d%lf",&pers[i].name,&pers[i].sex,&pers[i].age,&pers[i].salary);
}
return;
}
struct personnel find_max(struct personnel pers[],int n)
{
int i,index;
double tmp;
tmp=pers[0].salary;
for(i=1;i<n;i++)
if(pers[i].salary>tmp)
{
index=i;
tmp=pers[i].salary;
}
return pers[index];
}
struct personnel find_min(struct personnel pers[],int n)
{
int i,index;
double tmp;
index=0;
tmp=pers[0].salary;
for(i=1;i<n;i++)
if(pers[i].salary<tmp)
{
index=i;
tmp=pers[i].salary;
}
return pers[index];
}
void print(struct personnel pers)
{
printf("员工姓名:%s\t性别:%s\t年龄:%d\t月薪:%6.2f\n",
pers.name,pers.sex,pers.age,pers.salary);
return;
}
void main()
{
struct personnel pers[4],pers_max,pers_min;
input(pers,4);
pers_max=find_max(pers,4);
printf("\n工资最高的员工信息\n");
print(pers_max);
pers_min=find_min(pers,4);
printf("\n工资最低的员工信息\n");
print(pers_min);
return;
}
运行结果:
请依次输入员工的姓名,性别,年龄,月薪:王小明男20 5600
请依次输入员工的姓名,性别,年龄,月薪:王美美女22 8666
请依次输入员工的姓名,性别,年龄,月薪:张小明男56 12300
请依次输入员工的姓名,性别,年龄,月薪:牟小玲女21 5800
工资最高的员工信息
员工姓名:张小明性别:男年龄:56月薪:12300.00
工资最低的员工信息
员工姓名:王小明性别:男年龄:20月薪:5600.00
分析上面的代码,定义的结构体中包含了员工的姓名、性别、年龄和月薪,在main()函数中定义了一个含有4个元素的结构体数组。定义的函数有输入函数input(),查找月薪最高的员工函数find_max(),查找员工月薪最低的员工函数find_min(),以及用来打印查找到的员工信息的函数print()。细心的读者会发现,在上面的代码中,我们将结构体作为函数的返回类型,成功地返回了所需要的信息,因此可以看出,函数的返回类型不仅可以是简单的char和int等类型,还可以是自定义的结构体等复合类型。