我们在学习数组时曾遇到过这样的例子:输入全班同学的成绩,输出最高分。
但是实际生活中,我们可能并不关心最高分是多少分,我们关心的是获得最高分的学生是谁,叫什么名字。
那么怎么实现呢?需要用到结构体类型。
1 结构类型
结构体也叫结构,是一种数据类型。
结构类型定义的语法格式如下:

结构体定义的语法格式
注意:结构是类型,但它没有专门的类型名,不像int、float、char等类型,结构类型名是用户自己定义的,用关键字struct引出结构类型。
例如:
struct STU
{
char xh[10];
char xm[20];
float cj;
};
我这里定义了一个学生类型,类型名为STU,有3个成员:学号(xh, 字符串)、姓名(xm, 字符串)、成绩(cj,实数型)。
注意右大括号后面有分号。
2 结构变量
定义了结构类型,那么就可以定义结构类型的变量了。
这跟我们以前学的不一样,由于以前学的不用定义类型,直接定义变量。如:
int a;
float b;
定义了两个变量a和b,分别属于整型和实数型。
为什么以前不用定义类型,由于这些类型如int、float等是系统本来就有的,可以直接用。
而结构类型不同,必须定义类型,给类型起名,还要定义这个结构类型有那些成员。就像前面定义的结构类型STU,类型名STU是自己起的名字,这个类型有3个成员:xh、xm和cj。
有了类型,就可以定义变量了。
结构变量的定义有三种形式:
(1) 单独定义
先定义结构类型,再定义具有这种结构类型的变量。如:
struct STU
{
char xh[10];
char xm[20];
float cj;
};
struct STU x, y;
定义两个结构变量:x和y。
(2) 混合定义
在定义结构体类型的同时定义结构体变量。如:
struct STU
{
char xh[10];
char xm[20];
float cj;
} x, y;
(3) 无类型名定义
省略结构体名,定义结构体变量。如:
struct
{
char xh[10];
char xm[20];
float cj;
} x, y;
第3种方式,没有定义结构类型名,只定义了结构变量。
以上3种方式中,提议使用第1种方式。
3 结构变量的初始化
结构变量定义的时候可以直接赋初值,即初始化。如:
struct STU
{
char xh[10];
char xm[20];
float cj;
};
struct STU x = { “0720259801”, “张三”, 98 } ;
定义了一个结构变量x, 初值为学号是”0720259801”, 姓名”张三”,成绩98分。
4 结构变量的使用
由于每个结构变量都由不同类型的成员组成,我们使用结构变量,实则就是为了使用这些成员,结构变量成员的引用语法格式为:
结构变量名.结构成员名
结构变量名和结构成员名之间,有一个点。
如上例,我们定义了一个结构变量x,x的成绩为100分,可以这样引用x的成绩:
x.cj = 100 ;
我们写程序时,可以把结构类型的定义写在main函数的外面,在main函数里定义结构变量。
程序1:

程序1
程序1定义了两个结构体变量x和y,其中x在定义时已经初始化,y没有初始化,它的三个成员的值在运行时由用户输入。
请注意输入学号和姓名时,y.xh和y.x的前面是没有&的,但输入成绩时,y.cj前面的&不能去掉。
由于%s是字符串输入输出的格式控制符,输入时对应的字符串变量前面不需要用&。
程序1中最后一个语句是:return 0;
它的功能是程序结束,这个语句也可以省略。
运行结果:

程序1运行结果
我们再来看一个例子。
例2:在一个学生成绩管理系统中,学生项目包括学号、姓名、语文成绩、数学成绩、英语成绩和平均分,请输入5个学生的学号、姓名和三门课成绩,计算并输出每个学生的平均分。
程序2:

程序2
程序2用到循环,循环5次,每次输入一个学生的信息,输入完毕即刻输出。
运行结果:

程序2运行结果
红线上面的信息是运行时用户输入的。
像上面这样,输入一个学生信息,就马上输出信息,显得有些乱。
那么我们可不可以输入完5个学生的信息后再输出信息呢?
可以的,但这就需要定义结构数组了。
5 结构数组
结构数组的定义方法与结构变量一样,如:
struct STU
{
char xh[10];
char xm[20];
float cj;
};
struct STU a[10];
定义了一个数组变量a,有10个元素: a[0]、a[1]、a[2]、…、a[9]。
每个元素都是结构类型。
结构数组元素的成员引用格式:
结构体数组名[下标] . 结构体成员名
程序2改写成先输入完5个学生信息,再输出。
程序3:

程序3
注意上述程序中几个画蓝线的地方,由于数组下标默认从0开始,所以循环控制变量i也是从0开始。
提示第几个学生信息时,%d对应的是i+1,这是为了符合我们实际情况从1开始计数。
运行结果:

程序3运行结果
红线上面的信息是运行时输入的。
好了,我们目前就可以解决本文一开始提出的问题了:输入全班同学的学号、姓名和三门课成绩,我要知道成绩最好的同学是谁?这位同学的姓名是什么?
全班有多少同学,就把数组长度定义为多少。列如全班有50人,那么我们在编程实际运行的程序时,定义的结构数组长度就得是50。
目前为了运行方面,我们假设全班只有5名同学,定义的数组长度为5。
程序4:输入全班同学的学号、姓名和三门课成绩,输出平均分最高的同学的姓名。

程序4
定义了一个变量max,类型为结构类型STU, 用于存放最高分学生的信息。
先默认第一个学生平均分最高,把它( a[0] )赋值给max。
然后将max和后面所有学生比较平均分,一旦发现某个人( a[i] )的平均分高于max的平均分,代码如下:
if (a[i].pjf > max.pjf )
则将max换成这个学生,代码如下:
max = a[i] ;
这里特别要注意,比较是用平均分比较,不能整体比较,列如写成下面这种形式是不对的:
if( a[i] > max )
但是赋值是整体赋值:max = a[i];
运行结果:

程序4运行结果
红线上面的信息是运行时输入的各位同学的学号、姓名和三门课成绩,输入完毕程序给出平均分最高的同学的姓名。
6 总结
本节课介绍了如下内容:
- 结构类型的定义
- 结构变量的定义(有三种形式,提议用第一种)
- 结构变量的成员的引用
- 结构数组
还介绍了4个程序来协助各位朋友理解上述概念。
结构体还有一个重大应用是结构指针,但指针的概念还没有讲,等我们学完指针再来介绍结构指针。

















- 最新
- 最热
只看作者