系统需求
通讯录是一个可以记录亲人、好友信息的工具。
本教程主要利用C++来实现一个通讯录管理系统
系统中需要实现的功能如下:
- 添加联系人:向通讯录中添加新人,信息包(姓名、性别、年长、联系电话、家庭住址)最多记录1000人
- 显示联络人:显示通讯录中所有联系人信息
- 剪除联络人:按照片姓名进行剪除指定联络人
- 查询联系人:按照片姓名查询指定联系人信息
- 修改联系人:按照片姓名重新修改指定联系人
- 清空联络人:清空通讯录中所有信息
- 退出通讯录:退出当使用前使用的通讯录
菜单功能
功能描述:用户选择功能的界面
菜单界面效果如下图:
步骤:
- 封装函数显示应界面如
void showMenu()
- 在主要函数中调使用封装好的函数
1 #include<iostream> 2 using namespace std; 3 4 //菜单界面 5 void showMenu() 6 { 7 cout << "***************************" << endl; 8 cout << "***** 1、添加联系人 *****" << endl; 9 cout << "***** 2、显示联系人 *****" << endl; 10 cout << "***** 3、删除联系人 *****" << endl; 11 cout << "***** 4、查找联系人 *****" << endl; 12 cout << "***** 5、修改联系人 *****" << endl; 13 cout << "***** 6、清空联系人 *****" << endl; 14 cout << "***** 0、退出通讯录 *****" << endl; 15 cout << "***************************" << endl; 16 } 17 18 int main() { 19 20 showMenu(); 21 22 system("pause"); 23 24 return 0; 25 }
退出功能
功能描述:退出通讯录系统
思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建
当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序
1 int main() { 2 3 int select = 0; 4 5 while (true) 6 { 7 showMenu(); 8 9 cin >> select; 10 11 switch (select) 12 { 13 case 1: //添加联系人 14 break; 15 case 2: //显示联系人 16 break; 17 case 3: //删除联系人 18 break; 19 case 4: //查找联系人 20 break; 21 case 5: //修改联系人 22 break; 23 case 6: //清空联系人 24 break; 25 case 0: //退出通讯录 26 cout << "欢迎下次使用" << endl; 27 system("pause"); 28 return 0; 29 break; 30 default: 31 break; 32 } 33 } 34 35 system("pause"); 36 37 return 0; 38 }
添加联系人
功能描述:
实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)
添加联系人实现步骤:
- 设计联系人结构体
- 设计通讯录结构体
- main函数中创建通讯录
- 封装添加联系人函数
- 测试添加联系人功能
5.1 设计联系人结构体
联系人信息包括:姓名、性别、年龄、联系电话、家庭住址
设计如下:
1 #include <string> //string头文件 2 //联系人结构体 3 struct Person 4 { 5 string m_Name; //姓名 6 int m_Sex; //性别:1男 2女 7 int m_Age; //年龄 8 string m_Phone; //电话 9 string m_Addr; //住址 10 };
设计通讯录结构体
设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量
设计如下
1 #define MAX 1000 //最大人数 2 3 //通讯录结构体 4 struct Addressbooks 5 { 6 struct Person personArray[MAX]; //通讯录中保存的联系人数组 7 int m_Size; //通讯录中人员个数 8 };
main函数中创建通讯录
添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录
1 mian函数起始位置添加: 2 3 //创建通讯录 4 Addressbooks abs; 5 //初始化通讯录中人数 6 abs.m_Size = 0;
封装添加联系人函数
思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录
添加联系人代码
1 //1、添加联系人信息 2 void addPerson(Addressbooks *abs) 3 { 4 //判断电话本是否满了 5 if (abs->m_Size == MAX) 6 { 7 cout << "通讯录已满,无法添加" << endl; 8 return; 9 } 10 else 11 { 12 //姓名 13 string name; 14 cout << "请输入姓名:" << endl; 15 cin >> name; 16 abs->personArray[abs->m_Size].m_Name = name; 17 18 cout << "请输入性别:" << endl; 19 cout << "1 -- 男" << endl; 20 cout << "2 -- 女" << endl; 21 22 //性别 23 int sex = 0; 24 while (true) 25 { 26 cin >> sex; 27 if (sex == 1 || sex == 2) 28 { 29 abs->personArray[abs->m_Size].m_Sex = sex; 30 break; 31 } 32 cout << "输入有误,请重新输入"; 33 } 34 35 //年龄 36 cout << "请输入年龄:" << endl; 37 int age = 0; 38 cin >> age; 39 abs->personArray[abs->m_Size].m_Age = age; 40 41 //联系电话 42 cout << "请输入联系电话:" << endl; 43 string phone = ""; 44 cin >> phone; 45 abs->personArray[abs->m_Size].m_Phone = phone; 46 47 //家庭住址 48 cout << "请输入家庭住址:" << endl; 49 string address; 50 cin >> address; 51 abs->personArray[abs->m_Size].m_Addr = address; 52 53 //更新通讯录人数 54 abs->m_Size++; 55 56 cout << "添加成功" << endl; 57 system("pause"); 58 system("cls"); 59 } 60 }
测试添加联系人功能
选择界面中,如果玩家选择了1,代表添加联系人,我们可以测试下该功能
在switch case 语句中,case1里添加:
显示联系人
功能描述:显示通讯录中已有的联系人信息
显示联系人实现步骤:
- 封装显示联系人函数
- 测试显示联系人功能
6.1 封装显示联系人函数
思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息
显示联系人代码:
1 //2、显示所有联系人信息 2 void showPerson(Addressbooks * abs) 3 { 4 if (abs->m_Size == 0) 5 { 6 cout << "当前记录为空" << endl; 7 } 8 else 9 { 10 for (int i = 0; i < abs->m_Size; i++) 11 { 12 cout << "姓名:" << abs->personArray[i].m_Name << "\t"; 13 cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t"; 14 cout << "年龄:" << abs->personArray[i].m_Age << "\t"; 15 cout << "电话:" << abs->personArray[i].m_Phone << "\t"; 16 cout << "住址:" << abs->personArray[i].m_Addr << endl; 17 } 18 } 19 20 system("pause"); 21 system("cls"); 22 23 }
测试显示联系人功能
在switch case语句中,case 2 里添加
1 case 2: //显示联系人 2 showPerson(&abs); 3 break;
删除联系人
功能描述:按照姓名进行删除指定联系人
删除联系人实现步骤:
- 封装检测联系人是否存在
- 封装删除联系人函数
- 测试删除联系人功能
7.1 封装检测联系人是否存在
设计思路:
删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人
因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1
检测联系人是否存在代码:
1 //判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1 2 int isExist(Addressbooks * abs, string name) 3 { 4 for (int i = 0; i < abs->m_Size; i++) 5 { 6 if (abs->personArray[i].m_Name == name) 7 { 8 return i; 9 } 10 } 11 return -1; 12 }
封装删除联系人函数
根据用户输入的联系人判断该通讯录中是否有此人
查找到进行删除,并提示删除成功
查不到提示查无此人。
1 //3、删除指定联系人信息 2 void deletePerson(Addressbooks * abs) 3 { 4 cout << "请输入您要删除的联系人" << endl; 5 string name; 6 cin >> name; 7 8 int ret = isExist(abs, name); 9 if (ret != -1) 10 { 11 for (int i = ret; i < abs->m_Size; i++) 12 { 13 abs->personArray[i] = abs->personArray[i + 1]; 14 } 15 abs->m_Size--; 16 cout << "删除成功" << endl; 17 } 18 else 19 { 20 cout << "查无此人" << endl; 21 } 22 23 system("pause"); 24 system("cls"); 25 }
测试删除联系人功能
在switch case 语句中,case3里添加:
1 case 3: //删除联系人 2 deletePerson(&abs); 3 break;
查找联系人
功能描述:按照姓名查看指定联系人信息
查找联系人实现步骤
- 封装查找联系人函数
- 测试查找指定联系人
8.1 封装查找联系人函数
实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。
查找联系人代码:
1 //4、查找指定联系人信息 2 void findPerson(Addressbooks * abs) 3 { 4 cout << "请输入您要查找的联系人" << endl; 5 string name; 6 cin >> name; 7 8 int ret = isExist(abs, name); 9 if (ret != -1) 10 { 11 cout << "姓名:" << abs->personArray[ret].m_Name << "\t"; 12 cout << "性别:" << abs->personArray[ret].m_Sex << "\t"; 13 cout << "年龄:" << abs->personArray[ret].m_Age << "\t"; 14 cout << "电话:" << abs->personArray[ret].m_Phone << "\t"; 15 cout << "住址:" << abs->personArray[ret].m_Addr << endl; 16 } 17 else 18 { 19 cout << "查无此人" << endl; 20 } 21 22 system("pause"); 23 system("cls"); 24 25 }
测试查找指定联系人
在switch case 语句中,case4里添加:
1 case 4: //查找联系人 2 findPerson(&abs); 3 break;
修改联系人
功能描述:按照姓名重新修改指定联系人
修改联系人实现步骤
- 封装修改联系人函数
- 测试修改联系人功能
9.1 封装修改联系人函数
实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人
修改联系人代码:
1 //5、修改指定联系人信息 2 void modifyPerson(Addressbooks * abs) 3 { 4 cout << "请输入您要修改的联系人" << endl; 5 string name; 6 cin >> name; 7 8 int ret = isExist(abs, name); 9 if (ret != -1) 10 { 11 //姓名 12 string name; 13 cout << "请输入姓名:" << endl; 14 cin >> name; 15 abs->personArray[ret].m_Name = name; 16 17 cout << "请输入性别:" << endl; 18 cout << "1 -- 男" << endl; 19 cout << "2 -- 女" << endl; 20 21 //性别 22 int sex = 0; 23 while (true) 24 { 25 cin >> sex; 26 if (sex == 1 || sex == 2) 27 { 28 abs->personArray[ret].m_Sex = sex; 29 break; 30 } 31 cout << "输入有误,请重新输入"; 32 } 33 34 //年龄 35 cout << "请输入年龄:" << endl; 36 int age = 0; 37 cin >> age; 38 abs->personArray[ret].m_Age = age; 39 40 //联系电话 41 cout << "请输入联系电话:" << endl; 42 string phone = ""; 43 cin >> phone; 44 abs->personArray[ret].m_Phone = phone; 45 46 //家庭住址 47 cout << "请输入家庭住址:" << endl; 48 string address; 49 cin >> address; 50 abs->personArray[ret].m_Addr = address; 51 52 cout << "修改成功" << endl; 53 } 54 else 55 { 56 cout << "查无此人" << endl; 57 } 58 59 system("pause"); 60 system("cls"); 61 62 }
测试修改联系人功能
在switch case 语句中,case 5里添加:
1 case 5: //修改联系人 2 modifyPerson(&abs); 3 break;
清空联系人
功能描述:清空通讯录中所有信息
清空联系人实现步骤
- 封装清空联系人函数
- 测试清空联系人
10.1 封装清空联系人函数
实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。
清空联系人代码:
1 //6、清空所有联系人 2 void cleanPerson(Addressbooks * abs) 3 { 4 abs->m_Size = 0; 5 cout << "通讯录已清空" << endl; 6 system("pause"); 7 system("cls"); 8 }
测试清空联系人
在switch case 语句中,case 6 里添加: 1 case 6: //清空联系人 2 cleanPerson(&abs); 3 break;
全代码:
1 #include <iostream> 2 #include <string.h> 3 #define MAX 1000 4 using namespace std; 5 // 联系人结构体 6 struct Person 7 { 8 //name 9 string m_name; 10 //sex 1 男 2 女 11 int m_Sex; 12 //age 13 int m_Age; 14 //phone 15 string m_Phone; 16 //address 17 string m_Adress; 18 }; 19 // 通讯录结构体 20 struct Addressbooks 21 { 22 //通讯录中保存的联系人数组 23 struct Person personArray[MAX]; 24 //通讯录中当前记录联系人个数 25 int m_Size; 26 }; 27 //1.添加联系人 28 void addPerson(Addressbooks* abs) 29 { 30 //判断通讯录是否已满,如果满了就不再添加 31 if (abs->m_Size >= MAX) 32 { 33 cout << "通讯录已满,无法添加联系人" << endl; 34 return; 35 } 36 else 37 { 38 //添加具体的联系人 39 40 // name 41 string name; 42 cout << "请输入姓名: " << endl; 43 cin >> name; 44 abs->personArray[abs->m_Size].m_name = name; 45 // sex 46 int sex = 0; 47 while (true) 48 { 49 cout << "请输入性别:1 代表男性,2 代表女性" << endl; 50 cin >> sex; 51 //如果输入的是1 || 2则输并结束循环,否则重新输入 52 if (sex == 1 || sex == 2) 53 { 54 abs->personArray[abs->m_Size].m_Sex = sex; 55 break; 56 } 57 else 58 { 59 cout << "Error! Please cin again!" << endl; 60 } 61 } 62 // age 63 int age = 0; 64 cout << "请输入年龄 :" << endl; 65 cin >> age; 66 abs->personArray[abs->m_Size].m_Age = age; 67 // phone 68 string phone; 69 cout << "请输入电话号码 :" << endl; 70 cin >> phone; 71 abs->personArray[abs->m_Size].m_Phone = phone; 72 //address 73 string address; 74 cout << "请输入住址 :" << endl; 75 cin >> address; 76 abs->personArray[abs->m_Size].m_Adress = address; 77 //更新通讯录人数 78 abs->m_Size++; 79 cout << "添加成功 !" << endl; 80 system("pause");//请按任意键继续 81 system("cls");//清屏操作 82 } 83 } 84 //2.显示所有的联系人 85 void showPerson(Addressbooks * abs) 86 { 87 //判断通讯录中人数是否为0,如果为0,提示记录为空 88 //如果不为0,显示记录联系人 89 if (abs->m_Size == 0) 90 { 91 cout << "当前记录为空" << endl; 92 } 93 else 94 { 95 for (int i = 0; i < abs->m_Size; i++) 96 { 97 cout << "姓名 : " << abs->personArray[i].m_name << "\t"; 98 cout << "性别 : " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t"; 99 cout << "年龄 : " << abs->personArray[i].m_Age << "\t"; 100 cout << "电话 : " << abs->personArray[i].m_Phone << "\t"; 101 cout << "住址 : " << abs->personArray[i].m_Adress << "\t"<< endl; 102 103 } 104 } 105 system("pause"); 106 system("cls"); 107 } 108 //检测联系人是否存在,如果存在,返回类型人所在数组中的具体位置,如果不存在,返回-1 109 //参数一 通讯录 参数二 对比姓名 110 int isExist(Addressbooks * abs ,string name) 111 { 112 for (int i = 0; i < abs->m_Size; i++) 113 { 114 if (abs->personArray[i].m_name == name) 115 { 116 return i;//找到了,则返回这个人在数组中的编号 117 } 118 } 119 return -1; 120 } 121 //3.删除指定联系人 122 void deletePerson(Addressbooks* abs) 123 { 124 cout << "请输入您要删除的联系人 : " << endl; 125 string name; 126 cin >> name; 127 int ret = isExist(abs, name); 128 if (ret != -1) 129 { 130 //查到人进行具体的删除操作 131 for (int i = ret; i < abs->m_Size; i++) 132 { 133 //数据前移 134 abs->personArray[i] = abs->personArray[i + 1]; 135 } 136 abs->m_Size--;//更新通讯录人数 137 cout << "删除成功 !" << endl; 138 } 139 else 140 { 141 cout << "查无此人" << endl; 142 } 143 system("pause"); 144 system("cls"); 145 } 146 //4.查找指定联系人信息 147 void findPerson(Addressbooks* abs) 148 { 149 cout << "请输入您要查找的联系人" << endl; 150 string name; 151 cin >> name; 152 //判断指定联系人是否存在于通讯录中 153 int ret = isExist(abs, name); 154 if (ret != -1) 155 { 156 cout << "姓名 : " << abs->personArray[ret].m_name << "\t"; 157 cout << "性别 : " << abs->personArray[ret].m_Sex << "\t"; 158 cout << "年龄 : " << abs->personArray[ret].m_Age<< "\t"; 159 cout << "电话 : " << abs->personArray[ret].m_Phone<< "\t"; 160 cout << "住址 : " << abs->personArray[ret].m_Adress << "\t" << endl; 161 } 162 else 163 { 164 cout << "查无此人" << endl; 165 } 166 system("pause"); 167 system("cls"); 168 } 169 //5.修改指定联系人信息 170 void modifyPerson(Addressbooks* abs) 171 { 172 cout << "请输入您要修改的联系人 :" << endl; 173 string name; 174 cin >> name; 175 int ret = isExist(abs, name); 176 if (ret != -1) 177 { 178 //姓名 179 string name; 180 cout << "请输入姓名 : " << endl; 181 cin >> name; 182 abs->personArray[ret].m_name = name; 183 //sex 184 int sex = 0; 185 cout << "请输入性别 : " << endl; 186 cout << "1----- 男" << endl; 187 cout << "2----- 女" << endl; 188 while (true) 189 { 190 cin >> sex; 191 abs->personArray[ret].m_Sex = sex; 192 if (sex == 1 || sex == 2) 193 { 194 (abs->personArray[ret].m_Sex) = sex; 195 break; 196 } 197 cout << "输入错误,请重新输入" << endl; 198 } 199 200 //age 201 int age = 0; 202 cout << "请输入年龄 : " << endl; 203 cin >> age; 204 abs->personArray[ret].m_Age = age; 205 //phone 206 string phone; 207 cout << "请输入电话号码 : " << endl; 208 cin >> phone; 209 abs->personArray[ret].m_Phone = phone; 210 //address 211 string address; 212 cout << "请输入住址 : " << endl; 213 cin >> address; 214 abs->personArray[ret].m_Adress = address; 215 216 cout << "修改成功" << endl; 217 } 218 else 219 { 220 cout << "查无此人" << endl; 221 } 222 system("pause"); 223 system("cls"); 224 } 225 //6.清空联系人 226 void cleanPerson(Addressbooks* abs) 227 { 228 abs->m_Size = 0;//做一个逻辑上的清空,让人访问不到 229 cout << "通讯录已清空" << endl; 230 system("pause"); 231 system("cls"); 232 } 233 void showMenu(void)//菜单函数 234 { 235 cout << "************************" << endl; 236 cout << "***** 1.添加联系人 *****" << endl; 237 cout << "***** 2.显示联系人 *****" << endl; 238 cout << "***** 3.删除联系人 *****" << endl; 239 cout << "***** 4.查找联系人 *****" << endl; 240 cout << "***** 5.修改联系人 *****" << endl; 241 cout << "***** 6.清空联系人 *****" << endl; 242 cout << "***** 0.退出通讯录 *****" << endl; 243 cout << "************************" << endl; 244 245 } 246 247 int main(void) 248 { 249 //创建通讯录结构体变量 250 Addressbooks abs; 251 //初始化通讯录中当前的人员个数 252 abs.m_Size = 0; 253 int select = 0;//创建用户输入的初始变量 254 255 while (true) 256 { 257 //菜单调用 258 showMenu(); 259 cin >> select; 260 switch (select) 261 { 262 case 1://1.添加联系人 263 addPerson(&abs);//利用地址传递可以修饰实参 264 break; 265 case 2:// 2.显示联系人 266 showPerson(&abs); 267 break; 268 case 3://3.删除联系人 269 /* { 270 cout << "请输入一个删除的联系人的姓名 :" << endl; 271 string name; 272 cin >> name; 273 if (isExist(&abs, name) == -1) 274 { 275 cout << "查无此人" << endl; 276 } 277 else 278 { 279 cout << "找到此人" << endl; 280 } 281 }*/ 282 deletePerson(&abs); 283 break; 284 case 4://4.查找联系人 285 findPerson(&abs); 286 break; 287 case 5:// 5.修改联系人 288 modifyPerson(&abs); 289 break; 290 case 6://6.清空联系人 291 cleanPerson(&abs); 292 break; 293 case 0:// 0.退出通讯录 294 cout << "欢迎下次使用" << endl; 295 system("pause"); 296 return 0; 297 break; 298 299 } 300 } 301 302 return 0; 303 }