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++ -- 基于多态的后宫管理系统(其实就是职工管理或者图书管理系统根据我自己的需求改编,毕竟追我的人太多了,要好好管理一下)相关推荐

  1. . NET C# WPF图书管理系统源码 .net C# WPF图书管理系统源码

    . NET C# WPF图书管理系统源码 .net C# WPF图书管理系统源码 自己开发,纯源码 主要技术:C#.基于wpf开发.sql server数据库的增删改查. 源码特点:代码完整规范,采用 ...

  2. 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统

    目录 1. 需求分析 2. 项目核心设计 2.1 结点插入 2.2 结点删除 3 测试结果 4 总结分析 4.1 调试过程中的问题是如何解决的,以及对设计与实现的回顾讨论和分析 4.2 算法的时间和空 ...

  3. 第二十五章《图书管理系统》第1节:图书管理系统简介

    图书管理系统具有图书信息管理.读者信息管理和借阅信息管理三大功能模块,本小节将从软件功能.数据库系统设计和项目结构几个方面介绍该软件系统的设计方案. 25.1.1系统功能简介 图书管理系统第一大功能模 ...

  4. java简单图书管理系统的代码,java编写的图书管理系统源代码

    <java编写的图书管理系统源代码>由会员分享,可在线阅读,更多相关<java编写的图书管理系统源代码(6页珍藏版)>请在人人文库网上搜索. 1.用户登陆数据库代码:impor ...

  5. web图书销售管理系统_Java Web实现简易的图书管理系统

    Java Web实现简易的图书管理系统 这是一个使用Java Web相关的知识做出来的网页图书管理系统,使用的数据库为mysql. 程序中实现了登录功能和对图书表.图书类别表的增删查改功能. 因为我对 ...

  6. java代码实现图书管理_Java图书管理系统(用Java常用集合实现)(示例代码)

    图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...

  7. 基于java的图书管理系统外文翻译_外文翻译-图书管理系统的设计与实现.doc

    1.外文资料翻译译文 在高性能计算领域中Java的研究.实践和经验 第八章 网络层--路由器 在这一章中,我们基于网络层地址的IPv6的最后一个组成部分:路由器.我们提出了一个基线协议设计为典型的传感 ...

  8. php 文件管理系统_如何编写程序实现图书管理系统的个人图书借阅查询功能

    上节课完成了公共图书库存查询功能. 这节课来完成用户个人信息查询功能. 编写用户个人信息查询功能 首先需要编写一个用户通过IC卡号和密码登录的功能,登录成功之后页面显示用户的信息,包括借阅历史清单以及 ...

  9. python django图书管理系统_Python框架:Django写图书管理系统(LMS)

    Django模版文件配置 文件路径 test_site -- test_site -- settings.py TEMPLATES = [ { 'BACKEND': 'django.template. ...

最新文章

  1. DevOps火爆,招人却太难了!
  2. c#判断右键菜单(ContextMenuStrip)是从哪个控件弹出来的方法
  3. 转:微软未公开的几个过程介绍及用法
  4. 开源代码上新!6 份最新「Paper + Code」 | PaperDaily #17
  5. python copy函数用法_Python深浅拷贝
  6. 用户id可以出现在url中吗_下载Google Drive中的文件
  7. 谈通过测试与失败测试
  8. 单字节字符集,多字节字符集,Unicode
  9. NRF52832学习笔记
  10. Mac eclipse adt sdkmanager打不开
  11. 基于Java模板技术动态生成Word文档
  12. 嵌入式平台C语言实现二阶滤波器
  13. 手写签名制作电子签名详细步骤
  14. LM75AD温度传感器读写
  15. 全球及中国中线静脉插管行业研究及十四五规划分析报告
  16. 无穷小微积分吁呼中俄数学中心成立!
  17. MQTT连接阿里云物联网平台步骤
  18. pandas输出excel文件添加表头标题,样式装饰器
  19. linux怎样保存文件,linux不能保存文件如何解决
  20. 【Mybatis】一个Mybatis程序

热门文章

  1. 2019—猪年的愚人节
  2. 对于“2017面向对象程序设计(Java)第五周工作总结”存在问题的反馈及本周教学计划...
  3. 男人为什么容易掉头发?
  4. ES6—ES13总结
  5. Python程序员别秃了,护发防脱发小妙招,收藏吧
  6. 四分之一车辆ABS系统滑移率控制(附simulink模型)
  7. 桥牌坐庄训练bm2000 level3闯关记录——A7
  8. 零基础学习web前端开发应该先学习什么
  9. 用python画国旗的程序_利用python画国旗(示例)
  10. 互联网招聘的阴阳两极