void del_man(linkman *p,char *q,int *r)//q指向sign整型数组
{
count i;
int n,k;
ofstream outfile;
outfile.open("linkman.txt",ios::out);
if(!outfile.is_open())
{
cout<<"打开失败"<<endl;
return;
}
cout<<"输入要删除的联系人姓名:";
char ch[10];//存储输入的姓名
cin>>ch;
n=com_name(p,ch);//n代表了联系人的编号
cout<<"要删除的联系人编号"<<n<<endl;
if(n>=0&&n<num)//姓名存在
{
k=0;
for(i=0;i<num;i++)
{
cout<<"r[i]值"<<r[i]<<"n值"<<n<<endl;
if(n!=r[i])//需要删除的数据不输出
{
outfile<<q[i]<<'\t'<<p[r[i]].name<<'\t'<<p[r[i]].tel_num<<'\t'<<p[r[i]].kind<<'\t'<<p[r[i]].e_mail;
k++;
}
cout<<"k值"<<k<<endl;
if(n!=r[i]&&k!=num-1)//k在这里代表的是行数,总共有num-1行,而不是最后一行的标号num-2
{
cout<<i<<" "<<k<<"输出回车"<<endl;
outfile<<'\n';
}
}
num-=1;//删除数据后的联系人数目
cout<<"删除后数据输出完成"<<endl;//这个时候再读一次数据,那么就没有之前要删除的数据了
outfile.close();//输出完毕,关闭文件
in_data(p,q);//重新读取应该要将原来数据全部清空,我这里没有清空数据,用人数num控制显示,其实后面还是有数据的
for(i=0;i<num;i++)//重新读取数据的时候,sign数组也要重新编号
r[i]=i;
cout<<"删除后的数据读取完成"<<endl;//此时就应该没有要删除的数据了
}
else
return;//姓名不存在直接返回
}
void add_man(linkman *p,char *q,int *r)
{
char ch[10];//存储新输入的姓名
int n;
cout<<num<<endl;
cout<<"欢迎来到添加联系人界面:"<<endl;
cout<<"姓名:";
cin>>ch;//输入需要添加的姓名
n=com_name(p,ch);//判断姓名是否已经存在
if(n>=0&&n<num)//姓名存在
{
cout<<endl<<"此姓名已经存在"<<endl;
return;//姓名存在,直接返回
}
else if(n==-1)//姓名不存在则执行以下的添加信息操作
{
strcpy(p[num].name,ch);//输入名字
cout<<"姓名首字母:";
cin>>q[num];//输入姓名首字母
r[num]=num;//添加联系人的编号
//漏掉了这一句,由于之前初始化的时候,sign数组初值全部为零,也就是代表文本中第一个联系人,刘中华
//在没有给联系人标号时,排序自然跟他没关系,输出的时候也输出不到他,按我的程序输出的时候,人数是对的
//但是,只是多输出了第一个人而已
//在添加成员的时候,也可能此标号位不为空,但是不形成影响,赋值的时候会覆盖掉
cout<<endl;
cout<<"手机号:";
cin>>p[num].tel_num;
cout<<endl;
cout<<"类别:";
cin>>p[num].kind;
cout<<endl;
cout<<"电子邮箱:";
cin>>p[num].e_mail;
r[num]=num;//添加联系人后还要添加联系人编号
cout<<endl<<"新增联系人成功";
num+=1;
in_turn(q,r);//添加联系人后排序,再显示
show_data(p,r);
cout<<"添加后的联系人数目"<<num<<endl;
return;
}
}这里只放上修改过的函数
这篇博客介绍了如何修复前一版本手机通讯录管理程序中存在的一些问题,包括删除和添加联系人功能的改进,确保数据正确输出并避免重复。通过示例代码展示了修改后的函数实现。
1022

被折叠的 条评论
为什么被折叠?



