通訊錄管理系統(原創)

來源:互聯網
上載者:User

   這是本學期末要求設計的通訊錄管理系統,完全自己構思和編碼,未參照任何網路上的其它程式。程式實現比較簡單,沒有應用鏈表。

/********************************************************************
*                        通訊錄管理系統                             *
*                                     作者:zzr                      *
*                   http://blog.csdn.net/ZhengZhiRen/               *
*該程式實現功能:1.介面                                             *
*                2.添加記錄(鍵盤輸入或從檔案匯入)                   *
*                3.尋找記錄                                         *
*                4.刪除記錄                                         *
*                5.使用檔案(db.dat)儲存資料                         *
*                                                                   *
*程式在WindowsXP.SP2 + VC6.0 下調試通過                             *
*程式還存在多處Bug                                                  *
********************************************************************/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define back() show_menu()

struct record
{
    char name[20];    /*姓名*/
    char sex;        /*性別*/
    long birthday;    /*生日*/
    char email[20];    /*E-mail*/
    char tel[15];    /*電話****注意:使用字元數組儲存****/
};

void table_head()
/*該函數繪製記錄表頭部*/
{
    printf("==============================BEGIN==================================/n");
    printf("%-20s %-4s %-8s  %-20s %-15s/n","姓名","性別","生日","E-mail","電話");
}

void table_end()
/*該函數繪製記錄表尾部*/
{
    printf("===============================END===================================/n");
}

int readtoarray(char filename[],struct record rec[])
/*該函數將filename中的記錄讀入數組,返回讀入的記錄數*/
{
    struct record *p;
    int count=0;
    FILE *fp;
    
    p=rec;
    fp=fopen(filename,"r");
    while(!feof(fp))
    {
        fscanf(fp,"%s%1s%ld%s%s",p->name,&p->sex,&p->birthday,p->email,p->tel);
        p++;
        count++;
    }
    fclose(fp);
    
    return (count);
}

int add()
/*添加記錄,成功返回1*/
{
    struct record new_record;
    struct record *p;
    char c;
    FILE *fp;
    p=&new_record;

    printf("請輸入“姓名 性別(男m,女f) 生日 E-mail 電話”,用空格間隔:/n");
    scanf("%s%1s%ld%s%s",p->name,&p->sex,&p->birthday,p->email,p->tel);/*注意p->sex的輸入*/
    c=getchar();/*接收斷行符號符*/
    /*將記錄添加到db.dat*/
    fp=fopen("db.dat","a");
    fprintf(fp,"%s %c %ld %s %s/n",p->name,p->sex,p->birthday,p->email,p->tel);
    fclose(fp);
    table_head();
    printf("%-20s %-4c %-8ld  %-20s %-15s/n",p->name,p->sex,p->birthday,p->email,p->tel);
    table_end();
    printf("記錄添加成功/n");

    return (1);
}

int add_fromfile()
/*從檔案添加記錄,成功返回1*/
{
    char filename[30];/*檔案名稱*/
    struct record new_record[100];/*存放添加的記錄*/
    struct record *p;
    int i;
    int n;
    FILE *fp;

    printf("請輸入檔案名稱:/n");
    gets(filename);
    /*從檔案讀入記錄*/
    n=readtoarray(filename,new_record);
    /*將記錄添加到db.dat*/
    p=new_record;
    fp=fopen("db.dat","a");
    for(i=0;i<n;i++,p++)
        fprintf(fp,"%s %c %ld %s %s/n",p->name,p->sex,p->birthday,p->email,p->tel);
    fclose(fp);
    /*顯示輸出*/
    p=new_record;
    table_head();
    for(i=0;i<n;i++,p++)
        printf("%-20s %-4c %-8ld  %-20s %-15s/n",p->name,p->sex,p->birthday,p->email,p->tel);
    table_end();
    printf("%d條記錄已添加/n",n);

    return (1);
}

void listall()
/*列出檔案db.dat中的所有記錄*/
{
    struct record rec;
    int count=0;
    FILE *fp;
    
    table_head();
    fp=fopen("db.dat","r");
    while(!feof(fp))
    {
        fscanf(fp,"%s%1s%ld%s%s/n",rec.name,&rec.sex,&rec.birthday,rec.email,rec.tel);
        printf("%-20s %-4c %-8ld  %-20s %-15s/n",rec.name,rec.sex,rec.birthday,rec.email,rec.tel);
        count++;
    }
    fclose(fp);
    table_end();
    printf("共%d條記錄/n",count);
}

void find_record(char s[20],char c)
/*該函數在db.dat中尋找匹配的記錄,參數s為尋找的內容,參數c為尋找方式*/
{
    struct record rec[200];
    int n;/*記錄數*/
    int i;
    int count=0;

    /*將檔案db.dat中的記錄讀入數組*/
    n=readtoarray("db.dat",rec);
    /*尋找匹配的記錄並顯示*/
    table_head();
    switch(c)
    {
        case 'n':/*按姓名尋找*/
            for(i=0;i<n;i++)
                if(strcmp(rec[i].name,s)==0)
                {
                    printf("%-20s %-4c %-8ld  %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
                    count++;
                }
            break;
        case 's':/*按性別尋找*/
            for(i=0;i<n;i++)
                if(rec[i].sex==s[0])
                {
                    printf("%-20s %-4c %-8ld  %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
                    count++;
                }
            break;
        case 'b':/*按生日尋找*/
            for(i=0;i<n;i++)
                if(rec[i].birthday==atol(s))
                {
                    printf("%-20s %-4c %-8ld  %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
                    count++;
                }
            break;
        case 'e':/*按E-mail尋找*/
            for(i=0;i<n;i++)
                if(strcmp(rec[i].email,s)==0)
                {
                    printf("%-20s %-4c %-8ld  %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
                    count++;
                }
            break;
        case 't':/*按電話尋找*/
            for(i=0;i<n;i++)
                if(strcmp(rec[i].tel,s)==0)
                {
                    printf("%-20s %-4c %-8ld  %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
                    count++;
                }
            break;
    }
    table_end();
    printf("共%d條匹配的記錄/n",count);
}

void show_menu()
/*該函數顯示第一級菜單*/
{
    void menu_add();
    void menu_find();
    void menu_delete();
    char c[2];
    printf("請選擇:/n1 添加記錄/n2 尋找記錄/n3 刪除記錄/n4 列出所有記錄/n5 退出/n");
    gets(c);
    switch(c[0])
    {
        case '1':
            menu_add();
            break;
        case '2':
            menu_find();
            break;
        case '3':
            menu_delete();
            break;
        case '4':
            listall();
            break;
        case '5':
            exit(0);/*退出程式*/
            break;
    }
    back();/*返回主菜單*/
}

void menu_add()
/*該函數顯示“添加記錄”菜單*/
{
    char c[2];
    printf("請選擇:/n1 輸入/n2 從檔案添加/n3 返回/n");
    gets(c);
    switch(c[0])
    {
        case '1':
            add();
            break;
        case '2':
            add_fromfile();
            break;
        case '3':
            break;
    }
}

void menu_find()
/*該函數顯示“尋找記錄”菜單*/
{
    char c[2];
    char s[25];
    printf("請選擇:/n1 按姓名尋找/n2 按性別尋找/n3 按生日尋找/n4 按E-mail尋找/n5 按電話尋找/n6 返回/n");
    gets(c);
    switch(c[0])
    {
        case '1':
            printf("請輸入姓名:/n");
            gets(s);
            find_record(s,'n');
            break;
        case '2':
            printf("請輸入性別:/n");
            gets(s);
            find_record(s,'s');
            break;
        case '3':
            printf("請輸入生日:/n");
            gets(s);
            find_record(s,'b');
            break;
        case '4':
            printf("請輸入E-mail:/n");
            gets(s);
            find_record(s,'e');
            break;
        case '5':
            printf("請輸入電話:/n");
            gets(s);
            find_record(s,'t');
            break;
        case '6':
            break;
    }
}

void menu_delete()
/*該函數顯示“刪除記錄”菜單*/
{
    struct record rec;
    struct record records[200];
    int i;
    int n;
    int flag=0;
    FILE *fp;

    printf("請輸入“姓名 性別(男m,女f) 生日 E-mail 電話”,用空格間隔:/n");
    scanf("%s%1s%ld%s%s%*c",rec.name,&rec.sex,&rec.birthday,rec.email,rec.tel);
    /*將記錄讀入數組*/
    n=readtoarray("db.dat",records);
    n--;/*注意減1,readtoarray將檔案末的'/n'讀入作為最後一條記錄,有待改進*/
    /*刪除匹配的記錄*/
    fp=fopen("db.dat","w");
    for(i=0;i<n;i++)
    {
        if(strcmp(records[i].name,rec.name)==0 &&
            records[i].sex==rec.sex &&
            records[i].birthday==rec.birthday &&
            strcmp(records[i].email,rec.email)==0 &&
            strcmp(records[i].tel,rec.tel)==0
            )
        {
            flag++;
            continue;/*跳過匹配的記錄*/
        }
        fprintf(fp,"%s %c %ld %s %s/n",
            records[i].name,records[i].sex,records[i].birthday,records[i].email,records[i].tel);
    }
    fclose(fp);
    printf("%d條記錄已刪除/n",flag);
}

void main()
{
    FILE *fp;
    /*如果沒有檔案db.dat,則建立*/
    fp=fopen("db.dat","a");
    fclose(fp);
    /*顯示菜單*/
    show_menu();
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.