4.11 4.12
入门简单案例,实现一个通讯录系统,包括以下几种功能
1、添加联系人
2、显示联系人
3、删除联系人
4、查找联系人
5、修改联系人
6、清空通讯录
0、退出通讯录
#include<iostream>
#define Max 1000
using namespace std;
//创建联系人结构体
struct person
{
string p_name;
int p_sex;//1—男 2—女
string p_tel;
string p_addr;
int p_age;
};
//创建通讯录结构体
struct addressBooks
{
person arry[Max];
int p_size;
};
//显示菜单函数
void showMenu()
{
cout << "*****1、添加联系人*****" << endl;
cout << "*****2、显示联系人*****" << endl;
cout << "*****3、删除联系人*****" << endl;
cout << "*****4、查找联系人*****" << endl;
cout << "*****5、修改联系人*****" << endl;
cout << "*****6、清空通讯录*****" << endl;
cout << "*****0、推出通讯录*****" << endl;
}
//1添加联系人
void addperson(addressBooks* abs)
{
abs->p_size++;
//姓名
cout << "姓名:" << endl;
string name;
cin >> name;
abs->arry[abs->p_size].p_name = name;
//性别
cout << "性别:" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->arry[abs->p_size].p_sex = sex;
break;
}
else
{
cout << "输入错误请再次输入:" << endl;
}
}
//年龄
cout << "年龄:" << endl;
int age;
cin >> age;
abs->arry[abs->p_size].p_age = age;
//电话
cout << "电话:" << endl;
string tel;
cin >> tel;
abs->arry[abs->p_size].p_tel = tel;
//住址
cout << "住址:" << endl;
string addr;
cin >> addr;
abs->arry[abs->p_size].p_addr = addr;
system("pause");
system("cls");
}
//2、显示联系人
void showPerson(addressBooks* abs)
{
if (abs->p_size == 0)
{
cout << "联系人为空" << endl;
}
else {
for (int i = 1; i <= abs->p_size; i++)
{
cout << "姓名:" << abs->arry[i].p_name << "\t";
cout << "性别:" << ((abs->arry[i].p_sex == 1) ? "男" : "女") << "\t";
cout << "年龄:" << abs->arry[i].p_age << "\t";
cout << "电话:" << abs->arry[i].p_tel << "\t";
cout << "住址:" << abs->arry[i].p_addr << "\t";
cout << endl;
}
}
system("pause");
system("cls");
}
//查找联系人
int searchPerson(addressBooks* abs)
{
//如果通讯录没人
if (abs->p_size == 0)
{
cout << "联系人为空" << endl;
return 0;
}
//通讯录有人,开始查找
else
{
cout << "请输入姓名:" << endl;
string name;
cin >> name;
for (int i = 1; i <= abs->p_size; i++)
{
if (abs->arry[i].p_name == name)
{
return i;
break;//找到了,把序号返回—返回的序号一定不为零
}
}
cout << "查无此人" << endl;//找不到
return 0;
}
}
//3、删除联系人—根据姓名
void deletePerson(addressBooks* abs)
{
int i=searchPerson(abs);
//if (i == abs->p_size && i!=1)
//{
// for (int j = i; j==0; j--)
// {
// abs->arry[j].p_name = abs->arry[j - 1].p_name;
// abs->arry[j].p_age = abs->arry[j - 1].p_age;
// abs->arry[j].p_addr = abs->arry[j - 1].p_addr;
// abs->arry[j].p_sex = abs->arry[j - 1].p_sex;
// abs->arry[j].p_tel = abs->arry[j - 1].p_tel;
// }
// abs->p_size--;
// cout << "删除成功" << endl;
//}
if (i != 0)//查到人了
{
for (int j = i; j <= abs->p_size; j++)//******bug?????*****
{
abs->arry[j].p_name = abs->arry[j + 1].p_name;
abs->arry[j].p_age = abs->arry[j + 1].p_age;
abs->arry[j].p_addr = abs->arry[j + 1].p_addr;
abs->arry[j].p_sex = abs->arry[j + 1].p_sex;
abs->arry[j].p_tel = abs->arry[j + 1].p_tel;
}
abs->p_size--;
cout << "删除成功" << endl;
}
system("pause");
system("cls");
}
//4、查找联系人
void findPerson(addressBooks* abs)
{
int i = searchPerson(abs);
if (i != 0)//查到人了
{
cout << "姓名:" << abs->arry[i].p_name << "\t";
cout << "性别:" << ((abs->arry[i].p_sex == 1) ? "男" : "女") << "\t";
cout << "年龄:" << abs->arry[i].p_age << "\t";
cout << "电话:" << abs->arry[i].p_tel << "\t";
cout << "住址:" << abs->arry[i].p_addr << "\t";
cout << endl;
}
system("pause");
system("cls");
}
//5、修改联系人
void modifyPerson(addressBooks* abs)
{
int i = searchPerson(abs);//*********同上处为何不传地址
if (i != 0)
{
cout << "姓名:" << endl;
string name;
cin >> name;
abs->arry[i].p_name = name;
cout << "性别:" << endl;
int sex;
cin >> sex;
abs->arry[i].p_sex = sex;
cout << "年龄:" << endl;
int age;
cin >> age;
abs->arry[i].p_age = age;
cout << "电话:" << endl;
string tel;
cin >> tel;
abs->arry[i].p_tel = tel;
cout << "住址:" << endl;
string addr;
cin >> addr;
abs->arry[i].p_addr = addr;
}
system("pause");
system("cls");
}
//6、清空通讯录
void clearBooks(addressBooks* abs)
{
abs->p_size = 0;
system("pause");
system("cls");
}
int main()
{
//创建通讯录
addressBooks abs;
abs.p_size = 0;
while (true)
{ //显示菜单函数
showMenu();
int select;
cout << "请选择项目:" << endl;
cin >> select;
switch (select)
{
case 1:
//1、添加联系人
addperson(&abs);
break;
case 2:
//2、显示联系人
showPerson(&abs);
break;
case 3:
{
//查找联系人
//int i = searchPerson(&abs);
//if (i != 0)
//{
// cout << "找到了" << endl;
//}
//3、删除联系人
deletePerson(&abs);
break;
}
case 4:
//4、查找联系人
findPerson(&abs);
break;
case 5:
//5、修改通讯录
modifyPerson(&abs);
break;
case 6:
//6、清空通讯录
clearBooks(&abs);
break;
case 0:
//0、退出通讯录
cout << "通讯录已退出,欢迎下次登陆" << endl;
system("pause");
return 0;
break;
}
}
}
遗留问题 1
关于地址的创建,3、删除联系人函数体中,本人认为删除最后一个联系人时按照所示代码逻辑不存在最后一个联系人的后一位联系人,但是依然可以删除,问题是否表现为一个结构体创建后分配的地址空间不止于仅有的结构体个数所对应的地址空间的个数,即如果仅有两个联系人,结构体仍然存在第二位联系人后的地址空间,那么在删除第二个联系人时,依然可以采取逻辑删除将第二个联系人的信息用后一个地址空间覆盖
遗留问题 2
关于函数体嵌套函数体,如上在删除、修改、查找联系人函数体中,嵌套的查找联系人函数为何不传递地址,而是直接传递结构体???