电子通讯录

来源:互联网 发布:华为绑定acl到端口 编辑:程序博客网 时间:2024/04/27 15:26

电子通讯录功能如下:
Function choose
1.Read
2.Append
3.Delete
4.Search
5.Save and exit
6.Quit
说明:上图是电子通讯录的主菜单,利用它,将能够轻松地录入一个朋友的电话号
码,通讯地址和出生日期,而且它还提供了检索和删除功能。在后面还将提供按生
日先后排序的功能,这些都有助于该通讯录的管理。
电子通讯录是采用线性表作为程序的基本结构的。
    设计思想:
1。用顺序表设计电子通讯录的结构
为了表示较为复杂的数据内容,一般用结构这种数据类型,第一步就是在结构中定
义所需要的各项信息。
    一般的通讯录都包括姓名,性别,出生年月,通讯地址和联系电话这几项,而
在这几项中,出生年月又包括年份,月份和日期三项,通讯地址包括邮编和家庭地
址二项,我们把这些联系较为紧密的内容又用单独的结构表示,这样就产生了电子
通讯录的基本结构:
struct addr             /*通讯地址结构定义*/
{   char post_num[10];  /*邮编*/
    char addr[40];      /*家庭地址*/
};
struct birth      /*出生年月结构定义*/
{   int year;     /*年份*/
    int month;    /*月份*/
    int day;      /*日期*/
};
struct friend     /*电子通讯录结构定义*/
{   int number;       /*序号*/
    char name[20]     /*姓名*/
    char sex;             /*性别*/
    struct birth birth;   /*出生年月*/
    struct addr addr;     /*通信地址*/
    char telephone[13];   /*联系电话*/
};    

定义的主结构friend包含了前述的五项内容 name,sex,和telephone分别代表
了姓名,性别和联系电话。为了让结构中的各项组分更加清晰,定义了二个
小结构birth 和addr分别代表出生年月和通讯地址,因此实际上friend包含了
8项内容。
    有了结构定义后,我们可以很轻松地构造出电子通讯录的主体:
stryct friend friends[50];
采用一维数组 friends[50],正是用到了顺序表这种最简单的数据结构来表示
问题。
2.增添电子通讯录中的内容
    对于电子通讯录这样一张顺序表来说,内容的录入是必不可少的操作。由
于采用的是顺序存储结构。这项工作很简单,只需要在把输入的信息按顺序放
在空的friends数组元素中即可。函数Data_Input完成了信息的录入工作:

void Data_input(int j)
{
    friends[j].number=j;
    printf("/n/n/n/tNo %d record",j);
    printf("/n/n/tName:");     /*读入姓名*/
    scanf("%s",friends[j].name);
    printf("/n/tSex(m/f):");     /*读入姓别*/
    scanf("%c",&friends[j].sex);
    printf("/n/tbirthday:");     /*读入出生年月*/
    printf("/n/t/tyear:");
    scanf("%d",&friends[j].birth.year);
    printf("/n/t/tmonth");
    scanf("%d",&friends[j].birth.month);
    printf("/n/t/tday");
    scanf("%d",&friends[j].birth.day);

    printf("/n/tPost number:");   /*读入邮编*/
    scanf("%s",friends[j].addr.post_num);
    printf("/n/tAddress:");   /*读入家庭地址*/
    scanf("%s",friends[j].addr.addr);
    printf("/n/ttelephone:");   /*读入联系电话*/
    scanf("%s",friends[j].telephone);
}

录入完毕后典型的一份信息如下所示:
NO:    1
Name:  张三
Sex:    m
Birthday(y/m/d):  1980   5  12
Postnum:   100034
Address:   Beijing University
Tele:    (010)62005200

3.电子通讯录记录的维护(插入与删除)
在实际使用中,数据资料输入后,还需要不断的更新和维护操作,最常见的是数
据的插入与删除。作为顺序表来说,如何在插入与删除数据资料后仍然能保持
原有数据之间的关系,是需要考虑的关键问题。
    电子通讯录的插入算法如下:
printf("/n/tInsert No:");    /*录入插入位置*/
scanf("%d",&k);
for(j=i+1;j>k;j--)    /*插入位置后的元素顺序后移*/
{   strcpy(friends[j].name,friends[j-1].name);  /*交换元素内容*/
    friends[j].sex=friends[j+1].sex;
    friends[j].birth.year=friends[j-1].birth.year;
    friends[j].birth.month=friends[j-1].birth.month;
    friends[j].birth.day=friends[j-1].birth.day;
    strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
    strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
    strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);    /*插入位置上填入待插入元素*/
i++;              /*总元素个数增1*/

删除算法如下:
printf("/n/tDelete No:");    /*读入删 除位置*/
scanf("%d",&k);
for(j=k;j<i;j++)     /*删 除位置前的元素顺序前移*/
{
    strcpy(frinds[j].name,frinds[j+1].name);
    friends[j].sex=frinds[j+1].sex;
    friends[j].birth.year=friends[j+1].birth.year;
    friends[j].birth.month=friends[j+1].birth.month;
    frinds[j].birth.day=friends[j+1].birth.day;
    strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
    strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
    strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--;       /*元素总数减1*/

函数search的代码如下:
search()
{
    printf("/n/tPlease input name:");   /*提示输入要查询的姓名*/
    gets(search_name);
    for(j=1;j<=i;j++)
    {   if(strcmp(search_name,friends[j].name)==0)   /*比较二个串*/
        {   Data_Show(j);   /*查询成功,打印记录,结束循环*/
            break;
        }
    }
    if(j>1)      /*查询失败,给出提示信息*/
        printf("/n/t No such records");
}

文件存盘代码如下
FILE *fp;
void Data_Save()
{
    int j;
    fp=fopen("friend.txt,"w");  /*c以可写方式打开或创建文件friend.txt*/
    for(j=1;j<=i;j++)
        fwrite(&friends[j],sizeof(struct friend),1,fp);
    fclose(fp);
}
处理有关的文件操作,最容易忽视的就是关闭文件的操作..如果不及时关闭,容易造成
文件内容的丢失,或者占用大量的内存,导至程序的执行速度下降。

从文件friend.txt读取记录的代码如下:
void Data_Load()
{
    int j;
    long k;
    fp=fopen("friend.txt","r+t);   /*打开文件friend.txt*/
    if(fp!=NULL)
    {   for(i=1;i<50;i++)
        {   if(j=fgetc(fp)==EOF)   /*判断是否到了文件尾*/
            return;
            k=i-1;
            fseek(fp,k*sizeof(struct friend),SEEK_SET);
            fread(&friends[i],sizeof(struct friend),1,fp);  /*从文件中读一条记录*/
        }
    }
    else       /*如果文件不存在*/
    {   fp=fopen(friend.txt","w");
        i=1;
    }
}

6.完成电子通讯录的主函数
在前面五个步聚的基础上开始进行程序主函数的设计。主函数首先调用初始化函数
Data_Load从已有文件friend.txt读取记录,如果是第一次使用,那么该文件不存在就创建
一个新文件,接下来程序进入一个无限循环,首先用一系列printf语句打印出各功能的选择
菜单,并提示按下数字键调用相应的功能。这里使用了switch分支结构来处理按键消息,这
是一种典型的用法,当选择了‘quit''''菜单后,程序给出是否存盘的提示。

/*---------全部源代码如下-------------------*/
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct addr             /*通讯地址结构定义*/
{   char post_num[10];  /*邮编*/
    char addr[40];      /*家庭地址*/
};
struct birth      /*出生年月结构定义*/
{   int year;     /*年份*/
    int month;    /*月份*/
    int day;      /*日期*/
};
struct friend1     /*电子通讯录结构定义*/
{   int number;       /*序号*/
    char name[20];     /*姓名*/
    char sex;             /*性别*/
    struct birth birth;   /*出生年月*/
    struct addr addr;     /*通信地址*/
    char telephone[13];   /*联系电话*/
}friends[50];
FILE *fp;
int i;

void Data_Load()
{   int j;
    long k;
    fp=fopen("friend.txt","r+t");   /*打开文件friend.txt*/
    if(fp!=NULL)
    {   for(i=1;i<50;i++)
 {   j=fgetc(fp);
     if(j==EOF)    /*判断是否到了文件尾*/
               return;
     k=i-1;
     fseek(fp,k*sizeof(struct friend1),SEEK_SET);
     fread(&friends[i],sizeof(struct friend1),1,fp);/*从文件中读取一条记录*/
         }
    }
    else
    {   fp=fopen("friend.txt","w");
        i=1;
    }
}

void Data_Show(int j)    /*打印记录的详细资料*/
{
    printf("/n/n/tNo:%3d/n",friends[j].number);
    printf("/n/tBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);
    printf("/n/tPostnum:%-10s",friends[j].addr.post_num);
    printf("/n/taddress:%-40s",friends[j].addr.addr);
    printf("/n/tTele%-13s",friends[j].telephone);
}

void Data_Input(int j)    /*记录插入函数*/
{
    fflush(stdin);
    friends[j].number=j;
    printf("/n/n/n/tNo %d record",j);
    printf("/n/n/tName:");      /*读入姓名*/
    scanf("%s",friends[j].name);
    fflush(stdin);
    printf("/n/tSex(m/f):");    /*读入性别*/
    scanf("%c",&friends[j].sex);
    printf("/n/t---birthday---");   /*读入出生年月*/
    printf("/n/tyear:");
    scanf("%d",&friends[j].birth.year);
    printf("/n/t/tmonth:");
    scanf("%d",&friends[j].birth.month);
    printf("/n/t/tday:");
    scanf("%d",&friends[j].birth.day);
    printf("/n/tPost_number:");   /*读入邮编*/
    scanf("%s",friends[j].addr.post_num);
    printf("/n/tAddress:");    /*读入家庭地址*/
    scanf("%s",friends[j].addr.addr);
    printf("/n/ttelephone:");    /*读入联系电话*/
    scanf("%s",friends[j].telephone);
}

void Data_Save()
{
    int j;
    fp=fopen("friend.txt","w");
    for(j=1;j<=i;j++)
    {   fwrite(&friends[j],sizeof(struct friend1),1,fp);
    }
}

void main()
{
    int j,k;
    char ch;
    char *search_name;
    clrscr();
    Data_Load();
    i--;
    do
    {   printf("/n/n/n/tFunction choose:");
        printf("/n/t1.Read");
        printf("/n/t2.Append");
        printf("/n/t3.Delete");
        printf("/n/t4.Search");
        printf("/n/t5.Insert");
        printf("/n/t6.Save and Exit");
        printf("/n/t7.Quit");
        printf("/n/n");
        printf("/tChoice:");
        ch=getche();
        switch(ch)
        {   case '1': j=1;     /*显示通讯录中的所有记录*/
             while(getch()!=0x1b&&j<=i) Data_Show(j++);
             if(j>i) printf("/n/tEnd of e_note/n");
                break;
            case '2':          /*增加通讯录中的记录*/
              while(getch()!=0x1b&&i<50)
              {   i++;
                  Data_Input(i);
              }
              if(i==50)printf("/n/te_note is filled/n");
                  break;
            case '3':           /*删除通讯录中的记录*/
              if(i<1)
              {   printf("/n/tNo records/n");
                  break;
              }
              printf("/n/tDelete No:");    /*读入删除位置*/
              scanf("%d",&k);
              for(j=k;j<i;j++)   /*删除位置前的元素顺序前移*/
              {   strcpy(friends[j].name,friends[j+1].name);
                  friends[j].sex=friends[j=1].sex;
                  friends[j].birth.year=friends[j+1].birth.year;
                  friends[j].birth.month=friends[j+1].birth.month;
                  friends[j].birth.day=friends[j+1].birth.day;
                  strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
                  strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
                  strcpy(friends[j].telephone,friends[j+1].telephone);
              }
              i--;      /*元素总数减1*/
              break;
            case '4':      /*通讯录查询功能*/
              printf("/n/tPlease input name:");
              gets(search_name);
              for(j=1;j<=i;j++)
              {
                  if(strcmp(search_name,friends[j].name)==0)  /*比较字符串*/
                  {   Data_Show(j);  /*查询成功,打印记录结束循环*/
                       break;
                  }

              }
              if(j>1)     /*查询失败*/
              printf("/n/t No such records");
              break;
            case '5':
              printf("/n/tInsert No:");     /*录入插入位置*/
              scanf("%d",&k);
              for(j=i+1;j<k;j++)  /*插入位置后的元素顺序后移*/
              {   strcpy(friends[j].name,friends[j-1].name); /*交换元素内容*/
                  friends[j].sex=friends[j-1].sex;
                  friends[j].birth.year=friends[j-1].birth.year;
                  friends[j].birth.month=friends[j-1].birth.month;
                  friends[j].birth.day=friends[j-1].birth.day;
                  strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
                  strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
                  strcpy(friends[j].telephone,friends[j-1].telephone);
              }
              Data_Input(k);
              i++;
              break;
            case '6': Data_Save();
              exit(0);  break;
            case '7': printf("/n/tDo you want to save e_note:(y/n)");
              ch=getch();
              if(ch=='y') Data_Save();
              fclose(fp);
              exit(0);
            default: printf("Please choose num 1-4/n");
         }
    }while(1);
}

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东货到付款支付宝支付退款怎么办 美萍餐饮管理系统下单错误怎么办 淘宝店上传宝贝显示空间不足怎么办 淘宝店品牌被投诉未授权怎么办 淘宝天猫退货单号填错了怎么办 淘宝退货我把快递单号弄丢了怎么办 唯品会退货快递单号填错了怎么办 天猫换货写错运单号怎么办 训练衣舍的店铺名连接怎么办 兼职模特被骗去微整还贷了款怎么办 卖家已经发货了我要退款怎么办 卖家显示发货单号信息查不到怎么办 淘宝申请退款卖家发货了怎么办 咸鱼卖家不发货好会自动退款怎么办 淘宝卖家涨价后不发货怎么办 淘宝卖家发货选错在线下单怎么办 申请退款后卖家又虚假发货了怎么办 公司用淘宝没发票做账怎么办 淘宝网买了假货确认了怎么办? 吃了安眠药睡了一天还没有醒怎么办 淘宝买的东西退货快递弄丢了怎么办 在淘宝上已付钱店家说没货了怎么办 从淘宝物流寄东西到国外被扣怎么办 不是天猫的淘宝卖家不发货怎么办 微店违规说卖假冒商品怎么办 云集微店的商品没货了怎么办 淘宝买家被检测有虚拟交易怎么办 媒体声音突然没有声音了该怎么办 华为微信运动步数为零怎么办 淘宝店铺没货了客户拍了怎么办 房子涨价了卖家反悔不卖了怎么办 买的东西很贵质量不好怎么办 在淘宝开的店账号忘了怎么办 建了个淘宝优惠券群没人购物怎么办 刚开的淘宝店没有生意怎么办 房产代理公司不给渠道结佣金怎么办 天猫超过72小时不发货怎么办 流量魔盒苹果下载怎么打不开怎么办 淘宝包邮店铺新疆地区拍怎么办 淘宝客服当顾客要优惠时怎么办 微信手机号注册的找不到了怎么办