高校水电费管理系统
一、设计要求:
1、程序包含学生信息:学号、姓名、性别、年龄、班级、用电量、用水量等。
2、程序包含教工信息:职工号、姓名、性别、年龄、工作部门、用电量、用水量等。
3、定义一个人员类,实现学生和教工共同的信息和行为。
4、功能要求:
(1)添加功能:程序能够添加不同学生和教工的记录,提供选择界面供用户选择所要添加的类别,要求编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据姓名、用水量、用电量信息对已添加的学生或教工记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
(3)显示功能:可显示当前系统中所有学生和教工的记录,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5)删除功能:主要实现对已添加的学生或教工记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。
(6)统计功能:能根据多种参数进行统计。能统计学生和教工的用水用电量、所要交纳的电费和水费、未交纳水电费的人员信息等。
(7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。
(8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。
(9)计算功能:学生每月都有一定额度的水电是免费使用的,超过的部分需要交费。
二、基本功能描述:
1、学生或教工可以依靠此程序,在注册自己的个人信息之后,进行用水量和用电量的登记,系统会根据学生或教工所提供的信息计算出其所需交的水费和电费。
2、学生或教工可以依靠系统进行信息查询以获取个人所需上缴的水电费,经密码核对后,若与注册个人信息时所输密码一致,则显示相应信息,包括:学号、姓名、性别、年龄、班级、用电量、用水量,本月所需上缴水费,本月所需上缴电费。
3、系统支持辅导员访问所有学生信息,班导师访问本班所有同学信息,从而给未按时上缴水电费的同学们及时的提醒。
4、系统支持学生端(或教工端)展示所有学生(或教工)的信息,同时也提供学生(或教工)团体的全部用水量,用电量及水电费,以对比自己信息从而进行用水用电的约束。
5、如果注册时个人信息填报有错误,或后续需要更新用水量和用电量,系统支持修改注册时的个人信息。
6、对于毕业生或退学生,系统支持其删除个人信息。
7、系统支持学生或教工在系统内经身份验证后(验证输入的个人密码与注册时的是否一致)进行缴费。
8、系统支持将当前系统中成员信息存入txt文件中,也可以将保存在文件中的信息读入到当前系统中,供用户进行查看。
三、设计思路
3.1如图是系统的流程图:
图3.1.1 学生端流程图
图3.1.2 教工端流程图
图3.1.3 导师端流程图
3.2.1 系统页面主菜单页面:
3.2.2 学生端水电费管理系统的页面:
3.2.3 教工水电费管理系统的页面:
高校的学生或教工可以根据所需要的功能进行数字0~9的输入,从而进行功能的选择。
3.2.4导师查询端口页面:
四、软件设计
4.1 设计步骤
打开Code::Blocks中点击Create a new project,在选择页面中点击console application,选择C++ selection,设置Project title后编写代码。
4.2 头文件中所储信息
1)individual.h头文件:
包括人员类的定义(class Individual),类中包含protected类型的个人信息的声明,包括:姓名(string)、性别(string)、年龄(int)、学号或职工号(int)、个人密码(string)、用水量(int)、用电量(int)、水费(int)、电费(int)。类中还包含功能函数的声明(信息输入,信息输出,缴费函数,计算水费,计算电费)及部分功能函数的定义(获取protected类型中信息的功能函数)。
2)student.h头文件:
包含基于Individual类的学生类的定义(class Student),类中包含public类型的学生班级(string),学生类虚函数(学生信息输入,学生信息输出),重载函数(学生信息编辑函数),友元函数(左移运算符重载,输出Student类中的信息)的声明。
3)Student_message.h头文件:
包含学生信息类的定义(class Student_message),类中包含protected类型的学生数量(int)、学生信息数组(Student);public类型的重载函数和功能函数的声明。(功能有:添加,查询,显示,修改,删除,统计,保存,读取,缴费)
4)Teacher.h头文件:
包含基于Individual类的教工类的定义(class Teacher),类中包含public类型的教工所在部门(string)、班导师所带班级(string),教工类虚函数(教工信息输入,教工信息输出),重载函数(教工信息编辑函数)的声明。
5)Teacher_message.h头文件:
包含教工信息类的定义(class Teacher_message),类中包含protected类型的教工数量(int)、教工信息数组(Teacher);public类型的重载函数和功能函数的声明。(功能有:添加,查询,显示,修改,删除,统计,保存,读取,缴费)
6)people.h头文件:
包含多继承于Student_message和Teacher_message的人员信息类的定义,类中包含public类型的指向学生信息数组(Student)的指针的定义,指向教工信息数组(Teacher)的指针的定义,输出全系学生信息函数的声明和输出全班学生信息函数的声明。
4.3 关键功能的实现
1)主函数中进行身份选择:
运用switch语句进行选择,输入1,清屏后调用学生菜单函数,进入学生端系统;输入2,清屏后调用教工菜单函数,进入教工端系统;输入3,清屏后调用导师菜单函数,进入教工端系统。输入0,清屏后提示“您已退出系统,欢迎下次使用”并退出系统;输入其他则提示“选择错误,请重试”。
switch (choice)
{
case 1: system("cls");
studentMenu(); break;//清屏后调用学生菜单函数,进入学生端系统
case 2: system("cls");
teacherMenu(); break;//清屏后调用教工菜单函数,进入教工端系统
case 3:system("cls");
guideMenu();break;//清屏后调用导师菜单函数,进入导师查询端口
case 0: system("cls");
cout<<"....... " ;break;//清屏后输出退出提示页面(字符串过长不作展示)
default:system("cls");
cout << "选择错误,请重试! " << endl; break;
2)学生端(教工端)系统进行功能选择:(以学生端为例)
首先建立一个Student_message类型的对象student,运用switch语句进行功能选择,输入数字1~9后按回车,则在清屏后用刚定义的对象student调用相应功能函数(add,search,show,compile,deleting,statistics,saving,reading,payfee),输入0则退出学生菜单函数,返回主菜单。
Student_message students; //建立学生信息类的一个对象"students"
switch (choice)
{
case 1:system("cls"); students.add(); break; //学生信息添加
case 2:system("cls"); students.search(); break; //学生信息查找
case 3:system("cls"); students.show(); break; //学生信息展示
case 4:system("cls"); students.compile(); break; //学生信息修改
case 5:system("cls"); students.deleting(); break; //学生信息删除
case 6:system("cls"); students.statistics(); break; //学生信息统计
case 7:system("cls"); students.saving(); break; //学生信息保存
case 8:system("cls"); students.reading(); break; //学生信息读取
case 9:system("cls");students.payfee();break;//学生缴费
case 0:system("cls"); cout << "您已退出学生端系统! " << endl; break;
default:system("cls"); cout << "选择失误! 请重试! " << endl; break;
}
3)学生端(教师端)题目要求功能的实现:(以学生端为例,教师端类似)
1 . 信息输入功能:
用Student类型的变量调用此函数,函数体中设置文字提醒,用户根据提醒输入string类的姓名;运用switch语句让用户进行选择,输入1则将该对象的sex定义为“男”,输入2则把sex定义为“女”;而后依次根据提示输入并定义此对象的年龄,班级,学号,密码,用水量,用电量。
void Student :: input() //学生信息输入函数
{
cout << "请输入姓名: " << endl;
cin >> name;
int choice;
cout << "请选择性别(1. 男, 2. 女): " << endl;
cin >> choice;
switch (choice)
{
case 1: sex = "男"; break;
case 2: sex = "女"; break;
default:
{
system("cls");
cout << "输入错误! " << endl;
return;
}
}
cout << "请输入年龄: " << endl;
cin >> age;
cout << "请输入班级: " << endl;
cin >> grade;
cout << "请输入学号: " << endl;
cin >> number;
cout << "请设置密码: " << endl;
cin >> password;
cout << "请输入本月用水量(Kg):" << endl;
cin >> water;
cout << "请输入本月用电量(度):" << endl;
cin >> electric;
waterfee = CalculateWaterfee(water);
powerfare = CalculatePowerfare(electric);
system("cls");
}
2 . 信息添加功能:
首先判断储存在stu[amount]中的数据是否达到最大值,如果达到则提示“添加失败,用户已满”,如果未达到则用调用此函数的对象再调用input函数(学生信息输入函数),学生信息输入后进行和之前学生信息比对的遍历,如果学号已经存在,则提示“该学号已存在,请勿重复添加!”;如果性别选择时输入非提示的其他字符,则输出提示“请稍后重试”,以上两种非正常情况不添加此生信息,正常则添加此生信息至stu[amount]数组中。
void Student_message :: add() //学生信息添加函数
{
if (amount >= capacity)
{
cout << "添加失败!用户已满! " << endl;
}
Student stud;
cout << "请输入添加人员的信息" << endl;
stud.input();
for (int i = 0; i < amount; i++)
{
if (stud.GetNumber() == stu[i].GetNumber())
{
cout << "该学号已存在,请勿重复添加! " << endl;
return;
}
}
if (stud.GetSex() != "男"&&stud.GetSex() != "女")
{
cout<<"请稍后再试"<<endl;
return ;
}
stu[amount] = stud;
amount++;
cout << "添加成功! " << endl;
}
3 . 信息输出功能:(两种方式)
①用Student类型的变量调用此函数,依次输出“姓名:”“性别:”“年龄:”等提示语句,并在其后输出其对应值name,sex,age等,每输出一份信息后换行。②定义左移运算符重载函数,使“cout<<”可以直接接Student类型的对象,作用为输出其姓名,性别,年龄,班级,学号,用水量,用电量,水费,电费和相应提示字符。
①
void Student :: output() //学生信息输出函数
{
cout << "姓名: " << name <<endl;
cout << "性别: " << sex <<endl;
cout << "年龄: " << age << endl;
cout << "班级: " << grade <<endl;
cout << "学号: " << number <<endl;
cout << "用水量: " << water << endl;
cout << "用电量: " << electric <<endl;
cout << "水费: " << waterfee <<endl;
cout << "电费: " << powerfare << endl;
}
②
ostream & operator <<(ostream & out,Student & s)
{ //左移运算符重载直接输出全部信息
out << "姓名: " << s.name <<endl;
out << "性别: " << s.sex <<endl;
out << "年龄: " << s.age << endl;
out << "班级: " << s.grade <<endl;
out << "学号: " << s.number <<endl;
out << "用水量: " << s.water << endl;
out << "用电量: " << s.electric <<endl;
out << "水费: " << s.waterfee <<endl;
out << "电费: " << s.powerfare << endl;
return out;
}
4 . 学生信息展示功能:
首先判断stu[amount]数组中是否有元素,如果一个都没有,则输出“没有数据”然后退出此函数返回学生菜单函数;如果有元素则显示运用循环依次输出stu[amount]中的元素的姓名,年龄,班级,学号,用水量,用电量,水费,电费和相应提示字符。(相当于依次调用show函数)。
void Student_message :: show() //学生信息显示函数
{
if (amount == 0)
{
cout << "没有数据! " << endl;
return;
}
for (int i = 0; i < amount; i++)
{
cout<<stu[i]<<endl;
}
cout << "\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");
}
5 . 学生信息查找:(4种查找方式)
首先判断stu[amount]数组中是否有元素,如果一个都没有,则输出“没有数据”然后退出此函数返回学生菜单函数;如果有则运用switch语句进行选择,输入1,则进行学号查找;输入2,则进行姓名查找;输入3,则进行用水量查找;输入4,则进行用电量查找。查找方式为用刚输入的信息与之前stu[amount]中的相应信息进行比对,如果对应相同,则提示输入密码,密码相同则用cout<<(相当于调用show函数)显示该生信息,密码不相同则提示密码输入错误,而后退出此页面返回学生菜单函数。
void Student_message :: search() //学生信息查询函数
{
if (amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
int choice;
string pass;
cout << "请选择查询方式: 1. 学号查找 2. 姓名查找 3. 用水量查找 4. 用电量查找" << endl;
cin >> choice;
switch (choice)
{
case 1://学号查找
{
cout << "请输入要查询的学号: " << endl;
int number;
cin >> number;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetNumber() == number)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 2://姓名查找
{
cout << "请输入要查询的姓名: " << endl;
string name;
cin >> name;
cout << endl;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetName() == name)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 3:
{
cout << "请输入要查询的用水量: " << endl;
double water;
cin >> water;
cout << endl;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetWater() == water)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 4:
{
cout << "请输入要查询的用电量: " << endl;
double electric;
cin >> electric;
cout << endl;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetElectric() == electric)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
default: cout << "无此选项, 请重试! " << endl; break;
}
}
6.学生信息编辑功能:
将编辑函数定义为输入(input)的重载函数,当调用此函数时,首先输入姓名,然后用switch语句选择性别,输入1将sex定义为“男”,输入2将sex定义为“女”,输入其他则提示“输入错误”;而后根据提示,分别对年龄,班级,用水量,用电量进行重定义,因为学号具有唯一性所以学号不重新定义。
void Student :: input(int) //学生信息重新输入(编辑重载)
{
cout << "请输入姓名: " << endl;
cin >> name;
int choice;
cout << "请选择性别(1. 男, 2. 女): " << endl;
cin >> choice;
switch (choice)
{
case 1: sex = "男"; break;
case 2: sex = "女"; break;
default:
{
system("cls");
cout << "输入错误! " << endl;
return;
}
}
cout << "请输入年龄: " << endl;
cin >> age;
cout << "请输入班级: " << endl;
cin >> grade;
cout << "请输入本月用水量(Kg):" << endl;
cin >> water;
cout << "请输入本月用电量(度):" << endl;
cin >> electric;
waterfee = CalculateWaterfee(water);
powerfare = CalculatePowerfare(electric);
system("cls");
}
7 . 学生信息删除功能
首先判断stu[amount]数组中是否有元素,如果一个都没有,则输出“当前没有人员记录”然后退出此函数返回学生菜单函数;如果有则运用switch语句进行选择,输入1,进行学号查找删除,输入2,进行姓名查找删除。删除方式为先用输入的信息与数组stu[amount]中的信息进行比对,相同则在输入密码后运用循环将该元素后的所有元素前移一位,覆盖该元素实现删除。
void Student_message :: deleting() //学生信息删除函数
{
if (amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
cout << "请输入您的选择: " << endl;
cout << "1. 学号查找删除 2. 姓名查找删除" << endl;
int choice;
cin >> choice;
switch (choice)
{
case 1:
{
cout << "请输入学号: " << endl;
int num;
cin >> num;
for (int i = 0; i < amount; i++)
{
if (num == stu[i].GetNumber())
{
cout << "是否确认删除? " << endl;
cout << "1. 是 2. 否" << endl;
int choice1;
cin >> choice1;
switch (choice1)
{
case 1:
{
cout<<"请输入密码:";
string pass;
cin>>pass;
if(pass == stu[i].GetPassword())
{
for (int k = i; k < amount - 1; k++)
{
stu[k] = stu[k + 1];
}
cout << "删除成功!" << endl;
amount--;
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
cout<<"密码错误,请稍后重试!"<<endl;
}
}; break;
case 2:
{
system("cls");
return;
}
default:
cout << "不存在此选项!" << endl; break;
}return;
}
}
system("cls");
cout << "未查询到此人!请稍后重试! " << endl;
}; break;
case 2:
{
cout << "请输入姓名: " << endl;
string name;
cin >> name;
for (int i = 0; i < amount; i++)
{
if (name == stu[i].GetName())
{
cout << "是否确认删除? " << endl;
cout << "1. 是 2. 否 " << endl;
int choice2;
cin >> choice2;
switch (choice2)
{
case 1:
{
for (int k = i; k < amount - 1; k++)
{
cout<<"请输入密码:";
string pass;
cin>>pass;
if(pass == stu[k].GetPassword())
{
stu[k] = stu[k + 1];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;
}
}
cout << "删除成功! " << endl;
amount--;
}; break;
case 2:
{
system("cls");
return;
}
default:
cout << "不存在此选项!! " << endl; break;
} return;
}
}
system("cls");
cout << "未查询到此人!请稍后重试! " << endl;
}; break;
default: cout << "没有此选项,失败! " << endl; break;
}
}
8 . 学生信息统计功能:
首先判断stu[amount]数组中是否有元素,如果一个都没有,则输出“没有数据”然后退出此函数返回学生菜单函数;用switch语句进行选择,选择1则进行stu[amount]数组中所有学生用水量和用电量的求和并进行输出;选择2则进行stu[amount]数组中所有学生水电费的求和并进行输出。
void Student_message :: statistics() //学生信息统计函数
{
cout << "1. 学生总用水量和总用电量 2. 学生总的水电费" << endl;
int choice;
cout << "请选择您的选项: " << endl;
cin >> choice;
switch (choice)
{
case 1:
{
double all_water = 0.0, all_electric = 0.0;
for (int i = 0; i < amount; i++)
{
all_water += stu[i].GetWater();
all_electric += stu[i].GetElectric();
}
cout << "学生总用水量为: " << all_water << endl;
cout << "学生总用电量为: " << all_electric << endl;
} break;
case 2:
{
double all_waterfare = 0.0, all_powerfee = 0.0;
for (int i = 0; i < amount; i++)
{
all_waterfare += stu[i].GetWaterfee();
all_powerfee += stu[i].GetPowerfare();
}
cout << "学生总水费为: " << all_waterfare << endl;
cout << "学生总电费为: " << all_powerfee << endl;
} break;
default: cout << "输入错误! 请重新输入! " << endl; break;
}
}
9 . 学生信息保存功能:
调用此函数时,首先打开一个txt文件StudentMessage.txt,而后将程序中现存的stu[amount]数组中所有元素的所有信息以二进制方式版存在文件StudentMessage.txt中,最后关闭该文件。
void Student_message :: saving() //学生信息保存函数
{
ofstream ofs;
ofs.open("StudentMessage.txt", ios::out | ios::binary);
for (int i=0;i < this->amount;i++)
{
ofs.write((const char *)&stu[i],sizeof(Student_message));
}
ofs.close();
}
10 . 学生信息读取功能:
调用此函数时,首先打开txt文件StudentMessage.txt,并判断是否打开成功,如果打开失败则提示“文件打开失败”,如果打开成功则以二进制方式读取StudentMessage.txt中的信息,并将所有信息输入到系统中,最后关闭文件。
void Student_message :: reading() //学生信息读取函数
{
ifstream ifs;
ifs.open("StudentMessage.txt", ios::in | ios::binary);
if(!ifs.is_open())
{
cout<<"文件打开失败!"<<endl;
return;
}
for(int i=0;i<this->amount;i++)
{
ifs.read((char*)&stu[i],sizeof(Student_message));
}
ifs.close();
}
五、创意技术设计
5.1 缴费功能设计(以学生缴费为例)
输出要缴费者的学号,然后对此符号与stu[amount]中所有元素的number进行比对,如果找到相同学号则进行密码核对,如果与该对象的password相同则提示该对象的水电费(waterfee和powerfare),并提示“是否确认缴费”,运用switch语句进行选择,输入1则将该对象水电费清零,输入2则提示“请尽快缴费”,然后返回学生菜单函数。
void Student_message :: payfee()//学生缴费函数
{
cout << "请输入要缴费者的学号:" << endl;
int number;
cin >> number;
for (int i = 0; i < amount; i++)
{
if(stu[i].GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i].GetName()<<"你好!" << endl;
cout << " 您本月应缴纳水费:"<<stu[i].GetWaterfee()<<endl;
cout << " 您本月应缴纳电费:"<<stu[i].GetPowerfare()<<endl;
cout << " 是否确认缴纳?"<<endl;
cout <<" 1、是 2、否 "<<endl;
int choice;
cin >> choice;
switch(choice)
{
case 1:
{
if(stu[i].Getpowerfare()==0&&stu[i].Getwaterfee()==0)
{
system ("cls");
cout<<"您已缴过费或无需上缴水电费!"<<endl;break;
}
else
{
stu[i].Pay();
system("cls");
cout<<"缴费成功!"<<endl;break;
}
}
case 2:cout<< "请尽快缴费!" <<endl;break;
default:cout<<"选择有误,请稍后重试!"<<endl;break;
}
cout<<"\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
cout<<"查无此人,请稍后重试!"<<endl;
}
5.2导师菜单窗口
/内含两个函数,第一个适用辅导员观看全系同学信息或未缴费同学信息,第二个适合班导师观看全班同学信息或未缴费同学信息/
运用switch语句进行选择,输入1调用putStudent函数,输入2电泳putclassStudent函数,输入0返回主菜单,输入其他字符提示选择失误然后重新进行选择。
switch(choice)
{
case 1: system("cls"); person.putStudent(); break;
case 2: system("cls"); person.putclassStudent(); break;
case 0: system("cls");cout << "您已退出导师查询系统! " << endl; break;
default: system("cls");cout << "选择失误! 请重试! " << endl; break;
}
5.2.1辅导员权限
输入职工号后与教工信息数组中的各元素进行遍历比对,找到相同的则输入密码,若输入的密码与password相同则运用switch语句进行选择,输入1则显示所有学生的信息,输入2则显示所有未缴费的同学信息。
void People::putStudent()
{
cout<<"请输入职工号"<<endl;
int number;
cin>>number;
for (int i = 0; i < Teacher_message::amount; i++)
{
if ((t+i)->GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == (t+i)->GetPassword())
{
if ((t+i)->department=="辅导员")
{
int choice;
cout<<"\n\n1.查看全体同学信息 2.查看未缴费同学信息\n\n"<<endl;
cin>>choice;
switch (choice)
{
case 1:
{
for(int j=0;j < Student_message::amount; j++)
{
(s+j)->output();
}
cout<<"无目标成员!"<<endl;
}
case 2:
{
for(int j=0;j < Student_message::amount; j++)
{
if((s+j)->GetPowerfare()!=0||(s+j)->GetWaterfee()!=0)
(s+j)->output();
}
cout<<"无目标成员!"<<endl;
}
}
}
else
{
cout<<"您非辅导员,无访问权限"<<endl;
}
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;
return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
}
5.2.2班导师权限
输入职工号后与教工信息数组中的各元素进行遍历比对,找到相同的则输入密码,若输入的密码与password相同则运用switch语句进行选择,输入1则显示所有本班级学生的信息,输入2则显示所有本班级未缴费的同学信息。
void People::putclassStudent()
{
cout<<"请输入职工号"<<endl;
int number;
cin>>number;
for (int i = 0; i < Teacher_message::amount; i++)
{
if ((t+i)->GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == (t+i)->GetPassword())
{
if ((t+i)->department=="班导师")
{
int choice;
cout<<"1.查看全班同学信息2.查看未缴费同学信息\n\n"<<endl;
cin>>choice;
switch (choice)
{
case 1:
{
for(int j=0;j < Student_message::amount; j++)
{
if((s+j)->grade == (t+i)->Grade)
(s+j)->output();
}
cout<<"无目标成员!"<<endl;
}
case 2:
{
for(int j=0;j < Student_message::amount; j++)
{
if((s+j)->grade == (t+i)->Grade)
{
if((s+j)->GetPowerfare()!=0||(s+j)->GetWaterfee()!=0)
(s+j)->output();
}
}
cout<<"无目标成员!"<<endl;
}
}
}
else
{
cout<<"您非班导师,无访问权限"<<endl;
}
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
}
六、结论与心得体会
这次课程设计中,让我有了很多的收获。如何用分文件把不同的类放在不同的头文件中进行整理,如何运用指针对数组进行操作,如何运用于友元函数对protected或者private类型数据进行访问,如何运用函数重载把一个函数多功能化。这些知识可能都是在课堂上我一知半解或者充满迷惑的,但是在此次课程设计中,我将它们真正的应用起来,切身体验了这些知识的正确使用方法。
通过一个月左右的时间,让我从觉得自己从只能写几十行代码的小白,变成了一个真正写完一千多行程序的初学者。我认为这是一个很大的进步,也给了我很大的鼓舞。同时在与朋友们进行交流解惑这个过程中,也让我真正明白了,一个好的C++程序应该有好的可视性,代码简洁性,实现功能时应该在页面上给用户恰当的提示,在恰当时侯清屏避免页面内容过多视感不佳。同时在写代码时,我也知道了每一步算法都应准确无误,不应该编译器不报错就认为没有错;也是提醒我,对知识应该熟练掌握再进行运用,不然会有意想不到的错误出现。在Debug的过程中,我也体会到了分文件的优势所在,相比于在几百上千行代码中寻找bug,在一个分文件中找bug无疑减少了工作量。
再者,写报告的过程,也是把程序再次进行测试的过程,在这个过程中也让我找到了原来程序中的一些不足,有利于提高代码质量。在画流程图的过程中,让我更加系统的对代码的实现方式深入理解,而不是写完一个功能就忘了上一个功能是如何实现的了。总的来说,编写程序和撰写报告都是课程设计中非常重要的部分,都需要用时间和精力用心对待,万万不能蒙混过关。
最后,我觉得这个课程设计对于我学习方式的改善也有很大的帮助,每当我遇到无法解决的问题,就会第一时间去看《黑马程序员》的教程,这让我从懒惰中抽出身来,努力钻研在课堂上不够贯通的知识,成为了我课后巩固知识的良好催化剂。我相信从此以后,在我的编程道路上也一定会以此次课程设计为基石,力求做到更好。
七、参考文献
C++程序设计(第三版 ) 谭浩强著
八、附录
8.1 调试报告
8.3 程序源代码
//Sources main.cpp: //主函数所在sourse
#include "student.h"
#include "Teacher.h"
#include "Teacher_message.h"
#include "Student_message.h"
#include "People.h"
using namespace std;
//防止人数过多,定义常量,最多注册10000人(两个端口各5000)//在Individual类中
//类定义在头文件中,函数在类中定义 //功能函数定义在源文件中。
void studentMenu() //学生页面菜单函数
{
Student_message students;//建立学生信息类的一个对象students
int choice = 9;
while (choice != 0)
{
cout<<"\n*============================================================================== * \n" << endl;
cout << "\t\t\t\t学生水电费管理系统\n" << endl;
//学生水电费管理系统各种功能的选择
cout << " 1.添加 2.查询 3.显示 4.修改 5.删除 6.统计 7.保存 8.读取 9.缴费 0.退出 \n\n" << endl;
cout<<"\n*============================================================================== * \n" << endl;
cout << "请输入您的选择: " << endl;
cin >> choice;
switch (choice)
{
case 1:system("cls"); students.add(); break;
case 2:system("cls"); students.search(); break;
case 3:system("cls"); students.show(); break;
case 4:system("cls"); students.compile(); break;
case 5:system("cls"); students.deleting(); break;
case 6:system("cls"); students.statistics(); break;
case 7:system("cls"); students.saving(); break;
case 8:system("cls"); students.reading(); break;
case 9:system("cls");students.payfee();break;
case 0:system("cls"); cout << "您已退出学生端系统! " << endl; break;
default:system("cls"); cout << "选择失误! 请重试! " << endl; break;
}
}
}
void teacherMenu() //教工页面主菜单函数
{
Teacher_message teachers;
int choice = 9;
while(choice != 0)
{
cout<<"\n*============================================================================== * \n" << endl ;
cout << "\t\t\t教工端水电费管理系统\n" << endl;
//教工水电费管理系统各种功能的选择
cout << " 1.添加 2.查询 3.显示 4.修改 5.删除 6.统计 7.保存 8.读取 9.缴费 0.退出 \n\n" << endl ;
cout<<"\n*============================================================================== * \n" << endl ;
cout << "请输入您的选择: " << endl;
cin >> choice;
switch(choice)
{
case 1: system("cls"); teachers.add(); break;
case 2: system("cls"); teachers.search(); break;
case 3: system("cls"); teachers.show(); break;
case 4: system("cls"); teachers.compile(); break;
case 5: system("cls"); teachers.deleting(); break;
case 6: system("cls"); teachers.statistics(); break;
case 7: system("cls"); teachers.saving(); break;
case 8: system("cls"); teachers.reading(); break;
case 9: system("cls"); teachers.payfee();break;
case 0: system("cls");cout << "您已退出教工端系统! " << endl; break;
default: system("cls");cout << "选择失误! 请重试! " << endl; break;
}
}
}
void guideMenu()
{
People person;
int choice =2;
while(choice != 0)
{
cout<<"\n*============================================================================== * \n" << endl ;
cout << "\t\t1.辅导员端口 2.班导师端口 0.退出\n" << endl;
cout<<"\n*============================================================================== * \n" << endl ;
cout << "请输入您的选择: " << endl;
cin >> choice;
switch(choice)
{
case 1: system("cls"); person.putStudent(); break;
case 2: system("cls"); person.putclassStudent(); break;
case 0: system("cls");cout << "您已退出导师查询系统! " << endl; break;
default: system("cls");cout << "选择失误! 请重试! " << endl; break;
}
}
}
int main() //主函数
{
int choice = 3 ;
while (choice != 0)
{
cout<<"\n=================================================================================== = \n" << endl;
cout << "\n\t\t\t* 高校水电费管理系统 *\n\n\n" << endl;
// 管理系统的项目,有两个子系统,一个教工的, 一个学生的
cout << " 1.学生水电费管理系统 2.教工水电费管理系统 3.导师查询端口 0.退出系统\n" << endl << endl;
cout<<"\n=================================================================================== = \n" << endl;
cout << "请输入您的选择: " << endl;
cin >> choice;
switch (choice)
{
case 1: system("cls");
studentMenu(); break;
case 2: system("cls");
teacherMenu(); break;
case 3:system("cls");
guideMenu();break;
case 0: system("cls");
cout<<"*=================================================================================== * \n" << endl;
cout << "\n\n\t\t\t\t* 您已退出系统,欢迎下次使用 * \n\n\n" << endl;
cout<<"*=================================================================================== * \n" << endl; break;
default:system("cls");
cout << "选择错误,请重试! " << endl; break;
}
}
return 0;
}
//Sources Individual公用功能函数.cpp
#include <fstream>
#include "individual.h"
#include "student.h"
#include "Teacher.h"
#include "Teacher_message.h"
#include "Student_message.h"
#include "People.h"
#include <windows.h>
ostream & operator <<(ostream & out,Student & s)
{
out << "姓名: " << s.name <<endl;
out << "性别: " << s.sex <<endl;
out << "年龄: " << s.age << endl;
out << "班级: " << s.grade <<endl;
out << "学号: " << s.number <<endl;
out << "用水量: " << s.water << endl;
out << "用电量: " << s.electric <<endl;
out << "水费: " << s.waterfee <<endl;
out << "电费: " << s.powerfare << endl;
return out;
}
double Individual::CalculateWaterfee(double water)//计算水费函数
{
if (water <= 50.0) //用水在50kg内的不收费
return 0.0;
else if (water <= 500.0) //用水量在50~500kg之间的,超过50的部分每kg收费2.8元
return ((water - 50.0) * 2.8);
else
return (450 * 2.8 + (water - 500.0) * 3.5);//为避免浪费,超过500kg的收费为每kg3.5元
}
double Individual::CalculatePowerfare(double electric)//计算电费函数
{
if (electric <= 3.0) //用电在3度内的不收费
return 0.0;
else if (electric <= 50.0) //用电量在3~50度之间的,超过50的部分每度收费1.0元
return ((electric - 3.0) * 1.0);
else
return (47 * 1.0 + (electric - 50.0) * 2.5);//为避免浪费,超过50度的收费为每度2.5元
}
void Individual::Pay()//缴费函数
{
waterfee=0;
powerfare=0; //确认缴费后,将需交水电费归零
}
//Sources student端功能函数.cpp
#include <fstream>
#include "individual.h"
#include "student.h"
#include "Student_message.h"
void Student :: input() //学生信息输入函数
{
cout << "请输入姓名: " << endl;
cin >> name;
int choice;
cout << "请选择性别(1. 男, 2. 女): " << endl;
cin >> choice;
switch (choice)
{
case 1: sex = "男"; break;
case 2: sex = "女"; break;
default:
{
system("cls");
cout << "输入错误! " << endl;
return;
}
}
cout << "请输入年龄: " << endl;
cin >> age;
cout << "请输入班级: " << endl;
cin >> grade;
cout << "请输入学号: " << endl;
cin >> number;
cout << "请设置密码: " << endl;
cin >> password;
cout << "请输入本月用水量(Kg):" << endl;
cin >> water;
cout << "请输入本月用电量(度):" << endl;
cin >> electric;
waterfee = CalculateWaterfee(water);
powerfare = CalculatePowerfare(electric);
system("cls");
}
void Student :: input(int)//学生信息重新输入(编辑重载)
{
cout << "请输入姓名: " << endl;
cin >> name;
int choice;
cout << "请选择性别(1. 男, 2. 女): " << endl;
cin >> choice;
switch (choice)
{
case 1: sex = "男"; break;
case 2: sex = "女"; break;
default:
{
system("cls");
cout << "输入错误! " << endl;
return;
}
}
cout << "请输入年龄: " << endl;
cin >> age;
cout << "请输入班级: " << endl;
cin >> grade;
cout << "请输入本月用水量(Kg):" << endl;
cin >> water;
cout << "请输入本月用电量(度):" << endl;
cin >> electric;
waterfee = CalculateWaterfee(water);
powerfare = CalculatePowerfare(electric);
system("cls");
}
void Student :: output() //学生信息输出函数
{
cout << "姓名: " << name <<endl;
cout << "性别: " << sex <<endl;
cout << "年龄: " << age << endl;
cout << "班级: " << grade <<endl;
cout << "学号: " << number <<endl;
cout << "用水量: " << water << endl;
cout << "用电量: " << electric <<endl;
cout << "水费: " << waterfee <<endl;
cout << "电费: " << powerfare << endl;
}
void Student_message :: add() //学生信息添加函数
{
if (amount >= capacity)
{
cout << "添加失败!用户已满! " << endl;
}
Student stud;
cout << "请输入添加人员的信息" << endl;
stud.input();
for (int i = 0; i < amount; i++)
{
if (stud.GetNumber() == stu[i].GetNumber())
{
cout << "该学号已存在,请勿重复添加! " << endl;
return;
}
}
if (stud.GetSex() != "男"&&stud.GetSex() != "女")
{
cout<<"请稍后再试"<<endl;
return ;
}
stu[amount] = stud;
amount++;
cout << "添加成功! " << endl;
}
void Student_message :: search() //学生信息查询函数
{
if (amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
int choice;
string pass;
cout << "请选择查询方式: 1. 学号查找 2. 姓名查找 3. 用水量查找 4. 用电量查找" << endl;
cin >> choice;
switch (choice)
{
case 1://学号查找
{
cout << "请输入要查询的学号: " << endl;
int number;
cin >> number;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetNumber() == number)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 2://姓名查找
{
cout << "请输入要查询的姓名: " << endl;
string name;
cin >> name;
cout << endl;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetName() == name)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 3:
{
cout << "请输入要查询的用水量: " << endl;
double water;
cin >> water;
cout << endl;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetWater() == water)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 4:
{
cout << "请输入要查询的用电量: " << endl;
double electric;
cin >> electric;
cout << endl;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetElectric() == electric)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
default: cout << "无此选项, 请重试! " << endl; break;
}
}
void Student_message :: show() //学生信息显示函数
{
if (amount == 0)
{
cout << "没有数据! " << endl;
return;
}
for (int i = 0; i < amount; i++)
{
cout<<stu[i]<<endl;
}
cout << "\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");
}
void Student_message :: compile() //学生信息编辑函数
{
if (amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
else
{
int num;
cout << "请输入要查找的学号: " << endl;
cin >> num;
for (int i = 0; i < amount; i++)
{
if (stu[i].GetNumber() == num)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout << "请输入修改后的信息" << endl;
stu[i].input(i);
if (stu[i].GetSex() != "男"&&"女")
{
cout<<"请稍后再试"<<endl;
return ;
}
system("cls");
cout << "修改成功! " << endl;
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就修改其信息,查不到显示“此人不存在!”
}
}
void Student_message :: deleting() //学生信息删除函数
{
if (amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
cout << "请输入您的选择: " << endl;
cout << "1. 学号查找删除 2. 姓名查找删除" << endl;
int choice;
cin >> choice;
switch (choice)
{
case 1:
{
cout << "请输入学号: " << endl;
int num;
cin >> num;
for (int i = 0; i < amount; i++)
{
if (num == stu[i].GetNumber())
{
cout << "是否确认删除? " << endl;
cout << "1. 是 2. 否" << endl;
int choice1;
cin >> choice1;
switch (choice1)
{
case 1:
{
cout<<"请输入密码:";
string pass;
cin>>pass;
if(pass == stu[i].GetPassword())
{
for (int k = i; k < amount - 1; k++)
{
stu[k] = stu[k + 1];
}
cout << "删除成功!" << endl;
amount--;
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
cout<<"密码错误,请稍后重试!"<<endl;
}
}; break;
case 2:
{
system("cls");
return;
}
default:
cout << "不存在此选项!" << endl; break;
}return;
}
}
system("cls");
cout << "未查询到此人!请稍后重试! " << endl;
}; break;
case 2:
{
cout << "请输入姓名: " << endl;
string name;
cin >> name;
for (int i = 0; i < amount; i++)
{
if (name == stu[i].GetName())
{
cout << "是否确认删除? " << endl;
cout << "1. 是 2. 否 " << endl;
int choice2;
cin >> choice2;
switch (choice2)
{
case 1:
{
for (int k = i; k < amount - 1; k++)
{
cout<<"请输入密码:";
string pass;
cin>>pass;
if(pass == stu[k].GetPassword())
{
stu[k] = stu[k + 1];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;
}
}
cout << "删除成功! " << endl;
amount--;
}; break;
case 2:
{
system("cls");
return;
}
default:
cout << "不存在此选项!! " << endl; break;
} return;
}
}
system("cls");
cout << "未查询到此人!请稍后重试! " << endl;
}; break;
default: cout << "没有此选项,失败! " << endl; break;
}
}
void Student_message :: statistics() //学生信息统计函数
{
cout << "1. 学生总用水量和总用电量 2. 学生总的水电费" << endl;
int choice;
cout << "请选择您的选项: " << endl;
cin >> choice;
switch (choice)
{
case 1:
{
double all_water = 0.0, all_electric = 0.0;
for (int i = 0; i < amount; i++)
{
all_water += stu[i].GetWater();
all_electric += stu[i].GetElectric();
}
cout << "学生总用水量为: " << all_water << endl;
cout << "学生总用电量为: " << all_electric << endl;
} break;
case 2:
{
double all_waterfare = 0.0, all_powerfee = 0.0;
for (int i = 0; i < amount; i++)
{
all_waterfare += stu[i].GetWaterfee();
all_powerfee += stu[i].GetPowerfare();
}
cout << "学生总水费为: " << all_waterfare << endl;
cout << "学生总电费为: " << all_powerfee << endl;
} break;
default: cout << "输入错误! 请重新输入! " << endl; break;
}
}
void Student_message :: saving() //学生信息保存函数
{
ofstream ofs;
ofs.open("StudentMessage.txt", ios::out | ios::binary);
for (int i=0;i < this->amount;i++)
{
ofs.write((const char *)&stu[i],sizeof(Student_message));
}
ofs.close();
}
void Student_message :: reading() //学生信息读取函数
{
ifstream ifs;
ifs.open("StudentMessage.txt", ios::in | ios::binary);
if(!ifs.is_open())
{
cout<<"文件打开失败!"<<endl;
return;
}
for(int i=0;i<this->amount;i++)
{
ifs.read((char*)&stu[i],sizeof(Student_message));
cout<<stu[i]<<endl;
}
ifs.close();
}
void Student_message :: payfee()//学生缴费函数
{
cout << "请输入要缴费者的学号:" << endl;
int number;
cin >> number;
for (int i = 0; i < amount; i++)
{
if(stu[i].GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == stu[i].GetPassword())
{
cout<<stu[i].GetName()<<"你好!" << endl;
cout << " 您本月应缴纳水费:"<<stu[i].GetWaterfee()<<endl;
cout << " 您本月应缴纳电费:"<<stu[i].GetPowerfare()<<endl;
cout << " 是否确认缴纳?"<<endl;
cout <<" 1、是 2、否 "<<endl;
int choice;
cin >> choice;
switch(choice)
{
case 1:
{
if(stu[i].Getpowerfare()==0&&stu[i].Getwaterfee()==0)
{
system ("cls");
cout<<"您已缴过费或无需上缴水电费!"<<endl;break;
}
else
{
stu[i].Pay();
system("cls");
cout<<"缴费成功!"<<endl;break;
}
}
case 2:cout<< "请尽快缴费!" <<endl;break;
default:cout<<"选择有误,请稍后重试!"<<endl;break;
}
cout<<"\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
cout<<"查无此人,请稍后重试!"<<endl;
}
//Sources teacher端功能函数.cpp
#include "individual.h"
#include "Teacher.h"
#include "Teacher_message.h"
#include <windows.h>
void Teacher :: input() //教工信息输入函数
{
int choice_sex;
int choice_part;
cout << "请输入姓名: " << endl;
cin >> name;
cout << "请选择性别(1. 男, 2. 女): " << endl;
cin >> choice_sex;
switch(choice_sex)
{
case 1: sex = "男"; break;
case 2: sex = "女"; break;
default:
{
system("cls");
cout << "输入错误! " << endl;
return;
}
}
cout << "请输入年龄: " << endl;
cin >> age;
cout << "请选择工作部门: " << endl;
cout << "1. 班导师, 2. 辅导员, 3. 课程导师, 4. 教务处, 5.安保人员, 6.后勤人员" << endl ;
cin >> choice_part;
switch(choice_part)
{
case 1:
{
department = "班导师";
cout<<"请输入您的班级:"<<endl;
cin>>Grade;break;
}
case 2: department = "辅导员"; break;
case 3: department = "课程导师"; break;
case 4: department = "教务处"; break;
case 5: department = "安保人员"; break;
case 6: department = "后勤人员"; break;
default : cout << "输入错误!" << endl; return;
}
cout << "请输入职工号: " << endl;
cin >> number;
cout << "请设置密码: " << endl;
cin >> password;
cout << "请输入该月用水量: " << endl;
cin >> water;
cout << "请输入该月用电量: " << endl;
cin >> electric;
waterfee = CalculateWaterfee(water);
powerfare = CalculatePowerfare(electric);
system("cls");
}
void Teacher :: input(int)//教工信息重新输入(编辑重载)
{
int choice_sex;
int choice_part;
cout << "请输入姓名: " << endl;
cin >> name;
cout << "请选择性别(1. 男, 2. 女): " << endl;
cin >> choice_sex;
switch(choice_sex)
{
case 1: sex = "男"; break;
case 2: sex = "女"; break;
default:
{
system("cls");
cout << "输入错误! " << endl;
return;
}
}
cout << "请输入年龄: " << endl;
cin >> age;
cout << "请选择工作部门: " << endl;
cout << "1. 班导师, 2. 辅导员, 3. 课程导师, 4. 教务处, 5.安保人员, 6.后勤人员" << endl ;
cin >> choice_part;
switch(choice_part)
{
case 1:
{
department = "班导师";
cout<<"请输入您的班级:"<<endl;
cin>>Grade;break;
}
case 2: department = "辅导员"; break;
case 3: department = "课程导师"; break;
case 4: department = "教务处"; break;
case 5: department = "安保人员"; break;
case 6: department = "后勤人员"; break;
default : cout << "输入错误!" << endl; return;
}
cout << "请输入该月用水量: " << endl;
cin >> water;
cout << "请输入该月用电量: " << endl;
cin >> electric;
waterfee = CalculateWaterfee(water);
powerfare = CalculatePowerfare(electric);
system("cls");
}
void Teacher :: output() //教工信息输出函数
{
cout << "姓名: " << name <<endl;
cout << "性别: " << sex <<endl;
cout << "年龄: " << age << endl;
cout << "工作部门: " << department <<endl;
cout << "职工号: " << number <<endl;
cout << "用水量: " << water <<endl;
cout << "用电量: " << electric <<endl;
cout << "水费: " << waterfee <<endl;
cout << "电费: " << powerfare<<endl;
}
void Teacher_message :: add() //教工信息添加函数
{
if(amount >= capacity)
{
cout << "警告! 用户已满! " << endl;
return;
}
Teacher teache;//
cout << "请输入添加人员的信息" << endl;
teache.input();
for (int i = 0; i < amount; i++)
if(teache.GetNumber() == teach[i].GetNumber())
{
cout << "该编号人员已存在! " << endl;
return;
}
if(teache.GetSex() != "男"&&"女")
{
cout<<"添加有误,请稍后再试"<<endl;
return ;
}
teach[amount] = teache;
amount++;
cout << "添加成功! " << endl;
}
void Teacher_message :: search() //教工信息查询函数
{
if(amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
int choice;
string pass;
cout << "请选择查询方式: 1.职工号查找 2.姓名查找 3.用水量查找 4.用电量查找" << endl ;
cin >> choice;
switch(choice)
{
case 1:
{
cout << "请输入要查询的职工号: " << endl;
int number;
cin >> number;
for (int i = 0; i < amount; i++)
{
if(teach[i].GetNumber() == number)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == teach[i].GetPassword())
{
teach[i].output();
cout<<"\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 2:
{
cout << "请输入要查询的姓名: " << endl;
string name;
cin >> name;
for (int i = 0; i < amount; i++)
{
if(teach[i].GetName() == name)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == teach[i].GetPassword())
{
teach[i].output();
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
}break;
case 3:
{
cout << "请输入要查询的用水量: " << endl;
double water;
cin >> water;
for (int i = 0; i < amount; i++)
{
if(teach[i].GetWater() == water)
{
cout<<"请输入密码:";
cin>>pass;
if(pass == teach[i].GetPassword())
{
teach[i].output();
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
case 4:
{
cout << "请输入要查询的用电量: " << endl;
double electric;
cin >> electric;
for (int i = 0; i < amount; i++)
{
if(teach[i].GetElectric() == electric)
{
cout<<"请输入密码:";
cin >> pass;
if(pass == teach[i].GetPassword())
{
teach[i].output();
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就显示其信息,查不到显示“此人不存在!”
} break;
default : cout << "无此选项, 请重试! " << endl; break;
}
}
void Teacher_message :: show() //教工信息显示函数
{
if(amount == 0)
{
cout << "没有数据! " << endl;
return;
}
for (int i = 0; i < amount; i++)
{
teach[i].output();
}
cout << "\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");
}
void Teacher_message :: compile() //教工信息编辑函数
{
if(amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
else
{
int num;
cout << "请输入要查找的职工号: " << endl;
cin >> num;
for (int i = 0; i < amount; i++)
{
if (teach[i].GetNumber() == num)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == teach[i].GetPassword())
{
cout << "请输入修改后的信息" << endl;
teach[i].input(i);
system("cls");
cout << "修改成功! " << endl;
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
getchar();
getchar();
return;//若查到就修改其信息,查不到显示“此人不存在!”
}
cout << "查无此人信息,请稍后重试! " << endl;
}
void Teacher_message :: deleting() //教工信息删除函数
{
if (amount == 0)
{
cout << "当前没有人员记录! " << endl;
return;
}
cout << "请输入您的选择: " << endl;
cout << "1. 职工号查找删除 2. 姓名查找删除" << endl;
int choice;
cin >> choice;
switch (choice)
{
case 1:
{
cout << "请输入职工号: " << endl;
int num;
cin >> num;
for (int i = 0; i < amount; i++)
{
if (num == teach[i].GetNumber())
{
cout << "是否确认删除? " << endl;
cout << "1. 是 2. 否" << endl;
int choice1;
cin >> choice1;
switch (choice1)
{
case 1:
{
cout<<"请输入密码:";
string pass;
cin>>pass;
if(pass == teach[i].GetPassword())
{
for (int k = i; k < amount - 1; k++)
{
teach[k] = teach[k + 1];
}
cout << "删除成功!" << endl;
amount--;
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
cout<<"密码错误,请稍后重试!"<<endl;
}
}; break;
case 2:
{
system("cls");
return;
}
default:
cout << "不存在此选项!" << endl; break;
}return;
}
}
system ("cls");
cout << "未查询到此人!请稍后重试! " << endl;
}; break;
case 2:
{
cout << "请输入姓名: " << endl;
string name;
cin >> name;
for (int i = 0; i < amount; i++)
{
if (name == teach[i].GetName())
{
cout << "是否确认删除? " << endl;
cout << "1. 是 2. 否 " << endl;
int choice2;
cin >> choice2;
switch (choice2)
{
case 1:
{
for (int k = i; k < amount - 1; k++)
{
cout<<"请输入密码:";
string pass;
cin>>pass;
if(pass == teach[k].GetPassword())
{
teach[k] = teach[k + 1];
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;
}
}
cout << "删除成功! " << endl;
amount--;
}; break;
case 2:
{
system("cls");
return;
}
default:
cout << "不存在此选项!! " << endl; break;
} return;
}
}
system("cls");
cout << "未查询到此人!请稍后重试! " << endl;
}; break;
default: cout << "没有此选项,失败! " << endl; break;
}
}
void Teacher_message :: statistics() //教工信息统计函数
{
cout << "1.老师用水总量和用电总量 2.老师总的水电费 3." << endl;
int choice;
cout << "请输入您的选择: " << endl;
cin >> choice;
switch(choice)
{
case 1:
{
double all_water = 0.0, all_electric = 0.0;
for (int i = 0; i < Teacher_message::amount; i++)
{
all_water += teach[i].GetWater();
all_electric += teach[i].GetElectric();
}
cout << "教工总用水量为: " << all_water << endl;
cout << "教工总用电量为: " << all_electric << endl;
} break;
case 2:
{
double all_waterfare = 0.0, all_powerfee = 0.0;
for (int i = 0; i < Teacher_message::amount; i++)
{
all_waterfare += teach[i].GetWaterfee();
all_powerfee += teach[i].GetPowerfare();
}
cout << "教工总水费为: " << all_waterfare << endl;
cout << "教工总电费为: " << all_powerfee << endl;
} break;
default: cout << "输入错误! 请重新输入! " << endl; break;
}
}
void Teacher_message ::saving() //教工信息保存函数
{
ofstream ofs;
ofs.open("TeacherMessage.txt", ios::out | ios::binary);
for (int i=0;i < this->amount;i++)
{
ofs.write((const char*)&teach[i],sizeof(Teacher_message));
}
ofs.close();
cout<<"文件写入成功!"<<endl;
}
void Teacher_message ::reading() //教工信息读取函数
{
ifstream ifs;
ifs.open("TeacherMessage.txt", ios::in | ios::binary);
if(!ifs.is_open())
{
cout<<"文件打开失败!"<<endl;
return;
}
for(int i=0;i<this->amount;i++)
{
ifs.read((char*)&teach[i],sizeof(Teacher_message));
}
ifs.close();
}
void Teacher_message :: payfee()//教工缴费函数
{
cout << "请输入要缴费者的职工号号:" << endl;
int number;
cin >> number;
for (int i = 0; i < amount; i++)
{
if(teach[i].GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == teach[i].GetPassword())
{
cout<<teach[i].GetName()<<"你好!" << endl;
cout << " 您本月应缴纳水费:"<<teach[i].GetWaterfee()<<endl;
cout << " 您本月应缴纳电费:"<<teach[i].GetPowerfare()<<endl;
cout << " 是否确认缴纳?"<<endl;
cout <<" 1、是 2、否 "<<endl;
int choice;
cin >> choice;
switch(choice)
{
case 1:
{
if(teach[i].Getpowerfare()==0&&teach[i].Getwaterfee()==0)
{
system ("cls");
cout<<"您已缴过费或无需上缴水电费!"<<endl;break;
}
else
{
teach[i].Pay();
system("cls");
cout<<"缴费成功!"<<endl;break;
}
}
case 2:cout<< "请尽快缴费!" <<endl;break;
default:cout<<"选择有误,请稍后重试!"<<endl;break;
}
cout<<"\n\n请按回车键返回"<<endl;
getchar();
getchar();
system("cls");return;
}
else
{
cout<<"密码错误,请核对后重试。"<<endl;return;
}
}
}
cout<<"查无此人,请稍后重试!"<<endl;
}
//Sources people端功能函数.cpp
#include "student.h"
#include "Teacher.h"
#include "Teacher_message.h"
#include "Student_message.h"
#include "People.h"
void People::putStudent()
{
cout<<"请输入职工号"<<endl;
int number;
cin>>number;
for (int i = 0; i < Teacher_message::amount; i++)
{
if ((t+i)->GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == (t+i)->GetPassword())
{
if ((t+i)->department=="辅导员")
{
int choice;
cout<<"\n\n 1.查看全体同学信息 2.查看未缴费同学信息\n\n"<<endl;
cin>>choice;
switch (choice)
{
case 1:
{
for(int j=0;j < Student_message::amount; j++)
{
(s+j)->output();
}
cout<<"无目标成员!"<<endl;
}
case 2:
{
for(int j=0;j < Student_message::amount; j++)
{
if((s+j)->GetPowerfare()!=0||(s+j)->GetWaterfee()!=0)
(s+j)->output();
}
cout<<"无目标成员!"<<endl;
}
}
}
else
{
cout<<"您非辅导员,无访问权限"<<endl;
}
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
return;
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;
return;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
}
void People::putclassStudent()
{
cout<<"请输入职工号"<<endl;
int number;
cin>>number;
for (int i = 0; i < Teacher_message::amount; i++)
{
if ((t+i)->GetNumber() == number)
{
string pass;
cout<<"请输入密码:";
cin>>pass;
if(pass == (t+i)->GetPassword())
{
if ((t+i)->department=="班导师")
{
int choice;
cout<<"\n\n 1.查看全班同学信息 2.查看未缴费同学信息\n\n"<<endl;
cin>>choice;
switch (choice)
{
case 1:
{
for(int j=0;j < Student_message::amount; j++)
{
if((s+j)->grade == (t+i)->Grade)
(s+j)->output();
}
cout<<"无目标成员!"<<endl;
}
case 2:
{
for(int j=0;j < Student_message::amount; j++)
{
if((s+j)->grade == (t+i)->Grade)
{
if((s+j)->GetPowerfare()!=0||(s+j)->GetWaterfee()!=0)
(s+j)->output();
}
}
cout<<"无目标成员!"<<endl;
}
}
}
else
{
cout<<"您非班导师,无访问权限"<<endl;
}
cout<<"\n\n请按回车键继续"<<endl;
getchar();
getchar();
system("cls");
}
else
{
system("cls");
cout<<"密码错误,请核对后重试。"<<endl;
}
}
}
system("cls");
cout << "此人不存在!请重试! " << endl;
}
//自定义头文件:
//Headers individual.h
#pragma once
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
const int capacity = 5000;
class Individual //声明人员类
{
protected: //为保护信息安全,将个人信息定义为protected类型
string name; //姓名
string sex; //性别
int age; //年龄
int number; //学号或职工号
string password; //个人密码,用于登录,防止他人恶意操作
double water; //用水量
double electric; //用电量
double waterfee; //水费
double powerfare; //电费
public: //功能函数
virtual void input()=0; //声明输入函数
virtual void output()=0; //声明输出函数 //因教师和学生输入、输出的信息不同,所以用纯虚函数实现
string GetName() { return name; } //获取姓名
string GetSex() { return sex; }//获取性别
int GetAge() { return age; } //获取年龄
int GetNumber() { return number; } //获取学号或职工号
string GetPassword(){return password;}//获取个人密码
double GetWater() { return water; } //获取用水量
double GetElectric() { return electric; } //获取用电量
double GetWaterfee() { return CalculateWaterfee(water); }//获得应交水费
double GetPowerfare() { return CalculatePowerfare(electric); }//获得应交电费
double Getwaterfee() {return waterfee;}//获得缴费后水费
double Getpowerfare() {return powerfare;}//获得缴费后电费
void Pay();//声明缴费函数
double CalculateWaterfee(double);//声明计算水费函数
double CalculatePowerfare(double);//声明计算电费函数
};
//Header People.h
#pragma once
#include "Student_message.h"
#include "Teacher_message.h"
class People : public Student_message,public Teacher_message
{
public:
Student *s = stu;
Teacher *t = teach;
void putStudent();
void putUnfareStudent();
};
//Header student.h
#pragma once
#include "individual.h"
class Student : public Individual //定义基于Individual的学生类
{
friend ostream & operator <<(ostream & out,Student & s);
public:
string grade; //声明学生班级(与教工不同)
void input(); //声明学生类输入函数(与教工不同)
void output(); //声明学生类输出函数(与教工不同)
void input(int);//声明学生类编辑函数(重载input)
};
//Header Student_message.h
#pragma once
#include "individual.h"
#include "student.h"
class Student_message //声明学生信息类
{
protected:
int amount; //当前的数据量
Student stu[capacity]; //定义学生数组,用于储存学生信息
public:
Student_message() { amount = 0; } //定义当前学生信息容量为0
void add(); //声明学生信息添加函数
void search(); //声明学生信息查询函数
void show(); //声明学生信息显示函数
void compile(); //声明学生信息编辑函数
void deleting(); //声明学生信息删除函数
virtual void statistics(); //声明学生信息统计函数(区别于教工)
void saving(); //声明学生信息保存函数
void reading(); //声明学生信息读取函数
void payfee(); //声明学生信息缴费函数
};
//Header Teacher.h
#pragma once
#include "individual.h"
class Teacher : public Individual //定义基于Individual的教工类
{
public : //公用数据成员
string department;
string Grade;
void input(); //声明教工类输入函数(与学生不同)
void output(); //声明教工类输出函数(与学生不同)
void input(int);//声明教工类编辑函数(重载input)
};
//Header Teacher_message.h
#pragma once
#include "individual.h"
#include "Teacher.h"
class Teacher_message //声明教工信息类
{
protected:
Teacher teach[capacity];//定义教工数组,用于储存教工信息
int amount; //当前的数据量
public :
Teacher_message() { amount = 0; } //初始记录数据数为 0
void add(); //声明教工信息添加函数
void search(); //声明教工信息查询函数
void show(); //声明教工信息显示函数
void compile(); //声明教工信息编辑函数
void deleting(); //声明教工信息删除函数
void saving(); //声明教工信息保存函数
void statistics();//声明教工信息统计函数
void reading(); //声明教工信息读取函数
void payfee(); //声明教工信息 缴费函数
};