C++泛型编程

使用泛型编程和文件完成此项目,对于不同数据类型(包括复杂的数据类型),采用一个数据类型一个文件(不包括string类型,string类型是一个对象),使用了文件运算符重载和输入输出运算符重载。

#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
#define YES 0
int number = 0;
int del = 0;
int seek = 0;
int mdf = 0;
int add = 0;
template <class T>
class Node
{
public:
	void set_next(Node<T>* _next) { next = _next; }
	T& get_data() { return data; }
	const char* GetClassName() { return typeid(*this).name(); }
	Node<T>* get_next() { return next; }
private:
	T data;
	Node<T>* next;
};

template <class T>
class List
{
public:
	List() { head = new Node<T>; head->set_next(NULL);}
	Node<T>* get_head() { return head; }
	void Output(Node<T>* head);
	void Delete(Node<T>* head);
	void Add(Node<T>* head);
	void Modify(Node<T>* head);
	void Seek(Node<T>* head);
	void Sort(Node<T>* head);
	void CreateWorkerList(Node<T>* head);
	void infile_worker(Node<T>* head);
private:
	Node<T>* head;
};


template <class T>
void List<T>::Output(Node<T>* head)
{
	Node<T>* p = head->get_next();
	List<T>* lp = NULL;
	lp->Sort(head);
	while (p)
	{
		cout << p->get_data();
		p = p->get_next();
	}
	_getch();
}

template <class T>
void List<T>::Add(Node<T>* head)
{
	Node<T>* pp = head;
	Node<T>* qq = head->get_next();
	Node<T>* q = new Node<T>;
	int flag = 0;
	int cnt = 0;
	while (pp->get_next())
	{
		pp = pp->get_next();
	}
	while (1)
	{
		cin >> q->get_data();
		if (add == 1)
		{
			break;
		}
		while (qq)
		{
			if (qq->get_data() == q->get_data())
			{
				flag = 1;
				break;
			}
			qq = qq->get_next();
		}

		if (flag)
		{
			cnt++;
			cout << "已有此数据!\n";
			flag = 0;
			qq = head->get_next();
		}
		else
		{
			add = 1;
		}
		if (cnt == 3)
		{
			cout << "您已三次输入错误信息!请返回上一页面查询正确信息!\n";
			system("pause");
			return;
		}
	}

	q->set_next(NULL);
	pp->set_next(q);
	List<T>* lp = NULL;
	lp->infile_worker(head);
	number++;
}

template <class T>
void List<T>::Delete(Node<T>* head)
{
	int flag = 0;
	int cnt = 0;
	Node<T>* p = head->get_next();
	Node<T>* pp = head;
	Node<T>* q = new Node<T>;
	if (!p)
	{
		cout << "暂无数据信息!无需删除\n";
		system("pause");
		return;
	}
	while (cin >> q->get_data())
	{
		while (p)
		{
			if (p->get_data() == q->get_data())
			{
				flag = 1;
				break;
			}
			p = p->get_next();
		}
		if (flag)
		{
			break;
		}
		else
		{
			cnt++;
			cout << "暂无此数据!\n";
			p = head->get_next();
		}
		if (cnt == 3)
		{
			cout << "您已三次输入错误!请返回上一页面查询正确信息!\n";
			system("pause");
			return;
		}
	}
	p = head->get_next();
	while (p)
	{
		if (p->get_data() == q->get_data())
		{
			pp->set_next(p->get_next());
		}
		p = p->get_next();
		pp = pp->get_next();
	}
	delete q;
	q = NULL;
	cout << "删除成功!";
	system("pause");
	List<T>* list = NULL;
	list->infile_worker(head);
}

template <class T>
void List<T>::Modify(Node<T>* head)
{
	Node<T>* p = head->get_next();
	Node<T>* pp = head;
	List<T>* lp = NULL;
	int flag = 0;
	int sign = 0;
	int cnt = 0;
	if (!p)
	{
		cout << "暂无数据信息!无需修改\n";
		system("pause");
		return;
	}
	while (cin >> pp->get_data())
	{
		while (p)
		{
			if (p->get_data() == pp->get_data())
			{
				flag = 1;
				break;
			}
			p = p->get_next();
		}
		if (flag)
		{
			break;
		}
		else
		{
			cnt++;
			cout << "暂无此数据!\n";
			p = head->get_next();
		}
		if (cnt == 3)
		{
			cout << "您已三次输入错误信息!请返回上一页面查询正确信息!\n";
			system("pause");
			return;
		}
	}
	while (1)
	{
		system("cls");
		cout << "\n1.修改性别\t2.修改年龄\t3.修改工资\t4.返回\n";
		switch (_getch())
		{
		case '1':
			system("cls");
			mdf = 2;
			cin >> p->get_data();
			lp->infile_worker(head);
			cout << "修改成功!\n";
			system("pause");
			break;
		case '2':
			system("cls");
			mdf = 3;
			cin >> p->get_data();
			lp->infile_worker(head);
			cout << "修改成功!\n";
			system("pause");
			break;
		case '3':
			system("cls");
			mdf = 4;
			cin >> p->get_data();
			lp->infile_worker(head);
			cout << "修改成功!\n";
			system("pause");
			break;
		case '4':
			system("cls");
			sign = 1;
			break;
		}
		if (sign)
		{
			break;
		}
	}

}

template <class T>
void List<T>::Seek(Node<T>* head)
{
	Node<T>* p = head->get_next();
	Node<T>* q = new Node<T>;
	int flag = 0;
	int cnt = 0;
	if (!p)
	{
		cout << "暂无数据信息!\n";
		system("pause");
		return;
	}
	while (cin >> q->get_data())
	{
		while (p)
		{
			if (p->get_data() == q->get_data())
			{
				flag = 1;
				break;
			}
			p = p->get_next();
		}
		if (flag)
		{
			break;
		}
		else
		{
			cnt++;
			cout << "暂无此数据!\n";
			p = head->get_next();
		}
		if (cnt == 3)
		{
			cout << "您已三次输入错误信息!请返回上一页面查询正确信息!\n";
			system("pause");
			return;
		}
	}
	cout << "\n数据如下:\n";
	cout << p->get_data();
	cout << "\n";
	system("pause");

}

template <class T>
void List<T>::Sort(Node<T>* head)
{
	Node<T>* f, * x, * y, * p;
	f = NULL;
	if (head->get_next() == NULL)
	{
		cout << "暂无数据!\n";
		return;
	}
	while (f != head->get_next()->get_next())
	{
		for (p = head; p->get_next()->get_next() != f; p = p->get_next())
		{
			if (p->get_next()->get_data()> p->get_next()->get_next()->get_data())
			{
				x = p->get_next();
				y = p->get_next()->get_next();
				p->set_next(y);
				x->set_next(y->get_next());
				y->set_next(x);
			}
		}
		f = p->get_next();
	}
	return;
}


template <class T>
void List<T>::CreateWorkerList(Node<T>* head)
{
	string classname;
	ifstream infile;
	Node<T>* p = NULL, * q = NULL;
	p = head;
	q = new Node<T>;
	q->set_next(NULL);
	classname = p->GetClassName();
	classname.erase(remove(classname.begin(), classname.end(), '<'), classname.end());
	classname.erase(remove(classname.begin(), classname.end(), '>'), classname.end());
	infile.open(classname, ios::in);
	while (infile >> q->get_data())
	{
		number++;
		p->set_next(q);
		p = p->get_next();
		q = new Node<T>;
		q->set_next(NULL);
	}
	delete q;
	infile.close();
}

template <class T>
void List<T>::infile_worker(Node<T>* head)
{
	string classname;
	ofstream outfile;
	Node<T>* p = head->get_next();
	classname = p->GetClassName();
	classname.erase(remove(classname.begin(), classname.end(), '<'), classname.end());
	classname.erase(remove(classname.begin(), classname.end(), '>'), classname.end());
	outfile.open(classname, ios::out);
	while (p)
	{
		outfile << p->get_data();
		p = p->get_next();
	}
	outfile.close();
}

class Worker
{
public:
	friend ostream& operator<< (ostream& out, Worker& data);
	friend istream& operator>> (istream& in, Worker& data);
	friend ofstream& operator<< (ofstream& out, Worker& data);
	friend ifstream& operator>> (ifstream& in, Worker& data);
	bool operator> (Worker& _data)
	{
		if (this->get_id() > _data.get_id())
		{
			return 1;
		}
		return 0;
	}
	bool operator== (Worker& _data)
	{
		if (this->get_id() == _data.get_id())
		{
			return 1;
		}
		return 0;
	}
	void set_name(string _name) { name = _name; }
	void set_sex(string _sex) { sex = _sex; }
	void set_salary(int _salary) { salary = _salary; }
	void set_age(int _age) { age = _age; }
	void set_id(int _id) { id = _id; }

	string get_name() { return name; }
	string get_sex() { return sex; }
	int get_salary() { return salary; }
	int get_age() { return age; }
	int get_id() { return id; }
private:
	int id;
	int age;
	int salary;
	string name;
	string sex;
};

template <class T>
class Function
{
public:
	void star();
};

template <class T>
void Function<T>::star()
{
	List<string> list;
	while (1)
	{
		list.CreateWorkerList(list.get_head());
		int m = 0;
		del = 0;
		seek = 0;
		mdf = 0;
		add = 0;
		system("cls");
		cout << "\n\n";
		printf("                                                管理员页面\n");
		printf("                              **************************************************\n");
		printf("                              **               1.增 加 货 物 信 息            **\n");
		printf("                              **                                              **\n");
		printf("                              **               2.删 除 货 物 信 息            **\n");
		printf("                              **                                              **\n");
		printf("                              **               3.浏 览 货 物 信 息            **\n");
		printf("                              **                                              **\n");
		printf("                              **               4.修 改 货 物 信 息            **\n");
		printf("                              **                                              **\n");
		printf("                              **               5.查 找 货 物 信 息            **\n");
		printf("                              **                                              **\n");
		printf("                              **               6.退 出                        **\n");
		printf("                              **************************************************\n");
		printf("请按键选择:");
		switch (_getch())
		{
		case '1':
			system("cls");
			cout << "请输入要增加货物个数:";
			while (cin >> m)
			{
				if (m > 0)
				{
					break;
				}
				else
				{
					cout << "请输入大于0的数:";
				}
			}
			for (int i = 1; i <= m; i++)
			{
				add = 0;
				system("cls");
				cout << "请输入第" << i << "个货物信息:\n";
				list.Add(list.get_head());
			}
			break;
		case '2':
			system("cls");
			del = 1;
			list.Delete(list.get_head());
			break;
		case '3':
			system("cls");
			list.Output(list.get_head());
			break;
		case '4':
			system("cls");
			mdf = 1;
			list.Modify(list.get_head());
			break;
		case '5':
			system("cls");
			seek = 1;
			list.Seek(list.get_head());
			break;
		case '6':
			system("cls");
			return ;
			break;
		}
	}
}

//-----------------------------------------------------------------------------------------------------------------------
ostream& operator<< (ostream& out, Worker& data)
{
	out << "ID:" << data.get_id() << "\t\t" << "性别:" << data.get_sex() << "\t" << "姓名:" << data.get_name() 
		<< "\t" << "工资:" << data.get_salary() << "\t" << "年龄:" << data.get_age() << endl;
	return out;
}

istream& operator>> (istream& in, Worker& data)
{
	if (del == 0 && seek == 0 && mdf == 0 && add == 0)
	{
		cout << "请输入id:";
		cin >> data.id;
		return in;
	}
	if (add == 1)
	{
		cout << "请输入年龄:";
		while (cin >> data.age)
		{
			if (data.age < 18 || data.age > 56)
			{
				cout << "请输入年龄在18到56之间的数:";
			}
			else
			{
				break;
			}
		}
		cout << "请输入工资:";
		cin >> data.salary;
		cout << "请输入姓名:";
		cin >> data.name;
		cout << "请输入性别:";
		while (cin >> data.sex)
		{
			if (data.sex == "男" || data.sex == "女")
			{
				break;
			}
			else
			{
				cout << "请输入男或女:";
			}
		}
		return in;
	}

	if (del == 1)
	{
		cout << "请输入要删除的id:";
		cin >> data.id;
		return in;
	}

	if (seek == 1)
	{
		cout << "请输入要查找的id:";
		cin >> data.id;
		return in;
	}

	if (mdf == 1)
	{
		cout << "请输入要修改的id:";
		cin >> data.id;
		return in;
	}

	if (mdf == 2)
	{
		cout << "请输入修改后的性别:";
		while (cin >> data.sex)
		{
			if (data.sex == "男" || data.sex == "女")
			{
				break;
			}
			else
			{
				cout << "请输入男或女:";
			}
		}
		return in;
	}

	if (mdf == 3)
	{
		cout << "请输入修改后的年龄:";
		while (cin >> data.age)
		{
			if (data.age < 18 || data.age > 56)
			{
				cout << "请输入年龄在18到56之间的数:";
			}
			else
			{
				break;
			}
		}
		return in;
	}

	if (mdf == 4)
	{
		cout << "请输入修改后的工资:";
		cin >> data.salary;
		return in;
	}
}

ofstream& operator<< (ofstream& outfile, Worker& data)
{
	outfile << data.get_id() << " " << data.get_age() << " " << data.get_salary() << " "
		<< data.get_name() << " " << data.get_sex() << endl;
	return outfile;
}

ifstream& operator>> (ifstream& infile, Worker& data)
{
	int id;
	int age;
	int salary;
	string name;
	string sex;
	infile >> id >> age >> salary >> name >> sex;
	data.set_id(id); data.set_age(age); data.set_salary(salary); data.set_name(name); data.set_sex(sex);
	return infile;
}

int main()
{
	Function<int>* fp = NULL;
	fp->star();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值