用C++实现一个简单的通讯录

    有了一定的C基础之后,目前正在学习C++,今天尝试用面向对象的思想编写了一个简单的通讯录(之前在C的练习中做过类似的项目)

通过不停的敲代码,出现问题也解决问题的过程中也稍微总结了一下新的知识。


遇到的第一个问题即是,我自定义了一个Person类用来存放每个联系人的信息,然而在创建了一个容器vector<Person>V(0)后,

查阅了一下其他大神博客中写的demo,发现都是用存放基本类型int来举例子,初始化直接用V.push_back(int)就可以,但是自定义的类中,私有成员不止一个,但是这个函数我在用的过程中发现能且只能传一个参数,也就是只能初始化一个私有成员,其他私有成员只能通过默认构造函数初始化,其他的私有成员只能通过赋值的方式再去重新写入。


第二个问题,再用vector<Person>::iterator iter 迭代器遍历的时候,如果要删除某个元素,或者用Vector.push_back()插入一个元素的时候,迭代器就会失效。这时候如果不重置迭代器,iter会相当于一个野指针,编译器也会报类似的错误。


下面贴上我写的代码:

#include <iostream>
#include <vector>
#include <map>
#include "addr_book.h"


using namespace std;




int main()
{
    Tool T;
T.enter_menu();


vector<Person>V(0);
//map<int,Person>M;
//map<int,Person>::iterator it;


    int n;
int count;
char name[20];
int tel;
//Person P;

while(1)

   count = 0;
memset(name,0,sizeof(name));
   cout << "请输入操作命令:";
   cin >> n;
 
   switch (n)
        {
       case 1:
   {
   cout << "请输入联系人姓名:";
   cin >> name;
   cout << "请输入联系人电话:";
   cin >> tel;
   V.push_back(name);
                (V.back()).Tel(tel);

break;
   }


case 2:
{
   if(V.capacity() == 0)
{
   cout << "未录入联系人!" << endl;
break;
}
cout << "请输入查找的联系人姓名:";
                cin >> name;
   
for(vector<Person>::iterator it = V.begin(); it != V.end();++it)
{
   count = ((*it).Compare(name,count));
}
   if(count == 0)
{
   cout << "查无此人!" << endl;
}

                break;
}


case 3:
{
   if(V.capacity() == 0)
{
   cout << "未录入联系人!" << endl;
break;
}


   for(vector<Person>::iterator it = V.begin(); it != V.end(); ++it)
{
   (*it).Display();
}

break;
}


case 4:
{
   if(V.capacity() == 0)
{
   cout << "未录入联系人!" << endl;
break;
}
cout << "请输入要修改的联系人姓名:";
cin >> name;
for(vector<Person>::iterator it = V.begin(); it != V.end();++it)
                {
   count = ((*it).Update(name,count));
}

   if(count == 0)
{
   cout << "查无此人!" << endl;
}
   break;
            }
            
            case 5:
{
   if(V.capacity() == 0)
{
   cout << "未录入联系人!" << endl;
break;
}

cout << "请输入要删除的联系人姓名:";
cin >> name;

for(vector<Person>::iterator it = V.begin(); it != V.end();++it)
                {
   int i = ((*it).Delete(name));
if(i == 0)
{
   V.erase(it);
cout << "删除成功!" << endl;
count++;
break;
}
}


if(count == 0)
{
   cout << "查无此人!" << endl;
}

            break;  
}
            
case 6:
{
   return 0;
}


case 0:
{
   T.enter_menu();
break;
}


default:
{   
   cout << "输入有误,请重输!" << endl;
   break;
}
   }
}


    return 0;
}








#ifndef _ADDR_BOOK_H
#define _ADDR_BOOK_H
#include <vector>
class Person
{
public:
    Person();
Person(char *name);
Person(int tel);
Person(int tel,char *name);
Person(char *name,int tel);
void Tel(int tel);
void Display();
~Person();
int Compare(char *name,int count);
int Update(char *name,int count);
int Delete(char *name);
//friend void search(char *name,vector<Person> V);
private:
    char name_[20];
int tel_;
};


class Tool
{
public:
    Tool();
~Tool();
void enter_menu();
private:
};


#endif










#include <iostream>
#include <vector>
#include <string.h>
#include "addr_book.h"


using namespace std;


#include <string.h>


Person::Person()
{
    *name_ = '\0';
tel_ = 0;
}


Person::Person(int tel)
{
    tel_ = tel;
}


Person::Person(char *name)
{
    //name_ = name;
strcpy(name_,name);
}


Person::Person(int tel, char *name)
{
    tel_ = tel;
//name_ = name;


}


Person::Person(char *name,int tel)
{
    tel_ = tel;
//name_ = name;
strcpy(name_,name);
}


void Person::Tel(int tel)
{
    tel_ = tel;
}


void Person::Display()
{
    cout << name_ << "    " << tel_ << endl;
}


Person::~Person()
{
}


int Person::Compare(char *name,int count)
{
    if(strcmp(name,name_) == 0)
{
   Display();
count++;
}


else
{
   return count;
}
}


int Person::Update(char *name,int count)
{
    if(strcmp(name,name_) == 0)
{
   Display();
cout <<"请输入修改后的姓名:";
cin >> name_;
cout << "请输入修改后的手机号码:";
cin >>tel_;
count++;
}
    else
{
   return count;
}
}


int Person::Delete(char *name)
{
    if(strcmp(name,name_) == 0)
{
   return 0;
}
return -1;
}


/*****************************华美的分割线***********************/


/*void search(char *name,vector<Person> V)
{
    int count = 0;
for(vector<Person>::iterator it = V.begin(); it != V.end; ++it)
{
   if(strcmp(name,(*it).name_) == 0)
{
   (*it).Display;
count++;
}
}
if(count == 0)
{
   cout << "查无此人" <<endl;
}
}*/


/*****************************华美的分割线***********************/


Tool::Tool()
{
}


Tool::~Tool()
{
}


void Tool::enter_menu()
{
    cout << endl;
cout << ("        *******欢迎使用通讯录*******") << endl;
cout << ("        *                                      *") << endl;
cout << ("        *1.          添加联系人信息            *") << endl;
cout << ("        *2.          查找联系人信息            *") << endl;
cout << ("        *3.          显示联系人信息            *") << endl;
cout << ("        *4.          修改联系人信息            *") << endl;
cout << ("        *5.          删除联系人信息            *") << endl;
cout << ("        *6.               退出                 *") << endl;
cout << ("        *7.                                    *") << endl;
cout << ("        *8.          按0呼出主菜单             *") << endl;
cout << ("        *********************") << endl;
cout << endl;
}




  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值