链接:
熟悉C++初级命令
代码:
// 1.添加联系人
//设计联系人结构体
//设计通讯录结构体
//main函数中创建通讯录
//封装添加联系人函数
//测试添加联系人功能
//2.显示联系人
//判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息
//3.删除联系人实现步骤:
//封装检测联系人是否存在
//封装删除联系人函数
//测试删除联系人功能
// //4.查找联系人
//实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。
//5.修改联系人
// 实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人
//查找要修改的
//覆盖
//5.清空联系人
//实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。
#include<iostream>
using namespace std;
#define max 100 //最大存放人数
struct person
{
string name;
int gender = 0;
int age = 0;
string Tell = " ";//电话设置成int类型会导致值溢出,从而导致程序运行出问题
string add;
};
struct addsbook
{
person personadd[max];
int size=0;//记录通讯录存放的人数
};
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;
}
void addperson(addsbook *abs)
{
//首先判断是否内存已经满了
if(abs->size==max)
{
cout << "内存已满,无法添加" << endl;
return;
}
else
{
string name;
cout << "请输入联系人姓名:" << endl;
cin >> name;
abs->personadd[abs->size].name = name; //abs处用“->”,person[]处用“.”
cout << "请输入联系人性别:1:男 2:女" << endl;//判断输入是否合规则
while (true)
{
int gender = 0;
cin >> gender;
if (gender == 1 || gender == 2)
{
abs->personadd[abs->size].gender = gender;
break;
}
else
{
cout << "输入错误,请重新输入" << endl;
}
}
int age = 0;
cout << "请输入联系人年龄:" << endl;
cin >> age;
abs->personadd[abs->size].age = age;
string CALL = " ";
cout << "请输入联系人电话:" << endl;
cin >> CALL;
abs->personadd[abs->size].Tell = CALL;
string add;
cout << "请输入联系人地址:" << endl;
cin >> add;
abs->personadd[abs->size].add = add;
abs->size++;
cout << "添加成功" << endl;
system("pause");
system("cls");//system("cls");的意思就是调用DOS下的清屏命令“cls”。
}
}
void showperson(addsbook* abs)
{
if (abs->size == 0)
{
cout << "通讯录为空" << endl;
return;
}
else
{
for (int i = 0; i < abs->size; i++)
{
cout << i + 1 << " 姓名:" << abs->personadd[i].name << "\t";
cout << " 电话:" << abs->personadd[i].Tell << "\t";
cout << " 性别:" << (abs->personadd[i].gender == 1 ? "男" : "女") << "\t";
cout << " 联系人年龄:" << abs->personadd[i].age << "\t";
cout << " 联系人地址:" << abs->personadd[i].add << "\t";
cout << endl;
}
}
cout << endl;
}
int isExist(addsbook * abs, string name) //封装检测联系人是否存在
{
for (int i = 0; i < abs->size; i++)
{
if (abs->personadd[i].name == name)
{
return i;
}
return -1;//这个地方不用加else 一旦if执行过,此子函数就会跳出
}
}
void deleperson(addsbook *abs)//封装删除联系人函数,在这个里面调用检测函数
{
string name = " ";
cout << "请输入要删除的联系人:" << endl;
cin >> name;
int i=isExist(abs, name);
if (i == -1)
{
cout << "此联系人不存在!" << endl;
return;
}
for (int j = i; j < abs->size; j++)
{
abs->personadd[j] = abs->personadd[j + 1];
}
cout << "删除成功" << endl;
abs->size--;
system("pause");
system("cls");
}
void findperson(addsbook* abs)//查找联系人
{
string name;
cout << "请输入要查找的联系人姓名:";
cin >> name;
int i = isExist(abs, name);
if (i!= -1)
{
cout << name << "的信息如下:" << endl;
cout << "姓名:" << abs->personadd[i].name << "\t电话" << abs->personadd[i].Tell << "\t性别:";
cout << (abs->personadd[i].gender == 1 ? "男" : "女") << "\t年龄:" << abs->personadd[i].age;
cout << "\t地址:" << abs->personadd[i].add << endl;
system("pause");
system("cls");
}
else cout << "此联系人不存在!" << endl;
system("pause");
system("cls");
}
void modifperson(addsbook* abs)//修改联系人
{
string name;
cout << "请输入要修改的联系人姓名" << endl;
cin >> name;
int i=isExist(abs, name);
if (i == -1)
{
cout << "此联系人不存在!" << endl;
return;
}
else
{
int gender = 0;//修改联系人
string name1;
cout << "请输入要修改的联系人姓名:" << endl;
cin >> name1;
abs->personadd[i].name = name1; //abs处用“->”,person[]处用“.”
cout << "请输入要修改的联系人性别:1:男 2:女" << endl;//判断输入是否合规则
cin >> gender;
while (true)
{
if (gender == 1 || gender == 2) //这里需要加一个循环,直到输入正确的值才停止
{
abs->personadd[i].gender = gender;
break;
}
else
{
cout << "输入错误,请重新输入" << endl;
}
}
int age = 0;
cout << "请输入要修改的联系人年龄:" << endl;
cin >> age;
abs->personadd[i].age = age;
string CALL = " ";
cout << "请输入要修改的联系人电话:" << endl;
cin >> CALL;
abs->personadd[i].Tell = CALL;
string add;
cout << "请输入要修改的联系人地址:" << endl;
cin >> add;
abs->personadd[i].add = add;
cout << "修改成功" << endl;
}
system("pause");
system("cls");
}
void cleanperson(addsbook* abs)
{
abs->size = 0; //只做逻辑上的清空
cout << "通讯录已清空" << endl;
system("pause");
system("cls");
}
int main()
{
addsbook abs;
abs.size = 0;
while(true)//用循环的作用,一直让其循环运行,但不是死循环,当select=0时,return 0,循环结束
{
showMenu();//调用菜单
int select=0;
cin >> select;
switch (select)
{
case 1:
addperson(&abs);//这里要用到&,只有数组(abs[])这种,直接用变量名可以表示地址
break;//1.添加联系人
case 2:
showperson(&abs);
break;//2.显示联系人
case 3:
deleperson(&abs);
break;//3.删除联系人
case 4:
findperson(&abs);
break;//4.查找联系人
case 5:
modifperson(&abs);
break;//5.修改联系人
case 6:
break;//6.清空联系人
case 0:
cout << "欢迎再次使用" << endl;
return 0;//代表退出代码所在函数
break;//0.退出通讯录
default:
break;
}
}
system("pause");
return 0;
}
Tips:
1. “return 0”:C++中使函数立即结束。
当函数中的最后一个语句已经完成执行时,该函数终止,程序返回到调用它的模块,并继续执行该函数调用语句之后的其他语句。但是,也有可能强制一个函数在其最后一个语句执行前返回到被调用的位置,这可以通过 return 语句完成。
2.while循环的使用
一直进行循环,不退出系统;
不是死循环,return 0时退出SWICH语句,也即main函数运行完毕;在void 类型函数中,直接用return不用return 0;
3.#include
include加上有什么用
不加的时候不是也可以定义字符串吗?
4.C++变量赋初值初值
1.对于全局变量和局部静态变量,如果没有初始化值,那么系统默认赋值为0。所以当这类变量的初始值要求为0,或者不关心初始值时,定义时不需要赋初值,这样可以提高效率。
2.对于局部变量,如果没有赋初值,那么默认为随机值,即什么值都有可能。 对于此类变量,如果其初值不重要,或者不会影响程序结果,比如在定义后,下一步就是对其进行输入等从其它渠道获取值的代码,那么可以不赋初值。
5.case语句
使用case语句时,如果下面语句除了break还有很多,运行时会报错。
解决方法:①一大段用 “{ }”括起来;②封装成子函数,然后调用;
###### 6.其余见代码标注