c++vscode多文件实现通讯录管理系统

2024-08-31 06:04

本文主要是介绍c++vscode多文件实现通讯录管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

c++vscode多文件实现通讯录管理系统

作为c++入门级别的实战项目,此通讯管理系统项目不仅仅是对c++入门阶段学习成果的检验,也是对c++基础知识的回顾,体会c++在实战制作中的思路,是入门c++单文件实现通讯录系统的改进

img

在这里插入图片描述

一、多文件通讯录管理系统简介

系统需求通讯录是一个可以记录亲人、好友信息的工具。

本教程主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

相对于原先通讯录管理系统优化之处:

  1. 添加读取文件保存进独立文件功能,记录,使下次运行时保存原先的联系人
  2. 多文件协同运行,包括头文件.h和文件.cpp
  3. 可以批量添加多人

二、思路

image-20240830211437479

三、功能实现

3.1 person.h封装

image-20240830211756354

#pragma once // 防止文件重复
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:string Name;    // 联系人姓名int Age;        // 联系人年龄int Sex;        // 联系人性别,后续1表示男,2表示女string Address; // 联系人地址string Phone;   // 联系人电话Person();// 初始化人Person(string name, int age, int sex, string phone, string address);
};

person.cpp实现如下:

#include "person.h"
Person::Person()
{
}
Person::Person(string name, int age, int sex, string phone, string address)
{Name = name;Age = age;Sex = sex;Phone = phone;Address = address;
}

3.2 manager.h类封装

image-20240830212420597

#pragma once // 防止文件重复
#include <iostream>
#include <string>
using namespace std;
#include "person.h"
#define MAX 1000//便于后期维护
#define FILE_NAME "person.txt"//便于后期维护
class Manager
{
public:Person arr[MAX]; // 创建一个z最大能容纳1000个人的数组int num;         // 记录当前有多少人// 构造函数,判断文件状态Manager();// 得到原先文件联系人数量int getNum();// 初始化程序void init();// 读取保存文件void save();// 显示菜单void showMenu();// 退出功能void Exit();// 添加联系人功能void addPerson();// 创建判断文件是否为空的标志,以便查看联系人功能实现bool isEmpty = false;// 添加查看联系人功能void showPerson();// 删除联系人功能void deletePerson();// 查找联系人功能void findPerson();// 修改联系人功能void modifyPerson();// 清空联系人功能void clearPerson();
};

成员行为实现:(manager.cpp内容)

  1. 显示菜单:void showMenu()
// 实现展示菜单功能
void Manager::showMenu()
{cout << "*************************" << endl;cout << "***** 1、添加联系人 *****" << endl;cout << "***** 2、显示联系人 *****" << endl;cout << "***** 3、删除联系人 *****" << endl;cout << "***** 4、查找联系人 *****" << endl;cout << "***** 5、修改联系人 *****" << endl;cout << "***** 6、清空联系人 *****" << endl;cout << "***** 0、退出通讯录 *****" << endl;cout << "*************************" << endl;
}
  1. 得到原来保存联系人数量:void getNum(),在第四步会用到
// 得到原先文件联系人数量
int Manager::getNum()
{ifstream ifs;ifs.open(FILE_NAME, ios::in);int num = 0;string name;    // 联系人姓名int age;        // 联系人年龄int sex;        // 联系人性别,后续1表示男,2表示女string address; // 联系人地址string phone;   // 联系人电话//当人的所有属性被读取到后才可进行num++while (ifs >> name && ifs >> sex && ifs >> age && ifs >> phone && ifs >> address){num++;}ifs.close();return num;
}
  1. 初始化函数:void init()(使通讯录功能正常使用,读取之前保存在person.txt文件中的数据,在第四步也会用到)
// init功能
void Manager::init()
{ifstream ifs;ifs.open(FILE_NAME, ios::in);string name;    // 联系人姓名int age;        // 联系人年龄int sex;        // 联系人性别,后续1表示男,2表示女string address; // 联系人地址string phone;   // 联系人电话int index = 0;while (ifs >> name && ifs >> sex && ifs >> age && ifs >> phone && ifs >> address){this->arr[index] = Person(name, sex, age, phone, address);index++;}
}
  1. 读文件:Manager()(Manager类的默认构造函数,会用到上一步的getNum())
// 文件读取
Manager::Manager()
{// 1.文件未创建ifstream ifs;ifs.open(FILE_NAME, ios::in);if (!ifs.is_open()){isEmpty = true;//文件是否为空标志,是this->num = 0;ifs.close();return;}// 2.文件创建但数据为空char ch;ifs >> ch;if (ifs.eof()){isEmpty = true; // 文件是否为空标志,是this->num = 0;ifs.close();return;}// 3. 文件存在且数据不为空,以既有数据初始化程序isEmpty = false; // 文件是否为空标志,不是this->num = this->getNum();//得到原来保存联系人数量,即第二步this->init();//初始化,即第三步
}
  1. 保存已录入数据:void save()(后面大部分功能都将用到此函数)
// 实现文件写入保存功能
void Manager::save()
{ofstream ofs;ofs.open(FILE_NAME, ios::out);for (int i = 0; i < this->num; i++){ofs << this->arr[i].Name << " "<< this->arr[i].Sex << " "<< this->arr[i].Age << " "<< this->arr[i].Phone << " "<< this->arr[i].Address << endl;}ofs.close();
}
七大功能实现
  1. 退出功能
// 实现退出功能
void Manager::Exit()
{cout << "欢迎下次使用" << endl;exit(0);
}
  1. 添加联系人功能:void addPerson()(添加并同时保存到数组中,再利用save()保存在文件中,实现了一次添加多人功能)
// 实现添加联系人功能
void Manager::addPerson()
{if (num == 1000){cout << "通讯录已满,无法添加" << endl;return;}// 批量添加cout << "请输入添加联系人的数量:" << endl;int addNum; // 要添加的数量cin >> addNum;int i = 1;//从第一个人开始添加while (addNum) // 循环添加{// 添加姓名string name;cout << "请输入第" << i << "名联系人姓名:" << endl;cin >> name;arr[num].Name = name;//num即上次关闭程序保存的人数,此次添加就从其后添加// 添加年龄int age;cout << "请输入联系人年龄:" << endl;cin >> age;arr[num].Age = age;// 添加性别int sex;cout << "请选择联系人性别:" << endl;cout << "1.男" << endl;cout << "2.女" << endl;cin >> sex;if (sex == 1){arr[num].Sex = 1;}else{arr[num].Sex = 2;}// 添加电话string phone;cout << "请输入联系人电话:" << endl;cin >> phone;arr[num].Phone = phone;// 添加地址string address;cout << "请输入联系人地址:" << endl;cin >> address; arr[num].Address = address;i++;//下一个人num++;addNum--;//想要添加的人数即减一cout << "添加成功" << endl;this->save();// 更新职工不为空的标志this->isEmpty = false;}
}
  1. 显示联系人功能:void showPerson()
// 实现显示联系人功能
void Manager::showPerson()
{if (this->isEmpty){cout << "通讯录为空" << endl;return;}for (int i = 0; i < this->num; i++){cout << "姓名:" << this->arr[i].Name << "\t";if (this->arr[i].Sex == 1){cout << "性别:男" << "\t";}else{cout << "性别:女" << "\t";}cout << "年龄:" << this->arr[i].Age << "\t";cout << "电话:" << this->arr[i].Phone << "\t";cout << "地址:" << this->arr[i].Address << "\t" << endl;}
}
  1. 删除联系人功能:void deletePerson()(实质是数据前移)
// 实现删除联系人功能
void Manager::deletePerson()
{if (this->isEmpty){cout << "通讯录为空" << endl;return;}cout << "请输入要删除的联系人姓名:" << endl;string name;cin >> name;int temp = num;for (int i = 0; i < temp; i++){if (this->arr[i].Name == name){for (int j = i; j < this->num - 1; j++){this->arr[j] = this->arr[j + 1];}this->num--;}}if (this->num == temp){cout << "没有找到该联系人" << endl;}else{cout << "删除成功" << endl;}this->save();
}
  1. 查找联系人功能:void findPerson()(根据姓名查找)
// 实现查找联系人功能
void Manager::findPerson()
{if (this->isEmpty){cout << "通讯录为空" << endl;return;}cout << "请输入要查找的联系人姓名:" << endl;string name;cin >> name;for (int i = 0; i < this->num; i++){if (this->arr[i].Name == name){cout << "姓名:" << this->arr[i].Name << "\t";if (this->arr[i].Sex == 1){cout << "性别:男" << "\t";}else{cout << "性别:女" << "\t";}cout << "年龄:" << this->arr[i].Age << "\t";cout << "电话:" << this->arr[i].Phone << "\t";cout << "地址:" << this->arr[i].Address << "\t" << endl;}if (i == this->num - 1){cout << "未找到该联系人" << endl;return;}}cout << "查找成功" << endl;
}
  1. 修改联系人功能:void modifyPerson()
  • 根据姓名修改,首先先显示所有此姓名的人,再从中选择要修改的人
  • 再用Person定义一个临时数组,记录同名的人,根据下标选择想要修改的人
  • 通过比较临时数组中的联系人和通讯录中的联系人来找到要修改的联系人的索引
// 实现修改联系人功能
void Manager::modifyPerson()
{if (this->isEmpty){cout << "通讯录为空" << endl;return;}cout << "选择你要修改的联系人的姓名:" << endl;string name;cin >> name;Person temp[MAX]; // 用Person定义一个小数组,记录同名的人,根据下标选择想要修改的人int index = 0;for (int i = 0; i < this->num; i++){if (arr[i].Name == name){cout << "姓名:" << this->arr[i].Name << "\t";if (this->arr[i].Sex == 1){cout << "性别:男" << "\t";}else{cout << "性别:女" << "\t";}cout << "年龄:" << this->arr[i].Age << "\t";cout << "电话:" << this->arr[i].Phone << "\t";cout << "地址:" << this->arr[i].Address << endl;temp[index] = arr[i];index++;}if (i == this->num - 1){cout << "未找到该联系人" << endl;return;}}cout << "请选择要修改的联系人的序号:" << endl;int NUM;cin >> NUM;int newIndex;for (int i = 0; i < num; i++){if (temp[NUM - 1].Name == arr[i].Name && temp[NUM - 1].Phone == arr[i].Phone && temp[NUM - 1].Address == arr[i].Address && temp[NUM - 1].Age == arr[i].Age && temp[NUM - 1].Sex == arr[i].Sex){newIndex = i; // 找到了要修改的联系人的下标}}cout << "请输入修改后的联系人姓名:" << endl;string newName; // 因为上面已经定义了name,所以这用newName,防重复cin >> newName;arr[newIndex].Name = newName;cout << "请输入修改后的联系人性别:" << endl;cout << "1.男" << endl;cout << "2.女" << endl;int sex;cin >> sex;if (sex == 1){arr[newIndex].Sex = 1;}else{arr[newIndex].Sex = 2;}cout << "请输入修改后的联系人年龄:" << endl;int age;cin >> age;arr[newIndex].Age = age;cout << "请输入修改后的联系人电话:" << endl;string phone;cin >> phone;arr[newIndex].Phone = phone;cout << "请输入修改后的联系人地址:" << endl;string address;cin >> address;arr[newIndex].Address = address;cout << "修改成功" << endl;this->save();
}
  1. 清空通讯录功能
// 清空联系人功能
void Manager::clearPerson()
{if (this->isEmpty){cout << "通讯录为空" << endl;return;}cout << "确定清空通讯录吗?" << endl;cout << "1.确定" << endl;cout << "2.取消" << endl;int choice;cin >> choice;if (choice == 1){this->num = 0;this->isEmpty = true;this->save();cout << "清空成功" << endl;}else{cout << "取消成功" << endl;}
}

到此即实现了完整的通讯录管理系统

这篇关于c++vscode多文件实现通讯录管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123088

相关文章

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主