C++基础语法10——结构体

一、结构体的诞生意义

当处理复杂数据对象时,传统的基本数据类型和数组存在明显局限性。以学生成绩管理系统为例,每个学生包含:

  • 字符串类型的姓名

  • 整数类型的各科成绩

  • 计算得出的总分

结构体struct应运而生,它允许开发者将不同类型的数据组合成一个逻辑整体,形成自定义的复合数据类型。这种特性完美解决了多维数据统一管理的问题。

二、结构体的定义规范

1. 标准定义格式

struct Student {
    string name;    // 学生姓名
    int chinese;    // 语文成绩
    int math;       // 数学成绩
    int english;    // 英语成绩
    int total;      // 总分
}; // ← 注意结尾的分号

2. 结构体特性解析

  • 成员变量支持所有C++数据类型

  • 各成员内存连续分配(

  • 默认访问权限为public(与class的private默认不同)

三、结构体的实战应用

1. 声明与初始化

// 方式1:分步初始化
Student s1;
s1.name = "Mike";
s1.chinese = 98;
s1.math = 95;

// 方式2:聚合初始化
Student s2 = {"Rose", 99, 98, 0}; // 总分字段暂不初始化

// 方式3:C++11统一初始化
Student s3 {"Bob", 85, 97};

2. 成绩处理系统实现

#include <iostream>
#include <iomanip>
using namespace std;

struct Score {
    string name;
    int chinese;
    int math;
    int total;
};

int main() {
    int n;
    cin >> n;
    
    Score* records = new Score[n];
    
    // 输入处理
    for(int i=0; i<n; ++i){
        cin >> records[i].name 
            >> records[i].chinese 
            >> records[i].math;
        records[i].total = records[i].chinese + records[i].math;
    }
    
    // 输出结果
    cout << "姓名\t语文\t数学\t总分" << endl;
    for(int i=0; i<n; ++i){
        cout << records[i].name << "\t"
             << records[i].chinese << "\t"
             << records[i].math << "\t"
             << records[i].total << endl;
    }
    
    delete[] records;
    return 0;
}

四、结构体高级应用技巧

1. 结构体数组处理

const int MAX_STU = 100;
Student classA[MAX_STU]; // 静态数组
Student* classB = new Student[n]; // 动态数组

2. 嵌套结构体

struct Date {
    int year;
    int month;
    int day;
};

struct StudentProfile {
    string name;
    Date birthday;
    Score examResult;
};

五、练习:三科成绩统计

问题描述

输入n个学生的三科成绩,输出班级总分的最高分、最低分和平均分(保留2位小数)

参考实现

#include <iostream>
#include <iomanip>
#include <climits>
using namespace std;

struct TripleScore {
    int chinese;
    int math;
    int english;
    int total() const { return chinese + math + english; }
};

int main() {
    int n;
    cin >> n;
    
    TripleScore* scores = new TripleScore[n];
    int maxTotal = INT_MIN, minTotal = INT_MAX;
    double sum = 0;
    
    for(int i=0; i<n; ++i){
        cin >> scores[i].chinese 
            >> scores[i].math 
            >> scores[i].english;
            
        int total = scores[i].total();
        maxTotal = max(maxTotal, total);
        minTotal = min(minTotal, total);
        sum += total;
    }
    
    cout << maxTotal << " "
         << minTotal << " "
         << fixed << setprecision(2) << sum/n << endl;
    
    delete[] scores;
    return 0;
}

通过结构体的灵活运用,我们可以创建出强语义的数据类型,大幅提升代码的可读性和可维护性。这种数据封装能力是迈向面向对象编程的重要基础,也为后续学习类(class)的概念打下坚实基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值