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

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩