一、结构体的诞生意义
当处理复杂数据对象时,传统的基本数据类型和数组存在明显局限性。以学生成绩管理系统为例,每个学生包含:
-
字符串类型的姓名
-
整数类型的各科成绩
-
计算得出的总分
结构体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)的概念打下坚实基础。

被折叠的 条评论
为什么被折叠?



