C++讲解辅导、辅导C++通信录程序大、辅导C/C++程序
- 首页 >> C/C++编程/*********希望通过此例子能够学会用C++实现类似的管理系统的设计 傅尔胜 *********/
//题目 通讯录管理系统设计
//1、问题描述
//定义通讯录类,属性有:编号、姓名、性别、通讯地址、邮箱地址、电话等信息和相关的对属性做操作的行为。
//主要完成对通讯录的简单管理。
//2、功能要求
//(1)添加功能:程序能够添加通讯录信息,要求编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。
//(2)查询功能:可根据姓名、电话、邮箱地址等信息对已添加的信息进行查询,如果未找到,给出相示信息,如果找到,则显示相应的记录信息;
//(3)显示功能:可显示当前系统中所有通讯信息,每条记录占据一行。
//(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
//(5)删除功能:主要实现对已添加的通讯记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空!”并返回操作。
//(6)保存功能:可将当前系统中通讯录记录存入文件中,存入方式任意。
//(7)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。
//3、问题的解决方案
//根据系统功能要求,可以将问题解决分为以下步骤:
//(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
//(2)分析系统中的各个实体及它们之间的关系;
//(3)根据问题描述,设计系统的类层次;
//(4)完成类层次中各个类的描述;
//(5)完成类中各个成员函数的定义;
//(6)完成系统的应用模块;
//(7)功能调试;
#include<iostream>
#include<fstream> //文件操作流
#include<string> //c++字符串类,string类的对象是一个字符串,不再是C语言风格用字符指针表示字符串
#include<cstring> //c语言的字符串函数,如strcpy、strcmp
#include<vector>
#include<iomanip> //用于cin、cout的一些格式化操作
using namespace std;
/**************************类定义部分*******************************/
//记录信息类
class record {
public:
record(int id=0,char name[]="",char sex='m');
void show();
int getid();
char* getname();
char getsex();
void setrecord();
private:
int id;
char name[20]; //此处最好别用string类型,否则后面可能读写文件会出问题
char sex;
//......
//这里只设置三个数据成员 其它成员可类似添加
} ;
//通讯录类
class contacts {
public:
void add(record &s);
void showall();
void readfromfile();
void writetofile();
void updaterecord();
void deleterecord();
int findbyid(int id);
void findbyname(char name[]);
void findbysex(string s);
bool checkid(int id);
private:
vector<record> list; //vector容器 实现动态数组 可以上网查资料学习vector用法
};
/**************************类实现部分*******************************/
record::record(int id,char name[],char sex) {
this->id=id;
strcpy(this->name,name);
this->sex=sex;
}
void record::setrecord() {
string s;
cout<<"请输入编号,姓名,性别:"<<endl;
cin>>id>>name>>s;
if(s=="男")
sex='m';
else
sex='f';
}
void record::show() {
cout<<setw(8)<<id<<setw(8)<<name<<setw(8)<<(sex=='m'?"男":"女")<<endl;
}
int record::getid() {
return id;
}
char* record::getname() {
return name;
}
char record::getsex() {
return sex;
}
//检测编号是否有重复
bool contacts::checkid(int id) {
bool flag;
flag=false;
for(int i=0; i<list.size(); i++) //list.size()表示动态数组list的元素个数
if(list[i].getid()==id) {
flag= true;
break;
}
return flag;
}
//添加记录
void contacts::add(record &s) {
if(!checkid(s.getid())) {
list.push_back(s); //动态插入数组元素s
} else
cout<<"编号重复,数据添加失败!!!"<<endl;
}
//按编号查找
int contacts::findbyid(int id) {
int loc=-1; //未找到返回-1
for(int i=0; i<list.size() ; i++)
if(id==list[i].getid()) {
loc=i;
break;
}
return loc; //根据编号返回记录号 便于删除修改操作
}
//按姓名查找
void contacts::findbyname(char name[]) {
bool flag=false;
for(int i=0; i<list.size() ; i++)
if(!strcmp(name,list[i].getname())) {
list[i].show();
flag=true;
}
if(!flag) cout<<"数据没有找到!"<<endl;
}
//按性别查找
void contacts::findbysex(string s) {
char sex;
if(s=="男")
sex='m';
else
sex='f';
bool flag=false;
for(int i=0; i<list.size() ; i++)
if(sex==list[i].getsex()) {
list[i].show();
flag=true;
}
if(!flag) cout<<"数据没有找到!"<<endl;
}
//按编号定位记录并删除记录
void contacts::deleterecord() {
int del_id;
vector<record>::iterator it; //vector迭代器 查资料补补知识
cout<<"请输入待删除记录的id:";
cin>>del_id;
if(findbyid(del_id)!=-1) {
it=list.begin()+findbyid(del_id);
list.erase(it); //删除it所定位记录
cout<<"删除成功!!!"<<endl;
} else
cout<<"未找到该记录!!!"<<endl;
}
//按编号定位记录并修改记录
void contacts::updaterecord() {
int update_id;
int loc;
cout<<"请输入待修改记录的id:";
cin>>update_id;
if(findbyid(update_id)!=-1) {
loc=findbyid(update_id);
list[loc].setrecord();
cout<<"修改成功!!!"<<endl;
} else
cout<<"未找到该记录!!!"<<endl;
}
//显示所有记录
void contacts::showall() {
for(int i=0; i<list.size() ; i++) {
list[i].show();
}
}
//写文件
void contacts::writetofile() {
ofstream fout;
fout.open("myconsts.dat",ios::binary);
for(int i=0; i<list.size() ; i++) {
fout.write((char*)(&list[i]),sizeof(record));
}
fout.close() ;
}
//读文件
void contacts::readfromfile() {
ifstream fin;
record r;
fin.open("myconsts.dat",ios::binary);
while(fin.read((char*)(&r),sizeof(r))) {
list.push_back(r); //从文件读取一个recor类型数据块并插入vector容器中
}
fin.close();
}
/**************************主函数部分*******************************/
void showmsg() {
cout<<" <通讯录菜单>"<<endl;
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 showfindmsg() {
cout<<" <查询选项>"<<endl;
cout<<"-------------------------------------------------------------------------------"<<endl;
cout<<" 1 姓名"<<endl;
cout<<" 2 性别"<<endl;
}
int main() {
contacts mycon;
int s;
int f;
char c;
char t_name[20];
string t_sex;
record r;
showmsg();
cout<<"【请输入您的选项】:";
cin>>s;
mycon.readfromfile();
while(s) {
switch(s) {
case 1:
mycon.showall();
break;
case 2:
r.setrecord();
mycon.add(r);
break;
case 3:
showfindmsg();
cout<<"【请输入您的查询选项】:";
cin>>f;
switch(f) {
case 1:
cout<<"请输入姓名:";
cin>>t_name;
mycon.findbyname(t_name);
break;
case 2:
cout<<"请输入性别:";
cin>>t_sex;
mycon.findbysex(t_sex);
break;
}
break;
case 4:
mycon.updaterecord();
break;
case 5:
mycon.deleterecord();
break;
case 6:
mycon.writetofile();
system("cls");
cout<<"通讯录成功保存!"<<endl;
showmsg();
break;
}
cout<<"【请输入您的选项】:";
cin>>s;
}
cout<<"是否保存数据(Y/N):";
cin>>c;
if(c=='Y'||c=='y') {
mycon.writetofile();
cout<<"通讯录成功保存!"<<endl;
}
return 0;
}