C++联系人管理系统2.0(用类实现)
一、实现要求
实现要求:
(1)从键盘输入N个联系人的信息,保存到自定义命名的文件中。
(2)设计表示联系人信息的类Linkman,其中包括但不限于联系人的编号、姓名、电话、年龄、地址等数据成员(访问权限均为私有),以及若干成员函数。
(3)从文件(自定义命名)中读取所有学生的信息并显示到屏幕上,对文件的读写分别以ifstream和ofstream实现。
(4)分别定义方法实现按编号和姓名查找联系人的信息。
(5)定义方法分别实现追加和插入联系人的信息,然后保存到原来的文件中。
(6)定义方法实现按编号修改和按姓名修改联系人的信息,然后保存到原来的文件中。
(7)定义方法实现按编号修改和按姓名删除联系人的信息,然后保存到原来的文件中。
(8)定义方法实现按编号和年龄分别进行升序和降序排列联系人信息。
(9)定义方法实现联系人信息的统计。
(10)对以上所有对联系人进行的输入、输出、保存、读取、添加、删除、修改、查询、排序等有关的操作,要有清晰的提示信息,并形成相应的菜单,设计类Menu将其进行封装。
(11)以上实现,原则上均要求采用面向对象编程的思想实现。
二、更新日志
1.增加联系人年龄、地址
2.增加按年龄升序和降序排列联系人信息
3.重新定义联系人输出方式(运用stew()、setiosflags(ios::left))
拓展:
setw(n) 宽域操作符的用法
setw(n) 宽域操作符的作用为设置字段宽度为n位,n是在输出时分配了n个字符的输出宽度,默认在n个字符宽度中右对齐输出
(可以使用setiosflags(ios::left)设置为左对齐输出)
注意:
1.setw(n)宽域操作符只对直接跟在<<后的输出数据起作用(而在之后的<<需要在之前再一次使用setw)
2.setw(n)宽域操作符需要搭配头文件#include"iomanip"使用;
三、运行截图
四、实现步骤
1.Linkman头文件部分
代码如下:
#include<iostream>
#include<string>
#include<fstream>
#include <iomanip>
using namespace std;
#define MAX 1000
#define SIZE 1000
static int scount = 0;
class Linkman
{
char bianhao[20]; //编号
char name[20]; //姓名
char number[20]; //电话
char age[20]; //年龄
char agress[100]; //地址
public:
Linkman() {};
void begain(char bh[20], char na[20],char ag[20],char nu[20], char agr[100])
{
strcpy_s(bianhao, bh);
strcpy_s(name, na);
strcpy_s(age, ag);
strcpy_s(number, nu);
strcpy_s(agress, agr);
};
//初始化
void setbianhao(char bh[20])
{
strcpy_s(bianhao, bh);
}
void setname(char na[20])
{
strcpy_s(name, na);
}
void setnumber(char nu[20])
{
strcpy_s(number, nu);
}
void setage(char ag[20])
{
strcpy_s(age, ag);
}
void setagress(char agr[100])
{
strcpy_s(agress, agr);
}
char* getbianhao()
{
return bianhao;
};
char* getname()
{
return name;
};
char* getnumber()
{
return number;
};
char* getage()
{
return age;
};
char* getagress()
{
return agress;
};
};
class person
{
Linkman linkman[MAX];
public:
void input(); //输入
void output(); //显示
void read(); //读取
void save(); //保存
void insert(); //插入
void append(); //追加
void search1(); //查询(编号)
void search2(); //查询(姓名)
void change1(); //修改(编号)
void change2(); //修改(姓名)
void Delete1(); //删除(编号)
void Delete2(); //删除(姓名)
void sort1(); //排序(编号升序)
void sort2(); //排序(编号降序)
void sort3(); //排序(年龄升序)
void sort4(); //排序(年龄降序)
void count(); //统计
};
//添加
void person::input()
{
char name[20], number[20], bianhao[20], age[20], agress[100];
int x;
cout << "请输入添加人数:";
cin >> x;
for (int i = 0; i < x; i++)
{
system("cls");//清屏
cout << " --------------------------------------------" << endl;
cout << "| 【联系人信息录入】 |" << endl;
cout << " -------------------------------------------- " << endl;
cout << "请输入第" << i + 1 << "位联系人信息:" << endl;
cout << "编号:"; cin >> bianhao;
cout << "姓名:"; cin >> name;
cout << "年龄:"; cin >> age;
cout << "号码:"; cin >> number;
cout << "地址:"; cin >> agress;
linkman[scount].begain(bianhao, name, age, number, agress);
scount++;
}
cout << "\n输入完成!" << endl;
cout << "自动保存成功!" << endl;
}
//显示
void person::output()
{
cout << "\n所有联系人信息如下:" << endl;
cout << " ---------------------------------------------------------------------------------------------- " << endl;
cout << setw(11) << setiosflags(ios::left) << "|编号" << setw(11) << setiosflags(ios::left) << "|姓名" << setw(11) << setiosflags(ios::left) << "|年龄" << setw(21) << setiosflags(ios::left) << "|电话" << setw(41) << setiosflags(ios::left) << "|地址" << "|" << endl;
for (int i = 0; i < scount; i++)
{
cout << "|----------------------------------------------------------------------------------------------|" << endl;
cout << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getbianhao() << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getname() << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getage() << "|" << setw(20) << setiosflags(ios::left) << linkman[i].getnumber() << "|" << setw(40) << setiosflags(ios::left) << linkman[i].getagress() << "|" << endl;
}
cout << " ---------------------------------------------------------------------------------------------- " << endl;
//setiosflags(ios::left) 居左对其(配合头文件#include <iomanip>使用)
//setw(10) 如果输出内容不足10,自动补齐空格(制表用,配合头文件#include <iomanip>使用)
}
//读入
void person::read()
{
ifstream ifile;
ifile.open("Broccoli.txt", ios::in | ios::binary);
scount = 0;
for (int i = 0; !ifile.eof(); i++)
{
ifile >> linkman[i].getbianhao();
ifile >> linkman[i].getname();
ifile >> linkman[i].getage();
ifile >> linkman[i].getnumber();
ifile >> linkman[i].getagress();
scount++;
}
scount--;
ifile.close();
}
//保存
void person::save()
{
ofstream ofile;
ofile.open("Broccoli.txt", ios::out | ios::binary);
for (int i = 0; i < scount; i++)
{
ofile << linkman[i].getbianhao() << endl;
ofile << linkman[i].getname() << endl;
ofile << linkman[i].getage() << endl;
ofile << linkman[i].getnumber() << endl;
ofile << linkman[i].getagress() << endl;
}
ofile.close();
}
//插入
void person::insert()
{
int h;
char name[20], number[20], bianhao[20], age[20], agress[100];
cout << "请输入插入位置:";
cin >> h;
cout << "编号:"; cin >> bianhao;
cout << "姓名:"; cin >> name;
cout << "年龄:"; cin >> number;
cout << "号码:"; cin >> age;
cout << "地址:"; cin >> agress;
scount++;
Linkman var;
//关键排序
for (int i = scount - 1; i > h - 1; i--)
{
linkman[i] = linkman[i - 1];
}
linkman[h - 1].begain(bianhao, name, number, age, agress);
cout << "\n插入成功!" << endl;
cout << "自动保存成功!" << endl;
output();
}
//追加
void person::append()
{
int x;
cout << "请输入你要追加的人数:";
cin >> x;
char name[20], number[20], bianhao[20], age[20], agress[100];
for (int i = 0; i < x; i++)
{
system("cls");//清屏
cout << " --------------------------------------------" << endl;
cout << "| 【联系人信息追加录入】 |" << endl;
cout << " -------------------------------------------- " << endl;
cout << "请输入第" << i + 1 << "位联系人信息:" << endl;
cout << "编号:"; cin >> bianhao;
cout << "姓名:"; cin >> name;
cout << "年龄:"; cin >> age;
cout << "号码:"; cin >> number;
cout << "地址:"; cin >> agress;
linkman[scount].begain(bianhao, name, number, age, agress);
scount++;
}
cout << "\n追加输入完成!" << endl;
cout << "自动保存成功!" << endl;
output();
}
//查询(按编号)
void person::search1()
{
char bianhao1[20];
char bianhao2[20];
int q = 0;
cout << "请输入要查询人编号:";
cin >> bianhao1;
for (int i = 0; i < scount; i++)
{
strcpy_s(bianhao2, linkman[i].getbianhao());
if (strcmp(bianhao1, bianhao2) == 0)
{
q++;
cout << "\n查询信息如下:" << endl;
cout << " ---------------------------------------------------------------------------------------------- " << endl;
cout << setw(11) << setiosflags(ios::left) << "|编号" << setw(11) << setiosflags(ios::left) << "|姓名" << setw(11) << setiosflags(ios::left) << "|年龄" << setw(21) << setiosflags(ios::left) << "|电话" << setw(41) << setiosflags(ios::left) << "|地址" << "|" << endl;
cout << "|----------------------------------------------------------------------------------------------|" << endl;
cout << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getbianhao() << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getname() << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getage() << "|" << setw(20) << setiosflags(ios::left) << linkman[i].getnumber() << "|" << setw(40) << setiosflags(ios::left) << linkman[i].getagress() << "|" << endl;
cout << " ---------------------------------------------------------------------------------------------- " << endl;
}
}
if (q == 0)
{
cout << "未查询到相关信息!" << endl;
}
}
//查询(按姓名)
void person::search2()
{
char name1[20];
char name2[20];
int q = 0;
cout << "请输入要查询人姓名:";
cin >> name1;
for (int i = 0; i < scount; i++)
{
strcpy_s(name2, linkman[i].getname());
if (strcmp(name1, name2) == 0)
{
q++;
cout << "\n查询信息如下:" << endl;
cout << " ---------------------------------------------------------------------------------------------- " << endl;
cout << setw(11) << setiosflags(ios::left) << "|编号" << setw(11) << setiosflags(ios::left) << "|姓名" << setw(11) << setiosflags(ios::left) << "|年龄" << setw(21) << setiosflags(ios::left) << "|电话" << setw(41) << setiosflags(ios::left) << "|地址" << "|" << endl;
cout << "|----------------------------------------------------------------------------------------------|" << endl;
cout << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getbianhao() << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getname() << "|" << setw(10) << setiosflags(ios::left) << linkman[i].getage() << "|" << setw(20) << setiosflags(ios::left) << linkman[i].getnumber() << "|" << setw(40) << setiosflags(ios::left) << linkman[i].getagress() << "|" << endl;
cout << " ---------------------------------------------------------------------------------------------- " << endl;
}
}
if (q == 0)
{
cout << "未查询到相关信息!" << endl;
}
}
//修改(按编号)
void person::change1()
{
char bianhao[20];
int x = 0;
char number[20], name[20], age[20], agress[100];
int q = 0;
cout << "请输入要修改人编号:";
cin >> bianhao;
for (int i = 0; i < scount; i++)
{
if (strcmp(bianhao, linkman[i].getbianhao()) == 0)
{
x = i;
q++;
}
}
if (q == 0)
{
cout << "联系人不存在!" << endl;
}
cout << "请输入姓名:";
cin >> name;
linkman[x].setname(name);
cout << "请输入年龄:";
cin >> age;
linkman[x].setage(age);
cout << "请输入电话:";
cin >> number;
linkman[x].setnumber(number);
cout << "请输入地址:";
cin >> agress;
linkman[x].setagress(agress);
cout << "修改成功!" << endl;
output();
}
//修改(按姓名)
void person::change2()
{
char name[20];
int x = 0;
char number[20], bianhao[20], age[20], agress[100];
int q = 0;
cout << "请输入要修改人姓名:";
cin >> name;
for (int i = 0; i < scount; i++)
{
if (strcmp(name, linkman[i].getname()) == 0)
{
x = i;
q++;
}
}
if (q == 0)
{
cout << "联系人不存在!" << endl;
}
cout << "请输入编号:";
cin >> bianhao;
linkman[x].setbianhao(bianhao);
cout << "请输入年龄:";
cin >> age;
linkman[x].setage(age);
cout << "请输入电话:";
cin >> number;
linkman[x].setnumber(number);
cout << "请输入地址:";
cin >> agress;
linkman[x].setagress(agress);
cout << "修改成功!" << endl;
output();
}
//编号删除
void person::Delete1()
{
char bianhao[20];
char deletebianhao[20];
cout << "请输入要删除编号:";
cin >> deletebianhao;
int x = 0;
for (int i = 0; i < scount; i++)
{
strcpy_s(bianhao, linkman[i].getbianhao());
if (strcmp(bianhao, deletebianhao) == 0)
{
x++;
for (int m = i; m < scount; m++)
{
linkman[m] = linkman[m + 1];//覆盖
}
}
}
if (x == 0)
{
cout << "未查询到相关信息,删除失败!" << endl;
}
else
{
scount--;
cout << "删除成功!\n";
output();
}
}
//姓名删除
void person::Delete2()
{
char name[20];
char deletename[20];
cout << "请输入要删除姓名:";
cin >> deletename;
int x = 0;
for (int i = 0; i < scount; i++)
{
strcpy_s(name, linkman[i].getname());
if (strcmp(name, deletename) == 0)
{
x++;
for (int m = i; m < scount; m++)
{
linkman[m] = linkman[m + 1];//覆盖
}
}
}
if (x == 0)
{
cout << "未查询到相关信息,删除失败!" << endl;
}
else
{
scount--;
cout << "删除成功!\n";
output();
}
}
//排序(编号升序)
void person::sort1()
{
Linkman var;
for (int i = 0; i < scount; i++)
{
for (int j = i + 1; j < scount; j++)
{
if (strcmp(linkman[j].getbianhao(), linkman[i].getbianhao()) < 0) //linkman[j]<linkman[i]
{
var = linkman[i];
linkman[i] = linkman[j];
linkman[j] = var;
}
}
}
cout << "升序排列操作完成!" << endl;
output();
}
//排序(编号降序)
void person::sort2()
{
Linkman var;
for (int i = 0; i < scount; i++)
{
for (int j = i + 1; j < scount; j++)
{
if (strcmp(linkman[j].getbianhao(), linkman[i].getbianhao()) > 0) //linkman[j]>linkman[i]
{
var = linkman[i];
linkman[i] = linkman[j];
linkman[j] = var;
}
}
}
cout << "降序排列操作完成!" << endl;
output();
}
//排序(年龄升序)
void person::sort3()
{
Linkman var;
for (int i = 0; i < scount; i++)
{
for (int j = i + 1; j < scount; j++)
{
if (strcmp(linkman[j].getage(), linkman[i].getage()) < 0) //linkman[j]<linkman[i]
{
var = linkman[i];
linkman[i] = linkman[j];
linkman[j] = var;
}
}
}
cout << "升序排列操作完成!" << endl;
output();
}
//排序(编号降序)
void person::sort4()
{
Linkman var;
for (int i = 0; i < scount; i++)
{
for (int j = i + 1; j < scount; j++)
{
if (strcmp(linkman[j].getage(), linkman[i].getage()) > 0) //linkman[j]>linkman[i]
{
var = linkman[i];
linkman[i] = linkman[j];
linkman[j] = var;
}
}
}
cout << "降序排列操作完成!" << endl;
output();
}
//统计
void person::count()
{
cout << "当前联系人数量:" << scount << endl;
output();
}
2.Menu头文件部分
代码如下:
#include "iostream"
#include "string"
#include "stdlib.h"
using namespace std;
person p;
class Menu
{
public:
void mainMenu();
void selsectMenu();
void inputMenu();
void deleteMenu();
void updateMenu();
void insertMenu();
void sortMenu();
void countMenu();
void outputMenu();
void helpMenu();
void exitMenu();
};
//主菜单
void Menu::mainMenu()
{
system("cls");//清屏
int choice;
while (true)
{
cout << " --------------------------------------------" << endl;
cout << "| 【通讯录管理系统】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.查询联系人信息 6.排序联系人信息 |" << endl;
cout << "| 2.录入联系人信息 7.统计联系人信息 |" << endl;
cout << "| 3.删除联系人信息 8.显示联系人信息 |" << endl;
cout << "| 4.修改联系人信息 9.系统帮助 |" << endl;
cout << "| 5.插入联系人信息 0.退出系统 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(0-9):";
cin >> choice;
if (choice > 9)
{
cout << "输入格式错误,请重新输入你的选择(0-9):";
cin >> choice;
}
switch (choice)
{
case 1:selsectMenu(); break;//查询
case 2:inputMenu(); break;//录入
case 3:deleteMenu(); break;//删除
case 4:updateMenu(); break;//修改
case 5:insertMenu(); break;//插入
case 6:sortMenu(); break;//排序
case 7:countMenu(); break;//统计
case 8:outputMenu(); break;//显示
case 9:helpMenu(); break;//系统帮助
case 0:exitMenu(); break;//退出
}
}
}
//查询
void Menu::selsectMenu()
{
system("cls");
p.read();//读取调用
int choice;
while (true)
{
cout << " --------------------------------------------" << endl;
cout << "| 【查询联系人信息】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.查询全部 3.按姓名查询 |" << endl;
cout << "| 2.按编号查询 4.返回主菜单 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(1-4):";
cin >> choice;
if (choice > 4)
{
cout << "输入格式错误,请重新输入你的选择(1-4):";
cin >> choice;
}
switch (choice)
{
case 1:
p.output();//输出调用
system("pause");
system("cls");//清空屏幕
break;
case 2:
p.search1();//编号查询调用
system("pause");
system("cls");//清空屏幕
break;
case 3:
p.search2();//姓名查询调用
system("pause");
system("cls");//清空屏幕
break;
case 4: mainMenu(); break;
}
}
}
//输入(录入)
void Menu::inputMenu()
{
p.input();//输入调用
p.save();//保存调用
system("pause");
system("cls");//清空屏幕
}
//删除
void Menu::deleteMenu()
{
system("cls");//清空屏幕
int choice;
while (1)
{
cout << " --------------------------------------------" << endl;
cout << "| 【删除联系人信息】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.按编号删除 |" << endl;
cout << "| 2.按姓名删除 |" << endl;
cout << "| 3.返回主菜单 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(1-3):";
cin >> choice;
if (choice > 3)
{
cout << "输入格式错误,请重新输入你的选择(1-3):";
cin >> choice;
}
switch (choice)
{
case 1:
p.Delete1();//编号删除调用
p.save();//保存调用
system("pause");
system("cls");//清空屏幕
break;
case 2:
p.Delete2();//姓名删除调用
p.save();//保存调用
system("pause");
system("cls");//清空屏幕
break;
case 3: mainMenu(); break;
}
}
}
//修改
void Menu::updateMenu()
{
system("cls");//清空屏幕
int choice;
while (1)
{
cout << " --------------------------------------------" << endl;
cout << "| 【修改联系人信息】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.按编号修改 |" << endl;
cout << "| 2.按姓名修改 |" << endl;
cout << "| 3.返回主菜单 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(1-3):";
cin >> choice;
if (choice > 3)
{
cout << "输入格式错误,请重新输入你的选择(1-3):";
cin >> choice;
}
switch (choice)
{
case 1:
p.change1();//编号修改调用
system("pause");
system("cls");//清空屏幕
break;
case 2:
p.change2();//姓名修改调用
system("pause");
system("cls");//清空屏幕
break;
case 3: mainMenu(); break;
}
}
}
//插入
void Menu::insertMenu()
{
system("cls");//清空屏幕
int choice;
while (1)
{
cout << " --------------------------------------------" << endl;
cout << "| 【插入联系人信息】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.插入联系人 |" << endl;
cout << "| 2.追加联系人 |" << endl;
cout << "| 3.返回主菜单 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(1-3):";
cin >> choice;
if (choice > 3)
{
cout << "输入格式错误,请重新输入你的选择(1-3):";
cin >> choice;
}
switch (choice)
{
case 1:
p.insert();//插入调用
p.save();//保存调用
system("pause");
system("cls");//清空屏幕
break;
case 2:
p.append();//追加调用
p.save();//保存调用
system("pause");
system("cls");//清空屏幕
break;
case 3: mainMenu(); break;
}
}
}
//排序
void Menu::sortMenu()
{
system("cls");//清空屏幕
int choice;
while (1)
{
cout << " --------------------------------------------" << endl;
cout << "| 【排序联系人信息】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.按编号升序 |" << endl;
cout << "| 2.按编号降序 |" << endl;
cout << "| 3.按年龄升序 |" << endl;
cout << "| 4.按年龄降序 |" << endl;
cout << "| 5.返回主菜单 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(1-5):";
cin >> choice;
if (choice > 5)
{
cout << "输入格式错误,请重新输入你的选择(1-5):";
cin >> choice;
}
switch (choice)
{
case 1:
p.sort1();//编号升序调用
system("pause");
system("cls");//清空屏幕
break;
case 2:
p.sort2();//编号降序调用
system("pause");
system("cls");//清空屏幕
break;
case 3:
p.sort3();//编号升序调用
system("pause");
system("cls");//清空屏幕
break;
case 4:
p.sort4();//编号降序调用
system("pause");
system("cls");//清空屏幕
break;
case 5:mainMenu(); break;
}
}
}
//统计
void Menu::countMenu()
{
p.count();//统计调用
system("pause");
system("cls");//清空屏幕
}
//输出
void Menu::outputMenu()
{
system("cls");//清空屏幕
int choice;
while (1)
{
cout << " --------------------------------------------" << endl;
cout << "| 【输出联系人信息】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| 1.读取初始文件数据 |" << endl;
cout << "| 2.输出联系人 |" << endl;
cout << "| 3.返回主菜单 |" << endl;
cout << " --------------------------------------------" << endl;
cout << "请输入你的选择(1-3):";
cin >> choice;
if (choice > 3)
{
cout << "输入格式错误,请重新输入你的选择(1-3):";
cin >> choice;
}
switch (choice)
{
case 1:
p.read();//读取调用
p.output();//输出调用
system("pause");
system("cls");//清空屏幕
break;
case 2:
p.output();//输出调用
system("pause");
system("cls");//清空屏幕
break;
case 3:mainMenu(); break;
}
}
}
//系统帮助
void Menu::helpMenu()
{
system("cls");//清空屏幕
cout << " --------------------------------------------" << endl;
cout << "| 【通讯录管理系统使用说明】 |" << endl;
cout << "|--------------------------------------------|" << endl;
cout << "| |" << endl;
cout << "| 鉴于制作人员水平有限。请严格按照系统提 |" << endl;
cout << "| 示进行操作,以免引起程序奔溃! |" << endl;
cout << "| |" << endl;
cout << " --------------------------------------------" << endl;
system("pause");
system("cls");//清空屏幕
}
//退出
void Menu::exitMenu()
{
exit(0);
}
3.主函数部分
代码如下:
#include "iostream"
#include "string"
#include "stdlib.h"
#include "Linkman.h"
#include "Menu.h"
using namespace std;
int main()
{
Menu menu;
menu.mainMenu();
system("pause");
return 0;
}
代码小白,仅作学习记录📝