牛刀小试 - C++ 学生信息管理系统

参考文档:

C++实现:学生管理系统(详细解析)

关于switch中的default里面的break是否可以省略这件事

需求要求:

(1)增加记录
(2)查找记录
(3)删除记录
(4)成绩修改
(5)统计分析:单科统计、课程标准差和合格率;
(6)排序功能:总分排序(从高到低),如果相同,则按学号排
序;
(7)文件操作:可以打开文件,显示班级的所有学生信息;可以将增加或修改后的成绩重新写入文件;可以将排序好的信息写入新的文件;

需求思路:

抽象处理:

  • 学科类:class Subject
  • 学生类:class Student
  • 学生列表类:class StudentList

完整代码:

StudentAdmin.h

#ifndef STUDENTADMIN_H_
#define STUDENTADMIN_H_#include <vector>
#include <string>using namespace std;// 学科类
class Subject
{
public:string proName;		//学科名double proScore;	//分数void showCpInfo();	//显示分数static void showHeader(); // 显示表头
};//学生类
class Student
{
public:string stuNum;		//学号string stuName;		//姓名string gender;		//性别int gradeNum;		//年级string department;	//专业int classNum;		//班级vector<Subject> cps;//学生的各个科目int cpNum;			//科目门数double score;		//平均分// 构造函数Student(){};Student(string stuNum, string stuName, string gender, int gradeNum, string department, int classNum, vector<Subject> cps, int cpNum, double score){this->stuNum = stuNum;this->stuName = stuName;this->gender = gender;this->gradeNum = gradeNum;this->department = department;this->classNum = classNum;this->cps = cps;this->cpNum = cpNum;this->score = score;};void showStuInfo();	//输出属性值static void showHeader();	//输出表头
};//学生列表类
class StudentList
{
public:StudentList(){}StudentList(vector<Student> stuList){this->stuList = stuList;}void init();		//初始化void menu();		//主菜单void readFile();	//读取数据void writeFile();	//写入数据void insertList();	//添加学生信息void deleteList();	//删除学生信息void updateList();	//修改学生信息void selectList();	//查询学生信息void displayStu();	//遍历学生信息void displayCp();	//查询获奖信息void diaplayList();	//显示信息列表void statisticList();//统计学生数据void clearList();	//清空系统数据// 二级函数void doInsert();void doDeleteByNum();	//按学号删除void doDeleteByName();	//按姓名删除void doUpdateInfo();	//更新学生信息void doUpdateScore();	//更新学生成绩void doSelectByNum();	//按学号查询void doSelectByName();	//按姓名查询void doSortByNum();		//按学号排序void doSortByScore();	//按平均分排序void doClear();			//清理数据// 三级函数void doUpDataScoreByOne(Student &s); //基于原有成绩信息修改void doUpDataScoreByAll(Student &s); //清空所有科目及成绩信息//工具类函数static bool cmpNum(const Student& s1, const Student& s2);	//将学生列表按学号升序排列 static bool cmpScroe(const Student& s1, const Student& s2); //将学生列表按平均分降序排列,平均分相同的再按学号升序排列
private:vector<Student> stuList;
}
;
#endif

StudentAdmin.cpp

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE#include "StudentAdmin.h"#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>	// 算法库,提供大量迭代器成员函数, sort()
#include <iomanip>		// 格式输入输出
#include <conio.h>		// 使用getch()函数
#include <windows.h>	//使用Sleep()函数using namespace std;void Subject::showCpInfo()
{cout << left << setw(45) << proName;  // 设置字段宽度为45位cout << left << setw(6) << proScore << endl;
}void Subject::showHeader()
{cout << left << setw(45) << "科目";cout << left << setw(6) << "分数" << endl;
}void Student::showStuInfo()
{cout << left << setw(12) << stuNum;cout << left << setw(10) << stuName;cout << left << setw(6) << gender;cout << left << setw(8) << gradeNum;cout << left << setw(23) << department;cout << left << setw(6) << classNum;cout << left << setw(6) << score << endl;
}void Student::showHeader()
{cout << left << setw(12) << "学号";cout << left << setw(10) << "姓名";cout << left << setw(6) << "性别";cout << left << setw(8) << "年级";cout << left << setw(23) << "专业";cout << left << setw(6) << "班级";cout << left << setw(6) << "平均分" << endl;
}void StudentList::init()
{readFile();
}void StudentList::menu()
{system("cls");cout << "\t\t\t**********欢迎来到学生成绩管理系统**********" << endl;cout << "\t\t\t你可以进行以下操作:" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             1   添加学生信息             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             2   删除学生信息             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             3   修改学生信息             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             4   查询学生信息             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             5   显示信息列表             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             6   统计学生数据             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             7   清空系统数据             |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;cout << "\t\t\t|             0   退出                     |" << endl;cout << "\t\t\t|------------------------------------------|" << endl;bool sign = true;while (sign){switch (getch()){case '1':insertList();sign = false;break;case '2':deleteList();sign = false;break;case '3':updateList();sign = false;break;case '4':selectList();sign = false;break;case '5':diaplayList();sign = false;break;case '6':statisticList();sign = false;break;case '7':clearList();sign = false;break;case '0':exit(0);break;default:cout << "\n\t\t\t输入不合法,请重新选择【0-7】:";}}
}void StudentList::readFile()
{ifstream ifs("stuList.txt", ios::in);if (ifs){int n = 0;	// 学生数量ifs >> n;for (int i = 0; i < n; i++){Student s;ifs >> s.stuNum >> s.stuName >> s.gender >> s.gradeNum >> s.department >> s.classNum >> s.cpNum >> s.score;for (int j = 0; j < s.cpNum; j++){Subject cp;ifs >> cp.proName >> cp.proScore;s.cps.push_back(cp);}stuList.push_back(s);}ifs.close();}}void StudentList::writeFile()
{ofstream ofs("stuList.txt", ios::out);if (!ofs){cout << "\t\t存档失败!程序即将自动退出 . . ." << endl;Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0);}ofs << stuList.size() << endl;	//写入学生数量for (int i = 0; i < stuList.size(); i++){ofs << stuList[i].stuNum << " " << stuList[i].stuName << " " << stuList[i].gender<< " " << stuList[i].gradeNum << " " << stuList[i].department << " " << stuList[i].classNum<< " " << stuList[i].cpNum << " " << stuList[i].score << endl;for (int j = 0; j < stuList[i].cps.size(); j++){ofs << stuList[i].cps[j].proName << " " << stuList[i].cps[j].proScore << endl;}}ofs.close();
}void StudentList::insertList()
{system("cls");cout << "\t\t**********************欢迎来到添加学生信息功能*************************" << endl;cout << "\t\t学生基本信息一览表:" << endl;displayStu();cout << endl;cout << "\t\t------------------" << endl;cout << "\t\t1 添加学生信息" << endl;cout << "\t\t2 返回主菜单" << endl;cout << "\t\t------------------" << endl;cout << "\t\t请选择【1-2】:";bool sign = true;while (sign){switch (getch()){case '1':doInsert();sign = false;break;case '2':menu();sign = false;break;default:cout << "\n\t\t输入不合法,请重新选择【1-2】:";}}
}void StudentList::deleteList()
{system("cls");cout << "\t\t***********************欢迎来到删除学生信息功能***********************" << endl;string sel = "0";cout << "\t\t-----------------" << endl;cout << "\t\t1 按学号删除" << endl;cout << "\t\t2 按姓名删除" << endl;cout << "\t\t3 返回主菜单" << endl;cout << "\t\t-----------------" << endl;cout << "\t\t请进行选择【1-3】:";bool sign = true;while (sign){switch (getch()){case '1':doDeleteByNum();sign = false;break;case '2':doDeleteByName();sign = false;break;case '3':menu();sign = false;break;default:cout << "\n\t\t输入不合法,请重新选择【1-3】:";}}
}void StudentList::updateList()
{system("cls");cout << "\t\t***********************欢迎来到修改学生信息功能***********************" << endl;string sel = "0";cout << "\t\t-----------------" << endl;cout << "\t\t1 修改学生基本信息" << endl;cout << "\t\t2 修改学生成绩信息" << endl;cout << "\t\t3 返回主菜单" << endl;cout << "\t\t-----------------" << endl;cout << "\t\t请进行选择【1-3】:";bool sign = true;while (sign){switch (getch()){case '1':doUpdateInfo();sign = false;break;case '2':doUpdateScore();sign = false;break;case '3':menu();sign = false;break;default:cout << "\n\t\t输入不合法,请重新选择【1-3】:";}}
}void StudentList::selectList()
{system("cls");cout << "\t\t***********************欢迎来到查询学生信息功能************************" << endl;cout << "\t\t-----------------" << endl;cout << "\t\t1 按学号查询" << endl;cout << "\t\t2 按姓名查询" << endl;cout << "\t\t3 返回主菜单" << endl;cout << "\t\t-----------------" << endl;cout << "\t\t请进行选择【1-3】:";bool sign = true;while (sign){switch (getch()){case '1':doSelectByNum();sign = false;break;case '2':doSelectByName();sign = false;break;case '3':menu();sign = false;break;default:cout << "\n\t\t输入不合法,请重新选择【1-3】:";}}}void StudentList::displayStu()
{cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";Student::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;for (int i = 0; i < stuList.size(); i++){cout << "\t\t";stuList[i].showStuInfo();}cout << "\t\t-----------------------------------------------------------------------" << endl;
}void StudentList::displayCp()
{cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";cout << left << setw(12) << "学号";cout << left << setw(10) << "姓名";Subject::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;for (int i = 0; i < stuList.size(); i++){for (int j = 0; j < stuList[i].cps.size(); j++){cout << "\t\t";cout << left << setw(12) << stuList[i].stuNum;cout << left << setw(10) << stuList[i].stuName;stuList[i].cps[j].showCpInfo();}}cout << "\t\t-----------------------------------------------------------------------" << endl;
}void StudentList::diaplayList()
{system("cls");cout << "\t\t***********************欢迎来到显示信息列表功能************************" << endl;cout << "\t\t表1:学生基本信息一览表" << endl;this->displayStu();cout << "\n\t\t表2:学生成绩信息一览表" << endl;this->displayCp();cout << "\n\t\t按任意键返回菜单" << endl;while (getch()){menu();}
}void StudentList::statisticList()
{system("cls");cout << "\t\t***********************欢迎来到统计学生数据功能************************" << endl;string sel = "0";cout << "\t\t-----------------" << endl;cout << "\t\t1 按学号排序" << endl;cout << "\t\t2 按平均分排序" << endl;cout << "\t\t3 返回主菜单" << endl;cout << "\t\t-----------------" << endl;cout << "\t\t请进行选择【1-3】:";bool sign = true;while (sign){switch (getch()){case '1':doSortByNum();sign = false;break;case '2':doSortByScore();sign = false;break;case '3':menu();sign = false;break;default:cout << "\n\t\t输入不合法,请重新选择【1-3】:";}}
}void StudentList::clearList()
{system("cls");cout << "\t\t**************欢迎来到清空系统数据功能***************" << endl;cout << "\t\t------------------" << endl;cout << "\t\t1 确认清空系统数据" << endl;cout << "\t\t2 返回主菜单" << endl;cout << "\t\t------------------" << endl;cout << "\t\t请慎重选择【1-2】:";bool sign = true;while (sign){switch (getch()){case '1':doClear();sign = false;break;case '2':menu();sign = false;break;default:cout << "\n\t\t输入不合法,请重新选择【1-3】:";}}
}void StudentList::doInsert()
{string flag = "1";while (flag == "1"){cout << "\n\t\t输入学生信息:" << endl;cout << "\t\t学号:";Student s;bool check = false;do{check = false;cin >> s.stuNum;for (int i = 0; i < stuList.size(); ++i){if (s.stuNum == stuList[i].stuNum){cout << "\t\t该学号已存在,请重新输入:";check = true;break;}}} while (check);cout << "\t\t姓名:";cin >> s.stuName;cout << "\t\t性别:";cin >> s.gender;cout << "\t\t年级:";cin >> s.gradeNum;cout << "\t\t专业:";cin >> s.department;cout << "\t\t班级:";cin >> s.classNum;s.score = 0;string option = "1";cout << "\t\t是否添加成绩信息?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";cin >> option;while (option != "0" && option != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> option;}if (option == "1"){int cnt = 0;while (option == "1"){cnt++;Subject cp;cout << "\t\t第" << cnt << "科科目名称:";cin >> cp.proName;cout << "\t\t第" << cnt << "科科目成绩:";cin >> cp.proScore;s.cps.push_back(cp);cout << "\t\t该科成绩信息添加成功!是否继续添加?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";cin >> option;while (option != "0" && option != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> option;}}}for (int i = 0; i < s.cps.size(); i++){s.score += s.cps[i].proScore;}if (s.cps.size() > 0) s.score /= s.cps.size(); //计算平均分s.cpNum = s.cps.size();stuList.push_back(s);writeFile();cout << "\n\t\t该名学生信息添加成功!是否继续添加?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";cin >> flag;while (flag != "0" && flag != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> flag;}}insertList();	 //返回上一级
}void StudentList::doDeleteByNum()
{string keyNum;bool flag = false;  //成功找到该学生cout << "\n\t\t请输入待删除学生的学号:";cin >> keyNum;for (vector<Student>::iterator it = stuList.begin(); it != stuList.end(); ++it){if (it->stuNum == keyNum){flag = true;cout << "\t\t待删除学生的信息如下:" << endl;cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";Student::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";it->showStuInfo();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t确认删除?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";string ch = "0";cin >> ch;while (ch != "0" && ch != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> ch;}if (ch == "0") break;else{stuList.erase(it);writeFile();cout << "\t\t删除成功!" << endl;break;}}}if (!flag) cout << "\t\t查无此人,无法删除!\n" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){deleteList(); // 返回上一级}
}void StudentList::doDeleteByName()
{string keyName;bool flag = false;	//成功找到该学生cout << "\t\t请输入待删除学生的姓名:";cin >> keyName;for (vector<Student>::iterator it = stuList.begin(); it != stuList.end(); ++it){if (it->stuName == keyName){flag = true;cout << "\t\t待删除学生的信息如下:" << endl;cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t\t";Student::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";it->showStuInfo();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t确认删除?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";string ch = "0";cin >> ch;while (ch != "0" && ch != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> ch;}if (ch == "0") break;else{stuList.erase(it);writeFile();cout << "\t\t删除成功!" << endl;break;}}}if (!flag) cout << "\t\t查无此人,无法删除!\n" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){deleteList(); // 返回上一级}
}void StudentList::doUpdateInfo()
{system("cls");string keyNum;bool flag = false;	//成功找到该学生cout << "\n\t\t请输入待修改学生的学号:";cin >> keyNum;for (int i = 0; i < stuList.size(); i++){if (stuList[i].stuNum == keyNum){flag = true;cout << "\t\t待修改学生基本信息如下:" << endl;cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";Student::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";stuList[i].showStuInfo();cout << "\t\t-----------------------------------------------------------------------" << endl;Student s = stuList[i];cout << "\t\t请输入修改后的学号:";bool check = false;do{check = false;cin >> s.stuNum;for (int j = 0; j < stuList.size(); j++){if (s.stuNum == stuList[j].stuNum && i != j){cout << "\t\t该学号已被录入,请重新输入学号:";check = true;break;}}} while (check);cout << "\t\t请输入修改后的姓名:";cin >> s.stuName;cout << "\t\t请输入修改后的性别:";cin >> s.gender;cout << "\t\t请输入修改后的年级:";cin >> s.gradeNum;cout << "\t\t请输入修改后的专业:";cin >> s.department;cout << "\t\t请输入修改后的班级:";cin >> s.classNum;cout << "\n\t\t是否确认修改?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";string ch = "0";cin >> ch;while (ch != "0" && ch != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> ch;}if (ch == "0") break;else{stuList[i] = s;cout << "\t\t修改成功!" << endl;writeFile();break;}}}if (!flag) cout << "\t\t查无此人,无法修改!\n" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){updateList(); // 返回上一级}
}void StudentList::doUpdateScore()
{system("cls");string keyNum;bool flag = false;	//成功找到该学生cout << "\n\t\t请输入待修改学生的学号:";cin >> keyNum;for (int i = 0; i < stuList.size(); i++){if (stuList[i].stuNum == keyNum){flag = true;cout << "\t\t待修改学生成绩信息如下:" << endl;cout << "\t\t----------------------------------------------------------" << endl;cout << "\t\t";cout << left << setw(8) << "编号";Subject::showHeader();cout << "\t\t----------------------------------------------------------" << endl;for (int j = 0; j < stuList[i].cps.size(); j++){cout << "\t\t";cout << left << setw(8) << j + 1;stuList[i].cps[j].showCpInfo();}cout << "\t\t----------------------------------------------------------" << endl;Student s = stuList[i];cout << "\n\t\t请选择修改方式:" << endl;cout << "\t\t-------------------------------" << endl;cout << "\t\t1 基于该学生原有成绩信息进行修改" << endl;cout << "\t\t2 清空该学生所有科目及成绩信息" << endl;cout << "\t\t-------------------------------" << endl;cout << "\t\t请进行选择【1-2】:";bool sign = true;while (sign){switch (getch()){case '1':doUpDataScoreByOne(s);sign = false;break;case '2':doUpDataScoreByAll(s);sign = false;break;default:cout << "\n\t\t\t输入不合法,请重新选择【1-2】:";}}// 计算平均分for (int i = 0; i < s.cps.size(); i++){s.score += s.cps[i].proScore; }if (s.cps.size() > 0)s.score /= s.cps.size();s.cpNum = s.cps.size();cout << "\n\t\t是否确认修改?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";string ch = "0";cin >> ch;while (ch != "0" && ch != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> ch;}if (ch == "0") break;else{stuList[i] = s;cout << "\t\t修改成功!" << endl;writeFile();break;}}}if (!flag) cout << "\t\t查无此人,无法修改!\n" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){updateList(); // 返回上一级}
}void StudentList::doUpDataScoreByOne(Student &s)
{Subject cp;s.cps.clear();s.score = 0;s.cpNum = 0;cout << "\n\t\t输入修改后的学科成绩信息:" << endl;int cnt = 0;bool sign = true;while (sign){cnt++;cout << "\n\t\t第" << cnt << "科科目名称:";cin >> cp.proName;cout << "\t\t第" << cnt << "科科目成绩:";cin >> cp.proScore;s.cps.push_back(cp);cout << "\t\t添加成功!是否继续添加?(1 是 0 否)" << endl;cout << "\t\t请进行选择【0-1】:";string ch = "0";cin >> ch;while (ch != "0" && ch != "1"){cout << "\n\t\t输入不合法,请重新选择【0-1】:";cin >> ch;}if (ch == "0"){sign = false;}}
}void StudentList::doUpDataScoreByAll(Student &s)
{s.cps.clear();s.score = 0;s.cpNum = 0;
}void StudentList::doSelectByNum()
{system("cls");string keyNum;bool flag = false;cout << "\n\t\t请输入待查询学生的学号:";cin >> keyNum;cout << "\t\t查询结果如下:" << endl;cout << "\t\t基本信息:" << endl;cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";Student::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;for (int i = 0; i < stuList.size(); i++){if (stuList[i].stuNum == keyNum){flag = true;cout << "\t\t";stuList[i].showStuInfo();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << endl;cout << "\t\t" << stuList[i].stuName << "成绩信息:" << endl;cout << "\t\t----------------------------------------------------------" << endl;cout << "\t\t";cout << left << setw(8) << "编号";Subject::showHeader();cout << "\t\t----------------------------------------------------------" << endl;for (int j = 0; j < stuList[i].cps.size(); j++){cout << "\t\t";cout << left << setw(8) << j + 1;stuList[i].cps[j].showCpInfo();}cout << "\t\t----------------------------------------------------------" << endl;break;}}if (!flag)cout << "\t\t查无此人!\n" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){selectList(); // 返回上一级}
}void StudentList::doSelectByName()
{system("cls");string keyName;bool flag = false;cout << "\n\t\t请输入待查询联系人的姓名:";cin >> keyName;cout << "\t\t查询结果如下:" << endl;cout << "\t\t-----------------------------------------------------------------------" << endl;cout << "\t\t";Student::showHeader();cout << "\t\t-----------------------------------------------------------------------" << endl;for (int i = 0; i < stuList.size(); i++){if (stuList[i].stuName == keyName){flag = true;cout << "\t\t";stuList[i].showStuInfo();cout << "\t\t-----------------------------------------------------------------------" << endl;cout << endl;cout << "\t\t" << stuList[i].stuName << "成绩信息:" << endl;cout << "\t\t----------------------------------------------------------" << endl;cout << "\t\t";cout << left << setw(8) << "编号";Subject::showHeader();cout << "\t\t----------------------------------------------------------" << endl;for (int j = 0; j < stuList[i].cps.size(); j++){cout << "\t\t";cout << left << setw(8) << j + 1;stuList[i].cps[j].showCpInfo();}cout << "\t\t----------------------------------------------------------" << endl;break;}}if (!flag)cout << "\t\t查无此人!\n" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){selectList(); // 返回上一级}
}void StudentList::doSortByNum()
{system("cls");sort(stuList.begin(), stuList.end(), cmpNum);cout << "\n\t\t按学号升序排列如下:" << endl;displayStu();int numMale = 0, numFemale = 0;for (int i = 0; i < stuList.size(); i++){if (stuList[i].gender == "男") numMale++; else if (stuList[i].gender == "女") numFemale++;}cout << "\t\t一共 " << stuList.size() << "人,其中男生 " << numMale << " 人,女生 " << numFemale << " 人。" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){statisticList(); // 返回上一级}
}void StudentList::doSortByScore()
{system("cls");sort(stuList.begin(), stuList.end(), cmpScroe);cout << "\n\t\t按平均分降序排列如下:" << endl;displayStu();vector<int> scoreRange(10);double totalScore = 0;for (int i = 0; i < stuList.size(); i++){totalScore += stuList[i].score;if (0 <= stuList[i].score && stuList[i].score < 60) scoreRange[0]++;else if (60 <= stuList[i].score && stuList[i].score < 70) scoreRange[1]++;else if (70 <= stuList[i].score && stuList[i].score < 80) scoreRange[2]++;else if (80 <= stuList[i].score && stuList[i].score < 90) scoreRange[3]++;else scoreRange[4]++;}cout << "\n\t\t60分以上 ------------ " << scoreRange[0] << " 人" << endl;cout << "\t\t60分 ~ 70分 --------- " << scoreRange[1] << " 人" << endl;cout << "\t\t70分 ~ 80分 --------- " << scoreRange[2] << " 人" << endl;cout << "\t\t80分 ~ 90分 --------- " << scoreRange[3] << " 人" << endl;cout << "\t\t90分以上 ------------ " << scoreRange[4] << " 人" << endl;cout << "\n\t\t所有学生平均分为:" << totalScore / stuList.size() << endl;cout << "\t\t" << stuList.back().gradeNum << "级" << stuList.back().department << stuList.back().classNum << "班---";cout << stuList.back().stuName << "平均分最低,为:" << stuList.back().score << "分" << endl;cout << "\t\t" << stuList.front().gradeNum << "级" << stuList.front().department << stuList.front().classNum << "班---";cout << stuList.front().stuName << "平均分最高,为:" << stuList.front().score << "分" << endl;cout << "\n\t\t按任意键返回上一级" << endl;while (getch()){statisticList(); // 返回上一级}
}void StudentList::doClear()
{stuList.clear();cout << "\n\t\t清空成功!" << endl;writeFile();cout << "\n\t\t按任意键返回菜单" << endl;while (getch()){menu();}
}bool StudentList::cmpNum(const Student& s1, const Student& s2)
{return s1.stuNum < s2.stuNum;
}bool StudentList::cmpScroe(const Student& s1, const Student& s2)
{if (s1.stuNum != s2.stuNum) return s1.score > s2.score;else return s1.stuNum < s2.stuNum;
}

main.cpp

/*********************************************************************
程序名:
说明:
*********************************************************************/
#include <iostream>
#include <conio.h>		// 使用getch()函数
#include "StudentAdmin.h"using namespace std;int main() {StudentList stuList;stuList.init(); //读入文件数据初始化stuList.menu(); //打开主菜单system("PAUSE");return 0;
}

运行示例:

(1)主界面
在这里插入图片描述

(2)增加记录

在这里插入图片描述
在这里插入图片描述

(3)查找记录

在这里插入图片描述
在这里插入图片描述

(4)删除记录
在这里插入图片描述

(5)成绩修改

在这里插入图片描述
在这里插入图片描述

(5)统计分析:单科统计、课程标准差和合格率;

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg进阶-给视频添加马赛克效果

很多时候为了隐藏视频中的敏感信息如人脸、身份证号、车牌号等,我们会采用马赛克算法对视频帧中的一部分内容进行处理。这里介绍一下如何采用FFmpeg实现马赛克效果。 马赛克效果算法的原理如下: 1.分块处理:首先将图像划分为多个小块或区域 2.像素替换:对于每个小块,算法会将…

【Windows11】内存使用率只有总内存容量的一半

硬件配置&#xff1a;2根16G的内存条&#xff08;金百达DDR4 3600, 海力士颗粒&#xff0c;灯条刃&#xff09;&#xff0c;插在2和4通道上 系统配置&#xff1a;windows11 问题描述&#xff0c;我和这位网友的问题一模一样&#xff1a; 系统32G内存&#xff0c;开机完全识别&…

实习日志17

1.测试公司服务器 1.1.太卡了&#xff0c;点一下卡半天 上传项目源码和文件&#xff1a; 将活字格项目源码和所有相关文件上传到服务器的指定目录。可以使用向日葵远程控制或者版本控制系统来进行文件上传。 重新配置活字格项目&#xff1a; 根据服务器环境&#xff0c;需要对…

Java 学习和实践笔记(14):用表格来理解类、对象、属性以及动作(方法)很容易

OOP :面向对象编程&#xff0c;object oriented programming. 用表格就可以很好地理解类、对象、属性、以及动作这些概念。 一个表&#xff08;结构&#xff09;就对应一个类&#xff08;结构&#xff09;。所以凡叫什么类&#xff0c;自己就在心里把它叫什么表。反过来&…

设计模式-创建型模式-简单工厂模式

0 引言 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;定义一个工厂类&#xff0c;它可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态&#xff08;static&#xf…

vue 非父子通信-event bus 事件总线

1.作用 非父子组件之间&#xff0c;进行简易消息传递。(复杂场景→ Vuex) 2.步骤 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09; import Vue from vue const Bus new Vue() export default Bus A组件&#xff08;接受方&#xff09;&#xff0c;监听Bus的…

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题 一、网络流模型1. 概述2. 可行流3. 增广链 二、示例1. 最大流问题2. Alternate Formulation&#xff1a;最小截量问题 三、Ford-Fulkerson 算法1. 导入库2. 初始化残差图3. 定义查找增广路径4. 定义循环5. 程序运行…

ubuntu22.04@Jetson Orin Nano之OpenCV安装

ubuntu22.04Jetson Orin Nano之OpenCV安装 1. 源由2. 分析3. 证实3.1 jtop安装3.2 jtop指令3.3 GPU支持情况 4. 安装OpenCV4.1 修改内容4.2 Python2环境【不需要】4.3 ubuntu22.04环境4.4 国内/本地环境问题4.5 cudnn版本问题 5. 总结6. 参考资料 1. 源由 昨天用Jetson跑demo程…

揭秘 LLMs 时代向量数据库的 3 大实用场景

过去一年&#xff0c;ChatGPT 和其他大语言模型&#xff08;LLMs&#xff09;的爆火也带动了向量数据库的发展。 许多用户在搭建检索增强生成&#xff08;RAG&#xff09;系统过程中选择了使用向量数据库 Zilliz Cloud &#xff0c;但 Zilliz Cloud 的功能不止于此&#xff0c;…

Git如何使用 五分钟快速入门

Git如何使用 五分钟快速入门 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发人员跟踪和管理项目的代码变更。与传统的集中式版本控制系统&#xff08;如SVN&#xff09;不同&#xff0c;Git允许开发人员在本地存储完整的代码仓库&#xff0c;并且可以独立地进行代码修…

GEE数据更新——MODIS数据LST地表温度计算案例MODIS/006/ MOD11A1 已弃用并且没有新数据。请改用MODIS/061/ MOD11A1

问题 为什么我无法在下面给出的代码中下载 2024 年的数据?看起来有效期到 2022 年 11 月。你能帮我吗? 差异 MODIS/006/ MOD11A1和MODIS/061/ MOD11A1是两个不同的MODIS地表温度数据集。它们之间的差异主要体现在数据处理方法和时间范围上。目前GEE中已经没有前者的数据。…

《英伟达-本地AI》--NVIDIA Chat with RTX-本机部署

阿丹&#xff1a; 突然发现公司给配置的电脑是NVIDIA RTX 4060的显卡&#xff0c;这不搞一搞本地部署的大模型玩一玩&#xff1f;&#xff1f;&#xff1f; 从0-》1记录一下本地部署的全过程。 本地模型下载地址&#xff1a; Build a Custom LLM with Chat With RTX | NVIDIA…

虚拟机安装Centos7迷你版

虚拟机安装Centos7迷你版 迷你版较常规版精简了很多功能&#xff0c;所以体积也小了很多&#xff0c;喜欢自定义安装的可以选择迷你版 参考文章&#xff1a; VirtualBox虚拟机安装Centos7详细教程图解 网卡配置参考文章 下载Centos迷你版镜像 安装镜像 下载镜像 阿里云Cen…

Python 安装和使用的IDE

安装 安装 Anaconda (包较大), 包含了一些库安装 Miniconda (包较小) 只和 python 打包, 没有其他的包, 用的时候需要自己安装 conda install pandaspython pythonipython 有更多的功能 ipythonjupyter jupyter notebookjupyterlab 可以去 github 查看 conda install -c…

理论学习-ARM-内核

ARM内核 函数的调用加载、存储计算中断异常线程的切换 为了提高学习效率&#xff0c;我们要提前想好学习策略。 首先&#xff0c;使用频率越高的知识点&#xff0c;越要首先学习。假使&#xff0c;我们学习了一个知识点&#xff0c;能覆盖工作中80%的工作量&#xff0c;那是不是…

机器学习基础(四)非监督学习的进阶探索

导语&#xff1a;上一节我们详细探索监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;三&#xff09;监督学习的进阶探索-CSDN博客文章浏览阅读296次&#xff0c;点赞13次&#xff0c;收藏11次。监督学习作为机器学习的一个主要分支&#xff0c;…

【C++】vector模拟实现+迭代器失效

vector模拟实现 成员变量定义默认成员函数构造函数 迭代器范围for、对象类型匹配原则 容量操作sizeemptycapacityreserve成员变量未更新memcpy值拷贝 resize内置类型的构造函数 数据访问frontbackoperator[ ] 数据修改操作push_backpop_backswapclearinsertpos位置未更新无返回…

解决缓存失效导致的数据库压力问题(缓存击穿问题)

问题描述 在软件开发过程中&#xff0c;特别是在使用缓存策略优化数据访问性能时&#xff0c;经常会遇到缓存失效引发的问题。具体来说&#xff0c;在一个服务类BaseDataService中&#xff0c;findData方法负责从数据库拉取数据并缓存。这里使用了expireAfterWrite60s的缓存策…

【Linux】Linux调试器-gdb使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 开始使用 gdb binFile 退出&#xff1a; ctrl d 或 quit 调…

新建一个flask项目

在Flask中创建一个新的项目&#xff0c;您可以遵循以下步骤&#xff1a; 确保您已经安装了Python环境。如果还未安装Flask&#xff0c;可以通过pip来安装&#xff1a; pip install flask创建一个新的文件夹作为您的项目文件夹&#xff0c;例如myflaskapp&#xff1a; mkdir …