结构体操作
结构体的概念
有时候需要存储大量的数据,可以考虑使用数组来存储
但是数组只能存储一组同样数据类型的信息,如果同时记录考生的姓名、成绩等不同的信息,就需要使用结构体
struct 类型名
{
数据类型 1 成员变量1;
数据类型 2 成员变量2;
};
结构体定义:
struct student
{
string name; //学生名字
int chinese,math,english; //学生成绩
};
定义一个名字是student的结构体类型
我们把结构体当中的每个变量叫做成员变量
在这个例子中,一共有四个成员变量,name是字符串,chinese,math,englisth是整数类型
在使用结构体之前,必须先新建一个结构体实例,采用 结构体名称 变量
#include <iostream>
#include <string>
using namespace std;
struct student {
string name;
int math,english,chinese;
};
int main(){
//新建一个student实例,名称是s1
student s1;
}
结构体的赋值
针对变量整体赋值
在定义结构体变量时对其进行整体的初始化赋值
#include <iostream>
#include <string>
using namespace std;
struct student {
string name;
int math,english,chinese;
};
int main(){
student s1 = {"zhangsan",60,70,80};
return 0;
}
给成员变量单独赋值
在定义完结构体变量之后,对成员变量进行单独赋值
#include <iostream>
#include <string>
using namespace std;
struct student{
string name;
int math,english,chinese;
};
int main(){
student s1;
s1.name = "zhangshan";
s1.math = 60;
s1.chinese = 70;
s1.english = 80;
cout << s1.name << endl;
cout << s1.chinese << endl;
cout << s1.english << endl;
cout << s1.math << endl;
return 0;
}
格式:结构体变量名.成员名 = 数据值;
问题
课代表需要统计成绩及格的同学的名字,已知5个同学的成绩和姓名,编写程序输出及格同学的姓名
100 zhangming
78 liukai
56 zhoutao
98 yuanqiu
92 daiqiao
zhangming
liukai
yuanqiu
daiqiao
问题分析
1.定义一个5个大小的结构体数组,用于存储5个同学的成绩和名字
2.通过循环的方式来获得输入
3.遍历数据,一旦发现成绩有大于60的,则输出名称
#include <iostream>
#include <string>
using namespace std;
//建立结构体,题目当中只有名称和成绩
struct student{
int score;
string name;
};
int main(){
student s[5];
//利用循环进行输入操作
for (int i = 0;i < 5;i++){
cin >> s[i].score >> s[i].name;
}
//利用循环遍历,找出成绩及格的同学
for (int i = 0 ;i < 5;i++){
if (s[i].score >= 60)
cout << s[i].name << endl;
}
return 0;
}
问题
收集了若干名同学的姓名和数学、语文的成绩,需要编程找到总成绩第n名的同学,并输出他的姓名
4 2
98 78 zhangming
78 92 yuanfeng
89 95 liuyue
100 89 lili
liuyue
排序函数
sort (排序其实地址,终止地址)
默认从小到大进行排序,终止地址不包括当前位置的元素,即只排序初始地址元素到终止地址之间的元素,
注:需要包含头文件:<algorithm>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int a[10] = {5,14,6,12,1,2,98,23,56,34};
//对数组进行排序
sort(a,a+10);
for (int i = 0;i < 10;i++){
cout << a[i] << " ";
}
}
使用案例
1 2 5 6 12 14 23 34 56 98
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(student a,student b){
return a.math > b.math;
}
如何对结构体进行排序
结构体中有很多成员变量,有的时候,我们对结构体进行排序按照一个成员变量的大小进行排序
我们需要新建一个函数,用于告诉计算机该用哪个成员变量来进行比较
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct student{
int sum;
string name;
};
bool cmp(student a,student b){
return a.sum > b.sum;
}
int main(){
student s[5];
s[0].sum = 78;
s[0].name = "liuyue";
s[1].sum = 60;
s[1].name = "zhangming";
s[2].sum = 70;
s[2].name = "huang";
s[3].sum = 58;
s[3].name = "hetian";
s[4].sum = 76;
s[4].name = "liyue";
sort(s,s+5,cmp);
for (int i = 0;i<5;i++){
cout << s[i].name << "," << s[i].sum << endl;
}
}
使用案例
liuyue,78
liyue,76
huang,70
zhangming,60
hetian,58
问题分析
1.定义一个足够大的结构体数组,用于存储同学的成绩和名字
2.获得相关的输入,包括同学数、总成绩第几名的同学、同学的成绩和姓名
3.计算总成绩,并进行排序,输出结果
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct student{
int chinese,math;
string name;
int sum;
};
bool cmp(student a,student b){
return a.sum > b.sum;
}
int main(){
int k,n; //k用于存储整数,n用于存储第几个学生
student s[30]; //最多可以存储30个学生
cin >> k >> n;
for (int i = 0;i < k ;i++){
cin >> s[i].chinese >> s[i].math >> s[i].name;
s[i].sum = s[i].chinese + s[i].math;
}
sort(s,s+k,cmp); //进行排序操作
cout << s[n - 1].name << endl;
}
示例代码
课后练习
问题(P2641)
为期2天的跑步比赛已经结束了,赛事的组织方收集了所有参赛选手姓名和2天的跑步里程,编写程序输出2天总里程数从低到高的参赛选手姓名
3
Hong 3000.5 3100
Jone 2998.5 3200
Anna 3110 2980.5
Anna
Hong
Jone
问题分析:
1.新建立一个结构体,用于存储数据
2.获得相应的输入,包括人数、姓名、成绩
3.使用sort()函数进行排序
4.输出结果
示例代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct stu{ //定义结构体
string name;
int one,two;
};
bool cmp(stu a,stu b){ //定义比较函数
return (a.one + a.two) < (b.two + b.one);
}
int main(){
stu s[30];
int n;
//获得相应的输入
cin >> n;
for (int i = 0;i < n;i++){
cin >> s[i].name >> s[i].one >> s[i].two;
}
//对结构体数组进行排序
sort(s,s + n,cmp);
//排序后输出结果
for (int i = 0;i < n; i++){
cout << s[i].name << endl;
}
return 0;
}
问题(P2642)
考试后班主任拿到了信息学科考试的成绩单,成绩单包括学号、姓名和成绩。编写程序,输出后3名同学的信息,如果存在成绩相同者,属于位次相同,一并输出
5
1001 haha 98.5
1002 liulan 78
1003 haoli 89.5
1004 dadu 77.5
1005 pingan 82
1004 dadu 77.5
1002 liulan 78
1005 pingan 82
问题分析:
1.新建立一个结构体,用于存储数据
2.获得相应的输入,包括人数、学号,姓名,成绩
3.使用sort()函数进行排序,从小到大
4.输出前面3个的结果
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct stu{ //定义结构体
int number;
string name;
float score;
};
bool cmp(stu a,stu b){ //定义比较函数
return a.score < b.score;
}
int main(){
stu s[30];
int n;
//获得相应的输入
cin >> n;
for (int i = 0;i < n;i++){
cin >> s[i].number >> s[i].name >> s[i].score;
}
//对结构体数组进行排序
sort(s,s + n,cmp);
//排序后输出结果
cout << "result:" << endl;
for (int i = 0;i < 3; i++){
cout << s[i].number << " " << s[i].name << " " << s[i].score << endl;
}
return 0;
}
示例代码
Level2_6_结构体操作
By yang he
Level2_6_结构体操作
- 248