通讯录管理系统(C++)

本C++程序设计课设资源

设计要求

1、问题描述
定义通讯录类,属性有:编号、姓名、性别、通讯地址、邮箱地址、电话等信息和相关的对属性做操作的行为。
主要完成对通讯录的简单管理。
2、功能要求
(1)添加功能:程序能够添加通讯录信息,要求编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据姓名、电话、邮箱地址等信息对已添加的信息进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息;
(3)显示功能:可显示当前系统中所有通讯信息,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5)删除功能:主要实现对已添加的通讯记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空!”并返回操作。
(6)保存功能:可将当前系统中通讯录记录存入文件中,存入方式任意。
(7)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。

设计思路

如图是整个系统的流程图。输入想要完成的操作的序号,开始执行。

在这里插入图片描述


关键功能的实现

1)声名person的类,接下来定义类所需要的变量:姓名、ID、性别、职务、工资。为person建立函数库。

class person{
    public:
    	int ID;
        string name;
        char sex;//char定义可避免输入多字符,且解决了string类型和char类型的不匹配 
        string address;
        string email;
        string tel;
        person(){}//防止函数库报错,实现重载 
        person(int id,string na,char se,string addr,string em,string te){//构造函数 
	        this->ID=id;
            this->name=na;
            this->sex=se;
            this->address=addr;
	        this->email=em;
	        this->tel=te;
        }
        ~person();
        void display();
};

person::~person(){
}

void person::display(){
	cout<<"名字:"<<name<<setw(10)<<"编号:"<<ID<<setw(10)<<"性别: "
	<<sex<<setw(15)<<"通讯地址:" <<address<<setw(15)<<"邮箱地址:"<<email
	<<setw(10)<<"电话:"<<tel<<endl;
}

class ku{//为person建立函数库 
	public:
		ku(){}
		void add();
		int index(string name,string tel,string email);
		void search();
		void show();
		void edit();
		void destroy();
		void save();
		void read();
	protected:
		vector<person>per;		
};

2)主函数部分实现初始化数据调用switch函数、从键盘输入x。

   int main(){
	int N;
	ku K;
	while(1){
		showMenu(); 
		cin>>N;
		switch(N){
			case 1://添加联系人
				K.add();break;
			case 2://查询联系人
				K.search();break;
			case 3://显示联系人
				K.show();break;
			case 4://编辑联系人
				K.edit();break;
			case 5://删除联系人
				K.destroy();break;
			case 6://保存联系人
				K.save();break;
			case 7://读取联系人
				K.read();break;
			case 0://退出通讯录
				return 0;break;
			default:
				cout<<endl<<"错误输入,请重新输入"<<endl;break;
		}
	} 
}

打开程序后,界面显示菜单,根据需求,选择所需操作,输入操作对应的序号。
3)管理功能的实现:添加员工信息、查询员工信息、修改员工信息、删除员工信息。
1.添加功能
先输入需要添加的人数,之后按照提示的相关信息依次输入姓名、ID、性别、通讯地址、邮箱地址、电话等信息进行添加,若ID重复则提示"该ID已被使用,请重新输入"取消添加并重新输入。

void ku::add(){//添加功能
	int id;
    string name,address,email,tel;
    char sex;
    int num;
	cout<<"请输入将要添加的人数:";
	cin>>num;
	cout<<endl; 
	for(int i=0;i<num;i++){
		cout<<"请输入第"<<i+1<<"个人的名字:";
		cin>>name;
		cout<<endl;
		cout<<"请输入ID:";
		cin>>id;
		cout<<endl;
		for(int j=0;j<per.size();j++)
			if(per[j].ID==id){ 
				cout<<"该ID已被使用,请重新输入"<<endl;
				j=-1;
				cin>>id;
				cout<<endl; 
			}
		cout<<"请输入性别:(f/m)";
		cin>>sex;
		cout<<endl;
		if(sex!='f'&&sex!='m'){
			while(sex!='f'&&sex!='m'){
				cout<<"性别输入错误,请重新输入"<<endl;
				cin>>sex;
				cout<<endl; 
			}
		}
		cout<<"请输入通讯地址:";
		cin>>address;
		cout<<endl;
		cout<<"请输入邮箱地址:";
		cin>>email;
		cout<<endl;
		cout<<"请输入电话:";
		cin>>tel;
		cout<<endl;
		person ch(id,name,sex,address,email,tel);
		per.push_back(ch); 		
	}
}	

2.查询功能
按照输出的提示选择按照姓名、电话、邮箱地址其中的一个进行查询。输入相应编号,然后按照提示输入相应信息,回车之后会显示通讯记录的全部信息。

void ku::search(){//查询功能
	int sign; 
	if(per.empty()){
	    cout<<"列表内没有人员"<<endl;
		return; 
    }
	char a;
	cout<<endl<<"——————1、按照姓名查找   2、按照电话查找   3、按照邮箱地址查找————"<<endl; 
	cin>>a;
	switch(a){
		case '1':{
			string na;
			cout<<"请输入所查找人的姓名:"<<endl;
			cin>>na;
			if(index(na,"null","null")==-1) cout<<"查无此人"<<endl;  
			else per[index(na,"null","null")].display();
			break;
		}
		case '2':{
			string tel;
			cout<<"请输入所查找人的电话:"<<endl;
			cin>>tel;
			if(index("null",tel,"null")==-1) cout<<"查无此人"<<endl;  
			else per[index("null",tel,"null")].display();
			break;
		}
		case '3':{ 
			string email;
			cout<<"请输入所查找人的邮箱地址:"<<endl;
			cin>>email;
			if(index("null","null",email)==-1) cout<<"查无此人"<<endl;
			else per[index("null","null",email)].display();
			break;
		}
		default :{
			cout<<"输入错误"<<endl;
			break;
		}
	}
}

3.显示功能
显示所有通讯信息。

void ku::show(){//显示功能
	if(per.empty()) 
	    cout<<endl<<"—————————————无人员———————————————"<<endl;
    else{
    	cout<<endl<<"———————————显示全部人员信息————————————"<<endl;
        for(int i=0; i<per.size(); i++)
        	per[i].display(); 
	}
}

4.编辑功能
先输入通讯人员的姓名找到相应的记录,如果没有则会输出"查无此人";如果有则会输出"请选择您要修改的内容的序号:"并显示有关内容,之后输入想要修改的内容前面的序号,然后按照提示输入修改的新内容,回车,显示"更改完成"字样则修改成功。

void ku::edit(){//编辑功能 
	int sign=0; 
	if(per.empty()){
	    cout<<"——————————列表内没有人员——————"<<endl;
		return; 
    }
	cout<<endl<<"————————————修改人员信息————————————"<<endl;
	cout<<endl<<"请输入需要更改人员的姓名: ";
	string name;
	char x1;
	cin>>name;
	sign=index(name,"null","null");
	if(sign==-1)
	    cout<<endl<<"————                 查无此人                     ————"<<endl;
	else{
		cout<<"          ————请选择你要修改的内容————-"<<endl; 
		cout<<"      1、姓名      2、ID        3、性别      4、通讯地址  5、邮箱地址  6、电话"<<endl;
		cin>>x1;
		switch(x1){
			case '1':{
				cout<<"请输入新的姓名:";
				string na1;
				cin>>na1;
				per[sign].name=na1;
				cout<<"更改完成"<<endl; 
				break;
			}
			case '2':{
				cout<<"请输入新的ID:";
				int id2;
				cin>>id2;
				for(int i=0;i<per.size();i++){
					if(per[i].ID==id2)
					    cout<<"该ID已被使用,操作无效"<<endl;
					else{
						per[sign].ID=id2;
						cout<<"更改完成"<<endl; 
					}
					break;
				}
			}
			case '3':{
				cout<<"请输入新的性别:(f/m)";
				char se1;
				cin>>se1;
				while(se1!='f'&&se1!='m'){
					cout<<"性别输入错误,请重新输入!"<<endl;
					cin>>se1; 
				}
				per[sign].sex=se1;
				cout<<"更改完成"<<endl; 
				break;
			}
			case '4':{
				cout<<"请输入新的通讯地址:";
				string addr;
				cin>>addr;
				per[sign].address=addr;
				cout<<"更改完成"<<endl; 
				break;
			}
			case '5':{
				cout<<"请输入新的邮箱地址:";
				double email;
				cin>>email;
				per[sign].email=email; 
				cout<<"更改完成"<<endl; 
				break;
			}
			case '6':{
				cout<<"请输入新的电话:";
				double tel;
				cin>>tel;
				per[sign].tel=tel; 
				cout<<"更改完成"<<endl; 
				break;
			}
			default :cout<<"错误操作"<<endl;break;
		}
	}
}

5.删除功能
输入删除的通讯记录的姓名,如果该信息存在,输出"删除成功";如果不存在,输出"查无此人,删除失败"。实现删除功能。

void ku::destroy(){//删除功能
	if(per.empty()){
	    cout<<"           ————列表内没有人员——————"<<endl;
		return; 
    }
	string name;
    int num,sign;
    cout<<"请输入要删除的人数:"<<endl;
    cin>>num;
    if(num<=0||num>per.size()){
        cout<<"输入错误";
        return;
    }
    for(int i=1; i<=num; i++){
        cout<<"请输入要删除的第"<<i<<"个人的姓名:"<<endl;
        cin>>name;
        sign=index(name,"null","null");
		if(sign==-1)
            cout<<"查无此人,操作失败"<<endl;
		else{
			per.erase(per.begin()+sign);
            cout<<"删除成功"<<endl;
		}    
    } 
}

6.保存功能的实现
当选择存盘信息之后,程序会自动将存在的通讯信息存储到a.txt这个文件中,并在程序界面显示"存储成功"字样。

void ku::save(){//保存功能
	ofstream ofs;
	ofs.open("a.txt",ios::out|ios::binary);
	if(ofs){
		if(per.empty()){
			cerr<<"error"<<endl;
		}
		else{
			for(int i=0; i<per.size(); i++){
                ofs.write(reinterpret_cast<char*>(&per[i]),sizeof(per[i]));
                ofs.flush();
            }
            cout<<"存储成功"<<endl;
            ofs.close();   
		}
	}
} 

7.读取功能的实现
将想要读取的信息写在a.txt文件中,程序会自动地将信息读取到对象数组中并在程序界面显示读取的通讯信息。

void ku::read(){//读取功能 
	cout<<"              —————————欢迎使用通讯录管理系统——————————"<<endl;
	ifstream ifs("a.txt",ios::in|ios::binary);
	if(ifs.peek()==EOF)
        cout<<"文件为空"<<endl;
    if(ifs){
    	person per2;
    	for(int i=0;i<per.size();i++){
    		ifs.read(reinterpret_cast<char*>(&per2),sizeof(per2));
    		per[i].display();
		}
	}
}

测试结果

1.显示操作界面。
在这里插入图片描述

2.调用功能
1)添加功能
根据提示一步一步添加信息。先添加姓名、ID、性别、职务、工资。
定义4名人员:a、101、f、北京、wxkljlr2935@163.com、17611711786
s、102、m、上海、qs3874@sina.com、17621752203
b、103、m、深圳、nvmd7705@sohu.com、19527552718
d、104、f、秦皇岛、357477338@qq.com、13103357027

在这里插入图片描述在这里插入图片描述在这里插入图片描述

编号重复时
在这里插入图片描述

性别输入错误时
在这里插入图片描述

2)查询功能
按照姓名或电话或邮箱地址查询,输出所查询员工的姓名、编号、性别、通讯地址、邮箱地址、电话。
按照姓名查询s的具体信息如下:
在这里插入图片描述

按照电话查询如下:
在这里插入图片描述

按照邮箱地址查询如下:
在这里插入图片描述

查无此人时
在这里插入图片描述

3)显示功能
显示所有通讯信息。
在这里插入图片描述

4)修改功能
将s的性别修改为f,具体操作如下:
在这里插入图片描述

5)删除功能
输入想要删除的员工ID。删除a和s的具体操作如下:
在这里插入图片描述

6)存储功能
选择保存联系人功能,显示“存储成功”则存盘成功;打开a.txt文件发现相关信息。
在这里插入图片描述

在这里插入图片描述

7)读取功能
在a.txt文件中输入相关信息,选择读取功能,若显示文本中的通讯信息,则读取信息成功。
在这里插入图片描述

更新:
头文件

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <iomanip>
#include <fstream>
#include <cstdlib>

index函数

int ku::index(string name,string tel,string email){
	for(int i=0; i<per.size(); i++)
        if(per[i].name!="null"&&per[i].name==name) return i;
		else if(per[i].tel!="null"&&per[i].tel==tel) return i;
		else if(per[i].email!="null"&&per[i].email==email) return i;
    return -1;
}
  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leenyu0629

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值