C++强化 | 13 结构体入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++强化 | 13 结构体入门相关的知识,希望对你有一定的参考价值。



戳一戳!和我一起走进信息学的世界

导读

C++是大多数学生入门信息学、参加信息学竞赛必备的编程语言。掌握C++,能够有助于孩子未来工作发展,也能提升孩子的综合能力,如抗挫折能力、逻辑分析能力等。


本篇文章中,让我们一起了解一下结构体吧!

往期回顾

【NOIP竞赛/CSP认证】

▶  赛前必看!信息学名师带你复习NOIP竞赛初赛及CSP认证初赛


【信息学精华帖】

▶  信息学的万般好处!附C++必备基础知识总结

▶  信息学提高班知识体系详解与家长常见问题解答!让孩子赢在提高班学习的起跑线!


【C++提高班教程】

▶  C++强化 | 01 新学期再出发!温故知新!

▶  C++强化 | 02 继续前行,三大结构终极介绍

▶  C++强化 | 03 一维数组入门

▶  C++强化 | 04 数组越界

▶  C++强化 | 05 一维数组经典应用

▶  C++强化 | 06 一篇文章带你掌握字符数组

▶  C++强化 | 07 二维数组

▶  C++强化 | 08 二维数组经典案例

▶  C++强化 | 09 一篇文章带你探索函数的奥秘

▶  C++强化 | 10 函数进阶必备

▶  C++强化 | 11 这样学递归,才不会觉得难

▶  C++强化 | 12 格式化输入输出与文件操作


【C++基础班教程】

▶  C++总结 | 01 程序的世界

▶  C++总结 | 02 输出、换行与注释

▶  ​C++总结 | 03 变量定义、赋值与运算​

▶  ​C++总结 | 04 算术运算符与赋值运算符​

▶  ​C++总结 | 05 cin语句​

▶  ​C++总结 | 06 程序中的数据类型​

▶  ​C++总结 | 07 数据类型补充​

▶  ​C++总结 | 08 顺序结构​

▶  ​C++总结 | 09 if 和 if-else​

▶  C++总结 | 10 if嵌套与逻辑运算符

▶  C++总结 | 11 开关语句switch-case

▶  C++总结 | 12 for循环及其应用

▶  C++总结 | 13 数据范围与数据类型

▶  C++总结 | 14 break与continue

▶  C++总结 | 15 while与do-while

▶  C++总结 | 16 循环嵌套及其应用



1 说在前面的话

我们怎么去定义学生呢?比如学生有如下属性:


姓名
性别
年龄
身高
体重


我们之前会这样定义:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;
int main()
string name;
bool sex;
int age;
float height,width;
return 0;


今天我们会讲什么新的内容呢,我们如何用今天的新内容来定义学生呢?让我们一起走进今天的课程吧!

2 结构体初步

如果我们想定义两个学生的这些属性,怎么办呢?

1 之前的定义方式

按照我们之前的定义方式:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;
int main()
string name1,name2;
bool sex1,sex2;
int age1,age2;
float height1,height2,width1,width2;
return 0;


从代码整体来看我们定义了大量的变量,这些变量各不相同,没办法像数组一样,统一定义。所以就要用到一个新的知识——结构体

2 结构体

我们日常生活中,不管是人也好,还是物品也好,基本都有很多的属性,这些属性构成了这一个整体,这个整体是一个完整的结构。所以我们是否可以利用这个思想,来定义一个完整的结构,这个结构中包含所有的这些属性呢?


这是可行的,C++中提供了结构体的功能,例如,我们想定义上面的同学,可以按照如下方式定义:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
;

int main()

return 0;


3 练一练

1、定义一个桌子的结构体,包括如下属性:


高度
重量
颜色
价格


写完后,可以点击空白处查看代码哦:



(点击空白处查看代码)

#include<iostream>
using namespace std;

struct Desk
float height,width;
string color;
int price;
;

int main()

return 0;




2、定义一个自己喜欢的小动物,有如下属性:


类别:例如猫,狗,熊,熊猫,狗熊;
昵称:例如豆豆,贝贝等;
年龄:例如2岁;
体重:例如8公斤;
……


写完后,可以点击空白处查看代码哦:


(点击空白处查看代码)

#include<iostream>
using namespace std;

struct Animal
string category,name;
int age;
float weight;
;

int main()

return 0;



‍我想大家通过这两个练习,应该能对结构体有更深刻的认识了,现在我们可以来总结一下结构体的定义了。


结构体的定义方式如下:


struct [结构体名] 
属性类型1 属性名1;
属性类型2 属性名2;
……
属性类型n 属性名n;
;


注意,一般结构体名首字母大写

3 结构体变量

我们学会定义结构体了,那我们如何使用结构体来定义变量呢?结构体变量又有哪些操作呢?

1 结构体变量定义

我们定义了结构体,就可以利用结构体来定义变量了。简单来理解,我们可以把结构体当做是一个数据类型。我们可以有两种方式来定义结构体变量:


定义结构体时,定义结构体变量;
定义结构体后,定义结构体变量。


对于第一种情况,我们可以定义结构体如下:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1, stu2;

int main()

return 0;


对于第二种方式,我们可以定义结构体如下:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1, stu2;

int main()
Student stu3,stu4;
return 0;


2 结构体变量赋值

当我们学会如何定义结构体变量的时候,我们就可以对结构体变量进行赋值了。


最简单的赋值,和给数组的赋初值是一样的,用大括号将所有的赋值内容扩住,不同的变量赋值,用逗号隔开:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1, stu2;

int main()
Student stu3,stu4;
stu1 = "小明", 1, 13, 1.65, 80;
return 0;


上面这种方式会给所有而数据统一赋值,如果我们想对某个单独的属性进行赋值,我们可以用"."来获取结构体变量的具体属性,例如:


stu1.age


上面的用法可以获取stu1的age属性,我们可以把上面的当做一个变量名,来进行赋值:


stu1.age = 13;


现在我们对stu2的所有属性进行赋值,我们可以有多种赋值方式:


输入赋值;
用其他结构体变量的属性赋值;
用常量值赋值;
用其他变量赋值;


代码如下:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1, stu2;

int main()
Student stu3,stu4;
float w = 70;
stu1 = "小明", 1, 13, 1.65, 80;
cin>>stu2.name; //输入赋值
stu2.age = stu1.age; //用其他结构体变量的属性赋值
stu2.sex = 0; //用常量值赋值;
stu2.height = 1.61;
stu2.width = w; //用其他变量赋值
return 0;


3 结构体变量操作

结构体变量的操作和普通变量的操作是一致的,普通变量可以有的操作,结构体变量也都有,我们这里举几个例子:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1, stu2;

int main()
Student stu3,stu4;
stu3 = "小红", 0, 13, 1.65, 80;
stu3.age++;
stu3.height += 0.2;
stu3.width -= 1;
return 0;


其他的操作,我们在后续课程中,不断深入讲解。

4 结构体变量输出

前面我们将结构体变量和普通变量的操作是一致的,输出方式也是一样的。


要注意的是,我们不能直接输出结构体变量。只能每次输出结构体变量的某个属性:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1, stu2;

int main()
Student stu3,stu4;

stu3 = "小红", 0, 13, 1.65, 80;
stu3.age++;
stu3.height += 0.2;
stu3.width -= 1;

cout<<"姓名:"<<stu3.name<<endl;
if(stu3.sex) cout<<"性别:男"<<endl;
else cout<<"性别:女"<<endl;
cout<<"年龄:"<<stu3.age<<endl;
cout<<"身高:"<<stu3.height<<endl;
cout<<"体重:"<<stu3.width<<endl;

return 0;


4 应用案例

讲完了上面的理论知识,我们一起来看一些非常重要的应用吧!

1 结构体数组变量

我们可以用结构体定义结构体变量,也可以使用结构体定义结构体数组变量


和结构体定义普通结构体变量一致,有如下两种方式:


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1[10];

int main()
Student stu2[10];

return 0;


定义好之后,我们就可以针对结构体数组变量做相关的操作了,为了方便演示,我们定义一个长度为5的结构体数组变量。


/*姓名、性别、年龄、身高、体重*/
#include<iostream>
using namespace std;

struct Student
string name;
bool sex;
int age;
float height,width;
stu1[5];

int main()
cout<<"请输入5名学生的信息,包括姓名,性别,年龄,身高、体重:"<<endl;
for(int i = 0;i<5;i++)
cin>>stu1[i].name; //输入索引为i的同学的姓名
cin>>stu1[i].sex;
cin>>stu1[i].age;
cin>>stu1[i].height;
cin>>stu1[i].width;


for(int i = 0;i<5;i++)
cout<<"第"<<i+1<<"名同学姓名是:"<<stu1[i].name<<endl;
if(stu1[i].sex) cout<<"性别:男"<<endl;
else cout<<"性别:女"<<endl;
cout<<"年龄:"<<stu1[i].age<<endl;
cout<<"身高:"<<stu1[i].height<<endl;
cout<<"体重:"<<stu1[i].width<<endl;

return 0;


/*
小明 1 13 1.65 98
小华 1 13 1.67 100
小红 0 12 1.55 65
小荷 0 13 1.57 72
小刚 1 12 1.75 110

*/


2 学生成绩统计

某班级有5名同学,有三个属性:


学号
姓名
成绩


要统计班级同学的平均成绩和最高成绩,输出平均成绩和最高成绩的同学(每名同学成绩各不相同)。


我们可以每次判读成绩的时候,记录最高成绩的序号,根据序号去获取学生的学号,姓名和成绩。代码如下:


#include<iostream>
using namespace std;

struct Student
string name;
int num; //学号
float score;
stu[5];

int main()
cout<<"请输入5名学生的信息,包括学号,姓名,成绩:"<<endl;
int n;
float maxSc = 0,sumScore = 0;
for(int i = 0;i<5;i++)
cin>>stu[i].num;
cin>>stu[i].name;
cin>>stu[i].score;


for(int i = 0;i<5;i++)
sumScore += stu[i].score;
if(stu[i].score>maxSc)
maxSc = stu[i].score;
n = i;


cout<<"这个班级的平均成绩是:"<<sumScore/5<<endl;
cout<<"最高成绩的同学是:"<<stu[n].name<<endl;
cout<<"最高成绩的学号为:"<<stu[n].num<<endl;
cout<<"最高成绩为:"<<stu[n].score<<endl;
return 0;


/*
100 小明 98
101 小华 100
102 小红 65
103 小荷 72
104 小刚 53

*/


5 习题

学完了结构体的基本知识,要多练习才能掌握呀!

1 学生成绩排序

题目


某班级有5名同学,有三个属性:


学号
姓名
成绩


对班级同学按照成绩从高到低进行排序。

2 判断合格名单

题目


某班级有5名同学,有三个属性:


学号
姓名
成绩(满分100分)


60分以上为合格,请输出合格同学的学号及姓名。



AI与区块链技术

C++强化

长按二维码关注

以上是关于C++强化 | 13 结构体入门的主要内容,如果未能解决你的问题,请参考以下文章

C++ 结构体深入理解

自定义类型:结构体

多智能体强化学习入门

C++入门基础教程:C语言的指针与结构体到底怎么用?

C++入门基础教程:C语言的指针与结构体到底怎么用?

C++编程基础: 13. 结构体与联合体