0


C++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能)

这里写自定义目录标题

完整源代码及文件在资源链接:
C++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能) 下载后可直接运行使用

分析

1.需求分析

需求分析
1、具有联系人基本信息的添加、修改、删除、显示信息和查询功能的通讯录管理系统。
2、联系人数据:姓名,性别,索引、电话号码和QQ账号,电子邮件。
3、可对记录中的姓名和电话号码和QQ账号进行修改。
4、可增加和删除联系人。
5、可显示所有的联系人信息。
6、可按人名或电话号码进行查询联系人基本信息或联系人是否存在。

2.设计

1.添加联系人。
2.查询联系人
3.修改联系人
4.删除联系人
5.显示联系人基本信息
6.保存联系人基本信息到文件

3.抽象类型定义

//*创建Info类*classInfo{public:Info();//构造函数friendclassAddressBook;//声明AddressBook类为其友元类#ifdef_VC2010_VER_friend ofstream &operator<<(ofstream &,const Info &);//运算符 << 重载friend ifstream &operator>>(ifstream &, Info &);//运算符 >> 重载#endifprivate:// 禁用拷贝Info(const Info &);const Info &operator=(const Info &);//定义成员变量char name[20];// 姓名char gender[5];// 性别char phone[50];// 电话号码char qq[20];// qq号码char email[50];// 电子邮件int index;// 索引值
    Info * next;};

通讯录管理系统功能介绍

在这里插入图片描述

1.添加联系人

利用链表存储数据,以链式存储结构存储通讯录数据。
使用链表存储数据,方便删除和修改,提高了代码灵活性

voidAddressBook::Add()//*添加数据*{
    cout <<"请输入联系人信息: "<<endl;        
    Info * temp =new Info;// 实际开发中这里要捕获异常:内存申请失败
    cout <<"姓名( 1 ~ "<<sizeof(temp->name)-1<<" 字符): "<< ends;
    cin >> temp->name;

    cout <<"性别(  男   女 ): "<< ends;
    cin >> temp->gender;
        
    cout <<"电话( 1 ~ "<<sizeof(temp->phone)-1<<" 字符): "<< ends;
    cin >> temp->phone;

    cout <<"QQ( 1 ~ "<<sizeof(temp->qq)-1<<" 字符): "<< ends;
    cin >> temp->qq;
        
    cout <<"email( 0 ~ "<<sizeof(temp->email)-1<<" 字符): "<< ends;
    cin >> temp->email;AddBase(temp);}

2.查询联系人

输入基本信息后进入文件函数中,打开并读取文件,从而查询联系人

voidAddressBook::Query()//*查询联系人(按姓名或电话号)*{
    cout <<"   请选择查询方式    "<< endl;
    cout <<"   0. 按名字         "<< endl;
    cout <<"   1. 电话           "<< endl;int choose =0;
    cin >> choose;//输入查找方式char str[50]={0};switch(choose){case0:
        cout <<"请输入名字: "<< ends;
        cin >> str;break;case1:
        cout <<"请输入电话: "<< ends;
        cin >> str;break;default: 
        cout <<"没有该选项"<< endl;return;}
    Info * result = head;//输出表头信息ShowInfoTitle();int index =0;do{//查找
        result =QueryBase(result, choose, str);// 显示查询到的项if(result!=NULL){
            result->index = index;ShowInfo(result);
            index++;    
            result = result->next;}}while(result !=NULL);}

3.修改联系人

输入要修改的联系人基本信息,查找是否存在后,进行修改(此处的修改是利用DelBase(index)函数删除原有的,利用Add()函数添加新的联系人),这就是使用链表的好处。

voidAddressBook::Modify()//*修改联系人信息*{
    cout <<"请选择要修改的联系人(输入序号): "<< endl;//输出所有信息int count =ShowAllInfo();int index =0;
    cin >> index;//判断输入的序号是否存在if(index <0|| index >= count){
        cout <<"选择无效, 没有该序号的联系人"<< endl;return;}//删除DelBase(index);//添加Add();//完成修改}

4.删除联系人

先判断联系人是否存在,若存在,利用DelBase(index);进行链表的删除操作

voidAddressBook::Del()//*删除联系人*{
    cout <<"请选择要删除的联系人(输入序号): "<< endl;//输出所有的信息int count =ShowAllInfo();int index =0;//输入序号
    cin >> index;//判断序号是否存在if(index <0|| index >= count){
        cout <<"选择无效, 没有该序号的联系人"<< endl;return;}//存在则删除DelBase(index);}

5.显示所有联系人

voidAddressBook::ShowAll()//*输出所有信息*{ShowAllInfo();}

6.保存到文件

将通讯录中的数据保存在data.txt文件中
1.可读取
2.可写入

voidAddressBook::Load()//*读取文件中的数据*{//文件目录当前目录下的data.txt
    ifstream ifile(".\\data.txt");//如果没有文件则,打印:"打开文件失败"if(!ifile){
        cout <<"打开文件失败"<< endl;return;}//文件存在读取出来while(!ifile.eof()){
        Info * temp =new Info;#ifdef_VC2010_VER_
        ifile >>*temp;#else
        ifile >> temp->name    >> temp->gender    >> temp->phone >> temp->qq    >> temp->email;#endif//加入到链表中if(ifile){AddBase(temp);}}//关闭流
    ifile.close();}voidAddressBook::Save()//*将数据保存到文件*{//将文件保存到
    ofstream ofile(".\\data.txt", ios::trunc);if(!ofile){
        cout <<"保存失败"<< endl;return;}
    Info * temp = head;//写入while(temp !=NULL){#ifdef_VC2010_VER_
        ofile <<* temp<<endl;#else
        ofile << temp->name <<" "<< temp->gender <<" "<< temp->phone <<" "<< temp->qq <<" "<< temp->email <<" "<< endl;#endif
        temp = temp->next;}
    ofile.close();}

0.退出系统

其他副函数

1.按照序号删除

进行链表的删除操作。

voidAddressBook::DelBase(int index)//*按序号删除*{
    Info * temp = head;
    Info ** parent =&head;while(temp !=NULL){if(temp->index == index){*parent = temp->next;delete temp;return;}
        parent =&temp->next;
        temp = temp->next;}}

2.输出联系人信息

voidAddressBook::ShowInfoTitle()//*输出联系人信息*{
    cout <<"序号          姓名          性别          电话          QQ            email"<< endl;}voidAddressBook::ShowInfo(const Info * pInfo){
    cout <<setiosflags(ios::left)// 输出左对齐<<setw(14)<< pInfo->index
     <<setw(14)<< pInfo->name 
    <<setw(14)<< pInfo->gender
     <<setw(14)<< pInfo->phone
     <<setw(14)<< pInfo->qq
     <<setw(14)<< pInfo->email << endl;}

3.输出序号

intAddressBook::ShowAllInfo()//*输出序号*{int index =0;
    Info * temp = head;ShowInfoTitle();while(temp){
        temp->index = index;
        index++;ShowInfo(temp);
        temp = temp->next;}return index;}

4.主菜单函数

intmenu()//主菜单函数{system("cls");//清屏
    cout<<"        ****************************************************************"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                    欢迎登录通讯录管理系统                    |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        ****************************************************************"<<endl;
    cout<<"        |                      ☆1 . 添加联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆2 . 查询联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆3 . 修改联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆4 . 删除联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆5 . 显示所有联系人                    |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆6 . 保存到文件                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆0 . 退出系统                          |"<<endl;
    cout<<"        ****************************************************************"<<endl;int m =0;do{
        cout <<"请输入选项0-8\n";
        cin >> m;}while( m <0|| m >8);return m;}

main函数

/* run this program using the console pauser or add your own getch, system("pause") or input loop *///*通讯录管理系统*#include"addressmain.h"//*主函数*intmain(){int m =0;
    AddressBook book;
    book.Load();do{
        m =menu();switch(m){case0:exit();//退出break;case1:
                book.Add();break;case2:
                book.Query();break;case3:
                book.Modify();break;case4:
                book.Del();break;case5:
                book.ShowAll();break;case6:
                book.Save();break;default:
                cout <<"暂不支持该选项\n"<< endl;}

        cout <<"回车继续..."<< endl;getch();}while(m >0);
    book.Save();return0;}voidexit();//*退出函数,用来退出通讯录管理系统*intmenu();//*主菜单函数,用于输出通讯录界面*//#endif

end

完整源代码及文件在资源链接: C++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能)
下载后可直接运行使用

完整方法代码

//*Info类*Info::Info()//构造函数{//初始化memset(name,0,sizeof(name));memset(gender,0,sizeof(gender));memset(phone,0,sizeof(phone));memset(qq,0,sizeof(qq));memset(email,0,sizeof(email));
        index =0;
        next =NULL;}#ifdef_VC2010_VER_
ofstream &operator<<(ofstream & ofs,const Info & c)//运算符 << 重载{
    ofs << c.name <<" "<< c.gender <<" "<< c.phone <<" "<< c.qq <<" "<< c.email <<" ";return ofs;}

ifstream &operator>>(ifstream & ifs,Info & c)//运算符 >> 重载{
    ifs >> c.name    >> c.gender    >> c.phone >> c.qq    >> c.email;return ifs;}#endif//*AddressBook类*AddressBook::AddressBook()//构造函数{
    head =NULL;}AddressBook::~AddressBook()//析构函数{
    Info * temp = head;while(head !=NULL){
        temp = head;
        head = head->next;delete temp;}}voidAddressBook::Load()//*读取文件中的数据*{//文件目录当前目录下的data.txt
    ifstream ifile(".\\data.txt");//如果没有文件则,打印:"打开文件失败"if(!ifile){
        cout <<"打开文件失败"<< endl;return;}//文件存在读取出来while(!ifile.eof()){
        Info * temp =new Info;#ifdef_VC2010_VER_
        ifile >>*temp;#else
        ifile >> temp->name    >> temp->gender    >> temp->phone >> temp->qq    >> temp->email;#endif//加入到链表中if(ifile){AddBase(temp);}}//关闭流
    ifile.close();}voidAddressBook::Save()//*将数据保存到文件*{//将文件保存到
    ofstream ofile(".\\data.txt", ios::trunc);if(!ofile){
        cout <<"保存失败"<< endl;return;}
    Info * temp = head;//写入while(temp !=NULL){#ifdef_VC2010_VER_
        ofile <<* temp<<endl;#else
        ofile << temp->name <<" "<< temp->gender <<" "<< temp->phone <<" "<< temp->qq <<" "<< temp->email <<" "<< endl;#endif
        temp = temp->next;}
    ofile.close();}voidAddressBook::Add()//*添加数据*{
    cout <<"请输入联系人信息: "<<endl;        
    Info * temp =new Info;// 实际开发中这里要捕获异常:内存申请失败
    cout <<"姓名( 1 ~ "<<sizeof(temp->name)-1<<" 字符): "<< ends;
    cin >> temp->name;

    cout <<"性别(  男   女 ): "<< ends;
    cin >> temp->gender;
        
    cout <<"电话( 1 ~ "<<sizeof(temp->phone)-1<<" 字符): "<< ends;
    cin >> temp->phone;

    cout <<"QQ( 1 ~ "<<sizeof(temp->qq)-1<<" 字符): "<< ends;
    cin >> temp->qq;
        
    cout <<"email( 0 ~ "<<sizeof(temp->email)-1<<" 字符): "<< ends;
    cin >> temp->email;AddBase(temp);}voidAddressBook::Query()//*查询联系人(按姓名或电话号)*{
    cout <<"   请选择查询方式    "<< endl;
    cout <<"   0. 按名字         "<< endl;
    cout <<"   1. 电话           "<< endl;int choose =0;
    cin >> choose;//输入查找方式char str[50]={0};switch(choose){case0:
        cout <<"请输入名字: "<< ends;
        cin >> str;break;case1:
        cout <<"请输入电话: "<< ends;
        cin >> str;break;default: 
        cout <<"没有该选项"<< endl;return;}
    Info * result = head;//输出表头信息ShowInfoTitle();int index =0;do{//查找
        result =QueryBase(result, choose, str);// 显示查询到的项if(result!=NULL){
            result->index = index;ShowInfo(result);
            index++;    
            result = result->next;}}while(result !=NULL);}voidAddressBook::Modify()//*修改联系人信息*{
    cout <<"请选择要修改的联系人(输入序号): "<< endl;//输出所有信息int count =ShowAllInfo();int index =0;
    cin >> index;//判断输入的序号是否存在if(index <0|| index >= count){
        cout <<"选择无效, 没有该序号的联系人"<< endl;return;}//删除DelBase(index);//添加Add();//完成修改}voidAddressBook::Del()//*删除联系人*{
    cout <<"请选择要删除的联系人(输入序号): "<< endl;//输出所有的信息int count =ShowAllInfo();int index =0;//输入序号
    cin >> index;//判断序号是否存在if(index <0|| index >= count){
        cout <<"选择无效, 没有该序号的联系人"<< endl;return;}//存在则删除DelBase(index);}voidAddressBook::ShowAll()//*输出所有信息*{ShowAllInfo();}voidAddressBook::AddBase(Info * pInfo){
    Info ** parent =&head;
    Info * temp = head;while(temp){// 按名字递增if(strcmp(temp->name, pInfo->name)>=0){break;}

        parent =&temp->next;
        temp = temp->next;}
    pInfo->next = temp;*parent = pInfo;}

Info *AddressBook::QueryBase(Info * start,int choose,constchar* str)//*按名字或电话号查找*{while(start !=NULL){switch(choose){case0:// 按名字匹配if(strcmp(start->name, str)==0){return start;}else{
                start=start->next;continue;}break;case1:// 按电话号码匹配if(strcmp(start->phone, str)==0){return start;}else{
                start=start->next;continue;}break;default:break;}returnNULL;}return start;}voidAddressBook::DelBase(int index)//*按序号删除*{
    Info * temp = head;
    Info ** parent =&head;while(temp !=NULL){if(temp->index == index){*parent = temp->next;delete temp;return;}
        parent =&temp->next;
        temp = temp->next;}}voidAddressBook::ShowInfoTitle()//*输出联系人信息*{
    cout <<"序号          姓名          性别          电话          QQ            email"<< endl;}voidAddressBook::ShowInfo(const Info * pInfo){
    cout <<setiosflags(ios::left)// 输出左对齐<<setw(14)<< pInfo->index
     <<setw(14)<< pInfo->name 
    <<setw(14)<< pInfo->gender
     <<setw(14)<< pInfo->phone
     <<setw(14)<< pInfo->qq
     <<setw(14)<< pInfo->email << endl;}intAddressBook::ShowAllInfo()//*输出序号*{int index =0;
    Info * temp = head;ShowInfoTitle();while(temp){
        temp->index = index;
        index++;ShowInfo(temp);
        temp = temp->next;}return index;}voidexit()//退出函数{
    cout <<"        ****************************************************************"<<endl;
    cout <<"        *******************          谢谢使用          *****************"<<endl;
    cout <<"        ****************************************************************"<<endl;}intmenu()//主菜单函数{system("cls");//清屏
    cout<<"        ****************************************************************"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                    欢迎登录通讯录管理系统                    |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        ****************************************************************"<<endl;
    cout<<"        |                      ☆1 . 添加联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆2 . 查询联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆3 . 修改联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆4 . 删除联系人                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆5 . 显示所有联系人                    |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆6 . 保存到文件                        |"<<endl;
    cout<<"        |                                                              |"<<endl;
    cout<<"        |                      ☆0 . 退出系统                          |"<<endl;
    cout<<"        ****************************************************************"<<endl;int m =0;do{
        cout <<"请输入选项0-8\n";
        cin >> m;}while( m <0|| m >8);return m;}

在这里插入图片描述

标签: 链表 c++ 数据结构

本文转载自: https://blog.csdn.net/qq_59708493/article/details/125228388
版权归原作者 Demo龙 所有, 如有侵权,请联系我们删除。

“C++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能)”的评论:

还没有评论