通讯录管理系统(原创)

   这是本学期末要求设计的通讯录管理系统,完全自己构思和编码,未参照任何网络上的其它程序。程序实现比较简单,没有应用链表。



/********************************************************************
*                        通讯录管理系统                             *
*                                     作者: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();
}

你可能感兴趣的:(struct,table,FP,menu,电话,通讯录管理)