学生信息管理系统
一个期末作业,做的比较急,只有基本功能。
一、综合设计要求
为了熟练使用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