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:
	//参数构造函数,初始化编号、姓名、颜值,女朋友类的身份统一初始化为1
	girlfriend(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;//当前容量加2
		newgr = 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)
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值