通讯录
功能模块介绍
- 添加联系人
- 显示所有联系人
- 删除联系人
- 查看联系人
- 修改联系人
- 删除所有联系人
- 退出
模块详解
开始菜单
全部使用输出语句,在main()函数中调用,利用一个循环,在只有退出模块时,退出循环。
void showMenu() {
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;
}
通过switch语句拿到0-6,7种功能。
int main() {
int select = 0;
AddressBooks abs;
abs.m_Size = 0;
while (true) {
showMenu();
cin >> select;
switch (select) {
case 1:
addPerson(&abs);
break;
case 2:
showPerson(&abs);
break;
case 3:
deletePerson(&abs);
break;
case 4:
findPerson(&abs);
break;
case 5:
chagePerson(&abs);
break;
case 6:
cleanAllPerson(&abs);
break;
case 0:
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
}
}
system("pause");
return 0;
}
构建联系人结构体和通讯录结构体,联系人包括姓名、性别、年龄、电话和住址5个属性,而通讯录存放联系人数组和数组大小两个属性。
struct Person {
string m_Name;
int m_Sex;
int m_Age;
string m_Phone;
string m_Addr;
};
struct AddressBooks {
struct Person personArray[MAX];
int m_Size;
};
注:MAX是用来限定存储的大小的。在开头定义,方便修改,注意不要有分号结尾,不报错,但会导致无法使用。
#define MAX 1000
添加联系人
在联系人数组大小等于MAX值时,拒绝添加新的联系人 在添加时,利用数组大小作为新增联系人数组的下标,注要设置m_Size的初始值为0,且要在main()函数的循环体之外初始化,要不然会使下次的添加反复覆盖数组0的位置。
void addPerson(AddressBooks* abs) {
if (abs->m_Size == MAX) {
cout << "你的通讯录满了,请清除一部分再进行添加" << endl;
return ;
}
else {
string name;
cout << "请输入你要添加的联系人姓名:" << endl;
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
int sex =0;
cout << "请输入你要添加的联系人性别:" << endl;
cout << "1-----男" << endl;
cout << "2-----女" << endl;
while(true){
cin >> sex;
if (sex == 1 || sex == 2) {
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
cout << "你做出了错误的输入" << endl;
}
int age=0;
cout << "请输入你要添加的联系人年龄:" << endl;
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
string phone;
cout << "请输入你要添加的联系人电话:" << endl;
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
string address;
cout << "请输入你要添加的联系人住址:" << endl;
cin >> address;
abs->personArray[abs->m_Size].m_Addr = address;
abs->m_Size++;
cout << abs->m_Size << endl;
cout << "添加成功" << endl;
system("pause");
system("cls");
}
}
这两句是为了在每次选择结束后,可以按任意键退出,而由于菜单展示循环在main()函数中,显示会显得过于拥挤,则使用第二句,清屏命令,优化显示。
system("pause");
system("cls");
显示所有联系人
使用“\t”,这个符号表示换格,可以使显示更加规整。 通过下标i,作为联系人数组元素下标,而限制大小的正是m_Size属性。 在性别选择时,使用了三目运算符,将接收到的1和非1的联系人性别属性成功转换成我们需要的男女字符显示。
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 "
<<"性别:"<< (abs->personArray[i].m_Sex==1?"男":"女") << "\t"
<<"年龄:"<< abs->personArray[i].m_Age << "\t"
<<"电话:"<< abs->personArray[i].m_Phone << "\t"
<<"地址:"<< 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 (name == abs->personArray[i].m_Name) {
return i;
}
}
return -1;
}
删除联系人 通过键入联系人姓名去搜索是否存在,不存在则输出查无此人,存在则,拿到对应联系人在数组中的下标,通过for语句,使后一个联系人对应的属性覆盖掉搜索的联系人,达到删除目标联系人的目的。 注:在删除后要让数组的大小减1。即是m_Size–;
void deletePerson(AddressBooks* abs) {
string name;
cout << "请输入你想删除的联系人姓名:" << endl;
cin >> name;
int res = isExist(abs, name);
if ( res == -1) {
cout << "查无此人" << endl;
}
else {
for (int i = res; 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) {
string name;
cout << "请输入你想查找的联系人姓名:" << endl;
cin >> name;
int res = isExist(abs, name);
if (res == -1) {
cout << "查无此人" << endl;
}
else {
cout << "查找成功" << endl;
cout << "姓名:" << abs->personArray[res].m_Name << "\t "
<< "性别:" << (abs->personArray[res].m_Sex == 1 ? "男" : "女") << "\t"
<< "年龄:" << abs->personArray[res].m_Age << "\t"
<< "电话:" << abs->personArray[res].m_Phone << "\t"
<< "地址:" << abs->personArray[res].m_Addr
<< endl;
}
system("pause");
system("cls");
}
修改联系人
void chagePerson(AddressBooks* abs) {
string name;
cout << "请输入你要修改的联系人姓名:" << endl;
cin >> name;
int res = isExist(abs, name);
if (res == -1) {
cout << "查无此人" << endl;
}
else {
cout << "姓名:" << abs->personArray[res].m_Name << "\t "
<< "性别:" << (abs->personArray[res].m_Sex == 1 ? "男" : "女") << "\t"
<< "年龄:" << abs->personArray[res].m_Age << "\t"
<< "电话:" << abs->personArray[res].m_Phone << "\t"
<< "地址:" << abs->personArray[res].m_Addr
<< endl;
cout << "请输入你要修改的信息" << endl;
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->personArray[res].m_Name = name;
int sex = 0;
cout << "请输入性别:" << endl;
cout << "1-----男" << endl;
cout << "2-----女" << endl;
while (true) {
cin >> sex;
if (sex == 1 || sex == 2) {
abs->personArray[res].m_Sex = sex;
break;
}
cout << "你做出了错误的输入" << endl;
}
int age = 0;
cout << "请输入年龄:" << endl;
cin >> age;
abs->personArray[res].m_Age = age;
string phone;
cout << "请输入你要添加的联系人电话:" << endl;
cin >> phone;
abs->personArray[res].m_Phone = phone;
string address;
cout << "请输入你要添加的联系人住址:" << endl;
cin >> address;
abs->personArray[res].m_Addr = address;
cout << "修改成功" << endl;
}
system("pause");
system("cls");
}
清空联系人
清除联系人只需要把记录的联系人数组大小置0,则存储的数据会被放空 由于删除所有联系人是一个危险操作,可以多加一层判断,让用户不会误删 而如果本身没有数据也是不需要删除的。
void cleanAllPerson(AddressBooks* abs) {
if (abs->m_Size == 0) {
cout << "你还没有一个联系人,不需要删除" << endl;
}
else {
cout << "你确定要删除所有联系人" << endl;
cout << "1----是" << endl;
cout << "0----否" << endl;
int result = 0;
while (true) {
cin >> result;
if (result == 0 || result == 1) {
if (result == 1) {
abs->m_Size = 0;
cout << "通讯录已清空" << endl;
}
else {
cout << "已取消删除所有联系人的操作" << endl;
}
break;
}
cout << "输入错误,请重新输入" << endl;
}
}
system("pause");
system("cls");
}
退出
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
return 0 ;在int main()函数中代表退出程序。
以上的案例来自黑马程序员的72-83
【黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难】 https://www.bilibili.com/video/BV1et411b73Z?p=84&share_source=copy_web&vd_source=98423c363588c43da402e3c4b917687e
做了一些细小部分的添加。
|