C++实现完整功能的通讯录管理系统详解

目录
  • 一、确定结构体
  • 二、简易菜单
  • 三、为通讯录添加功能
  • 四、各功能与实现详解
    • 功能之添加联系人
    • 功能之显示联系人
    • 功能之查找联系人
    • 功能之修改联系人
    • 功能之删除联系人
    • 功能之清空通讯录
  • 四、源码
  • 五、运行效果
    • 运行效果图
    • 生成可执行程序
  • 结语

一、确定结构体

通讯录里应该存有联系人的信息,包括姓名、性别、电话、地址等等,通讯录也应该有长度,存的联系人要有上限。所以我们这样确定结构体:

#define Max 1000
struct person
{
	string m_Name;
	string m_Sex;//规定 1 为男  2为女
	int m_age;
	string m_phone;
	string m_Address;
};
struct addressBooks
{
	struct person personArray[Max];//通讯录中保存的联系人数组
	int m_size = 0;//通讯录中人员个数
};

结构体 addressBooks 中定义联系人数组最大为1000,同时初始化人联系人为0。还有一点值得注意,被嵌套的结构体person 需要在 addressBooks前创建,避免出现未定义的情况。

二、简易菜单

要做通讯录管理系统,就要首先确定系统的功能。所以我确定了通讯录的增、删、改、查、显示、清空和退出 七个功能,代码上简单编写一个无返回值(void)的函数即可。

void showMenu()//菜单功能
{
	cout << "\t*************************" << endl;
	cout << "\t***** 1、添加联系人 *****" << endl;
	cout << "\t***** 2、显示联系人 *****" << endl;
	cout << "\t***** 3、查找联系人 *****" << endl;
	cout << "\t***** 4、修改联系人 *****" << endl;
	cout << "\t***** 5、删除联系人 *****" << endl;
	cout << "\t***** 6、清空通讯录 *****" << endl;
	cout << "\t***** 0、退出通讯录 *****" << endl;
	cout << "\t*************************" << endl;
}

tips:这里“\t”会让光标向后跳8个字符的位置,可以理解为将菜单“居中”显示,稍微美观一点。

三、为通讯录添加功能

代码展示:

//主函数完整代码
int main()
{
	//创建通讯录结构体变量
	addressBooks abc;
	while (1) {
		showMenu();
		int select = 0;
		cout << "请选择你的操作:";
		cin >> select;
		switch (select)
		{
		case 1://添加联系人
			addPerson(&abc);
			break;
		case 2://显示联系人
			showPerson(&abc);
			break;
		case 3://查找联系人
		{
			findPerson(&abc);
		}
			break;
		case 4://修改联系人
			modifyPerson(&abc);
			break;
		case 5://删除联系人
		{
			deletePerson(&abc);
		}//case 语句 里的代码多的话就用{}括起来,不报错
			break;
		case 6://清空通讯录
			clearPerson(&abc);
			break;
		case 0://退出通讯录
			cout << "欢迎下次使用,祝您生活愉快" << endl; return 0;  break;
		default:
			cout << "请合理输入操作数0~6:" << endl;
			cin >> select;
			break;
		}
	}
}

首先创建通讯录结构体变量,while(1) 是个死循环,除非我们选择“0”功能,运行return 0 语句,否则不会结束循环,这也是我们可以重复选择功能的根本原因。流程控制语句switch case 语句无需多讲,只要注意每段语句结束加上break就行了。然后注意这段代码都是采用地址传递的方法,其实我更喜欢引用传递,不过是当时不太了解引用传递,关于函数传参的区别可以参考博主的这篇文章详解函数传参的三种方式

四、各功能与实现详解

功能之添加联系人

void addPerson(addressBooks* abc)//添加联系人
{
	if (abc->m_size >= Max)
	{
		cout << "通讯录已满,添加失败" << endl;
	}
	else {
		string name; cout << "添加联系人名字:" << endl; cin >> name;
		abc->personArray[abc->m_size].m_Name = name;
		int sex = 0; cout << "联系人性别为:" << endl;
		cout << "1---男\n" << "2---女\n"; cin >> sex;
		while (1) {
			if (sex == 1 || sex == 2)
			{
				if (sex == 1) abc->personArray[abc->m_size].m_Sex = "男";
				else          abc->personArray[abc->m_size].m_Sex = "女";
				break;
			}
			else cout << "输入有误,请在数字 1和2中选择" << endl; cin >> sex;
		}
		int age = 0; cout << "联系人年龄为:" << endl; cin >> age;
		abc->personArray[abc->m_size].m_age = age;
		string phoneNumber = "0"; cout << "联系人电话:" << endl; cin >> phoneNumber;
		abc->personArray[abc->m_size].m_phone = phoneNumber;
		string address = "0"; cout << "联系人地址为:" << endl; cin >> address;
		abc->personArray[abc->m_size].m_Address = address; cout << "添加成功" << endl;
		//更新通讯录人数
		abc->m_size++;
		system("pause"); system("cls");
	}
}

代码详解

首先判断通讯录当前联系人数量,如果大于最大值停止添加联系人;然后作一个输入流来输入联系人信息,利用联系人数组填入联系人信息;姓名属性我们简单做了一个范围选择,只允许输入1和0并给出提示1代表男性;倒数第二行 abc->m_size++,更新联系人数量;最后有两个系统函数 system("pause") 和 system("cls"),分别时“按任意键继续...”和清空屏幕函数,让我们的通讯录更加稳定和美观。

功能之显示联系人

void showPerson(addressBooks* abc)
{
	if (abc->m_size == 0) cout << "当前记录为空" << endl;
	else {
		for (int i = 0; i < abc->m_size; i++) {
			cout << "联系人:\t" << abc->personArray[i].m_Name << "\t性别: "
		     << abc->personArray[i].m_Sex<< "\t年龄: " <<
				abc->personArray[i].m_age << "\t电话: " << abc->personArray[i].m_phone
			 << "\t地址: " << abc->personArray[i].m_Address << endl;
		}
	}
	system("pause"); system("cls");
}

代码详解

首先判断有无联系人,没有就输出“当前记录为空”,然后利用一重for 循环输出所有联系人的信息,最后也是加上暂停函数和清空屏幕函数使运行界面美观。

功能之查找联系人

判定函数和实现查找

int isExit(addressBooks* abc, string name)//判定通讯录是否有此人
{
	for (int i = 0; i < abc->m_size; i++)
	{
		if (abc->personArray[i].m_Name == name) return i;
	}
	return -1;
}
void findPerson(addressBooks* abc)
{
	cout << "输入要查找联系人的名字:" << endl;
	string name = "0"; cin >> name;
	int i = isExit(abc, name);
	if (i != -1)
	{
		cout << "联系人:\t" << abc->personArray[i].m_Name << "\t性别: "
			<< abc->personArray[i].m_Sex << "\t年龄: " <<
			abc->personArray[i].m_age << "\t电话: "
			<< abc->personArray[i].m_phone << "\t地址: "
			<< abc->personArray[i].m_Address << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause"); system("cls");
}

代码详解

isExit()函数用来返回查找联系人在数组中的下标,如果没有该名字就返回 -1;结合findPerson() 函数,如果找到该联系人则输出所有信息,找不到则输出“查无此人”,最后也是老套路,使用暂停和清空屏幕函数。

功能之修改联系人

void modifyPerson(addressBooks* abc)
{
	cout << "输入要修改的联系人名字" << endl;
	string name = "0"; cin >> name;
	int v = isExit(abc, name);
	if (v != -1)
	{
		string name; cout << "更改后的名字为:" << endl; cin >> name;
		abc->personArray[v].m_Name = name;
		int sex = 0; cout << "更改后性别为:" << endl;
		cout << "1---男\n" << "2---女\n"; cin >> sex;
		while (1) {
			if (sex == 1 || sex == 2)
			{
				if (sex == 1) abc->personArray[v].m_Sex = "男";
				else          abc->personArray[v].m_Sex = "女";
				break;
			}
			else cout << "输入有误,请在数字 1和2中选择" << endl; cin >> sex;
		}
		int age = 0; cout << "更改后年龄为:" << endl; cin >> age;
		abc->personArray[v].m_age = age;
		string phoneNumber = "0"; cout << "更改后电话号码:" << endl; cin >> phoneNumber;
		abc->personArray[v].m_phone = phoneNumber;
		string address = "0"; cout << "更改后地址为:" << endl; cin >> address;
		abc->personArray[v].m_Address = address; cout << "更改成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause"); system("cls");
}

代码详解

这个功能函数其实很好理解,无非就是判定函数和添加联系人功能的结合,这里就不做详细介绍了。

功能之删除联系人

void deletePerson(addressBooks* abc)
{
	if (abc->m_size == 0)
	{
		cout << "当前记录为空" << endl;
	}
	else {
		cout << "输入要删除的联系人:" << endl;
		string name = "0"; cin >> name;
		int v = isExit(abc, name);
		if (v == -1) {
			cout << "查无此人" << endl;
		}
		else if (v != -1) {
			for (int i = v; i < abc->m_size; i++)
			{
				abc->personArray[i] = abc->personArray[i + 1];
			}
			abc->m_size--;
			cout << "删除成功" << endl;
		}
	}
	system("pause"); system("cls");
}

代码详解

首先判断有无联系人,没有就输出“当前记录为空”,再利用判断函数判断是否有此人,如果存在,那我们也是利用一重循环,让 i 等于返回的数组下标,条件是 i < abc->m_size,注意最好不要写"<=",因为我们需要将数组中的元素前移,只需要abc->m_size - 1 个长度就行了。最后将整个联系人数量减一,完成删除操作。

功能之清空通讯录

void clearPerson(addressBooks* abc)
{
	abc->m_size = 0;
	cout << "通讯录已清空" << endl;
	system("pause"); system("cls");
}

将联系人数组置为零,即可清空通讯录。

四、源码

//Txl.h
#include<iostream>
using namespace std;
#define Max 1000
struct person
{
	string m_Name;
	string m_Sex;//规定 1 为男  2为女
	int m_age;
	string m_phone;
	string m_Address;
};
struct addressBooks
{
	struct person personArray[Max];//通讯录中保存的联系人数组
	int m_size = 0;//通讯录中人员个数
};
void addPerson(addressBooks* abc);          //添加联系人
void showPerson(addressBooks* abc);         //显示联系人
int isExit(addressBooks* abc, string name); //遍历通讯录
void deletePerson(addressBooks* abc);       //删除联系人
void findPerson(addressBooks* abc);         //查找联系人
void modifyPerson(addressBooks* abc);       //修改联系人
void clearPerson(addressBooks* abc);        //清空通讯录

//Txl.cpp
#include"Txl.h"
void addPerson(addressBooks* abc)//添加联系人
{
	if (abc->m_size >= Max)
	{
		cout << "通讯录已满,添加失败" << endl;
	}
	else {
		string name; cout << "添加联系人名字:" << endl; cin >> name;
		abc->personArray[abc->m_size].m_Name = name;
		int sex = 0; cout << "联系人性别为:" << endl;
		cout << "1---男\n" << "2---女\n"; cin >> sex;
		while (1) {
			if (sex == 1 || sex == 2)
			{
				if (sex == 1) abc->personArray[abc->m_size].m_Sex = "男";
				else          abc->personArray[abc->m_size].m_Sex = "女";
				break;
			}
			else cout << "输入有误,请在数字 1和2中选择" << endl; cin >> sex;
		}
		int age = 0; cout << "联系人年龄为:" << endl; cin >> age;
		abc->personArray[abc->m_size].m_age = age;
		string phoneNumber = "0"; cout << "联系人电话:" << endl; cin >> phoneNumber;
		abc->personArray[abc->m_size].m_phone = phoneNumber;
		string address = "0"; cout << "联系人地址为:" << endl; cin >> address;
		abc->personArray[abc->m_size].m_Address = address; cout << "添加成功" << endl;
		//更新通讯录人数
		abc->m_size++;
		system("pause"); system("cls");
	}
}
void showPerson(addressBooks* abc)
{
	if (abc->m_size == 0) cout << "当前记录为空" << endl;
	else {
		for (int i = 0; i < abc->m_size; i++) {
			cout << "联系人:\t" << abc->personArray[i].m_Name << "\t性别: "
		     << abc->personArray[i].m_Sex<< "\t年龄: " <<
				abc->personArray[i].m_age << "\t电话: " << abc->personArray[i].m_phone
			 << "\t地址: " << abc->personArray[i].m_Address << endl;
		}
	}
	system("pause"); system("cls");

}
int isExit(addressBooks* abc, string name)//判定通讯录是否有此人
{
	for (int i = 0; i < abc->m_size; i++)
	{
		if (abc->personArray[i].m_Name == name) return i;
	}
	return -1;
}
void findPerson(addressBooks* abc)
{
	cout << "输入要查找联系人的名字:" << endl;
	string name = "0"; cin >> name;
	int i = isExit(abc, name);
	if (i != -1)
	{
		cout << "联系人:\t" << abc->personArray[i].m_Name << "\t性别: "
			<< abc->personArray[i].m_Sex << "\t年龄: " <<
			abc->personArray[i].m_age << "\t电话: "
			<< abc->personArray[i].m_phone << "\t地址: "
			<< abc->personArray[i].m_Address << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause"); system("cls");
}
void deletePerson(addressBooks* abc)
{
	if (abc->m_size == 0)
	{
		cout << "当前记录为空" << endl;
	}
	else {
		cout << "输入要删除的联系人:" << endl;
		string name = "0"; cin >> name;
		int v = isExit(abc, name);
		if (v == -1) {
			cout << "查无此人" << endl;
		}
		else if (v != -1) {
			for (int i = v; i < abc->m_size; i++)
			{
				abc->personArray[i] = abc->personArray[i + 1];
			}
			abc->m_size--;
			cout << "删除成功" << endl;
		}
	}
	system("pause"); system("cls");
}
void modifyPerson(addressBooks* abc)
{
	cout << "输入要修改的联系人名字" << endl;
	string name = "0"; cin >> name;
	int v = isExit(abc, name);
	if (v != -1)
	{
		string name; cout << "更改后的名字为:" << endl; cin >> name;
		abc->personArray[v].m_Name = name;
		int sex = 0; cout << "更改后性别为:" << endl;
		cout << "1---男\n" << "2---女\n"; cin >> sex;
		while (1) {
			if (sex == 1 || sex == 2)
			{
				if (sex == 1) abc->personArray[v].m_Sex = "男";
				else          abc->personArray[v].m_Sex = "女";
				break;
			}
			else cout << "输入有误,请在数字 1和2中选择" << endl; cin >> sex;
		}
		int age = 0; cout << "更改后年龄为:" << endl; cin >> age;
		abc->personArray[v].m_age = age;
		string phoneNumber = "0"; cout << "更改后电话号码:" << endl; cin >> phoneNumber;
		abc->personArray[v].m_phone = phoneNumber;
		string address = "0"; cout << "更改后地址为:" << endl; cin >> address;
		abc->personArray[v].m_Address = address; cout << "更改成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause"); system("cls");
}
void clearPerson(addressBooks* abc)
{
	abc->m_size = 0;
	cout << "通讯录已清空" << endl;
	system("pause"); system("cls");
}
//函数声明,可加可不加,这里加上为了更直观的表现出来
void addPerson(addressBooks* abc);          //添加联系人
void showPerson(addressBooks* abc);         //显示联系人
int isExit(addressBooks* abc, string name); //遍历通讯录
void deletePerson(addressBooks* abc);       //删除联系人
void findPerson(addressBooks* abc);         //查找联系人
void modifyPerson(addressBooks* abc);       //修改联系人
void clearPerson(addressBooks* abc);        //清空通讯录

五、运行效果

运行效果图

还有更多功能就不展示了,你们可以复制源码后自己操作,挺有趣的喔

生成可执行程序

我们在编译器的上面选择Release,并启动调试,然后这个项目对应的文件夹会自动生成Release文件夹,点开就是第二个图的内容,然后双击就可以执行了,实测分享给朋友也可以用哦

结语

到此这篇关于C++实现完整功能的通讯录管理系统详解的文章就介绍到这了,更多相关C++通讯录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 实现的通讯录管理系统详解

    代码如下: #include<iostream> #include <sstream> using namespace std; #define Max 1000 //显示菜单函数 void showMenu() { cout << "************************" << endl; cout << "**** 1.添加联系人 ****" << endl; cout <

  • C++实现通讯录管理系统

    本文实例为大家分享了C++通讯录管理系统的具体代码,供大家参考,具体内容如下 #include<iostream> #include<string> using namespace std; #define MAX 1000 struct Person { string m_Name; int m_Sex; int m_Age; string m_Phone; string m_Addr; }; struct Addressbooks { struct Person personA

  • C++链表实现通讯录管理系统

    用数据结构里面线性结构的链表实现,供大家参考,具体内容如下 文件操作未写 有登录操作,复制源码需要更改登录模块的密码文件存放位置 使用VS2017编译器需要保留开头: #define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include "iostream" #include "cstdio" #include "fstream" #include "stdli

  • C++实现简单通讯录管理系统

    本文实例为大家分享了C++实现简单的通讯录管理系统的具体代码,供大家参考,具体内容如下 一.代码 #include <iostream> #include <string> #include <cstring> #include <fstream> using namespace std; //自定义一个联系人结点类型 typedef struct node1 {     string name;        //姓名     string tel;  

  • C++实现完整功能的通讯录管理系统详解

    目录 一.确定结构体 二.简易菜单 三.为通讯录添加功能 四.各功能与实现详解 功能之添加联系人 功能之显示联系人 功能之查找联系人 功能之修改联系人 功能之删除联系人 功能之清空通讯录 四.源码 五.运行效果 运行效果图 生成可执行程序 结语 一.确定结构体 通讯录里应该存有联系人的信息,包括姓名.性别.电话.地址等等,通讯录也应该有长度,存的联系人要有上限.所以我们这样确定结构体: #define Max 1000 struct person { string m_Name; string

  • Java 实现完整功能的学生管理系统实例

    目录 一.前言 二.学生管理系统主要功能 在学生类下 在学生总部类下: main方法: 登录密码验证: 打印菜单: 增加学生信息: 查看学生信息: 删除学生信息: 修改学生信息: 查找学生信息: 代码效果演示图: 一.前言 我们前面写了通讯录管理系统,现在我们来写个学生管理系统, 其实主干代码都一 不过,在学生管理系统中我添加和优化了许多功能, 如[登录密码验证,异常处理,非空判断,,防止重复添加]等. 二.学生管理系统主要功能 增加学生信息 删除学生信息 修改学生信息 查找学生信息 查看所有学

  • BootStrap实现带有增删改查功能的表格(DEMO详解)

    前言 bootstrap的表格样式,有类似EasyUI的表格,也有卡片式表格,放到移动端显示,各有千秋.但是BootStrap自带的表格是没有操作列的,网上的资源不少,但是都是比较单一.零碎,JS.CSS也经常给的不全,自己经过大概一个月左右的时间,把表格封装了一下,希望能分享给大家. 表格封装了3个版本,接下来给大家展示一下样式和代码. 版本一 1. 样式 表格布局: 添加:添加一行新的空白代码 修改:选中可修改的列,点击需要修改的单元格,即可变成可编辑的状态. 2.代码 @using Dat

  • Android中实现ping功能的多种方法详解

    使用java来实现ping功能. 并写入文件.为了使用java来实现ping的功能,有人推荐使用java的 Runtime.exec()方法来直接调用系统的Ping命令,也有人完成了纯Java实现Ping的程序,使用的是Java的NIO包(native io, 高效IO包).但是设备检测只是想测试一个远程主机是否可用.所以,可以使用以下三种方式来实现: 1. Jdk1.5的InetAddresss方式 自从Java 1.5,java.net包中就实现了ICMP ping的功能. 使用时应注意,如

  • Java 实战项目之疫情人员流动管理系统详解

    一.项目简述 本系统主要实现的功能有: 社区疫情流动人员管理系统,住户管理,出入管理,访客管理,体温录入,高风险警示等等. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: Springboot+ SpringMVC + MyBatis + Jsp + Html+ JavaScript + JQuery + Ajax + maven等等 系统用户后台管理代

  • C#利用ASP.NET Core开发学生管理系统详解

    目录 涉及知识点 创建项目 登录模块 1. 创建控制器--LoginController 2. 创建登录视图 3. 创建用户模型 4. 创建数据库操作DataContext 5. 创建数据库和表并构造数据 6. 添加数据库连接配置 7. 添加注入信息 8. 运行测试 随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生.本文主要利用ASP.NET Core开发一个学生管理系统为例,简述ASP.NET Core开发的常见知识点,仅供学习分享使用,如有不足之处,

  • Python实现多功能音乐播放器详解

    目录 前言 准备工作 知识点和所需模块 环境 完整代码 效果展示 导入模块 界面 按钮 功能 创建一个文件目录 音乐读取功能 显示已加载的音乐 播放音乐 停止播放 下一首 上一首 音量控制 关闭窗口 前言 就是用Python做一个简易的音乐播放器,废话不多说,咱们直接开干 当然,今天做这个肯定不是最简单的,最简单的音乐播放器,9行代码足以 import time import pygame file = r'歌曲路径' pygame.mixer.init() print('正在播放',file)

  • 用c语言编写一个通讯录代码详解

    目录 实现通讯录的思路如下: 总结 实现通讯录的思路如下: 1.程序运行起来时用户首先要看到菜单栏选项并且对应菜单栏所给出的选项做出选择,这里我们简单设计一个Menu()函数可以让用户看见可选项目: 2.用户可选的范围应该是1~7,为了避免用户做出超出范围的选择我们可以用switch语句来判断用户的选择若用户输入的数字非法还可以让用户继续选择,而继续选择这个动作需要用到while语句,用户对通讯录的不断操作也需要用到while语句: 3.用户选择不同的选项,程序就要调用对应的函数来实现其功能并且

  • Java实现学生管理系统详解流程

    目录 学生管理系统 项目介绍 JavaSwing 功能展示 使用说明 遇到的问题 JavaWeb 功能展示 使用说明 遇到的问题 最后 学生管理系统 前言:这个是大二做的课设(还是学生管理系统…),理论上虽然是4个人一组一起做的,但是,注意这个“但是”,还是我一个人承担了所有…代码和文档基本都是我一个人写的,当初直接肝得吐血,这也是为啥后面的 Web 版部分功能没有完成的原因. 项目介绍 项目分为一个JavaSwing写的GUI桌面应用和一个半成品的Web应用,下图是项目的整体功能结构展示 Ja

随机推荐