学籍管理系统(c++文件实现)

要求:

实现增删查改,两种方式查询,登录功能

设计:

学生端:可以查询个人成绩

管理员端:对学籍信息增删查改,查看所有信息,单人信息,学籍排序,统计绩点

三个文件,学生信息,用户信息,数据保存文件

main.cpp:

#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>//包含大量算法函数的声明,这些函数用于操作和变换容器中的元素
//例如:sort(),find()
#include "Stu.h"
#include "User.h"
using namespace std;bool ReadStudent(Stu& s)
{string file_path1("stus.txt");fstream openfile(file_path1.c_str(), fstream::in | fstream::out);
//打开文件流,可以同时读取和写入文件vector<string> OneInfo;
//字符串向量临时存储从文件中读取的每行学生信息string txtline, item;;while (getline(openfile, txtline))
//逐行读取数据并存储在textline中{OneInfo.clear();istringstream items(txtline);
//将每行数据分割成多个部分while (items >> item)
//从items读取一个数据并将其赋值给变量item,读取成功则继续OneInfo.push_back(item);
//将每一个读取到的item添加到oneinfo的末尾s.AddStudent(OneInfo);//添加到stu对象s中}cout << "学生文件读取成功!" << endl;return true;
}bool ReadUser(User &u)
{string file_path2("users.txt");fstream openfile(file_path2.c_str(),fstream::in|fstream::out);vector<string> OneInfo2;string txtline, item;;while(getline(openfile,txtline)){OneInfo2.clear();istringstream items(txtline); while(items>>item)OneInfo2.push_back(item);u.AddUser(OneInfo2);//添加到user对象u中}cout<<"用户文件读取成功!"<<endl;return true;
}int Menulog(User u,Stu s)
//通过该函数返回值判断身份
{string name,password,key;int flag1=0,flag2=0;system("cls");printf("******************************************************\n");printf("*******************学籍管理系统***********************\n");printf("*********************登录界面*************************\n");printf("账号:");cin>>name;printf("密码:");cin>>password;printf("******************************************************\n");system("pause");flag1=u.SearchName(name);flag2=u.SearchPassword(password,name);if(flag1==1 && flag2==1)//用户存在且账号密码正确{cout<<"账号密码验证通过,登陆成功!"<<endl;key=u.SearchKey(name);if(key=="无"){cout<<"您的身份为:学生"<<endl;cout<<"欢迎使用学籍管理系统!"<<endl;system("pause");return 1;}else{cout<<"您的身份为:管理员"<<endl;cout<<"欢迎使用学籍管理系统!"<<endl;system("pause");return 2;}}else{cout<<"账号或密码错误,登陆失败!"<<endl;exit(0);}
}void Menu2(Stu s)
{int n;int choice=0;do{system("cls");printf("\n");printf("******************************************************\n");printf("*******************学籍管理系统***********************\n");printf("**    1.学籍查询                2.退出系统          **\n");printf("******************************************************\n");puts("\n");printf("请选择功能序号:");cin>>n;if(n!=1&&n!=2){system("cls");cout<<"选择错误!  请重新选择!"<<endl;system("pause");choice=1;}else{break;}}while(choice==1);switch(n){case 1:{cout << "请选择查询方式:1.姓名  2.学号" << endl;int sel;cin >> sel;if (sel == 1){s.SearchName();}else if (sel == 2){s.SearchId();}else{cout << "选择错误!" << endl;}system("pause");break;}case 2:{cout<<"已退出学籍管理系统!"<<endl;exit(0);break;}}Menu2(s);
}void Menu(Stu s)
{int n;int choice=0;vector<string>addinfo;do{system("cls");printf("\n");printf("******************************************************\n");printf("*******************学籍管理系统***********************\n");printf("**    1.学籍添加                2.学籍删除          **\n");printf("**    3.学籍修改                4.学籍查询          **\n");printf("**    5.学籍排序                6.统计绩点          **\n");printf("**    7.学籍显示                8.保存并退出        **\n");printf("******************************************************\n");puts("\n");printf("请选择功能序号:");cin>>n;if(n<1||n>8){system("cls");cout<<"选择错误!  请重新选择!"<<endl;system("pause");choice=1;}else{break;}}while(choice==1);{switch(n){case 1:{cout<<"即将进行学籍数据添加,请分别输入以下内容:"<<endl;cout<<"学号 姓名 性别 年龄 身份证号 政治面貌 家庭住址 院系 班级 绩点 奖惩情况"<<endl;string info;for(int i=0;i<11;i++){cin>>info;
//循环输入11个字符串addinfo.push_back(info);
//存储在addinfo这个vector中}s.AddStudent(addinfo);cout<<"添加学籍信息成功!"<<endl;system("pause");break;}case 2:{cout<<"请选择删除方式:1.单条删除  2.整个删除"<<endl;int sel;cin>>sel;if(sel==1){s.DeleteOneStudent();}else if(sel==2){s.DeleteAllStudent();}else{cout<<"选择错误!"<<endl;}system("pause");break;}case 3:{cout<<"即将进行学籍数据修改,请按提示操作"<<endl;s.ChangeOneStudent();system("pause");break;}case 4:{cout << "请选择查找方式:1.姓名  2.学号" << endl;int sel;cin >> sel;if (sel == 1){s.SearchName();}else if (sel == 2){s.SearchId();}else{cout << "选择错误!" << endl;}system("pause");break;}case 5:{cout<<"学籍信息按学号从小到大排序:"<<endl;s.SortStudent();system("pause");break;}case 6:{s.StatisticsInfos();system("pause");break;}case 7:{cout<<"学籍信息如下:"<<endl;s.ShowAllInfo();system("pause");break;}case 8:{cout<<"已成功保存至本地!"<<endl;cout<<"已成功退出学籍管理系统,欢迎下次使用!"<<endl;s.WriteToFile("stussave.txt") ;//system("pause");exit(0);break;}}}Menu(s);
}int main()
{Stu s;User u;int userkind;if (ReadStudent(s)){if (ReadUser(u))system("pause");}else{return 0;}userkind = Menulog(u, s);if (userkind == 2)//管理员菜单{Menu(s);}else if (userkind == 1)//学生菜单{Menu2(s);}return 0;
}

stu.h:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>//函数对象相关操作
#include <sstream>//字符串流
#include <fstream>//文件流
#include <vector>//动态数组
using namespace std;class Stu
{
private:string snoa;string sname;string ssex;string sage;string snob;string sstatus;string slocal;string sdept;string sclass;string sgpa;string sevent;vector<Stu *> student;
//定义一个student向量存储Stu类型对象的地址
//例如增加一个元素:
//Stu* s=new Stu();//创建一个新Stu对象获取其地址
//student.push_back(s);//将这个地址添加到student向量中vector<Stu> student2;
//存储对象本身,向量长度不能变化
//以上两个一个存储地址向量长度,一个存储对象本身
public:Stu(){};//构造函数~Stu(){};//析构函数Stu(string noa, string name,string sex,string age,string nob,string status,string local,string dept,string sclasss,string gpa,string events);//带参数的构造函数void AddStudent(vector<string>st); //增加学生学籍信息void ShowAllInfo(); //打印全部学生学籍信息void ShowInfo(); //打印一个学生学籍信息bool operator()(Stu &other); //重载函数void SearchName(); //按姓名查找某学生学籍信息void SearchId(); //按学号查找某学生学籍信息void DeleteAllStudent(); //删除所有学生学籍信息void DeleteOneStudent(); //删除某个学生学籍信息void ChangeOneStudent(); //修改某个学生学籍信息void SortStudent(); //给学籍信息排序bool operator<(Stu &stu); //重载学生学号比较大小void StatisticsInfos(); //统计绩点void WriteToFile(string filename) ;//保存至本地};

user.h

#include <iostream>
#include <string>
using namespace std;class User
{
private:string sname;string spass;string skey;vector<User *> user;
//存储对象地址vector<User> user2;
public:User(){};~User(){};User(string name,string pass,string key);void AddUser(vector<string>use); //增加用户信息void ShowInfo();void ShowAllInfo();int SearchName(string name);int SearchPassword(string password,string name);string SearchKey(string name);
};

user.cpp

#include <string.h>
#include <algorithm>
#include <functional>
#include <sstream>
#include <fstream>
#include <vector>
#include "User.h"
#include <iostream>
using namespace std;User::User(string name,string pass,string key)//初始化
{sname = name;spass = pass;skey = key;
};void User::AddUser(vector<string>use)
{User use1(use[0],use[1],use[2]);//创建一个新的User对象user2.push_back(use1);//添加到user2向量中
}void User::ShowInfo()
{cout<<sname<<"  "<<spass<<"  "<<skey<<endl;}void User::ShowAllInfo()
{	vector<User>::iterator it;//声明一个迭代器cout<<"用户名  "<<"密码  "<<"秘钥  "<<endl;for(it=user2.begin();it!=user2.end();it++)//遍历所有元素{cout<<(*it).sname<<"  "<<(*it).sname<<"  "<<(*it).spass<<"  "<<(*it).skey<<endl;}
}int User::SearchName(string name)
{int flag1=0;for(vector<User>::iterator it=user2.begin();it!=user2.end();it++){if((*it).sname==name){flag1=1;return 1;}}if(flag1==1){return 1;}else{return 0;}
}int User::SearchPassword(string password,string name)
{int flag1=0;for(vector<User>::iterator it=user2.begin();it!=user2.end();it++){if((*it).sname==name){if((*it).spass==password){flag1=1;}}}if(flag1==1){return 1;}else{return 0;}
}string User::SearchKey(string name)
{string key="无";//如果没有密匙则保留无for(vector<User>::iterator it=user2.begin();it!=user2.end();it++){if((*it).sname==name){key=(*it).skey;}}return key;}

stu.cpp

#include <string.h>
#include <algorithm>
#include <functional>
#include <sstream>
#include <fstream>
#include <vector>
#include "Stu.h"
#include <iostream>using namespace std;Stu::Stu(string noa, string name, string sex, string age, string nob, string status, string local, string dept, string sclasss, string gpa, string events)//初始化
{snoa = noa;sname = name;ssex = sex;sage = age;snob = nob;sstatus = status;slocal = local;sdept = dept;sclass = sclasss;sgpa = gpa;sevent = events;
}void Stu::AddStudent(vector<string>st)
{Stu stu1(st[0], st[1], st[2], st[3], st[4], st[5], st[6], st[7], st[8], st[9], st[10]);student2.push_back(stu1);//创建的stu对象添加到student2向量中
}//容器增加void Stu::ShowInfo()
{cout << snoa << "  " << sname << "  " << ssex << "  " << sage << "  " << snob << "  " << sstatus << "  " << slocal << "  " << sdept << "  " << sclass << "  " << sgpa << "  " << sevent << endl;}//一个学生学籍信息显示void Stu::ShowAllInfo()
{vector<Stu>::iterator it;cout << "学号  " << "姓名  " << "性别  " << "年龄  " << "身份证号  " << "政治面貌  " << "家庭住址  " << "院系  " << "班级  " << "绩点  " << "奖惩情况  " << endl;for (it = student2.begin(); it != student2.end(); it++){cout << (*it).snoa << "  " << (*it).sname << "  " << (*it).ssex << "  " << (*it).sage << "  " << (*it).snob << "  " << (*it).sstatus << "  " << (*it).slocal << "  " << (*it).sdept << "  " << (*it).sclass << "  " << (*it).sgpa << "  " << (*it).sevent << endl;}
}bool Stu::operator()(Stu& other) //重载(),使类的对象可以像函数一样调用
//例:stu1(stu2),两者相同则返回true
{bool flag;if (this->snoa == other.snoa){flag = true;}else{flag = false;}return flag;
}void Stu::SearchName()
{string name;int flag1 = 0;cout << "请输入学生姓名:" << endl;cin >> name;for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
//迭代器本质上是一个指针,指向容器中的元素{if ((*it).sname == name){cout << "查询成功!" << endl;(*it).ShowInfo();flag1 = 1;}}if (flag1 == 0)cout << "该学生学籍不存在!" << endl;}
void Stu::SearchId()
{string id;int flag1 = 0;cout << "请输入学生学号:" << endl;cin >> id;for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++){if ((*it).snoa == id){cout << "查询成功!" << endl;(*it).ShowInfo();flag1 = 1;}}if (flag1 == 0)cout << "该学生学籍不存在!" << endl;
}void Stu::DeleteAllStudent() //删除所有学生学籍信息
{student2.clear();
}void Stu::DeleteOneStudent() //删除一个学生学籍信息
{string id;int flag1 = 0;cout << "请输入学生学号:" << endl;cin >> id;for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++){if ((*it).snoa == id){cout << "此条学籍数据删除成功!" << endl;it = student2.erase(it);//返回一个指向删除元素之后元素的迭代器,需要同步flag1 = 1;}else{++it;}}if (flag1 == 0)cout << "该学生学籍不存在!" << endl;
}
void Stu::ChangeOneStudent() //修改一个学生学籍信息
{string id;int flag1 = 0;cout << "请输入学生学号:" << endl;cin >> id;for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++){if ((*it).snoa == id){cout << "此条学籍数据定位成功!" << endl;(*it).ShowInfo();cout << "请输入要修改的内容:1.学号  2.政治面貌  3.院系  4.班级  5.绩点  6.奖惩情况" << endl;int sel;cin >> sel;if (sel == 1){cout << "请输入修改后的学号:";string newinfo;cin >> newinfo;(*it).snoa = newinfo;cout << "修改成功!" << endl;(*it).ShowInfo();}else if (sel == 2){cout << "请输入修改后的政治面貌:";string newinfo;cin >> newinfo;(*it).sstatus = newinfo;cout << "修改成功!" << endl;(*it).ShowInfo();}else if (sel == 3){cout << "请输入修改后的院系:";string newinfo;cin >> newinfo;(*it).sdept = newinfo;cout << "修改成功!" << endl;(*it).ShowInfo();}else if (sel == 4){cout << "请输入修改后的班级:";string newinfo;cin >> newinfo;(*it).sclass = newinfo;cout << "修改成功!" << endl;(*it).ShowInfo();}else if (sel == 5){cout << "请输入修改后的绩点:";string newinfo;cin >> newinfo;(*it).sgpa = newinfo;cout << "修改成功!" << endl;(*it).ShowInfo();}else if (sel == 6){cout << "请输入修改后的奖惩情况:";string newinfo;cin >> newinfo;(*it).sevent = newinfo;cout << "修改成功!" << endl;(*it).ShowInfo();}else{cout << "选择错误,修改失败!" << endl;}flag1 = 1;}}if (flag1 == 0)cout << "该学生学籍不存在!" << endl;
}bool Stu::operator<(Stu& stu) //重载学生学号比较大小
{return snoa < stu.snoa;
}void Stu::SortStudent() //给学生学籍信息排序
{sort(student2.begin(), student2.end()); //sort算法,默认从小到大排,默认调用operator<()重载函数for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++){(*it).ShowInfo();}cout << endl;
}void Stu::StatisticsInfos() //统计绩点
{float max = 0, min = 100, avg = 0, sum = 0, count = 0;for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++){count++;if (atof((*it).sgpa.c_str()) > max)
//c_str():string转化为cstirng
//atof():cstring转化为浮点数{max = atof((*it).sgpa.c_str());}if (atof((*it).sgpa.c_str()) < min){min = atof((*it).sgpa.c_str());}sum = sum + atof((*it).sgpa.c_str());}avg = sum / count;cout << "学籍信息中学生的最高绩点为:" << max << endl;cout << "学籍信息中学生的最低绩点为:" << min << endl;cout << "学籍信息中学生的平均绩点为:" << avg << endl;}void Stu::WriteToFile(string filename)
{string file_path(filename);fstream outfile(file_path.c_str(), fstream::out);//输出for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++){outfile << (*it).snoa << "  " << (*it).sname << "  " << (*it).ssex << "  " << (*it).sage << "  " << (*it).snob << "  " << (*it).sstatus << "  " << (*it).slocal << "  " << (*it).sdept << "  " << (*it).sclass << "  " << (*it).sgpa << "  " << (*it).sevent << endl;//按行写入}return;
}

效果图:

 

 

 

 

 

保存并退出:

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

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

相关文章

【Python】采用OpenCV和Flask来进行网络图像推流的低延迟高刷FPS方法(项目模板)

【Python】采用OpenCV和Flask来进行网络图像推流的低延迟高刷FPS方法&#xff08;项目模板&#xff09; gitee项目模板&#xff1a; 网络图像推流项目模板&#xff08;采用OpenCV和Flask来进行网络图像推流的低延迟高刷FPS方法&#xff09; 前文&#xff1a; 【最简改进】基于…

伊恩·斯图尔特《改变世界的17个方程》相对论笔记

它告诉我们什么&#xff1f; 物质包含的能量等于其质量乘以光速的平方。 为什么重要&#xff1f; 光的速度很快&#xff0c;它的平方绝对是一个巨大的数。1千克的物质释放出的能量相当于史上最大的核武器爆炸所释放能量的约40%。一系列相关的方程改变了我们对空间、时间、物质和…

Prompt Learning 的几个重点paper

Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for Generation 在输入token之前构造一段任务相关的virtual tokens作为Prefix&#xff0c;然后训练的时候只更新Prefix部分的参数&#xff0c;PLM中的其他参数固定。针对自回归架构模型&#xff1a;在句子前面添…

vue 使用echarts-gl实现3d旋转地图

之前也有使用过echarts开发项目中涉及到的地图功能&#xff0c;当时使用geo来实现地图轮廓&#xff0c;看上去有种3d的感觉。最近闲来无事看了一份可视化大屏的UI设计图&#xff0c;感觉3d旋转地图挺好玩的&#xff0c;今天就来尝试实现下。 首先安装下echarts和echarts-gl依赖…

MyBatis框架-配置解析

文章目录 Mybatis配置解析核心配置文件environments 环境配置transactionManager 事务管理器dataSource 数据源mappers 映射器Mapper文件Properties优化类型别名&#xff08;typeAliases&#xff09;setting类型处理器&#xff08;typeHandlers&#xff09;对象工厂&#xff08…

shell脚本——条件语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…

1002. HarmonyOS 开发问题:鸿蒙 OS 技术特性是什么?

1002. HarmonyOS 开发问题&#xff1a;鸿蒙 OS 技术特性是什么? 硬件互助&#xff0c;资源共享 分布式软总线 分布式软总线是多种终端设备的统一基座&#xff0c;为设备之间的互联互通提供了统一的分布式通信能力&#xff0c;能够快速发现并连接设备&#xff0c;高效地分发…

计算机网络——网络层(2)

计算机网络——网络层&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层——控制平面概述路由选择转发表路由协议路由信息的交换小结 路由选择算法常见的路由选择算法距离矢量路由算法工作原理优缺点分析 链路状态路由算法基本工作原理优…

【详解】贪吃蛇游戏----下篇(完整源码)

目录 引入&#xff1a; 本片文章目的&#xff1a; 整个游戏的实现流程图如下&#xff1a; 游戏实现 GameRun PrintHelpInfo Pause NextIsFood printSnake EatFood NoFood KillByWall KillBySelf GameRun GameEnd 总代码&#xff1a; &#xff08;1&#xff09…

pcie基础知识

文章目录 总线PCIEPCIE对应版本速率pcie拓扑linux查看pcie设备PCIE配置空间BAR&#xff08;基地址寄存器&#xff09; 总线 什么是总线 总线就是电脑内部交互的通道。 最开始CPU连接声卡或者网卡用的是不同接口&#xff0c;比如你声卡坏了&#xff0c;换一个声卡&#xff0c;接…

二叉搜索树操作题目:二叉搜索树中的插入操作

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树中的插入操作 出处&#xff1a;701. 二叉搜索树中的插入操作 难度 3 级 题目描述 要求 给定二叉搜索…

C# 一个快速读取写入操作execl的方法封装

这里封装了3个实用类ExcelDataReaderExtensions&#xff0c;ExcelDataSetConfiguration&#xff0c;ExcelDataTableConfiguration和一个实用代码参考&#xff1a; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.T…

别再做“背锅侠”!软件测试工程师被开发吐槽,如何应对?

作为一名软件测试工程师&#xff0c;我们的角色可以算是“战场上的后勤”&#xff0c;战役的胜败和所有团队人员都息息相关。但是难免碰到战役失败后&#xff0c;很多团队互相推脱的局面&#xff0c;而测试人员就是所有团队中的弱势群体&#xff0c;自然是首当其冲的背锅侠&…

扫雷游戏(C语言)

目录 一、前言&#xff1a; 二、游戏规则&#xff1a; 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言&#xff1a; 用C语言完成扫雷游戏对于初学者来说&#xff0c;难度并不是很大&#xff0c;而且通…

一份轴承振动数据集摘引 - XJTU-SY2019

1.原始引用 我第一次看到这个数据集是在知乎&#xff1a; XJTU-SY数据集轴承故障诊断 - 知乎XJTU-SY数据集包含了3种工况下的15个滚动轴承的全寿命周期振动信号&#xff0c;且明确标注了每个轴承的失效部位&#xff0c;相关论文如下&#xff1a;[1]雷亚国,韩天宇,王彪,李乃鹏…

DS:经典算法OJ题(1)

创作不易&#xff0c;友友们给个三连呗&#xff01;&#xff01; 本文为经典算法OJ题练习&#xff0c;大部分题型都有多种思路&#xff0c;每种思路的解法博主都试过了&#xff08;去网站那里验证&#xff09;是正确的&#xff0c;大家可以参考&#xff01;&#xff01; 一、移…

常用芯片学习——LM2596芯片

LM2596 3A降压型稳压器 使用说明 LM2596开关电压调节器是降压型电源管理单片集成电路&#xff0c;能够输出最大3A的驱动电流&#xff0c;同时具有很好的线性和负载调节特性。芯片按照输出版本可分为四种&#xff0c;分别是3.3V、5V、12V、ADJ&#xff08;可调版本&#xff09…

一文读懂Python中的映射

python中的反射功能是由以下四个内置函数提供&#xff1a;hasattr、getattr、setattr、delattr&#xff0c;改四个函数分别用于对对象内部执行&#xff1a;检查是否含有某成员、获取成员、设置成员、删除成员。 获取成员: getattr class Foo:def __init__(self, name, age):se…

【command】使用nr简化npm run命令

参考文章 添加 alias nrnpm run通过alias启动命令可以帮助我们节省运行项目输入命令的时间 $ cd ~ $ vim .bash_profile $ source ~/.bashrc

应急响应-流量分析

在应急响应中&#xff0c;有时需要用到流量分析工具&#xff0c;。当需要看到内部流量的具体情况时&#xff0c;就需要我们对网络通信进行抓包&#xff0c;并对数据包进行过滤分析&#xff0c;最常用的工具是Wireshark。 Wireshark是一个网络封包分析软件。网络封包分析软件的…