前言
对于 C++ 初学者而言,单纯的语法学习往往枯燥且难以落地。通过实战项目将语法知识转化为实际应用,是提升编程能力的核心路径。本文将基于 C++98 标准(兼容老旧编译器,无 C++11 及以上特性),从零实现一款功能完整的学生成绩管理系统。
系统覆盖信息录入、成绩修改、多条件查询、数据统计、排序及文件导出等核心场景,帮助大家夯实基础语法,掌握批量数据管理的思路。
一、项目设计思路
1. 核心技术选型
本项目聚焦 C++ 基础核心知识点,不引入第三方库,纯原生实现:
- 数据封装:结构体(
struct)封装学生信息,类(class)封装核心业务逻辑,实现数据与逻辑分离; - 容器存储:使用
std::vector动态存储学生信息,适配数量变化; - 文件操作:
std::fstream实现数据持久化,兼容 C++98 规范; - 数据处理:
std::sort+ 自定义仿函数实现排序,std::max/min统计极值; - 格式化输出:
std::setw/fixed/setprecision对齐数据。
2. 功能规划
系统围绕全流程设计,包含 6 大核心功能 +2 个辅助功能:
| 功能模块 | 核心作用 |
|---|---|
| 学生信息录入 | 录入学号、姓名、语数外成绩,自动计算总分,校验唯一性和合法性 |
| 成绩修改 | 按学号查找,修改单科后自动更新总分,避免脏数据 |
| 成绩查询 | 支持「按学号」和「按姓名」两种查询方式 |
| 班级成绩统计 | 统计平均分、最高分、最低分、及格率 |
| 成绩排序 | 支持按总分/单科降序排序 |
| 数据导出 | 格式化导出到文本文件,方便备份 |
| 查看所有学生 | 批量展示当前系统中的所有学生信息 |
| 菜单交互 | 控制台菜单驱动,简化操作流程 |
二、完整代码实现
为了保持 C++98 的兼容性,我们严格规避了 auto、lambda 表达式等现代特性。下面是完整的工程代码,包含了结构体定义、管理类封装以及主程序入口。
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include
{
std::string id;
std::string name;
chinese;
math;
english;
total;
( std::string& stuId, std::string& stuName, ch, ma, en)
: (stuId), (stuName), (ch), (ma), (en) {
total = ch + ma + en;
}
};
{
:
() {}
{
std::string id, name;
chinese, math, english;
std::cout << << std::endl;
std::cout << ;
std::(std::cin, id);
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
(it->id == id) {
std::cout << << id << << std::endl;
;
}
}
std::cout << ;
std::(std::cin, name);
std::cout << ;
std::cin >> chinese;
std::cout << ;
std::cin >> math;
std::cout << ;
std::cin >> english;
std::cin.();
(!(chinese) || !(math) || !(english)) {
std::cout << << std::endl;
;
}
;
m_studentList.(newStudent);
std::cout << << name << << id << << std::endl;
}
{
std::cout << << std::endl;
std::string id;
std::cout << ;
std::(std::cin, id);
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
(it->id == id) {
std::cout << << it->name << << it->chinese << << it->math << << it->english << << std::endl;
std::cout << ;
std::cin >> it->chinese;
std::cout << ;
std::cin >> it->math;
std::cout << ;
std::cin >> it->english;
std::cin.();
(!(it->chinese) || !(it->math) || !(it->english)) {
std::cout << << std::endl;
;
}
it->total = it->chinese + it->math + it->english;
std::cout << << it->name << << std::endl;
;
}
}
std::cout << << id << << std::endl;
}
{
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << ;
choice;
std::cin >> choice;
std::cin.();
std::string key;
found = ;
(choice) {
:
std::cout << ;
std::(std::cin, key);
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
(it->id == key) {
(*it);
found = ;
;
}
}
;
:
std::cout << ;
std::(std::cin, key);
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
(it->name == key) {
(*it);
found = ;
}
}
;
:
std::cout << << std::endl;
;
}
(!found) {
std::cout << << std::endl;
}
}
{
std::cout << << std::endl;
(m_studentList.()) {
std::cout << << std::endl;
;
}
chTotal = , maTotal = , enTotal = , totalTotal = ;
chMax = , maMax = , enMax = , totalMax = ;
chMin = , maMin = , enMin = , totalMin = ;
chPass = , maPass = , enPass = ;
studentCount = m_studentList.();
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
chTotal += it->chinese;
maTotal += it->math;
enTotal += it->english;
totalTotal += it->total;
chMax = std::(chMax, it->chinese);
maMax = std::(maMax, it->math);
enMax = std::(enMax, it->english);
totalMax = std::(totalMax, it->total);
chMin = std::(chMin, it->chinese);
maMin = std::(maMin, it->math);
enMin = std::(enMin, it->english);
totalMin = std::(totalMin, it->total);
(it->chinese >= ) chPass++;
(it->math >= ) maPass++;
(it->english >= ) enPass++;
}
chAvg = ()chTotal / studentCount;
maAvg = ()maTotal / studentCount;
enAvg = ()enTotal / studentCount;
totalAvg = ()totalTotal / studentCount;
chPassRate = ()chPass / studentCount * ;
maPassRate = ()maPass / studentCount * ;
enPassRate = ()enPass / studentCount * ;
std::cout << << studentCount << std::endl;
std::cout << << std::endl;
std::cout << std::fixed << std::();
std::cout << << chAvg << << chMax << << chMin << << chPassRate << << std::endl;
std::cout << << maAvg << << maMax << << maMin << << maPassRate << << std::endl;
std::cout << << enAvg << << enMax << << enMin << << enPassRate << << std::endl;
std::cout << << totalAvg << << totalMax << << totalMin << std::endl;
}
{
std::cout << << std::endl;
(m_studentList.()) {
std::cout << << std::endl;
;
}
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << ;
choice;
std::cin >> choice;
std::cin.();
(choice) {
:
std::(m_studentList.(), m_studentList.(), compareTotalDesc);
std::cout << << std::endl;
;
:
std::(m_studentList.(), m_studentList.(), compareChineseDesc);
std::cout << << std::endl;
;
:
std::(m_studentList.(), m_studentList.(), compareMathDesc);
std::cout << << std::endl;
;
:
std::(m_studentList.(), m_studentList.(), compareEnglishDesc);
std::cout << << std::endl;
;
:
std::cout << << std::endl;
;
}
std::cout << << std::endl;
();
}
{
std::cout << << std::endl;
(m_studentList.()) {
std::cout << << std::endl;
;
}
std::string filename;
std::cout << ;
std::(std::cin, filename);
;
(!outFile.()) {
std::cout << << filename << << std::endl;
;
}
outFile << << m_studentList.() << << std::endl;
outFile << << std::endl;
outFile << std::() << << std::() << << std::() << << std::() << << std::() << << std::() << << std::endl;
outFile << << std::endl;
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
outFile << std::() << it->id << std::() << it->name << std::() << it->chinese << std::() << it->math << std::() << it->english << std::() << it->total << std::endl;
}
outFile.();
std::cout << << filename << << std::endl;
}
{
std::cout << << std::endl;
std::cout << << stu.id << std::endl;
std::cout << << stu.name << std::endl;
std::cout << << stu.chinese << std::endl;
std::cout << << stu.math << std::endl;
std::cout << << stu.english << std::endl;
std::cout << << stu.total << std::endl;
std::cout << << std::endl;
}
{
(m_studentList.()) {
std::cout << << std::endl;
;
}
std::cout << std::() << << std::() << << std::() << << std::() << << std::() << << std::() << << std::endl;
std::cout << << std::endl;
(std::vector<Student>::iterator it = m_studentList.(); it != m_studentList.(); ++it) {
std::cout << std::() << it->id << std::() << it->name << std::() << it->chinese << std::() << it->math << std::() << it->english << std::() << it->total << std::endl;
}
}
:
std::vector<Student> m_studentList;
{
score >= && score <= ;
}
{
a.total > b.total;
}
{
a.chinese > b.chinese;
}
{
a.math > b.math;
}
{
a.english > b.english;
}
};
{
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << << std::endl;
std::cout << ;
}
{
ScoreManager scoreMgr;
choice = ;
(choice != ) {
();
std::cin >> choice;
std::cin.();
(choice) {
:
scoreMgr.();
;
:
scoreMgr.();
;
:
scoreMgr.();
;
:
scoreMgr.();
;
:
scoreMgr.();
;
:
scoreMgr.();
;
:
scoreMgr.();
;
:
std::cout << << std::endl;
;
:
std::cout << << std::endl;
;
}
}
;
}

