一、 任务描述
通讯录管理系统
手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机卡的联系人的信息只包含用户名和电话号码两项信息。存储在手机上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。
要求:
- 创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的存储的联系人的信息)。
- 以菜单方式工作(字符界面即可)
- 存储在手机卡上的联系人的信息包括:姓名和电话号码;存储在手机上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
- 管理系统的功能包括:
a) 新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中)
b) 删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
c) 修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行修改操作)
d) 查询:根据名字查询联系人信息(查询结果不唯一)
e) 浏览:显示所有联系人的信息
f) 将联系人的信息从手机转存到手机卡上(同时要避免重复数据的存在。并且在转存是要检查容量是否受限。下同。)
g) 将联系人的信息从手机卡上转存到手机上(同时要避免重复数据的存在) - 要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点
二、 设计分析
建立两个文本文件,记录存储在手机上联系人的基本信息和存储在手机卡上的联系人的信息
建立以下几个类:
1.手机卡联系人类(Mobile_Contacts):表示一个联系人
数据成员包括:
姓名(name)
电话号码(tel)
成员函数包括
带参并带默认值的构造函数
一组set函数为数据成员赋值
一组modify函数,修改数据成员的值
一组getname函数,获取联系人姓名
一组gettel函数,获取联系人电话
重载>>,<<运算符,完成对象的输入和输出操作
2.手机联系人(Contacts 继承于手机卡联系人类):
新增数据成员:
籍贯(native_place)
QQ号
成员函数包括
带参并带默认值的构造函数
一组set函数为数据成员赋值
一组modify函数,修改数据成员的值
一组getname函数,获取联系人姓名
一组gettel函数,获取联系人电话
一组getnative_place函数,获取联系人籍贯
一组getqq函数,获取联系人QQ
重载>>,<<运算符,完成数据成员的输入输出操作
3.通讯簿抽象类(List),用来封装以下函数(为支持多态,可以将以下函数封装为纯虚函数)
增加函数(add):增加一个联系人
删除操作(Delete):删除一个联系人
浏览操作(browse):显示所有联系人的信息
修改操作(change):修改某一联系人的信息
查询操作(query):查询并显示某一联系人的信息
转存操作(unload):手机和手机卡联系人信息转存
判断操作(judge1):判断联系人是否存在,用于转存(移动)操作
判断操作(judge2):判断联系人是否存在,用于转存(复制)操作
清空操作(empty):清空联系人
4.手机通讯簿类(Contacts_list)(这是一个数据库类,继承于通讯簿抽象类):用于记录手机中存储的所有联系人的信息
数据成员包括:
手机联系人的数量(num)
手机联系人对象数组(vectorcon)
成员函数包括
构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组
析构函数:将对象数组中的内容写入到文本文件中。
增加函数(add):增加一个联系人
删除操作(Delete):删除一个联系人
浏览操作(browse):显示所有联系人的信息
修改操作(change):修改某一联系人的信息
查询操作(query):查询并显示某一联系人的信息
转存操作(unload):手机和手机卡联系人信息转存
判断操作(judge1):判断联系人是否存在,用于转存(移动)操作
判断操作(judge2):判断联系人是否存在,用于转存(复制)操作
清空操作(empty):清空联系人
5.手机卡通信簿类(Mobile_list)(这是一个数据库类,继承于通讯簿抽象类):用于记录手机卡中存储的所有联系人的信息
数据成员包括:
手机联系人的数量(num)
手机联系人对象数组(vector< Mobile_Contacts>mob)
成员函数包括
构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组
析构函数:将对象数组中的内容写入到文本文件中。
增加函数(add):增加一个联系人
删除操作(Delete):删除一个联系人
浏览操作(browse):显示所有联系人的信息
修改操作(change):修改某一联系人的信息
查询操作(query):查询并显示某一联系人的信息
转存操作(unload):手机和手机卡联系人信息转存
判断操作(judge1):判断联系人是否存在,用于转存(移动)操作
判断操作(judge2):判断联系人是否存在,用于转存(复制)操作
清空操作(empty):清空联系人
6.用户类(这是一个操作类,完成通讯簿的操作):用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理
数据成员包括:
通讯簿对象指针
界面菜单对象
两个通讯簿对象
成员函数包括(成员函数体现用户的行为):
添加联系人:利用基类指针,调用相应的通讯簿对象(手机通讯簿或手机卡通信簿)的增加函数完成联系人的添加。实现动态联编,体现出多态特点。(下同)
删除联系人:调用相应的通讯簿对象的删除操作删除一个联系人
browse:显示相应的通讯簿中联系人的信息
修改某一联系人的信息:调用通讯簿对象的函数完成操作
查询并显示某一联系人的信息:调用通讯簿对象的函数完成操作
将手机卡中的存储的联系人的信息移动到手机中
将手机中存储的联系人的信息移动到手机卡中
将手机卡中的存储的联系人的信息复制到手机中
将手机中存储的联系人的信息复制到手机卡中
7.界面菜单类:用来给出操作提示
数据成员:可以不定义数据成员
成员函数:
欢迎界面
主界面
add界面
Delete界面
change界面
query界面
browse界面
unload界面
empty界面
三、 源代码
Mobile_Contasts.h
1. //手机卡联系人类Mobile_Contacts 作为手机联系人类Contacts的基类
2. #ifndef MOBILE_CONTACTS
3. #define MOBILE_CONTACTS
4. #include<iostream>
5. #include<iomanip>
6. using namespace std;
7. class Mobile_Contacts
8. {
9. protected:
10. string name, tel; //数据成员:姓名、电话
11. public:
12. Mobile_Contacts(string pname = "Noname", string ptel = "Notel"); //带有默认值的构造函数
13. void set(string pname = "Noname", string ptel = "Notel"); //set函数为数据成员赋值
14. void modify(); //修改数据成员
15. string getname(); //返回姓名
16. string gettel(); //返回电话
17. friend istream& operator>>(istream& input, Mobile_Contacts&); //重载流插入运算符
18. friend ostream& operator<<(ostream& output, Mobile_Contacts&); //重载流提取运算符
19. };
20. #endif // !MOBILE_CONTACTS
Mobile_Contacts.cpp
1. #include "Mobile_Contacts.h"
2. Mobile_Contacts::Mobile_Contacts(string pname, string ptel)
3. {
4. name = pname;tel = ptel;
5. }
6. void Mobile_Contacts::set(string pname, string ptel)
7. {
8. name = pname;tel = ptel;
9. }
10. void Mobile_Contacts::modify()
11. {
12. string pname, ptel;
13. char choose;
14. cout << "请选择你要修改的内容:(1.修改全部内容,2.仅修改姓名,3.仅修改号码)" << endl;
15. cin >> choose;
16. switch (choose)
17. {
18. case '1':
19. cout << "请重新输入姓名 :";
20. cin >> pname;
21. cout << "请重新输电话号码 :";
22. cin >> ptel;
23. name = pname; tel = ptel;
24. break;
25. case '2':
26. cout << "请重新输入姓名 :";
27. cin >> pname;
28. name = pname;
29. break;
30. case '3':
31. cout << "请重新输电话号码 :";
32. cin >> ptel;
33. tel = ptel;
34. break;
35. default:
36. cout << "选择错误!" << endl;
37. }
38. }
39. string Mobile_Contacts::getname() { return name; }
40. string Mobile_Contacts::gettel() { return tel; }
41. istream& operator >>(istream& input, Mobile_Contacts& C)
42. {
43. string pname, ptel;
44. cout << "请输入相关信息" << endl;
45. cout << "姓名:";input >> pname;cout << endl;
46. cout << "电话:";input >> ptel;cout << endl;
47. C.set(pname, ptel);
48. return input;
49. }
50. ostream& operator <<(ostream& output, Mobile_Contacts& C)
51. {
52. output << C.getname() << '\t' << '\t' << '\t' << C.gettel() << endl;
53. return output;
54. }
Contacts.h
//手机联系人类Contacts 公有继承Mobile_Contacts
2. #ifndef CONTACTS
3. #define CONTACTS
4. #include "Mobile_Contacts.h"
5. #include<iomanip>
6. class Contacts :public Mobile_Contacts
7. {
8. protected:
9. string native_place, qq; //新增数据成员:籍贯、QQ
10. public:
11. Contacts(string pname = "Noname", string ptel = "Notel", string pnative_place = "Nonative_place", string pqq = "Noqq"); //带有默认值的构造函数
12. void set(string pname = "Noname", string ptel = "Notel", string pnative_place = "Nonative_place", string pqq = "Noqq"); //set函数为数据成员赋值
13. void modify(); //对数据成员进行修改
14. string getname(); //返回姓名
15. string gettel(); //返回电话
16. string getnative_place(); //返回籍贯
17. string getqq(); //返回QQ
18. friend ostream& operator<<(ostream& output, Contacts&); //重载流提取运算符
19. friend istream& operator>>(istream& input, Contacts&); //重载流插入运算符
20. };
21. #endif // !MOBILE_CONTACTS
Contacts.cpp
#include "Contacts.h"
2. Contacts::Contacts(string pname, string ptel, string pnative_place, string pqq) :Mobile_Contacts(pname,ptel)
3. {
4. native_place = pnative_place;qq = pqq;
5. }
6. void Contacts::set(string pname, string ptel, string pnative_place, string pqq)
7. {
8. Mobile_Contacts::set(pname, ptel);
9. native_place = pnative_place;qq = pqq;
10. }
11. void Contacts::modify()
12. {
13. string pname, ptel, pnative_place, pqq;
14. char choose;
15. cout << "请选择你要修改的内容:(1.修改全部内容,2.仅修改姓名,3.仅修改号码,4.仅修改籍贯,5.仅修改QQ)" << endl;
16. cin >> choose;
17. switch (choose)
18. {
19. case '1':
20. cout << "请重新输入姓名 :";
21. cin >> pname;name = pname;
22. cout << "请重新输电话号码 :";
23. cin >> ptel; tel = ptel;
24. cout << "请重新输入籍贯:";
25. cin >> pnative_place;native_place = pnative_place;
26. cout << "请重新输入QQ:";
27. cin >> pqq;qq = pqq;
28. break;
29. case '2':
30. cout << "请重新输入姓名 :";
31. cin >> pname;
32. name = pname;
33. break;
34. case '3':
35. cout << "请重新输电话号码 :";
36. cin >> ptel;
37. tel = ptel;
38. break;
39. case '4':
40. cout << "请重新输入籍贯:";
41. cin >> pnative_place;
42. native_place = pnative_place;
43. break;
44. case '5':
45. cout << "请重新输入QQ:";
46. cin >> pqq;
47. qq = pqq;
48. break;
49. default:
50. cout << "选择错误" << endl;
51. }
52. }
53. string Contacts::getname() { return name; }
54. string Contacts::gettel() { return tel; }
55. string Contacts::getnative_place() { return native_place; }
56. string Contacts::getqq() { return qq; }
57. ostream& operator<<(ostream& output, Contacts& M)
58. {
59.
60. output << setw(24) << setfill(' ') << setiosflags(ios::left) << M.getname() << setw(24) << setfill(' ') << setiosflags(ios::left) << M.gettel() << setw(24) << setfill(' ') << setiosflags(ios::left) << M.getnative_place() << setw(24) << setfill(' ')<< setiosflags(ios::left) << M.getqq() << endl;
61. return output;
62. }
63. istream& operator>>(istream& input, Contacts& M)
64. {
65. string pname, ptel, pnative_place, pqq;
66. cout << "请输入相关信息" << endl;
67. cout << "姓名:";input >> pname;cout << endl;
68. cout << "电话:";input >> ptel; cout << endl;
69. cout << "籍贯:";input >> pnative_place;cout << endl;
70. cout << "QQ:"; input >> pqq; cout << endl;
71. M.set(pname, ptel, pnative_place, pqq);
72. return input;
73. }
List.h
//通讯簿抽象类
2. #ifndef LIST
3. #define LIST
4. #include<iostream>
5. #include<vector>
6. #include<fstream>
7. #include<algorithm>
8. #include<string>
9. #include<iomanip>
10. #include<algorithm>
11. using namespace std;
12. class List
13. {
14. public:
15. virtual void add() = 0; //新建联系人
16. virtual void Delete(string ptel) = 0; //输入电话号码删除联系人
17. virtual void change(string ptel) = 0; //输入电话修改联系人信息
18. virtual void query(string pname) = 0; //输入姓名查询联系人
19. virtual void browse() = 0; //浏览所有联系人
20. virtual void unload(string pname, string ptel) = 0; //转存
21. virtual bool judge1(string pname, string ptel) = 0; //判断联系人是否存在,用于转存(移动)操作
22. virtual bool judge2(string pname, string ptel) = 0; //判断联系人是否存在,用于转存(复制)操作
23. virtual void empty() = 0; //清空联系人
24. };
25. #endif // !LIST
Mobile_list.h
//手机卡联系人簿Mobile_list 公有继承通讯簿抽象类List
2. #ifndef MOBILE_LIST
3. #define MOBILE_LIST
4. #include "List.h"
5. #include"Mobile_Contacts.h"
6. class Mobile_list :public List
7. {
8. protected:
9. int num; //联系人数量
10. vector< Mobile_Contacts>mob; //手机卡联系人对象数组
11. public:
12. Mobile_list(); //构造函数从txt文件中提取联系人信息放入数组中
13. void add(); //新建联系人
14. void Delete(string ptel); //输入电话号码删除联系人
15. void change(string ptel); //输入电话修改联系人信息
16. void query(string pname); //输入姓名查询联系人
17. void browse(); //浏览所有联系人
18. void unload(string pname, string ptel); //转存(移动)
19. bool judge1(string pname, string ptel); //判断联系人是否存在,用于转存(移动)操作
20. bool judge2(string pname, string ptel); //判断联系人是否存在,用于转存(复制)操作
21. int getnum(); //返回联系人数
22. void empty(); //清空联系人
23. ~Mobile_list(); //析构函数将数组写入文件
24. };
25. bool com2(Mobile_Contacts& mob1, Mobile_Contacts& mob2); //自定义比较函数,对Mobile_Contacts类按姓名(ASCll码)升序排列
26. #endif // !MOBILE_LIST
`
Mobile_list.cpp
#include "Mobile_list.h"
2. const char* file2 = "手机卡联系人.txt";
3. bool com2(Mobile_Contacts& mob1, Mobile_Contacts& mob2)
4. {
5. if (mob1.getname() < mob2.getname()) return true;
6. else return false;
7. }
8. Mobile_list::Mobile_list()
9. {
10. num = -1;
11. char s[100], pname[100], ptel[100];
12. ifstream instuf(file2, ios::in); //以读的方式打开文件
13. if (!instuf)
14. {
15. cerr << "File could not be open." << endl;
16. abort();
17. }
18. instuf.getline(s, 100);
19. instuf.getline(s, 100);
20. instuf.getline(s, 100);
21. instuf.getline(s, 100); //略去标题行
22. while (instuf >> pname >> ptel)
23. {
24. Mobile_Contacts tem;
25. tem.set(pname, ptel);
26. mob.push_back(tem);
27. num++;
28. }
29. instuf.close();
30.
31. }
32. int Mobile_list::getnum() { return num; }
33. void Mobile_list::add() //新建
34. {
35. if (num >999)
36. {
37. cout << "联系人已满" << endl;
38. return;
39. }
40. else
41. {
42. Mobile_Contacts tem;
43. cin >> tem;
44. for (int i = 0;i <= num;i++)
45. {
46. if (tem.getname() == mob[i].getname()&&tem.gettel()==mob[i].gettel())
47. {
48. cout << "联系人已存在" << endl;
49. return;
50. }
51. }
52. mob.push_back(tem);
53. num++;
54. cout << "添加成功,现有手机卡联系人" << num+1 << "人" << endl;
55. }
56. }
57. void Mobile_list::Delete(string ptel) //删除
58. {
59. bool f = false;
60. for (int i = 0;i <= num;i++)
61. {
62. if (ptel == mob[i].gettel())
63. {
64. f = true;
65. cout << "所要删除的手机卡联系人的信息:" << endl;
66. cout << "姓名" << '\t' << '\t' << '\t' << "电话" << endl;
67. cout << mob[i];
68. cout << "请确认是否要删除此联系人(是:Y 否:其它)" << endl;;
69. char choose;
70. cin >> choose;
71. if (choose == 'Y' || choose == 'y')
72. {
73. mob.erase(mob.begin() + i);
74. num--;
75. cout << "删除成功" << endl;
76. break;
77. }
78. else
79. {
80. cout << "操作取消" << endl;
81. break;
82. }
83. }
84. }
85. if (!f) cout << "手机卡中无此联系人" << endl;
86. }
87. void Mobile_list::change(string ptel) //修改
88. {
89. bool f = false; //判断联系人是否存在
90. for (int i = 0;i <= num;i++)
91. {
92. if (mob[i].gettel() == ptel)
93. {
94. f = true;
95. cout << "所要修改联系人的原信息:" << endl;
96. cout << "姓名" << '\t' << '\t' << '\t' << "电话" << endl;
97. cout << mob[i];
98. mob[i].modify();
99. cout << "修改完毕" << endl;
100. break;
101. }
102. }
103. if (!f)
104. {
105. cout << "手机卡中无此联系人" << endl;
106. }
107. }
108. void Mobile_list::query(string pname) //查询
109. {
110. bool f = false; //判断联系人是否存在
111. for (int i = 0;i <= num;i++)
112. {
113. if (mob[i].getname() == pname)
114. {
115. f = true;
116. cout << "手机卡联系人" << endl;
117. cout << "姓名" << '\t' << '\t' << '\t' << "电话" << endl;
118. cout << mob[i];
119. }
120. }
121. if (f)
122. cout << "手机卡联系人查询完毕" << endl;
123. else cout << "手机卡中无此联系人" << endl;
124. cout << endl;
125. }
126. void Mobile_list::browse() //浏览
127. {
128. if (num == -1) cout << "手机卡联系人为空" << endl;
129. else
130. {
131. cout << "手机卡联系人(共" <<num+1<<"人)"<< endl;
132. cout << "姓名" << '\t' << '\t' << '\t' << "电话" << endl;
133. vector<Mobile_Contacts>::iterator it;
134. for (it = mob.begin();it < mob.end();it++)
135. cout << (*it);
136. }
137. }
138. void Mobile_list::unload(string pname, string ptel) //转存
139. {
140. for (int i = 0;i <= num;i++)
141. {
142. if (num > 999) { cout << "联系人已满" << endl;return; }
143. else
144. if (mob[i].getname() == pname && mob[i].gettel() == ptel)
145. {
146. cout << "手机卡中联系人已存在" << endl;
147. return;
148. }
149. }
150. Mobile_Contacts tem;
151. tem.set(pname, ptel);
152. mob.push_back(tem);
153. num++;
154. cout << "操作成功" << endl;
155. }
156.
157. bool Mobile_list::judge1(string pname, string ptel) //判断联系人是否存在,用于转存(移动)操作
158. {
159. for (int i = 0;i <= num;i++)
160. {
161. if (mob[i].getname() == pname && mob[i].gettel() == ptel)
162. {
163. mob.erase(mob.begin() + i); //联系人存在并删除联系人
164. num--;
165. return true;
166. }
167.
168. }
169. return false;
170. }
171. bool Mobile_list::judge2(string pname, string ptel) //判断联系人是否存在,用于转存(复制)操作
172. {
173. for (int i = 0;i <= num;i++)
174. {
175. if (mob[i].getname() == pname && mob[i].gettel() == ptel)
176. return true;
177. }
178. return false;
179. }
180. void Mobile_list::empty() //清空联系人
181. {
182. mob.clear();
183. num = -1;
184. }
185. Mobile_list::~Mobile_list()
186. {
187. sort(mob.begin(), mob.end(), com2); //按姓名进行升序排列
188. ofstream outstuf(file2, ios::out); //以写的方式打开文件
189. if (!outstuf)
190. {
191. cerr << "File could not be open." << endl;
192. abort();
193. }
194. outstuf << "****************************************" << endl;
195. outstuf << "* 手机卡联系人 *" << endl;
196. outstuf << "****************************************" << endl;
197. outstuf << "姓名" << '\t' << '\t' << '\t' << "电话" << endl;
198. for (int i = 0;i <= num;i++)
199. outstuf << mob[i]; //将联系人信息写入文件
200. outstuf.close(); //关闭文件
201. mob.clear(); //清空数组
202. }
Contacts_list.h
//手机联系人簿Contacts_list 公有继承通讯簿抽象类List
2. #ifndef CONTACTS_LIST
3. #define CONTACTS_LIST
4. #include "Contacts.h"
5. #include"Mobile_list.h"
6. #include"List.h"
7. class Contacts_list : public List
8. {
9. protected:
10. int num; //联系人数
11. vector<Contacts>con; //手机联系人对象数组
12. public:
13. Contacts_list(); //构造函数从txt文件中提取联系人信息放入数组中
14. void add(); //新建联系人
15. void Delete(string ptel); //输入电话号码删除联系人
16. void change(string ptel); //输入电话修改联系人信息
17. void query(string pname); //输入姓名查询联系人
18. void browse(); //浏览所有联系人
19. void unload(string pname, string ptel); //转存
20. bool judge1(string pname, string ptel); //判断联系人是否存在,用于转存(移动)操作
21. bool judge2(string pname, string ptel); //判断联系人是否存在,用于转存(复制)操作
22. int getnum(); //返回联系人数
23. void empty(); //清空联系人
24. ~Contacts_list(); //析构函数将数组写入文件
25.
26. };
27. bool com1(Contacts& con1, Contacts& con2); //自定义比较函数,对Contacts类按姓名(ASCll码)升序排列
28. #endif // !CONTACTS_LIST
Contacts_list.cpp
#include "Contacts_list.h"
2. const char* file1 = "手机联系人.txt";
3. bool com1(Contacts &con1, Contacts &con2)
4. {
5. if (con1.getname() <con2.getname()) return true;
6. else return false;
7. }
8. Contacts_list::Contacts_list()
9. {
10. num = -1;
11. char s[100], pname[100], ptel[100],pnative_place[100], pqq[100];
12. ifstream instuf(file1, ios::in); //以读的方式打开文件
13. if (!instuf)
14. {
15. cerr << "File could not be open." << endl;
16. abort();
17. }
18. instuf.getline(s, 100);
19. instuf.getline(s, 100);
20. instuf.getline(s, 100);
21. instuf.getline(s, 100); //略去标题行
22. while (instuf >> pname >> ptel>>pnative_place >> pqq)
23. {
24. Contacts tem;
25. tem.set(pname, ptel,pnative_place , pqq);
26. con.push_back(tem);
27. num++;
28. }
29. instuf.close(); //关闭文件
30.
31. }
32. int Contacts_list::getnum() { return num; }
33. void Contacts_list::add() //新建
34. {
35. if (num >999)
36. {
37. cout << "联系人已满" << endl;
38. return;
39. }
40. else
41. {
42. Contacts tem;
43. cin >> tem;
44. for (int i = 0;i <= num;i++)
45. {
46. if (tem.getname() == con[i].getname()&&tem.gettel()==con[i].gettel())
47. {
48. cout << "联系人已存在" << endl;
49. return;
50. }
51. }
52. con.push_back(tem);
53. num++;
54. cout << "添加成功,现有手机联系人"<<num+1 <<"人"<< endl;
55. }
56. }
57. void Contacts_list::Delete(string ptel) //删除
58. {
59. bool f = false;
60. for (int i = 0;i <= num;i++)
61. {
62. if (ptel == con[i].gettel())
63. {
64. f = true;
65. cout << "所要删除的手机联系人的信息" << endl;
66. cout << setw(24) << setfill(' ') << setiosflags(ios::left) << "姓名" << setw(24) << setfill(' ') << setiosflags(ios::left)
67. << "电话" << setw(24) << setfill(' ') << setiosflags(ios::left) << "籍贯" << setw(24) << setfill(' ') << setiosflags(ios::left) << "QQ" << endl;
68. cout << con[i];
69. cout << "请确认是否要删除此联系人(是:Y 否:其它)" << endl;
70. char choose;
71. cin >> choose;
72. if (choose == 'Y' || choose == 'y')
73. {
74. con.erase(con.begin() + i);
75. num--;
76. cout << "删除成功" << endl;
77. break;
78. }
79. else
80. {
81. cout << "操作取消" << endl;
82. break;
83. }
84. }
85. }
86. if (!f) cout << "手机中无此联系人" << endl;
87. }
88. void Contacts_list::change(string ptel) //修改
89. {
90. bool f = false;
91. for (int i = 0;i <= num;i++)
92. {
93. if (con[i].gettel() == ptel)
94. {
95. f = true;
96. cout << "所要修改联系人的原信息:" << endl;
97. cout << setw(24) << setfill(' ') << setiosflags(ios::left) << "姓名" << setw(24) << setfill(' ') << setiosflags(ios::left)
98. << "电话" << setw(24) << setfill(' ') << setiosflags(ios::left) << "籍贯" << setw(24) << setfill(' ') << setiosflags(ios::left) << "QQ" << endl;
99. cout << con[i];
100. con[i].modify();
101. cout << "修改完毕" << endl;
102. break;
103. }
104. }
105. if (!f)
106. {
107. cout << "无此联系人" << endl;
108. }
109. }
110. void Contacts_list::query(string pname) //查询
111. {
112. bool f = false;
113. for (int i = 0;i <= num;i++)
114. {
115. if (con[i].getname() == pname)
116. {
117. f = true;
118. cout << "手机联系人" << endl;
119. cout << setw(24) << setfill(' ') << setiosflags(ios::left) << "姓名" << setw(24) << setfill(' ') << setiosflags(ios::left)
120. << "电话" << setw(24) << setfill(' ') << setiosflags(ios::left)
121. << "籍贯" << setw(24) << setfill(' ') << setiosflags(ios::left)
122. << "QQ" << endl;
123. cout << con[i];
124. }
125. }
126. if (f)
127. cout << "手机联系人查询完毕" << endl;
128. else cout << "手机中无此联系人" << endl;
129. cout << endl;
130. }
131. void Contacts_list::browse() //浏览
132. {
133. if (num == -1) cout << "手机联系人为空" << endl;
134. else
135. {
136. cout << "手机联系人(共" << num + 1 << "人)" << endl;
137. cout << setw(24) << setfill(' ') << setiosflags(ios::left) << "姓名" << setw(24) << setfill(' ') << setiosflags(ios::left)
138. << "电话" << setw(24) << setfill(' ') << setiosflags(ios::left)
139. << "籍贯" << setw(24) << setfill(' ') << setiosflags(ios::left)
140. << "QQ" << endl;
141. vector<Contacts>::iterator it;
142. for (it = con.begin();it < con.end();it++)
143. cout << (*it);
144. }
145. }
146. void Contacts_list::unload(string pname, string ptel) //转存
147. {
148. for (int i = 0;i <= num;i++)
149. {
150. if (num > 999) { cout << "联系人已满" << endl;return; }
151. if (con[i].getname() == pname && con[i].gettel() == ptel)
152. {
153. cout << "手机中联系人已存在" << endl;
154. return;
155. }
156. }
157. Contacts tem;
158. tem.set(pname, ptel);
159. con.push_back(tem);
160. num++;
161. cout << "操作成功" << endl;
162.
163.
164. }
165. bool Contacts_list::judge1(string pname, string ptel) //判断联系人是否存在,用于转存(移动)操作
166. {
167. for (int i = 0;i <= num;i++)
168. {
169. if (con[i].getname() == pname && con[i].gettel() == ptel)
170. {
171. con.erase(con.begin() + i); //联系人存在并删除联系人
172. num--;
173. return true;
174. }
175. }
176. return false;
177. }
178. bool Contacts_list::judge2(string pname, string ptel) //判断联系人是否存在,用于转存(复制)操作
179. {
180. for (int i = 0;i <= num;i++)
181. {
182. if (con[i].getname() == pname && con[i].gettel() == ptel)
183. return true;
184. }
185. return false;
186. }
187. void Contacts_list::empty() //清空联系人
188. {
189. con.clear();
190. num = -1;
191. }
192. Contacts_list::~Contacts_list()
193. {
194. sort(con.begin(), con.end(), com1);
195. ofstream outstuf(file1, ios::out); //以写的方式打开文件
196. if (!outstuf)
197. {
198. cerr << "File could not be open." << endl;
199. abort();
200. }
201. outstuf << "****************************************************" << endl;
202. outstuf << "* 手机联系人 *" << endl;
203. outstuf << "****************************************************" << endl;
204. outstuf << "姓名"<<'\t' << '\t' << "电话" <<'\t' << '\t'<< "籍贯" << '\t' << '\t' << "QQ" << endl;
205. for (int i = 0;i <= num;i++)
206. outstuf << con[i];
207. outstuf.close(); //关闭文件
208. con.clear(); //清空数组
209. }
Menu.h
//界面类Menu
2. #ifndef MENU
3. #define MENU
4. #include<iostream>
5. using namespace std;
6. class Menu
7. {
8. public:
9. void welcome_Menu(); //欢迎界面
10. void main_Menu(); //主菜单
11. void add_Menu(); //新建联系人界面
12. void Delete_Menu(); //删除界面
13. void change_Menu(); //修改界面
14. void query_Menu(); //查询界面
15. void browse_Menu(); //浏览界面
16. void unload_Menu(); //转存界面
17. void empty_Menu(); //清空联系人
18.
19. };
20. #endif // !MENU
Menu.cpp
1. #include"Menu.h"
2. void Menu::welcome_Menu() //欢迎界面
3. {
4. cout << "****************************************" << endl;
5. cout << "* 欢迎使用通讯录管理系统 *" << endl;
6. cout << "****************************************" << endl;
7.
8. }
9. void Menu::main_Menu() //主菜单
10. {
11. cout << "****************************************" << endl;
12. cout << "* 通讯录管理系统 *" << endl;
13. cout << "****************************************" << endl;
14. cout << "****************************************" << endl;
15. cout << "* *" << endl;
16. cout << "* 1.新建联系人 *" << endl;
17. cout << "* 2.删除联系人 *" << endl;
18. cout << "* 3.修改联系人信息 *" << endl;
19. cout << "* 4.查询联系人信息 *" << endl;
20. cout << "* 5.浏览所有联系人 *" << endl;
21. cout << "* 6.转存 *" << endl;
22. cout << "* 7.清空联系人 *" << endl;
23. cout << "* 0.退出系统 *" << endl;
24. cout << "* *" << endl;
25. cout << "****************************************" << endl;
26. cout << "请输入:";
27.
28. }
29. void Menu::add_Menu() //新建联系人界面
30. {
31. cout << "****************************************" << endl;
32. cout << "* 新建联系人 *" << endl;
33. cout << "****************************************" << endl;
34. cout << "* 1.手机 *" << endl;
35. cout << "* 2.手机卡 *" << endl;
36. cout << "****************************************" << endl;
37. }
38. void Menu::Delete_Menu() //删除界面
39. {
40. cout << "****************************************" << endl;
41. cout << "* 删除联系人 *" << endl;
42. cout << "****************************************" << endl;
43. cout << "* 1.删除手机联系人 *" << endl;
44. cout << "* 2.删除手机卡联系人 *" << endl;
45. cout << "* 3.同时删除 *" << endl;
46. cout << "****************************************" << endl;
47. }
48. void Menu::change_Menu() //修改界面
49. {
50. cout << "****************************************" << endl;
51. cout << "* 修改联系人信息 *" << endl;
52. cout << "****************************************" << endl;
53. cout << "* 1.修改手机联系人信息 *" << endl;
54. cout << "* 2.修改手机卡联系人信息 *" << endl;
55. cout << "****************************************" << endl;
56. }
57. void Menu::query_Menu() //查询界面
58. {
59. cout << "****************************************" << endl;
60. cout << "* 查询联系人信息 *" << endl;
61. cout << "****************************************" << endl;
62.
63. }
64. void Menu::browse_Menu() //浏览界面
65. {
66. cout << "****************************************" << endl;
67. cout << "* 浏览联系人信息 *" << endl;
68. cout << "****************************************" << endl;
69. cout << "* 1.浏览手机联系人 *" << endl;
70. cout << "* 2.浏览手机卡联系人 *" << endl;
71. cout << "* 3.浏览全部联系人 *" << endl;
72. cout << "****************************************" << endl;
73. }
74. void Menu::unload_Menu() //转存界面
75. {
76. cout << "*****************************************************" << endl;
77. cout << "* *" << endl;
78. cout << "* 1.将手机卡中的存储的联系人的信息移动到手机中 *" << endl;
79. cout << "* 2.将手机中存储的联系人的信息移动到手机卡中 *" << endl;
80. cout << "* 3.将手机卡中的存储的联系人的信息复制到手机中 *" << endl;
81. cout << "* 4.将手机中存储的联系人的信息复制到手机卡中 *" << endl;
82. cout << "* *" << endl;
83. cout << "*****************************************************" << endl;
84. }
85. void Menu::empty_Menu()
86. {
87. cout << "****************************************" << endl;
88. cout << "* 清空联系人信息 *" << endl;
89. cout << "****************************************" << endl;
90. cout << "* 1.清空手机联系人 *" << endl;
91. cout << "* 2.清空手机卡联系人 *" << endl;
92. cout << "* 3.全部清空 *" << endl;
93. cout << "****************************************" << endl;
94. }
User.h
//用户类user
2. #ifndef USER
3. #define USER
4. #include"Contacts_list.h"
5. #include"Mobile_list.h"
6. #include"Menu.h"
7. class user
8. {
9. protected:
10. List* p; //基类指针
11. Contacts_list con; //Contacts_list类对象
12. Mobile_list mob; //Mobile_list类对象
13. Menu m; //Menu类对象
14. public:
15. void add(); //新建联系人
16. void Delete(); //删除联系人
17. void change(); //修改联系人
18. void query(); //查询联系人
19. void browse(); //浏览所有联系人
20. void unload(); //转存
21. void empty(); //清空联系人
22. ~user(); //析构函数显示程序退出界面
23. };
24. #endif // !USER
User.cpp
1.
#include "user.h"
2. void user::add() //新建
3. {
4. m.add_Menu(); //新建联系人界面
5. while (1)
6. {
7. bool f = true; //判断是否选择正确
8. cout << "请选择储存位置:";
9. char choose;
10. cin >> choose;
11. switch (choose)
12. {
13. case '1': //添加手机联系人
14. p = &con;
15. p->add();
16. break;
17. case '2': //添加手机卡联系人
18. p = &mob;
19. p->add();
20. break;
21. default:
22. f = false;
23. cout << "选择错误,请重新输入" << endl;
24. }
25. if (!f) continue; //选择错误,重新输入
26. cout << "是否要继续添加联系人(是:Y 否:其他)" << endl;
27. char ch;
28. cin >> ch;
29. if (ch == 'Y' || ch == 'y') continue;
30. else break;
31. }
32. }
33. void user::Delete() //删除
34. {
35. m.Delete_Menu(); //删除界面
36. while (1)
37. {
38. bool f = true; //判断是否选择正确
39. string ptel;
40. char choose;
41. cout << "请选择:";
42. cin >> choose;
43. switch (choose)
44. {
45.
46. case '1': //删除手机联系人
47. cout << "请输入所要删除联系人的电话:";
48. cin >> ptel;
49. p = &con;
50. p->Delete(ptel);
51. break;
52. case '2': //删除手机卡联系人
53. cout << "请输入所要删除联系人的电话:";
54. cin >> ptel;
55. p = &mob;
56. p->Delete(ptel);
57. break;
58. case '3': //删除全部联系人
59. cout << "请输入所要删除联系人的电话:";
60. cin >> ptel;
61. p = &con;
62. p->Delete(ptel);
63. p = &mob;
64. p->Delete(ptel);
65. break;
66. default:
67. f = false;
68. cout << "选择错误,请重新输入" << endl;
69. break;
70. }
71. if (!f) continue; //选择错误,重新选择
72. cout << "是否要删除其他联系人(是:Y 否:其他)" << endl;
73. char ch;
74. cin >> ch;
75. if (ch == 'Y' || ch == 'y') continue;
76. else break;
77. }
78. }
79. void user::change() //修改
80. {
81. m.change_Menu(); //修改界面
82. while (1)
83. {
84. bool f = true; //判断选择是否正确
85. cout << "请选择联系人位置:";
86. char choose;
87. string ptel;
88. cin >> choose;
89. switch (choose)
90. {
91. case '1': //修改手机联系人
92. cout << "请输入所需要修改的联系人的电话:";
93. cin >> ptel;
94. p = &con;
95. p->change(ptel);
96. break;
97. case '2': //修改手机卡联系人
98. cout << "请输入所需要修改的联系人的电话:";
99. cin >> ptel;
100. p = &mob;
101. p->change(ptel);
102. break;
103. default:
104. f = false;
105. cout << "选择错误,请从新选择" << endl;
106. }
107. if (!f) continue; //选择错误,重新选择
108. cout << "是否要继续修改联系人(是:Y 否:其他)" << endl;
109. char ch;
110. cin >> ch;
111. if (ch == 'Y' || ch == 'y') continue;
112. else break;
113. }
114. }
115. void user::query() //查询
116. {
117. m.query_Menu(); //查询界面
118. while (1)
119. {
120. cout << "请输入所要查询联系人的姓名:";
121. string pname;
122. cin >> pname;
123. p = &con;
124. p->query(pname);
125. p = &mob;
126. p->query(pname);
127. cout << "是否要查询其他联系人(是:Y 否:其他)" << endl;
128. char ch;
129. cin >> ch;
130. if (ch == 'Y' || ch == 'y') continue;
131. else break;
132. }
133. }
134. void user::browse() //浏览
135. {
136. m.browse_Menu(); //浏览界面
137. cout << "请选择浏览位置:";
138. char choose;
139. cin >> choose;
140. switch (choose)
141. {
142. case '1': //浏览手机联系人
143. p = &con;
144. p->browse();
145. break;
146. case '2': //浏览手机卡联系人
147. p = &mob;
148. p->browse();
149. break;
150. case'3': //浏览全部联系人
151. p = &con;
152. p->browse();
153. p = &mob;
154. p->browse();
155. break;
156. default:
157. cout << "输入错误" << endl;
158. }
159. }
160. void user::unload() //转存
161. {
162. m.unload_Menu(); //转存界面
163. string pname, ptel;
164. while (1)
165. {
166. bool f = true; //用于判断是否选择正确
167. cout << "请选择:";
168. char choose;
169. cin >> choose;
170. switch (choose)
171. {
172. case '1': //将手机卡中的存储的联系人的信息移动到手机中
173. cout << "请输入要转存的联系人的姓名和电话" << endl;
174. cout << "姓名:";cin >> pname;
175. cout << "电话:";cin >> ptel;
176. p = &mob;
177. if (p->judge1(pname, ptel)) //判断联系人是否存在,存在则删除联系人
178. {
179. p = &con;
180. p->unload(pname, ptel); //进行转存操作
181. }
182. else cout << "手机卡中无此联系人" << endl;
183. break;
184. case '2': //将手机中存储的联系人的信息移动到手机卡中
185. cout << "请输入要转存的联系人的姓名和电话" << endl;
186. cout << "姓名:";cin >> pname;
187. cout << "电话:";cin >> ptel;
188. p = &con;
189. if (p->judge1(pname, ptel)) //判断联系人是否存在,存在则删除联系人
190. {
191. p = &mob;
192. p->unload(pname, ptel); //进行转存操作
193. }
194. else cout << "手机中无此联系人" << endl;
195. break;
196. case '3': //将手机卡中的存储的联系人的信息复制到手机中
197. cout << "请输入要转存的联系人的姓名和电话" << endl;
198. cout << "姓名:";cin >> pname;
199. cout << "电话:";cin >> ptel;
200. p = &mob;
201. if (p->judge2(pname, ptel))
202. {
203. p = &con;
204. p->unload(pname, ptel);
205. }
206. else cout << "手机中无此联系人" << endl;
207. break;
208. case '4': //将手机中存储的联系人的信息复制到手机卡中
209. cout << "请输入要转存的联系人的姓名和电话" << endl;
210. cout << "姓名:";cin >> pname;
211. cout << "电话:";cin >> ptel;
212. p = &con;
213. if (p->judge2(pname, ptel))
214. {
215. p = &mob;
216. p->unload(pname, ptel);
217. }
218. else cout << "手机中无此联系人" << endl;
219. break;
220. default:
221. f = false;
222. cout << "选择错误,请重新输入" << endl;
223. }
224. if (!f) continue; //选择不正确重新选择
225. cout << "是否要转存其他联系人(是:Y 否:其他)" << endl;
226. char ch;
227. cin >> ch;
228. if (ch == 'Y' || ch == 'y') continue;
229. else break;
230. }
231. }
232. void user::empty()
233. {
234. m.empty_Menu(); //清空界面
235. bool f = true; //判断选择是否正确
236. char choose;
237. cout << "请选择:";
238. cin >> choose;
239. switch (choose)
240. {case '1':
241. p = &con;
242. p->empty();
243. break;
244. case '2':
245. p = &mob;
246. p->empty();
247. break;
248. case '3':
249. p = &con;
250. p->empty();
251. p = &mob;
252. p->empty();
253. break;
254. default:
255. cout << "选择错误" << endl;
256. f = false;
257. }
258. if (f) cout << "操作成功" << endl;
259. }
260. user::~user()
261. {
262. cout << "****************************************" << endl;
263. cout << "* 已成功退出系统 *" << endl;
264. cout << "****************************************" << endl;
265. }
main.cpp
#include"user.h"
#include"Menu.h"
int main()
{
Menu m;
user u;
system("color F0");
m.welcome_Menu();
system("pause");
system("cls");
while (1)
{
m.main_Menu();
char choose;
cin >> choose;
switch (choose)
{
case '1':
u.add();break;
case '2':
u.Delete();break;
case '3':
u.change();break;
case '4':
u.query();break;
case '5':
u.browse();break;
case '6':
u.unload();break;
case '7':
u.empty();break;
case '0':
return 0;
default:
cout << "输入错误" << endl;
}
system("pause");
system("cls");
}
}