在实际情况下,往往要存储批量数据,比如,某个人的基本信息,包括:姓名、年龄、性别、身份证号码、住址等。有的同学说了,可以使用数据存储。说的很好,但是别忘了,数组只能存储同样类型的数据。

在学校中,经常需要统计学生成绩,即,同时记录学生的姓名、语文成绩、数学成绩等不同信息。记录姓名需要使用字符串类型的变量,而成绩则需要使用整型或者浮点类型的变量,这就不能使用数组进行记录了。

为了解决这一类问题,C++语言给出了一个构造数据类型–结构体。这次我们就来介绍结构体,结构体把不同类型的数据信息集合到一起,以便于处理这些信息。

结构体的定义

结构体的定义有以下形式:

1
2
3
4
5
6
struct 类型名{
    数据类型1  成员变量1
    数据类型2  成员变量2
}[结构体变量名]; //在定义结构体时,也可以不同时定义变量

struct 定义过的类型名  结构体变量名;//前面也可以不加"struct"

C++中的结构体是由许多相同或者不同类型的数据构成的数据集合。上面的例子,一名学生有姓名(字符串),有成绩(整数),因此,可以如下定义:

1
2
3
4
5
6
struct student{
    string name;
    int chinese, math, english;
} a;//同时定义一个结构体变量a

struct student b;//定义一个结构体变量b

例子中定义了一个名叫student的结构体类型,里面包括name、chinese、 math、english这几个变量,其中name是字符串类型,其他的变量都是整型。在定义结构体时,同时定义了变量a,然后又定义了变量b,a和b都是student类型。

变量a和b可以看作是a同学和b同学,用a.name表示a同学的姓名、a.math表示a同学的数学成绩。这些变量普通变量一样输入、赋值、计算等。

对于相同类型的结构体也可以直接赋值,比如,a = b;表示将b同学的所有信息赋值给a同学。

结构体的使用

由于结构体有些抽象,第一次学习的同学不是那么容易理解,下面举一个例子来帮助大家理解。

【例】谁是第一名?全班50个同学参加期末考试,共考了语文和数学两科。依次输入每个同学的姓名、语文成绩、数学成绩。然后,将总分第一名(有并列第一,按输入顺序,输出第一个同学)的姓名、语文成绩、数学成绩输出。

【分析】找出第一名,最先想到是排序。定义一个student类型,再定义一个student的数组,用来存放全班同学的姓名、语文成绩、数学成绩。或者使用打擂的方式,找出第一名,这样处理的话,就不用定义数组。

下面使用打擂的方式来解决这个问题。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<iostream>
#include<string>
using namespace std;
struct student{
    string name;
    int chinese, math;
}stu,top1;
int main(){
	top1.chinese = 0;
	top1.math = 0;
	for(int i = 0; i < 50; ++i){
		cin >> stu.name >> stu.chinese >> stu.math;
    	if(stu.chinese + stu.math > top1.chinese + top1.math) top1 = stu;
	}
    cout<< top1.name << " " << top1.chinese << " " << top1.math;
    return 0;
}

公众号:格致书院