(学习)用C++实现一个小型的排班系统:
话不多说 直接上代码:
#include <iostream>
#include <stdlib.h>
#include <iomanip> //设置流操作符
#include <fstream>
#include<istream> //getline函数会用到
#include<string>
//文件流操作
using namespace std;
class ABC { //类HIS
private:
string name; //姓名
string roster; //排班
string department; //科室
public:
ABC(); //构造函数
char inter_face(); //首页
void add_person(); //添加医生
void del_person(); //删除医生
void show_all(); //显示所有医生
void alter(); //修改信息
void select(); //查询医生
void save_new(); //保存新增加的医生
};
ABC::ABC() {
name = "\0";
roster = "\0";
department = "\0";
}
//首页
char ABC::inter_face() { //实现首界面的函数
system("cls"); //清屏操作
cout << endl;
cout
<< " ._________________________. " << endl
<< " | _______________________ | " << endl
<< " | I I | " << endl
<< " | I ABC医院管理系统 I | " << endl
<< " | I_____________________I | " << endl
<< " !_________________________! " << endl
<< " (1) 添加医生 " << endl
<< " (2) 删除医生 " << endl
<< " (3) 显示医生 " << endl
<< " (4) 修改信息 " << endl
<< " (5) 查询医生 " << endl
<< " (6) 关闭系统 " << endl
<< endl
<< " 选择 :";
char choose;
cin >> choose;
return choose;
}
void ABC::add_person() { //类外定义添加医生函数
cout << "请输入新医生信息" << endl;
cout << "姓名 : ";
cin >> name;
cout << "科室 : ";
cin >> department;
cout << "排班 : ";
cin >> roster;
save_new();
cout << "新信息已经保存!" << endl;
system("pause");
}
void ABC::del_person() { //类外定义删除医生函数
string sign, str1, str; //定义字符串
bool flag = true; //布尔型变量初始为真
cout << "你要删除输入姓名或科室号 :" << endl; //输入要查找的相关信息
cin >> sign;
ofstream outData("temp.txt", ios::out); //磁盘文件的输出
ifstream inData("pHIS.txt", ios::in); //输入
if (!outData || !inData) { //判断
cout << "对不起,找不到文件!" << endl;
system("pause");
}
while (inData >> name >> department) { //将数组或字符输入indata
getline(inData, str); //接收一个字符串
if ((sign == name) || (sign == department)) { //存在此医生
cout << "你想删除的医生:" << endl;
cout << str1 << endl;
cout << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl; //左对齐
flag = false;
break;
}
outData << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;
}
if (flag) {
cout << endl << "系统中不存在!" << endl << endl;
}
else {
while (getline(inData, str)) {
outData << str << endl;
}
outData.close();
inData.close();
ofstream out("pHIS.txt", ios::out);
ifstream in("temp.txt", ios::in);
if (!out || !in) {
cout << endl << "对不起不能打开文件!" << endl << endl;
system("pause");
return;
}
while (getline(in, str)) {
out << str << endl;
}
out.close(); //文件流关闭
in.close();
cout << endl << "信息已中删除!" << endl << endl;
}
system("pause");
}
void ABC::show_all() { //显示所有医生
//类外定义显示所有医生函数
ifstream inData("pHIS.txt", ios::in);
if (!inData) {
cout << endl << "对不起,没有找到文件!" << endl;
system("pause");
return;
}
bool flag = true;
string record;
while (getline(inData, record)) {
if (flag) {
cout << endl << "所有医生信息如下: \n" << endl;
}
cout << " 姓名\t\t" << "科室\t\t" << "排班\t\t" << endl;
cout << record << endl;
flag = false;
}
if (flag) {
cout << endl << "你的HIS医院管理系统中没有医生!" << endl << endl;
}
else {
cout << endl << "所有医生已经全部显示!" << endl << endl;
}
system("pause");
}
//修改信息
void ABC::alter() { //类外定义显示信息函数
ofstream outData("temp.txt", ios::out);
ifstream inData("pHIS.txt", ios::in);
if (!outData || !inData) { //任意为假值运行
cout << endl << "找不到文件!" << endl;
system("pause");
return;
}
string sign;
cout << endl << "你要修改输入姓名或科室号 :";
cin >> sign;
bool flag = true;
string str;
while (inData >> name >> department) {
getline(inData, str);
if ((sign == name) || (sign == department)) {
cout << endl << "你想修改的医生:" << endl << endl;
cout << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;
cout << endl << "请修改信息 : " << endl;
cout << "姓名 :";
cin >> name;
cout << "科室 :";
cin >> department;
cout << "排班 :";
cin >> roster;
save_new();
flag = false;
break;
}
outData << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;
}
if (flag) {
cout << endl << "医系统中不存在!" << endl;
}
else {
while (getline(inData, str)) {
outData << str << endl;
}
outData.close();
inData.close();
ofstream out("pHIS.txt", ios::out);
ifstream in("temp.txt", ios::in);
if (!out || !in) {
cout << endl << "对不起不能打开文件!!!" << endl;
system("pause");
return;
}
while (getline(in, str)) {
out << str << endl;
}
out.close();
in.close();
cout << "已修改!!!" << endl;
}
system("pause");
}
//查询医生
void ABC::select() { //类外定义查询医生函数
ifstream inData("pHIS.txt", ios::in);
if (!inData) {
cout << endl << "文件找不到!" << endl;
system("pause");
return;
}
string sign;
cout << endl << "输入你想查找的医生的姓名或科室: ";
cin >> sign;
bool flag = true;
string str;
while (inData >> name >> department) {
getline(inData, str);
if ((name == sign) || (department == sign)) {
cout << endl << "你要查找的医生是: " << endl << endl;
cout << setiosflags(ios::left) << setw(17) << name << department << str << endl;
flag = false;
//system("pause");
}
}
}
void ABC::save_new() { //类外定义保存医生函数
ofstream outData("pHIS.txt", ios::app);
if (!outData) {
cout << "对不起,打开文件失败!" << endl;
system("pause");
return;
}
outData << setiosflags(ios::left) << setw(17) << name << " " << setw(16) << department << " " << setw(20) << roster << endl;
outData.close();
}
enum power { a1 = '1', a2 = '2', a3 = '3', a4 = '4', a5 = '5', a6 = '6' };
int main() {
char choose;
HIS song;
while (choose = song.inter_face()) {
switch (choose) {
case a1:
song.add_person();//添加医生
break;
case a2:
song.del_person();//删除医生
break;
case a3:
song.show_all();//显示所有医生
break;
case a4:
song.alter();//修改信息
break;
case a5:
song.select();//查询医生
break;
case a6:
cout << endl << "谢谢使用!" << endl << endl;
exit(0);
break;
default:
break;
}
}
return 0;
}
在这里插入代码片
补充关于 getline() 和 get() 函数 :
为了能读取一行字符串输入,cin 提供了一些面向行的类成员函数:getline() 和 get()。这两个函数都读取一行输入,直到到达换行符。然而,随后 getline() 会丢弃换行符,而 get() 将换行符保留在输入序列中。下面详细介绍它们,首先介绍 getline()。
*面向行的输入:istream& getline(char p, int n, char c)
getline() 函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用 cin.getline()。
该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数量。
如果参数是 20,那么最多可以读取 19 个字符,余下的空间用于存储自动在结尾处添加的空字符。如果在读取 n-1 个字符之前遇到终止字符(第三个参数不写,默认为 ‘\n’ ),则提前结束。getline() 成员函数在读取指定数目的字符或遇到换行符时停止读取。
getline(cin, inputLine),其中 cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称。需要注意的是,它不是类方法。
*面向行的输入:istream & get(char p, int n, char c)
另一个名为 get() 的成员函数,该函数有几种变体。其中一种变体的工作方式和 getline() 类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。
情况1:当输入的字符数小于 n 时遇到终结符,get() 并不再读取并丢弃终结符,而是将其留在输入队列中。而 getline 函数将读取这个字符但是不存进 p 所指的数组中,而是将其丢弃。当然,两者都会在读取的字符串后面自动加上 ‘\0’。假设我们连续两次调用 get():
cin.get(name, Asize);
cin.get(dessert, Asize); //dessert没有内容
在这里插入代码片
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到第一个字符便是换行符。因此 get() 认为已到达行尾,而没有发现任何可读取的内容。如果不借助于帮助,get() 将不能跨过该换行符。这时可以使用 get() 的另一种变体。使用不带任何参数的 cin.get() 调用可读取下一个字符(即使是换行符)。
cin.get(name, Asize);
cin.get();
cin.get(dessert, Asize);
在这里插入代码片
另一种使用get()函数的方法是将两个类成员函数拼接起来:
cin.get(name, Asize).get();
在这里插入代码片
之所以可以这样做,是由于 cin.get(name, Asize) 返回一个 cin 对象,该对象随后将被用来调用 get() 函数。同样,下面的语句将输入中连续的两行分别读入到数组 name1 和数组 name2 中,其效果与两次调用 cin.getline() 相同:
cin.getline(name1, Asize).getline(name2, Asize);
在这里插入代码片