首页 > 编程语言 >C++ 通讯录实现

C++ 通讯录实现

时间:2024-11-03 17:15:56浏览次数:3  
标签:ps cout 实现 C++ flag 通讯录 size personAddress name

头文件:

#include<iostream>
#include<string>
#define MAX 1000
using namespace std;
//联系人结构体
struct Person {
	string name;
	int age;
	string address;
	string gender;
	string phone;
};
//通讯录结构体
struct Addressbooks {
	Person personAddress[MAX];
	int size;
};
int CheckHave(Addressbooks* ps, string name);//检查所给联系人在哪个位置
void SelectPerson(Addressbooks* ps);//显示指定联系人
void print(Addressbooks* ps);//显示目前所有的联系人
void menu();//菜单
void DeletePerson(struct Addressbooks* ps);//删除联系人
void addPerson(struct Addressbooks* ps);//添加联系人
void upDataPerson(struct Addressbooks* ps);//修改联系人
void cleanPerson(struct Addressbooks* ps);//清空通讯录

函数:

#include"TelPhone.h"
int CheckHave(Addressbooks* ps, string name)
{

	for (int i = 0; i < ps->size; i++)
	{

		if (ps->personAddress[i].name == name)
		{
			return i;
		}
	}
	return -1;
}
void SelectPerson(Addressbooks* ps)
{
	cout << "输入需要查找的联系人的姓名" << endl;
	string name;
	cin >> name;
	int flag = CheckHave(ps, name);
	if (flag == -1) {
		cout << "通讯录中没有此联系人" << endl;
		system("pause");
		system("cls");
		return;
	}
	else {
		cout << "姓名:\t" << "年龄:\t" << "性别:\t" << "电话号码:\t" << "地址:\t" << endl;
		cout << ps->personAddress[flag].name << "\t" <<
			ps->personAddress[flag].age << "\t" <<
			ps->personAddress[flag].gender << "\t" <<
			ps->personAddress[flag].phone << "\t" <<
			ps->personAddress[flag].address << "\t" <<
			endl;
		system("pause");
		system("cls");
	}

}
void print(Addressbooks* ps)
{
	if (ps->size == 0)
	{
		cout << "当前通讯录中没有联系人" << endl;
		system("pause");
		system("cls");
		return;
	}
	cout << "姓名:\t" << "年龄:\t" << "性别:\t" << "电话号码:\t" << "地址:\t" << endl;
	for (int i = 0; i < ps->size; i++) {

		cout << ps->personAddress[i].name << "\t" <<
			ps->personAddress[i].age << "\t" <<
			ps->personAddress[i].gender << "\t" <<
			ps->personAddress[i].phone << "\t" <<
			ps->personAddress[i].address << "\t" <<
			endl;
	}
	system("pause");
	system("cls");
}
void menu()
{
	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;
}
void DeletePerson(struct Addressbooks* ps)
{
	//判断通讯录是不是存在数据
	if (ps->size == 0) {
		cout << "没有联系人数据,请添加后重试" << endl;
		system("pause");
		system("cls");
		return;
	}
	string name;
	cout << "输入要删除的联系人" << endl;
	cin >> name;
	int flag = CheckHave(ps, name);
	if (flag == -1)
	{
		cout << "当前通讯录没有此联系人" << endl;
		return;
	}
	else
	{
		int cur = flag;
		while (cur < ps->size)
		{
			ps->personAddress[cur] = ps->personAddress[cur + 1];
			cur++;
		}
		ps->size--;
		cout << "删除成功" << endl;
	}
}
void addPerson(struct Addressbooks* ps)
{
	// 判读通讯录是否已经满了
	if (ps->size == MAX)
	{
		cout << "通讯录已满" << endl;
		system("pause");
		system("cls");
		return;
	}
	cout << "输入一个姓名" << endl;
	string name;
	cin >> name;
	ps->personAddress[ps->size].name = name;
	while (1) {
		cout << "输入性别" << endl;
		string gender;
		cin >> gender;
		if (!(gender == "男" || gender == "女"))
		{		//0                  -1
			cout << "性别错误 输入 0 退出 1 重新输入" << endl;
			int flag;
			cin >> flag;
			if (!flag) {
				return;
			}
			else {
				continue;
			}
		}
		ps->personAddress[ps->size].gender = gender;
		break;
	}
	while (1) {
		cout << "输入年龄" << endl;
		int age;
		cin >> age;
		if (age < 0 || age>150)
		{
			cout << "年龄错误 输入 0 退出 1 重新输入" << endl;
			int flag;
			cin >> flag;
			if (!flag) {
				break;
			}
			else {
				continue;
			}
		}
		ps->personAddress[ps->size].age = age;
		break;
	}
	while (1) {
		cout << "输入电话号码" << endl;
		string phone;
		cin >> phone;
		if (phone.length() != 11)
		{
			cout << "电话号码的长度错误 输入 0 退出 1 重新输入" << endl;
			int flag;
			cin >> flag;
			if (!flag) {
				break;
			}
			else {
				continue;
			}
		}
		ps->personAddress[ps->size].phone = phone;
		break;
	}
	cout << "输入地址" << endl;
	string address;
	cin >> address;
	ps->personAddress[ps->size].address = address;
	ps->size++;
	cout << "添加成功" << endl;
	system("pause");
	system("cls");
}
void upDataPerson(struct Addressbooks* ps) {
	string name;
	cout << "输入要修改的联系人" << endl;
	cin >> name;
	int flag = CheckHave(ps, name);
	if (flag == -1)
	{
		cout << "当前通讯录没有此联系人" << endl;
		system("pause");
		system("cls");
		return;
	}
	else {
		int temp;
		cout << "输入 1 修改姓名" << endl;
		cout << "输入 2 修改地址" << endl;
		cout << "输入 3 修改年龄" << endl;
		cout << "输入 4 修改电话" << endl;
		cout << "输入 5 修改性别" << endl;
		cin >> temp;
		switch (temp) {
		case 1: {
			//修改姓名
			cout << "输入新的姓名" << endl;
			string name;
			cin >> name;
			ps->personAddress[flag].name = name;
			cout << "修改成功" << endl;
			break;
		}
		case 2: {
			//修改地址
			cout << "输入新的地址" << endl;
			string address;
			cin >> address;
			ps->personAddress[flag].address = address;
			cout << "修改成功" << endl;
			break;
		}
		case 3:
		{
			//修改年龄

			while (1) {
				cout << "输入新的年龄" << endl;
				int age;
				cin >> age;
				if (age < 0 || age>150)
				{
					cout << "年龄错误 输入 0 退出 1 重新输入" << endl;
					int t;
					cin >> t;
					if (!t) {
						break;
					}
					else {
						continue;
					}
				}
				ps->personAddress[flag].age = age;
				cout << "修改成功" << endl;
				break;
			}
			break;
		}
		//修改电话

		case 4: {
			while (1) {
				cout << "输入新的电话号码" << endl;
				string phone;
				cin >> phone;
				if (phone.length() != 11)
				{
					cout << "电话号码的长度错误 输入 0 退出 1 重新输入" << endl;
					int t;
					cin >> t;
					if (!t) {
						break;
					}
					else {
						continue;
					}
				}
				ps->personAddress[flag].phone = phone;
				cout << "修改成功" << endl;
				break;
			}
			break;
		}
			  //修改性别
		case 5: {
			while (1) {
				cout << "输入新的性别" << endl;
				string gender;
				cin >> gender;
				if (!(gender == "男" || gender == "女"))
				{		//0                  -1
					cout << "性别错误 输入 0 退出 1 重新输入" << endl;
					int t;
					cin >> t;
					if (!t) {
						return;
					}
					else {
						continue;
					}
				}
				ps->personAddress[flag].gender = gender;
				cout << "修改成功" << endl;
				break;
			}
			break;
		}
		default: {
			cout << "没有此选项" << endl;
			break;
		}
		}
	}
	system("pause");
	system("cls");
}
void cleanPerson(struct Addressbooks* ps)
{
	//删除所有
	ps->size = 0;
	cout << "通讯录已清空" << endl;
	system("pause");
	system("cls");
}

测试:

#include"TelPhone.h"
int main()
{
	Addressbooks abs;
	abs.size = 0;
	int select = 0;
	while (true)
	{
		menu();

		cin >> select;

		switch (select)
		{
		case 1:  //添加联系人
			addPerson(&abs);
			break;
		case 2:  //显示联系人
			print(&abs);
			break;
		case 3:  //删除联系人
			DeletePerson(&abs);
			break;
		case 4:  //查找联系人
			SelectPerson(&abs);
			break;
		case 5:  //修改联系人
			upDataPerson(&abs);
			break;
		case 6:  //清空联系人
			cleanPerson(&abs);
			break;
		case 0:  //退出通讯录
			cout << "欢迎下次使用" << endl;
			return 0;
			break;
		default:
			break;
		}
	}
	return 0;
}

标签:ps,cout,实现,C++,flag,通讯录,size,personAddress,name
From: https://blog.csdn.net/2301_82086893/article/details/143467838

相关文章

  • 【论文复现】神经网络的公式推导与代码实现
    ......
  • 封装红黑树实现mymap和myset
    前面我们已经了解过红黑树如何实现,和map与set的基本用法;要继续深入了解map,set中的库函数的用法,与细节那么我们就可以试着简单用语言封装模拟实现一下map与set; 这里就分享一下我的思路;若没了解过红黑树如何实现,和map与set的基本用法建议先去了解一下哦;我之前的文章中就有。......
  • FastAPI 路径参数详解:动态路径与数据校验的灵活实现
    FastAPI路径参数详解:动态路径与数据校验的灵活实现本文全面介绍了在FastAPI中使用路径参数的技巧和实现方式。路径参数允许API动态响应不同路径中的请求信息,结合URL(UniformResourceLocator)和URI(UniformResourceIdentifier)进行资源定位和标识。URL是指资源的完......
  • C++——二叉树(进阶)
    1.二叉搜索树1.1概念二叉搜索树又称二叉排序树,它或是一棵空树,又或是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二......
  • .NET云原生应用实践(五):使用Blazor WebAssembly实现前端页面
    本章目标使用BlazorWebAssembly实现管理“贴纸”页面集成认证与授权机制如果你对BlazorWebAssembly的使用不感兴趣,可以跳过本章的阅读。你也可以使用自己熟悉的前端技术完成案例的界面部分,之前我们开发的后端API比较简单,所以自己实现一套前端界面并不会是一个困难的事情。......
  • 洛谷熟悉语法(C++)
    目录过河卒问题思路一思路二过河卒问题该题链接如下https://www.luogu.com.cn/problem/P1002,是一道很基础的动态规划题,观察题目要求,内存限制125MB,而时间限制为1.00s。思路一使用递归,即$f(i,j)=f(i-1,j)+f(j-1,i)$,同时注意判断可以被马吃的地方有$f(i,j)=0$。具体代码如下://ht......
  • 实现元素全排列
    嗯……继我的启蒙算法实现求集合的子集后,又总结一种类似的常用的算法(我觉得,不接受反驳)。同样的,有递归和非递归两种方法代码如下:importjava.util.ArrayList;importjava.util.List;publicclassArraysArrange{publicstaticvoidmain(String[]args){i......
  • 老鹰抓小鸡C++
    题目描述热热和乎乎等n位小朋友玩老鹰抓小鸡的游戏,狐狸老师当老鹰,排在第一位的小朋友当“母鸡”,其他4小朋友当“小鸡”。但是“母鸡”很辛苦,所以过一段时间“母鸡”需要排到队伍最后成为“小鸡”,让第二位小朋友当“母鸡”······试编一程序,模拟k次位置变化的过程。初始位......
  • 有序数列合并C++
    将两个数列合并为一个数列,并从小到大排序题目描述输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。输入描述输入包含三行,第一行包含两个正整数n,m(1≤n,m≤100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。......
  • C++ STL常用容器之set
    文章目录一、集合set二、所需的头文件三、基本访问操作3.1插入元素3.2删除元素3.3查找元素3.4其他函数四、无序集合unordered_set五、multiset六、unordered_multiset七、使用set容器八、map与set的区别一、集合setset称为集合,是一个内部自动有序且不含重复元素......