相关文章推荐
爱吹牛的香烟  ·  java json文件写入-掘金·  2 年前    · 
大力的馒头  ·  How to convert UTC ...·  2 年前    · 
阳光的骆驼  ·  Java8 用 Stream ...·  2 年前    · 

写在前面:欢迎来到「发奋的小张」的博客。我是小张,一名普通的在校大学生。在学习之余,用博客来记录我学习过程中的点点滴滴,也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获!希望大家多多关照,我们一起成长一起进步。也希望大家多多支持我鸭,喜欢我就给我一个关注吧!

[题目] 设计一个学生学籍管理系统
学生信息包括:姓名、学号、性别和英语、数学、程序设计、体育成绩。
从键盘输入数据,建立数据文件student.dat。
实现对学生或学号查询,显示信息。
对所有学生,按照班级计算平均成绩。
分别按照英语、数学、程序设计和体育成绩排序生成结果文件。
[设计]建立student类存储学生信息,并通过vector输入学生数据、输出到文件、从文件读入学生数据,再进行下一步操作

#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
bool optNext();
//定义student类,存储学生信息
class student{
public:
	//构造函数
	student(fstream &);
	student(string, long, string, int, int, int, int)
		this->name = name;
		this->stuID = stuID;
		this->sex = sex;
		this->enSc = enSc;
		this->maSc = maSc;
		this->peSc = peSc;
		this->prSc = prSc;
	//获取学生信息
	//通过public类型函数访问private类型的学生数据
	int getEn(){
		return enSc;
	int getMa(){
		return maSc;
	int getPr(){
		return prSc;
	int getPe(){
		return peSc;
	//定义操作类
	friend bool disbyID(long);
	friend bool disbyName(string &);
	friend bool add();
	friend bool avgSc();
	friend bool resSc();
	friend bool readFile(fstream &infile);
	friend bool saveFile(ofstream &);
private:
	//定义学生属性
	string name;
	long stuID;
	string sex;
	int enSc;
	int maSc;
	int prSc;
	int peSc;
//存放学生信息,遍历学生信息
vector<student> vec;
vector<student>::iterator it;
bool readFile(fstream &infile){
	while (!infile.eof())
		vec.push_back(infile);
		infile.get();
	return true;
student::student(fstream &infile) {
	infile >> name;
	infile >> stuID;
	infile >> sex;
	infile >> enSc;
	infile >> maSc;
	infile >> prSc;
	infile >> peSc;
bool saveFile(ofstream &outfile){
	bool emptyCheck = true; //标志文件为空
	it = vec.begin();
	while (it != vec.end())
		if (!emptyCheck)  //读入文件
			outfile << endl;  //如果是空文件则不添加回车符,否则先添加回车符再输出下一条学生数据
		outfile << it->name << " " << it->stuID << " " << it->sex
			<< " " << it->enSc << " " << it->maSc << " " << it->prSc << " " << it->peSc;
		it++;
		emptyCheck = false;  //标志文件不为空
	return true;
//通过学号查找学生数据
bool disbyID(long id){
	it = vec.begin();
		if (it->stuID == id)  //如果找到了学号符合的学生数据则输出并结束查找
			cout << it->name << " " << it->stuID << " " << it->sex << " " << it->enSc << " " << it->maSc << " " << it->prSc << " " << it->peSc << endl;
			break;
		else it++;
	} while (it != vec.end());
	if (it == vec.end())  //如果查到最后一条数据也没有找到符合的学生则输出错误信息
		cout << "没有找到符合的学生ID!" << endl;
	return true;
//通过学生姓名查找学生数据
bool disbyName(string &name){
	it = vec.begin();
		if (it->name == name)  //如果找到了姓名符合的学生数据则输出并结束查找
			cout << it->name << " " << it->stuID <<




    
 " " << it->sex << " " << it->enSc << " " << it->maSc << " " << it->prSc << " " << it->peSc << endl;
			break;
		else it++;
	} while (it != vec.end());
	if (it == vec.end())  //如果查到最后一条数据也没有找到符合的学生则输出错误信息
		cout << "没有找到符合的学生姓名!" << endl;
	return true;
//添加一条新的学生数据
bool add(){
	string name;
	long stuID;
	string sex;
	int enSc;
	int maSc;
	int peSc;
	int prSc;
	cout << "请输入学生信息: " << endl;
	cout << "name: ";
	cin >> name;
	cout << "学生 ID: ";
	cin >> stuID;
	cout << "学生 性别[男/女]: ";
	cin >> sex;
	cout << "学生英语成绩: ";
	cin >> enSc;
	cout << "学生数学成绩: ";
	cin >> maSc;
	cout << "学生程序设计成绩: ";
	cin >> prSc;
	cout << "学生体育成绩: ";
	cin >> peSc;
	//将新添加的学生数据压栈入vector
	vec.push_back(student(name, stuID, sex, enSc, maSc, prSc, peSc));
	return true;
//计算学生每一门平均成绩
bool avgSc(){
	int i;
	float sumEn = 0, avgEn = 0;
	float sumMa = 0, avgMa = 0;
	float sumPr = 0, avgPr = 0;
	float sumPe = 0, avgPe = 0;
	it = vec.begin();
	for (i = 0; it != vec.end(); it++, i++)
		sumEn += (float)it->enSc;
		sumMa += (float)it->maSc;
		sumPr += (float)it->prSc;
		sumPe += (float)it->peSc;
	avgEn = sumEn / (float)i;
	avgMa = sumMa / (float)i;
	avgPr = sumPr / (float)i;
	avgPe = sumPe / (float)i;
	cout << "英语: " << avgEn << "  数学: " << avgMa << "  程序设计: " << avgPr << "  体育: " << avgPe << endl;
	return true;
//按照各门成绩排序方法
bool cmpEnglish(student a, student b)
	return a.getEn()>b.getEn();
bool cmpMath(student a, student b)
	return a.getMa()>b.getMa();
bool cmpProgramming(student a, student b)
	return a.getPr()>b.getPr();
bool cmpPE(student a, student b)
	return a.getPe()>b.getPe();
//按各门成绩排序并输出文件
bool resSc()
	ofstream outfile_en("English.dat", ios::out);  //打开English.dat文件并建立输入流
	if (!outfile_en){
		cout << "open error!" << endl;  //打开失败则报错
		exit(1);
	sort(vec.begin(), vec.end(), cmpEnglish);  //按照英语成绩排序
	vector<student>::iterator iter_en;
	for (iter_en = vec.begin(); iter_en != vec.end(); iter_en++)  //输出到文件
		outfile_en << iter_en->name << " " << iter_en->stuID << " " << iter_en->sex << " " << iter_en->enSc << " " << iter_en->maSc << " " << iter_en->prSc << " " << iter_en->peSc << endl;
	outfile_en.close();  //关闭输入流
	ofstream outfile_ma("Math.dat", ios::out);
	if (




    
!outfile_ma){
		cout << "open error!" << endl;
		exit(1);
	sort(vec.begin(), vec.end(), cmpMath);
	vector<student>::iterator iter_ma;
	for (iter_ma = vec.begin(); iter_ma != vec.end(); iter_ma++)
		outfile_ma << iter_ma->name << " " << iter_ma->stuID << " " << iter_ma->sex << " " << iter_ma->enSc << " " << iter_ma->maSc << " " << iter_ma->prSc << " " << iter_ma->peSc << endl;
	outfile_ma.close();
	ofstream outfile_pro("Program.dat", ios::out);
	if (!outfile_pro){
		cout << "open error!" << endl;
		exit(1);
	sort(vec.begin(), vec.end(), cmpProgramming);
	vector<student>::iterator iter_pr;
	for (iter_pr = vec.begin(); iter_pr != vec.end(); iter_pr++)
		outfile_pro << iter_pr->name << " " << iter_pr->stuID << " " << iter_pr->sex << " " << iter_pr->enSc << " " << iter_pr->maSc << " " << iter_pr->prSc << " " << iter_pr->peSc << endl;
	outfile_pro.close();
	ofstream outfile_pe("PE.dat", ios::out);
	if (!outfile_pe){
		cerr << "open error!" << endl;
		exit(1);
	sort(vec.begin(), vec.end(), cmpPE);
	vector<student>::iterator iter_pe;
	for (iter_pe = vec.begin(); iter_pe != vec.end(); iter_pe++)
		outfile_pe << iter_pe->name << " " << iter_pe->stuID << " " << iter_pe->sex << " " << iter_pe->enSc << " " << iter_pe->maSc << " " << iter_pe->prSc << " " << iter_pe->peSc << endl;
	outfile_pe.close();
	cout << "output succeed!" << endl;
	return true;
bool optNext(){
	string opt2;
	int exit_ck = 1;
	while (exit_ck) {  //循环结构,在选择每个选项后再次执行这一步
		cout << "A:查询学生ID" << endl;
		cout << "B:查询学生姓名" << endl;
		cout << "C:统计平均成绩" << endl;
		cout << "D:成绩保存到文件" << endl;
		cout << "X:退出" << endl;
		cin >> opt2;
		if (opt2 == "A") {
			long sID;
			cout << "请输入学生ID: " << endl;
			cin >> sID;
			disbyID(sID);
		if (opt2 == "B") {
			string sName;
			cout << "请输入学生姓名: " << endl;
			cin >> sName;
			disbyName(sName);
		if (opt2 == "C"){
			avgSc();
		if (opt2 == "D"){
			resSc();
		if (opt2 == "X")  //标记退出符号,在下次循环开始时退出
			exit_ck = 0;
	return true;
int main()
	string opt1;
	cout << "A:读取学生信息" << endl;
	cout << "B:新建学生信息" << endl;
	cin >> opt1;
	if (opt1 == "A") //read from existed file
		cout << "输入学生信息读取文件: " << endl;
		string fileName1;
		cin >> fileName1;
		fstream infile(fileName1);
		if (!infile) {
			cout << "文件打开失败!" << endl;
			exit(0);
		readFile(infile);
		optNext();
	else if (opt1 == "B"){  //enter new student data
		cout << "请输入添加的学生数量: " << endl;
		int n;
		cin >> n;
		for (int i = 0; i < n; ++i)
			add();
		cout << "信息添加成功,请输入保存的文件名: ";
		string fileName2;
		cin >> fileName2;
		ofstream outFile(fileName2, fstream::trunc | fstream::out);
		cout << "保存中......" << endl;
		saveFile(outFile);
		cout << "保存成功!" << endl;
		outFile.close();
		optNext();
	return 0;

在第一次建立输出到文件的函数时,没有考虑到回车符和eof,导致在最后一条数据输出到文件后多数出了一个回车符,在下次读入时会多读入一条空数据,解决方案是加入一个bool标记标志文件是否为空,当文件为空时不输出回车符,否则先输出回车符再输出下一条学生数据。

[运行结果]

系统截图如下
在这里插入图片描述

为了学校更加高效,快捷,方便的管理学生信息,并实现以下功能: (1)对学生信息进行录入:先输入学生的学籍,然后输入学生姓名,年龄,性别,籍贯,系别,专业,班级等,最后输入学生状态(入学)。 (2)对已录取的学生信息进行修改:可根据学号查询相对应的学生记录进行修改。 (3)显示已录取的学生信息:可以根据学号查询相对应的学生记录,然后输出该学生信息,也可以直接输出全体学生信息。 (4)删除已录取的学生信息:可以根据学号查询相对应的学生记录,然后删除该学生信息,也可以直接删除全体学生信息。 (5)统计所录取的学生信息:按性别统计学生的男女人数以及总人数。 (6)将学生信息从文件中读取:从文件中将学生信息读入程序。 (7)将学生信息存入文件中:把程序中的学生信息存入文件中。 在程序在录入数据和查询方面还是比较成功的,问题主要出现在排序和删除功能上面,对排序而言,只实现了对学分的排序,而没有实现对综合分和是的学分的排序。而删除则是因为没有了解文件的储存读取过程,无法实现对 2 个文件的同步操作。原因是缺少对课本第 11 章的了解,对文件的录入还缺少理解。不过通过实验发现自己的不足,我会去不断学习,加深对不足之处的理解。 课 程 设 计 报 告课程名称 面向对象程序设计课题名称专 业班 级学 号姓 名指导教师2022年 12 月 26日湖南工程学院课 程 设 计 任 务 书课程名称 面向对象程序设计课 题专业班级学生姓名学 号指导老师审 批任务书下达日期 2022年 12月 19日任务完成日期 2022 年 12月 26日一、设计内容与设计要求1.课程设计目的。 学生信息管理系统,实现学生信息包括:学号、姓名、性别、年龄、班级等信息。 小学生除了包括学生所有信息外,还包括英语、数学和语文成绩。 中学生除了包括小学生所有信息外,还包括地理、历史成绩、家庭住址等信息。 大学生除了包括学生所有信息外,还包括专业、家庭地址、联系方式等信息。 2、功能要求 (1)添加功能:(2)查询功能:(3)显示功能:(4)编辑功能:(5)删除功能:(6)统计功能:(7)保存功能:(8)读取功能: 资源下载地址:https://download.csdn.net/download/sheziqiong/85930262 资源下载地址:https://download.csdn.net/download/sheziqiong/85930262本课程设计是在学习面向对象基本理论之后的实践教学环节。该实践教学是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。学生通过课程设计在下述各方面得到锻炼:使用下面的数据 实验项目名称 学生学籍管理系统 一、实验目的 通过设计一个小型的应用系统,使学生进一步掌握面向对象的程序设计方法,运用C++中的类与对象的概念结合面向对象程序设计的思想,独立完成应用系统的设计,并养成良好的编程习惯。通过这个实践教学平台,培养学生对计算机应用系统的综合设计能力,培养学生正确分析和解决问题的能力,了解系统开发的过程,逐步熟悉程序设计的方法。 二、实验要求 设计一个程序,对学生的学籍信息进行管理。通过该系统实现对学生基本信息的录入、保存、删除、修改、查询等操作。 设计要求及提示如下: 学生信息管理系统其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面,对于前者要求建立起数据库一致性和完整性、安全性好的数据库。而对于后者则要求应用程序功能完备,易使用的特点。由电脑程序执行的管理系统广泛用于个人信息,物品信息的储存上,而学生信息管理系统对于每个学校来说都是现代化管理不可或缺的一部分。究其要点,学生信息管理系统正在朝着更快速,更便捷,更安全的发展,并且将成为现在及未来很长一段时间学校对学生信息管理的重要工具。 设计一个程序,对学生的学籍信息进行管理。通过该系统实现对学生基本信息的录入、保存、删除、修改、查询等操作。 设计要求及提示如下: 1、学生基本信息包括:学号、姓名、性别、年龄、班号、专业名称、系别等。 2、使用类和对象的概念实现程序设计。 3、以菜单形式显示各功能项。 4、各功能项如下: (1)学生基本信息的录入。 (2)学生基本信息的删除。 (3)学生基本信息的修改。 (4)学生基本信息的查询。 (a)按学号查询单个学生信息; (b)按姓名查询单个学生信息; (c)按性别查询学生信息; (d)按班号查询学生信息; (5)学生基本信息的统计。 (a)按性别统计学生人数; (b)按班号统计学生人数; (c)按年龄统计学生人数; (d)按系别统计学生人数; (6)退出系统。 5、执行某个功能之后,程序将重新显示菜单供用户选择。 6、将学生学籍信息保存到文件中。 我在源码中包了一些注释,相信大家可以看得明白。