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

来源:互联网 发布:linux java 参数设置 编辑:程序博客网 时间:2024/04/27 08:37


/*********************************************************** 

*版权所有  (C)2016. Hu Xinyue 

* 

*文件名称:   txl.cpp 

*文件标识:   无 

*内容摘要:   该项目的所有函数的实现 

*其他说明:   无 

*当前版本:   V1.0 

*作   者:    胡馨月

*完成日期:   20161229

* 

*修改记录1: 

*修改日期:   20161229 

*版本号:     V1.0 

*修改人:     Hu Xinyue

*修改内容: 

********************************************************************/ 

 #include"txl.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.显示分组信息              5.拨号                    +"<<endl; 
        cout<<"          +   2.删除信息                  6.保存并退出              +"<<endl; 
        cout<<"          +   3.添加信息                  7.查找信息                +"<<endl; 
        cout<<"          +   4.编辑信息                  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\t   请重新输入,请选择是重新输入(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<<endl; 
            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); 
    } 


/*********************************************************** 

*版权所有  (C)2016. Hu Xinyue 

* 

*文件名称:   txl.cpp 

*文件标识:   无 

*内容摘要:   该项目的所有函数的实现 

*其他说明:   无 

*当前版本:   V1.0 

*作   者:    胡馨月

*完成日期:   20161229

* 

*修改记录1: 

*修改日期:   20161229 

*版本号:     V1.0 

*修改人:     Hu Xinyue

*修改内容: 

********************************************************************/ 

#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;  //定义文件指针 


0 0