1. 程式人生 > >資料結構課程設計——通訊錄管理系統

資料結構課程設計——通訊錄管理系統

/***********************************************************
*版權所有  (C)2015. ChengAng
*
*檔名稱:   zupu.cpp
*檔案標識:   無
*內容摘要:   該專案的所有函式的實現
*其他說明:   無
*當前版本:   V1.0
*作   者:    程昂
*完成日期:   20151223
*
*修改記錄1:
*修改日期:   20151223
*版本號:     V1.0
*修改人:     Cheng Ang
*修改內容:
********************************************************************/


#include"zupu.h"
/***********************************************************
*功能描述:  主函式,負責專案的排程
*輸入引數:   無
*輸出引數:   無
*返回值:     無
*其他說明:   無
*************************************************************/
int main()     //主函式
{
    creat();
    huanying();
	Save();
    return 0;
}
/***********************************************************
*功能描述:新建或者開啟已經存在的檔案,從中讀取內容
*輸入引數:   無
*輸出引數:   無
*返回值:     無
*其他說明:   無
*************************************************************/
void creat()     //建立或讀取檔案
{
    int j;
    long k;
    fp=fopen("資料檔案.txt","r t");
    if(fp!=NULL)
    {
        for(i=0; i<=maxlen; i++ )
        {
            j=fgetc(fp);

            if(j==EOF)

                return;
            k=i;
            fseek(fp,k*sizeof(struct persons),0);

            fread(&persons[i],sizeof(struct persons),1,fp);

            s=(linklist)malloc(sizeof(listnode));

            s->num=persons[i].num;

            strcpy(s->name,persons[i].name);

            strcpy(s->e_addr,persons[i].e_addr);

            strcpy(s->tel_no,persons[i].tel_no);

            s->sim_no=persons[i].sim_no;

            strcpy(s->arch,persons[i].arch);

            s->cishu=persons[i].cishu;

            if(head==NULL)   //若為空,則建立新節點
            {
                head=s;
                r=head;
                head->next=NULL;
            }
            else         //否則,插入節點
            {
                r->next=s;
                r=s;
                r->next=NULL;
            }
        }
        fclose(fp);
    }
    else                            //存入檔案
    {
        fp=fopen("資料檔案.txt","w");
        i=1;
    }
}
/***********************************************************
*功能描述:   開始介面,提供選擇操作的介面
*輸入引數:   選擇鍵
*輸出引數:   無
*返回值:     無
*其他說明:   通過選擇進入各種功能
*************************************************************/
void huanying()     //選擇介面
{
    system("cls");   //清屏
    do
    {
        xiaotu();
        cout<<"                歡迎使用通訊錄管理系統~~~~~~~"<<endl;
        cout<<endl;
        cout<<"+---------------------------------------------------------+"<<endl;
        cout<<"+ 1.顯示分組資訊請按1           4.編輯資訊請按4           +"<<endl;
        cout<<"+ 2.刪除資訊請按2               5.撥號請按5               +"<<endl;
        cout<<"+ 3.新增資訊請按3               6.儲存並退出請按6         +"<<endl;
        cout<<"+ 7.查詢資訊請按7               8.輸出全部資訊請按8       +"<<endl;
        cout<<"+---------------------------------------------------------+"<<endl;
        cout<<endl;
        cout<<"請輸入您的的選擇-----"<<endl;
        cin>>ch;
        switch(ch)           //選擇操作
        {
        case '1':
            system("cls");
            Show();
            break;
        case '2':
            system("cls");
            Delete();
            break;
        case '3':
            system("cls");
            Input();
            break;
        case '4':
            system("cls");
            Alter();
            break;
        case '5':
            system("cls");
            Dial();
            break;
        case '6':
            system("cls");
            Save();
            fclose(fp);
            xiaotu();
            exit(0);
            break;
        case '7':
            system("cls");
            find();
            break;
        case '8':
            system("cls");
            shuchu();
            break;
        default:
            printf("\n\t*********************************\n");
            printf("\n\t 請輸入 1-8!!! \n");
            printf("\n\t**********************************");
            break;
        }
    }
    while(1);
}
/***********************************************************
*功能描述:   新增一個人的資訊;插入到連結串列
*輸入引數:   聯絡人資訊
*輸出引數:   無
*返回值:     無
*其他說明:   會有判斷該人是否存在的功能;
              若存在則有返回重新輸入或者回到主介面的功能.
*************************************************************/
void Input()      //新增資訊
{
    int choic;
    s=(linklist)malloc(sizeof(listnode));    //建立頭節點
    cout<<"----------------------------------------------"<<endl;
    printf("\n\n\t            請輸入該使用者的資訊:\n");
    cout<<"請輸入姓名:        ";
    cin>>s->name;
    cout<<"請輸入電話:        ";
    cin>>s->tel_no;
    cout<<"請設定快捷鍵(0-9): ";
    cin>>s->sim_no;
    cout<<"請輸入地址:        ";
    cin>>s->e_addr;
    cout<<"請輸分組名         ";
    cin>>s->arch;
    s->cishu=0;
    cout<<"----------------------------------------------"<<endl;
    if(head==NULL)
        printf("\n\n");
    else
    {
        p8=head;
        while(p8!=NULL&&strcmp(s->name,p8->name)!=0&&strcmp(s->tel_no,p8->tel_no)!=0)
            p8=p8->next;

        if(p8!=NULL)
        {
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"+------------您新增的使用者已存在!---------------+"<<endl;
            cout<<endl;
            cout<<"+       重新輸入請按1,返回選單請按 3          +"<<endl;
            cout<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
                Input();
            if(choic==3)
                huanying();
            free(s);
        }
    }
    if(head==NULL)
    {
        head=s;
        head->next=NULL;
    }
    else
    {
        r->next=s;
        r=s;
        r->next=NULL;        //尾插法
    }
}
/***********************************************************
*功能描述:   查詢一個聯絡人資訊的功能
*輸入引數:   聯絡人姓名
*輸出引數:   該聯絡人資訊
*返回值:     無
*其他說明:   無
*************************************************************/
void find()           //查詢功能
{
    int choic;
    system("cls");
    printf("\n\n\t             請輸入姓名:");
    cin>>name1;
    p10=head;
    while(p10!=NULL&&strcmp(name1,p10->name)!=0)           //判斷是否存在
        p10=p10->next;
    if(p10==NULL)
    {
        printf("\n\n\t             您選擇的使用者不存在!");
        printf("\n\n\t2   請重新輸入,請選擇是重新輸入(1)還是返回主選單(2)");
        cin>>choic;
        if(choic==1)
        {
            find();
        }
        if(choic==2)
        {
            system("cls");
            huanying();
        }
    }
    else
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   名  字:  "<<p10->name<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   電  話:  "<<p10->tel_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   快捷鍵:  "<<p10->sim_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   分  組:  "<<p10->arch<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+  撥打次數: "<<p10->cishu<<endl;
        cout<<"----------------------------------------------"<<endl;
		cout<<"**********************************************"<<endl;

        cout<<endl;
        cout<<"返回介面請按1"<<endl;
        cout<<endl;
        cout<<"----------------------------------------------"<<endl;
        cin>>choic;
        if(choic==1)
		{
			system("cls");
            huanying();
		}
     }
}
/***********************************************************
*功能描述:  編輯一個聯絡人的資訊
*輸入引數:   聯絡人資訊
*輸出引數:   無
*返回值:     無
*其他說明:   這裡運用了input()的功能,同樣有input()的判斷功能
*************************************************************/
void Alter()         //編輯資訊
{
    int choic;
    cout<<"+----------------------------------------------+"<<endl;
    cout<<endl;
    printf("\n\n\t           請輸入姓名:");
    cin>>name1;
    cout<<endl;
    cout<<"+----------------------------------------------+"<<endl;
    p3=head;
    while(p3!=NULL&&strcmp(name1,p3->name)!=0)
        p3=p3->next;
    if(p3==NULL)
    {
        cout<<"+----------------------------------------------+"<<endl;
        cout<<"+------------您選擇的使用者不存在!---------------+"<<endl;
        cout<<endl;
        cout<<"+       重新輸入請按1,返回選單請按 3          +"<<endl;
        cout<<endl;
        cout<<"+----------------------------------------------+"<<endl;
        cin>>choic;
        if(choic==1)
            Alter();
        if(choic==3)
            huanying();
    }
    else
    {
        cout<<endl;
        printf("\n\n\t           請輸入該使用者的新資訊!");
        cout<<"----------------------------------------------"<<endl;
        printf("\n\n\t            請輸入該使用者的資訊:\n");
        cout<<"請輸入姓名:";
        cin>>s->name;
        cout<<"請輸入電話:";
        cin>>s->tel_no;
        cout<<"請設定快捷鍵(0-9):";
        cin>>s->sim_no;
        cout<<"請輸入地址:";
        cin>>s->e_addr;
        cout<<"請輸分組名";
        cin>>s->arch;
        s->cishu=0;
        cout<<"----------------------------------------------"<<endl;
        while(p9!=NULL&&strcmp(name1,p9->name)!=0&&strcmp(tel_no1,p9->tel_no)!=0)
            p9=p9->next;
        if(p9==NULL)
        {
            strcpy(p3->name,name1);
            strcpy(p3->tel_no,tel_no1);
            strcpy(p3->e_addr,e_addr1);
            p3->sim_no=sim_no1;
            strcpy(p3->arch,arch1);
        }
        else
        {
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"+------------您新增的使用者已存在!---------------+"<<endl;
            cout<<endl;
            cout<<"+               返回選單請按 1                 +"<<endl;
            cout<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
            {
                system("cls");
                huanying();
            }
        }
    }
}
/***********************************************************
*功能描述:  進行對分組的選擇功能
*輸入引數:  分組名字
*輸出引數:  無
*返回值:    分組名字
*其他說明:  無
*************************************************************/
void Show()      //選擇想要檢視的分組
{
    p2=head;
    int choic;
    char ch1[10];

    if(p2==NULL)    //若為空
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<"                暫時沒有分組                  "<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"                按1返回主選單                 "<<endl;
        cout<<"----------------------------------------------"<<endl;
        cin>>choic;
        if(choic==1)
            huanying();

    }
    else
    {
        printf("                 你想要檢視哪個分組?              \n");
        while(p2!=NULL)                                       //通過不斷指向下一個節點讀取分組資訊
        {

            cout<<"------------分組:    "<<p2->arch<<endl;
            p2=p2->next;
            continue;
        }
        cout<<"               請輸入分組名字選擇     "<<endl;
        cout<<"                                      "<<endl;
        cin>>ch1;
        ShowA(ch1);
    }

}
/***********************************************************
*功能描述:輸出一個分組的全部聯絡人的資訊
*輸入引數:   選擇鍵
*輸出引數:   無
*返回值:     無
*其他說明:   無
*************************************************************/
void ShowA(char aa[10])    //列印分組聯絡人資訊
{
    int choic;
    p11=head;
    if(p11==NULL)
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<endl;
        cout<<"該分組暫時沒人,返回介面請按1,繼續選擇請按3"<<endl;
        cout<<endl;
        cout<<"----------------------------------------------"<<endl;

        cin>>choic;
        if(choic==1)
            huanying();
        if (choic==3)
            Show();
    }

    else
        while(p11!=NULL)
        {
            if((strcmp(p11->arch,aa))==0)
            {
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   名  字:  "<<p11->name<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   電  話:  "<<p11->tel_no<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   快捷鍵:  "<<p11->sim_no<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   分  組:  "<<p11->arch<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+  撥打次數: "<<p11->cishu<<endl;
                cout<<"----------------------------------------------"<<endl;
				cout<<"**********************************************"<<endl;
            }
            p11=p11->next;
            continue;
        }
    cout<<endl;
    cout<<"返回介面請按1,繼續選擇請按3"<<endl;
    cout<<endl;
    cout<<"----------------------------------------------"<<endl;

    cin>>choic;
    if(choic==1)
    {
        system("cls");
        huanying();
    }
    if (choic==3)
    {
        system("cls");
        Show();
    }

}

/***********************************************************
*功能描述:  刪除一個聯絡人的資訊
*輸入引數:  聯絡人姓名
*輸出引數:   無
*返回值:     無
*其他說明:   先進行查詢是否有該聯絡人
*************************************************************/
void Delete()        //刪除通訊人資訊
{
    printf("\n\n\t          請輸入要刪除使用者的姓名:");
    cin>>name1;
    p4=head;
    if(strcmp(p4->name,name1)==0)
    {
        p4=p4->next;
        head=p4;
    }
    else
    {
        while(strcmp(p4->next->name,name1)!=0)
            p4=p4->next;

        p5=p4->next;
        p4->next=p5->next;
        free(p5);
    }
}

/***********************************************************
*功能描述:   撥號動畫的功能;該聯絡人撥號次數+1
*輸入引數:   選擇鍵1、2;(1)輸入姓名、(2)輸入快捷鍵
*輸出引數:   聯絡人電話,撥號次數
*返回值:     撥號次數
*其他說明:   動畫過程用了時間函式
*************************************************************/
void Dial()       //撥號功能
{
    int c,choic;
    int a;
    char b;
	cout<<"+----------------------------------------------+"<<endl;
    cout<<"+     撥叫使用者請按(1)    使用單鍵撥號請按(2)   +"<<endl;  //兩種撥號方式
    cout<<"+----------------------------------------------+"<<endl; 
    cin>>a;
    p0=head;
    if(a==1)
    {
        cout<<"                    請輸入撥叫使用者的姓名:";
        cin>>name1;
        while(strcmp(name1,p0->name)!=0&&p0!=NULL)
            p0=p0->next;
        if(p0==NULL)
        {
			cout<<"+----------------------------------------------+"<<endl;
            cout<<"                 您選擇的使用者不存在!";
			cout<<"+----------------------------------------------+"<<endl;
            cout<<"+       重新輸入請按(1)    返回主選單(2)        +"<<endl;
			cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
            {
				system("cls");
                Dial();
            }
            if(choic==2)
            {
				system("cls");
                huanying();
            }
        }
        else
        {
            cout<<endl;
            cout<<"                                               "<<endl;
            cout<<"        loding------                           "<<endl;
            for(int j=0; j<20; j++)        //運用時間函式,實現撥號介面
            {
                Sleep(100);
                cout<<"■";
            }
            cout<<"                                               "<<endl;
            cout<<"                                               "<<endl;
            Sleep(500);
            cout<<endl;
            cout<<p0->tel_no<<endl;
            p0->cishu=p0->cishu+1;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"撥打次數:    "<<p0->cishu<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<endl;
        }
    }
    else
    {
        cout<<"請輸入單鍵號碼:";
        cin>>b;
        while(p0!=NULL&&b!=p0->sim_no)                   //遍歷連結串列比較查詢
            p0=p0->next;
        if(p0==NULL)
        {
            cout<<"	您輸入的單鍵號碼不存在!";
			cout<<"+----------------------------------------------+"<<endl;
            cout<<"+      重新輸入請按(1)    返回主選單(2)        +"<<endl;
			cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
            {
                find();
            }
            if(choic==2)
            {
                system("cls");
                huanying();
            }
        }
        else
        {
            cout<<endl;
            cout<<"                                               "<<endl;
            cout<<"        loding------                                        "<<endl;
            for(int j=0; j<20; j++)
            {
                Sleep(100);
                cout<<"■";
            }
            cout<<"                                               "<<endl;
            cout<<"                                               "<<endl;
            Sleep(500);
            cout<<p0->name<<endl;
            cout<<p0->tel_no;
            p0->cishu=p0->cishu+1;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"撥打次數:    "<<p0->cishu<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<endl;
        }
    }
}
/***********************************************************
*功能描述:   輸出全部聯絡人的資訊
*輸入引數:   無
*輸出引數:   資訊
*返回值:     無
*其他說明:   無
*************************************************************/
void shuchu()         //輸出全部資訊
{
    int choic;
    p10=head;
    while(p10!=NULL)
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   名  字:  "<<p10->name<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   電  話:  "<<p10->tel_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   快捷鍵:  "<<p10->sim_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   分  組:  "<<p10->arch<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+  撥打次數: "<<p10->cishu<<endl;
        cout<<"----------------------------------------------"<<endl;
        p10=p10->next;                              //遍歷輸出資訊
        continue;
    }
    cout<<endl;
    cout<<"返回介面請按1,繼續選擇請按3"<<endl;
    cout<<endl;
    cout<<"----------------------------------------------"<<endl;
    cin>>choic;
    if(choic==1)
        huanying();
    if (choic==3)
        Show();
}


/***********************************************************
*功能描述:輸出兔子圖案
*輸入引數:   無
*輸出引數:   無
*返回值:     無
*其他說明:   無
*************************************************************/
void xiaotu()          //兔子圖案
{
    cout<<endl;
    cout<<"                       ┏━┓ ┏━┓"<<endl;
    cout<<"                       ★│┃  ┃│┃"<<endl;
    cout<<"                       ┃│┗灬┛│┃"<<endl;
    cout<<"                       ┃     ┃"<<endl;
    cout<<"                       ┃ ^   ^  ┃"<<endl;
    cout<<"                          ﹌ ˇ ﹌   "<<endl;
    cout<<"                       ┗○━━━○┛"<<endl;
}

/***********************************************************
*功能描述:  將操作完成後的資訊儲存到檔案
*輸入引數:  無
*輸出引數:   無
*返回值:     無
*其他說明:   方便下次執行時的呼叫
*************************************************************/
void Save()            //存入檔案
{
    int j;
    fp=fopen("資料檔案.txt","w");
    for(p2=head,j=0; p2!=NULL; j++ ,p2=p2->next)
    {
        strcpy(persons[j].name,p2->name);
        strcpy(persons[j].tel_no,p2->tel_no);
        persons[j].sim_no=p2->sim_no;
        strcpy(persons[j].e_addr,p2->e_addr);
        strcpy(persons[j].arch,p2->arch);
        persons[j].cishu=p2->cishu;
        fwrite(&persons[j],sizeof(struct persons),1,fp);
    }
}
<pre name="code" class="cpp">/***********************************************************
*版權所有  (C)2015. ChengAng
*
*檔名稱:   zupu.cpp
*檔案標識:   無
*內容摘要:   該檔案用於對結構體以及各函式的定義
*其他說明:   無
*當前版本:   V1.0
*作   者:    程昂
*完成日期:   20151223
*
*修改記錄1:
*修改日期:   20151223
*版本號:     V1.0
*修改人:     Cheng Ang
*修改內容:
********************************************************************/
#include <iostream>
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
using namespace std;
#define maxlen 100  //最多100個資訊

void find();     //查詢功能
void huanying(); //選擇介面
void creat();    //建立或開啟檔案
void ShowA(char aa[10]);    //顯示分組資訊
void Show();     //選擇分組
void Delete();   //刪除功能
void find();     //查詢功能
void Save();     //存入檔案
void Input();     //新增資訊
void xiaotu();    //兔子圖案
void shuchu();    //輸出全部資訊
void Alter();     //編輯資訊
void Dial();      //撥號功能

//存放通訊表的結構體陣列peisons[maxlen]的定義
struct persons
{
    int num;
    char name[20];    //姓名
    char e_addr[20];  //地址
    char tel_no[15];  //電話
    char sim_no;      //快捷鍵
    char arch[10];    //分組
	int cishu;        //撥打次數
} persons[maxlen];

//存放通訊表的連結串列的節點型別 listnode 的定義
typedef struct lnode
{
    int num;
    char name[20];    //姓名
    char e_addr[20];  //地址
    char tel_no[15];  //電話
    char sim_no;      //快捷鍵
    char arch[10];    //分組
	int cishu;        //撥打次數
    struct lnode *next;  //儲存指向下一個人的指標
} listnode, *linklist;

linklist head=NULL,r=NULL;   //初始化連結串列

listnode *s,*p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9,*p10,*p11,*p12;  //定義指標

//結構體外資訊
int i;
char name1[10],ch;
char tel_no1[15];
char arch1[10];
char sim_no1;
char e_addr1[20];
int  cishu_1=0;

FILE *fp;  //定義檔案指標


<img src="https://img-blog.csdn.net/20151225230006811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20151225230053193?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-family: Arial, Helvetica, sans-serif;" alt="" />
<img src="https://img-blog.csdn.net/20151225230141170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20151225230153784?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20151225230203081?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />