案例之通讯录管理系统:
之前学习了C++的一些基本语法用法,这一章节会利用之前学习过的知识,做一个通讯录管理系统。
系统需要实现的功能:
- 添加联系人:信息包括姓名、性别、年龄、电话和家庭住址,最多1000人
- 显示联系人:显示通讯录中所有联系人信息。
- 删除联系人:按照姓名进行删除联系人。
- 查找联系人:按照姓名查看指定的联系人信息。
- 修改联系人:按照姓名重新修改指定联系人。
- 清空联系人:清空通讯录中所有信息。
- 退出通讯录:退出当前使用的通讯录。
func.h文件:
#pragma once
#include<iostream>
#include<string>
#define MAXSIZE 100
using namespace std;
//定义联系人结构体
typedef struct person
{
string name;
int m_sex;//性别:1.男。2.女
int m_age;
string m_phone;
string m_address;
}person;
// 定义通讯结构体
typedef struct Addressbooks
{
int size;//联系人个数
person personArray[MAXSIZE];
}Addressbooks;
//显示菜单
void showMenu();
//添加联系人
void Addperson(Addressbooks* abs);
//显示联系人
void showperson(const Addressbooks* abs);
//检测联系人是否存在,如果存在,返回联系人在数组的下标,不存在返回-1;
int isExist(const Addressbooks* abs,string name);
//删除联系人
void deleteperson(Addressbooks* abs);
//查找联系人
void getperson(const Addressbooks* abs);
//修改联系人
void modifyperson(Addressbooks* abs);
//清空通讯录
void cleanperson(Addressbooks* abs);
func.cpp文件
#include"func.h"
//显示菜单
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(Addressbooks* abs)
{
if (abs->size == MAXSIZE)
{
cout << "通讯录已满" << endl;
return;
}
string name;
int sex;
cout << "请输入姓名:" << endl;
cin >> name;
abs->personArray[abs->size].name = name;
cout << "请输入性别:" << endl;
cout << "1--男,2--女:" << endl;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->size].m_sex=sex;
break;
}
else
{
cout << "输入有误,请重新输入性别:" << endl;
cout << "1--男,2--女:" << endl;
}
}
int age;
cout << "请输入年龄:" << endl;
while (true)
{
cin >> age;
if (age > 0 && age < 100)
{
abs->personArray[abs->size].m_age = age;
break;
}
else
{
cout << "输入有误,请重新输入年龄:" << endl;
}
}
string phonenumbers;
cout << "请输入电话号码:" << endl;
cin >> phonenumbers;
abs->personArray[abs->size].m_phone = phonenumbers;
cout << "请输入住址:" << endl;
string address;
cin >> address;
abs->personArray[abs->size] .m_address = address;
cout << "添加联系人成功" << endl;
abs->size++;
system("pause");//请按任意键继续
system("cls");//清屏操作
return;
}
//显示所有联系人
void showperson(const Addressbooks* abs)
{
//联系了是否为空
if (abs->size == 0)
{
cout << "通讯录为空" << endl;
system("pause");//请按任意键继续
system("cls");//清屏操作
return;
}
for (int i = 0; i < abs->size; i++)
{
cout << "姓名: " << abs->personArray[i].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");//清屏操作
return;
}
//检测联系人是否存在,如果存在,返回联系人在数组的下标,不存在返回-1;
int isExist(const Addressbooks* abs, string name)
{
int i = -1;//i初始值为-1
for (int j = 0; j < abs->size; j++)
{
if (name == abs->personArray[j].name)
{
i = j;
break;
}
}
return i;
}
//删除联系人
void deleteperson(Addressbooks* abs)
{
if (abs->size == 0)
{
cout << "通讯录为空" << endl;
}
else
{
cout << "请输入删除联系人姓名" << endl;
string name;
cin >> name;
int key = isExist(abs, name);
if (key == -1)
{
cout << "查无此人" << endl;
}
else
{
for (int i = key; i < abs->size - 1; i++)
{
abs->personArray[i] = abs->personArray[i + 1];//key之后所有元素前移一位
}
abs->size--;//人员个数减一
cout << "成功删除姓名为:" << name << "的联系人" << endl;
}
}
system("pause");//请按任意键继续
system("cls");//清屏操作
return ;
}
//查找联系人
void getperson(const Addressbooks* abs)
{
if (abs->size == 0)
{
cout << "通讯录为空" << endl;
}
else
{
cout << "请输入查找联系人姓名" << endl;
string name;
cin >> name;
int key = isExist(abs, name);
if (key == -1)
{
cout << "查无此人" << endl;
}
else
{
cout << "成功查找姓名为:" << name << "的联系人" << endl;
cout << "姓名: " << abs->personArray[key].name << "\t";
cout << "性别: " << (abs->personArray[key].m_sex == 1 ? "男" : "女") << "\t";
cout << "年龄: " << abs->personArray[key].m_age << "\t";
cout << "电话: " << abs->personArray[key].m_phone << "\t";
cout << "住址: " << abs->personArray[key].m_address << endl;
}
}
system("pause");//请按任意键继续
system("cls");//清屏操作
return;
}
//修改联系人
void modifyperson(Addressbooks* abs)
{
if (abs->size == 0)
{
cout << "通讯录为空" << endl;
}
else
{
cout << "请输入想要修改联系人姓名" << endl;
string name;
cin >> name;
int key = isExist(abs, name);
if (key == -1)
{
cout << "查无此人" << endl;
}
else
{
cout << "请输入需要修改的信息" << endl;
cout << "请重新输入姓名:" << endl;
cin >> name;
abs->personArray[key].name = name;
cout << "请重新输入性别:" << endl;
cout << "1--男,2--女:" << endl;
int sex;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[key].m_sex = sex;
break;
}
else
{
cout << "输入有误,请重新输入性别:" << endl;
cout << "1--男,2--女:" << endl;
}
}
int age;
cout << "请重新输入年龄:" << endl;
while (true)
{
cin >> age;
if (age > 0 && age < 100)
{
abs->personArray[key].m_age = age;
break;
}
else
{
cout << "输入有误,请重新输入年龄:" << endl;
}
}
string phonenumbers;
cout << "请重新输入电话号码:" << endl;
cin >> phonenumbers;
abs->personArray[key].m_phone = phonenumbers;
cout << "请重新输入住址:" << endl;
string address;
cin >> address;
abs->personArray[key].m_address = address;
cout << "修改联系人信息成功" << endl;
}
}
system("pause");//请按任意键继续
system("cls");//清屏操作
return;
}
//清空通讯录
void cleanperson(Addressbooks* abs)
{
if (abs->size == 0)
{
cout << "通讯录为空" << endl;
}
int select;
cout << "请输入是否要清空:";
cout << "1——是,2——否" << endl;
while (true)
{
cin >> select;
if (1 == select)
{
abs->size = 0;//size置为0,做逻辑清空
cout << "成功清空通讯录" << endl;
break;
}
else if (2 == select)
{
cout << "您选择不清空通讯录" << endl;
break;
}
else
{
cout << "您的输入有误,请重新输入是否要清空:";
cout << "1——是,2——否" << endl;
}
}
system("pause");//请按任意键继续
system("cls");//清屏操作
return;
}
通讯录管理系统.cpp文件
#include"func.h"
int main()
{
//创建通讯录:
Addressbooks abs;
abs.size = 0;
int select=0;
while (true)
{
showMenu();
cout << "请输入您的选择" << endl;
cin >> select;
switch (select)
{
case 0:
//退出系统
cout << "欢迎下次使用" << endl;
return 0;
break;
case 1:
//插入联系人
Addperson(&abs);
break;
case 2:
//显示所有联系人
showperson(&abs);
break;
case 3:
//删除联系人
deleteperson(&abs);
break;
case 4:
//查找联系人
getperson(&abs);
break;
case 5:
//修改联系人
modifyperson(&abs);
break;
case 6:
//清空通讯录
cleanperson(&abs);
break;
default:
cout << "请输入合法的选择" << endl;
break;
}
}
}
C++核心编程:
本阶段主要针对C++面向对象编程技术的详细讲解,探讨C++中的核心和精髓。
八、程序内存模型
8.1、内存分区模型
C++程序在执行时,将内存大方向上分为4个区域:
- 代码区:存放函数体的二进制代码,由操作系统进行管理。
- 全局区:存放全局变量和静态变量和常量。
- 栈区:有编译器自动分配释放,存放函数的参数值、局部变量等。
- 堆区:由程序员分配和释放。若程序员不释放,程序结束时由操作系统回收。
内存四区的意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。
8.1.1、程序运行前:
在程序编译后,生成了exe可执行程序,未执行程序前分为两个区域
代码区:
存放CPU执行的机器指令
代码区特点:共享——对于频繁被执行的程序,内存中有一份代码即可。
只读——防止程序意外的修改了它的指令、
全局区:
全局变量和静态变量存放在此
全局区还包含了常量区,字符串常量和其他常量也存放在此。
改区域的数据在程序结束后由操作系统释放。
全局变量的声明:在函数之外声明的变量
静态变量的声明:在普通变量前加上static。
static 数据类型 变量名= 变量值;
常量:
字符串常量:使用" "引用的字符串。
const修饰的常量:
const修饰的全局变量:存放在全局区
const修饰的局部变量:存放在栈区
8.1.2、程序运行后
栈区:
由编译器自动分配释放,存放函数的参数值和局部变量等。
注意事项:不要返回局部变量的地址,栈区开辟的数据在函数执行完后由编译器自动释放。
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。
在C++中主要利用new关键字在堆区开辟内存。
使用delete关键字释放new开辟的空间
8.1.3、new关键字和delete关键字
new 数据类型。利用new创建的数据,会返回改数据类型对应的指针。
基本示例:
#include<iostream>
using namespace std;
int* func()
{
int *p = new int(10);//new返回该数据类型的指针
return p;
}
void test01()
{
int* p = func();
cout << *p << endl;
cout << *p << endl;
delete p;
//cout << *p << endl;//内存已经释放,再次访问报错
}
void test02()
{
//创建10个整型数据的数组
int* parr = new int[10];
for (int i = 0; i < 10; i++)
{
parr[i] = i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << parr[i] << endl;
}
//释放堆区数组
delete[] parr;
}
int main()
{
//test01();
test02();
return 0;
}