C语言入门之结构体介绍

我们在学习数组时曾遇到过这样的例子:输入全班同学的成绩,输出最高分。

但是实际生活中,我们可能并不关心最高分是多少分,我们关心的是获得最高分的学生是谁,叫什么名字。

那么怎么实现呢?需要用到结构体类型。

1 结构类型

结构体也叫结构,是一种数据类型。

结构类型定义的语法格式如下:

C语言入门之结构体介绍

结构体定义的语法格式

注意:结构是类型,但它没有专门的类型名,不像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:

C语言入门之结构体介绍

程序1

程序1定义了两个结构体变量x和y,其中x在定义时已经初始化,y没有初始化,它的三个成员的值在运行时由用户输入。

请注意输入学号和姓名时,y.xh和y.x的前面是没有&的,但输入成绩时,y.cj前面的&不能去掉。

由于%s是字符串输入输出的格式控制符,输入时对应的字符串变量前面不需要用&。

程序1中最后一个语句是:return 0;

它的功能是程序结束,这个语句也可以省略。

运行结果:

C语言入门之结构体介绍

程序1运行结果

我们再来看一个例子。

例2:在一个学生成绩管理系统中,学生项目包括学号、姓名、语文成绩、数学成绩、英语成绩和平均分,请输入5个学生的学号、姓名和三门课成绩,计算并输出每个学生的平均分。

程序2:

C语言入门之结构体介绍

程序2

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

运行结果:

C语言入门之结构体介绍

程序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:

C语言入门之结构体介绍

程序3

注意上述程序中几个画蓝线的地方,由于数组下标默认从0开始,所以循环控制变量i也是从0开始。

提示第几个学生信息时,%d对应的是i+1,这是为了符合我们实际情况从1开始计数。

运行结果:

C语言入门之结构体介绍

程序3运行结果

红线上面的信息是运行时输入的。

好了,我们目前就可以解决本文一开始提出的问题了:输入全班同学的学号、姓名和三门课成绩,我要知道成绩最好的同学是谁?这位同学的姓名是什么?

全班有多少同学,就把数组长度定义为多少。列如全班有50人,那么我们在编程实际运行的程序时,定义的结构数组长度就得是50。

目前为了运行方面,我们假设全班只有5名同学,定义的数组长度为5。

程序4:输入全班同学的学号、姓名和三门课成绩,输出平均分最高的同学的姓名。

C语言入门之结构体介绍

程序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];

运行结果:

C语言入门之结构体介绍

程序4运行结果

红线上面的信息是运行时输入的各位同学的学号、姓名和三门课成绩,输入完毕程序给出平均分最高的同学的姓名。

6 总结

本节课介绍了如下内容:

  1. 结构类型的定义
  2. 结构变量的定义(有三种形式,提议用第一种)
  3. 结构变量的成员的引用
  4. 结构数组

还介绍了4个程序来协助各位朋友理解上述概念。

结构体还有一个重大应用是结构指针,但指针的概念还没有讲,等我们学完指针再来介绍结构指针。

C语言入门之结构体介绍

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
家书十五行的头像 - 鹿快
评论 共19条

请登录后发表评论

    暂无评论内容