【C++課程設計】通訊錄管理系統

xiaoyuyyun發表於2014-01-18

通訊錄

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

 

/*類的定義部分  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;
}

 

 

 

 

 

相關文章