C++核心基础语法实战案例:学生成绩管理系统
/学生结构体数组 借助数组地址访问元素。cout << "原分数为" << (p + i)->Chinese << "请输入您想修改的分数" << endl;cout << "原分数为" << (p + i)->English << "请输入您想修改的分数" << endl;cout << "原分数为" << (p + i)->Math << "请输入您想修改的分数" << endl;cout <
题目描述
设计一个学生成绩管理系统,需支持 “添加学生信息”“查询学生成绩”“修改学生分数”“统计班级总分与平均分” 四大核心功能,要求综合运用 C 语言控制语句、C++ 指针(含动态内存分配 / 智能指针)、结构体等知识
解题步骤拆解
- 定义结构体与全局变量:声明
Student
结构体,定义 “学生总数” 变量(如int studentCount = 0;
)、动态数组指针(如Student* students = nullptr;
)。 - 实现菜单循环:用
do-while
循环包裹菜单显示与功能选择,输入 0 时退出循环。 - 分功能编写函数:
addStudent()
:处理添加逻辑,含学号重复检查、动态数组扩容;queryByID()
/queryByName()
:实现两种查询,遍历数组匹配条件;modifyScore()
:按学号定位学生,用switch
选择修改的课程,验证分数合法性;calculateStats()
:遍历数组累加分数,计算并输出统计结果。
- 内存释放:退出系统前,若用
new[]
分配内存,需调用delete[] students;
释放。
以上是我让豆包出的题目以及提示
最终代码如下:
#include <iostream>
#include <string>
using namespace std;
void menu() {
cout << "===========学生成绩管理系统===========" << endl;
cout << "1.添加学生信息" << endl;
cout << "2.按姓名查询成绩" << endl;
cout << "3.按学号查询成绩" << endl;
cout << "4.修改学生分数" << endl;
cout << "5.统计班级总分与平均分" << endl;
cout << "0.退出系统" << endl;
cout << "请输入您的选择(0-5)" << endl;
}
int ALL_student_number=0;
int add = 0;
struct STUDENT { string name; int Number; int Chinese; int Math; int English; };
STUDENT* p = new STUDENT [50]; //学生结构体数组 借助数组地址访问元素
void cin_messege() {
STUDENT* result = p + add;
cout << "请输入学生姓名" << endl;
cin >> result->name;
cout << "请输入学生学号" << endl;
cin >> result->Number;
cout << "请输入学生语文成绩" << endl;
cin >> result->Chinese;
cout << "请输入学生数学成绩" << endl;
cin >> result->Math;
cout << "请输入学生英语成绩" << endl;
cin >> result->English;
add++;
ALL_student_number++;
}//添加学生信息
void cout_messege1() {
string aim_student;
string result_student;
cout << "请输入您想查询的学生姓名" << endl;
cin >> aim_student;
for (int i = 0; i < ALL_student_number; i++) {
if (aim_student == (p + i)->name) {
cout << aim_student << "的语文成绩为" << (p + i)->Chinese << endl;
cout << aim_student << "的数学成绩为" << (p + i)->Math<<endl;
cout << aim_student << "的英语成绩为" << (p + i)->English<<endl;
result_student = aim_student;
break;
}
else { continue; }
}
}
void cout_messege2() {
int aim_student;
int result_student;
cout << "请输入您想查询的学生学号" << endl;
cin >> aim_student;
for (int i = 0; i < ALL_student_number; i++) {
if (aim_student == (p + i)->Number) {
cout << aim_student << "|语文成绩为" << (p + i)->Chinese << endl;
cout << "|数学成绩为" << (p + i)->Math << endl;
cout << "|英语成绩为" << (p + i)->English << endl;
result_student = aim_student;
}
else { continue; }
}
}
void correct_score() {
string aim_student;
string result_student;
cout << "请输入您想修改分数的学生姓名" << endl;
cin >> aim_student;
for (int i = 0; i < ALL_student_number; i++) {
if (aim_student == (p + i)->name) {
cout << "--------------------" << endl;
cout << "您想修改哪一学科" << endl;
cout << "1.语文" << endl;
cout << "2.数学" << endl;
cout << "3.英语" << endl;
cout << "请输入对应数字" << endl;
cout << "--------------------" << endl;
int aim_func;
cin >> aim_func;
int correct;
switch (aim_func) {
case 1:
cout << "--------------------" << endl;
cout << "原分数为" << (p + i)->Chinese << "请输入您想修改的分数" << endl;
cin >> correct;
(p + i)->Chinese = correct;
cout << "修改成功,当前学生语文分数为" << (p + i)->Chinese << endl;
cout << "--------------------" << endl;
break;
case 2:
cout << "--------------------" << endl;
cout << "原分数为" << (p + i)->Math << "请输入您想修改的分数" << endl;
cin >> correct;
(p + i)->Math = correct;
cout << "修改成功,当前学生数学分数为" << (p + i)->Math << endl;
cout << "--------------------" << endl;
break;
case 3:
cout << "--------------------" << endl;
cout << "原分数为" << (p + i)->English << "请输入您想修改的分数" << endl;
cin >> correct;
(p + i)->English = correct;
cout << "修改成功,当前学生英语分数为" << (p + i)->English << endl;
cout << "--------------------" << endl;
break;
default:cout << "请输入正确数字" << endl;
}
result_student = aim_student;
break;
}
else { continue; }
if (result_student != aim_student) { cout << "不存在该学生" << endl; }
}
}
void sum_and_average(){
int SUM=0;
for (int i = 0; i < ALL_student_number; i++) {
int add = (p + i)->Chinese + (p + i)->Math + (p + i)->English;
SUM += add;
}
double average = (double)SUM / ALL_student_number;
cout << "三科班级总分为" << SUM<<endl;
cout << "三科班级平均分为" << average << endl;}
int main() {
menu();
int func;
cin >> func;
while (func != 0) {
if (func == 1) { cin_messege(); }
else if (func == 2) { cout_messege1(); }
else if (func == 3) { cout_messege2(); }
else if (func == 4) { correct_score(); }
else if (func == 5) { sum_and_average(); }
else { cout << "请输入正确的数字" << endl; }
menu();
cin >> func;
}
cout << "--------------------" << endl;
cout << "即将退出" << endl;
cout << "欢迎下次使用" << endl;
cout << "--------------------" << endl;
return 0;
}
在编写过程中出现以下疑问及其解决:
1.全局总体:先编写出实现各个功能的函数,再利用while循环,将各个功能穿插在菜单的循环中。
通过声明功能选择变量func,在每次循环的最后再次展现菜单中的功能选择,从而实现进行循环/退出系统
2.添加学生功能:如何让学生一个个添加并且保存至之后便于查询?
首先构建好记录学生信息的结构体,单个学生是一个结构体变量,利用结构体数组去记录每一个学生。
同时为了让学生信息依次赋值给结构体数组中的元素,应声明一个偏移量add对数组元素的地址进行实时追踪(指针指向数组第一个元素的地址,利用指针的运算)
声明一个总人数变量ALL_student_number进行学生人数的实时更新
3.查询学生成绩功能:如何一个个地找出与目标匹配的结果
利用for循环实现对数组的遍历,获取数组中每个元素的信息,通过比对姓名/学号从而确定是否是目标学生(此处可声明一个临时变量aim_student来存储目标学生信息,将其与每次遍历的元素信息进行比对)
利用break和continue语句,找到目标就可以跳出循环,未找到就结束本次循环进行下次循环
4.修改分数功能:用switch语句进行匹配实现,修改科目的选择
注意:每个case的末尾要加break语句,不然一旦有一个case匹配成功,后续case中的内容都会运行
豆包的评价
你的学生成绩管理系统实现了基本的功能,整体结构清晰,能够满足简单的学生信息管理需求,以下是具体的评价和一些改进建议:
优点:
- 功能基本完整:实现了添加学生信息、按姓名查询、按学号查询、修改成绩、统计班级总分和平均分以及退出系统等核心功能,覆盖了成绩管理的基本场景。
- 结构清晰:通过函数分别实现不同功能(如
cin_messege
添加信息、cout_messege1
按姓名查询等),主函数通过菜单驱动,逻辑流程较清晰。 - 使用了结构体和动态数组:利用
STUDENT
结构体存储学生信息,通过指针动态数组存储多个学生数据,符合数据组织的基本思路。
可改进的地方:
-
中文显示问题:代码中菜单的中文部分可能存在乱码(如 “ѧ���ɼ�����ϵͳ”),建议检查编码格式(如改为 UTF-8),确保中文正常显示。
-
数组越界风险:定义的动态数组
p = new STUDENT [50]
限制了最多只能存储 50 个学生,当学生数量超过 50 时会出现越界。可考虑使用vector
动态容器(需包含<vector>
头文件) -
变量命名规范:部分变量名(如
messege
应为message
,correct_score
中aim_func
可改为subjectChoice
等)拼写不规范或语义不够清晰,建议使用更直观的命名。 -
输入合法性校验:未对输入的数据(如成绩是否为合理范围的整数、学号是否重复等)进行校验,可能导致错误数据录入。例如添加学生时,可检查成绩是否在 0-100 之间
-
内存释放:动态分配的数组
p
在程序结束前未释放,虽然程序退出后系统会回收,但最好在main
函数结束前添加delete[] p;
,养成良好的内存管理习惯。 -
功能扩展:可以考虑增加删除学生信息、按成绩排序、保存数据到文件(避免程序退出后数据丢失)等功能,提升系统的实用性。
总体来说,作为基础版本的成绩管理系统已经实现了核心功能,逻辑也较为清晰。如果能解决上述细节问题,代码的健壮性和可维护性会更好。继续加油!
接下来我将开始学习面向对象编程
更多推荐
所有评论(0)