-
2021-12-04 16:26:12
目录
一、前言
本人是大一本科在读学生,也是一名刚接触代码不久的新手程序员。在学完结构体部分内容后,老师布置了一个综合实验作业,需要制作一个简单的学生成绩管理系统。本文章主要是向大家分享我所编写的学生成绩管理系统代码以及我在编程过程中的感受和遇到的一些问题。
二、系统简介
该学生成绩管理系统最多可录入100名学生(可修改上限,此处设为100人),每个学生的信息录入包括姓名、学号、性别、语文成绩、数学成绩、英语成绩以及三门课程的平均成绩。系统功能包括:
(1)输入所有学生的信息(不包括平均成绩);
(2)输出所有学生的信息(不包括平均成绩);
(3)输出某个学生的相关信息;
(4)求任意一门课的平均成绩;
(5)求每个学生3门课程的平均成绩;
(6)找出平均成绩为最高分的学生;
(7)找出平均成绩为不及格的学生;
(8)根据给定的学号查询某学生;
(9)根据给定的学号修改某学生信息。
系统函数对应功能:
(1)构建Create函数,实现所有学生信息的输入;
(2)构建DisplayAll函数,实现所有学生信息的输出;
(3)构建DisplayOne函数,实现某个学生信息的输出;
(4)构建CourseAve函数,实现任意一门课程的计算及输入;
(5)构建StudentAve函数,实现每个学生3门课的平均成绩的计算,并调用DisplayAll函数或DisplayOne函数输出相关信息;
(6)构建TopScore函数,实现平均成绩最高分学生的查找,并调用DisplayOne函数输出该学生的信息(包括姓名、学号、性别、三门课成绩和平均分);
(7)构建FailExam函数,实现平均成绩不及格(60分以下)学生的查找,并调用DisplayOne函数输出该学生的信息(包括姓名、学号、性别、三门课成绩和平均分);
(8)构建IsExist函数,实现根据给定的学号查询某学生是否存在;
(9)构建Search函数,实现调用IsExist函数判断给定学号的某学生是否存在,若存在,则调用DisplayOne函数输出该学生的信息(包括姓名、学号、性别、三门课成绩),若不存在,则输出“查无此人”;
(10)构建Modify函数,实现调用IsExist函数判断给定学号的某学生是否存在,若存在,则修改该学生的信息(包括姓名、学号、性别、三门课成绩),若不存在,则输出“查无此人”;
(11)附加Check函数,检查用户输入规范的问题。
三、完整代码
#include <iostream> #include <string.h> #include <iomanip> #include <windows.h> #include <stdio.h> #include <stdlib.h> #pragma warning(disable:4996) //解决Visual Studio中strcpy不安全报错问题 using namespace std; int x = 0; int* X = &x; //指针计数器 struct student { char name[10]; char number[100]; char sex[10]; float Chinese; float math; float English; float AverageScore; }; //-------------------------------------------------------------------------------------------------------------- //定义结构体数组: struct student stu[100]; //限定100名学生 //-------------------------------------------------------------------------------------------------------------- //判断用户的输入是否正确(字符和字符串): float Check(int a) { if (a == 0) //针对字符和字符串 { float m; if (cin >> m) { return m; } else { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); while (!(cin >> m)) { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); } return m; } } else if (a == 1) //针对字符和字符串以及StudentAve函数中菜单的数字范围 { float m; float c; if (cin >> m) { while (1) { if (m == 1 || m == 2 || m == 3) { return m; break; } else { cout << "输入错误,请重新输入:"; c = Check(1); return c; break; } } } else { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); while (!(cin >> m)) { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); } while (1) { if (m == 1 || m == 2 || m == 3) { return m; break; } else { cout << "输入错误,请重新输入:"; c = Check(1); return c; break; } } } } else if (a == 2) //针对字符和字符串以及重新查询和退出选择功能的数字范围 { float m; float c; if (cin >> m) { while (1) { if (m == 1 || m == 2) { return m; break; } else { cout << "输入错误,请重新输入:"; c = Check(2); return c; break; } } } else { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); while (!(cin >> m)) { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); } while (1) { if (m == 1 || m == 2) { return m; break; } else { cout << "输入错误,请重新输入:"; a = Check(2); return a; break; } } } } else if (a == 3) //针对字符和字符串以及重新查询和退出选择功能的数字范围 { float m; float c; if (cin >> m) { while (1) { if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7) { return m; break; } else { cout << "输入错误,请重新输入:"; c = Check(3); return c; break; } } } else { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); while (!(cin >> m)) { cout << "输入错误,请重新输入:"; cin.clear(); cin.get(); } while (1) { if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7) { return m; break; } else { cout << "输入错误,请重新输入:"; a = Check(3); return a; break; } } } } } //-------------------------------------------------------------------------------------------------------------- //输入学生信息 void Create(int p) { if (x <= 100) //设置上限,该表存放最多不超过100名学生的信息 { int Y = x; cout << "请分别输入:姓名(不超过3个字)、学号(11位数字)、性别、语文成绩、数学成绩、英语成绩" << endl; for (int i = Y; i < Y + p; i++) { cin >> stu[i].name >> stu[i].number >> stu[i].sex >> stu[i].Chinese >> stu[i].math >> stu[i].English; if (i != Y + p - 1) { cout << "请输入下一个学生的信息:" << endl; } *X += 1; //记录表中人数 } cout << endl << endl; cout << "添加成功!" << endl << endl; } else { cout << "亲~表格人数已满,无法再继续添加了噢" << endl << endl << endl; } return; } //-------------------------------------------------------------------------------------------------------------- //输出所有学生信息 int DisplayAll(int a) { if (a == 0) //该函数基本功能的实现 { cout << endl << "序号\t" << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << endl; for (int i = 0; stu[i].Chinese != 0; i++) { cout << i + 1 << ":\t"; cout << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << endl; } cout << endl << endl; } else if (a == 1) //StudentAve调用DisplayAll函数专属通道 { cout << endl << "序号\t" << "姓名\t" << "学号\t\t" << "性别\t" << "平均成绩\t" << endl; for (int i = 0; stu[i].Chinese != 0; i++) { cout << i + 1 << ":\t"; cout << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl; } cout << endl << endl; } return 0; } //-------------------------------------------------------------------------------------------------------------- //查询某个学生信息 int DisplayOne(int b, float* a) { if (b == 0) //该函数基本功能的实现 { char A[1000]; int c = 0; cout << "请输入你想查询学生的姓名:"; cin >> A; cout << endl << endl; for (int i = 0; i < x; i++) { int a = strcmp(A, stu[i].name); if (a == 0) { cout << "查询结果:" << endl; cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << endl; cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << endl << endl; return 1; break; } else { c++; } } if (c == x) { cout << "查无此人" << endl << endl; return 0; } } else if (b == 1) //StudentAve调用DisplayOne函数专属通道 { char C[1000]; int d = 0; cout << "请输入你想查询学生的姓名:"; cin >> C; cout << endl << endl; for (int i = 0; i < x; i++) { int a = strcmp(C, stu[i].name); if (a == 0) { cout << "姓名\t" << "学号\t\t" << "性别\t" << "平均成绩\t" << endl; cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl; return 1; break; } else { d++; } } if (d == x) { cout << "查无此人" << endl << endl; return 0; } } else if (b == 2) //TopScore调用DisplayOne函数专属通道 { for (int i = 0; i < x; i++) { if (*a == stu[i].AverageScore) { cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl; cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl; cout << "查询成功!" << endl << endl << endl; break; } } } else if (b == 3) //FailExam调用DisplayOne函数专属通道 { cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl; for (int i = 0; i < x; i++) { if (*a == stu[i].AverageScore) { cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl; break; } } } return 0; } //-------------------------------------------------------------------------------------------------------------- //计算任意一门课的平均成绩 void CourseAve() { char B[100]; cout << "请输入您所要查询平均成绩的科目:"; cin >> B; int sum = 0, a = 0; for (int i = 0; i < x; i++) { if (strcmp(B, "语文") == 0) { sum += stu[i].Chinese; a++; } else if (strcmp(B, "数学") == 0) { sum += stu[i].math; a++; } else if (strcmp(B, "英语") == 0) { sum += stu[i].English; a++; } else { cout << "没有此学科,请重新输入" << endl; CourseAve(); a = 0; break; } } if (a == x) { float ave = (float)sum / x; cout << "该学科的平均成绩为:" << ave << endl << endl << endl; } } //-------------------------------------------------------------------------------------------------------------- //计算每个学生三门课程的平均成绩 int StudentAve(int c) { if (c == 0) //录入平均成绩并提供查询功能 { for (int i = 0; i < x; i++) { stu[i].AverageScore = (float)(stu[i].Chinese + stu[i].math + stu[i].English) / 3; } cout << "平均成绩录入成功!" << endl; cout << "1.查看全部学生的平均成绩" << endl; cout << "2.查看某个学生的平均成绩" << endl; cout << "3.不查看" << endl; cout << "输入数字选择要实现的功能:"; int a = Check(1); if (a == 1) //查看全部学生的平均成绩 { DisplayAll(1); } else if (a == 2) //查看某个学生的平均成绩 { float* a = NULL; while (1) { int k = DisplayOne(1, a); if (k == 1) { cout << "查询成功!" << endl << endl; break; } else { cout << "查询失败,是否重新查询?" << endl; cout << "1.是" << endl; cout << "2.否" << endl; int j = Check(2); if (j == 1) { continue; } else if (j == 2) { cout << endl << endl; break; } } } } } else if (c == 1) //直接录入平均成绩,不提供查询功能 { for (int i = 0; i < x; i++) { stu[i].AverageScore = (float)(stu[i].Chinese + stu[i].math + stu[i].English) / 3; } } return 0; } //-------------------------------------------------------------------------------------------------------------- // 平均成绩最高分学生的查找 void TopScore() { StudentAve(1); //录入每位同学的平均成绩 //-------------------------------------------------------------------------------------------------------------- //找出平均成绩中的最大值 float max = stu[0].AverageScore; for (int i = 1; i < x; i++) { if (max < stu[i].AverageScore) { max = stu[i].AverageScore; } } float* b = &max; //利用指针进行地址传递 DisplayOne(2, b); return; } //-------------------------------------------------------------------------------------------------------------- //找出平均成绩中不合格的同学 void FailExam() { StudentAve(1); //录入每位同学的平均成绩 float fail; float* Fail = &fail; //利用指针进行地址传递 int k = 0; //计数器 for (int i = 0; i < x; i++) { if (stu[i].AverageScore < 60) { fail = stu[i].AverageScore; DisplayOne(3, Fail); } else { k++; } } if (k == x) //k=x即没有一位同学的成绩低于60分 { cout << "全体及格!!!" << endl << endl << endl; } return; } //-------------------------------------------------------------------------------------------------------------- // 根据学号查询某学生是否存在 int IsExist(char b[100]) { int k = 0; for (int i = 0; i < x; i++) { int a = strcmp(b, stu[i].number); if (a == 0) { return 1; //查询成功 break; } else { k++; } } if (k == x) { return 0; //查询失败 } } void Search() { char b[100]; cout << "请输入你所要查询的学号:"; cin >> b; int back = IsExist(b); //调用IsExist函数判断该学生是否存在 if (back == 1) { StudentAve(1); //录入每位同学的平均成绩 for (int i = 0; i < x; i++) { int a = strcmp(b, stu[i].number); if (a == 0) { cout << endl << endl; cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl; cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl; cout << "查询成功!!!" << endl << endl; break; } } } else if(back == 0) { cout << "查无此人" << endl << endl; } return; } //-------------------------------------------------------------------------------------------------------------- // 修改学生信息 void Modify() { char c[100]; cout << "请输入你所要查询的学号:"; cin >> c; int back = IsExist(c); //调用IsExist函数判断该学生是否存在 int f = 0; //定位器 if (back == 1) { StudentAve(1); //录入每位同学的平均成绩 for (int i = 0; i < x; i++) //查找出该同学在结构体数组中的下标 { int a = strcmp(c, stu[i].number); if (a == 0) { f = i; } } while (1) //修改信息 { cout << endl << endl; StudentAve(1); //考虑到成绩的修改,此处重新录入每位同学的平均成绩 cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl; cout << endl << stu[f].name << "\t" << stu[f].number << "\t" << stu[f].sex << "\t" << stu[f].Chinese << "\t" << stu[f].math << "\t" << stu[f].English << "\t" << fixed << setprecision(2) << stu[f].AverageScore << endl << endl; cout << "+------------+" << endl; cout << "| 1.姓名 |" << endl; cout << "| 2.学号 |" << endl; cout << "| 3.性别 |" << endl; cout << "| 4.语文成绩 |" << endl; cout << "| 5.数学成绩 |" << endl; cout << "| 6.英语成绩 |" << endl; cout << "| 7.退出修改 |" << endl; cout << "+------------+" << endl; cout << "请选择你要修改的内容(输入数字):"; int b = Check(3); cout << endl << endl; if (b == 1) //改姓名 { char name[10]; cout << "修改为(不超过三个字):"; cin >> name; strcpy(stu[f].name, name); cout << endl << endl; cout << "修改成功!"; } else if (b == 2) //改学号 { char number[100]; cout << "修改为(11位数字):"; cin >> number; strcpy(stu[f].number, number); cout << endl << endl; cout << "修改成功!"; } else if (b == 3) //改性别 { char sex[100]; cout << "修改为:"; cin >> sex; strcpy(stu[f].sex, sex); cout << endl << endl; cout << "修改成功!"; } else if (b == 4) //改语文成绩 { cout << "修改为:"; float Chinese = Check(0); stu[f].Chinese = Chinese; cout << endl << endl; cout << "修改成功!"; } else if (b == 5) //改数学成绩 { cout << "修改为:"; float math = Check(0); stu[f].math = math; cout << endl << endl; cout << "修改成功!"; } else if (b == 6) //改英语成绩 { cout << "修改为:"; float English = Check(0); stu[f].English = English; cout << endl << endl; cout << "修改成功!"; } else if (b == 7) //退出修改 { cout << "退出成功!" << endl << endl; break; } } } else if (back == 0) { cout << "查无此人" << endl << endl; } return; } //-------------------------------------------------------------------------------------------------------------- //主体部分 int main() { //-------------------------------------------------------------------------------------------------------------- //初始化界面 system("color F0"); //设置背景色为白色,字体颜色为黑色 cout << "+------------------------+" << endl; cout << "| Programmer:豆漿油條 |" << endl; cout << "| Version:3.8.4 |" << endl; cout << "+------------------------+" << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl; cout << "\t\t\t\t\t 欢迎使用学生成绩管理系统!!!" << endl; Sleep(5000); //延时5秒 system("cls"); //清屏 //-------------------------------------------------------------------------------------------------------------- //菜单界面 while (1) { //-------------------------------------------------------------------------------------------------------------- //菜单选项: cout << "+-----------------------------------------+" << endl; cout << "| 1.录入学生信息 |" << endl; cout << "| 2.查看所有学生信息 |" << endl; cout << "| 3.查询某个学生信息 |" << endl; cout << "| 4.查看任意一门课的平均成绩 |" << endl; cout << "| 5.录入所有学生的平均成绩(附带查询功能)|" << endl; cout << "| 6.查看平均成绩最高分的学生 |" << endl; cout << "| 7.查看平均成绩不及格的学生 |" << endl; cout << "| 8.给定学号查询学生 |" << endl; cout << "| 9.给定学号修改学生信息 |" << endl; cout << "| 0.退出程序 |" << endl; cout << "+-----------------------------------------+" << endl; cout << "请输入数字以实现功能:"; //-------------------------------------------------------------------------------------------------------------- //利用Check函数判断用户的输入是否正确(字符和字符串): float n = Check(0); cout << endl << endl; //-------------------------------------------------------------------------------------------------------------- //按钮对应功能的实现: if (n == 1) { cout << "请输入你要添加学生的人数:"; int p = Check(0); Create(p); Sleep(3000); //延时3秒 system("cls"); //清屏 } else if (n == 2) { DisplayAll(0); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 3) { float* a = NULL; while (1) { int k = DisplayOne(0, a); if (k == 1) { cout << "查询成功!" << endl << endl; break; } else { cout << "查询失败,是否重新查询?" << endl; cout << "1.是" << endl; cout << "2.否" << endl; int j = Check(2); if (j == 1) { continue; } else if (j == 2) { cout << endl << endl; break; } } } system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 4) { CourseAve(); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 5) { StudentAve(0); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 6) { TopScore(); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 7) { FailExam(); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 8) { Search(); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 9) { Modify(); system("pause"); //界面静止 system("cls"); //清屏 } else if (n == 0) { cout << "你真的要退出了吗?" << endl; cout << "1.强忍离去" << endl; cout << "2.继续使用" << endl; float a = Check(2); cout << endl << endl; if (a == 1) { system("cls"); //清屏 cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << "\t\t\t\t\t\t 期待您的下次使用!" << endl << endl << endl; Sleep(3000); //延时3秒 break; } else if (a == 2) { system("cls"); //清屏 continue; } } //-------------------------------------------------------------------------------------------------------------- //判断用户的输入是否正确(非餐单中的整型数字): else { cout << "您输入数字有误,请重新输入" << endl << endl << endl; } //-------------------------------------------------------------------------------------------------------------- } return 0; }
注:该程序代码通过Visual Studio2019版编写。
四、总结
对于我这个C++新手来说,编写这个程序其实是挺有难度的,它涉及到了多个函数之间的相互调用,在编写的过程中,也有遇到一些问题,例如:定义整形或浮点型量输入字符会报错导致程序崩溃;一个函数如何多功能实现;VS中strcmp不安全性报错等......后来自己也是慢慢摸索,逐个问题击破。在实现了基本功能之后,我又对程序进行了美化操作,使其成为一个更加偏向于一个面向对象的程序。总的来说,第一次独自编写一个大程序,还算是比较满意的。
上面源代码中的程序是3.8.4版本,对于版本信息我是这样定义的:初始版本为1.0.0,第一个数字代表大更新,例如添加新函数、实现新功能、程序美化......每实现一次大更新第一个数字就+1;第二个数字代表小更新,例如增减注释和部分代码、调整代码顺序......每实现一次小更新第二个数字就+1;第三个数字代表debug次数,每成功修改一处Bug第三个数字就+1。目前程序还在持续更新当中,并不是最终版本,大家如果发现代码有什么问题或有什么改进意见和看法,欢迎在评论区中指出。第一次发表文章,如果上述内容有什么错误的地方,也欢迎在评论区中指出。
更多相关内容 -
C语言课程设计——学生成绩管理系统(源代码+详细注释).zip
2021-10-01 16:34:42/*C语言成绩*/ int mgrade; /*数学成绩*/ int egrade; /*英语成绩*/ int total; /*总分*/ float ave; /*平均分*/ int mingci; /*名次*/ }; switch(select) { case 1:Add(l);break; /*增加学生记录*/ case 2:Del... -
MFC学生成绩管理系统C++代码.zip
2021-08-13 15:03:47mfc界面,实现查询、排序、增加、删除、绘图功能 -
C++ 学生成绩管理系统
2018-01-11 11:23:09C++ 学生成绩管理系统C++ 学生成绩管理系统C++ 学生成绩管理系统C++ 学生成绩管理系统 -
学生成绩管理系统 c++代码
2009-06-22 23:35:33学生成绩管理系统 c++代码 功能:增加人员,删减人员,以及按各种方式查询 -
学生成绩管理系统c++代码.doc
2020-09-02 07:46:55/长安大学 学号2305114 黄晓宇 incue; cnst int M=5; stc Sdent //定义学生结构体 { it n char name8; float scor[3a,um ; void npt(Studnt s[,int n //输入并记录学生信息 ?int ij ori=ni) ? o<请输入第<i -
学生成绩信息管理系统_C++.doc
2020-10-20 10:34:06计算机基础强化训练任务书 初始条件 理论学完计算机基础知识掌握 C++语言编程基础和 VC开发平台的使用 实践计算机科学系实验中心提供计算机及软件开发环境 要求完成的主要任务 : 1系统需求分析得到系统的数据需求和... -
学生成绩管理系统C++代码
2011-10-13 23:20:51设计一个学生成绩管理系统的C++算法设计 -
学生成绩管理系统C++实现代码
2021-05-21 18:18:15本文实例为大家分享了C++学生成绩管理系统的具体代码,供大家参考,具体内容如下* (程序头部注释开始)* 程序的版权和版本声明部分* Copyright (c) 2011, 烟台大学计算机学院学生* All rights reserved.* 文件名称: ...本文实例为大家分享了C++学生成绩管理系统的具体代码,供大家参考,具体内容如下
* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: 《C++编写 学生成绩管理系统》
* 作 者: 刘江波
* 完成日期: 2012 年 6 月 26 日
* 版 本 号: v.626
* 对任务及求解方法的描述部分
* 问题描述:
用C++编写一个学生成绩管理系统
1、可以实现以下功能:
cout<
cout<
cout<
cout<
cout<
cout<
cout<
2、用链表存储信息
* 程序头部的注释结束
*/
# include
# include
# include
#include //用getch();
using namespace std;
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Student
{
public:
char name[20];
char Id[20];
int Cnum; //C++课程得分
int Mnum; //汇编课程得分
int Enum; //嵌入式操作系统课程得分
int sum; //总分
Student * Next;
void Input()
{
cout<>name;
cout<>Id;
cout<>Cnum;
cout<>Mnum;
cout<>Enum;
sum=Cnum+Mnum+Enum;
}
void ReadFile(istream & in)
{
in>>name>>Id>>Cnum>>Mnum>>Enum>>sum;
}
void Show()
{
cout<
<
}
};
//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Studentmassage
{
public:
Studentmassage();
~Studentmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
void Swap(Student *,Student *);
void Sort();
//void Unpass();
int ListCount();
//void Average();
void Display()
{
for(Student * p=Head->Next;p!=End;p=p->Next)
p->Show();
cout<
getch();
}
void AddItem()
{
End->Input();
End->Next=new Student;
End=End->Next;
cout<
cout<
getch();
}
private:
Student * Head,* End;
ifstream in;
ofstream out;
Student *FindItem(char * name)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
Student *FindID(char * Id)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->Id,Id))return p;
return NULL;
}
};
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::Studentmassage()
{
Head=new Student;
Head->Next=new Student;
End=Head->Next;
in.open("sort.txt");
if(!in)
cout<
else
{
while(!in.eof())
{
End->ReadFile(in);
if(End->name[0]=='\0')break;
End->Next=new Student;
End=End->Next;
}
in.close();
cout<
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::~Studentmassage()
{
Save();
for(Student * temp;Head->Next!=End;)
{
temp=Head->Next;
Head->Next=Head->Next->Next;
delete temp;
}
delete Head,End;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ShowMenu()
{
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Find()
{
char name[20] ,Id[10];
int x;
Student * p=NULL;
cout<
cout<
cout<
cin>>x;
switch(x)
{
case 1:{cout<>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<
getch();
}
else
{
cout<
cout<
getch();
}
}break;
case 2:
{
cout<>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<
getch();
}
else
{
cout<
cout<
getch();
}
}break;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ModifyItem() //修改信息
{
char name[20];
Student * p=NULL;
cout<>name;
if(p=FindItem(name))
{
cout<
p->Next->Input();
cout<
cout<
getch();
}
else
{
cout<
cout<
getch();
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::RemoveItem() // 删除信息
{
char name[20];
Student * p=NULL,*temp=NULL;
cout<>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<
cout<
getch();
}
else
{
cout<
cout<
getch();
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域
{
Student *temp=new Student;
strcpy(temp->name,p1->name);
strcpy(temp->Id,p1->Id);
temp->Cnum=p1->Cnum;
temp->Mnum=p1->Mnum;
temp->Enum=p1->Enum;
temp->sum=p1->sum;
strcpy(p1->name,p2->name);
strcpy(p1->Id,p2->Id);
p1->Cnum=p2->Cnum;
p1->Mnum=p2->Mnum;
p1->Enum=p2->Enum;
p1->sum=p2->sum;
strcpy(p2->name,temp->name);
strcpy(p2->Id,temp->Id);
p2->Cnum=temp->Cnum;
p2->Mnum=temp->Mnum;
p2->Enum=temp->Enum;
p2->sum=temp->sum;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数
{
if(! Head)
return 0;
int n=0;
for(Student * p=Head->Next;p!=End;p=p->Next)
{
n++;
}
return n;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Sort()//对当前链表进行排序
{
cout <
Student *p=NULL,*p1=NULL,*k=NULL;
int n=Studentmassage::ListCount();
if(n<2)
return;
for(p=Head->Next;p!=End;p=p->Next)
for(k=p->Next;k!=End;k=k->Next)
{
if(p->sum>k->sum)
{
Studentmassage::Swap(p,k);
}
}
cout <
getch();
return;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Save()
{
out.open("sort.txt");
for(Student *p=Head->Next;p!=End;p=p->Next)
out<name<Id<Cnum<
<Mnum<Enum<sum<
out.close();
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int main()
{
int x,i=0;
bool quit=false;
cout<
for(i=0;i<3;i++)
cout<
cout<
for(i=0;i<3;i++)
cout<
cout<
Studentmassage Grade;
cout<
getch();
while(!quit)
{
system("cls");
Grade.ShowMenu();
cin>>x;
switch(x)
{
case 0:quit=true;break;
case 1:Grade.AddItem();break;
case 2:Grade.Display();break;
case 3:Grade.Sort();break;
case 4:Grade.Find();break;
case 5:Grade.RemoveItem();break;
case 6:Grade.ModifyItem();break;
}
}
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
-
学生成绩管理系统C++.rar
2019-12-29 11:04:52cout 添加学生信息-----------------" ; cout 删除学生信息-----------------" ; cout 修改学生信息-----------------" ; cout 查找学生信息-----------------" ; cout 显示学生信息-----------------" ; ... -
学生成绩管理系统c++源代码
2009-12-13 14:13:52用c++编写,具有数据库和可视化界面的学生管理系统.值得作为学习的参考 -
学生成绩管理系统源码
2020-01-23 18:00:50在压缩包中包含基于C的学生成绩管理系统源码一份,以及基于C++的学生成绩管理系统源码一份,其中C++源码较为精致,都可以在windos系统上运行 -
学生成绩管理系统C++源码
2018-12-19 10:08:39一套C++学生成绩管理系统源码,已在帮助刚入门C++的人员学习 -
学生成绩管理系统c++ csdn
2009-06-26 09:38:57学生成绩管理系统c++自己做的 完整版 学生成绩管理系统c++ 学生成绩管理系统c++ -
学生成绩管理系统(C++版)
2018-01-17 00:54:36程序使用说明:本程序是使用C++编写的学生成绩管理系统,使用VS2013进行代码的编写,其中file.txt是实验数据。 实习题目:学生成绩管理系统 要求: 1、增加记录:要求可以连续增加多条记录。 2、删除一个学生的... -
C++学生成绩管理系统,2000行完整源代码,超多功能
2012-01-02 14:20:00这个C++管理系统基本涵盖了“学生成绩管理系统”的所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认... -
学生成绩查询管理系统_C++_学生成绩管理系统_
2021-09-28 20:12:23一个用C++做的简易的学生成绩管理系统,基本功能丰富 -
学生成绩管理系统-附代码C++
2020-11-01 19:50:48学生成绩管理系统-附代码C++ ##实现要求: 增加记录:要求可以连续增加多条记录。 删除一个学生的记录:要求可以先查找,再删除。删除前,要求用 户确认。 成绩修改:若输入错误可进行修改;要求可以先查找,再修改...学生成绩管理系统-附代码C++
##实现要求:
- 增加记录:要求可以连续增加多条记录。
- 删除一个学生的记录:要求可以先查找,再删除。删除前,要求用
户确认。 - 成绩修改:若输入错误可进行修改;要求可以先查找,再修改。
- 查找可以根据姓名(或学号)查找某个学生的课程成绩;查找某门
课程成绩处于指定分数段内的学生名单等等。 - 统计分析对某个班级学生的单科成绩进行统计,求出平均成绩;求
平均成绩要求实现函数的重载,既能求单科的平均成绩,又能求三
科总分的平均成绩。求出一门课程标准差和合格率。 - 排序功能:要求按总分进行排序(从高到低),若总分相同,则按
数学排序;若总分和数学相同,则按物理排序;若总分和各科成绩
都相同,则按学号排序。 - 文件操作:可以打开文件,显示班级的所有学生信息;可以将增加
或修改后的成绩重新写入文件;可以将排序好的信息写入新的文
件。 - 所有操作都要通过可视化界面来操作和显示。
9.可以实现模糊查找
10.密码进入管理
注:在文件夹下有成绩名单 和储存密码的两个text文件
源代码如下:
1)Student.h
#ifndef STUDENT_H #define STUDENT_H #include<string> #include<iostream> using namespace std; class Student{ friend class Management; private: string m_id,m_name; int m_math, m_physical, m_english; int m_sum = m_math +m_english + m_physical; //总分 public: void Show(); //展示学生数据 string id() { return m_id; } string name() { return m_name; } int math() { return m_math; } int physical() { return m_physical; } int english() { return m_english; } void input() { cout << "请输入学生学号:"; cin >> this->m_id; cout << endl; cout << "请输入学生姓名:"; cin >> this->m_name; cout << endl; cout << "请输入学生数学成绩:"; cin >> this->m_math; cout << endl; cout << "请输入学生物理成绩:"; cin >> this->m_physical; cout << endl; cout << "请输入学生英语成绩:"; cin >> this->m_english; cout << endl; m_sum = m_math + m_physical + m_english; } }; #endif // ! STUDENT_H
2)Student.cpp
#include "Student.h" //Student::Student(string id,string name,int math,int physical,int english,int sum) : // m_id(id),m_name(name),m_math(math),m_physical(physical),m_english(english),m_sum(sum){} void Student::Show() { cout << "学生学号为:" << m_id << endl; cout << "学生姓名为:" << m_name << endl; cout << "学生数学成绩为:" << m_math << endl; cout << "学生物理成绩为:" << m_physical << endl; cout << "学生英语成绩为:" << m_english << endl; cout << "学生总成绩为:" << m_sum << endl; }
3)Management.h
#ifndef MANAGEMENT_H #define MANAGEMENT_H #include<string> #include<iostream> #include"Student.h" #include<vector> #include<algorithm> using namespace std; class Management { friend class Student; private: vector<Student> m_students; vector<Student>v1; vector<Student>v2; public: Management(vector<Student>students); Management() = default; ~Management(){} void menu();//菜单 void sshow();//展示当前名单 void add();//增加记录 void erase();//删除记录 void search();//查找记录 void grade_search();//查找成绩段 void modify();//修改记录 void grade_analyze(int a);//统计分析 void grade_analyze(double b);//重载 void rank();//成绩排序 void data_use();//文件操作 void data_save();//保存文件 void help();//创新功能-帮助 //bool sumsort(Student a, Student b) { // // if(a.m_sum != b.m_sum){ // return (a.m_sum>b.m_sum); // } // else { // if (a.m_math !=b.m_math){ // return(a.m_math>b.m_math); // } // else if (a.m_math == b.m_math && a.m_physical!= b.m_physical) { // return(a.m_physical > b.m_physical); // } // else if (a.m_math == b.m_math && a.m_physical == b.m_physical && a.m_english != b.m_english) { // return (a.m_english > b.m_english); // } // else { // return (a.m_sum > b.m_sum); // } // } //} }; #endif
4)Management.cpp
#include "Management.h" #include<fstream> using namespace std; Management::Management(vector<Student>students):m_students(students){} void Management::menu() { cout << "********************************************************************************" << endl; cout <<"******************"<< "学 生 成 绩 管 理 系 统" <<"******************"<< endl; cout << " " << "1.增加记录" << " " << endl; cout << " " << "2.查找记录" << " " << endl; cout << " " << "3.删除记录" << " " << endl; cout << " " << "4.成绩修改" << " " << endl; cout << " " << "5.统计分析" << " " << endl; cout << " " << "6.成绩排序" << " " << endl; cout << " " << "7.展示名单" << " " << endl; cout << " " << "8.保存文件" << " " << endl; cout << " " << "9.成绩分段" << " " << endl; cout << " " << "10.显示菜单" << " " << endl; cout << " " << "11.帮助 " << " " << endl; cout << " " << "0.退出系统" << " " << endl; } void Management::data_use() { ifstream in("roster.txt"); if (in) { while (!in.eof()) { Student temp; in >> temp.m_id >> temp.m_name >> temp.m_math >> temp.m_physical >> temp.m_english; temp.m_sum = temp.m_math + temp.m_physical + temp.m_english; m_students.push_back(temp); } m_students.pop_back(); in.close(); } } void Management::add(){ Student a; char choice22; cout << "是否确认输入学生信息?Y确认,其他键退出" << endl; cin >> choice22; while (choice22 == 'Y') { a.input(); int bn = 0;//进行判断 for (auto it = m_students.begin(); it != m_students.end(); it++) {//迭代器遍历防止重复输入 if ((*it).m_id == a.m_id) { cout << "重复输入!" << endl; bn = 1; break; } } if (bn == 0) { m_students.push_back(a); cout << "成功输入" << endl; } cout << "是否继续输入?按Y继续,其他键退出" << endl; cin >> choice22; } } void Management::search() {//search函数用于寻找成员,在插入、删除等都要使用 使用模糊搜索 string new_name, new_id;//两种查找方式,1.按姓名 2.按学号 string new_name2, new_id2; int choice; char choice8 = 'Y'; cout << "请输入您要查找的方式:1.按姓名 2.按学号" << endl; cin >> choice; while (choice8 == 'Y') { if (choice == 1) { cout << "请输入您要查找的学生姓名:"; cin >> new_name; for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_name.find(new_name)!= std::string::npos ) {//https://www.cnblogs.com/lhwblog/p/6425988.html v1.push_back(*it); } } if (v1.size() == 0) { cout << "没有找到此学生" << endl; }//用于判断是否找到学生 else { cout << "查找到学生如下:" << endl; for (auto it1 = v1.begin(); it1 != v1.end(); it1++) { cout << (*it1).m_name << endl; } cout << "请输入继续查找的目标学生姓名:"; cin >> new_name2; for (int i = 0; i < v1.size(); i++) { if (new_name2 == v1[i].m_name) { v1[i].Show(); break; } if (i == (v1.size() - 1)) { cout << "查询错误" << endl; } } v1.clear();//及时清空 } } else { cout << "请输入查找的学生学号:"; cin >> new_id; for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_id.find(new_id)!=std::string::npos) { v1.push_back(*it); } } if (v1.size() == 0) { cout << "没有找到此学生" << endl; } else { cout << "查找到如下学生:" << endl; for (auto it1 = v1.begin(); it1 != v1.end(); it1++) { cout << (*it1).m_id << endl;//显示学生信息 } cout << "请输入继续查找的目标学生学号:"; cin >> new_id2; for (int i = 0; i < v1.size(); i++) { if (new_id2 == v1[i].m_id) { v1[i].Show(); break; } if (i == (v1.size() - 1)) { cout << "查询错误" << endl; } } v1.clear();//及时清空 } } cout << "是否需要继续查找其他同学?是请按Y" << endl; cin >> choice8; } } void Management::grade_search() { int choice1;int grade1, grade2; int z = 0;//判断有无 int z1 = 0;int z2 = 0; cout << "请输入您要查找的学科:1.数学 2.物理 3.英语"; cin >> choice1; cout << endl; cout << "请输入要查找的成绩分数段从"; cin >> grade1; cout << "到"; cin >> grade2; cout << endl; switch (choice1) { case 1: for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_math <= grade2 && (*it).m_math >= grade1) { //Student stu2 = (*it); v2.push_back(*it); z++; } } if (z == 0) { cout << "没有找到该分数段的同学!" << endl; } else { cout << "该分数段的学生有:" << endl; for (auto it = v2.begin(); it != v2.end(); it++) { //Student stu0 = (*it); cout << (*it).m_name << endl; } v2.clear(); } break; case 2: for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_physical <= grade2 && (*it).m_physical >= grade1) { //Student stu2 = (*it); v2.push_back(*it); z1++; } } if (z1 == 0) { cout << "没有找到该分数段的同学!" << endl; } else { cout << "该分数段的学生有:" << endl; for (auto it = v2.begin(); it != v2.end(); it++) { //Student stu0 = (*it); cout << (*it).m_name << endl; } v2.clear(); } break; case 3: for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_english <= grade2 && (*it).m_english >= grade1) { //Student stu2 = (*it); v2.push_back(*it); z2++; } } if (z2 == 0) { cout << "没有找到该分数段的同学!" << endl; } else { cout << "该分数段的学生有:" << endl; for (auto it = v2.begin(); it != v2.end(); it++) { //Student stu0 = (*it); cout << (*it).m_name << endl; } v2.clear(); } break; } } void Management::erase() { search(); char choice33; string tra; int k = 0; cout << "是否继续删除学生信息?按Y继续" << endl; cin >> choice33; while (choice33 == 'Y') { cout << "请输入要删除的学生学号:" << endl; cin >> tra; for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_id == tra) { m_students.erase(it); k = 0; break; } k++; } if (k == 0) { cout << "成功删除" << endl; } else { cout << "未查找到该同学信息" << endl; } cout << "是否继续删除?按Y继续,其他键退出"<< endl; cin >> choice33; } } void Management::modify() { search(); char choice44; string stu22; int m = 0; cout << "是否需要继续修改学生成绩?按Y继续" << endl; cin >> choice44; while (choice44 == 'Y') { cout << "请输入要修改学生学号:"; cin >> stu22; for (auto it = m_students.begin(); it != m_students.end(); it++) { if ((*it).m_id == stu22) { cout << "请输入他的新成绩,依次为数学、物理、英语" << endl; cin >> (*it).m_math >> (*it).m_physical >> (*it).m_english; (*it).m_sum = (*it).m_math + (*it).m_physical + (*it).m_english; m = 0; break; } m++; } if (m == 0) { cout << "修改成功" << endl; } else { cout << "未查找到该同学信息" << endl; } cout << "是否继续修改?按Y继续,其他键退出" << endl; cin >> choice44; } } void Management::grade_analyze(int a) {//分析单科成绩 int hj; int sum1, sum2, sum3; int cout1, cout2, cout3; int cout4 = 0; double av1, av2, av3; int sum4, sum5, sum6; sum4 = sum5 = sum6 = 0; sum1 = sum2 = sum3 = 0; cout1 = cout2 = cout3 = 0; cout << "请输入要查询的科目 1.数学 2.物理 3.英语" << endl; cin >> hj; switch (hj) { case 1: for (int i = 0; i < m_students.size(); i++) { sum1 += m_students[i].m_math; if (m_students[i].m_math >= 60) { cout1++;//及格人数 } if (m_students[i].m_math >= 90) { cout4++; } } av1 = (double)(sum1 / (m_students.size())); for (int i = 0; i < m_students.size(); i++) {//标准差统计 sum4 += (m_students[i].m_math - av1) * (m_students[i].m_math - av1); } cout << "数学成绩的优秀率为:" << ((double)cout4 *100)/ m_students.size() << "%" << endl; cout << "数学成绩标准差为:" << sqrt(sum4 / (m_students.size() - 1)) << endl; cout << "数学平均分为:" << ((double)sum1 / (m_students.size()) )<< endl; cout << "数学及格率为:" << ((double)cout1* 100 / (m_students.size())) << "%" << endl; break; case 2: for (int i = 0; i < m_students.size(); i++) { sum2 += m_students[i].m_physical; if(m_students[i].m_physical>=60){ cout2++;//及格人数 } } av2 = (double)(sum2 / (m_students.size())); for (int i = 0; i < m_students.size(); i++) {//标准差统计 sum5 += (m_students[i].m_physical - av2) * (m_students[i].m_physical - av2); } cout << "物理成绩标准差为:" << sqrt(sum5 / (m_students.size() - 1)) << endl; cout << "物理平均分为:" << ((double)sum2 / (m_students.size())) << endl; cout << "物理及格率为:" << ((double)cout2 * 100/ (m_students.size())) << "%" << endl; break; case 3: for (int i = 0; i < m_students.size(); i++) { sum3 += m_students[i].m_english; if (m_students[i].m_english >= 60) { cout3++;//及格人数 } } av3 = (double)(sum3 / (m_students.size())); for (int i = 0; i < m_students.size(); i++) {//标准差统计 sum6 += (m_students[i].m_english - av3) * (m_students[i].m_english - av3); } cout << "英语成绩标准差为:" << sqrt(sum6 / (m_students.size() - 1)) << endl; cout << "英语平均分为:" <<((double) sum3 / (m_students.size())) << endl; cout << "英语及格率为:" << ((double)cout3 * 100 / (m_students.size())) << "%" << endl; break; } } void Management::grade_analyze(double b) { int sum0 = 0; for (int i = 0; i < m_students.size(); i++) { sum0 += m_students[i].m_sum; } cout << "总分平均分为:" << ((double)sum0 / (m_students.size())) << endl; } void Management::sshow(){//展示函数 for (int i = 0; i < m_students.size(); i++) { cout << m_students[i].m_id << '\t'<< m_students[i].m_name << '\t' << m_students[i].m_math << '\t' << m_students[i].m_physical << '\t' << m_students[i].m_english << endl; } } void Management::rank() {//使用冒泡法,vector的sort函数不知为何无法使用 int jk = 0; while (jk < m_students.size()) { for (int i = 0; i < m_students.size() - 1; i++) { if (m_students[i].m_sum < m_students[i + 1].m_sum) { swap(m_students[i], m_students[i + 1]); } else if (m_students[i].m_sum == m_students[i + 1].m_sum) { if (m_students[i].m_math < m_students[i + 1].m_math) { swap(m_students[i], m_students[i + 1]); } else if (m_students[i].m_math == m_students[i + 1].m_math) { if (m_students[i].m_physical < m_students[i + 1].m_physical) { swap(m_students[i], m_students[i + 1]); } else if (m_students[i].m_physical == m_students[i + 1].m_physical) { if (m_students[i].m_english < m_students[i + 1].m_english) { swap(m_students[i], m_students[i + 1]); } else { continue; } } else { continue; } } else { continue; } } else { continue; } } jk++; } cout << "按照总分排序法后的名单为:" << endl; for (int i = 0; i < m_students.size(); i++) { cout << m_students[i].m_id << '\t' << m_students[i].m_name << '\t' << m_students[i].m_math << '\t' << m_students[i].m_physical << '\t' << m_students[i].m_english << '\t' << m_students[i].m_sum <<endl; } } void Management::data_save() { char yu; cout << "是否确认保存?输入Y保存,任意键退出" << endl; cin >> yu; if (yu == 'Y') { ofstream out("roster.txt", ios::out); if (out) { for (auto it = m_students.begin(); it != m_students.end(); it++) { out << (*it).m_id << '\t' << (*it).m_name << '\t' << (*it).m_math << '\t' << (*it).m_physical << '\t' << (*it).m_english << endl; } out.close(); } } else { cout << "回到菜单操作" << endl; } } void Management::help() { cout << "自写作业,多有不顺,将就将就" << endl;
5)main.cpp。
#include<iostream> #include<fstream> #include"Student.h" #include"Management.h" using namespace std; int main() { ifstream in("roster.txt"); string head; getline(in, head); ifstream in2("cpassword.txt"); string head2; getline(in2, head2); in.close(); in2.close(); Management m1; int choice; int choice99; int choice000; int a = 0; double b = 0 ;//用于成绩分析的重载 string password; cout << " 欢迎访问学生成绩管理系统! " << endl; cout << "请输入管理员密码:(初始密码为:000000)" << endl; cin >> password; if (password == head2){ cout << "密码正确,欢迎进入" << endl; cout << "请输入接下来的操作: 1.进入学生成绩管理系统 2.修改密码 其他数字退出" << endl; cin >> choice000; if(choice000==1){ m1.menu(); m1.data_use();//默认导入数据名单 while (1) { cout << "欢迎进入菜单,请输入您要进行的操作:" << endl; cin >> choice; switch (choice) { case 1://增加记录 m1.add(); break; case 2://查找记录 m1.search(); break; case 3://删除记录 cout << "首先进行模糊查询" << endl; m1.erase(); break; case 4://成绩修改 cout << "首先进行模糊查询" << endl; m1.modify(); break; case 5://分析成绩 cout << "分析单科成绩请输入 1 :::: 分析总分请输入 除'1'的其他数字" << endl; cin >> choice99; cout << endl; if (choice99 == 1) { m1.grade_analyze(a); } else { m1.grade_analyze(b); } break; case 6: m1.rank(); break; case 7: m1.sshow(); break; case 8: m1.data_save(); break; case 9: m1.grade_search(); break; case 10: m1.menu(); break; case 11: m1.help(); break; case 0: return 0; } } } else if (choice000 == 2) { ofstream out2("cpassword.txt", ios::out); string new_password; cout << "请输入新密码:"; cin >> new_password; out2 << new_password << endl; cout << "成功修改密码!" << endl; out2.close(); cout << "按任意键退出" << endl; } else{ cout << "退出系统" << endl; return 0; } } else { cout << "密码错误,退出系统 " << endl; return 0; } return 0; }
此图为成绩信息格式(所有信息均为编造)
此为密码格式
均在此project文件下。
;;
;
;
大一c++写的大作业,比较普普通通,能为大家解决一点困难算一点。
代码中有一些尝试失败的记录,都注释掉了,用的Visual Studio 19 -
学生成绩管理系统 C++语言源代码
2009-05-14 15:04:22学生成绩管理系统,可以实现文件的存取,成绩的删除,成绩的录入,排名,查找 -
C++程序设计期末大作业学生成绩管理系统课程设计源代码.zip
2022-06-08 17:29:28C++程序设计期末大作业学生成绩管理系统课程设计源代码C++程序设计期末大作业学生成绩管理系统课程设计源代码C++程序设计期末大作业学生成绩管理系统课程设计源代码C++程序设计期末大作业学生成绩管理系统课程设计源... -
C语言实现简单学生成绩管理系统
2020-12-31 01:07:17本文实例为大家分享了C语言实现学生成绩管理系统的具体代码,供大家参考,具体内容如下 C语言小项目 实现一个学生成绩管理系统 系统功能: 1.实现所有学生成绩的录入(利用结构体数组),当输入字符为end时候,... -
学生成绩管理系统,数据结构,C++
2021-01-25 16:11:35新追加了读取文件功能、优化了部分代码 -
C/C++学生成绩管理系统
2021-12-24 12:25:19选题3学生成绩管理一、设计要求由于同学们已经学习了指针、链表、文件读写等基本知识,为了与后续课程, 如数据结构、数据库系统等有一个知识体系上的衔接,特设置一个信息管理类的课题《成绩管理系统》, 其它诸如... -
c/c++课程设计学生成绩管理系统
2013-10-29 22:26:39关于c语言和c++的课程成绩信息管理系统,共有将近6000行代码,建议使用vs2012或2010便于管理也可使用VC6.0++环境修改运行但查找麻烦,所有的语言没有脱离c和c++,主要采用模块思想,也可以转换成面向对象型的语言,... -
C++学生成绩管理系统代码
2012-10-14 01:12:42提供c++学生管理系统的代码,供大家分享学习! -
C++课程设计 学生成绩管理系统
2021-01-11 19:26:09学生成绩管理系统 1.编译器 Dev c++; 2.系统功能需求分析 2.1学生成绩管理系统需求分析 包含学生的基本信息:姓名,性别,生日。 学生的成绩信息:学号,五科成绩,五科课程的名字(不同专业学生有不同的课程),总分...1.编译器
Dev c++;
2.系统功能需求分析
2.1学生成绩管理系统需求分析
包含学生的基本信息:姓名,性别,生日。
学生的成绩信息:学号,五科成绩,五科课程的名字(不同专业学生有不同的课程),总分,专业,绩点等。
学生成绩管理系统具有以下这些功能:
(1)学生成绩的录入:录入新的学生成绩等信息;
(2)学生成绩的添加:添加新的学生成绩等信息;
(3)学生成绩的删除:删除不需要的学生成绩等信息。
(4)学生成绩的查找:查找你需要的学生成绩等信息。
(5)学生成绩的修改:修改错误的学生成绩等信息。
(6)学生成绩的排序:按学生的绩点排序,排序后结果写入文件。
(7)学生的挂科情况:统计学生成绩小于60的数目。
(8)学生成绩的显示:显示所有学生成绩等信息。
(9)学生成绩的保存:把学生成绩等信息保存到文件。
图 1 学生成绩管理系统框架2.2三个类功能需求分析
2.2.1 Person类
如图 1所示:
Person类派生出Student类。
Person类中受保护的数据成员有:姓名,性别,生日包含年月日。生日这个成员函数是BirthDate类的对象。
Person类中公用的成员函数有:
(1)输入函数
(2)显示函数
(3)重载<<,>>的函数
(4)基本的构造函数,默认构造函数,析构函数。2.2.2 Student类
Student类派生出Undergraduate类。
Student类的受保护的数据成员:学号,五门课程名,五门课的成绩,总成绩。静态数据成员N用来统计学生人数。
Student类的公用的成员函数:
(1)输入函数
输入学生成绩等信息,并写入student.dat文件。
(2)显示函数
从student.dat 文件中读,并打印到终端。
(3)重载<<,>>的函数
(4)构造函数,默认构造函数,和析构函数。
图 2 Student类框架2.2.3 Undergraduate类
Undergraduate类的私有的数据成员:专业,绩点,静态数据成员N用来统计学生人数。
Undergraduate类的公用的成员函数:
(1)重载<<,>>的函数
(2)构造函数,默认构造函数,和析构函数。
(3)输入学生成绩等信息
输入学生成绩等信息并写入Undergraduate.dat文件。
(4)显示所有的学生成绩等信息
从Undergraduate.dat文件中读,并打印到终端。
(5)增加学生成绩等信息
增加学生成绩等信息并继续写入Undergraduate.dat文件,如果重复输入已存在的学生学号,需要重新输入学生的成绩等信息。
(6)删除学生成绩等信息
在已添加的学生中查找要删除学生的学号,如果输入学生的学号查找不到,需要重新输入要删除学生的学号,并在文件中删除该学生成绩等信息。
(7)查找学生成绩等信息
按学生的学号查找学生,如果输入学生的学号查找不到,需要重新输入要删除学生的学号。在已添加的学生中查找到学生,就打印学生成绩等信息到终端。
(8)修改学生成绩等信息
按学生的学号查找需要修改成绩等信息的学生,如果输入学生的学号查找不到,需要重新输入要删除学生的学号。在已添加的学生中查找到学生,就重新输入该学生的信息,打印修改前后学生成绩等信息到终端,并将修改后学生成绩等信息写入文件。
(9)判断重复学号
判断是否重复输入已存在的学号。
(10)学生成绩排序
从Undergraduate.dat文件中读,并计算学生总分,绩点,并按降序排序,将成绩单写入Undergraduate_score_list.dat文件,并打印到终端。
(11)判断挂科的情况
从Undergraduate.dat文件中读,统计学生五科成绩小于60的个数,并打印到终端。
(12)学生成绩管理系统的菜单
菜单有0~8种选项,选择不同的选项,分别实现上述不同的功能。
图 3 Undergraduate类框架3.系统设计
3.1学生成绩管理系统对四个类的设计
3.1.1 BirthDate类
如图 4所示:
BirthDate类的数据成员:定义int类型的year,month,day.
BirthDate类的成员函数:
(1)默认构造函数。
(2)构造函数。
(3)重载运算符<<,>>
(4)change()函数,用来修改年月日。图 4 BirthDate类
3.1.2 Person类
如图 5所示:
Person类的数据成员:定义string类型的姓名,性别。定义BirthDate类的对象birth。
Person类的成员函数:
(1)默认构造函数
(2)构造函数
(3)析构函数
(4)display()函数,将人的信息打印到终端。
(5)input()函数,输入人的信息。
图 5 Person类3.1.3 Student类
如图 6所示:
Student类的数据成员:
定义string类型的id,course[5]用来存放五门课程的名字。
定义double类型的total,score[5]用来存放五门成绩。
定义int类型的静态数据成员N用来统计学生学生数量。
Student类的成员函数:
(1)默认构造函数
(2)构造函数,对直接基类Person类初始化。
(3)析构函数重载运算符>>,<<
(4)display()函数
从student.dat文件中读,并打印学生成绩等信息到终端。
(5)input()函数
输入学生成绩等信息并写入student.dat文件。
图 6 Student类3.1.4 Undergraduate类
如图 7所示:
Undergraduate类的数据成员:
定义string类型的major
定义double 类型的gpa
定义int类型的静态数据成员N用来统计学生学生数量。
图 7 Undergraduate类Undergraduate类成员函数:
(1)默认构造函数
(2)构造函数,对直接基类Student类初始化。
(3)析构函数
(4)重载运算符<<,>>
(5)display()函数
如图 8所示:
从Undergraduate.dat文件中读,并打印学生成绩等信息到终端。
图 8 显示函数设计思路(6)input()函数
如图 9所示:
导入学生成绩等信息并写入Undergraduate.dat文件。
图 9 输入函数设计思路(7)add()函数
如图 10所示:
增加学生成绩等信息并写入Undergraduate.dat 文件。调用unique()函数判断是否输入之前已导入Undergraduate.dat文件中学生的学号。如果重复输入学生的学号,需要重新输入学生成绩等信息。图 10 增加函数设计思路
(8)remove()函数
如图 11所示:
删除学生成绩等信息并在Undergraduate.dat文件中删除该学生成绩等信息。如果从已导入Undergraduate.dat文件中未找到要删除学生的学号,需要重新输入要删除学生的学号。
图 11 删除函数设计思路(9)search()友元函数
如图 12所示:
输入学生的学号查找学生,并在终端打印学生成绩等信息并输入挂科数,如果从已导入Undergraduate.dat文件中未找到要查找学生的学号,需要重新输入要查找学生的学号。
图 12 查找函数设计思路(10)change()函数
如图 13所示:
输入学生的学号查找要修改的学生,如果找到该学生,就重新输入该学生信息。如果从已导入Undergraduate.dat文件中未找到要修改学生的学号,需要重新输入要修改学生的学号。将修改后学生成绩等信息写入Undergraduate.dat文件,并在终端打印修改前和修改后学生成绩等信息。图 13 修改函数设计思路
(11)unique()函数
从Undergraduate.dat文件中读,并判断输入学号与文件中的学生的学号重复。
(12)sort1()友元函数
如图 14所示:
从Undergraduate.dat文件中读,计算总分,绩点,按降序冒泡排序,将排序后成绩单写入Undergraduate_score_list.dat文件,并打印到终端。图 14 排序函数设计思路
(13)sling()友元函数
如图 15所示:
从Undergraduate.dat文件中读,统计文件中学生成绩小于60的数目,并打印到终端。
图 15 挂科函数设计思路
(14)menu()函数
如图 16所示:
有0~8种选项,分别实现上述的功能。图 16 菜单
4.系统实现
4.1四个类进一步完善
4.1.1 BirthDate类
(1)BirthDate(),BirthDate类的默认构造函数。
(2)BirthDate(int,int,int);BirthDate类的构造函数。
(3)重载运算符<<,如图 17所示:可用于对BirthDate类的对象输出。图 17 BirthDate类重载运算符<<
(4)重载运算符>>,如图 18所示:可用于对BirthDate类的对象输入。
图 18 BirthDate类重载运算符>>
(5)change(),用来修改年,月,日。
4.1.2 Person类
(1)Person(),Person类的默认构造函数。
(2)Person(string,string,int,int,int);BirthDate类的构造函数。
(3)~Person(),Person类的析构函数。
(4)display(),打印信息到终端。
(5)input(),输入信息。4.1.3 Studetn类
(1)Student(),Student类的默认构造函数。
(2)Student(string,string,int,int,int,string,string,double,double),Student类的构造函数,对直接基类Person类和对自身数据成员初始化。
(3)~Student(),Student类的析构函数。
(4)重载运算符<<,如图 19所示:可用于对Student类的对象输出。图 19 Student类重载运算符<<
(5)重载运算符>>,如图 20所示:可用于对Student类的对象输入。
图 20 Student类重载运算符>>
(6)display(),打印学生成绩等信息到终端。
(7)input(),输入学生成绩等信息。4.1.4 Undergraduate类
(1)Undergraduate(),Undergraduate类的默认构造函数。
(2)Undergraduate(string,string,int,int,int,string,string,double,double,string,double) Undergraduate类的构造函数,对直接基类Student类和数据成员初始化。
(3)~Undergraduate(),Undergraduate类的析构函数。
(4)重载运算符<<,如图 21所示:可用于对Undergraduate类的对象输出。图 21 Undergraduate类重载运算符<<
(5)重载运算符>>,如图 22所示:可用于对Undergraduate类的对象输出。
图 22 Undergraduate类重载运算符>>
(6)输入学生成绩等信息
代码实现的功能是输入学生成绩等信息,写入文件,统计学生数量。
大体步骤如下:
步骤一:打开Undergraduate.dat文件。
步骤二:输入要导入学生人数。
步骤三:for循环,输入学生成绩成绩等信息,并写入文件,关闭文件。
具体代码如图 23所示:图 23 输入函数
如图 24所示:就可以输入学生成绩等信息包含:学生的专业,姓名,性别,生日,学号,五科课程名和五科成绩。
图 24 输入函数运行结果
(7)增加学生成绩等信息
代码实现的功能是增加学生成绩等信息,判断是否输入重复学生学号,调用unique()实现。写入文件,增加学生数量。
大体步骤如下:
步骤一:打开Undergraduate.dat文件。
步骤二:输入要增加学生人数。
步骤三:unique()判断是否输入重复学生学号,如果输入已存在学生学号,需要重新输入学生成绩等信息。
步骤四:将增加的学生,继续写入文件尾部。关闭文件,学生数量增加。
具体代码如图 25所示:图 25 增加函数
如图 26所示:就可以增加学生成绩等信息包含:学生的专业,姓名,性别,生日,学号,五科课程名和五科成绩。
图 26 增加函数运行结果
(8)删除学生成绩等信息
代码实现的功能是按学生的学号删除学生成绩等信息,并在文件中删除该学生。
删除功能代码主要部分:
大体步骤如下:
步骤一:打开Undergraduate.dat文件。
步骤二:输入要删除学生的学号。如果找不到要删除学生学号,就重新输入学生学号。
步骤三:找到要删除学生的学号,记住在数组中的下标,往前移一位,覆盖要删除学生的信息。
步骤四:写入文件。学生数量减少。关闭文件。
如图 27所示:就可以输入要删除学生的学号。若未找到学号,需要重新输入学号。图 27 删除函数运行结果
(9)查找学生成绩等信息
代码实现的功能是按学生的学号查找学生成绩等信息。统计挂科数,将要学生信息打印终端
大体步骤如下:
步骤一:输入要查找学生的学号。
步骤二:如果未找到该学生的学号,需要重新输入学生信息。
步骤三:找到学生的学号,统计挂科数,打印终端。
如图 28所示:就可以输入要查找学生学号,未找到要删除学生的学号,需要重新输入学生学号。
图 28 查找函数运行结果
(10)修改学生成绩等信息
代码实现的功能是输入要修改学生学号,重新输入该学生信息并将修改后的信息写入文件。
大体步骤如下:
步骤一:打开Undergraduate.dat文件,输入要修改学生的学号。
步骤二:未找到要修改学生学生学号,需要重新输入学号。
步骤三:找到要修改学生学号,重新输入学生信息。写入文件,打印终端。关闭文件。
如图 29所示:输入要修改学生学号,修改信息。图 29 修改函数运行结果
(11)学生成绩排序
代码实现的功能是按学生基地排序,打印终端,写入Undergraduate_score_list.dat文件。
大体步骤如下:
步骤一:统计学生总分,计算绩点,排序
步骤二:打开文件,写入文件,打印终端,关闭文件。
如图 30所示:输入学生成绩等信息就可以看到排序后结果。(我事先未输入学生成绩,就看不到了。)图 30 排序函数运行结果
(12)判断重复学号
如图 31所示:给定要输入学号,判断是否已存在。
具体代码如下:图 31 判断重复学号
(13)学生挂科情况
代码实现功能是统计所有学生挂科情况,打印终端。
如图 32所示,具体代码如下:
图 32 学生挂科函数
(14)显示学生成绩等信息
如图 33所示:打印学生成绩等信息到终端。
图 33 显示函数
如图 34所示:显示学生成绩等信息。由于我事先未输入学生成绩等信息,就看得到学生成绩等信息。
图 34 显示函数运行结果
(15)学生成绩管理系统菜单
如图 35所示:根据不同选项,实现不同功能。图 35 菜单运行结果
5.系统测试
5.1学生成绩管理系统功能测试
5.1.1输入
如图 36所示:
测试步骤大体如下:
步骤一:输入要导入学生人数。
步骤二:输入学生成绩等信息。依次输入学生专业,姓名,学号,(生日)年,月,日,学号,课程1,成绩1,课程2,成绩2,课程3,成绩3,课程4,成绩4,课程5,成绩5。图 36 输入功能测试结果
5.1.2增加
如图 37所示:
测试步骤大体如下:
步骤一:输入要增加学生人数。
步骤二:如果输入学生的学号已存在,需要重新输入学生成绩等信息。
步骤三:输入学生成绩等信息。依次输入学生专业,姓名,学号,(生日)年,月,日,学号,课程1,成绩1,课程2,成绩2,课程3,成绩3,课程4,成绩4,课程5,成绩5。图 37 增加功能测试结果
如图 38所示:将学生成绩等信息写入Undergraduate.dat文件。
图 38 Undergraduate.dat文件
5.1.3删除
如图 39所示:
测试删除功能的大体步骤:
步骤一:输入要删除学生的学号。
步骤二:未找到要删除学生的学号,重新输入学号,直到找到学号为止。(因此测试删除功能之前需要先输入学生成绩等信息。)
步骤三:找到要删除学生的学号,打印删除前后学生信息。(更直观)图 39 删除功能测试结果
如图 40所示:删除学生成绩等信息后在文件中更改。图 40 修改后Undergraduate.dat文件
5.1.4查找
如图 41所示:
测试查找功能的大体步骤:
步骤一:输入要查找学生的学号。
步骤二:未找到要查找学生的学号,重新输入学号,直到找到学号为止。(因此测试查找功能之前需要先输入学生成绩等信息。)
步骤三:找到要查找学生的学号,打印要查找的学生成绩等信息。图 41 查找功能测试结果
5.1.5修改
如图 42所示:
测试修改功能大体步骤:
步骤一:输入要修改学生的学号。
步骤二;未找到要修改学生的学号,重新输入学号,直到找到学号为止。(因此测试修改功能之前需要先输入学生成绩等信息。)
步骤三:找到要修改学生的学号,重新输入学生成绩等信息。打印修改前后学生成绩等信息。(更直观)图 42 修改功能测试结果
5.1.6排序
如图 43所示:
测试排序功能大体步骤:
步骤一:测试该功能之前需要输入学生成绩等信息。
图 43 排序功能测试结果
如图 44所示:将排序后学生成绩单写入Undergraduate_score_list.dat文件。
图 44 Undergraduate_score_list.dat文件
5.1.7挂科情况
如图 45所示:
测试挂科情况功能大体步骤:
步骤一:测试该功能之前需要输入学生成绩等信息。图 45 挂科情况功能测试结果
5.1.8显示学生成绩等信息
如图 46所示:
测试该功能之前需要输入学生成绩等信息。图 46 显示功能测试情况
6.结束语
我设计的学生成绩管理系统的缺点,缺点很多,由于能力有限,只是实现了简单的几个功能,设计的学生成绩管理系统很脆弱,很容易就崩了。
优点:能够对输入成绩按绩点排序,统计挂科数,对输入错误的生日,成绩进行异常处理。
缺点一:没有动态的开辟空间,对指针不熟,没有用链表增删学生信息,就定义80大小对象数组存放学生成绩等信息。
缺点二:每次使用都需要先输入学生成绩等信息。等到下一次使用时,上一次输入学生的成绩就没了。
缺点三:需要依次输入学生专业,姓名,性别,年,月,日,学号,课程1,成绩1…该输入int,输入string。多输入或少输入信息。系统都可能会崩。
…
缺点很多,这些问题仍需继续解决。
通过课程设计,发现了自己在知识上还存在很多问题。学到了不少东西,这个学生成绩管理系统不能很好体现继承和多态性。虽然用到了继承,但用的并不好。我觉得课程设计考察对知识的综合运用,用到了学过的很多知识,通过这次机会,找到自己的知识漏洞,查课本,查资料,收获很多。7.代码展示
#include<iostream> #include<fstream> using namespace std; class BirthDate{ public: int year;//年 int month;//月 int day;//日 BirthDate(); BirthDate(int y,int m,int d):year(y),month(m),day(d){} friend istream& operator>>(istream &in,BirthDate &b); friend ostream& operator<<(ostream &out,BirthDate &b); void change(int,int,int);//修改 }; class Person { protected: string name;//姓名 string sex;//性别 BirthDate birth;//生日 public: Person(); Person(string n,string s,int y,int m,int d):birth(y,m,d),name(n),sex(s){} ~Person(); virtual void display();//输出 void input();//输入 }; class Student:public Person//学生类 { protected: string id;//学号 string course[5];//五门课名 double score[5];//五门成绩 double total;//总分 static int N;//统计学生数量 public: Student(); Student(string n,string s,int y,int m,int d,string i,string course[5],double score[5],double t); ~Student(); friend istream& operator>>(istream &in,Student &s); friend ostream& operator<<(ostream &out,Student &s); void display();//打印终端 void input(Student*);//输入并写入文件 }; class Undergraduate:public Student//大学生类 { private: string major;//专业名 double gpa;//绩点 static int N;//统计学生数量 public: Undergraduate(); Undergraduate(string n,string s,int y,int m,int d,string i,string course[5],double score[5],double t,string major):Student(n,s,y,m,d,i,course,score,t),major(major){gpa=0;} ~Undergraduate(); friend istream& operator>>(istream &in,Undergraduate &s); friend ostream& operator<<(ostream &out,Undergraduate &s); void display(); //显示 void input(Undergraduate*);//导入学生成绩等信息 void add(Undergraduate*);//增加 void remove(Undergraduate*);//删除 friend void search(Undergraduate*);//查找 void change(Undergraduate*);//修改 bool unique(const Undergraduate*,const string);//判断重复学号 friend void sort1(const Undergraduate *s);//排名 friend void sling(const Undergraduate*);//挂科 void menu(Undergraduate*); //目录 }; //BirthDate类 BirthDate::BirthDate() { year=2000; month=1; day=1; } istream& operator>>(istream &in,BirthDate &b) { in>>b.year>>b.month>>b.day; return in; } ostream& operator<<(ostream &out,BirthDate &b) { out<<b.year<<" "<<b.month<<" "<<b.day; return out; } void BirthDate::change(int y,int m,int d)//修改 { year=y; month=m; day=d; } //Person类 Person::Person() { name='0'; sex='0'; } Person::~Person() { } void Person::display()//输出 { cout<<name<<" "<<sex<<" "; cout<<birth<<" "; } void Person::input()//输入 { cin>>name>>sex; cin>>birth; } //Student类 int Student::N=0; Student::Student() { id='0'; for(int i=0;i<5;i++) { course[i]='0'; score[i]=0; } total=0; } Student::Student(string n,string s,int y,int m,int d,string i,string c[5],double sc[5],double t):Person(n,s,y,m,d),id(i),total(t) { for(int i=0;i<5;i++) { course[i]=c[i]; score[i]=sc[i]; } } Student::~Student() { } istream& operator>>(istream &in,Student &s) { in>>s.name>>s.sex>>s.birth; in>>s.id; in>>s.course[0]>>s.course[1]>>s.course[2]>>s.course[3]>>s.course[4]; in>>s.score[0]>>s.score[1]>>s.score[2]>>s.score[3]>>s.score[4]; return in; } ostream& operator<<(ostream &out,Student &s) { out<<s.name<<" "<<s.sex<<" "<<s.birth<<" "; out<<s.id<<" "<<s.course[0]<<" "<<s.score[0]<<" "; out<<s.course[1]<<" "<<s.score[1]<<" "<<s.course[2]<<" "<<s.score[0]<<" "; out<<s.course[3]<<" "<<s.score[3]<<" "<<s.course[4]<<" "<<s.score[4]; return out; } void Student::display() { Student s[N]; cout<<"姓名 性别 出生日期 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5"<<endl; ifstream infile("student.dat"); if(!infile) { cout<<"open error!"<<endl; } for(int i=0;i<N;i++) { infile>>s[i]; cout<<s[i]<<endl; } infile.close(); } void Student::input(Student *s) { int n; ofstream outfile("student.dat"); if(!outfile) { cout<<"open error!"<<endl; } cout<<"请输入导入学生人数:"<<endl; cin>>n; N=n; cout<<"请输入学生信息"<<endl; cout<<"姓名 性别 出生日期:年 月 日 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5"<<endl; for(int i=0;i<n;i++) { cin>>s[i]; outfile<<s[i]<<endl; } outfile.close(); } //Undergradu类 int Undergraduate::N=0; Undergraduate::Undergraduate() { major='0'; gpa=0; } Undergraduate::~Undergraduate() { } istream& operator>>(istream &in,Undergraduate &s) { in>>s.major; in>>s.name>>s.sex>>s.birth; in>>s.id>>s.course[0]>>s.score[0]; in>>s.course[1]>>s.score[1]>>s.course[2]>>s.score[2]; in>>s.course[3]>>s.score[3]>>s.course[4]>>s.score[4]; return in; } ostream& operator<<(ostream &out,Undergraduate &s) { out<<s.major<<" "; out<<s.name<<" "<<s.sex<<" "<<s.birth<<" "; out<<s.id<<" "<<s.course[0]<<"\t"<<s.score[0]<<"\t"; out<<s.course[1]<<"\t"<<s.score[1]<<"\t"<<s.course[2]<<"\t"<<s.score[2]<<"\t"; out<<s.course[3]<<"\t"<<s.score[3]<<"\t"<<s.course[4]<<"\t"<<s.score[4]; return out; } void Undergraduate::display() { Undergraduate s[N]; cout<<"专业 姓名 性别 出生日期 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5"<<endl; ifstream infile("Undergraduate.dat");//打开文件 if(!infile) { cout<<"open error!"<<endl; } for(int i=0;i<N;i++) { infile>>s[i];//写入文件 cout<<s[i]<<endl;//打印终端 } infile.close();//关闭终端 } void Undergraduate::input(Undergraduate *s)//输入 { int n; ofstream outfile("Undergraduate.dat");//打开文件 if(!outfile) { cout<<"open error!"<<endl; } cout<<"请输入导入学生人数:"<<endl; cin>>n; if(n<0) { cout<<"输入错误"<<endl; } s[0].N=n;//统计学生人数 cout<<"请输入学生成绩等信息"<<endl; cout<<"专业 姓名 性别 出生日期:年 月 日 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5"<<endl; try { for(int i=0;i<n;i++) { cin>>s[i];//输入学生信息 if(s[i].score[0]<0||s[i].score[0]>100||s[i].score[1]<0||s[i].score[1]>100||s[i].score[2]<0||s[i].score[2]>100||s[i].score[3]<0||s[i].score[3]>100||s[i].score[4]<0||s[i].score[4]>100) { int a; throw a; } if(s[i].birth.year<=1980||s[i].birth.month<=0||s[i].birth.month>=12||s[i].birth.day<=0||s[i].birth.day>31) { BirthDate birth; throw birth; } outfile<<s[i]<<endl;//写入文件 } outfile.close();//关闭文件 } catch(int) { cout<<"输入的成绩非法"<<endl; } catch(BirthDate) { cout<<"输入出生日期非法"<<endl; } } void Undergraduate::add(Undergraduate *s)//增加 { int n; cout<<"请输入要添加的人数"<<endl; cin>>n; cout<<"专业 姓名 性别 出生日期:年 月 日 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5"<<endl; ofstream outfile("Undergraduate.dat",ios::app);//打开文件 if(!outfile) { cout<<"open error!"<<endl; } try { for(int i=N;i<N+n;i++) { cin>>s[i];//输入学生信息 if(Undergraduate::unique(s,s[i].id))//判断是否输入重复学号 { cout<<"请重新输入学生成绩等信息:"<<endl; cin>>s[i]; } if(s[i].score[0]<0||s[i].score[0]>100||s[i].score[1]<0||s[i].score[1]>100||s[i].score[2]<0||s[i].score[2]>100||s[i].score[3]<0||s[i].score[3]>100||s[i].score[4]<0||s[i].score[4]>100) { int a; throw a; } if(s[i].birth.year<=1980||s[i].birth.month<=0||s[i].birth.month>=12||s[i].birth.day<=0||s[i].birth.day>31) { BirthDate birth; throw birth; } outfile<<s[i]<<endl;//将学生信息写入文件 } outfile.close();//关闭文件 N+=n;//增加学生人数 } catch(int) { cout<<"输入的成绩非法"<<endl; } catch(BirthDate) { cout<<"输入出生日期非法"<<endl; } } void Undergraduate::remove(Undergraduate *s)//删除 { int n; string id; bool flag=false; cout<<"请输入要删除学生信息的学号:"<<endl; while(!flag) { cin>>id; for(int i=0;i<N;i++) { if(s[i].id==id)//判断是否找到要删除学生学号 { flag=true; cout<<"学生成绩等信息:"<<endl; for(int k=0;k<N;k++) //打印到终端 { cout<<s[k]<<endl; } for(int j=i;j<N-1;j++)//往前移1为,覆盖该学生信息 s[j]=s[j+1]; cout<<"删除成功!"<<endl; N=N-1;//减少学生人数 break; } } if(!flag) { cout<<"未找到该学生信息,请重新输入"<<endl; } } ofstream outfile("Undergraduate.dat");//打开文件 if(!outfile) { cout<<"open error!"<<endl; } cout<<"删除后学生信息表:"<<endl; for(int i=0;i<N;i++) { outfile<<s[i]<<endl;//写入文件 cout<<s[i]<<endl;//打印终端 } outfile.close(); //关闭文件 } void search(Undergraduate *s)//查找 { string id; bool flag=false; int i,j,count=0; int num[5]={-1}; int N=s[0].N; cout<<"请输入要查找学生信息的学号:"<<endl; while(!flag) { cin>>id; for(i=0;i<N;i++) { if(s[i].id==id)//判断是否查找到该学生信息 { flag=true; cout<<"该学生信息:"<<endl; cout<<s[i]; for(j=0;j<5;j++) { if(s[i].score[j]<60) { count++;//统计挂科数 } } cout<<"\t有"<<count<<"门课挂科"<<endl; break; } } if(!flag) { cout<<"未找到该学生信息,请重新输入学号"<<endl; } } } void Undergraduate::change(Undergraduate *s)//修改 { string id; bool flag=false; cout<<"请输入要修改学生信息的学号:"<<endl; while(!flag) { cin>>id; for(int i=0;i<N;i++) { if(s[i].id==id)//判断是否找到要修改的学生 { flag=true; cout<<"学生成绩信息表:"<<endl; for(int k=0;k<N;k++) { cout<<s[k]<<endl; //打印修改前学生的信息 } cout<<"请重新输入该学生信息:"<<endl; cin>>s[i]; break; } } if(!flag) { cout<<"未找到该学生信息,请重新输入学号:"<<endl; } } ofstream outfile("Undergraduate.dat");//打开文件 if(!outfile) { cout<<"open error!"<<endl; } cout<<"修改后学生成绩信息表:"<<endl; for(int i=0;i<N;i++) { outfile<<s[i]<<endl;//将修改后学生信息写入文件 cout<<s[i]<<endl;//将修改后信息打印终端 } outfile.close(); //关闭文件 } bool Undergraduate::unique(const Undergraduate *s,const string id)//判断重复学号 { for(int i=0;i<N;i++) { if(s[i].id==id) { cout<<s[i].id<<"已存在,请勿输入重复学号的学生信息!"<<endl; return true; } } return false; } void sort1(const Undergraduate *s)//按学生绩点排序 { int i,j,k; int N=s[0].N; Undergraduate temp,stu[N]; ifstream infile("Undergraduate.dat"); if(!infile) { cout<<"open error!"<<endl; } for(i=0;i<N;i++)//从文件读 infile>>stu[i]; infile.close(); for(i=0;i<N;i++)//求总分 { stu[i].total=0; for(j=0;j<5;j++) { stu[i].total+=stu[i].score[j]; } stu[i].gpa=(stu[i].total/50.0)-5;//求绩点 } for(i=0;i<N-1;i++)//按学生绩点冒泡排序 从高到低打印到终端 { for(j=0;j<N-1-i;j++) { if(stu[j].gpa<stu[j+1].gpa) { temp.name=stu[j].name;temp.sex=stu[j].sex;temp.birth=stu[j].birth;temp.id=stu[j].id; temp.name=stu[j].name;temp.total=stu[j].total;temp.gpa=stu[j].gpa; for(k=0;k<5;k++) { temp.course[k]=stu[j].course[k]; temp.score[k]=stu[j].score[k]; } stu[j].name=stu[j+1].name;stu[j].sex=stu[j+1].sex;stu[j].birth=stu[j+1].birth;stu[j].id=stu[j+1].id; stu[j].name=stu[j+1].name;stu[j].total=stu[j+1].total;stu[j].gpa=stu[j+1].gpa; for(k=0;k<5;k++) { stu[j].course[k]=stu[j+1].course[k]; stu[j].score[k]=stu[j+1].score[k]; } stu[j+1].name=temp.name;stu[j+1].sex=temp.sex;stu[j+1].birth=temp.birth;stu[j+1].id=temp.id; stu[j+1].name=temp.name;stu[j+1].total=temp.total;stu[j+1].gpa=temp.gpa; for(k=0;k<5;k++) { stu[j+1].course[k]=temp.course[k]; stu[j+1].score[k]=temp.score[k]; } } } } ofstream outfile("Undergraduate_score_list.dat");//打开文件 cout<<"姓名 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5\t绩点"<<endl; for(i=0;i<N;i++) { outfile<<stu[i].name<<" "<<stu[i].id<<" ";//写入文件 cout<<stu[i].name<<" "<<stu[i].id<<" ";//打印终端 for(j=0;j<5;j++) { outfile<<stu[i].course[j]<<"\t"<<stu[i].score[j]<<"\t"; cout<<stu[i].course[j]<<"\t"<<stu[i].score[j]<<"\t"; } outfile<<stu[i].gpa<<endl; cout<<stu[i].gpa<<endl; } outfile.close(); //关闭文件 } void sling(const Undergraduate *s)//学生挂科情况 { int N=s[0].N; int i,j,count=0; Undergraduate stu[N]; ifstream infile("Undergraduate.dat");//打开文件 if(!infile) { cout<<"open error!"<<endl; } for(i=0;i<N;i++)//从文件读 infile>>stu[i]; infile.close(); //关闭文件 for(i=0;i<N;i++) { count=0; for(j=0;j<5;j++) { if(stu[i].score[j]<60) { count++;//统计挂科数 } } cout<<stu[i]<<"\t"<<"有"<<count<<"门课挂科"<<endl; //打印学生成绩等信息和挂科的情况 } } void Undergraduate::menu(Undergraduate *s)//学生成绩管理系统菜单 { Undergraduate STU; while(1) { system("color b1"); cout<<"*===============================================================================================*"<<endl; cout<<"**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&欢迎使用学生成绩管理系统&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**"<<endl; cout<<"** ①输入学生信息 **"<<endl; cout<<"** ②增加学生信息 **"<<endl; cout<<"** ③删除学生信息 **"<<endl; cout<<"** ④查找学生信息 **"<<endl; cout<<"** ⑤修改学生信息 **"<<endl; cout<<"** ⑥学生成绩排序 **"<<endl; cout<<"** ⑦学生挂科情况 **"<<endl; cout<<"** ⑧显示学生信息 **"<<endl; cout<<"** 〇 退出 **"<<endl; cout<<"**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**" <<endl; cout<<"*===============================================================================================*"<<endl; cout<<"请输入您要选择的服务种类:( 0 ~ 8)"<<endl; int num; cin>>num; switch(num) { case 1 :system("CLS");STU.input(s);system("pause");break; case 2 :system("CLS");STU.add(s);system("pause");break; case 3 :system("CLS");STU.remove(s);system("pause");break; case 4 :system("CLS");search(s);system("pause");break; case 5 :system("CLS");STU.change(s);system("pause");break; case 6 :system("CLS");sort1(s);system("pause");break; case 7 :system("CLS");sling(s);system("pause");break; case 8 :system("CLS");STU.display();system("pause");break; case 0 :system("CLS");cout<<"谢谢使用!";exit(0);system("pause"); default:system("CLS");printf("无效输入!\n\n");system("pause"); } } } int main() { Undergraduate undergraduate; Undergraduate stu[80]; undergraduate.menu(stu); return 0; }
`4.结束语
我设计的学生成绩管理系统的缺点,缺点很多,由于能力有限,只是实现了简单的几个功能,设计的学生成绩管理系统很脆弱,很容易就崩了。
优点:能够对输入成绩按绩点排序,统计挂科数,对输入错误的生日,成绩进行异常处理。
缺点一:没有动态的开辟空间,对指针不熟,没有用链表增删学生信息,就定义80大小对象数组存放学生成绩等信息。
缺点二:每次使用都需要先输入学生成绩等信息。等到下一次使用时,上一次输入学生的成绩就没了。
缺点三:需要依次输入学生专业,姓名,性别,年,月,日,学号,课程1,成绩1…该输入int,输入string。多输入或少输入信息。系统都可能会崩。
…
缺点很多,这些问题仍需继续解决。
通过课程设计,发现了自己在知识上还存在很多问题。学到了不少东西,这个学生成绩管理系统不能很好体现继承和多态性。虽然用到了继承,但用的并不好。我觉得课程设计考察对知识的综合运用,用到了学过的很多知识,通过这次机会,找到自己的知识漏洞,查课本,查资料,收获很多。 -
C++编写的学生成绩管理系统
2019-04-23 15:32:06可以添加、删除、修改、查找、学生成绩,非常适合初学者。 -
C++实现学生成绩管理系统
2021-03-12 23:06:06学生成绩管理系统 在下小白一枚,给各位大神奉上源码! 拒绝一切花里胡哨,所以我没有美化菜单和背景。 包含读写文件操作和vector容器操作。 希望各位点个赞! #include<iostream> using namespace std; #... -
学生成绩管理系统(C语言、C++6.0) 控制台界面
2017-07-22 14:36:38学生成绩管理系统(C语言、C++6.0) 控制台界面,可计算平均成绩等功能