内容纲要
通讯录管理系统功能要求
菜单功能
清空联系人的方法
将当前联系人的数量清为0,做一个逻辑上的清空,让别的函数访问不了即可。
- 代码如下,该部分代码属于我提前实现好基本功能,再根据黑马c++的视频优化的。
#include <iostream>
#include "string"
#define MAX 3 //最大人数
using namespace std;
struct ContactsMember {
//int index;
string name;
int sex; //1.男 2.女
int age;
string cellPhone;
string location;
};
void printMenu() {
cout << "********************************" << endl
<< "****** 1、添加联系人 *******" << endl
<< "****** 2、显示联系人 *******" << endl
<< "****** 3、删除联系人 *******" << endl
<< "****** 4、查找联系人 *******" << endl
<< "****** 5、修改联系人 *******" << endl
<< "****** 6、清空联系人 *******" << endl
<< "****** 0、退出通讯录 *******" << endl
<< "********************************" << endl;
}
void addContacts(ContactsMember newContacts[],int arrLength,int * count) {
//判断联系人是否超标
if (*count == arrLength)
{
cout << "联系人达到最大个数!!不能再添加了" << endl;
return;
}
//创建一个新的临时变量
ContactsMember temp;
cout << "请输入添加的联系人姓名:" << endl;
cin >> temp.name;
cout << "请输入添加的联系人性别:" << endl;
cout << "1 ---- 男" << endl;
cout << "2 ---- 女" << endl;
for (;;) //判断性别是否正确
{
cin >> temp.sex;
if (temp.sex == 1 || temp.sex == 2)
{
break;
}
cout << "请输入正确的性别!!" << endl;
}
cout << "请输入添加的联系人年龄:" << endl;
while (true) //判断年龄
{
cin >> temp.age;
if (temp.age < 130 && temp.age >= 0)
{
break;
}cout << "请输入正确的年龄!!" << endl;
}
cout << "请输入添加的联系人电话:" << endl;
cin >> temp.cellPhone;
cout << "请输入添加的联系人住址:" << endl;
cin >> temp.location;
newContacts[*count] = temp;
//size_t i = 0;
//for (; i < arrLength; i++)
//{
// if ( newContacts[i].cellPhone == "") //和空字符串相比判断该位置是否已存放联系人。
// {
// newContacts[i] = temp;
// break; //这个break 语句可以跳出for 循环。
// }
//}
*count += 1;
cout << "添加成功!当前联系人个数: " << *count << endl;
}
void showContacts(ContactsMember newContacts[], int count)
{
if (count == 0)
{
cout << "当前通讯录中为空!!" << endl;
return;
}
for (size_t i = 0; i < count; i++)
{
cout << "姓名:" << newContacts[i].name
<< "\t性别:" << (newContacts[i].sex == 1 ? "男":"女")
<< "\t年龄:" << newContacts[i].age
<< "\t电话:" << newContacts[i].cellPhone
<< "\t家庭住址:" << newContacts[i].location << endl;
}
}
//这里使用静态数组,其实用动态数组更好。但是没操作经验。没办法。
void deletContacts(ContactsMember newContacts[], int length, int * count)
{
string deletNumber;
cout << "请输入要删除的联系人手机号:" << endl;
cin >> deletNumber;
bool judge = false;
for (size_t i = 0; i < length; i++)
{
if (newContacts[i].cellPhone == deletNumber) {
judge = true;
for (size_t j = i; j < length - 1; j++)
{
newContacts[j] = newContacts[j + 1]; //这样删除后,不用担心数组空位。
}
*count -= 1;
}
}
cout << (judge ? "删除成功" : "删除失败") << endl;
}
void findContacts(ContactsMember newContacts[],int count)
{
string findObject;
cout << "请输入要查找的姓名:" << endl;
cin >> findObject;
bool judge = false;//判断是否找到过
for (size_t i = 0; i < count; i++)
{
if (newContacts[i].name == findObject) {
judge = true;
string showSex;
if (newContacts[i].sex == 1)
{
showSex = "男";
}
else
{
showSex = "女";
}
cout << "姓名:" << newContacts[i].name
<< "\t性别:" << showSex
<< "\t年龄:" << newContacts[i].age
<< "\t电话:" << newContacts[i].cellPhone
<< "\t家庭住址:" << newContacts[i].location << endl;
}
}
if (!judge)
{
cout << "查无此人!!" << endl;
}
}
void modifyContacts(ContactsMember newContacts[], int length)
{
string modifyNumber;
cout << "请输入需要对象修改的电话:" << endl;
cin >> modifyNumber;
for (size_t i = 0; i < length; i++)
{
if (newContacts[i].cellPhone == modifyNumber) {
cout << "请输入修改的联系人姓名:" << endl;
cin >> newContacts[i].name;
cout << "请输入修改的联系人性别:" << endl;
cin >> newContacts[i].sex;
cout << "请输入修改的联系人年龄:" << endl;
cin >> newContacts[i].age;
cout << "请输入修改的联系人电话:" << endl;
cin >> newContacts[i].cellPhone;
cout << "请输入修改的联系人住址:" << endl;
cin >> newContacts[i].location;
}
}
}
//void cleanAll(ContactsMember newContacts[], int length)
//{
// //这里用的静态数组(不是new 出来的) 不用管,系统会自己回收置空的内存。
// //newContacts = "";
// cout << "清空对象函数调用" << endl;
// memset(newContacts, '\0', sizeof(newContacts));
//}
void main() {
printMenu(); //显示菜单
int count = 0;
//创建结构体变量
ContactsMember newContacts[MAX]; //先创建一个数组长度为1 的通讯录联系人结构体数组。
int length = sizeof(newContacts) / sizeof(newContacts[0]);
//后期再在函数中扩容数组。
while (true)
{
int checkNum; //定义一个数来监听键盘输入
cin >> checkNum;
switch (checkNum) //循环语句,判断输入的数来执行相关函数。
{
case 1:
addContacts(newContacts,length,&count);
break;
case 2 :
showContacts(newContacts,count);
cout << "总共联系人个数为:" << count << endl;
break;
case 3 :
deletContacts(newContacts,length,&count);
break;
case 4 :
findContacts(newContacts,count);
break;
case 5 :
modifyContacts(newContacts, length);
case 6 :
//cleanAll(newContacts,length);
count = 0;
break;
case 0 :
return;
default:
cout << "你输入的有误,重新输入数字!" << endl;
break;
}
system("pause");
system("cls");
printMenu();
}
}
删除部分可以用 isExitst() 函数来判断是否存在。
-
注意事项。指针中 count++; 和 count += 1;是不一样的。
-
system("cls");
可以清屏。 -
性别判断中
string showSex; if (newContacts[i].sex == 1) { showSex = "男"; } else { showSex = "女"; } cout << "姓名:" << newContacts[i].name << "\t性别:" << showSex << "\t年龄:" << newContacts[i].age << "\t电话:" << newContacts[i].cellPhone << "\t家庭住址:" << newContacts[i].location << endl;
用if 来判断实在是太麻烦。。不如直接用三元运算符。
cout << "姓名:" << newContacts[i].name << "\t性别:" << (newContacts[i].sex == 1 ? "男":"女") << "\t年龄:" << newContacts[i].age << "\t电话:" << newContacts[i].cellPhone << "\t家庭住址:" << newContacts[i].location << endl;
-
case语句中,如果代码过长,编译器可能会报错,此时需要加 { } 花括号囊括该段代码。
-
这里的删除方法,通过数组后方的数据前移,就完成了数据的删除。(我认为还可以通过count 索引把数组最后的数覆盖到删除对象上)
-
清空联系人可以逻辑清空,不需要处理数组。这个思路绝了。。。。