C++ -- 基于多态的后宫管理系统(其实就是职工管理或者图书管理系统根据我自己的需求改编,毕竟追我的人太多了,要好好管理一下)
Linux环境下C++基于多态的后宫管理系统
实现如下几个功能
后宫每位佳丽都有4个属性,分别是编号、姓名、颜值、身份
并且把数据保存到文件中,保证数据不会在程序结束时流失,下一次使用还可以恢复以前的数据
让我们来看看添加功能
当输入正确时添加成功
当输入编号已经存在或者身份不对时,提示输入失败
显示功能,输入2显示所有人信息
删除功能
两种模式,姓名模式输入要删除的姓名,编号模式输入要删除的编号,当有重名人时,不能用姓名模式删除,当输入的编号或姓名不存在时,提示用户不存在
其他经过测试都是成功的,就不一一放图了
修改功能也是姓名和编号两种方式查找,找到了重新输入信息,找不到提示不存在
排序功能有4个模式,按照编号的升降序和按照颜值的升降序。
查看功能就是输入姓名或者编号,存在则打印这个人的信息
不存在则提示不存在
程序源码:
#include"iostream"
#include"stdlib.h"
#include"string"
#include"fstream"
#define FILENAME "a.txt"
using namespace std;
//枚举类型,(退出,添加,显示,删除,修改,排序,查找)
enum
{quit,add,display,del,alter,sort,Find,
};
//女孩类,抽象类,无法实例化
class girl
{public://纯虚函数virtual void work() = 0;//编号int num;//姓名string name;//颜值int yanzhi;//身份int sf;
};
//女朋友类,继承女孩类
class girlfriend : public girl
{public://参数构造函数,初始化编号、姓名、颜值,女朋友类的身份统一初始化为1girlfriend(int a, string b, int c){sf = 1;num = a;name = b;yanzhi = c;}//多态,重写父类的纯虚函数,实现打印信息void work(){cout << "编号: " << num << " "<< "\t姓名: " << name << " " << "\t颜值: " << yanzhi << " "<< "\t身份: 女友" << endl;}
};
//备胎类,也是女孩类的子类,继承了女孩类,功能同上,身份为2
class spare : public girl
{public:spare(int a, string b, int c){sf = 2;num = a;name = b;yanzhi = c;}void work(){cout << "编号: " << num << " "<< "\t姓名: " << name << " " << "\t颜值: " << yanzhi << " "<< "\t身份: 备胎" << endl;}
};
//丑女类,叫丑女不太好,就称之为潜力股把,功能同上,身份为3
class ugly : public girl
{public:ugly(int a, string b, int c){sf = 3;num = a;name = b;yanzhi = c;}void work(){cout << "编号: " << num << " "<< "\t姓名: " << name << " " << "\t颜值: " << yanzhi << " "<< "\t身份: 潜力股" << endl;}
};//管理类,包含该系统的各种功能
class guanli
{public:int nowmemory;//记录当前内存空间大小int point;//位置指针,永远指向第一个空的元素,同时记录元素个数girl **gr;//女孩类指针数组girl **newgr;//扩容用的零时女孩类指针数组
//构造函数,初始化数组元素为2,当前内存空间为2,位置指针指向0号元素,同时记录数组现有0个元素guanli(){gr = new girl*[2];nowmemory = 2;point = 0;}
//析构函数,释放堆空间~guanli(){for(int i=0; i<point ;i++){delete gr[i];gr[i] = NULL;}delete gr;gr = NULL;delete newgr;newgr = NULL;}
//扩容,当前内存已经存满时,调用该函数实现扩容void kuoron(){nowmemory+=2;//当前容量加2newgr = new girl*[nowmemory];//开辟新的更大的堆空间if(gr != NULL)//如果开辟成功{//复制原来空间的内容到当前空间,并且释放掉原来的空间for(int i=0; i<point; i++){newgr[i] = gr[i];}delete gr;gr = newgr;}}
//初始化,从文件中读取数据到堆空间void init(){ifstream fp;//创建只读文件流fp.open(FILENAME, ios::in);//以只读方式打开if( !fp.is_open() )//判断打开是否成功{cout << "打开文件失败" << endl;return;}
//编号、姓名、颜值、身份的零时变量int n;string str;int yz;int sf;
//读取文件中数据,根据身份创建不同的子类空间,统一用父类指针维护while(fp >> n && fp >> str && fp >> yz && fp >> sf){if(point >= nowmemory)//若空间满,则扩容{kuoron();}if(sf == 1){gr[point] = new girlfriend(n, str, yz);} if(sf == 2){gr[point] = new spare(n, str, yz);} if(sf == 3){gr[point] = new ugly(n, str, yz);}point++; }fp.close();//关闭文件}
//保存,将堆空间的数据保存到文件中void save(){ofstream fp;//创建只写文件流fp.open(FILENAME, ios::out);//打开文件if( !fp.is_open() )//判断是否打开成功{cout << "打开文件失败" << endl;return;}for(int i=0; i<point; i++)//循环写文件,同一类的成员属性用空格隔开,写完全部属性换行写下一个,直到写完{fp << gr[i]->num << " "<< gr[i]->name << " "<< gr[i]->yanzhi << " "<< gr[i]->sf << endl; }fp.close();//关闭文件}
//打印菜单void menu(){cout << "*****后宫管理系统*****" << endl;cout << "**1.添加 2.显示**" << endl; cout << "**3.删除 4.修改**" << endl; cout << "**5.排序 6.查找**" << endl; cout << "******0.退出系统******" << endl; }
//显示,循环遍历指针数组各个元素,调用其work()显示void Display(){for (int i=0; i<point; i++){gr[i]->work();}}
//退出void Exit(){cout << "按回车键退出" << endl;getchar();getchar();exit(0);}
//按照编号查找int Fine(int n){//遍历指针数组,找到对应编号的元素返回下标,若找不到返回-1for(int i=0; i<point; i++){if( gr[i]->num == n ){return i;}}return -1;}
//按照姓名查找int nameFine(string str, int j){//遍历指针数组,找到对应的姓名,返回元素下标,若找不到返回-1for(int i=j; i<point; i++){if( gr[i]->name == str ){return i;}}return -1;}
//查找功能函数void Fine_fun(){//选择查找方式int n; cout << "请选择模式->" << endl;cout << "1.姓名模式" << endl;cout << "2.编号模式" << endl;cin >> n;
//选择1,按姓名查找if( n == 1 ){Display();//显示string str;//存储姓名cout << "请输入姓名-> " ;cin >> str;//输入要查找的姓名int ret = nameFine(str, 0);//传入姓名查找函数,从数组第0位开始找if(ret >= 0)//如果返回值大于等于0,表示找到,但是有可能有同名的人,所以要继续找{gr[ret]->work();//打印找到的人的信息while(ret != point && ret >= 0)//当数组没有遍历完{ret = nameFine(str, ret+1);//重刚才找到的位置的下一个开始继续找,直到把所有人找完if(ret != point && ret >= 0){gr[ret]->work();}}}elsecout << str << "不存在" << endl;//找不到则打印不存在}
//选择2,按照编号查找,编号不能有相同的,所以找到一个就可以不用再找了,找不到则打印不存在if( n == 2 ){Display();int a;cout << "请输入编号->" ;cin >> a;int ret = Fine(a);if(ret >= 0){gr[ret]->work();}else cout << "编号" << a << "不存在" << endl;}cout << "请按回车键继续" << endl;getchar();getchar();system("clear");}
//添加void add(){Display();//显示int n;//编号int y;//颜值int num;//身份string na;//姓名if(nowmemory <= point)//判断容量是否够,不够就扩容{kuoron();}cout << "请输入添加人的编号-> ";cin >> n;//输入编号int ret = Fine(n);//查找编号是否存在if(ret >= 0)//若存在,则直接退出,无法添加{cout << "该编号已经存在" << endl;cout << "请按回车键继续" << endl;getchar();getchar();system("clear");return;}
//编号不存在,则该编号可用,继续输入其他信息cout << "请输入添加人的姓名-> ";cin >> na;cout << "请输入添加人的颜值-> ";cin >> y;cout << "请选择添加人的身份-> " << endl<< "1. 女友 " << "2. 备胎 " << "3. 潜力股" << endl;cin >> num;
//根据身份创建不同的子类switch(num){case 1:{gr[point] = new girlfriend(n, na, y);gr[point]->work();cout << "添加成功!!" << endl;break;}case 2:{gr[point] = new spare(n, na, y);gr[point]->work();cout << "添加成功!!" << endl;break;}case 3:{gr[point] = new ugly(n, na, y);gr[point]->work();cout << "添加成功!!" << endl;break;}default :{cout << "输入错误" << endl;break;}}
//判断身份是否输入正确,正确则 同时记录空位和元素个数的指针poing加一,并且保存数据到文件中if(num == 1 || num == 2 || num == 3){point++;save();}cout << "请按回车键继续" << endl;getchar();getchar();system("clear");}
//删除void del(){int n;Display();
//选择查找模式,掉用查找函数找到对应的人cout << "请选择模式->" << endl;cout << "1.姓名模式" << endl;cout << "2.编号模式" << endl;cin >> n;if( n == 1 ){string str;int flag = 0;cout << "请输入要删除的姓名-> " ;cin >> str;int ret = nameFine(str, 0);if(ret >= 0){gr[ret]->work();int ret2 = ret;while(ret2 != point && ret2 >= 0){ret2 = nameFine(str, ret2+1);if(ret2 != point && ret2 >= 0){gr[ret2]->work();flag++;}}
//如果找到多个同名的人,就不能用姓名模式删除,将同名人信息打印出来,并且提示用户要用编号模式删除if(flag > 0){cout << "有多个" << str << endl;cout << "请使用编号模式删除" << endl;}else{for(int i=ret+1; i<point; i++){gr[i-1] = gr[i];} point--;cout << "删除成功!" << endl;Display();}}elsecout << str << "不存在" << endl;}if( n == 2 ){int a;cout << "请输入要删除的编号->" ;cin >> a;int ret = Fine(a);
//找到对应编号元素,将后面的元素依次向前移动,point--if(ret >= 0){gr[ret]->work();for(int i=ret+1; i<point; i++){gr[i-1] = gr[i];}point--;cout << "删除成功!" << endl;Display();}else cout << "编号" << a << "不存在" << endl;}save();cout << "请按回车键继续" << endl;getchar();getchar();system("clear");}
//修改void Alter(){//同样是两种方式查找对应的人,然后进行修改int n;Display();cout << "请选择模式->" << endl;cout << "1.姓名模式" << endl;cout << "2.编号模式" << endl;cin >> n;if(n == 1 ){string str;int no;string m;int yz;int sf;int flag = 0;cout << "请输入要修改的姓名-> ";cin >> str;int ret = nameFine(str, 0);if(ret >= 0){gr[ret]->work();int ret2 = ret;while(ret2 != point && ret2 >= 0){ret2 = nameFine(str, ret+1);if(ret2 != point && ret2 >= 0){gr[ret2]->work();flag++;}}
//有多个同名的依旧无法用姓名模式if(flag > 0){cout << "有多个" << str << endl;cout << "请使用编号模式修改" << endl;}else{cout << "请输入新的编号->";cin >> no;if( Fine(no) >=0 && Fine(no) != ret){cout << "编号" << no << "已存在" <<endl;cout << "请输入回车键继续" << endl;getchar();getchar();system("clear");return;}cout << "请输入新的姓名->";cin >> m;cout << "请输入新的颜值->";cin >> yz;cout << "请输入新的身份->" << endl<< "1. 女友 " << "2. 备胎 " << "3. 潜力股" << endl;cin >> sf;
//根据更改的身份重新创建子类if(sf == 1){gr[ret] = new girlfriend(no, m, yz);cout << "修改成功!" << endl;}else if(sf == 2){gr[ret] = new spare(no, m, yz);cout << "修改成功!" << endl;}else if(sf == 3){gr[ret] = new ugly(no, m, yz);cout << "修改成功!" << endl;}elsecout << "输入错误" << endl;Display();}}elsecout << str << "不存在" << endl;}
//编号模式修改if(n == 2){int n;int no;string m;int yz;int sf;cout << "请输入要修改的编号->";cin >> n;int ret = Fine(n);if(ret >= 0){gr[ret]->work();cout << "请输入新的编号->"; cin >> no;if( Fine(no) >= 0 && Fine(no) != ret){cout << "编号" << no << "已存在" << endl;cout << "请输入回车键继续" << endl;getchar();getchar();system("clear");return;}cout << "请输入新的姓名->";cin >> m;cout << "请输入新的颜值->";cin >> yz;cout << "请输入新的身份->" << endl<< "1. 女友 " << "2. 备胎 " << "3. 潜力股" << endl;cin >> sf;if(sf == 1){gr[ret] = new girlfriend(no, m, yz);cout << "修改成功!" << endl;}else if(sf == 2){gr[ret] = new spare(no, m, yz);cout << "修改成功!" << endl;}else if(sf == 3){gr[ret] = new ugly(no, m, yz);cout << "修改成功!" << endl;}elsecout << "输入错误" << endl;Display();}elsecout << "编号" << no << "不存在" << endl;}save();cout << "请按回车键继续" << endl;getchar();getchar();system("clear");}
//排序void Sort(){//设计4种排序方式,分别是按颜值或者编号升降序int n;cout << "请输入排序模式" << endl;cout << "1.编号升序" << endl;cout << "2.编号降序" << endl;cout << "3.颜值升序" << endl;cout << "4.颜值降序" << endl;cin >> n;
//编号排序,用冒泡排序法if(n == 1){for(int i=0; i<point; i++){for(int j=0; j<point-i-1; j++){if(gr[j]->num > gr[j+1]->num){girl *temp;temp = gr[j+1];gr[j+1] = gr[j];gr[j] = temp;}}}cout << "编号升序排序完成!" << endl;Display();}else if(n == 2){for(int i=0; i<point; i++){for(int j=0; j<point-i-1; j++){if(gr[j+1]->num > gr[j]->num){girl *temp;temp = gr[j+1];gr[j+1] = gr[j];gr[j] = temp;}}}cout << "编号升序排序完成!" << endl;Display();}
//颜值排序用的时选择排序else if(n == 3){for(int i=0; i<point; i++){for(int j=i; j<point; j++){if(gr[i]->yanzhi > gr[j]->yanzhi){girl *temp;temp = gr[j];gr[j] = gr[i];gr[i] = temp;}}}cout << "颜值升序排序完成" << endl;Display();}else if(n == 4){for(int i=0; i<point; i++){for(int j=i; j<point; j++){if(gr[i]->yanzhi < gr[j]->yanzhi){girl *temp;temp = gr[j];gr[j] = gr[i];gr[i] = temp;}}}cout << "颜值降序排序完成" << endl;Display();}elsecout << "输入错误" << endl;save();cout << "请按回车键继续" << endl;getchar();getchar();system("clear");}
};//主函数
int main()
{int input;//选择功能的变量 guanli G;//创建管理对象system("clear");//linux环境下的清屏G.init();//初始化while(1){G.menu();//打印菜单cout << "请选择-> " << endl;//提示用户选择cin >> input;switch(input)//根据不同的输入实现各个功能{case quit:G.Exit();break;case add:G.add();break;case display:{G.Display();cout << "请按回车键继续" << endl;getchar();getchar();system("clear");break;}case del:G.del();break;case alter:G.Alter();break;case sort:G.Sort();break;case Find:G.Fine_fun();break;}}return 0;
}
C++ -- 基于多态的后宫管理系统(其实就是职工管理或者图书管理系统根据我自己的需求改编,毕竟追我的人太多了,要好好管理一下)相关推荐
- . NET C# WPF图书管理系统源码 .net C# WPF图书管理系统源码
. NET C# WPF图书管理系统源码 .net C# WPF图书管理系统源码 自己开发,纯源码 主要技术:C#.基于wpf开发.sql server数据库的增删改查. 源码特点:代码完整规范,采用 ...
- 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统
目录 1. 需求分析 2. 项目核心设计 2.1 结点插入 2.2 结点删除 3 测试结果 4 总结分析 4.1 调试过程中的问题是如何解决的,以及对设计与实现的回顾讨论和分析 4.2 算法的时间和空 ...
- 第二十五章《图书管理系统》第1节:图书管理系统简介
图书管理系统具有图书信息管理.读者信息管理和借阅信息管理三大功能模块,本小节将从软件功能.数据库系统设计和项目结构几个方面介绍该软件系统的设计方案. 25.1.1系统功能简介 图书管理系统第一大功能模 ...
- java简单图书管理系统的代码,java编写的图书管理系统源代码
<java编写的图书管理系统源代码>由会员分享,可在线阅读,更多相关<java编写的图书管理系统源代码(6页珍藏版)>请在人人文库网上搜索. 1.用户登陆数据库代码:impor ...
- web图书销售管理系统_Java Web实现简易的图书管理系统
Java Web实现简易的图书管理系统 这是一个使用Java Web相关的知识做出来的网页图书管理系统,使用的数据库为mysql. 程序中实现了登录功能和对图书表.图书类别表的增删查改功能. 因为我对 ...
- java代码实现图书管理_Java图书管理系统(用Java常用集合实现)(示例代码)
图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...
- 基于java的图书管理系统外文翻译_外文翻译-图书管理系统的设计与实现.doc
1.外文资料翻译译文 在高性能计算领域中Java的研究.实践和经验 第八章 网络层--路由器 在这一章中,我们基于网络层地址的IPv6的最后一个组成部分:路由器.我们提出了一个基线协议设计为典型的传感 ...
- php 文件管理系统_如何编写程序实现图书管理系统的个人图书借阅查询功能
上节课完成了公共图书库存查询功能. 这节课来完成用户个人信息查询功能. 编写用户个人信息查询功能 首先需要编写一个用户通过IC卡号和密码登录的功能,登录成功之后页面显示用户的信息,包括借阅历史清单以及 ...
- python django图书管理系统_Python框架:Django写图书管理系统(LMS)
Django模版文件配置 文件路径 test_site -- test_site -- settings.py TEMPLATES = [ { 'BACKEND': 'django.template. ...
最新文章
- DevOps火爆,招人却太难了!
- c#判断右键菜单(ContextMenuStrip)是从哪个控件弹出来的方法
- 转:微软未公开的几个过程介绍及用法
- 开源代码上新!6 份最新「Paper + Code」 | PaperDaily #17
- python copy函数用法_Python深浅拷贝
- 用户id可以出现在url中吗_下载Google Drive中的文件
- 谈通过测试与失败测试
- 单字节字符集,多字节字符集,Unicode
- NRF52832学习笔记
- Mac eclipse adt sdkmanager打不开
- 基于Java模板技术动态生成Word文档
- 嵌入式平台C语言实现二阶滤波器
- 手写签名制作电子签名详细步骤
- LM75AD温度传感器读写
- 全球及中国中线静脉插管行业研究及十四五规划分析报告
- 无穷小微积分吁呼中俄数学中心成立!
- MQTT连接阿里云物联网平台步骤
- pandas输出excel文件添加表头标题,样式装饰器
- linux怎样保存文件,linux不能保存文件如何解决
- 【Mybatis】一个Mybatis程序