【问题描述】通讯簿是一个线性表,可以存储一定数量的联系人记录,提供查找、插入、删除和修改等操作。通讯簿的特点是以查找为主要操作,要求快速查找到指定对象的位置,故宜采用具有随机访问功能的顺序表。
【数据结构】使用顺序表SeqList建立通讯簿。作为表项的联系人记录,至少应包括以下属性:
{ 序号,姓名,与本人关系,电话号码}
其中序号具有唯一性。序号和姓名可作为查找的主要关键字。与本人关系可枚举为“亲人”、“朋友”和“同事”,主要作用是为联系人分组,并作为次要关键字。
将上述联系人记录定义为一个结构(struct),在主程序中建立模板类顺序表SeqList的对象时用该结构实例化表结点的类型。
【主要功能】程序应为用户提供操作选择界面,必要的操作包括:查找某人电话号码,添加新记录,修改记录,删除记录,打印亲人清单、朋友清单或同事清单以及退出等。另外,为初始化方便,原始数据可存储在磁盘文件中。
【编程环境】visual studio 2023
- 控制台菜单:
部分功能截图:
头文件(通讯录.h)部分,包含全部内容的实现:
#pragma once
#include<iostream>
#include<stdlib.h>
#include<Windows.h>
using namespace std;
const int defaultSize = 100;
struct human {
int Id;
string Name; //姓名
string rela; //与本人关系
string phoneNum;//电话号码
};
class book {
protected:
human* Hum;
int size; //通讯录大小
int last; //当前已存表项的最后位置 从0开始
public:
book(int sz = defaultSize) {
if (sz > 0) { //通过指定参数sz定义数组长度
size = sz; last =0; //置表实际长度为空
Hum = new human[size]; //创建顺序表存储数组
if (sz == NULL) //动态分配失败
{
cerr << "动态分配错误!" << endl;
exit(1);
}
else
cout << "构建成功,当前通讯录可容纳 " << sz << " 人" << endl;
}
}
~book() { delete []Hum; }
void Insert(); //输入项目
void findNum();//查找某人电话
void showAll(); //显示所有记录
void showTong(); //显示所有同事
void showFamly(); //显示所有亲人
void showFriend(); //显示所有朋友
void menu(); //显示菜单
void endFunc(); //结束操作
void change(); //修改记录
void Delete(); //删除记录
void Del(int aimId); //打包删除部分代码
};
//打包删除部分代码/
void book::Del(int aimId)
{
cout << "是否确认删除该对象?" << endl;
cout << "1:是\t输入其他:否" << endl;
int i;
cin >> i;
if (i == 1)
{
if (last == 1)
{
last--;
cout << "删除成功,当前通讯录剩余" << last << "人" << endl;
return;
}
for (int j = aimId; j < last; j++)
Hum[j] = Hum[j + 1]; //前移填充
last--;
cout << "删除成功,当前通讯录剩余" << last << "人" << endl;
}
else {
menu();
}
}
/end of 删除部分代码//
//插入记录/
void book::Insert() {
if (last == size)
{
cout << "空间已满,无法插入!" << endl;
cout << "将在三秒后返回主菜单" << endl;
Sleep(3 * 1000);
menu();
}
string Name; //姓名
string rela; //与本人关系
string phoneNum;//电话号码
Hum[last].Id = last;
cout << "当前通讯录有 " << last << " 人"<<endl;
cout << "请输入第 " << last+ 1 << " 号联系人的姓名: ";
cin >> Name;
Hum[last].Name = Name;
cout << "请输入您与第 " << last + 1 << " 号联系人的关系: ";
cin >> rela ;
Hum[last].rela = rela;
cout << "请输入第 " << last + 1 << " 号联系人的联系电话: ";
cin >> phoneNum;
Hum[last].phoneNum = phoneNum;
last++;
cout << "当前通讯录有 " << last << " 人" << endl;
cout << "输入“1”返回菜单或输入“2”继续添加联系人" << endl;
int a;
cin >> a;
switch (a)
{
case(1):
menu();
break;
case(2):
Insert();
break;
}
}
///end of 插入记录//
/查找某人电话///
void book::findNum() {
string name; //需要查找的人的名字
reCin2: //goto标记 重新查找
cout << "请输入需要查找的人的名字: " << endl;
cin >> name;
bool flag=0; //标记查找是否成功
for (int i = 0; i < last; i++)
{
if (Hum[i].Name == name)
{
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
flag = 1; //标记已找到该对象
}
}
if (flag == 0)
{
cout << "抱歉,未找到该对象" << endl;
cout << "请选择:" << endl;
cout << "1:重新输入\t2:返回主菜单";
int n;
cin >> n;
if (n == 1)
{
goto reCin2; //重新查找
}
else if (n == 2)
menu();
return;
}
else
{
cout << "查找完成" << endl;
endFunc();
return;
}
}
end of 查找某人电话
///显示所有记录
void book::showAll() {
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话"<<endl;
for (int i = 0; i < last; i++)
{
cout << Hum[i].Id <<" \t\t" << Hum[i].Name <<"\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum<<endl;
}
cout << "打印完成" << endl;
endFunc();
}
//end of 显示所有记录
///显示所有同事
void book::showTong() {
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
for (int i = 0; i < last; i++)
{
if(Hum[i].rela=="同事")
cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
}
cout << "打印完成" << endl;
endFunc();
}
//end of 显示所有同事
///显示所有亲人
void book::showFamly() {
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
for (int i = 0; i < last; i++)
{
if (Hum[i].rela == "亲人")
cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
}
cout << "打印完成" << endl;
endFunc();
}
//end of 显示所有亲人
///显示所有朋友
void book::showFriend() {
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
for (int i = 0; i < last; i++)
{
if (Hum[i].rela == "朋友")
cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
}
cout << "打印完成" << endl;
endFunc();
}
//end of 显示所有朋友
/显示菜单
void book::menu() {
system("cls");
cout << "当前通讯录可容纳 " << size << " 人" << endl;
cout << "当前通讯录已存 " << last << " 人" << endl;
cout << "*****************************************" << endl;
cout << "*\t请输入数字选择所需功能\t\t*" << endl;
cout << "*\t1:插入联系人\t\t\t*" << endl;
cout << "*\t2:修改联系人\t\t\t*" << endl;
cout << "*\t3:删除联系人\t\t\t*" << endl;
cout << "*\t4:打印所有联系人\t\t*" << endl;
cout << "*\t5:打印所有亲人\t\t\t*" << endl;
cout << "*\t6:打印所有朋友\t\t\t*" << endl;
cout << "*\t7:打印所有同事\t\t\t*" << endl;
cout << "*\t8:查找联系人\t\t\t*" << endl;
cout << "*\t9:退出系统\t\t\t*" << endl;
cout << "*****************************************" << endl;
cout << "请输入数字选择功能:" ;
int k;
cin >> k;
switch (k)
{
case(1):
{
Insert();
break;
}
case(2):
{
change();
break;
}
case(3):
{
Delete();
break;
}
case(4):
{
showAll();
break;
}
case(5):
{
showFamly();
break;
}case(6):
{
showFriend();
break;
}case(7):
{
showTong();
break;
}
case(8):
{
findNum();
break;
}
case(9):
{
ExitProcess;
}
}
}
///end of 显示菜单/
///结束操作//
void book::endFunc() {
cout << "输入“1”返回菜单或输入“2”退出通讯录系统:" << endl;
int a;
cin >> a;
switch (a)
{
case(1):
menu();
break;
case(2):
break;
}
}
///end of 结束操作///
///修改记录/
void book::change() {
cout << "请输入想要修改联系人的姓名:"; //这里考虑实际使用,查询姓名更为方便
string name;
int aimId; //记录操作对象的ID
cin >> name;
int flag=0; //记录是否查询到该对象
for (int i = 0; i < last; i++)
{
if (Hum[i].Name == name)
{
if(flag==0)
cout << "该对象当前记录为:" << endl;
aimId = Hum[i].Id;
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
flag++;
}
}
if (flag==0)
{
cout << "查无此人,请检查是否输入错误!" << endl;
cout << "请输入“1”重新查询或输入“2”返回菜单: ";
int i = 0;
cin >> i;
switch (i)
{
case(1):
{
change();
break;
}
case(2):
{
menu();
break;
}
}
}
else
{
if (flag == 1) //只查询到一个对象时
{
cout << "您想要修改该对象的?" << endl;
cout << "1:姓名\t2:关系\t3:联系电话" << endl;
int i = 0;
cin >> i;
switch (i)
{
case(1):
{
cout << "您要将其姓名修改为:";
string newName;
cin >> newName;
Hum[aimId].Name = newName;
break;
}
case(2):
{
cout << "您要将其关系修改为:";
string newRela;
cin >> newRela;
Hum[aimId].rela = newRela;
break;
}case(3):
{
cout << "您要将其电话修改为:";
string newNum;
cin >> newNum;
Hum[aimId].phoneNum = newNum;
break;
}
}
}
else //查询到不止一个对象时
{
cout << "请输入想要修改对象的Id:";
cin >> aimId;
conChange: //goto标记 继续修改
cout << "您想要修改该对象的?" << endl;
cout << "1:姓名\t2:关系\t3:联系电话" << endl;
int i = 0;
cin >> i;
switch (i)
{
case(1):
{
cout << "您要将其姓名修改为:";
string newName;
cin >> newName;
Hum[aimId].Name = newName;
break;
}
case(2):
{
cout << "您要将其关系修改为:";
string newRela;
cin >> newRela;
Hum[aimId].rela = newRela;
break;
}case(3):
{
cout << "您要将其电话修改为:";
string newNum;
cin >> newNum;
Hum[aimId].phoneNum = newNum;
break;
}
}
}
cout << "修改完成,该对象当前记录为:" << endl;
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
cout << Hum[aimId].Id << " \t\t" << Hum[aimId].Name << "\t\t" << Hum[aimId].rela << "\t\t" << Hum[aimId].phoneNum << endl;
cout << "输入1继续修改该对象或输入2返回主菜单:" << endl;
int n;
reCin: //goto标记 重新输入
cin >> n;
if (n == 1)
goto conChange; //这里用goto语句较方便,回到修改处
else if (n == 2)
menu();
else
{
cout << "输入有误,请重新选择:" << endl;
goto reCin; //回到选择处
}
}
}
///end of 修改记录//
//删除操作///
void book::Delete() {
reDel: //goto标记 重新输入
cout << "请输入想要删除对象的姓名:";
string name;
cin >> name;
int aimId; //目标对象ID
int flag = 0; //查询结果数记录
for (int i = 0; i < last; i++)
{
if (Hum[i].Name == name)
{
aimId = Hum[i].Id;
if (flag == 0)
cout << "该对象当前记录为:" << endl;
cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
flag++;
}
}
if (flag == 1)
{
Del(aimId);
}
else if (flag == 0) {
cout << "查无此人,请选择" << endl;
cout << "1:重新输入\t2:返回主菜单" << endl;
reCin1: //goto标记 重新选择
int n;
cin >> n;
switch (n)
{case(1):
goto reDel;
break;
case(2):
menu();
break;
default:
cout << "输入有误,请重新选择" << endl;
cout << "1:重新输入\t2:返回主菜单" << endl;
goto reCin1; //返回选择部分
}
}
else
{
cout << "请输入想要修改对象的Id:";
cin >> aimId;
Del(aimId);
}
endFunc();
}
//end of 删除操作///a/
源文件部分:
#include"通讯录.h"
int main() {
cout << "开始构建通讯录,请输入通讯录人数:" ;
int k;
cin >> k;
book a(k);
a.menu();
return 0;
}