c++实现学生管理系统(附源码)
目录
一、基本功能:
二、包含的模块:
三、系统介绍
1. 学生管理系统的功能:
2. 具体的需求:
3. 支持的标准:
四、系统结构功能图:
五、系统设计
1. 退出系统:
2. 增加学生:
3. 展示学生:
4. 删除学生:
5. 修改学生:
6. 查找学生:
7. 学号排序:
七、设计结果
1. 菜单页面:
2. 增加学生页面:
3. 显示学生页面:
4. 删除学生页面:
5. 修改学生页面:
6. 查找及模糊查找学生页面:
7. 学号排序页面:
八、源码
1. 学生管理系统.cpp
2. info.cpp
3. studentManager.cpp
4. student.h
5. studentManager.h
6. info.h
学生管理系统是大一刚入学时的作品了,比较稚嫩,希望各位大佬进行批评指正。
设计说明
本系统为学生管理系统,采用c++语言在Visual Studio平台进行开发。
一、基本功能:
1:退出学生系统
2:增加学生信息
3:显示学生信息
4;删除离校学生
5:修改学生信息
6:查找学生信息
7:按照学号排序
二、包含的模块:
1:studentManager学生管理类:内设上述1-7的功能函数;
2:Student学生类:内设学生的学号、姓名等基本信息和展示学生信息的函数;
3:Info学生信息类:继承Student学生类,初始化Student类中的数据和函数;
三、系统介绍
1. 学生管理系统的功能:
退出系统,增加学生,显示学生,删除学生,修改学生,查找学生,排序学生。
2. 具体的需求:
增加学生时学号不能是重复的,且必须为12位数字,年份(前4位数字)在一个合理的区间
性别只能为男或女,年龄在一个合理的区间,地址和专业可以为缺失值;
删除和修改学生时,如果输入了不存在的学号则返回错误,输入的学号存在才能正常继续操作;
查找学生可以是准确信息如广东省查找,也可以多条件查找如18岁的浙江省男生,还可以是模糊值查找,如名字里含小字的学生,这些不同类型的查找方法都可以计算符合条件的学生人数;
排序学生是按照学号从小到大进行排序。
3. 支持的标准:
Windows 11 版本 21H2 或更高版本:家庭版、专业版、专业教育版、专业工作站版、企业版和教育版
Windows 10 版本 1909 或更高版本:家庭版、专业版、教育版和企业版。
Windows Server Core 2022
Windows Server Core 2019
Windows Server 核心 2016
四、系统结构功能图:
五、系统设计
1. 退出系统:
使用exit函数返回0给系统,即exit(0),以示正常退出,中止程序。并打印"您已退出系统,欢迎下次使用"以提示用户。
2. 增加学生:
2.1判断学号是否存在:isStuExit(num)
先设置一个index默认为-1,for循环遍历数组内保存的学生学号,若有学号与用户输入的学号一致,则令index为该学号在数组中的位置。返回结果为,若学号已存在,返回学号在数组中的位置;若学号不存在,返回-1。
2.2 切割字符串的前n个字符:getNchar(string str, int n)
nChars变量是保存切割后的字符,参数str是要被切割的字符串,n是要切割的字符个数。首先判断n是否>0,若不大于0则提示错误;若>字符串本身则n=字符串本身长度;其他情况则for循环n次,把str的前n个字符通过push_back函数依次传到nChars内,最后返回nChars。
2.3 保存文件:saveStu()
先fstream File创建一个文件流,然后File.open(“student.txt”,ios::out)创建或打开student.txt文件,使用ios::out的方式写入文件。利用for循环遍历this->sStuArray数组中的每个对象中的每个信息sNum、sName等依次通过File << 的方式写入文件,最后用File.close()函数关闭文件,使数据真正保存到文件中。
2.4 具体设计过程及功能算法描述:
先提示用户输入想要添加的人数,将新增的个数保存到变量addCount里面,如果addCount<0,则提示错误,终止添加;如果addCount>0,则进入添加学生的程序。
先用newCount = addCount + this->sCount(即最新人数 = 新增人数 + 原本人数)来保存最新人数。
因为要创建父类指针(学生类)Student* 来指向子类指针Info(具体学生),所以用Student**指针来开辟一个新空间newSpace来保存new出来的Student*[newCount]大小。
接着判断一下原本的存放学生的数组是否为空,如果不为空,则先for循环把原本数组内的学生存到新空间内,再进行添加新学生;如果为空,则直接添加新学生。
利用for循环遍历addCount次,在内部设置学生信息的变量:Num(学号)、Name(姓名)、Sex(性别)、Age(年龄)、Adress(住址)、Major(专业)。
然后提示用户输入要添加的学生学号,对用户输入的学号进行判断,若已存在则提示该学号已存在;若不存在则继续进行其他判断:Num.length()==12(学号的长度=12)&& splitNum >= “2004” && splitNum <= ”2023”
(利用2.2的函数来截取学号的前4个字符判断是否在2004到2023的区间),任一项不满足则提示错误,都满足则添加其他信息。提示用户输入学生姓名,性别。
性别设置if(Sex==”男” || Sex==“女”)判断只能输入“男”或“女”,如输入其他字符则提示错误,输入正确则提示用户输入年龄。
If(Age >= 14 && Age <= 30)判断年龄在14和30之间,若不满足则提示错误,若满足则询问用户是否录入学生地址和专业,是则录入,否则设置Adress(地址)或Major(专业)为“ “空格。
全部信息输入完成后,新建一个Student*的指针对象stu,使stu等于new出来的Info对象,把Num,Name等学生信息传入进行初始化,然后再让newSpace的this->sCount + i个对象等于stu即录入成功。让this->sCount等于newCount更新为最新人数,输出“添加成功”提示用户。
然后delett[]释放原本的内存空间数组,再让this->sStuArray等于newSpace更新数组,最后利用2.3的函数保存文件。
2.5 流程图:
3. 展示学生:
3.1变量isFileEmpty:
文件是否为空的标志,在构造函数内进行初始化。首先fstream File.open(“student.txt”, ios::in)打开文件,if(!File.is_open())即利用is_open函数判断文件是否不存在,若不存在为真则输出提示文件不存在;再char ch;File >> c,设置一个变量ch接收读取到的文件的第一个字符,if(File.eof())判断读取到的eof()是否为真。因为eof是文件尾部的标志,若读取到第一个字符就是eof,就代表文件读到头了,则文件存在但为空;其它情况则是文件存在且有数据,则进行一系列初始化。
3.2 具体设计过程及功能算法描述:
先用3.1的isFileEmpty属性判断文件是否存在,若为真,则提示“文件不存在或为空”;其它则进入循环,遍历sStuArray数组中的每个学生对象,调用每个学生对象的内置函数showInfo()展示学生信息。最后退出程序。
3.3 流程图:
4. 删除学生:
4.1 this->sCount: 学生人数
4.2 具体设计过程及功能算法描述:
首先用3.1的isFileEmpty标志判断文件是否存在,为真则提示“文件不存在或为空”,为假则提示“请输入您想要删除的学生学号”,用变量num来保存用户输入的学号。
再用2.1的isStuExit(num)函数来判断想要删除的学号是否存在,不存在则提示删除失败,存在则利用isStuExit(num)返回的index(该学号在数组中的位置)删除数组中该位置的学生。
For循环从i = index(学号在数组中的位置)开始遍历,让数组中第[i + 1]个依次覆盖第[i]个直到循环结束。
然后用4.1的this->sCount--更新学生人数,2.3的this->saveStu()保存学生信息到文件,提示“删除成功”。
4.3 流程图:
5. 修改学生:
5.1 具体设计过程及功能算法描述:
首先用3.1的isFileEmpty标志判断文件是否存在,为真则提示“文件不存在或为空”,为假则提示“请输入您想要修改的学生学号”,用变量num来保存用户输入的学号。
再用2.1的isStuExit(num)函数来判断想要修改的学号是否存在,不存在则提示删除失败,存在则利用isStuExit(num)返回的index(该学号在数组中的位置)修改数组中该位置的学生。
提示“查找成功 请输入您想要修改的学生信息”,输入1-6的数字为单独修改学生的学号、姓名等,用变量choose保存用户输入的数字。
若为1则代表要修改该学生的学号,先用2.1的isStuExit(num)函数来判断想要修改的新学号是否存在,若存在则提示“修改失败”;
若不存在则this->sStuArray[index]->sNum = newNum,即令学生数组中的第index(该学号在数组中的位置)个的学号等于用户输入的新学号,提示“修改成功”。
其他的修改情况以此类推。最后用2.3的saveStu()保存文件。
5.2 流程图:
6. 查找学生:
6.1 具体设计过程及功能算法描述:
首先用3.1的isFileEmpty标志判断文件是否存在,为真则提示“文件不存在或为空”,为假则提示“请输入您想要查找的方式”,用变量choose来保存用户输入的查找方式。输入1-6分别是按学号、姓名、性别等查找,输入7是多条件查找,输入8是模糊查找。
若输入1是按学号查找,用2.1的isStuExit(num)函数来判断想要查找的学号是否存在,不存在则提示查找失败,存在则利用isStuExit(num)返回的index(该学号在数组中的位置)展示数组中该位置的学生信息;
若输入2是按姓名查找,提示用户输入想查询的姓名,用变量name保存用户输入的姓名。先设置一个flag = false表示默认未找到,count = 0表示符合条件的学生人数默认为0,然后进入循环,遍历学生数组。如果第i个学生名字与用户输入的name相匹配,则调用showInfo展示该学生信息,且令flag = true(找到学生),count++(符合条件的学生人数+1)。如果flag = false,说明没找到,提示查找失败。其他类型的查找以此类推;
若输入7是多条件查找,根据用户输入的查找条件,遍历学生数组,如多条件都能匹配则输出该学生信息;
若输入8是模糊查找,输入名字中的一个字可以找到名字中有这个字的所有学生。利用外层for循环(i < this->sCount)遍历学生数组,内层for循环(j < this->sStuArray[i]->sName.length())遍历学生数组中每个学生的名字,if(this->sStuArray[i]->sName[j] == name)即如果名字中有任何一个字与用户输入的字符匹配上了,则输出该学生的信息。
6.2 流程图:(由于有的功能太过相似所以只展示了个别流程)
7. 学号排序:
7.1 具体设计过程及功能算法描述:
首先对学号前4位数(年份)进行排序,按照外层循环,从i=0开始,利用2.2的切割字符串的前n个字符函数getNchar(this->sStuArray[i]->sNum, 4),得到第i个学号的前4位数,并设置当前最小值min = i。
再内层循环j=i+1开始,利用getNchar(this->sStuArray[j]->sNum, 4)得到第i+1个学号的前4位数,将两者对比,若第j个比第i个小,则令最小值变更为j,即min = j;
然后判断,如果min != i,即最小值改变了,则更换第i和第j个的位置,即第i个和第min个位置。然后进行整个学号this->sStuArray[i]->sNum的排序,排序原理与上述过程相同。
7.2 流程图:
七、设计结果
1. 菜单页面:
说明:根据提示输入0-6分别可以进入退出程序,增加学生信息,显示学生信息等页面,调试无误。
2. 增加学生页面:
说明:首先提示输入想要添加的人数,输入1就是添加单个学生,输入大于1的数字则为批量添加学生;若输入2004—2023区间以外的学号会提示错误,输入已经存在的学号也会提示错误;输入男女以外的性别会提示错误;输入14—30以外的年龄会提示错误;住址和专业可以选择1录入,选择2不录入。最后输出添加成功。
3. 显示学生页面:
说明:按照提示输入2即可显示所有学生信息,并且具有缺失值的学生信息如最后一行也可以显示;在第二步刚刚添加上的202211701303的学生也可以立即显示。调试无误。
4. 删除学生页面:
说明:根据提示输入3进入删除学生页面,若输入的想要删除的学号不存在,则提示错误;若存在,则提示删除成功。再回到输入2,进入显示学生页面,刚刚删除的202211701303学生已经不存在了,删除成功。调试无误。
5. 修改学生页面:
说明:根据提示输入4进入修改学生页面,若输入的想要修改的学号不存在,则提示错误;若存在,则根据提示输入想要修改的信息。输入1进入修改学号页面,若修改的新学号已存在,提示错误,若不存在,则修改成功。进入2显示学生页面查看,202211701304号学生的学号已经修改为新学号202211701919了,说明修改成功。调试无误。
6. 查找及模糊查找学生页面:
说明:根据提示输入5进入查找学生页面,输入1-8分别是按学号查找,按姓名查找等。输入2,按姓名查找,若查找的姓名不存在,则提示错误;若存在,则展示符合该条件的学生信息和人数;若输入7,多条件查找,则可以输入1-6的数字组合来组合条件,若查找不到提示错误;若查找到了,则展示符合该条件的学生信息和人数;若输入8,模糊查找,则可输入想要查找的学生的名字中的一个字,若查找不到提示错误;若查找到了,则展示符合该条件的学生信息和人数;
7. 学号排序页面:
说明:根据提示输入6进入学号排序页面,图1为原本的顺序,图2为输入6后进行排序后的结果,按照学号从小到大排序成功。调试无误。
八、源码
1. 学生管理系统.cpp
#include <iostream>;
using namespace std;
#include "studentManager.h"
#include "student.h"
#include "info.h"int main() {studentManager st;int choice = 0; // 用户的选择while (true) {st.showMenu(); // 展示菜单界面cout << "请输入你的选择:" << endl;cin >> choice;switch (choice) {case 0: // 退出系统st.backsystem();break;case 1: // 增加学生st.addStu();break;case 2: // 显示学生st.showStu();break;case 3: // 删除学生st.deletStu();break;case 4: // 修改学生st.editStu();break;case 5: // 查找学生st.findStu();break;case 6: // 排序学生st.sortStu();break;default: // 输入其他数字-清空屏幕system("cls");break;}}system("pause");return 0;
}
2. info.cpp
#include "info.h"Info::Info(string num, string name, string sex, int age, string adress, string major) {this->sNum = num;this->sName = name;this->sSex = sex;this->sAge = age;this->sAdress = adress;this->sMajor = major;
}void Info::showInfo() {cout << this->sNum << " "<< this->sName << " "<< this->sSex << " "<< this->sAge << " "<< this->sAdress << " "<< this->sMajor<< endl;
}
3. studentManager.cpp
#include "studentManager.h";// 构造函数
studentManager::studentManager() { // 初始化fstream File;File.open("student.txt", ios::in);// 1 文件不存在的初始化if (!File.is_open()) {cout << "文件不存在" << endl; this->sCount = 0; // 初始化学生人数和数组this->sStuArray = NULL;this->isFileEmpty = true; // 文件为空为真File.close();return;}// 2 文件存在但为空char ch;File >> ch;if (File.eof()) {cout << "文件为空" << endl;this->sCount = 0; this->sStuArray = NULL;this->isFileEmpty = true; File.close();return;}// 3 文件存在 并记录数据int count = this->getCount(); // 获取学生人数this->sCount = count; // 更新学生人数this->sStuArray = new Student * [this->sCount];this->initStu(); // 保存文件中数据到数组中
}// 展示菜单
void studentManager::showMenu() {cout << "********************************************" << endl;cout << "********** 欢迎使用学生管理系统! *********" << endl;cout << "************* 0.退出管理程序 *************" << endl;cout << "************* 1.增加学生信息 *************" << endl;cout << "************* 2.显示学生信息 *************" << endl;cout << "************* 3.删除离校学生 *************" << endl;cout << "************* 4.修改学生信息 *************" << endl;cout << "************* 5.查找学生信息 *************" << endl;cout << "************* 6.按照学号排序 *************" << endl;cout << "********************************************" << endl;cout << endl;
}// 退出系统
void studentManager::backsystem() {cout << "您已退出系统,欢迎下次使用" << endl;system("pause");exit(0); // 退出程序
}// 添加学生
void studentManager::addStu() {cout << "请输入您想添加的学生人数" << endl;int addCount = 0;cin >> addCount;if (addCount > 0) {int newCount = this->sCount + addCount; // 最新人数 = 原本人数 + 新增人数Student** newSpace = new Student * [newCount]; // 新数组空间if (this->sStuArray != NULL) { // 添加原来的职工for (int i = 0; i < this->sCount; i++) {newSpace[i] = this->sStuArray[i];}}for (int i = 0; i < addCount; i++) {string Num; // 学号string Name; // 姓名string Sex; // 性别int Age; // 年龄string Adress; // 住址string Major; // 专业cout << "请输入要添加的第" << i + 1 << "个学生的学号" << endl;cin >> Num;int res = this->isStuExit(Num); // 判断该学号是否已存在if (res == -1) { // 学号不存在 可以添加string splitNum; // 要切割出来的学号的前n个数字splitNum = getNchar(Num, 4); // 保存学号的前4个数字(年份)if (Num.length() == 12 && splitNum >= "2004" && splitNum <= "2023") {cout << "请输入要添加的第" << i + 1 << "个学生的姓名" << endl;cin >> Name;cout << "请输入要添加的第" << i + 1 << "个学生的性别" << endl;cin >> Sex;if (Sex == "男" || Sex == "女") {cout << "请输入要添加的第" << i + 1 << "个学生的年龄" << endl;cin >> Age;if (Age >= 14 && Age <= 30) {cout << "您是否要录入该学生的住址" << endl;cout << "1 是" << endl;cout << "2 否" << endl;int choose;cin >> choose;if (choose == 1) {cout << "请输入要添加的第" << i + 1 << "个学生的住址" << endl;cin >> Adress;cout << "您是否要录入该学生的专业" << endl;cout << "1 是" << endl;cout << "2 否" << endl;int choose;cin >> choose;if (choose == 1) {cout << "请输入要添加的第" << i + 1 << "个学生的专业" << endl;cin >> Major;} else {Major = " ";}} else {Adress = " ";cout << "您是否要录入该学生的专业" << endl;cout << "1 是" << endl;cout << "2 否" << endl;int choose;cin >> choose;if (choose == 1) {cout << "请输入要添加的第" << i + 1 << "个学生的专业" << endl;cin >> Major;}else {Major = " ";}}/*fstream File;File.open("student.txt", ios::out | ios::app);File << Num << " " << Name << " " << Sex << " " << Age << " " << Adress << " " << Major << " " << endl;File.close();*/Student* stu = NULL;stu = new Info(Num, Name, Sex, Age, Adress, Major);newSpace[this->sCount + i] = stu;this->sCount = newCount; // 更新人数为最新人数this->isFileEmpty = false; // 文件为空的标志为假cout << "添加成功" << endl;delete[] this->sStuArray;this->sStuArray = newSpace;this->saveStu();}else {cout << "您输入的年龄有误 请重新输入" << endl;break;}}else {cout << "性别只能输入男或女 请重新输入" << endl;break;}}else {cout << "您输入的学号有误 请重新输入" << endl;break;}}else {cout << "该学号已存在 请重新输入" << endl;}}}else {cout << "您输入的数字有误,请重新输入" << endl;system("pause");system("cls");}system("pause");system("cls");
}// 返回字符串的前n个字符
string studentManager::getNchar(string str, int n) {string nChars;if (n < 0) {n = 0;cout << "输入有误, 请输入大于0的n" << endl;}if (n > str.size()) {n = str.size();}for (size_t i = 0; i < n; i++) {nChars.push_back(str[i]);}return nChars;
}// 保存学生
void studentManager::saveStu() {fstream File;File.open("student.txt", ios::out);for (int i = 0; i < this->sCount; i++) {File << this->sStuArray[i]->sNum << " "<< this->sStuArray[i]->sName << " "<< this->sStuArray[i]->sSex << " "<< this->sStuArray[i]->sAge << " "<< this->sStuArray[i]->sAdress << " "<< this->sStuArray[i]->sMajor << " " << endl;}File.close();
}// 获取学生人数
int studentManager::getCount() {fstream File;File.open("student.txt", ios::in);string Num; // 学号string Name; // 姓名string Sex; // 性别int Age; // 年龄string Adress; // 住址string Major; // 专业int Count = 0; // 学生人数while (File >> Num && File >> Name && File && File >> Sex && File >> Age && File >> Adress && File >> Major) {Count++; // 读到一条就加一条}File.close();return Count;
}// 初始化学生数组
void studentManager::initStu() {fstream File;File.open("student.txt", ios::in);string Num; // 学号string Name; // 姓名string Sex; // 性别int Age; // 年龄string Adress; // 住址string Major; // 专业int index = 0;while (File >> Num && File >> Name && File && File >> Sex && File >> Age && File >> Adress && File >> Major) {Student* stu = NULL;stu = new Info(Num, Name, Sex, Age, Adress, Major);this->sStuArray[index] = stu;index++;}
}// 展示学生信息
void studentManager::showStu() {if (this->isFileEmpty) {cout << "文件不存在或为空" << endl;}else {for (int i = 0; i < this->sCount; i++) {this->sStuArray[i]->showInfo();}}system("pause");system("cls");
}// 判断学号是否存在 存在则返回学生在数组中位置 不存在则返回-1
int studentManager::isStuExit(string num) {int index = -1; // 默认为-1for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sNum == num) {index = i;break;}}return index;
}// 删除学生
void studentManager::deletStu() {if (this->isFileEmpty) { // 文件不存在或无数据cout << "文件不存在或为空" << endl;}else { // 文件有数据cout << "请输入您想要删除的学生学号" << endl;string num;cin >> num;int index = this->isStuExit(num); // 判断该学号学生是否存在if (index != -1) { // 学生存在 删除index位置的学生for (int i = index; i < this->sCount - 1; i++) {// index后一个覆盖前一个依次类推this->sStuArray[i] = this->sStuArray[i + 1];}this->sCount--; // 更新学生人数this->saveStu(); // 更新学生信息到文件cout << "成功删除学号为" << num << "的学生" << endl;}else { // 学生不存在cout << "删除失败 该学号学生不存在" << endl;}}system("pause");system("cls");
}// 修改学生
void studentManager::editStu() {if (this->isFileEmpty) { // 文件不存在或无数据cout << "文件不存在或为空" << endl;}else { // 有数据cout << "请输入您要修改的学生学号" << endl;string num;cin >> num;int index = this->isStuExit(num); // 判断学生是否存在if (index != -1) { // 学生存在 进行修改string newNum; // 学号string newName; // 姓名string newSex; // 性别int newAge; // 年龄string newAdress; // 住址string newMajor; // 专业cout << "查找成功 请输入您要修改的学生信息" << endl;cout << "1 修改学号" << endl;cout << "2 修改姓名" << endl;cout << "3 修改性别" << endl;cout << "4 修改年龄" << endl;cout << "5 修改住址" << endl;cout << "6 修改专业" << endl;int choose;cin >> choose;switch(choose) {case 1: {cout << "请输入您要修改的新学号" << endl;cin >> newNum;int res = this->isStuExit(newNum); // 判断要修改的新学号是否存在if (res == -1) { // 学号不存在 可以修改this->sStuArray[index]->sNum = newNum;cout << "修改成功" << endl;break;}else {cout << "修改失败 该学号已存在" << endl;break;}}case 2:{cout << "请输入您要修改的新姓名" << endl;cin >> newName;this->sStuArray[index]->sName = newName;cout << "修改成功" << endl;break;}case 3:{cout << "请输入您要修改的新性别" << endl;cin >> newSex;this->sStuArray[index]->sSex = newSex;cout << "修改成功" << endl;break;}case 4:{cout << "请输入您要修改的新年龄" << endl;cin >> newAge;this->sStuArray[index]->sAge = newAge;cout << "修改成功" << endl;break;}case 5:{cout << "请输入您要修改的新住址" << endl;cin >> newAdress;this->sStuArray[index]->sAdress = newAdress;cout << "修改成功" << endl;break;}case 6:{cout << "请输入您要修改的新专业" << endl;cin >> newMajor;this->sStuArray[index]->sMajor = newMajor;cout << "修改成功" << endl;break;}default: // 输入其他数字-清空屏幕system("cls");break;}this->saveStu(); // 更新数组到文件中}else {cout << "修改失败 该学号学生不存在" << endl;}}system("pause");system("cls");
}// 查询学生
void studentManager::findStu() {if (this->isFileEmpty) {cout << "文件不存在或为空" << endl;}else {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;int choose;cin >> choose;if (choose == 1) { // 按学号查找cout << "请输入您要查找的学号" << endl;string num;cin >> num;this->findNum(num);}else if (choose == 2) { // 按姓名查找cout << "请输入您要查找的姓名" << endl;string name;cin >> name;this->findName(name);}else if (choose == 3) { // 按性别查找cout << "请输入您要查找的性别" << endl;string sex;cin >> sex;this->findSex(sex);}else if (choose == 4) { // 按年龄查找cout << "请输入您要查找的年龄" << endl;int age;cin >> age;this->findAge(age);}else if (choose == 5) { // 按住址查找cout << "请输入您要查找的住址" << endl;string adress;cin >> adress;this->findAdress(adress);}else if (choose == 6) { // 按专业查找cout << "请输入您要查找的专业" << endl;string major;cin >> major;this->findMajor(major);}else if (choose == 7) { // 多条件查找cout << "请输入2-7的数字组合 如按姓名+性别查找 输入23" << endl;int choose;cin >> choose;if (choose == 23) { // 按姓名+性别查找cout << "请输入您要查找的姓名" << endl;string name;cin >> name;cout << "请输入您要查找的性别" << endl;string sex;cin >> sex;int count = 0;for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sName == name && this->sStuArray[i]->sSex == sex) {this->sStuArray[i]->showInfo();count++;}}cout << "符合条件的人数为" << count << endl;}if (choose == 345) { // 性别+年龄+住址cout << "请输入您要查找的性别" << endl;string sex;cin >> sex;cout << "请输入您要查找的年龄" << endl;int age;cin >> age;cout << "请输入您要查找的住址" << endl;string adress;cin >> adress;int count = 0;for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sSex == sex && this->sStuArray[i]->sAge == age && this->sStuArray[i]->sAdress == adress) {this->sStuArray[i]->showInfo();count++;}}cout << "符合条件的人数为" << count << endl;}}else if (choose == 8) { // 模糊查找cout << "请输入您要查询的姓名中含的某字 如陈" << endl;char name;cin >> name;int count = 0; // 符合条件的人数for (int i = 0; i < this->sCount; i++) {for (int j = 0; j < this->sStuArray[i]->sName.length(); j++) {if (this->sStuArray[i]->sName[j] == name) {this->sStuArray[i]->showInfo();count++;}}}cout << "符合条件的人数为" << count << endl;}else {cout << "查询失败 您输入的数字有误" << endl;}} system("pause");system("cls");
}// 1 按学号查找
void studentManager::findNum(string num) {int res = this->isStuExit(num); // 判断该学号学生是否存在if (res != -1) { // 学生存在this->sStuArray[res]->showInfo();}else {cout << "查找失败 该学号学生不存在" << endl;}
}// 2 按姓名查找
void studentManager::findName(string name) {int flag = false; // 是否查找成功的标志int count = 0; // 符合条件的学生人数for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sName == name) {this->sStuArray[i]->showInfo();flag = true;count++;}}if (flag == true) {cout << "该姓名的学生人数为" << count << endl;}else if (flag == false) {cout << "查找失败 该姓名学生不存在" << endl;}
}// 3 按性别查找
void studentManager::findSex(string sex) {int count = 0; // 符合条件的学生人数if (sex == "男" || sex == "女") {for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sSex == sex) {this->sStuArray[i]->showInfo();count++;}}cout << "该性别的学生人数为" << count << endl;}else {cout << "查找失败 性别只能输入男或女" << endl;}
}// 4 按年龄查找
void studentManager::findAge(int age) {int flag = false; // 是否查找成功的标志int count = 0; // 符合条件的学生人数for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sAge == age) {this->sStuArray[i]->showInfo();flag = true;count++;}}if (flag == true) {cout << "该年龄的学生人数为" << count << endl;}else if (flag == false) {cout << "查找失败 该年龄学生不存在" << endl;}
}// 5 按住址查找
void studentManager::findAdress(string adress) {int flag = false; // 是否查找成功的标志int count = 0; // 符合条件的学生人数for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sAdress == adress) {this->sStuArray[i]->showInfo();flag = true;count++;}}if (flag == true) {cout << "该住址的学生人数为" << count << endl;}else if (flag == false) {cout << "查找失败 该住址学生不存在" << endl;}
}// 6 按专业查找
void studentManager::findMajor(string major) {int flag = false; // 是否查找成功的标志int count = 0; // 符合条件的学生人数for (int i = 0; i < this->sCount; i++) {if (this->sStuArray[i]->sMajor == major) {this->sStuArray[i]->showInfo();flag = true;count++;}}if (flag == true) {cout << "该专业的学生人数为" << count << endl;}else if (flag == false) {cout << "查找失败 该专业学生不存在" << endl;}
}// 按学号大小排序
void studentManager::sortStu() {for (int i = 0; i < this->sCount; i++) {// 按前4位数(年份)排序string splitNum4i; // 要切割出来的学号的前4个数字splitNum4i = getNchar(this->sStuArray[i]->sNum, 4); // 保存学号的前4个数字(年份)int min = i; // 目前最小值的下标for (int j = i + 1; j < this->sCount; j++) {string splitNum4j; // 要切割出来的学号的前n个数字splitNum4j = getNchar(this->sStuArray[j]->sNum, 4); // 保存学号的前4个数字(年份)if (splitNum4i > splitNum4j) {min = j;}}if (min != i) {Student* temp = this->sStuArray[i];this->sStuArray[i] = this->sStuArray[min];this->sStuArray[min] = temp;}// 按学号排序int min2 = i; // 目前最小值的下标for (int j = i + 1; j < this->sCount; j++) {if (this->sStuArray[i]->sNum > this->sStuArray[j]->sNum) {min2 = j;}}if (min2 != i) {Student* temp = this->sStuArray[i];this->sStuArray[i] = this->sStuArray[min2];this->sStuArray[min2] = temp;}}cout << "排序成功 最新的数据为" << endl;this->saveStu();this->showStu();system("pause");system("cls");
}// 析构函数
studentManager::~studentManager() {// 手动释放堆区数据if (this->sStuArray != NULL) {delete[] this->sStuArray;this->sStuArray = NULL;}
}
4. student.h
#pragma once
#include <iostream>
using namespace std;
#include <string>class Student {
public:virtual void showInfo() = 0; // 显示学生信息string sNum; // 学号string sName; // 姓名string sSex; // 性别int sAge; // 年龄string sAdress; // 住址string sMajor; // 专业
};
5. studentManager.h
#pragma once
#include <iostream>
using namespace std;#include "student.h"
#include "info.h"#include <string>
#include <fstream>
#include <ctype.h>
#include <vector>class studentManager {
public:studentManager(); // 构造函数void showMenu(); // 展示菜单void backsystem(); // 退出系统void addStu(); // 添加学生int sCount; // 原本学生人数Student** sStuArray; // 记录学生的数组string getNchar(string str, int n); // 返回输入的前n个字符void saveStu(); // 保存学生bool isFileEmpty; // 标志文件是否为空int getCount(); // 获取学生人数void initStu(); // 初始化学生数组void showStu(); // 展示学生信息int isStuExit(string num); // 根据学号判断该学生学生是否存在void deletStu(); // 删除学生void editStu(); // 修改学生void findStu(); // 查找学生void findNum(string num); // 1 按学号查找void findName(string name); // 2 按姓名查找void findSex(string sex); // 3 按性别查找void findAge(int age); // 4 按年龄查找void findAdress(string adress); // 5 按住址查找void findMajor(string major); // 6 按专业查找void sortStu(); // 排序~studentManager(); // 析构函数
};
6. info.h
#pragma once
#include <iostream>
using namespace std;
#include "student.h"class Info: public Student {
public:// 构造函数Info(string num, string name, string sex, int age, string adress, string major);// 展示学生信息virtual void showInfo();
};
相关文章:

c++实现学生管理系统(附源码)
目录 一、基本功能: 二、包含的模块: 三、系统介绍 1. 学生管理系统的功能: 2. 具体的需求: 3. 支持的标准: 四、系统结构功能图: 五、系统设计 1. 退出系统: 2. 增加学生:…...

JS防抖是什么?干嘛用的?
你好同学,我是沐爸,欢迎点赞、收藏和关注!个人知乎 防抖在前端开发中可以说经常用到,有诸多使用场景。接下来我们一起看下防抖的定义、防抖函数的实现、应用场景、lodash防抖函数以及防抖在框架中的使用。Let’s go 一、什么是防…...

Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例
文章目录 4、查看或管理磁盘分区-fdisk格式选项示例 4、示例:使用 fdisk 命令创建分区需求操作步骤 5、创建文件系统-mkfs格式常用选项示例创建其他类型的文件系统 6、创建文件系统-mkswap格式常用选项示例拓展:关闭和启用交换分区拓展:swap分…...

使用vtkRenderer创建的显示点云的窗口如何刷新(QT/C++)
一、使用vtkRenderer创建点云显示窗口,参考 在Qt创建的UI中放一个显示点云的窗口(PCLQT5)_pcl点云和qt-CSDN博客 二、刷新vtkRenderer创建的窗口 使用场景:在某些情况下代码中需要对显示窗口的显示物改动,例如通过滑…...

Mysql绕过小技巧
上源码。 <?php $mysqli new mysqli("localhost", "root", "root", "security");/* check connection */ if ($mysqli->connect_errno) {printf("Connect failed: %s\n", $mysqli->connect_error);exit(); }$my…...

气象大数据案例项目(求各气象站的平均气温)
气象大数据案例项目(求各气象站的平均气温) 一、项目需求二、数据格式三、项目开发3.1 在windows 进行开发3.2 运行结果3.3 对项目打包 一、项目需求 现在有一份来自美国国家海洋和大气管理局的数据集,里面包含近30年每个气象站、每小时的天…...

博客摘录「 一个ModBus RTU程序(支持01、02、03、05、06、15、16功能码)」2024年4月19日
发送数据最好改为中断模式,不然通信速度不够。...

Vue3学习笔记第一天
MVVM Vue是一种用于构建用户界面的JavaScript框架。MVVM 是Vue采用的一种软件架构模式,用于构建交互式的用户界面。它的全称是 Model-View-ViewModel,这三个部分分别代表了应用程序的不同层次和角色: Model(模型)&…...

C++之类与对象(完结撒花篇)
目录 前言 1.再探构造函数 2.类型转换 3.static成员 4. 友元 5.内部类 6.匿名对象 7.对象拷贝时的编译器优化 结束语 前言 在前面的博客中,我们对类的默认成员函数都有了一定了解,同时实现了一个日期类对所学的没内容进行扩展延伸,本…...

代码质量的守护者:Python静态代码分析工具的集成之道
标题:代码质量的守护者:Python静态代码分析工具的集成之道 在软件开发过程中,代码质量是至关重要的一环。Python作为一种流行的编程语言,拥有众多的静态代码分析工具,它们能够在代码运行之前检测潜在的错误和代码风格…...

JVM -- 类加载器
类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现访问接口和类字节码数据的技术。类加载器只负责加载过程中的字节码获取并加载到内存的这一过程。 一、 类加载器的分类 类加载器的详细信息可以使用Arthas通过classloader命令查看: 1.启动类加载器(Boots…...

OLAP引擎之StarRocks
StarRocks 是一款新兴的开源分布式实时分析型数据库,专为高性能、高并发的数据分析场景设计。它结合了传统数据仓库和大数据技术的优势,提供了强大的实时数据处理和分析能力。以下是对 StarRocks 的详细介绍,涵盖其基本概念、核心特性、架构设…...

基于微信小程序的小区业主服务系统(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...

C++ | Leetcode C++题解之第327题区间和的个数
题目: 题解: class Solution { public:int countRangeSumRecursive(vector<long>& sum, int lower, int upper, int left, int right) {if (left right) {return 0;} else {int mid (left right) / 2;int n1 countRangeSumRecursive(sum,…...

C# Winform 多窗体切换方式一
一、简介 在 Winform 开发中,多窗体的切换是一个常见的需求,比如登录成功后,切换至主界面,在网上查阅相关的资料,你会发现很多都是用 form2.Show(); this.Hide(); 这种方式,这种方式也存在一些问题&#…...

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU
原文地址(高清无水印原图/持续更新/含榜单出处链接): 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志:常规更新Cinebench R23、PassMark笔记本CPU天梯图,新增Geekbench 6.2单核多核天梯图&…...

GitLab-CI/CD指南
由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…...

io目录操作学习
1、基本概念 目录也是一种文件,因此操作流程与普通文件类似,有诸如打开、关闭、定位等概念,但目录是一种特殊的文件,目录存储的数据的最小单位并不是字符,而是目录项。这使得目录跟普通文件又有区别。 在Linux中&…...

Ant-Design-Vue
Ant-Design-Vue是蚂蚁金服Ant Design官方推荐的Vue版UI组件库,它继承了Ant Design的设计语言和Vue.js的易用性,为开发者提供了丰富、高质量的Vue组件,极大地简化了前端开发流程。以下是一份详细的Ant-Design-Vue快速上手指南及排坑建议&#…...

2024互联网暑期实习面经和流程记录分享
2024互联网暑期实习面经和流程记录分享 面试经验和流程需要注意的点 面试经验和流程 因为敏感信息的原因,这里涉及到公司名字的全部进行打码 笔者投递和面试了很多公司,具体有包括算法和开发岗,下面的公司一律用字母代替。 O公司࿰…...

风云崛起之拉氏变换和拉式逆变换
图像的分割写出来了,但是写的不好,暂时先不发了。这两天小y想在把拉式变换的内容写出来,小y最近再看信号和电路,需要复习数学,所以把这点写出来。 首先要推出分布积分的公式,我们知道积分和微分为逆运算&am…...

1、.Net UI框架:WinUI - .Net宣传系列文章
WinUI(Windows UI Library)是微软提供的一个用于构建Windows应用程序的本机UI平台组件。它与Windows应用SDK紧密相关,允许开发者创建适用于Windows 10及更高版本的应用程序,并且可以发布到Microsoft Store。WinUI 3是最新的一代,它提供了与操…...
计算机的错误计算(五十九)
摘要 讨论用 Go语言实现的 函数的计算精度问题。 由计算机的错误计算(五十五)知,国际 IEEE 754 标准中, 函数具有定义域 . 那么,在常规编程模式下用 Go语言实现这个函数,其输出的精度如何? …...

【数学分析笔记】第1章第1节:集合(1)
作为一个计算机专业的人,想自学一下数学专业的专业课补一补AI基础,顺带写个笔记,听的课是陈纪修版本的数学分析: 1. 集合与映射 1.1 集合 1.1.1 基本概念 集合:由某种特定性质的具体的或抽象的对象汇集的总体。 集…...

计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

GIT指令大全详解
目录 GIT指令详解 拉取 提交 分支操作(假设分支为a) 版本回退 主分支拉取到分支 常用的Git指令 一、初始化配置 二、初始化仓库 三、检查当前文件状态 四、添加 五、查看提交历史 六、撤销更改 七、查询 八、分支 九、标签管理 十、其他常用指令 GIT指令详解 Git是一个开源的分…...

ECCV2024,清华百度提出ReSyncer:可实现音频同步嘴唇动作视频生成。
清华&百度等联合提出了ReSyncer,可以实现更高稳定性和质量的口型同步,而且还支持创建虚拟表演者所必需的各种有趣属性,包括快速个性化微调、视频驱动的口型同步、说话风格的转换,甚至换脸。 ReSyncer的工作原理可以简单理解为…...

论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法
摘要 YOLOv8-QSD网络是一种新型的无锚点驾驶场景检测网络,建立在YOLOv8的基础上,在保证检测精度的同时保持效率。该网络的骨干网采用结构重参数化技术来转换基于多样化分支块 (DBB) 的模型。 为了准确检测小目标,它集…...

Vue.js状态管理:Vuex与Pinia的比较
在 Vue.js 生态系统中,状态管理是构建复杂应用时的重要组成部分。Vue.js 提供了两种流行的状态管理库:Vuex 和 Pinia。虽然两者都旨在简化状态管理,但它们在设计哲学、API、性能和易用性方面有所不同。本文将深入探讨 Vuex 和 Pinia 的异同&a…...

OJ题目【栈和队列】
目录 有效的括号 有效的括号【代码】 用队列实现栈 用队列实现栈【代码】 用栈实现队列 用栈实现队列【代码】 设计循环队列 有效的括号 https://leetcode.cn/problems/valid-parentheses/submissions/551394950/ 思路:把左括号放到栈里,取出来栈…...