题目

设计一个程序,对学生的学籍信息进行管理。通过该系统实现对学生基本信息的录入、保存、删除、修改、查询等操作。
设计要求及提示如下:
1、学生基本信息包括:学号、姓名、性别、年龄、班号、专业名称、系别等。
2、使用类和对象的概念实现程序设计。
3、以菜单形式显示各功能项。
4、各功能项如下:
(1)学生基本信息的录入。
(2)学生基本信息的删除。
(3)学生基本信息的修改。
(4)学生基本信息的查询。
(a)按学号查询单个学生信息;
(b)按姓名查询单个学生信息;
©按性别查询学生信息;
(d)按班号查询学生信息;
(5)学生基本信息的统计。
(a)按性别统计学生人数;
(b)按班号统计学生人数;
©按年龄统计学生人数;
(d)按系别统计学生人数;
(6)退出系统。
5、执行某个功能之后,程序将重新显示菜单供用户选择。
6、将学生学籍信息保存到文件中。

心得

文件流
C++标准库头文件—#include<fstream>,包含:ofstream,ifstream,fstream

open打开文件,close关闭文件
主要注意的是同个文件可同时被打开多次,但是不可以在同个作用域内同时进行IO处理,所以在函数内打开文件并对它处理的时候,记得在最后关闭文件。

ios::in 从文件读取信息
ios::out 向文件写入信息
ios::app 所有写入都追加到文件末尾
ios::trunc 清空文件后打开文件

读取文件内容一般使用getchar读取一个字母和getline读取一行字符串
eof()函数的判断文件指针是否在最后,故配合eof()可以进行对文件行数的统计等

fstream file(filename,ios::out);
string s;
int row=0;//行数
while(!file.eof())
{getline(file,line);row++;
}

切记勿直接对文件处理,而是把文件的数据先存储到计算机中,再对计算机内的容器进行操作。
例如:在学生信息管理系统中需要定义个student的类,我们就可以定义一个vector<student>的数组存储它;while循环中每次getline一个字符串string后,对字符串进行遍历,巧妙对空格进行判断,让对应的子串赋值给对应的数据,记的留类变量的接口。

friend void read(string filename, vector<student>& a)//文本读出{fstream file(filename, ios::in);string line;getline(file, line);//先读取文件最顶行的说明保证它不影响数据存储while (!file.eof()){student* temp = new student;string  str = "", s[10];int num = 0;getline(file, line, '\n');for (int i = 0; i < line.size(); i++){if ((line[i] == ' ' || line[i] == '\t') && str != "") {s[num] = str;num++;str = "";}else if (line[i] != ' ' && line[i] != '\t')str += line[i];}s[num] = str;if (s[0] != "" && s[1] != "" && s[2] != "" && s[3] != "" && s[4] != "" && s[5] != "" && s[6] != ""){temp->SetInformation(s[0], s[1], s[2], s[3], s[4], s[5], s[6]);//学号 姓名 性别 年龄 班级 专业 系别a.push_back(*temp);}delete temp;}file.close();}
//把修改好的学生信息内容,从vector容器中入读文本,向文本写入friend void wirte(string filename, vector<student>a){fstream file(filename, ios::out | ios_base::trunc);file << std::right << "学号" << setw(10) << "姓名" << setw(10) << "性别" << setw(10) << "年龄" << setw(10) << "班级"<< setw(10) << "专业" << setw(10) << "系别" << endl;for (int i = 0; i < a.size(); i++){file << a[i].GetId() << setw(10) << a[i].GetName() << setw(10) << a[i].GetSex() << setw(10)<< a[i].GetAge() << setw(10) << a[i].GetClubm() << setw(10) << a[i].GetMajor()<< setw(10) << a[i].GetDepartment() << endl;}file.close();}

在对学生信息进行操作管理,
添加,new一个student,最后push_back;

friend void input(vector<student>& a){cout << "请输入学生的学号、姓名、性别(male or female)、年龄、班级、专业、系别(请用空格隔开每个输入)" << endl;student* temp = new student;string mId, mName, mSex, mAge, mClubm, mMajor, mDepartment;cin >> mId >> mName >> mSex >> mAge >> mClubm >> mMajor >> mDepartment;temp->SetID(mId); temp->SetName(mName); temp->SetSex(mSex);temp->SetAge(mAge); temp->SetMajor(mMajor); temp->SetDepartment(mDepartment);a.push_back(*temp);delete temp;cout <<setw(12)<< "添加成功" << endl;}

删除,先找到要删除的学生,从这个删除的学生开始,让前一名学生等于后一名学生,最后resize让数组的长度减1;

friend void remove(vector<student>&a, int row)//删除{int msize = a.size();for (int i = row - 1; i < msize-1; i++)a[i] = a[i + 1];a.resize(msize - 1);cout << setw(10) << "删除成功" << endl;}

修改,先找到要修改的学生,直接对学生信息进行修改,若修改的函数为为友元函数,需要定义SetValie()和GetValue()的接口

friend void modify(vector<student>& a, int row)//修改{cout << "修改人员的完整信息:姓名、性别(male or female)、类别、系别、专业、职称(请用空格隔开每个输入)" << endl;string mId, mName, mSex, mAge, mClubm, mMajor, mDepartment;cin >> mId >> mName >> mSex >> mAge >> mClubm >> mMajor >> mDepartment;a[row-1].SetID(mId); a[row - 1].SetName(mName); a[row - 1].SetSex(mSex);a[row - 1].SetAge(mAge); a[row - 1].SetMajor(mMajor); a[row - 1].SetDepartment(mDepartment);cout << "修改成功" << endl;}

个人查询:直接暴力匹配关键词key就行这里就不演示了

统计:利用map<string,int>统计可以,种类就等于map对应的size(),分别输出的话直接for遍历即可,

friend void stat_sex(vector<student>a)//性别统计{map<string, int>num_sex;for (int i = 0; i < a.size(); i++)num_sex[a[i].GetSex()]++;for (auto it : num_sex)cout << setw(10) << it.first << ":" << it.second << endl;}

完整源码

// I am so vegetable
//made by HRdate,2020-6-29
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<string>
#include<iomanip>
#include<set>
#include<map>
#include<conio.h>
using namespace std;
#define endl '\n'class student
{public://构造函数student() {};student(string mid, string mname, string msex, string mage, string mclubm, string mmajor, string mdepartment){id = mid, name = mname, sex = msex, age = mage, clubm = mclubm, major = mmajor, department = mdepartment;}//析构函数~student() {};//大接口,便于在类外初始化修改类对象的私有变量void SetInformation(string mid, string mname, string msex, string mage, string mclubm, string mmajor, string mdepartment){id = mid, name = mname, sex = msex, age = mage, clubm = mclubm, major = mmajor, department = mdepartment;}//小接口,获取string GetId() { return id; }string GetName() { return name; }string GetSex() { return sex; }string GetAge() { return age; }string GetClubm() { return clubm; }string GetMajor() { return major; }string GetDepartment() { return department; }//小接口,赋值void SetID(string mId) { id = mId; }void SetName(string mName) { name = mName; }void SetSex(string mSex) { sex = mSex; }void SetAge(string mAge) { age = mAge; }void SetClubm(string mClubm) { clubm = mClubm; }void SetMajor(string mMajor) { major = mMajor; }void SetDepartment(string mDepartment) { department = mDepartment; }//把文本中的数据转化为字符串,通过对字符串空格的处理,使得相应的数据通过SetInformation类接口赋值给vector<student>中的对应的变量friend void read(string filename, vector<student>& a){fstream file(filename, ios::in | ios::out);string line;getline(file, line);while (!file.eof()){student temp;string  str = "", s[10];int num = 0;getline(file, line);for (int i = 0; i < line.size(); i++){if ((line[i] == ' ' || line[i] == '\t') && str != "") {s[num] = str;num++;str = "";}else if (line[i] != ' ' && line[i] != '\t')str += line[i];}s[num] = str;if (s[0] != "" && s[1] != "" && s[2] != "" && s[3] != "" && s[4] != "" && s[5] != "" && s[6] != ""){temp.SetInformation(s[0], s[1], s[2], s[3], s[4], s[5], s[6]);a.push_back(temp);}}file.close();}//把修改好的学生信息内容,从vector容器中入读文本,向文本写入friend void write(string filename, vector<student>a){fstream file(filename, ios::out | ios_base::trunc);file << "学号"<<'\t'<< "姓名" << '\t' << "性别" << '\t' << "年龄" << '\t' << "班级"<< '\t' << '\t' << "专业" << '\t' << '\t' << "系别" << endl;for (int i = 0; i < a.size(); i++){file << a[i].GetId() << '\t' << a[i].GetName() << '\t' << a[i].GetSex() << '\t'<< a[i].GetAge() << '\t' << a[i].GetClubm() << '\t' << '\t' << a[i].GetMajor()<< '\t' << '\t' << a[i].GetDepartment() << endl;}file.close();}//输出显示选定的人员信息friend void display(vector<student>a){cout << "学号" << '\t' << "姓名" << '\t' << "性别" << '\t' << "年龄" << '\t' << "班级"<< '\t' << '\t' << "专业" << '\t' << '\t' << "系别" << endl;for (int i = 0; i < a.size(); i++){cout << a[i].GetId() << '\t' << a[i].GetName() << '\t' << a[i].GetSex() << '\t'<< a[i].GetAge() << '\t' << a[i].GetClubm() << '\t' << '\t' << a[i].GetMajor()<< '\t' << '\t' << a[i].GetDepartment() << endl;}}// I am so vegetable
//made by HRdate,2020-6-29//录入一个学生的信息,new一个student对象,通过SetID等接口可在类外直接定义修改private的成员变量,最后push_back进原容器vector中friend void input(vector<student>& a){cout << "请输入学生的完整信息:学号、姓名、性别(男 or 女)、年龄、班级、专业、系别(请用空格隔开每个输入)" << endl;student temp;string mId, mName, mSex, mAge, mClubm, mMajor, mDepartment;cin >> mId >> mName >> mSex >> mAge >> mClubm >> mMajor >> mDepartment;temp.SetID(mId), temp.SetName(mName), temp.SetSex(mSex), temp.SetAge(mAge);temp.SetClubm(mClubm); temp.SetMajor(mMajor); temp.SetDepartment(mDepartment);a.push_back(temp);cout << '\t' << '\t' << "添加成功" << endl;}//删除指定学生的信息,从这指定的学生开始,让后一个student赋值给前一个student,往前叠加,最后resize修改一下vector容器大小friend void remove(vector<student>&a, int row)//删除{int msize = a.size();for (int i = row ; i < msize-1; i++)a[i] = a[i + 1];a.resize(msize - 1);cout << '\t' << '\t' << "删除成功" << endl;}//修改指定学生的信息friend void modify(vector<student>& a, int row){cout << "修改学生的完整信息:学号、姓名、性别(男 or 女)、年龄、班级、专业、系别(请用空格隔开每个输入)" << endl;string mId, mName, mSex, mAge, mClubm, mMajor, mDepartment;cin >> mId >> mName >> mSex >> mAge >> mClubm >> mMajor >> mDepartment;a[row].SetID(mId); a[row].SetName(mName); a[row].SetSex(mSex); a[row].SetAge(mAge);a[row ].SetClubm(mClubm);a[row ].SetMajor(mMajor); a[row ].SetDepartment(mDepartment);cout << "修改成功" << endl;}//根据学号查询个人friend int find_id(string key_id, vector<student>a){for (int i = 0; i < a.size(); i++)if (a[i].GetId() == key_id)return i;}//根据姓名查询个人friend int find_name(string key_name, vector<student>a){for (int i = 0; i < a.size(); i++)if (a[i].GetName() == key_name)return i ;}//根据性别查询friend void find_key_sex(string key_sex, vector<student>a, vector<student>& b){b.clear();for (int i = 0; i < a.size(); i++){if (a[i].GetSex() == key_sex)b.push_back(a[i]);}//cout << key_sex << "查询成功" << endl;}//根据班级查询friend void find_key_clubm(string key_clubm, vector<student>a, vector<student>& b){b.clear();for (int i = 0; i < a.size(); i++){if (a[i].GetClubm() == key_clubm)b.push_back(a[i]);}//cout << key_clubm << "查询成功" << endl;}//性别统计friend void stat_sex(vector<student>a){map<string, int>num_sex;for (int i = 0; i < a.size(); i++)num_sex[a[i].GetSex()]++;for (auto it : num_sex)cout << setw(10) << it.first << ":" << it.second << endl;}//班号统计friend void stat_clubm(vector<student>a){map<string, int>num_clubm;for (int i = 0; i < a.size(); i++)num_clubm[a[i].GetClubm()]++;for (auto it : num_clubm)cout << setw(10) << it.first << ":" << it.second << endl;}//年龄统计friend void stat_age(vector<student>a){map<string, int>num_age;for (int i = 0; i < a.size(); i++)num_age[a[i].GetAge()]++;for (auto it : num_age)cout << setw(10) << it.first << ":" << it.second << endl;}//系别统计friend void stat_department(vector<student>a){map<string, int>num_department;for (int i = 0; i < a.size(); i++)num_department[a[i].GetDepartment()]++;for (auto it : num_department)cout << setw(10) << it.first << ":" << it.second << endl;}private:string id, name, sex, age, clubm, major, department;//学号 姓名 性别 年龄 班级 专业 系别
};int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);string filename = "E:\\text2.txt";//文件名fstream file(filename, ios::in | ios::out);if (!file) {cout << "打开文件失败,请重新输入。" << endl;return 0;}else {cout << "打开文件成功。" << endl;}vector<student>a, b;//vector不定数组存储数据read(filename, a);while (1){int check = 0;//菜单选择步骤string key;//查询关键词for (int i = 0; i < 70; i++)cout << '*';cout << endl;cout << "*" << setw(32) << "菜单" <<setw(37)<< "*" << endl;cout << "*" << setw(40) << "输入0:退出系统保存" <<setw(29)<<"*" << endl;cout << "*" << setw(40) << "输入1:显示当前文本" << setw(29) << "*" << endl;cout << "*" << setw(40) << "输入2:删除学生信息" << setw(29) << "*" << endl;cout << "*" << setw(40) << "输入3:修改学生信息" << setw(29) << "*" << endl;cout << "*" << setw(40) << "输入4:查询个人信息" << setw(29) << "*" << endl;cout << "*" << setw(40) << "输入5:查询学生信息" << setw(29) << "*" << endl;cout << "*" << setw(40) << "输入6:统计学生信息" << setw(29) << "*" << endl;cout << "*" << setw(40) << "输入7:添加学生信息" << setw(29) << "*" << endl;for (int i = 0; i < 70; i++)cout << '*';cout << endl;cin >> check;if (check == 0)//退出系统保存break;else if (check == 1) {//显示当前文本display(a);}else if (check == 2) //删除学生信息{cout << "1:按学号找到删除单个学生信息" << endl << "2:按姓名找到删除单个学生信息" << " (输入0:退出)" << endl;cin >> check;if (check == 1){cout << "请输入删除单个学生的学号:" << endl;cin >> key;remove(a, find_id(key, a));}else if (check == 2) {cout << "请输入删除单个学生的姓名:" << endl;cin >> key;remove(a, find_name(key, a));}}else if (check == 3)//修改学生信息{cout << "1:按学号找到修改单个学生信息" << endl << "2:按姓名找到修改单个学生信息" << " (输入0:退出)" << endl;cin >> check;if (check == 1){cout << "请输入修改单个学生的学号:" << endl;cin >> key;modify(a, find_id(key, a));}else if (check == 2) {cout << "请输入修改单个学生的姓名:" << endl;cin >> key;modify(a, find_name(key, a));}}else if (check == 4)//查询个人信息{cout << "1:按学号查询单个学生信息" << endl << "2:按姓名找到查询单个学生信息" << " (输入0:退出)" << endl;cin >> check;if (check == 1){cout << "请输入查询单个学生的学号:" << endl;cin >> key;vector<student>c;c.push_back(a[find_id(key, a) - 1]);display(c);}else if (check == 2) {cout << "请输入查询单个学生的姓名:" << endl;cin >> key;vector<student>c;c.push_back(a[find_name(key, a) - 1]);display(c);}}else if (check == 5)//查询学生信息{cout << "1:按性别查询学生信息" << endl << "2:按班号查询学生信息" << " (输入0:退出)" << endl;cin >> check;if (check == 1){cout << "请输入查询学生的性别:" << endl;cin >> key;vector<student>c;find_key_sex(key, a, c);display(c);}else if (check == 2){cout << "请输入查询学生的班号:" << endl;cin >> key;vector<student>c;find_key_clubm(key, a, c);display(c);}}else if (check == 6)//统计学生信息{cout << "1:按性别统计学生人数" << endl << "2:按班别统计学生人数" << endl << "3:按年龄统计学生人数" << endl<< "4:按系别统计学生人数" <<endl<< " (输入0:退出)" << endl;cin >> check;if (check == 1){stat_sex(a);}else if (check == 2){stat_clubm(a);}else if (check == 3){stat_age(a);}else if (check == 4){stat_department(a);}}else if (check == 7)//添加学生信息{input(a);}//getchar();// system("cls"); 清屏}write(filename, a);file.close();return 0;
}

C++学生信息管理系统(含文件流)部分心得含源码相关推荐

  1. python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——增删改查篇

    python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)--增删改查篇 前言 一.主界面的样式 二.学生信息的增,删,改,查 1.增加学生信息 2.删除学生信息 3.更改学 ...

  2. 基于C语言的学生信息管理系统_(更新版)_(附源码和安装包)_课程设计_☆*往事随風*☆的博客

    学生信息管理系统 一.需求 基于C语言编写一个学生信息管理系统来实现对学生成绩的管理(数学.C语言.英语),系统要能够实现基本的增.删.改.查等功能,在此基础上还可以自由发挥,要求使用到数组.文件.排 ...

  3. 学生信息管理系统的设计与实现 计算机毕设源码70168

    摘要 从20年代开始,计算机疯狂的出现在人们的生活以及工作当中,成为人们生活.工作的好帮手,计算机深入到每家每户当中,网络办公,网络教学更是替换了传统手工记录管理的方式,使用计算机办公可以不必局限于固 ...

  4. java ee 员工管理系统,fb3492 javaEE_原生Servlet_MySql企业员工信息管理系统的设计与实现,java源码含论文与答辩PPT...

    fb3492 javaEE_原生Servlet_MySql企业员工信息管理系统的设计与实现,java源码含论文与答辩PPT 存储:百度网盘 --/资源热下载站/VIP源码/Java源码/fb3492 ...

  5. C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码、有过程截图

    C++课程设计实训_基于多态书籍信息管理系统的设计与实现.附源码,有过程截图 书籍信息管理系统的设计与实现(基于多态) 学生姓名: 学 号: 指导老师: 所 在 系: 专 业: 班 级: C++课程设 ...

  6. 基于JAVA汽车售后服务信息管理系统的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA汽车售后服务信息管理系统的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA汽车售后服务信息管理系统的设计与实现计算机毕业设计源码+系统+mysql数据库+ ...

  7. 学生管理系统c语言的作用,C语言实现学生信息管理系统(文件版)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 下面是我自己用写的学生信息管理系统,为了增加数据的利用率,分为学生端和教师端,同时实现账号密码登录,以文件的形式将其 ...

  8. Python学生公寓管理系统的设计与实现 毕业设计-附源码181047

    Python学生公寓管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的到来已成为不可阻挡的 ...

  9. 数据库课程设计-学生选课管理系统(实训报告+答辩ppt+源码+sql文件+打包好的程序)springboot项目-javaweb

    作者:ChenZhen 博客地址:https://www.chenzhen.space/ 版权:本文为博主 ChenZhen 的原创文章,本文版权归作者所有,转载请附上原文出处链接及本声明. 如果对你 ...

最新文章

  1. Python数据挖掘2:pandas使用:Series一串数字和DataFrame数据框
  2. Exchange EMC打开出错 解决
  3. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战
  4. idea 与springboot 快捷键
  5. php 垃圾回收机制----写时复制和引用计数
  6. 一文读懂深度学习:从神经元到BERT
  7. php package manager,package命令的安装教程
  8. perl-regexp_使用Regexp :: Common在Perl中轻松进行数据验证
  9. 【转】C++从零实现神经网络
  10. K-means聚类分析算法(二)
  11. 创建一个urdf机器人_Matlab官方机器人工具箱Robotics System Toolbox官网翻译教程2
  12. AI智能中的OCR 少数民族文字识别-维吾尔文字识别
  13. Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片
  14. python中的snip用法_简单说说SNIP
  15. 大梦谁先觉 --伍立杨
  16. OpenCV特征检测出现Unhandled exception at……Access violation reading location 0x00000000.
  17. 配合好OpenStack和开源MANO,就能部署好NFV
  18. 随手科技企业入选互联网金融协会增选常务理事,消除随手记投资靠谱吗
  19. MySQL登录时出现 Access denied for user“xxx” ‘‘@‘xxx.xxx.xxx.xxx‘ (using password: YES) 的原因及解决办法
  20. android 打开其它app,Android 在一个APP里打开另一个APP

热门文章

  1. 平板电脑能安装java_手机上能安装的应用,平板电脑上是不是都能安装
  2. oracle 分组 排名,Oracle数据库之分组查询及排序
  3. 使用TPC控制UR3机器臂python代码
  4. 小白借助视频云平台搭建企业级连锁监控平台
  5. 【转】清除cookie的两个方法
  6. 通俗讲义 | 深入浅出云计算、大数据、人工智能
  7. storm是java还是python_Storm与Spark、Hadoop相比是否有优势
  8. Altair Activate 2021.1 x64
  9. 用友U8cloud智能财务精细管控
  10. 基于有理逼近算法的序列密码的有理分数表示(全国高校数学密码挑战赛)