c++从入门到实战,通讯录项目
从入门到实战,应该是每位程序小白必须经历的一个过程。刚入门时觉得很基础很简单,程序无非是由判断语句、循环语句、数学运算,再加上函数、结构体、类等构成。也许稍微难一点点的就只有指针了。然而真正尝试着手一个项目时,才发现程序虽由哪些最基本的元素构成却可以有千变万化的组合。真正尝试实操一个项目对一个小白而言其实至关重要的。下面是我个人在学习通讯录项目实操后的总结,也希望能对大家有帮助。
注意:本文为自己学习c++的总结与归纳,课程为哔哩哔哩上up主 黑马程序员 的课程
点击此处跳转至课程
项目介绍及准备工作
通讯录项目要具体实现以下功能
- 添加联系人
- 显示联系人
- 删除联系人
- 查找联系人
- 修改联系人
- 清空联系人
- 退出通讯录
下面将逐一介绍各个功能实现的具体方法
搭建结构体
在这之前先搭好一个框架,设计一个联系人的结构体(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.添加联系人
- 添加函数
- 引用函数
为了可以改变实参(更改通讯录不可能只更改函数中的)我们向函数中传递指针。
//添加联系人
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;
break;
最后在相应的case后调用相应的函数即可!
感谢阅读。