引言
这个小项目是基于C++基础语法实现的,主要为了深入掌握C++基础语法而做的一个入门级小项目。主要参考了黑马程序员的C++教程,下面是黑马程序员的C++教学视频链接。
黑马程序员C++教程
系统功能介绍
本系统需要实现的功能如下:
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
除以上功能外,程序中还要定义两个结构体,一个是联系人结构体,一个是通讯录结构体。此外还有两个辅助函数,一个用来判断联系人是否存在,如果存在返回下标,否则返回-1;另一个是修改联系人信息功能时显示的界面。
程序中用到的C++知识有数组,switch case,for循环,while,结构体,宏定义,指针等。
功能实现
联系人结构体
struct Person
{
string m_Name; //名字
int m_Sex; //性别
int m_Age; //年龄
string m_Phone; //电话
string m_Addr; //地址
};
通讯录结构体
struct MailList
{
struct Person personArray[MAX]; //通讯录中保存的联系人数组
int m_Size; //通讯录中当前记录的联系人个数
};
辅助函数
在此遍历整个通讯录,按名字查找,如果找到了就返回数组下标,否则返回-1
//判断联系人是否存在
int isExist(MailList* abs, string name)
{
for (int i = 0; i < abs->m_Size; i++) {
if (abs->personArray[i].m_Name == name) return i;
}
return -1;
}
//显示修改联系人的界面
void showmenu()
{
cout << "请输入要修改的地方:" << endl;
cout << "1.姓名" << "\t";
cout << "2.性别" << "\t";
cout << "3.年龄" << "\t";
cout << "4.电话" << "\t";
cout << "5.地址" << "\t";
cout << "6.保存修改" << endl;
}
菜单功能
//显示菜单
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;
}
添加联系人
在添加前要判断联系人是否已满,满了就不添加,否则添加信息。在添加性别的时候要注意,因为是按1或2来判断是男性还是女性,所以在输入其他数字时不做反应,直到输入1或2.添加完联系人的所有信息后要记得更新通讯录中的联系人个数。
//添加联系人
void addPerson(MailList* abs)
{
//判断联系人是否已满
if (abs->m_Size == MAX) {
cout << "联系人已满,无法添加!";
system("pause");
system("cls");
return;
}
//添加联系人
string name; //添加姓名
cout << "请输入姓名:";
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
int sex = 0; //添加性别
while (true) {
cout << "请输入性别(1-男|2-女):";
cin >> sex;
if (sex == 1 || sex == 2) {
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
}
int age; //添加年龄
cout << "请输入年龄:";
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
string phone; //添加电话
cout << "请输入电话:";
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
string addr; //添加地址
cout << "请输入地址:";
cin >> sex;
abs->personArray[abs->m_Size].m_Addr = addr;
abs->m_Size++; //更新通讯录人数
cout << "添加成功!" << endl;
system("pause");//按任意键继续
system("cls"); //清屏
}
显示联系人
显示联系人之前要确保通讯录中有联系人才能显示。
//显示联系人
void showPerson(MailList* abs)
{
//判断当前通讯录是否存在联系人
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_Addr << endl;
}
}
system("pause");//按任意键继续
system("cls"); //清屏
}
删除联系人
删除联系人要确保通讯录中有联系人可以删除,删除后要记得将通讯录中的联系人个数减一。在for循环里面有个注意的点,就是i等于通讯录的size-1时,程序会报错,因为数组会越界。但是一开始通讯录的大小初始化为1000,正常情况下通讯录是达不到1000的,所以这里可以忽略这个问题。
//删除联系人
void deletePerson(MailList* abs)
{
string name;
cout << "请输入要删除的人:";
cin >> name;
int ret = isExist(abs, name);
int k = abs->m_Size - 1;
if (ret == -1) cout << "查无此人!" << endl;
else {
for (int i = ret; i < abs->m_Size; i++) {
abs->personArray[i] = abs->personArray[i + 1];
}
abs->m_Size--;
cout << "删除成功!" << endl;
}
system("pause");//按任意键继续
system("cls"); //清屏
}
查找联系人
查找联系人同样要确保通讯录中联系人才能查找。
//查找联系人
void findPerson(MailList* abs)
{
string name;
cout << "请输入要查找的人:";
cin >> name;
int ret = isExist(abs, name);
if (ret == -1) cout << "查无此人!" << endl;
else {
for (int i = 0; i < abs->m_Size; i++) {
if (i == ret) {
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_Addr << endl;
break;
}
}
}
system("pause");//按任意键继续
system("cls"); //清屏
}
修改联系人
修改联系人时要用到辅助函数来显示修改联系人的界面,通过该界面来确定具体要修改的是哪部分的信息。这里和黑马程序员是不一样的,这里按下6键即是修改成功。
//修改联系人
void changePerson(MailList* abs)
{
string name;
cout << "请输入要修改的联系人:";
cin >> name;
int ret = isExist(abs, name);
if (ret == -1) cout << "查无此人!" << endl;
else {
int sel = 0;
while (true) {
showmenu();
cin >> sel;
switch (sel) {
case 1: {
string n;
cout << "请输入姓名:";
cin >> n;
abs->personArray[ret].m_Name = n;
break;
}
case 2: {
int s;
cout << "请输入性别:";
cin >> s;
abs->personArray[ret].m_Sex = s;
break;
}
case 3: {
int a;
cout << "请输入年龄:";
cin >> a;
abs->personArray[ret].m_Age = a;
break;
}
case 4: {
string p;
cout << "请输入电话:";
cin >> p;
abs->personArray[ret].m_Phone = p;
break;
}
case 5: {
string r;
cout << "请输入地址:";
cin >> r;
abs->personArray[ret].m_Addr = r;
break;
}
case 6:
cout << "修改成功!" << endl;
system("pause");
system("cls");
return;
default:
system("pause");
system("cls");
break;
}
}
}
system("pause");//按任意键继续
system("cls"); //清屏
}
清空通讯录
清空通讯录实际上是逻辑上的清空,并不是通讯录中的联系人信息被删除,而是将通讯录的联系人个数直接赋为0,实质上是将信息对外隐藏,但通讯录中的结构体数组的联系人信息还是存在的。
//清空通讯录
void clearPerson(MailList* abs)
{
abs->m_Size = 0;
cout << "通讯录已清空!" << endl;
system("pause");//按任意键继续
system("cls"); //清屏
}
注意
本项目的函数基于规范为将声明写在头文件,将定义写在源文件。其中结构体的声明和定义要注意,在头文件中要先像下面这样写
typedef struct MailList MailList;
然后在源文件中定义,不然在头文件中声明函数会报错。因为函数中的参数是用到结构体的,在头文件中无法识别到结构体。
还有使用switch case时要注意在case中定义变量要加上{ },不然会报错。
源码
头文件
#pragma once
#include <iostream>
#include <string>
using namespace std;
typedef struct MailList MailList;
void showMenu(); //显示菜单
void addPerson(MailList* abs); //添加联系人
int isExist(MailList* abs, string name);//判断联系人是否存在
void showPerson(MailList* abs); //显示联系人
void deletePerson(MailList* abs); //删除联系人
void findPerson(MailList* abs); //查找联系人
void showmenu(); //显示修改联系人的界面
void changePerson(MailList* abs); //修改联系人
void clearPerson(MailList* abs); //清空通讯录
源文件
#include "List.h"
#define MAX 1000
//联系人结构体
struct Person
{
string m_Name; //名字
int m_Sex; //性别
int m_Age; //年龄
string m_Phone; //电话
string m_Addr; //地址
};
//通讯录结构体
struct MailList
{
struct Person personArray[MAX]; //通讯录中保存的联系人数组
int m_Size; //通讯录中当前记录的联系人个数
};
int main()
{
MailList abs; //创建通讯录结构体变量
abs.m_Size = 0; //初始化通讯录人数
int select = 0;//用户输入的变量
while (true) {
showMenu(); //显示菜单
cin >> select; //输入选项
switch (select) {
case 1:
addPerson(&abs); //添加联系人
break;
case 2:
showPerson(&abs); //显示联系人
break;
case 3:
deletePerson(&abs); //删除联系人
break;
case 4:
findPerson(&abs); //查找联系人
break;
case 5:
changePerson(&abs); //修改联系人
break;
case 6:
clearPerson(&abs); //清空通讯录
break;
case 0: //退出功能
cout << "再见!" << endl;
system("pause");
return 0;
default:
system("pause");
system("cls");
break;
}
}
}
//显示菜单
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;
}
//添加联系人
void addPerson(MailList* abs)
{
//判断联系人是否已满
if (abs->m_Size == MAX) {
cout << "联系人已满,无法添加!";
system("pause");
system("cls");
return;
}
//添加联系人
string name; //添加姓名
cout << "请输入姓名:";
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
int sex = 0; //添加性别
while (true) {
cout << "请输入性别(1-男|2-女):";
cin >> sex;
if (sex == 1 || sex == 2) {
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
}
int age; //添加年龄
cout << "请输入年龄:";
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
string phone; //添加电话
cout << "请输入电话:";
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
string addr; //添加地址
cout << "请输入地址:";
cin >> sex;
abs->personArray[abs->m_Size].m_Addr = addr;
abs->m_Size++; //更新通讯录人数
cout << "添加成功!" << endl;
system("pause");//按任意键继续
system("cls"); //清屏
}
//判断联系人是否存在
int isExist(MailList* abs, string name)
{
for (int i = 0; i < abs->m_Size; i++) {
if (abs->personArray[i].m_Name == name) return i;
}
return -1;
}
//显示联系人
void showPerson(MailList* abs)
{
//判断当前通讯录是否存在联系人
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_Addr << endl;
}
}
system("pause");//按任意键继续
system("cls"); //清屏
}
//删除联系人
void deletePerson(MailList* abs)
{
string name;
cout << "请输入要删除的人:";
cin >> name;
int ret = isExist(abs, name);
int k = abs->m_Size - 1;
if (ret == -1) cout << "查无此人!" << endl;
else {
for (int i = ret; i < abs->m_Size; i++) {
abs->personArray[i] = abs->personArray[i + 1];
}
abs->m_Size--;
cout << "删除成功!" << endl;
}
system("pause");//按任意键继续
system("cls"); //清屏
}
//查找联系人
void findPerson(MailList* abs)
{
string name;
cout << "请输入要查找的人:";
cin >> name;
int ret = isExist(abs, name);
if (ret == -1) cout << "查无此人!" << endl;
else {
for (int i = 0; i < abs->m_Size; i++) {
if (i == ret) {
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_Addr << endl;
break;
}
}
}
system("pause");//按任意键继续
system("cls"); //清屏
}
//显示修改联系人的界面
void showmenu()
{
cout << "请输入要修改的地方:" << endl;
cout << "1.姓名" << "\t";
cout << "2.性别" << "\t";
cout << "3.年龄" << "\t";
cout << "4.电话" << "\t";
cout << "5.地址" << "\t";
cout << "6.保存修改" << endl;
}
//修改联系人
void changePerson(MailList* abs)
{
string name;
cout << "请输入要修改的联系人:";
cin >> name;
int ret = isExist(abs, name);
if (ret == -1) cout << "查无此人!" << endl;
else {
int sel = 0;
while (true) {
showmenu();
cin >> sel;
switch (sel) {
case 1: {
string n;
cout << "请输入姓名:";
cin >> n;
abs->personArray[ret].m_Name = n;
break;
}
case 2: {
int s;
cout << "请输入性别:";
cin >> s;
abs->personArray[ret].m_Sex = s;
break;
}
case 3: {
int a;
cout << "请输入年龄:";
cin >> a;
abs->personArray[ret].m_Age = a;
break;
}
case 4: {
string p;
cout << "请输入电话:";
cin >> p;
abs->personArray[ret].m_Phone = p;
break;
}
case 5: {
string r;
cout << "请输入地址:";
cin >> r;
abs->personArray[ret].m_Addr = r;
break;
}
case 6:
cout << "修改成功!" << endl;
system("pause");
system("cls");
return;
default:
system("pause");
system("cls");
break;
}
}
}
system("pause");//按任意键继续
system("cls"); //清屏
}
//清空通讯录
void clearPerson(MailList* abs)
{
abs->m_Size = 0;
cout << "通讯录已清空!" << endl;
system("pause");//按任意键继续
system("cls"); //清屏
}