思路:
1.主函数只创建结构体变量和最后验证。
2.另建一个选择函数,用switch根据输入的值选择模式。再将地址p传给各个模式函数。每个模块函数间互不影响。
缺点:
1.各个函数可分文件编写,更快。之后再写
2.此程序类似10086,要选择模式,很麻烦,有更好方法
3.无法返回上一单元
struct add //通讯录结构体
{
string name;
string tel;
string sex;
int age;
string address;
};
void add(struct add *p) //添加联系人的函数
{
int i = 0;
for (i = 0; i < 3; i++)
{
int select = 0;
cout << "输入1添加联系人\n" << "输入2退出\n" << endl;
cin >> select;
if (select == 1)
{
cout << "请输入要添加的联系人姓名" << endl;
cin >> p[i].name;
}
if (select == 2) //退出
{
break;
}
}
}
void display(struct add *p) //显示函数
{
for (int i = 0; i < 8; i++)
{
cout << "\n" << p[i].name << "\n" << endl;
}
}
void clean(struct add *p)
{
string test; //这里创建了一个空串,没有值。
for (int i = 0; i < 999; i++)
{
p[i].name = test; //将这个与结构体数组中的值互换,可看做初始化
}
p[0].name = "时间的话"; //验证是否将结构体数组初始化
}
void find(struct add *p) //查找与修改函数
{
string temp1;
cout << "请输入要查找的的联系人名字" << endl;
cin >> temp1;
for (int i = 0; i < 1000; i++)
{
int res = temp1.compare(p[i].name);
if (res == 0)
{
int select = 0;
cout << "输入1查看联系人信息 " << "输入2修改联系人信息" << endl;
cin >> select;
switch (select)
{
case 1: cout << "查找的 " << p[i].sex << " " <<
p[i].tel << " " << p[i].name << " " <<
p[i].age << endl;
break;
case 2:cout << "请输入要修改的联系人姓名 " << endl;
cin >> p[i].name;
}
}
}
}
void cut(struct add *p) //删除联系人的函数
{
string temp1;
cout << "请输入要删除的的联系人名字" << endl;
cin >> temp1; //因为cin不能直接输入字符串,所以用个临时变量
for(int i=0;i<1000;i++)
{
int res = temp1.compare(p[i].name); //字符串比较函数,标准格式A.compare(B),A和B比较大小,具体另搜
if (res == 0)
{
int j = i; //这里设置j是因为i已经确定为一个数了,如果用while会无限循环
//j = i的值是因为这里是删除指定名字的信息,并使后面的联系人信息递补,前面的
//联系人信息不需要改变。所以j为一个定值,使后面的递补不影响前面。
while (j < 999) // 因为数组总共只有1000个数,下标最大999.所以j不能为1000
{
p[j].name = p[j + 1].name; //删除制定联系人后,后面的联系人要递补上来,不能出现空白位置
j++;
}
}
}
}
void select(struct add *p) //选择模式的函数
{
int select = 0;
cout << "输入1 添加联系人\n" << "输入2 删除联系人\n" << "输入3 显示所有联系人\n" <<
"输入4 显示或修改指定联系人信息\n" << "输入5 清空所有联系人信息\n" <<
"输入6 退出通讯录管理系统\n" << endl;
cin >> select; //选择模式
switch (select)
{
case 1:add(p); //*p是数组的值(用.或->),所以p为地址,也是addlink的地址,传输到下一个函数中
break;
case 2:cut(p); //记得加break,否则一直向下运行
break;
case 3:display(p);
break;
case 4:find(p);
break;
case 5:clean(p);
break;
case 6:break;
}
}
int main()
{
struct add addlink[1000];
addlink[0].name = "黄鸡";
addlink[1].name = "白鸡";
addlink[1].tel = "13880328173";
addlink[1].sex = "母";
addlink[1].age = 2;
addlink[2].name = "红鸡";
addlink[3].name = "乌骨鸡";
select(addlink); // 这里传输的是数组的首地址,只用写一个就行,模式选择在另一个函数
for (int i = 0; i < 8; i++)
{
cout << "\n" << addlink[i].name << "\n" << endl; //验证各种模式的实施情况
}
system("pause");
return 0;
}