c++从入门到实战,通讯录项目

c++从入门到实战,通讯录项目

在这里插入图片描述

从入门到实战,应该是每位程序小白必须经历的一个过程。刚入门时觉得很基础很简单,程序无非是由判断语句、循环语句、数学运算,再加上函数、结构体、类等构成。也许稍微难一点点的就只有指针了。然而真正尝试着手一个项目时,才发现程序虽由哪些最基本的元素构成却可以有千变万化的组合。真正尝试实操一个项目对一个小白而言其实至关重要的。下面是我个人在学习通讯录项目实操后的总结,也希望能对大家有帮助。

注意:本文为自己学习c++的总结与归纳,课程为哔哩哔哩上up主 黑马程序员 的课程

点击此处跳转至课程

项目介绍及准备工作

通讯录项目要具体实现以下功能

  1. 添加联系人
  2. 显示联系人
  3. 删除联系人
  4. 查找联系人
  5. 修改联系人
  6. 清空联系人
  7. 退出通讯录

下面将逐一介绍各个功能实现的具体方法

搭建结构体

在这之前先搭好一个框架,设计一个联系人的结构体(person),并再设计一个包含联系人结构体的通讯录结构体(Addressbooks),其中包含一个联系人数组。

#include<iostream>
using namespace std;
#include<string>//添加string的头文件
#define MAX 1000 //定义一个宏常量
struct person 
{
	string m_Name;//姓名
	int m_Sex ;//性别
	int m_Age ;//年龄
	string m_Phone;//电话
	string m_Address;//住址
};
//结构体的嵌套
struct Addressbooks
{
	struct person personArray[MAX];//数组个数上限为1000
	int m_size;//负责记录联系人的个数,以及通过序号实现数组的一些操作。
};

菜单列表


//封装一个显示菜单的函数。
void 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;
	//添加联系人显示联修改联系人退出通讯录
}
//星号是为了美观

主函数中的循环与选择功能

每实现一个功能后不可能立马退出,而应返回菜单界面。这时就应该使用while语句实现循环,即一旦break就返回菜单界面即showMenu。而实现相应的功能就应由操作者自己选择,这是程序应可以根据不同选择实现不同的循环语句。这里我们使用switch语句。让用户自己输入菜单内容而实现相应的功能。

int main() 
{
	struct Addressbooks abs;//创建Addressbooks结构体的实例
	abs.m_size = 0;  //初始化m_size的值
	while (true)
    {
		showMenu();//调用显示菜单函数。
		int select = 0;
		cin >> select;
		switch (select) 
        {
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
        case 0:
            break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

1.添加联系人

  1. 添加函数
  2. 引用函数

为了可以改变实参(更改通讯录不可能只更改函数中的)我们向函数中传递指针。

//添加联系人
void addPerson(Addressbooks* abs) //传递指针可改变实参
{
	//判断联系人是否已满
	if (abs->m_size == MAX) {
		cout << "通讯录已满,已无法添加。" << endl;
		return;

	}
	else {
		//添加具体联系人
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[abs->m_size].m_Name = name;
		//性别
		int sex = 0;
			while (true) //循环防止操作者乱填误填
            {
				cout << "请输入性别:" << endl;
				cout << "男——1" << endl;
				cout << "女——0" << endl;
				cin >> sex;
				if (sex == 0 || sex == 1) 
                {
					abs->personArray[abs->m_size].m_Sex = sex;
					break;
				}
				cout << "输入有误请重新输入。" << endl;
			}
		//年龄
		int age = 0;
		cout << "请输入年龄:" << endl;
		cin >> age;
		abs->personArray[abs->m_size].m_Age = age;
		//电话
		string phone;
		cout << "请输入电话号码:" << endl;
		cin >> phone;
		abs->personArray[abs->m_size].m_Phone = phone;
		//住址
		string address;
		cout << "请输入地址:" << endl;
		cin >> address;
		abs->personArray[abs->m_size].m_Address = address;
		
	}
	abs->m_size++;//实现通讯录人数与m_size记录同步
	cout << "添加成功" << endl;
	system("pause");//请按任意键继续。
	system("cls");//清屏操作。
}

2.显示联系人

这个只需逐一输出即可,英文sex的实质是整型,所以通过三目运算符输出对应的男和女。中间较长应加上括号否则会报错。

//显示联系人
void showPerson(Addressbooks*abs)
{
	//判断通讯录中人数是否为0
	if (abs->m_size == 0) {
		cout << "您的通讯录联系人为零" << endl;
	}
	else {
		for (int i = 0;i < abs->m_size; i++) {
			cout << "姓名:  " << abs->personArray[i].m_Name<<"\t" ;
			cout << "性别:  " << (abs->personArray[i].m_Sex==1?"男":"女")<<"\t" ;//三目运算符
			cout << "年龄:  " << abs->personArray[i].m_Age<<"\t" ;
			cout << "电话:  " << abs->personArray[i].m_Phone<<"\t" ;
			cout << "地址:  " << abs->personArray[i].m_Address<<endl;
		}
	}
	system("pause");//请按任意键继续。
	system("cls");//清屏操作。
}

3.删除联系人

分为两步 检验与删除。用两个不同的函数表示。生活中我们主要通过姓名删除一个联系人。这里我们首先通过姓名判断联系人是否存在

但我们并不好通过姓名去进行删除操作,所有返回值i更方便我们进行操作。

c++中没用直接的删除操作

我们的思路是让要删除的元素后面的元素不断向前赋值,达到覆盖删除的目的。

//检测联系人是否存在
int isExist(Addressbooks * abs,string name)
{
	for (int i = 0;i < abs->m_size;i++)
	{
		if (name == abs->personArray[i].m_Name) 
        {
			return i;//找到了返回i
		}
		return -1;//如果没找到则返回一个-1
	}
}
//删除联系人。
void deletePerson(Addressbooks* abs) 
{
	cout << "请输入要删除的联系人" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) 
    {
		for (int i = ret;i < abs->m_size;i++) 
        {
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_size--;
		cout << "删除成功" << endl;
	}
	else 
    {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

4.查找联系人

包括判断与输出操作。

//查找联系人
void findPerson(Addressbooks* abs) {
	cout << "请输入你要查找的联系人" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) //找到了
	{
		cout << " 姓名: " << abs->personArray[ret].m_Name << "\t";
		cout << " 性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << " 年龄: " << abs->personArray[ret].m_Age << "\t";
		cout << " 住址: " << abs->personArray[ret].m_Address << "\t";
		cout << " 电话: " << abs->personArray[ret].m_Phone<< "\t";
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

5.修改联系人

也是通过姓名查找序号在全部重新赋值。

易错点:在modifyPerson函数中的abs是形式参数且是指针,所以调用isExsit函数时要用abs而不是&abs

//修改指定联系人信息
void modifyPerson(Addressbooks* abs) {
	cout << "请输入你要查找的联系人" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		string name;
		cout << "请重新输入姓名" << endl;
		cin >> name;
		abs->personArray[ret].m_Name = name;
		int sex = -1;
		cout << "请重新输入性别" << endl;
		cout << "男——1" << endl;
		cout << "女——0" << endl;
		cin >> sex;
		while (true) 
		{
			if (sex == 1 || sex == 0) {
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			cout << "输入错误请重新输入" << endl;
		}
		int age;
		cout << "请重新输入年龄" << endl;
		cin >> age;
		abs->personArray[ret].m_Age = age;
		string address;
		cout << "请重新输入住址" << endl;
		cin >> address;
		abs->personArray[ret].m_Address = address;
		string phone;
		cout << "请重新输入电话" << endl;
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;
		cout << "修改成功" << endl;
	}
	else 
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

6.清空联系人

其实并不用循环来一个个删除每一个元素

只需将m_size赋值为0即可

//清空联系人
void cleanPerson(Addressbooks* abs) {
	abs->m_size = 0;
	cout<<"通讯录已清空"<<endl;
	system("pause");
	system("cls");
}

7.退出通讯录

可直接在main函数中书写。

case 0:
    //0、退出通讯录
	cout << "欢迎使用通讯录功能" << endl;
	system("pause");
	return 0;
	/*出现return 0
	即表明main函数中的代码运行结束*/
	break;

最后在相应的case后调用相应的函数即可!

感谢阅读。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_49405576/article/details/108472681