摘要:大一即将结束的同学,一定都在思考如何完成一份独具自己特色的期末考核作业----一份属于自己的程序,通讯录管理系统系统就是一个很好的模板,依托这个模板,你不仅能复习一下c/c++语法知识,又能体验到编程的乐趣。
---------------------------------------------------------------------------------------------------------------------------------
那么该如何实现呢?
1.首先,我们要要在脑中构建一个菜单,这个菜单中有我们想要实现的各种功能
这个就因人而异了这里示例的是:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
但是这样就有点单调
?为了美化你的菜单你可以用不同的形式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?代码实现:
void showmenu()//封装一个函数showmenu() (menu就是菜单的意思)
{
cout << "************************" << endl;
cout << "************************" << endl;
cout << "***** 1.添加联系人 *****" << endl;
cout << "***** 2.显示联系人 *****" << endl;
cout << "***** 3.删除联系人 *****" << endl;
cout << "***** 4.查找联系人 *****" << endl;
cout << "***** 5.修改联系人 *****" << endl;
cout << "***** 6.清空联系人 *****" << endl;
cout << "***** 0.退出通讯录 *****" << endl;
cout << "************************" << endl;
cout << "************************" << endl;
}
为了实现这些不同的功能,我们可以根据用户输入的数字决定,就按照菜单的来。
于是乎我们就 main 函数里创建一个变量select 来存储(用户选择实现的功能)
接着我们就可以根据这个 select 来实现不同功能了。
此时是可以写
if(表达式1) ……
if(表达式2) ……
if(表达式3) ……
……
但这样写效率显然并不高。
我们可以利用switch()来实现分流处理;(欢乐水流~~~~~~~~)
代码实现:
while (1)
{
showmenu();//我来show菜单了
cin >> select;//您是老大今天吃啥?
switch (select)//瞅一瞅菜单
{
case 1:……
break;// 1.就它了,添加联系人
case 2:
……
break; //2.就它了,显示联系人
case 3:
……
break; //3.就它了,删除联系人
case 4:
……
break; //4.就它了,查找联系人
case 5:
……
break;// 5.就它了,修改联系人
case 6:
……
break;// 6.??就这,清空联系人
case 0:
cout << "欢迎下次使用" << endl;//拜拜了您内
system("pause");
return 0;
break;// 0.唉,不合胃口,退出通讯录
}
}
注:我们使用系统时不希望它突然退出就用死循环框住,用条件判定退出,
这就是我们后面要实现的退出功能。
不同功能的实现我们要封装不同函数,下会详细讲解
-------------------------------------------------------------------------------------------------------------------
2.第一步:一个通讯录要有形形色色的联系人,他们都独具特色,有着不同类型的信息,那么单纯的一个变量无法表达所有的信息,这就需要我们定义一个结构体变量对信息进行存储。
struct person
{
string m_name;//姓名
int m_sex;//1.男,2.女(这里定义一个整型变量来控制性别属性)
int m_age;//年龄
string m_phone;//电话号码
string m_addr;//家庭住址
};
来赋予这名联系人的属性(1.姓名,2.性别,3.年龄,4.电话号码,5,家庭住址);
第二步:因为联系人不止一个,我们考虑用结构体数组存储
当然也不能过多哈,最多1000呗。
为了方便于维护以后说不定想要有2000个联系人呢,对吧?写一个宏定义。
#define MAX 1000? ? ? ? ?//通讯录最多能容纳的联系人数。 代码实现:
struct addressbooks//通讯录结构体
{
struct person personarray[MAX];//结构体数组
int m_size;//长度啦~~~~
};
这样我们就拥有了一个通讯录结构体啦~~~星星眼。
---------------------------------------------------------------------------------------------------------------------------------
功能零
退出系统:虽说是个功能,但就是退出循环而已。
上代码:
case 0: ?? ??? ??? ?cout << "欢迎下次使用" << endl;//拜拜了您内 ?? ??? ??? ?system("pause"); ?? ??? ??? ?return 0; ?? ??? ??? ?break;// 0.唉,不合胃口,退出通讯录
---------------------------------------------------------------------------------------------------------------------------------
功能一:
添加联系人
封装一个函数无返回值?含参函数?void addperson()
我们知道函数中形参的改变不影响实参,要改变main函数中的变量(实参)我们需要用到指针
进行地址传递。
代码实现:
void addperson(addressbooks*abs)//用指针指向通讯录结构体变量abs,对应有一个结构体数组
{
if (abs->m_size == MAX)//如果abs的结构体数组长度为MAX就拜拜了
{
cout << "通讯录已满,无法添加." << endl;
return;//强行返回
}
else
{
//添加具体联系人的环节
//添加姓名
cout << "请输入该联系人的姓名" << endl;
string name;
cin >> name;
abs->personarray[abs->m_size].m_name = name;(密密麻麻的指针呀看到abs->就翻译成abs的)
//添加性别
cout << "请输入该联系人的性别:" << endl;
cout << "1----男,2----女" << endl;
int sex=0;
//考虑到用户输入能出错的情况;
while (1)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personarray[abs->m_size].m_sex = sex;
break;
}
cout << "您的输入有误,请重新你输入" << endl;
}
//添加年龄
cout << "请输入一个年龄:" << endl;
int age;
while(1)
{
cin >> age;
if (age > 0 && age <= 100)
{
abs->personarray[abs->m_size].m_age = age;
break;//退出循环
}
else
cout << "您输入的年龄有误请重新输入:" << endl;
}
//添加电话
cout << "请输入联系人的电话" << endl;
string phone;
cin >> phone;
abs->personarray[abs->m_size].m_phone = phone;
//添加地址
cout << "请输入联系人的地址:" << endl;
string addr;
cin >> addr;
abs->personarray[abs->m_size].m_addr = addr;
//更新通讯录
cout << "添加成功" << endl;
abs->m_size++;//我们更新一下人员个数,千万别忘了!
system("pause");//请按任意键继续
system("cls");//清屏cleanscreen好记吧
}
}
对应于主函数
case 1:addperson(&abs);//使用指针时要把地址传进去,就是我们所说的地址传递来影响实参; ?? ??? ??? ?break;// 1.添加联系人。
-----------------------------------------------------------------------------------------------------------------------------
功能二:
显示联系人
用户想要知道通讯录里有谁,这要求不过分吧。
为了我们代码的简洁性和便于测试代码,我们还是依靠无返回含参函数showperson()来实现
定义一个void showperson(addressbooks*abs) //和addperson函数类似我们需要用指针把通讯录信息传进去来操作实参。
代码实现:
void showperson(addressbooks*abs)
{
//判断通信录中人数是否为零,若为零告知记录为空,否则显示。
if (abs->m_size == 0)
{
cout << "当前记录为空" << endl;
}
else
{
for (int i = 0; i < abs->m_size; i++)
{ //遇到->和.就翻译成神马神马的
cout << "姓名:" << abs->personarray[i].m_name<<"\t";
cout << "性别:" << (abs->personarray[i].m_sex == 1 ? "男" : "女")<<"\t";
cout << "年龄:" << abs->personarray[i].m_age<<"\t";
cout << "电话号码:" << abs->personarray[i].m_phone<<"\t";
cout << "家庭住址:" << abs->personarray[i].m_addr << endl;
}
system("pause");//请按任意键继续。
system("cls");清屏操作
}
}
cout << "性别:" << (abs->personarray[i].m_sex == 1 ? "男" : "女")<<"\t";
拿此串代码说明:水平制符表? "\t "能使你的输出更加美观,三目运算符:
(abs->personarray[i].m_sex == 1 ? "男" : "女")用括号括起来是一个表达式,如果条件成立返回字符串男,否则返回字符串女。
在main函数中我们调用一下这个函数:
case 2: ?? ??? ??? ?showperson(&abs); ?? ??? ??? ?break; //2.显示联系人
--------------------------------------------------------------------------------------------------------------------------------
功能三:
删除联系人
用户想让这个联系人从他眼前消失.
要想删除这个联系人首先我们要知道我们的通讯录中是否有此人,我们可以根据姓名索引,遍历我们的结构体数组,看他是否在我们的通讯录里。
这里我们单独封装一个 有返回含参函数 int???isexist()? 如果存在要查找的联系人,我们返回它在结构体数组中对应的下标? ,不存在则返回-1;
之所以选择单独封装是应为我们查找功能和修改功能都要用到它来判断用户输入的联系人是否在我们的通讯录中。
代码实现:
//检测联系人是否存在,如果存在找出联系人所在位置,不存在返回-1.
//参数一:通讯录;参数二,查找人姓名。
int isexist(addressbooks* abs, string name)
{
for (int i = 0; i < abs->m_size; i++)
{
if (abs->personarray[i].m_name == name)
{
return i;
break;
}
}
return -1;
};
?删除的算法大家一定不陌生我们封装一个无返回有参deleteperson()函数来操作通讯录数据
?
?代码实现:
//删除一个联系人,若不存在,告知用户,查无此人;存在,告知用户,已删除。
void deleteperson(addressbooks* abs)
{
cout << "请输入一个您要删除的联系人" << endl;
string name;
cin >> name;
int ret = isexist(abs, name);//用ret代表返回值(return),已经传入指针了,无需&abs;
if (ret == -1)
{
cout << "查无此人 " << endl;
}
else//找到要删除的联系人,把该联系人之后的所有联系人前移,同时联系人数减一;
{
for (int i = ret; i < abs->m_size; i++)
{
abs->personarray[i] = abs->personarray[i + 1];//元素前移
}
abs->m_size--;//更新一下通讯录中的人员数;
cout << "删除成功" << endl;
}
system("pause");//请按任意键继续
system("cls");//清屏操作
}
?这样一来,我们只要在main函数中调用以下函数就能实现删除功能了。
?case 3: ?? ??? ??? ?deleteperson(&abs); ?? ??? ??? ?break; //3.删除联系人
?--------------------------------------------------------------------------------------------------------------------------------功能四:
查找联系人:
还记得我们单独封装的 isexist ()函数吗,现在我们又要用到它了。
封装一个无返回有参函数 findperson()?
如果用户输入的联系人不在我们的通讯录中,告诉他查无此人,如果在我们的通讯录中,我们将他的所有信息打印出来。
代码实现:
//查找一个联系人
void findperson(addressbooks* abs)
{
cout << "请输入一个您要查找的联系人姓名" << endl;
string name;
cin >> name;
int ret=isexist(abs, name);//用ret代表返回值(return),已经传入指针了,无需&abs;
if (ret == -1)//返回值为-1说明不在我们的的通讯录中
{
cout << "查无此人" << endl;
}
else//找到此人,打印其所有信息。
{
cout << "姓名:"<<abs->personarray[ret].m_name << "\t";
cout << "性别" << abs->personarray[ret].m_sex << "\t";
cout << "年龄"<<abs->personarray[ret].m_age << "\t";
cout << "电话"<<abs->personarray[ret].m_phone << "\t";
cout << "地址"<<abs->personarray[ret].m_addr << "\t";
}
system("pause");//请按任意键继续
system("cls");//清屏
}
最后在main函数当中调用一下就可以了。
case 4: ?? ??? ??? ?findperson(&abs); ?? ??? ??? ?break; ?//4.查找联系人
---------------------------------------------------------------------------------------------------------------------------------功能五:
修改联系人:
还记得我们单独封装的 isexist ()函数吗,现在我们又要用到它了。
封装一个函数 modifyperson() 同样以姓名进行索引,如果用户输入的联系人不在在我们的通讯录中,告知用户查无此人,如果在我们的通讯录当中,提示用户修改联系人信息,这里可以copy? ? addperson()函数里的语句,稍微修改一下即可。
代码实现:
//修改已有联系人
//首先查找一下是否有该联系人利用isexist()函数
void modifyperson(addressbooks* abs)
{
cout << "请输入一个您要修改的联系人的姓名:" << endl;
string name;
cin >> name;
int ret = isexist(abs, name);
if (ret == -1)
{
cout << "查无此人:" << endl;
}
else
{
cout << "请输入修改后该联系人的姓名" << endl;
string name;
cin >> name;
abs->personarray[ret].m_name = name;//这里注意ret是isexist函数返回的联系人下标
//添加性别
cout << "请输入修改后该联系人的性别:" << endl;
cout << "1----男,2----女" << endl;
int sex = 0;
while (1)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personarray[ret].m_sex = sex;
break;
}
cout << "您的输入有误,请重新你输入" << endl;
}
//添加年龄
cout << "请输入修改后一个年龄:" << endl;
int age;
while (1)
{
cin >> age;
if (age > 0 && age <= 100)
{
abs->personarray[ret].m_age = age;
break;
}
else
cout << "您输入的年龄有误请重新输入:" << endl;
}
//添加电话
cout << "请输入修改后联系人的电话" << endl;
string phone;
cin >> phone;
abs->personarray[ret].m_phone = phone;
//添加地址
cout << "请输入修改后联系人的地址:" << endl;
string addr;
cin >> addr;
abs->personarray[ret].m_addr = addr;
cout << "修改成功" << endl;
system("pause");
system("cls");
}
}
同样,我们只需在main函数里调用一下即可
case 5: ?? ??? ??? ?modifyperson(&abs); ?? ??? ??? ?break;// 5.修改联系人
---------------------------------------------------------------------------------------------------------------------------------
功能六
清空联系人
这个功能就很好实现了,封装一个函数 clenperson()把数组的长度变为0,那么我们所有的联系人信息都被清除了,清屏后,得到的就只是空壳了。
代码实现:
//清空联系人
void cleanperson(addressbooks* abs)
{
cout << "成功清除所有联系人" << endl;
abs->m_size = 0;
system("pause");
system("cls");//清屏
}
最后在main函数里调用以下即可。
?? ?case 6: ?? ??? ??? ?cleanperson(&abs); ?? ??? ??? ?break;// 6.清空联系人
---------------------------------------------------------------------------------------------------------------------------------
至此我们的通讯录管理系统就实现了,欢迎大家开动脑筋加入一些自己的元素,让程序飞起来吧!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?二零二一年十二月一日
---------------------------------------------------------------------------------------------------------------------------------
完整代码//大家一起努力呀!!!
#include<iostream>
#include<string>
#include<windows.h>
using namespace std;
#define MAX 1000//通讯录最多能容纳的联系人数。
void showmenu()
{
cout << "************************" << endl;
cout << "************************" << endl;
cout << "***** 1.添加联系人 *****" << endl;
cout << "***** 2.显示联系人 *****" << endl;
cout << "***** 3.删除联系人 *****" << endl;
cout << "***** 4.查找联系人 *****" << endl;
cout << "***** 5.修改联系人 *****" << endl;
cout << "***** 6.清空联系人 *****" << endl;
cout << "***** 0.退出通讯录 *****" << endl;
cout << "************************" << endl;
cout << "************************" << endl;
}
//联系人结构体
struct person
{
string m_name;//姓名
int m_sex;//1.男,2.女
int m_age;//年龄
string m_phone;
string m_addr;
};
struct addressbooks
{
struct person personarray[MAX];
int m_size;
};
void addperson(addressbooks*abs)
{
if (abs->m_size == MAX)
{
cout << "通讯录已满,无法添加." << endl;
return;
}
else
{
//添加具体联系人
//添加姓名
cout << "请输入该联系人的姓名" << endl;
string name;
cin >> name;
abs->personarray[abs->m_size].m_name = name;
//添加性别
cout << "请输入该联系人的性别:" << endl;
cout << "1----男,2----女" << endl;
int sex=0;
while (1)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personarray[abs->m_size].m_sex = sex;
break;
}
cout << "您的输入有误,请重新你输入" << endl;
}
//添加年龄
cout << "请输入一个年龄:" << endl;
int age;
while(1)
{
cin >> age;
if (age > 0 && age <= 100)
{
abs->personarray[abs->m_size].m_age = age;
break;
}
else
cout << "您输入的年龄有误请重新输入:" << endl;
}
//添加电话
cout << "请输入联系人的电话" << endl;
string phone;
cin >> phone;
abs->personarray[abs->m_size].m_phone = phone;
//添加地址
cout << "请输入联系人的地址:" << endl;
string addr;
cin >> addr;
abs->personarray[abs->m_size].m_addr = addr;
//更新通讯录
cout << "添加成功" << endl;
abs->m_size++;
system("pause");
system("cls");
}
}
void showperson(addressbooks*abs)
{
//判断通信录中人数是否为零,若为零告知记录为空,否则显示。
if (abs->m_size == 0)
{
cout << "当前记录为空" << endl;
}
else
{
for (int i = 0; i < abs->m_size; i++)
{
cout << "姓名:" << abs->personarray[i].m_name<<"\t";
cout << "性别:" << (abs->personarray[i].m_sex == 1 ? "男" : "女")<<"\t";
cout << "年龄:" << abs->personarray[i].m_age<<"\t";
cout << "电话号码:" << abs->personarray[i].m_phone<<"\t";
cout << "家庭住址:" << abs->personarray[i].m_addr << endl;
}
system("pause");
system("cls");
}
}
//检测联系人是否存在,如果存在找出联系人所在位置,不存在返回-1.
//参数一:通讯录;参数二,查找人姓名。
int isexist(addressbooks* abs, string name)
{
for (int i = 0; i < abs->m_size; i++)
{
if (abs->personarray[i].m_name == name)
{
return i;
break;
}
}
return -1;
};
//删除一个联系人,告知用户,已删除,查无此人;
void deleteperson(addressbooks* abs)
{
cout << "请输入一个您要删除的联系人" << endl;
string name;
cin >> name;
int ret = isexist(abs, name);
if (ret == -1)
{
cout << "查无此人 " << endl;
}
else//找到要删除的联系人,把该联系人之后的所有联系人前移,同时联系人数减一;
{
for (int i = ret; i < abs->m_size; i++)
{
abs->personarray[i] = abs->personarray[i + 1];
}
abs->m_size--;//更新一下通讯录中的人员数;
cout << "删除成功" << endl;
}
system("pause");
system("cls");
}
//查找一个联系人
void findperson(addressbooks* abs)
{
cout << "请输入一个您要查找的联系人姓名" << endl;
string name;
cin >> name;
int ret=isexist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else//找到此人
{
cout << "姓名:"<<abs->personarray[ret].m_name << "\t";
cout << "性别" << abs->personarray[ret].m_sex << "\t";
cout << "年龄"<<abs->personarray[ret].m_age << "\t";
cout << "电话"<<abs->personarray[ret].m_phone << "\t";
cout << "地址"<<abs->personarray[ret].m_addr << "\t";
}
system("pause");
system("cls");
}
//修改已有联系人
//首先查找一下是否有该联系人利用isexist()函数
void modifyperson(addressbooks* abs)
{
cout << "请输入一个您要修改的联系人的姓名:" << endl;
string name;
cin >> name;
int ret = isexist(abs, name);
if (ret == -1)
{
cout << "查无此人:" << endl;
}
else
{
cout << "请输入修改后该联系人的姓名" << endl;
string name;
cin >> name;
abs->personarray[ret].m_name = name;
//添加性别
cout << "请输入修改后该联系人的性别:" << endl;
cout << "1----男,2----女" << endl;
int sex = 0;
while (1)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personarray[ret].m_sex = sex;
break;
}
cout << "您的输入有误,请重新你输入" << endl;
}
//添加年龄
cout << "请输入修改后一个年龄:" << endl;
int age;
while (1)
{
cin >> age;
if (age > 0 && age <= 100)
{
abs->personarray[ret].m_age = age;
break;
}
else
cout << "您输入的年龄有误请重新输入:" << endl;
}
//添加电话
cout << "请输入修改后联系人的电话" << endl;
string phone;
cin >> phone;
abs->personarray[ret].m_phone = phone;
//添加地址
cout << "请输入修改后联系人的地址:" << endl;
string addr;
cin >> addr;
abs->personarray[ret].m_addr = addr;
cout << "修改成功" << endl;
system("pause");
system("cls");
}
}
//清空联系人
void cleanperson(addressbooks* abs)
{
cout << "成功清除所有联系人" << endl;
abs->m_size = 0;
system("pause");
system("cls");
}
int main()
{
addressbooks abs;
abs.m_size = 0;
int select = 0;
while (1)
{
showmenu();
cin >> select;
switch (select)
{
case 1:addperson(&abs);
break;// 1.添加联系人
case 2:
showperson(&abs);
break; //2.显示联系人
case 3:
deleteperson(&abs);
break; //3.删除联系人
case 4:
findperson(&abs);
break; //4.查找联系人
case 5:
modifyperson(&abs);
break;// 5.修改联系人
case 6:
cleanperson(&abs);
break;// 6.清空联系人
case 0:
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;// 0.退出通讯录
}
}
system("pause");
return 0;
}
|