这里写自定义目录标题

  • 分析
    • 1.需求分析
    • 2.设计
    • 3.抽象类型定义
  • 通讯录管理系统功能介绍
    • 1.添加联系人
    • 2.查询联系人
    • 3.修改联系人
    • 4.删除联系人
    • 5.显示所有联系人
    • 6.保存到文件
    • 0.退出系统
  • 其他副函数
    • 1.按照序号删除
    • 2.输出联系人信息
    • 3.输出序号
    • 4.主菜单函数
    • main函数
  • end
  • 完整方法代码

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

分析

1.需求分析

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

2.设计

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

3.抽象类型定义

//*创建Info类*
class Info
{public:Info();//构造函数friend class AddressBook; //声明AddressBook类为其友元类
#ifdef  _VC2010_VER_friend ofstream & operator << (ofstream &,const Info &);//运算符 << 重载friend ifstream & operator >> (ifstream &, Info &);//运算符 >> 重载
#endif
private:
// 禁用拷贝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.添加联系人

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

void AddressBook::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.查询联系人

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

void AddressBook::Query() //*查询联系人(按姓名或电话号)*
{cout << "   请选择查询方式    " << endl;cout << "   0. 按名字         " << endl;cout << "   1. 电话           " << endl;int choose = 0;cin >> choose;//输入查找方式char str[50] = {0};switch (choose){case 0:cout << "请输入名字: " << ends;cin >> str;break;case 1: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()函数添加新的联系人),这就是使用链表的好处。

void AddressBook::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);进行链表的删除操作

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

5.显示所有联系人

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

6.保存到文件

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

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

0.退出系统

其他副函数

1.按照序号删除

进行链表的删除操作。

void AddressBook::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.输出联系人信息

void AddressBook::ShowInfoTitle() //*输出联系人信息*
{cout << "序号          姓名          性别          电话          QQ            email" << endl;
}void AddressBook::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.输出序号

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

4.主菜单函数

int menu()//主菜单函数
{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"//*主函数*
int main()
{int m = 0;AddressBook book;book.Load();do{m = menu();switch (m){case 0:exit();//退出break;case 1:book.Add();break;case 2:book.Query();break;case 3:book.Modify();break;case 4:book.Del();break;case 5:book.ShowAll();break;case 6:book.Save();break;default:cout << "暂不支持该选项\n" << endl;}cout << "回车继续..." << endl;getch();} while (m > 0);book.Save();return 0;
}void exit(); //*退出函数,用来退出通讯录管理系统*
int menu(); //*主菜单函数,用于输出通讯录界面*//#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;}
}void AddressBook::Load() //*读取文件中的数据*
{//文件目录当前目录下的data.txtifstream ifile(".\\data.txt");//如果没有文件则,打印:"打开文件失败"if (!ifile){cout << "打开文件失败" << endl;return;}//文件存在读取出来while (!ifile.eof()){Info * temp = new Info;#ifdef  _VC2010_VER_ifile >> *temp;#elseifile >> temp->name  >> temp->gender    >> temp->phone >> temp->qq    >> temp->email;#endif//加入到链表中if (ifile){AddBase(temp);}}//关闭流ifile.close();
}void AddressBook::Save() //*将数据保存到文件*
{//将文件保存到ofstream ofile(".\\data.txt", ios::trunc);if (!ofile){cout << "保存失败" << endl;return;}Info * temp = head;//写入while (temp != NULL){#ifdef  _VC2010_VER_ofile <<* temp<<endl;#elseofile << temp->name << " "   << temp->gender << " " << temp->phone << " " << temp->qq << " "  << temp->email << " " << endl;#endiftemp = temp->next;}ofile.close();
}void AddressBook::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);
}void AddressBook::Query() //*查询联系人(按姓名或电话号)*
{cout << "   请选择查询方式    " << endl;cout << "   0. 按名字         " << endl;cout << "   1. 电话           " << endl;int choose = 0;cin >> choose;//输入查找方式char str[50] = {0};switch (choose){case 0:cout << "请输入名字: " << ends;cin >> str;break;case 1: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);
}void AddressBook::Modify() //*修改联系人信息*
{cout << "请选择要修改的联系人(输入序号): " << endl;//输出所有信息int count = ShowAllInfo();int index = 0;cin >> index;//判断输入的序号是否存在if (index < 0 || index >= count){cout << "选择无效, 没有该序号的联系人" << endl;return;}//删除DelBase(index);//添加Add();//完成修改
}void AddressBook::Del()    //*删除联系人*
{cout << "请选择要删除的联系人(输入序号): " << endl;//输出所有的信息int count = ShowAllInfo();int index = 0;//输入序号cin >> index;//判断序号是否存在if (index < 0 || index >= count){cout << "选择无效, 没有该序号的联系人" << endl;return;}//存在则删除DelBase(index);
}void AddressBook::ShowAll()//*输出所有信息*
{ShowAllInfo();
}void AddressBook::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, const char * str) //*按名字或电话号查找*
{while (start != NULL){switch (choose){case 0: // 按名字匹配if (strcmp(start->name, str) == 0){return start;}else{start=start->next;continue;}break;case 1: // 按电话号码匹配if (strcmp(start->phone, str) == 0){return start;}else{start=start->next;continue;}break;default:break;}return NULL;}return start;
}void AddressBook::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;}
}void AddressBook::ShowInfoTitle() //*输出联系人信息*
{cout << "序号          姓名          性别          电话          QQ            email" << endl;
}void AddressBook::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;
}int AddressBook::ShowAllInfo() //*输出序号*
{int index = 0;Info * temp = head;ShowInfoTitle();while (temp){temp->index = index;index++;ShowInfo(temp);temp = temp->next;}return index;
}void exit()//退出函数
{cout << "        ****************************************************************"<<endl;cout << "        *******************          谢谢使用          *****************"<<endl;cout << "        ****************************************************************"<<endl;
}int menu()//主菜单函数
{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++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能)相关推荐

  1. java文件操作和_JAVA文件操作类和文件夹的操作

    JAVA文件操作类和文件夹的操作 package com.gamvan.tools; import java.io.BufferedReader; import java.io.File; impor ...

  2. C++实现通讯录管理系统(不涉及文件操作)

    目录 一.前言 二.项目文件构成 三.项目实现功能 四.项目代码 一.前言 这个是学习c++的时候顺手写的一个练习小demo,发出来希望有需要的朋友可以用到. 也可以直接到我的github仓库中拉取源 ...

  3. 数据结构员工通讯录管理系统 C语言,数据结构课程设计报告单位员工通讯录管理系统.doc...

    班级:计科112 学号: 201100814203 姓名:冯贵阳 PAGE PAGE 42 数 据 结 构 课 程 设 计 实 验 报 告 目录 1.单位员工通讯录管理系统(线性表的应用)---- - ...

  4. java文件读写的基本类_java常用工具类(三)—— 文件读取的操作类

    定义常用的文件类型 public class FileType { /** * 文件头类型 */ public static final String XML_FILE = "text/xm ...

  5. python通讯录管理系统姓名年龄号码_基于互联网的移动通讯录管理系统的制作方法...

    本发明涉及一种移动通讯录管理系统,特别涉及一种基于互联网的移 动通讯录管理系统. 背景技术: 目前,移动用户的通讯录一般都是存放在手机等移动终端设备上,最多是 从手机导出到计算机,没有在服务器上备份. ...

  6. 蓝海卓越 计费管理系统 download.php 任意文件读取漏洞

    漏洞描述: 蓝海卓越计费管理系统 download.php文件存在任意文件读取漏洞,攻击者通过 ../ 遍历目录可以读取服务器上的敏感文件. 漏洞利用条件: / 漏洞影响范围: / 漏洞复现: 1.P ...

  7. matlab对文本文件、数据文件等的文件读取、操作等实用功能总结

    matlab文件读取总结 matlab的文件读取函数功能可以读取各种文件类型,包括 textread(字母和数值每行格式一致) xlsread(读取excel文件) importdata(字母和数值分 ...

  8. 应用程序设计:图书管理系统模板(链表+文件)

    概述         主要包括图书的库存信息,每一本书的借阅信息以及每一个人的借书信息. 系统功能:     (1)借阅资料管理(对相关资料进行添加,删除,修改,查询等操作)     (2)借阅管理( ...

  9. 【算法基础四】C语言小项目实战---通讯录管理系统(单链表)

    ✅作者简介:大家好,我是新小白2022,让我们一起学习,共同进步吧!

最新文章

  1. gateway java_基于SpringCloudGateway 实现的网关
  2. 最详细的排序解析,理解七大排序
  3. 高度可定制化的方案_如何开发高度可定制的产品
  4. Java进阶:java字符串定位语句
  5. 在asp.net中使用线程
  6. 企业网站的生命周期到底有多长 如何能够持续性发展下去
  7. CAD增强属性块的还原
  8. 软件测试是不是IT行业最容易学的 ,大概需要多长时间,就业前景好吗?
  9. 怎样彻底卸载电脑上的软件
  10. 游戏版署过审注意事项
  11. 计算机 及其 应用系统
  12. SAP 四代增强方式和Enhancement查找方法
  13. DSP28335学习记录(五)——eCAP、eQEP
  14. mysql 跨库插入_sql 跨库和域插入数据库
  15. FPGA基础资源之IOB的应用
  16. 2019最实用的8种精准微信引流方法教程
  17. 网络爬虫:网页信息获取
  18. android 布局总结
  19. 用ArcMap打开MXD文件报One or more layers failed to draw错误!
  20. gateway官网解读(三)

热门文章

  1. phpstudy配置oracle,【phpstudy】安装Oracle 客户端 并连接
  2. 程序员也可以很浪漫--精选10个圣诞节特效网页设计-前端HTML+CSS等实现
  3. PSpice for TI Error message: INFO(ORCAP-15098)
  4. 亚马逊asin关键词排名追踪_亚马逊卖家如何快速提升关键词的排名
  5. html静态页面案例
  6. ios查看帧率的软件_iOS实时流畅性监控
  7. IntelliJ IDEA搭配SSH框架完整流程
  8. 贵安新区聚焦智能终端产业推进移动互联升级
  9. 计算机组成原理试卷分析,计算机组成原理试卷分析.doc
  10. IPMI设置使用说明