当前位置: 首页 > news >正文

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++实现学生管理系统(附源码)

目录 一、基本功能&#xff1a; 二、包含的模块&#xff1a; 三、系统介绍 1. 学生管理系统的功能&#xff1a; 2. 具体的需求&#xff1a; 3. 支持的标准&#xff1a; 四、系统结构功能图&#xff1a; 五、系统设计 1. 退出系统&#xff1a; 2. 增加学生&#xff1a…...

JS防抖是什么?干嘛用的?

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

Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例

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

使用vtkRenderer创建的显示点云的窗口如何刷新(QT/C++)

一、使用vtkRenderer创建点云显示窗口&#xff0c;参考 在Qt创建的UI中放一个显示点云的窗口&#xff08;PCLQT5&#xff09;_pcl点云和qt-CSDN博客 二、刷新vtkRenderer创建的窗口 使用场景&#xff1a;在某些情况下代码中需要对显示窗口的显示物改动&#xff0c;例如通过滑…...

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

气象大数据案例项目(求各气象站的平均气温)

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

博客摘录「 一个ModBus RTU程序(支持01、02、03、05、06、15、16功能码)」2024年4月19日

发送数据最好改为中断模式&#xff0c;不然通信速度不够。...

Vue3学习笔记第一天

MVVM Vue是一种用于构建用户界面的JavaScript框架。MVVM 是Vue采用的一种软件架构模式&#xff0c;用于构建交互式的用户界面。它的全称是 Model-View-ViewModel&#xff0c;这三个部分分别代表了应用程序的不同层次和角色&#xff1a; Model&#xff08;模型&#xff09;&…...

C++之类与对象(完结撒花篇)

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

代码质量的守护者:Python静态代码分析工具的集成之道

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

JVM -- 类加载器

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

OLAP引擎之StarRocks

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

基于微信小程序的小区业主服务系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…...

C++ | Leetcode C++题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; 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 开发中&#xff0c;多窗体的切换是一个常见的需求&#xff0c;比如登录成功后&#xff0c;切换至主界面&#xff0c;在网上查阅相关的资料&#xff0c;你会发现很多都是用 form2.Show(); this.Hide(); 这种方式&#xff0c;这种方式也存在一些问题&#…...

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU

原文地址&#xff08;高清无水印原图/持续更新/含榜单出处链接&#xff09;&#xff1a; 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志&#xff1a;常规更新Cinebench R23、PassMark笔记本CPU天梯图&#xff0c;新增Geekbench 6.2单核多核天梯图&…...

GitLab-CI/CD指南

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

io目录操作学习

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

Ant-Design-Vue

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

2024互联网暑期实习面经和流程记录分享

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

风云崛起之拉氏变换和拉式逆变换

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

1、.Net UI框架:WinUI - .Net宣传系列文章

WinUI(Windows UI Library)是微软提供的一个用于构建Windows应用程序的本机UI平台组件。它与Windows应用SDK紧密相关&#xff0c;允许开发者创建适用于Windows 10及更高版本的应用程序&#xff0c;并且可以发布到Microsoft Store。WinUI 3是最新的一代&#xff0c;它提供了与操…...

计算机的错误计算(五十九)

摘要 讨论用 Go语言实现的 函数的计算精度问题。 由计算机的错误计算&#xff08;五十五&#xff09;知&#xff0c;国际 IEEE 754 标准中&#xff0c; 函数具有定义域 . 那么&#xff0c;在常规编程模式下用 Go语言实现这个函数&#xff0c;其输出的精度如何&#xff1f; …...

【数学分析笔记】第1章第1节:集合(1)

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

计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

GIT指令大全详解

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

ECCV2024,清华百度提出ReSyncer:可实现音频同步嘴唇动作视频生成。

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

论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法

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

Vue.js状态管理:Vuex与Pinia的比较

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

OJ题目【栈和队列】

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