猫史档案馆


【很杂的教程】【C++】结构体&结构体数组

用户:Cecilia_VentiCecilia_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!!!


回复

上一页1 页 / 共 1下一页
Cecilia_VentiCecilia_Venti

是我的帖子不够优质吗?

为什么没人看?

emotion_编程猫_翻白眼

点赞1


评论


Cecilia_VentiCecilia_Venti

啊啊啊我顶!

点赞1


评论


美好没好美好没好

主要是我没学C++

点赞0


评论


爱编程的小松鼠已退猫爱编程的小松鼠已退猫

我才开始学C++,才学会cout和cin,谢谢你的分享

点赞0


评论


1111111111111111211111111111111112

教程是好教程,发的地方不好,毛毡偏向娱乐化谁看你这啊

点赞0


评论


再见2再见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


评论


islptngislptng

强调一遍 for(inti=1;i<=n;i++) { }//分号不必要加 intfunction() { }//分号不必要加 struct______ { };//分号一定要加!啊啊啊啊啊啊

点赞0


评论