学生信息管理系统

学生信息管理系统

一个期末作业,做的比较急,只有基本功能。
一、综合设计要求
为了熟练使用C++面对对象的相关知识,设计一个功能较为完善的学生信息管理系统。需要涵盖如下设计要点:
1、 设计语言:C++;
2、 设计平台为:Win32控制台应用程序或MFC对话框应用程序;
3、 开发平台:VC6.0 或 VS2010及各种版本,Ubuntu下的各种IDE设计环境,等等。
4、 程序结构:多文件结构,即一个类由头文件和实现文件组成。主函数实现类的相关功能。
5、 应该至少具备如下设计功能模块:该学生管理系统能添加,删除,查找,显示学生信息,能计算学生的优良等级,统计总人数,及格率及各分数段人数。能从文件中读取信息,并把修改过后总信息导入文件,在每次操作后刷新页面。支持读取txt文件,以便读入学生信息。将学生信息保存在二进制文件中,以便下次运行。
6、 应涵盖如下知识点:
a) 类,类的继承,运算符重载、虚函数、输入输出流和异常处理;
b) 构造函数和析构函数;
c) 构造函数中申请堆空间,析构函数中释放堆空间。
1、stu.h(里面的继承、虚函数只是为了满足要求,可以想其他方式)

#pragma once
using namespace std;

class human
{
public:
	char nums[10];
	char names[20];
	char sexs[10];
	virtual void set(char nums1[10],char names1[20],char sexs1[10])
	{
		strcpy_s(nums,nums1);
		strcpy_s(names, names1);
		strcpy_s(sexs, sexs1);
	}
};
class student :public human//继承人类
{
public:
	//char nums[10];//学号
	//char names[20];//姓名 
	//char sexs[10];//性别
	int cpps;
	virtual void set(char nums1[10], char names1[20], char sexs1[10],int cpps1)
	{
		strcpy_s(nums, nums1);
		strcpy_s(names, names1);
		strcpy_s(sexs, sexs1);
		cpps = cpps1;
	}
};

2、菜单

#pragma once
#include<iostream>
using namespace std;
void showmenu()
{
	cout << "*********************************************" << endl;
	cout << "******	学生信息管理系统	******" << endl;
	cout << "******	0.安全退出系统		******" << endl;
	cout << "******	1.文件读入学生信息(二进制txt)	******" << endl;
	cout << "******	2.录入新的学生信息	******" << endl;
	cout << "******	3.添加新的学生信息	******" << endl;
	cout << "******	4.删除已有学生信息	******" << endl;
	cout << "******	5.查找已有学生信息	******" << endl;
	cout << "******	6.修改已有学生信息	******" << endl;	
	cout << "******	7.统计学生信息		******" << endl;
	cout << "******	8.计算学生成绩等级	******" << endl;
	cout << "******	9.输出所有学生信息	******" << endl;
	cout << "******	10.文件读入学生信息(看得懂txt)	******" << endl;
	cout << "\n请选择";
}

3、这是学生系统类的头文件及源文件:
头文件

#pragma once
#include<string>
#include"stu.h"
#include<iostream>
using namespace std;

struct stunode
{
	char num[10];
	char name[20];
	char sex[10];
	int cpp;
	stunode *nextstu;
};

class Stusystem
{
	stunode *stulisthead;
public:
	Stusystem();
	~Stusystem();
	friend istream& operator>>(ifstream& is, student& stu);
	friend ostream& operator<<(ostream& os, const stunode& user);
	void creat();//创建学生信息表
	void insert(char snum[10], char sname[20], char ssex[10] ,int scpp);//插入学生信息
	void del(char snum[10]);//删除学生信息
	stunode *find(char num[10]);//查找学生信息,根据学号
	void modify(char snum[10]);//修改学生信息
	void classfy();//计算等级
	void readdat();//从文件读入学生信息
	void calgrade(char snum[10]);//计算学生等级
	void save();//保存学生信息到文件
	void quit();
	void show();//遍历学生信息
	void readtxt();
};

源文件

#include"manager.h"
#include<iostream>
#include<fstream>
using namespace std;

Stusystem::Stusystem()//构造函数
{
	stulisthead = new stunode;
	stulisthead->nextstu = NULL;
}

Stusystem::~Stusystem()//析构函数
{
	stunode *p;
	while (stulisthead)
	{
		p = stulisthead;
		stulisthead = stulisthead->nextstu;
		delete p;
	}
	stulisthead = NULL;
}

void Stusystem::creat()
{
	int n;
	stunode * p, *s;
	p = stulisthead;
	cout << "请输入学生人数";
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		s = new stunode;
		cout << "请输入学号,姓名,性别,cpp成绩:" << endl;
		cin >> s->num >> s->name >> s->sex >> s->cpp;
		if (find(s->num))
		{
			cout << "该学生已存在" << endl;
			return;
		}
		s->nextstu = p->nextstu;
		p->nextstu = s;
		p = p->nextstu;
	
	}
	if (p == NULL)
	{
		cout << "创建失败请重新创建!" << endl;
		creat();
	}
}
//遍历输出
void Stusystem::show()
{
	stunode *p;
	cout << "学号" << '\t' << "姓名" <<'\t'<< "性别" << '\t'<< "cpp成绩" << endl;
	for (p = stulisthead->nextstu; p != NULL; p = p->nextstu)
	{
		//cout << p;
		cout << p->num << '\t' << p->name <<'\t'<< p->sex << '\t' << p->cpp << '\t' << endl;
	}
}
//插入学生
void Stusystem::insert(char snum[10],char sname[20] ,char ssex[10] ,int scpp)
{
	stunode *s = new stunode, *p = stulisthead;
	
	strcpy_s(s->num, snum);
	if (find(s->num))
	{
		cout << "该学生已存在" << endl;
		return;
	}
	strcpy_s(s->name, sname);
	strcpy_s(s->sex, ssex);
	s->cpp = scpp;
	s->nextstu = p->nextstu;
	p->nextstu = s;
}
//删除学生信息
void Stusystem::del(char snum[10])
{
	stunode *p, *ptemp;
	p = stulisthead;
	ptemp = p;
	while (p->nextstu&&strcmp(p->num, snum) != 0)//
	{
		ptemp = p;
		p = p->nextstu;
	}
	if (strcmp(p->num, snum) == 0)
	{
		ptemp->nextstu = p->nextstu;//把目标学生的nextstu顺给ptemp然后删除该学生
		delete p;
	}
	else 
	{
		cout << "未找到该学生信息!" << endl;
	}
}
//查找学生
stunode *Stusystem::find(char snum[10])
{
	stunode *p;
	p = stulisthead;//不同
	while (p->nextstu&&strcmp(p->num, snum) != 0)
	{
		p = p->nextstu;
	}
	if (strcmp(p->num, snum) == 0)
	{
		return p;
	}
	else
	{
		cout << "未找到该学生" << endl;
		return NULL;
	}
}
//修改学生信息
void Stusystem::modify(char snum[10])
{
	stunode *itemstu = find(snum);//直接调用查找函数
	if (itemstu != NULL)
	{
		int item, scpp;
		char sname[20], ssex[10];
		printf("------------------\n");
		printf("1.修改姓名\n");
		printf("2.修改性别\n");
		printf("3.修改Cpp成绩\n");
		printf("4.退出本菜单\n");
		printf("------------------\n");
		while (1)
		{
			printf("请选择相应编号:");
			cin >> item;
			switch (item)
			{
			case 1:
				printf("请输入新的姓名:\n");
				cin >> sname;
				strcpy_s(itemstu->name, sname);
				break;//为学生姓名赋新值
			case 2:
				printf("请输入新的性别:\n");
				cin >> ssex;
				strcpy_s(itemstu->sex, ssex);
				break;//为学生性别赋新值
			case 3:
				printf("请输入新的C语言成绩:\n");
				cin >> scpp;
				itemstu->cpp = scpp; break;//为学生成绩赋新值
			case 4: {
				cout << "修改成功" << endl;
				return;
			}
			default:printf("请在1-5之间选择\n");
			}
		}
	}
}
//统计学生信息
void Stusystem::classfy()
{
	int grade[5] = { 0 };
	stunode *p = stulisthead->nextstu;
	while (p != NULL)
	{
		if (89 < p->cpp)
		{
			grade[0]++;
		}
		else if (79 < p->cpp && p->cpp < 90)
		{
			grade[1]++;
		}
		else if (69 < p->cpp && p->cpp < 80)
		{
			grade[2]++;
		}
		else if (59 < p->cpp && p->cpp < 70)
		{
			grade[3]++;
		}
		else
		{
			grade[4]++;
		}
		p = p->nextstu;
	}
	cout << "A" << '\t' << "B" << '\t' << "C" << '\t' << "D" << '\t' << "E" << endl;
	for (int i = 0; i < 5; i++)
	{
		cout << grade[i] << '\t';
	}
	cout << endl;
	float a = grade[0] + grade[1] + grade[2] + grade[3] + grade[4];
	float b = grade[0] + grade[1] + grade[2] + grade[3];
	cout << "总人数为:" << a << endl;
	if (a == 0)
	{
		cout << "及格率无法计算" << endl;
	}
	else
		cout << "及格率:" << b / a << endl;
}
//从二进制文件读入数据
void Stusystem::readdat()
{
	student stu;
	//stunode *p = stulisthead;
	string file;
	cout << "请输入文件名" << endl;
	cin >> file;
	ifstream in(file, ios::binary| ios::in);
	if (!in)
	{
		throw "没有学生信息,请先录入学生信息!";
	}
	else
	{
		while (in.peek() != EOF)
		{
			in.read((char*)&stu, sizeof(student));//从文件读出所有学生信息
			insert(stu.nums, stu.names, stu.sexs, stu.cpps);
		}
		in.close();
	}
}
//保存学生信息
void Stusystem::save()
{
	student stu;
	string file;
	cout << "请输入文件名" << endl;
	cin >> file;
	stunode *p = stulisthead->nextstu;
	ofstream out(file, ios::out | ios::binary );
	if (!out)
	{
		throw "不能打开文件";
	}
	else
	{
 		while (p != NULL)
		{
			strcpy_s(stu.nums, p->num);
			strcpy_s(stu.names, p->name);
			strcpy_s(stu.sexs, p->sex);
			stu.cpps = p->cpp;
			out.write((char*)&stu, sizeof(student));
			p = p->nextstu;
		}
	out.close();
	}
}
//退出系统
void Stusystem::quit()
{
	char choice;
	cout << "是否保存学生信息:?(Y/N)" << endl;
	cin >> choice;
	if (choice == 'y' || choice == 'Y')
	{
		save();
		cout << "学生信息已保存..." << endl;
	}
}
//计算学生成绩等级
void Stusystem::calgrade(char snum[10])
{
	stunode *p;
	p = find(snum);
	if (89 < p->cpp)
	{
		cout << "该学生等级为:" << 'A';
	}
	else if (79 < p->cpp && p->cpp < 90)
	{
		cout << "该学生等级为:" << 'B';

	}
	else if (69 < p->cpp && p->cpp < 80)
	{
		cout << "该学生等级为:" << 'C';

	}
	else if (59 < p->cpp && p->cpp < 70)
	{
		cout << "该学生等级为:" << 'D';

	}
	else
	{
		cout << "该学生等级为:" << 'E';

	}
}
//
void Stusystem::readtxt()
{
	student stu;
	string file;
	cout << "请输入文件名" << endl;
	cin >> file;
	ifstream in(file, ios::in);
	if (!in.is_open())
	{
		throw "没有学生信息,请先录入学生信息!";
	}
	else
	{
		while (in.peek() != EOF)
		{
			//in >> stu;
			in >> stu.nums;
			in >> stu.names;
			in >> stu.sexs;
			in >> stu.cpps;
			insert(stu.nums, stu.names, stu.sexs, stu.cpps);
		}
		in.close();
	}
}
//重载运算符
istream & operator>>(ifstream & is, student & stu)
{
	is >> stu.nums >> stu.names >> stu.sexs >> stu.cpps;
	return is;// TODO: 在此处插入 return 语句
}
ostream & operator<<(ostream & os, const stunode & user)
{
	os << user.num << '\t' << user.name << '\t' << user.sex << '\t' << user.cpp << '\t' << endl;
	return os;// TODO: 在此处插入 return 语句
}

4、main()函数

#include<iostream>
#include"manager.h"
#include"menu.h"
using namespace std;

int main()
{
	int x = 100, cpp1;
	char name1[20], sex1[10], num1[10];
	stunode *p1;
	Stusystem stusystem;
	cout << "   ******************************************" << endl;
	cout << "   ******************************************" << endl;
	cout << "   ******                              ******" << endl;
	cout << "   ******   欢迎进入学生信息管理系统   ******" << endl;
	cout << "   ******                              ******" << endl;
	cout << "   ******************************************" << endl;
	cout << "   ******************************************" << endl;
	while (x != 0)
	{
		system("pause");
		system("cls");//清屏
		showmenu();
		cin >> x;
		switch (x)
		{
		case 0:
			try//异常处理
			{
				stusystem.quit();
			}
			catch (const char* msg) { cerr << msg << endl; }
			break;
		case 1:
			stusystem.readdat();
			cout << "读入学生信息表:" << endl;
			stusystem.show();
			break;
		case 2:
			stusystem.creat();
			cout << "请核对输入学生信息!" << endl;
			stusystem.show();
			break;
		case 3:
			cout << "请输入添加学生信息:";
			cin >> num1 >> name1 >> sex1 >> cpp1;
			stusystem.insert(num1,name1,sex1,cpp1);
			cout << "更新学生信息表..." << endl;
			stusystem.show();
			break;
		case 4:
			cout << "请输入要删除学生学号:";
			cin >> num1;
			stusystem.del(num1);
			cout << "更新学生信息表..." << endl;
			stusystem.show();
			break;
		case 5:
			cout << "请输入要查找学生学号:";
			cin >> num1;
			p1 = stusystem.find(num1);
			cout << "查找学生学号:" << p1->num << " 姓名:" << p1->name << " 性别: " << p1->sex << " cpp: " << p1->cpp << endl;
			break;
		case 6:
			cout << "请输入要修改学生学号:";
			cin >> num1;
			stusystem.modify(num1);
			cout << "修改成功!" << endl;
			cout << "更新学生信息表..." << endl;
			stusystem.show();
			break;
		case 7:
			cout << "统计学生信息:"<<endl;
			stusystem.classfy();
			break;
		case 8://计算学生成绩等级
			cout << "请输入学号";
			cin >> num1;
			stusystem.calgrade(num1);
			break;
		case 9:
			stusystem.show();
			break;
		case 10:
			try {//异常处理
				stusystem.readtxt();
			}
			catch (const char*msg) 
			{
				cerr << msg << endl;
			}
			cout << "读入学生信息表txt:" << endl;
			stusystem.show();
			break;
		default:
			cout << "请输入正确的数字选择" << endl;
		}
	}
	system("pause");
	return 0;
}

参考博客:链表的使用
https://blog.csdn.net/CSDNzyq/article/details/50541051

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值