电子通讯录

电子通讯录功能如下:
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);
}

 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目: 为某高校的学籍和成绩管理设计一系统。要求建立的数据有: (1)学生类,包含班级号、学号、姓名、专业等成员; (2)学生成绩类,包含班级号、学号,课程名,成绩等成员。 完成下列功能:首先输入学生数据及成绩数据,再根据提示分别实现查找功能。其中:  函数 Xslr 负责学生数据录入;  函数 Cjlr 负责成绩数据录入;  函数 Look1 负责根据姓名查找学生的基本信息和成绩信息;  函数 Look2 负责根据班级列出学生的基本信息;  函数 Dayin1 负责依据班级输出满足条件的学生的基本情况;  函数 Dayin2 负责输出某一同学的成绩单。   题目: 设计一个电子通信录。其中包括如下类: (1)通信地址类 addr。包含公有数据:  成员 char post[10]; //邮编  成员 char ad[40]; //家庭地址  构造函数 addr(char p[10]="",char a[40]="");  成员函数 void setadd(addr a); //用 a 为当前对象赋值 (2)出生年月类 birth。包含公有数据:  成员 int year; //年份  成员 int month; //月份  成员 int day; //日期  构造函数 birth(int y=0,int m=0,int d=0);  成员函数 void setbir(birth b); //用 b 为当前对象赋值 (3)类 friends。包含数据:  私有成员 int number; //序号  私有成员 char name[20]; //姓名  私有成员 char sex; //性别  私有成员 char telephone[13]; //联系电话  公有成员 birth bir; //出生年月  公有成员 addr add; //通信地址  公有构造函数 friends(int nu=0,char n[20]=" ",char s=' ',int y=0,int m=0,int d=0,char p[10]=" ",char a[40]=" ",char t[13]=" ");  公有成员函数 void setfri(int nu,char n[20],char s,birth b,addr a,char t[13]); //为 当前对象赋值  公有成员函数 friends input(friends &bb); //为对象 bb 输出数据  公有成员函数 int search(friends aa[100],char n[20]); //在 aa 中查找姓名为 n 的对象  公有成员函数 void show(friends aa); //输出对象 aa  公有成员函数 void delet(friends aa[100],int k); //在 aa 中删除下标为 k 的元素 (4)在主函数中完成主菜单的设计,并根据输入值完成所需操作。  
好的,下面是一个简单的电子通讯录程序的实现示例: ```go package main import ( "fmt" ) type Contact struct { name string number string email string } func main() { contacts := make(map[string]Contact) // 添加联系人 contacts["张三"] = Contact{name: "张三", number: "123456789", email: "[email protected]"} contacts["李四"] = Contact{name: "李四", number: "987654321", email: "[email protected]"} contacts["王五"] = Contact{name: "王五", number: "555555555", email: "[email protected]"} // 显示联系人列表 fmt.Println("联系人列表:") for _, contact := range contacts { fmt.Printf("%s, %s, %s\n", contact.name, contact.number, contact.email) } // 根据名字查找联系人 fmt.Println("查找联系人:") name := "张三" if contact, ok := contacts[name]; ok { fmt.Printf("%s, %s, %s\n", contact.name, contact.number, contact.email) } else { fmt.Printf("找不到名字为 %s 的联系人\n", name) } // 修改联系人信息 fmt.Println("修改联系人:") name = "李四" if contact, ok := contacts[name]; ok { contact.number = "888888888" contact.email = "[email protected]" contacts[name] = contact fmt.Printf("%s, %s, %s\n", contact.name, contact.number, contact.email) } else { fmt.Printf("找不到名字为 %s 的联系人\n", name) } // 删除联系人 fmt.Println("删除联系人:") name = "王五" if _, ok := contacts[name]; ok { delete(contacts, name) fmt.Printf("已删除名字为 %s 的联系人\n", name) } else { fmt.Printf("找不到名字为 %s 的联系人\n", name) } // 显示修改后的联系人列表 fmt.Println("修改后的联系人列表:") for _, contact := range contacts { fmt.Printf("%s, %s, %s\n", contact.name, contact.number, contact.email) } } ``` 这个程序使用了一个 `Contact` 结构体来表示联系人,使用了一个 `map` 来存储所有联系人。程序中包含了添加、查找、修改、删除联系人等功能。你可以根据自己的需求来修改和扩展这个程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值