使用泛型编程和文件完成此项目,对于不同数据类型(包括复杂的数据类型),采用一个数据类型一个文件(不包括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;
}