牛刀小试 - 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;自己就在心里把它叫什么表。反过来&…

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程…

《英伟达-本地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…

理论学习-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位置未更新无返回…

【Linux】Linux调试器-gdb使用

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

Java 学习和实践笔记(15):面向过程和面象对象其实很简单!

学完这一节&#xff0c;才真正明白了什么叫面向对象和面向过程&#xff0c;其实很简单~ 第一个例子&#xff1a;怎样把大象装进冰箱 这个很清楚很容易地可以列出第一步。 第二个例子&#xff1a;怎样制造一台汽车 这个就很难确定哪一步做第一步。 面向过程和面向对象的区别 …

笔记:torch.roll

最近在准备写 swin transformer 的文章&#xff0c;记录下 torch.roll 的用法&#xff1a; >>> x torch.tensor([1, 2, 3, 4, 5, 6, 7, 8]).view(4, 2) >>> x tensor([[1, 2],[3, 4],[5, 6],[7, 8]]) 第0维度向下移1位&#xff0c;多出的[7,8]补充到顶部 &g…

【移动开发】iOS平台 Java编译器 Jedona Compiler 评测

上期编译器评测链接&#xff1a; Java Compiler IDE评测 一、使用平台 该编译器&#xff08;Jedona Compiler&#xff09;在苹果应用市场App Store中下载&#xff0c;笔者使用iPad进行Java代码编写。 应用市场界面&#xff1a; 二、开发界面介绍 开发界面比较简洁&#xf…

python 与 neo4j 交互(py2neo 使用)

参考自&#xff1a;neo4j的python.py2neo操作入门 官方文档&#xff1a;The Py2neo Handbook — py2neo 2021.1 安装&#xff1a;pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 1 节点 / 关系 / 属性 / 路径 节点(Node)和关系(relationship)是构成图的基础…

重磅!移远通信正式发布一站式XR产品解决方案,助力探索数字世界新纪元

伴随着以5G、大数据、云计算等现代化信息科技的发展&#xff0c;人类对数字世界、智慧地球的探索更加深入。尤其是以XR&#xff08;扩展现实&#xff09;为代表的技术崛起&#xff0c;更让物理世界与虚拟世界中的连接愈发紧密&#xff0c;千行百业也亟待新探索。 近日&#xff…

计算机组成原理(4)-----Cache的原理及相关知识点

目录 1.Cache的原理 2.Cache的性能 3.Cache和主存的映射方式 &#xff08;1&#xff09;全相联映射 &#xff08;2&#xff09;直接映射 &#xff08;3&#xff09;组相联映射 4.替换算法 (1)随机算法(RAND) (2)先进先出算法(FIFO) (3)近期最少使用(LRU) (4)最近不经…

论文阅读:How Do Neural Networks See Depth in Single Images?

是由Technische Universiteit Delft(代尔夫特理工大学)发表于ICCV,2019。这篇文章的研究内容很有趣,没有关注如何提升深度网络的性能&#xff0c;而是关注单目深度估计的工作机理。 What they find&#xff1f; 所有的网络都忽略了物体的实际大小&#xff0c;而关注他们的垂直…