【C++课程设计】通讯录管理系统

通讯录

--------------------------------------------

 

/*类的定义部分  Person.h文件*/
class Person //定义人类
{
protected:
	string StuId;//学号
	string Age; //年龄
	char Name[20]; //姓名
	char Sex[10]; //性别
	char Addre[20];//地址
	string Tel;  //电话
	Person *next; //Person类对象指针变量
public:
	Person(string ID,char *Name,char *Sex,string Age, string Tel,char *Addre)
	{
		strcpy(this->Name,Name);
		strcpy(this->Sex,Sex);
		strcpy(this->Addre,Addre);
		this->Tel=Tel;
		this->StuId=ID;
		this->Age=Age;
	}

	friend class Manage;//友元类
	/*Manage类是Person类的友元类,则Manage类的所有成员函数都是Person
	类的友元函数,都可以访问Person类的私有和保护成员*/
};

class Manage  //管理 类
{
public:
	Manage()  //构造函数
	{
		person=0;
		Load();  //成员函数
	}
	~Manage()  //析构函数
	{
		Person *p;//Person类的对象指针变量
		p=person;
		while(p) //当p不为0,即电话簿中记录不为0
		{
			p=p->next;
			delete person; //删除该类对象
			person=p;//准备删除下一对象
		}
		person=0;
	}

	void Find(char Name[20]);//按姓名查找
	void Find(string ID); //按学号查找

    void Welcome();
	void Add(); //添加信息
	void Delete();//删除信息
	void Modify(string ID);//修改信息
	void Query(); //查询信息
	void TJ(); //统计联系人
	void Save();//保存数据
	void Load();//读入数据
	void Look();//预览信息
	void DesTory();//清除联系人
	void Exit();//退出界面
	void Output(Person *p)
	{
		cout<<"\t\t学号: "<<p->StuId<<endl;
		cout<<"\t\t姓名: "<<p->Name<<endl;
		cout<<"\t\t性别: "<<p->Sex<<endl;
		cout<<"\t\t年龄: "<<p->Age<<endl;
		cout<<"\t\t电话: "<<p->Tel<<endl;
		cout<<"\t\t住址: "<<p->Addre<<endl;
		cout<<endl;

	}
private:
	Person *person; //Person类对象指针
};

 

 

-------------------------------------------------

 

 

/*类的功能实现部分  Manage.cpp*/

void Manage:: Welcome()/*欢迎界面*/
{
   printf("\n\n");
   printf("  \t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
   printf("  \t┃**********************************************************┃\n");
   printf("  \t┃***┏━━━━━━━━━━━━━━━━━━━━━━━━┓***┃\n");
   printf("  \t┃***┃************************************************┃***┃\n");
   printf("  \t┃***┃***                                         ****┃***┃\n");
   printf("  \t┃***┃***        欢迎进入我的通信录管理系统       ****┃***┃\n");
   printf("  \t┃***┃***                                         ****┃***┃\n");
   printf("  \t┃***┃***                                         ****┃***┃\n");
   printf("  \t┃***┃***                    制作人:XXY          ****┃***┃\n");
   printf("  \t┃***┃***                                         ****┃***┃\n");
   printf("  \t┃***┃***                         2013.12.22      ****┃***┃\n");
   printf("  \t┃***┃***                                         ****┃***┃\n");
   printf("  \t┃***┃************************************************┃***┃\n");
   printf("  \t┃***┗━━━━━━━━━━━━━━━━━━━━━━━━┛***┃\n");
   printf("  \t┃**********************************************************┃\n");
   printf("  \t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
   printf("\n\n是否选择登陆(Y/N):[ ]\b\b");  //左移一位“\b ”
}

void Manage::Add()/*添加联系人*/
{
	system("cls");//清屏命令,Windows对应的是cls
	Person *p,*p2; //新节点指针
	string StuId,Age,Tel;
	char Name[20],Sex[10],Addre[20];
	char c;
	cout<<"\n\t\t\t\t** 新增学生通讯录 **\n\n";
	//输入学生信息
	cout<<"输入学号:\t";
	cin>>StuId;
	cout<<endl;
	{//块作用域
		Person *p1;
		p1=person;
		while(p1)
		{
			if(p1->StuId==StuId)
			{
				break;
			}
			else
			{
				p1=p1->next;
			}
		}
		if(p1!=NULL)
		{
			cout<<"该学号已存在,\n"<<endl;
			cout<<"该学生信息为: \n"<<endl;
				Find(StuId);
				cout<<endl;
            cout<<"\n请重新输入(Y/N):"<<endl;
			cin>>c;
			if(toupper(c)=='Y') //toupper()函数是将字符转换为对应的大写字母
			{
				Add();
				return ;
			}
			else
				return ;
		}
	}//块作用域
	cout<<"输入姓名:\t";
	cin>>Name;
	cout<<endl;

	cout<<"输入性别:\t";
	cin>>Sex;
	cout<<endl;

	cout<<"输入年龄:\t";
	cin>>Age;
	cout<<endl;

	cout<<"输入电话:\t";
	cin>>Tel;
	cout<<endl;

	cout<<"输入地址:\t";
	cin>>Addre;
	cout<<endl;

	p=new Person(StuId,Name,Sex,Age,Tel,Addre);
	p->next=0;
	//学生节点加入链表
   	if(person)  //若已经存在节点
	{
		p2=person;
		while(p2->next) //查找尾节点
		{
			p2=p2->next;
		}
		p2->next=p; //连接
	}
	else //若不存在节点(表空)
	{
		person=p; //连接
	}
	//system("cls");
	cout<<"\t\t\t ****添加成功***\n"<<endl;
	cout<<"是否继续添加?(Y/N)"<<endl;
	cin>>c;
	if(toupper(c)=='Y')
	{
		Add();
		return ;
	}
	else
		return;
}

void Manage::Delete()  //删除联系人
{
	system("cls");
	char c;
	char ch;
	string StuId;
	cout<<"\n\t\t** 删除联系人信息 **\n\n";
	cout<<"输入要删除的学生ID:\t";
	cin>>StuId;
	cout<<endl;
	//查找要删除的节点
	Person *p1,*p2;
	p1=person;
	while(p1)
	{
		if(p1->StuId==StuId)
			break;
		else
		{
			p2=p1;
			p1=p1->next;
		}
	}
	//删除节点
	if(p1!=NULL) //若找到节点,则删除
	{
		cout<<"所要删除的学生的信息如下:\n"<<endl;
		Output(p1);
		cout<<"确定是否删除(Y/N): ";
		cin>>c;
		if(toupper(c)!='Y')
			return;
		if(p1==person) //若要删除的节点是第一个节点
 		{
			person=p1->next;
			delete p1;
		}
		else  //若要删除的节点是后续节点
		{
			p2->next=p1->next;
			delete p1;
		}
		cout<<"\n\t\t***删除成功***\n\n";
		cout<<"是否继续删除(Y/N) "<<endl;
		cin>>c;
		if(toupper(c)=='Y')
		{
			Delete();
			return ;
		}
		else
			return;
	}
	else  //未找到节点则返回
		{
		    cout<<"未找到该学生!\n";
		    cout<<"\n是否继续删除(Y/N)?\n";
	        cin>>ch;
	        if(ch=='Y'||ch=='y') Delete();
	        else{return;}
		}
}

void Manage::Modify(string ID)/*修改联系人信息*/
{
	Person *p1;
	char c;
	char ch;
	p1=person;
	while(p1)
	{
		if(p1->StuId==ID)
			break;
		else
		{
			p1=p1->next;
		}
	}
	if(p1!=NULL) //若找到节点
	{
		system("cls");
		cout<<"所要修改的学生信息如下: \n"<<endl;
		Output(p1);
		do
		{
			cout<<"1.修改姓名 2.修改性别 3.修改年龄 4.修改联系方式 5.修改地址 6.退出修改\n"<<endl;
			cout<<"请选择(1-6)要修改的信息\n";
			cin>>c;
			if(c!='5')
			cout<<"请输入新的信息: ";
			switch(c)
			{
			case '1': cin>>p1->Name;break;
			case '2': cin>>p1->Sex;break;
			case '3': cin>>p1->Age;break;
			case '4': cin>>p1->Tel;break;
			case '5': cin>>p1->Addre;break;
			default: return; break;
			}
			cout<<"\n\t   ***修改成功***\n"<<endl;
			cout<<"是否继续修改(Y/N): "<<endl;
            cin>>c;
            if(toupper(c)=='N')
            {
			return;
            }
		}while(c!='6');
		system("cls");
		cout<<"\n\t   ***修改成功***"<<endl;
		cout<<"是否继续修改(Y/N): "<<endl;
		if(toupper(c)=='Y')
		{
			cout<<"请输入要修改人员的ID"<<endl;
			cin>>ID;
			cout<<endl;
			Modify(ID);
			return;
		}
		else
			return;
	}
	else  //未找到联系人信息
		{
		    cout<<"\n未找到联系人!\n";
		    cout<<"\n是否继续修改(Y/N)?\n";
	        cin>>ch;
	        if(ch=='Y'||ch=='y')
		    {cout<<"\n请重新输入要修改人员的ID:"<<endl;
			cin>>ID;
			cout<<endl;
			Modify(ID);
		    }
            else{return;}
		}
}

void Manage::Save()  //保存信息
{
	ofstream fPerson("Person.txt",ios::out);
	char c;
	system("cls");
	cout<<"\n保存数据,是否继续?[Y/N]:";
	cin>>c;
	if(toupper(c)!='Y')
		return;
	Person *p=person;
	while(p)
	{
		fPerson<<p->StuId<<" "<<p->Name<<" "<<p->Sex<<" "<<p->Age<<" "<<p->Tel<<" "<<p->Addre<<endl;
		p=p->next;
	}
	fPerson.close();
	cout<<"\n保存成功...\n";
	system("pause");
}

void Manage::Load()  //数据读入
{
	ifstream fPerson;
	Person *p=person;
	string StuId,Age,Tel;
	char Name[20],Sex[10],Addre[20];
	fPerson.open("person.txt",ios::in);
	fPerson>>StuId>>Name>>Sex>>Age>>Tel>>Addre;

	while(fPerson.good())
	{
		p=new Person(StuId,Name,Sex,Age,Tel,Addre);
		p->next=0;
		//员工结点加入链表
		if(person) //若已经存在结点
		{
			Person *p2;
			p2=person;
			while(p2->next) //查找尾结点
			{
				p2=p2->next;
			}
			p2->next=p; //连接
		}
		else //若不存在结点(表空)
		{
			person=p; //连接
		}
		fPerson>>StuId>>Name>>Sex>>Age>>Tel>>Addre;
	}
	fPerson.close();
}

void Manage::Find(string ID)/*ID查找*/
{
	Person *p1;
	p1=person;
	while(p1)
	{
		if(p1->StuId==ID||p1->Tel==ID)
			break;
		else
		{
			p1=p1->next;
		}
	}
	if(p1!=NULL)
	{
		Output(p1);
	}
	else
		{
		    cout<<"未找到该学生!"<<endl;
		}
}

void Manage::Find(char Name[20])/*姓名查找*/
{
	Person *p1;
	int count=0;
	p1=person;
	while(p1)
	{
		if(strcmp(p1->Name,Name)==0||strcmp(p1->Addre,Name)==0)
		{
			count++;
			Output(p1);
		}
			p1=p1->next;
	}
	if(count)
	{
		cout<<"\t查询成功!!!\t"<<endl;
		if(count>1&&strcmp(p1->Name,Name)==0){cout<<"\n共找到 "<<count<<" 个名字为 **"<<Name<<"**的同学"<<endl;}
		if(count>1&&strcmp(p1->Addre,Name)==0){cout<<"\n共找到 "<<count<<" 个 **"<<Name<<"**的同学"<<endl;}
	}
	else
		{cout<<"\n\t\t未找到该学生!!!\n"<<endl;}
}


void Manage::Query()/*/查找的主界面*/
{
	char c;
	string ID,Tel;
	char Name[20],Addre[20];
	do{
		cout<<"1.按学号查找  2.按名字查找  3.按电话号码查找 4.归属地查找 5.退出查找"<<endl;
		cin>>c;
		cout<<endl;
		switch(c)
		{
			case '1':{
				cout<<"输入学号 ID:  ";
				cin>>ID;
				Find(ID);
					};break;
			case '2':{
				cout<<"输入姓名 Name:  ";
				cin>>Name;
				Find(Name);
					};break;
   			case '3':{
				cout<<"输入电话号码 Tel"<<endl;
				cin>>Tel;
				Find(Tel);
					};break;
            case '4':{
				cout<<"输入地址 Address"<<endl;
				cin>>Addre;
				Find(Addre);
					};break;
			case '5':break;
			default: cout<<"输入有误 请重新输入!!!\n"<<endl;
		}
	}while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5');
	cout<<"\t\t\t  ***查找成功***\n"<<endl;
	cout<<"\t是否继续查找(Y/N)?\n";
	cin>>c;
	if(toupper(c)=='Y')
		{
		    system("cls");
			Query();
			return ;
		}
	else
		return ;
		system("pause");
}

void Manage::Look()/*预览信息*/
{
	system("cls");
	Person *p1;
	int count=0;
	char c;
	p1=person;
	while(p1)
	{
		cout<<"ID: "<<p1->StuId<<"\t姓名: "<<p1->Name<<endl;
		count++;
		p1=p1->next;
	}
	if(count!=0)
	{
		cout<<"\n\t\t预览成功!!!\n"<<endl;
		cout<<"查询详细信息(Y/N): ";
		cin>>c;
		if(toupper(c)=='Y')
		{
			Query();
			return;
		}
		else
			return;
	}
	else
	{
		cout<<"尚未创建通讯录,是否创建(Y/N)"<<endl;
		cin>>c;
		if(toupper(c)=='Y')
		{
			Add();
			return;
		}
		else
			return;
	}
}

void Manage::DesTory()/*清除通讯录信息*/
{
	char c;
	system("cls");
	cout<<"\n\t\t\t** 清除信息 **\n";
	cout<<"警告:\n    清除通讯录信息会导致您保存的信息完全消失!!!\n"<<endl;
	cout<<"是否决定清除通讯录信息(Y/N):  "<<endl;
	cin>>c;
	if(toupper(c)!='Y')
		return;
	cout<<"请再次确认(Y/N)"<<endl;
	cin>>c;
	if(toupper(c)!='Y')
		return;
	else
	{
		Person *p;
		p=person;
		while(p)
		{
			p=p->next;
			delete person;
			person=p;
		}
		person=0;
	}
	system("pause");
}

void Manage::Exit()/*/退出*/
{
    cout<<"\n";
    for(int i=0;i<20;i++)
            {
                printf("·");
                Sleep(100);
            }
            system("cls");
	puts("\n\t\t\t\t感谢使用本系统!!\n\n\t\t\t有任何问题请联系:1005483758@qq.com \n");
	exit(0);
}

void Manage::TJ()/*/按照性别统计人数/*/
{
	Person *p1;
	int count=0,Boy=0,Girl=0;
	p1=person;
	while(p1)
	{
		count++;
		if(strcmp(p1->Sex,"男")==0||strcmp(p1->Sex,"nan")==0)
		Boy++;
		if(strcmp(p1->Sex,"女")==0||strcmp(p1->Sex,"nv")==0)
		Girl++;
		//if(strcmp(p1->Addre,p1+1->Addre)==0)
		p1=p1->next;
	}
	system("cls");
	cout<<"\n总共有 "<<count<<"份通讯录\n"<<endl;
	cout<<"男生:  "<<Boy<<"\t 女生: "<<Girl<<"\n"<<endl;
	system("pause");
}


 

----------------------------------------------------

 

/*主函数部分  main.cpp*/

#include<iostream>
#include<windows.h>
#include<cstdio>
#include<fstream>
#include<string>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<conio.h>
using namespace std;
#include"Person.h"
#include"Manage.cpp"
string ID;//字符串类ID,全局变量,具有唯一性

int main(void)
{
	Manage m;
	int c;
	int i,k=0;
	string mm;
	string username;
	char mi;
    char a;
    system("color 5b");//颜色
    m.Welcome();
    a=getchar();getchar();
       if (a=='Y'||a=='y')
	   {
            system("cls");//清屏操作。
			puts("\n\n\n\n\n\n\n\t\t\t\t 欢 迎 进 入 通 信 录 !\n\n\n\n\n\t\t\t\t\t   请 登 陆·····");
			getchar();
	   		for(int j=2,i=0;i<3;i++,j--)/*三次机会*/
		        {
                    printf("\n请输入用户名:");
			        cin >> username;
			        printf("\n请输入6位密码:");
			        getchar();
			        for(i=0;i<7;i++)
			        {
			            mi=getch();
			            if(mi=='\r') break;
			            mm+=mi;
			            cout<<"*";
			        }
					//判断条件
			        if(username=="xiaxianyun"&&mm=="123457")
			        {
		                printf("\n您已经成功登录\n");
		                k=1;
		                for(i=0;i<10;i++)
		                {
		                        printf("·");
		                        Sleep(100);
		                }

                        do/*菜单操作*/
                        {
                            system("cls");
                            cout<<"\n";
    cout<<"\t\t    ================请选择================"<<endl;
    cout<<"\t\t       ***      1.添加 联系人       ***"<<endl;
    cout<<"\t\t       ***      2.删除 联系人       ***"<<endl;
    cout<<"\t\t       ***      3.修改 联系人       ***"<<endl;
    cout<<"\t\t       ***      4.查询详细信息      ***"<<endl;
    cout<<"\t\t       ***      5.保 存 数 据       ***"<<endl;
    cout<<"\t\t       ***      6.预 览 信 息       ***"<<endl;
    cout<<"\t\t       ***      7.清除 通讯录       ***"<<endl;
    cout<<"\t\t       ***      8.联系人 统计       ***"<<endl;
    cout<<"\t\t    ======================================"<<endl;
    cout<<"\n0--退出\t请选择(1-8): ";
                            cin>>c;
                            switch(c)
                            {
                            case 1: m.Add(); break;
                            case 2: m.Delete();break;
                            case 3: {
                                system("cls");
                                cout<<"请输入要修改联系人的ID:  ";
                                cin>>ID;
                                cout<<endl;
                                m.Modify(ID);
                                      };break;
                            case 4: {
                                system("cls");
                                m.Query();
                                      }; break;
                            case 5: m.Save(); break;
                            case 6: m.Look(); break;
                            case 7: m.DesTory(); break;
                            case 8: m.TJ(); break;
                            default:m.Exit(); break;
                            }
                        }while(c!=0);
                    }
                    else
                    {

                    cout<<"\n用户名或密码错误··"<<"您还有"<<j<<"次机会请重新输入! ";
                    getchar();
                    cout<<"\n";
                    if(j==0)
                     {
                         printf("\n连续输入错误3次 将退出程序\n");
                         Sleep(2000);
                         m.Exit();                     }
                    }
                }

            system("cls");

      }
    else{
        system("cls");
        char s;
            cout<<"\n 是否要保存您的所有操作(Y/N):"<<endl;
            cin>>s;
            if(toupper(s)=='Y')
            {
                system("cls");
                m.Save();
                m.Exit();
            }
        m.Exit();
        }
	return 0;
}

 

 

 

 

 

  • 13
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值