)
通讯录管理系统(CPP实现)文章末尾添加了完整实现的代码主要练习基础语法的一个小项目 ,完整包含了函数,指针,数组,结构体等所有基础语法联系了增删查改等基础功能与君共勉!1. 需求记录联系人信息工具具体需求添加联系人:添加新的联系人,包括姓名,性别,年龄,联系电话,住址,最多记录1000人显示联系人:显示所有联系人的信息删除联系人:删除指定联系人查找联系人修改联系人清空联系人退出通讯录2. 思路1. 菜单提示用户可以实现的功能与如何实现,封装出一个显示界面的函数void showMenu() { //显示出主要功能 string function[6] { 1. 添加, 2. 显示, 3. 删除, 4. 查找, 5. 修改, 6. 清空 }; cout ************************* endl; for (int i 0; i 6; i) { cout ***** function[i] 联系人 ***** endl; } cout ***** 0. 退出通讯录 ***** endl; cout ************************* endl; }2. 主页面选择功能的实现利用switch语句选择对应功能同时为了使得程序可以多次使用,利用while 循环包含主要功能函数int select 0; //创建一个用户输入的变量,用于选择功能 while (true)//利用循环使得程序可以被重复使用,不需要重新加载 { showMenu(); cin select; switch (select)//判断用户的选择并确定对应功能 { case 0://退出通讯录 cout 欢迎下次使用 endl; system(pause);//代表暂停系统,退出程序 break; case 1://添加联系人 break; case 2://显示联系人 break; case 3://删除联系人 break; case 4://查找联系人 break; case 5://修改联系人 break; case 6://清空通讯录 break; default: cout 输入指令有误,请按照菜单提示选择功能 endl; } } }3. 添加联系人要求:可以增添联系人,且上限为1000人首先,要设定一个结构体叫做联系人并且确定对应属性(姓名,性别,年龄,联系电话,家庭住址)还要设计一个通讯录的结构体,用数组保存联系人,并且显示人数创建通讯录,也就是实例化封装添加联系人的函数测试添加联系人功能3.1 结构体设计#includestringstructPerson//联系人结构体,最小控制单元{string name;intm_gender;// 用整形表示男女,1男 2女intm_Age;string phone_num;//电话号string m_Addr;//住址};//设计通讯录结构体#defineMAX1000// 最大人数structAddressbooks{Person personArray[MAX];intm_Size;//通讯录现有人数};最大人数利用宏常量定义,方便后续修改上限3.2 添加函数**tips:**return 这个语句的功能可以立即结束函数的运行.对于人数已经满了,不能继续添加的情况,直接使用return;跳出这个函数;当然,对于void函数可以直接写return对于有具体类型的函数需要返回对应类型值结束掉该函数//添加联系人 void addPerson(Addressbooks* abs)//时刻记得ABS是一个结构体指针,引用属性时需要 - { //首先需要安全冗余判断,若通讯录人满了就不再继续添加,反之进行下一步正常添加 if (abs-m_Size MAX) { cout 通讯录已满 endl; return; } else { //具体的添加联系人的功能 //输入姓名 string name; cout 请输入姓名: endl; cin name; abs-personArray[abs-m_Size].name name; //输入性别 int gender 0; cout 请输入性别(1代表男性, 2代表女性) endl; //利用循环使得用户输入正确性别,若输入的数字不是1/2,就继续输入 while (1) { cin gender; if (gender 1 || gender 2) { abs-personArray[abs-m_Size].gender gender; break; } else { cout 输入有误,请重新输入 endl; continue; } } //输入年龄 int age 0; cout 请输入年龄 endl; cin age; abs-personArray[abs-m_Size].Age age; //输入电话 string phone_num ; cout 请输入电话 endl; cin phone_num; abs-personArray[abs-m_Size].phone_num phone_num; //输入地址 string addr ; cout 请输入地址 endl; cin addr; abs-personArray[abs-m_Size].Addr addr; //所有信息输入完毕,更新人数 abs-m_Size; cout 添加成功 endl; //然后清除屏幕,不然的话上边看着十分不美观 system(pause); system(cls); //清屏幕操作 } }4.显示联系人**功能:**显示通讯录中所有已有联系人的信息实现步骤:封装显示联系人的函数测试这个功能4.1 显示联系人的函数依旧是做好冗余,先判断是否存储了联系人信息.若未存储(人数等于零),则提示记录为空若存储了(人数大于零),则显示联系人信息以下是具体实现void show_person(Addressbooks *abs) //显示所有联系人信息 { if (abs-m_Size 0) { cout 通讯录为空 endl; return; } else { for (int i 0; i abs-m_Size; i) { cout 姓名 abs-personArray[i].name \t; cout 性别 (abs-personArray[i].gender 1? 男:女 ) \t; cout 年龄 abs-personArray[i].Age \t; cout 电话 abs-personArray[i].phone_num \t; cout 住址 abs-personArray[i].Addr endl; } } system(pause); //按任意键继续 system(cls); //清屏 }5. 删除联系人5.1 基本描述功能描述: 按照姓名删除指定联系人实现:封装函数检测联系人是否存在封装删除联系人的函数测试删除联系人的功能5.2 检测联系人是否存在功能描述:若姓名存在,则返回该联系人的位置;若不存在,返回-1;这里不存在不能返回零,因为有可能在数组的第一个位置们也就是0索引具体实现intis_occur(Addressbooks*abs,string d_person)//检测联系人是否存在{if(abs-m_Size0){return-1;}for(inti0;iabs-m_Size;i){if(abs-personArray[i].named_person){returni;//此人存在返回下标编号}}return-1;}5.3 删除联系人相当于把数组中特定地点的元素删除,也就是把要删除元素之后的所有元素都前移一个位置具体实现voiddel_person(Addressbooks*abs)//删除联系人{string d_person;cout请输入要删除的联系人姓名:;cind_person;intpositionis_occur(abs,d_person);//判断此人是否存在,若存在返回索引值if(position!-1){cout已找到该联系人endl;for(intiposition;iabs-m_Size-1;i)//这里注意最后一个元素的索引是总元素个数-1,因为索引从零开始{abs-personArray[i]abs-personArray[i1];}abs-m_Size--;//更新通讯录中的总人数cout删除完成,已删除联系人d_personendl;}else{cout要删除的联系人不存在endl;}}6.查找联系人功能: 按照姓名查看指定联系人的信息实现:封装查找联系人的函数测试此函数6.1 具体实现判断这个联系人是否存在,若存在就显示,若不存在则给用户提示具体实现void search_person(Addressbooks* abs) { cout 请输入您想查找的联系人姓名 endl; string name; cin name; //判断联系人是否存在 int result is_occur(abs, name); if (result ! -1) { cout 姓名: abs-personArray[result].name \t; cout 性别: (abs-personArray[result].gender 1? 男:女) \t; cout 年龄: abs-personArray[result].Age \t; cout 电话: abs-personArray[result].phone_num \t; cout 住址: abs-personArray[result].Addr endl; } else { cout 未找到该联系人 endl; } system(pause); //等待按任意键的指令 system(cls); //清屏 }7.修改联系人功能: 按照姓名重新修改联系人实现:封装修改联系人功能测试该函数具体实现//修改联系人信息 void modify_person(Addressbooks * abs) { cout 请输入您要修改的联系人信息 endl; string person ; cin person; int index is_occur(abs, person); //判断是否找到联系人 if (index ! -1) { cout 找到该联系人 endl; string name ; // 修改该联系人姓名 cout 请输入修改后联系人姓名: endl; cin name; abs-personArray[index].name name; // 修改性别 cout 请输入修改后性别(1-男, 2-女): endl; int gender 0; while (true) { cin gender; if (gender 1 || gender 2) { abs-personArray[index].gender gender; break; } cout 输入有误请重新输入 endl; } //修改年龄 cout 请输入年龄 endl; int age 0; cin age; abs-personArray[index].Age age; //修改电话 cout 请输入电话 endl; string phone_num ; cin phone_num; abs-personArray[index].phone_num phone_num; //修改住址 cout 请输入住址 endl; string addr ; cin addr; abs-personArray[index].Addr addr; cout 修改完成! endl; system(pause); system(cls); } else { cout 未找到该联系人 endl; return; } }8.清空联系人功能:清空通讯录中所有信息实现:只需要做一个逻辑上的清空即可,因为自从打开程序之后,所存储的联系人信息都储存在了栈内存中,不关闭程序就无法清空,所以本程序只是让用户访问不到这些信息,并不是从内存上清空还有一个原因是我们自己没有分配内存,所以无法释放内存(之后可能会完善这个问题)具体实现void clear_books(Addressbooks* abs) { abs-m_Size 0; //做一个逻辑上的清空 cout 通讯录已经清空! endl; system(pause); system(cls); }总结问题输入流异常:问题描述: 在添加联系人时,输入完姓名就不显示其他的输入提示了原因: 使用cin 输入值时,字符串带有空格,但是读取时只会读取空格前的内容,空格后的内容放入缓冲区,等到下次cin 时自动填写,万一类型不匹配就会导致cin 错误,直接跳过所有cin 操作string类型的变量不要使用NULL进行初始化,直接声明默认空字符串或者使用如下初始化:string a ;完整实现代码(CPP)#include iostream #include string #define MAX 1000 // 最大人数 using namespace std; struct Person //联系人结构体,最小控制单元 { string name; int gender; // 用整形表示男女,1男 2女 int Age; string phone_num;//电话号 string Addr;//住址 }; //设计通讯录结构体 struct Addressbooks { Person personArray[MAX]; int m_Size; //通讯录现有人数 }; //实现菜单功能 void showMenu() { //显示出主要功能 string function[6] { 1. 添加, 2. 显示, 3. 删除, 4. 查找, 5. 修改, 6. 清空 }; cout ************************* endl; for (int i 0; i 6; i) { cout ***** function[i] 联系人 ***** endl; } cout ***** 0. 退出通讯录 ***** endl; cout ************************* endl; } //添加联系人 void addPerson(Addressbooks* abs)//时刻记得ABS是一个结构体指针,引用属性时需要 - { //首先需要安全冗余判断,若通讯录人满了就不再继续添加,反之进行下一步正常添加 if (abs-m_Size MAX) { cout 通讯录已满 endl; return; } else { //具体的添加联系人的功能 //输入姓名 string name; cout 请输入姓名: endl; cin name; abs-personArray[abs-m_Size].name name; //输入性别 int gender 0; cout 请输入性别(1代表男性, 2代表女性) endl; //利用循环使得用户输入正确性别,若输入的数字不是1/2,就继续输入 while (1) { cin gender; if (gender 1 || gender 2) { abs-personArray[abs-m_Size].gender gender; break; } else { cout 输入有误,请重新输入 endl; continue; } } //输入年龄 int age 0; cout 请输入年龄 endl; cin age; abs-personArray[abs-m_Size].Age age; //输入电话 string phone_num ; cout 请输入电话 endl; cin phone_num; abs-personArray[abs-m_Size].phone_num phone_num; //输入地址 string addr ; cout 请输入地址 endl; cin addr; abs-personArray[abs-m_Size].Addr addr; //所有信息输入完毕,更新人数 abs-m_Size; cout 添加成功 endl; //然后清除屏幕,不然的话上边看着十分不美观 system(pause); system(cls); //清屏幕操作 } } void show_person(Addressbooks *abs) //显示所有联系人信息 { if (abs-m_Size 0) { cout 通讯录为空 endl; return; } else { for (int i 0; i abs-m_Size; i) { cout 姓名 abs-personArray[i].name \t; cout 性别 (abs-personArray[i].gender 1? 男:女 ) \t; cout 年龄 abs-personArray[i].Age \t; cout 电话 abs-personArray[i].phone_num \t; cout 住址 abs-personArray[i].Addr endl; } } system(pause); //按任意键继续 system(cls); //清屏 } //删除联系人,此函数中还包含一个检测联系人是否存在的函数 int is_occur(Addressbooks* abs, string d_person) //检测联系人是否存在 { if (abs-m_Size 0) { return -1; } for (int i 0; i abs-m_Size; i) { if (abs-personArray[i].name d_person) { return i; //此人存在返回下标编号 } } return -1; } void del_person(Addressbooks* abs) //删除联系人 { string d_person; cout 请输入要删除的联系人姓名:; cin d_person; int position is_occur(abs, d_person); //判断此人是否存在,若存在返回索引值 if (position ! -1) { cout 已找到该联系人 endl; for (int i position; i abs-m_Size - 1; i)//这里注意最后一个元素的索引是总元素个数-1,因为索引从零开始 { abs-personArray[i] abs-personArray[i 1]; } abs-m_Size--; //更新通讯录中的总人数 cout 删除完成,已删除联系人 d_person endl; } else { cout 要删除的联系人不存在 endl; } } //查找联系人 void search_person(Addressbooks* abs) { cout 请输入您想查找的联系人姓名 endl; string name; cin name; //判断联系人是否存在 int result is_occur(abs, name); if (result ! -1) { cout 姓名: abs-personArray[result].name \t; cout 性别: (abs-personArray[result].gender 1? 男:女) \t; cout 年龄: abs-personArray[result].Age \t; cout 电话: abs-personArray[result].phone_num \t; cout 住址: abs-personArray[result].Addr endl; } else { cout 未找到该联系人 endl; } system(pause); //等待按任意键的指令 system(cls); //清屏 } //修改联系人信息 void modify_person(Addressbooks * abs) { cout 请输入您要修改的联系人信息 endl; string person ; cin person; int index is_occur(abs, person); //判断是否找到联系人 if (index ! -1) { cout 找到该联系人 endl; string name ; // 修改该联系人姓名 cout 请输入修改后联系人姓名: endl; cin name; abs-personArray[index].name name; // 修改性别 cout 请输入修改后性别(1-男, 2-女): endl; int gender 0; while (true) { cin gender; if (gender 1 || gender 2) { abs-personArray[index].gender gender; break; } cout 输入有误请重新输入 endl; } //修改年龄 cout 请输入年龄 endl; int age 0; cin age; abs-personArray[index].Age age; //修改电话 cout 请输入电话 endl; string phone_num ; cin phone_num; abs-personArray[index].phone_num phone_num; //修改住址 cout 请输入住址 endl; string addr ; cin addr; abs-personArray[index].Addr addr; cout 修改完成! endl; system(pause); system(cls); } else { cout 未找到该联系人 endl; return; } } //清空通讯录 void clear_books(Addressbooks* abs) { abs-m_Size 0; //做一个逻辑上的清空 cout 通讯录已经清空! endl; system(pause); system(cls); } int main() { //实例化通讯录结构体变量 Addressbooks abs; abs.m_Size 0; int select 0; //创建一个用户输入的变量,用于选择功能 while (true)//利用循环使得程序可以被重复使用,不需要重新加载 { showMenu(); cin select; switch (select)//判断用户的选择并确定对应功能 { case 0://退出通讯录 cout 欢迎下次使用 endl; system(pause);//代表暂停系统,退出程序 break; case 1://添加联系人 addPerson(abs);//利用地址传递,直接修改通讯录实参的值 break; case 2://显示联系人 show_person(abs); break; case 3://删除联系人 del_person(abs); break; case 4://查找联系人 search_person(abs); break; case 5://修改联系人 modify_person(abs); break; case 6://清空通讯录 clear_books(abs); break; default: cout 输入指令有误,请按照菜单提示选择功能 endl; } } }