用户:Cecilia_Venti查看:9 回复:7 评论:9 创建时间:2024-01-21T13:38:35
今天,我们来学习C++结构体
1. 什么是结构体
结构体是指一组不同或相同数据类型或函数的集合
(什么玩意儿)
简单地说
结构体其实就是一种数据类型
声明结构体就相当于声明了用户自己的数据类型
结构体中会存放着一些数据
这些数据可以使不同的数据类型
结构体中还可以声明函数
2. 结构体的声明
struct student {
int id;
string name;
float score[3];
float get_score(int index) {
return score[index - 1];
};
float get_score_sum() {
return get_score(1) + get_score(2) + get_score(3);
};
};
注解:
1. 声明结构体所用的关键字:struct
2. 结构体中的数据可以是整数、浮点数、字符串、数组等
3. 声明数据类型的方法:数据类型 数据名 ;
4. 结构体中可以声明函数,与正常声明函数语法一致
5. 结构体函数中可以直接引用结构体的数据,还可以直接使用结构体的其他函数
6. 函数生命返回值类型要与返回值保持一致
3. 结构体变量的声明
student s1;
student s2, s3;
student sl1[];
student sl2[5];
student s4, sl3[3];
注解:
1. 声明结构体就相当于声明了用户自己的数据类型
2. 声明结构体变量的语法与声明普通变量的语法相同
3. 先声明结构体,后声明变量
4. 结构体的赋值
方法一:
student s1;
s1.id = 1;
s1.name = "Peter";
s1.score = {100, 100, 99};
注解:“.”的意思是“的”
方法二:
student s2 = {1, "Kitty", {98, 99, 100}};
注解:使用这种方法时,一定要注意传入数据的顺序
方法三:
student s3;
cin >> s3.id >> s3.name;
for (int i = 0; i < 3; i++) {
cin >> s3.score[i];
};
注解:可以使用输入的方式传值
方法四:
struct student {
int id = 4;
string name = "Joe";
float score[3] = {100, 100, 100};
float get_score(int index) {
return score[index - 1];
};
float get_score_sum() {
return get_score(1) + get_score(2) + get_score(3);
};
};
int main() {
student s4;
return 0;
}
注解:使用“=”可以为结构体数据添加默认值
方法五:
student sl[3] = {
{1, "Peter", {100, 100, 100}},
{2, "Alice", {100, 100, 99}},
{3, "Joe", {98, 99, 100}},
};
注解:这是结构体数组的赋值方法
方法六:
student sl[3];
for (int i = 0; i < 3; i++) {
cin >> sl[i].id >> sl[i].name;
for (int j = 0; j < 3; j++) {
cin >> sl[i].score[j];
}
}
注解:获取结构体数组中的结构体:结构体数组 [ 索引 ]
5. 获取结构体的值
结构体:
// 已经声明 s1
cout << s1.id << endl;
cout << s1.name << endl;
for (int i = 0; i < 3; i++) {
cout << s1.score[i] << endl;
};
结构体数组:
// 已经声明 sl[3]
for (int i = 0; i < 3; i++) {
cout << sl[i].id << endl;
cout << sl[i].name << endl;
for (int j = 0; j < 3; j++) {
cout << sl[i].score[j] << endl;
}
}
6. 使用结构体的函数
结构体:
// 已经声明 s1
cout << s1.get_score(1) << endl;
cout << s1.get_score(2) << endl;
cout << s1.get_score(3) << endl;
cout << s1.get_score_sum() << endl;
注解:使用函数时记得加括号
结构体数组:
// 已经声明 sl[3]
for (int i = 0; i < 3; i++) {
cout << sl[i].get_score(1) << ' ';
cout << sl[i].get_score(2) << ' ';
cout << sl[i].get_score(3) << ' ';
cout << sl[i].get_score_sum() << endl;
}
7. 结构体数组的排序
示例:根据总分高低,从大到小排序,如果两人总分相同,则学号小的放在前面
// 引入头文件
# include <iostream>
# include <algorithm>
// 声明命名空间
using namespace std;
// student结构体
struct student {
int id;
string name;
float score[3];
float get_score(int index) {
return score[index - 1];
};
float get_score_sum() {
return get_score(1) + get_score(2) + get_score(3);
};
};
// 排序函数
bool cmp(student a, student b) {
if (a.get_score_sum() == b.get_score_sum()) {
// 如果两人总分相等,按学号升序排序
return a.id < b.id;
} else {
// 否则按成绩降序排序
return a.get_score_sum() > b.get_score_sum();
};
};
// 主函数
int main() {
// 声明数组
student sl[10];
// 输入赋值
for (int i = 0; i < 10; i++) {
cin >> sl[i].id >> sl[i].name;
for (int j = 0; j < 3; j++) {
cin >> sl[i].score[j];
};
};
// 对数组排序
sort(sl, sl+10, cmp);
// 输出数组
for (int i = 0; i < 10; i++) {
cout << sl[i].id << ' ';
cout << sl[i].name << ' ';
cout << sl[i].get_score_sum() << endl;
};
return 0;
}
注解:在使用sort函数时,记得引入头文件algorithm
结尾
好的
那么今天的教程就到此结束了
如果你感兴趣的话请点赞并关注
【雨启航code】
那么我们下次再见,
Byebye!!!
再见2题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
【输入格式】
输入文件包含n+1行:
第1行为一个正整数n,表示该校参加评选的学生人数。
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间。第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
【输出格式】
共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
【输入样例】
6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 喵
78 89 98
【输出样例】
6 265
4 2喵
3 258
2 244
1 237
【数据规模】
50%的数据满足:各学生的总成绩各不相同;
100%的数据满足:6≤n≤300。
点赞0
评论
islptng强调一遍 for(inti=1;i<=n;i++) { }//分号不必要加 intfunction() { }//分号不必要加 struct______ { };//分号一定要加!啊啊啊啊啊啊
点赞0
评论