C语言实现通讯录

打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、通讯录准备

1.  通讯录信息的准备

2.  通讯录功能的框架

3. 文件安排

二、实现通讯录的功能

1.  添加功能

2.  删除功能

3.  展示功能

4.  更改功能

5.  查找功能

6.  排序功能

三、总结

1.在main函数中,采用&的原因

2.在使用scanf函数时,为何某些参数不需要&,而有一些参数需要使用&

3.在添加功能中,传递的参数:ps->data[ps->size].xxxx 中,为什么访问xxxx时使用的是 点操作符,而不是 箭头操作符

一、通讯录的准备

1.通讯录信息的准备

通讯录中要有 人名、年龄、性别、地址、手机号码这些信息,因此我们可以通过结构体进行实现。
我们在实现了通讯录的基本信息后,我们需要对通讯录的各个信息大小进行设置,以及通讯录的长度等,并将功能进行声明。
将以上要求写入头文件(contact.h)中
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX_NAME 20
  4. #define MAX_SEX 4
  5. #define MAX_ADDR 20
  6. #define MAX_TELE 12
  7. #define MAX 1000
  8. struct PeoInfo{
  9.   char name[MAX_NAME];
  10.   int age;
  11.   char sex[MAX_SEX];
  12.   char addr[MAX_ADDR];
  13.   char tele[MAX_TELE];
  14. }
  15. struct Contact{
  16.   struct PeoInfo data[MAX];
  17.   int size;                //通讯录的现有长度
  18. }
  19. //初始化通讯录
  20. void InitContact(struct Contact*ps);
  21. //增加功能
  22. void AddContact(struct Contact*ps);
  23. //删除功能
  24. void DelContact(struct Contact*ps);
  25. //更改功能
  26. void ModifyContact(struct Contact*ps);
  27. //查找功能
  28. void SearchContact(const struct Contact*ps);    //此处使用const,是因为查找并不改变数据,展示也是同理
  29. //展示功能
  30. void ShowContact(const struct Contact*ps);
  31. //排序功能
  32. void SortContact(struct Contact*ps);
复制代码
2.通讯录功能的大致框架

通讯录的功能中包含增删改查,我们在此基础上,增加了展示功能以及排序功能,以及使用之前需要初始化,其大致框架如下:写入test.c中
  1. #include"contact.h"
  2. void menu(){
  3.   printf("********************\n");
  4.   printf("**1.增加    2.删除***\n");
  5.   printf("**3.更改    4.查找***\n");
  6.   printf("**5.展示    6.搜索***\n");
  7.   printf("**0.退出         ***\n");
  8.   printf("********************\n");
  9.   
  10. }
  11. int main(){
  12.   int input=0;
  13.   struct Contact con;     //创建通讯录
  14.   InitContact(&con);      //初始化通讯录
  15.   do{
  16.     menu();
  17.     printf("输入您的选择:>");
  18.     scanf("%d",&input);
  19.     switch(input){
  20.     case ADD:
  21.         AddContact(&con);           //增加功能      与枚举中的ADD对应   1
  22.     case DEL:
  23.         DelContact(&con);           //删除功能      与枚举中的DEL对应   2
  24.     case MODIFY:
  25.         ModifyContact(&con);        //更改功能
  26.     case SEARCH:
  27.         SearchContact(&con);        //搜索功能
  28.     case SHOW:
  29.         ShowContact(&con);          //展示功能
  30.     case SORT:
  31.         SortContact(&con);          //排序功能
  32.     case EXIT:                                  // 与枚举中的EXIT对应  0
  33.         printf("退出\n");
  34.     default:
  35.         printf("请输入0——6范围内的数字\n");
  36.    
  37.   }
  38.     }while(input);
  39. }
复制代码
上述代码中的switch选项 是通过头文件中的枚举进行实现的,写入contact.h中,代码如下
  1. enum Option
  2. {  
  3.    EXIT,              //此处采用枚举进行一个switch的选项,枚举中
  4.    ADD,               //首项默认为0,然后依次加1,最终各项正好与switch()中的选项值相等
  5.    DEL,               //于是当输入0~6时,对应test.c中的功能
  6.    MODIFY,
  7.    SEARCH,
  8.    SHOW,
  9.    SORT
  10. }            
复制代码
3.文件安排

我们使用三个文件进行通讯录的实现:
1.test.c
2.contact.h
3.contact.c
我们将main函数放在test.c文件中,而通讯录信息等数据结构,预处理,声明等放在contact.h文件中,而具体功能放置在contact.c文件中
初始化代码如下(写入contact.c中):
  1. void InitContact(struct Contact*ps){
  2.   memset(ps->data,0,sizeof(ps->data));
  3.   ps->size=0;
  4. }
复制代码
二、通讯录功能的实现

1.添加功能
  1. void AddContact(struct Contact*ps){
  2.       if(ps->size==MAX)
  3. {    printf("已满,无法添加\n");  
  4. }
  5.      else
  6. {
  7.   printf("请输入添加的人名:>");
  8.   scanf("%s",ps->data[ps->size].name);        //data作为数组名时,代表的是指针,当我们要其内部成员时,需要使用箭头操作符
  9.   printf("请输入添加的年龄:>");                 //但当以数组形式时,data[i],这种形式时
  10.   scanf("%d",&(ps->data[ps->size].age));    //此时是一个命名的具体的单个结构体,于是我们用
  11.   printf("请输入添加的性别:>");                //点操作符直接访问其内部成员,而不是箭头操作符
  12.   scanf("%s",ps->data[ps->size].sex);  
  13.   printf("请输入添加的地址:>");
  14.   scanf("%s",ps->data[ps->size].addr);  
  15.   printf("请输入添加的电话:>");
  16.   scanf("%s",ps->data[ps->size].tele);  
  17.   
  18.   ps->size++;
  19. }
  20. }
复制代码
2.删除功能
  1. void FindByNmae(struct Contact*ps)
  2. {  
  3.   char name[MAX_NAME];
  4.   printf("输入查找的名字:>");
  5.   scanf("%s",&name);
  6.   int i=0;
  7.   for(i=0;i<ps->size;i++)
  8.     {  if(0==strcmp(name,ps->data[i].name)
  9.             return i;)
  10.         }
  11.    return -1;
  12. }
  13. void DelContact(struct Contact*ps)
  14. {
  15.   //查找功能
  16.   int pos=FindByName(ps);
  17.   //删除功能
  18.   if(pos==-1)
  19.   {printf("没有此人\n");
  20.   }
  21.   else
  22. {  int j=0;  
  23.    for(j=pos;j<ps->size-1;j++)
  24.     {
  25.         ps->data[ret].name=ps->data[ret+1].name;
  26.           }
  27.     ps->size--;
  28.     printf("删除成功\n");
  29. }
  30. }
复制代码
3.更改功能
  1. void ModifyContact(struct Contact*ps)
  2. {
  3.   int pos=FindByName(ps);
  4.   if(pos==-1)
  5.     {
  6.       printf("查无此人\n");  
  7.       }
  8.   else
  9.   {
  10.   printf("请输入更改的人名:>");
  11.   scanf("%s",ps->data[pos].name);  
  12.   printf("请输入更改的年龄:>");
  13.   scanf("%d",&(ps->data[pos].name));  
  14.   printf("请输入更改的性别:>");
  15.   scanf("%s",ps->data[pos].sex);  
  16.   printf("请输入更改的地址:>");
  17.   scanf("%s",ps->data[pos].addr);  
  18.   printf("请输入更改的电话:>");
  19.   scanf("%s",ps->data[pos].tele);  
  20.   }
  21. }
复制代码
4.查找功能
  1. void SearchContact(const struct Contact*ps)
  2. {
  3.   int pos=FindByName(ps);
  4.   if(pos==-1)
  5.   {
  6.     printf("查无此人\n");
  7. }
  8.   else
  9. {
  10.   printf("%20s\t%4s\t%10s\t%12s\t%20s\t","姓名","年龄","性别","地址","电话");
  11.   printf("%20s\t%4d\t%10s\t%12s\t%20s\t",
  12.       ps->data[pos].name,
  13.       ps->data[pos].age,
  14.       ps->data[pos].sex,
  15.       ps->data[pos].addr,
  16.       ps->data[pos].tele);
  17. }
  18. }
复制代码
5.展示功能
  1. void ShowContact(const struct Contact *ps)
  2. {
  3.   if(ps->size==0)
  4.   {
  5.       printf("列表为空\n");
  6. }
  7.   else
  8.   {
  9.     printf("%20s\t%4s\t%10s\t%12s\t%20s\t","姓名","年龄","性别","地址","电话");
  10.     int i=0;  
  11.     for(i=0;i<ps->size;i++)
  12.       {      
  13.       printf("%20s\t%4d\t%10s\t%12s\t%20s\t",
  14.       ps->data[i].name,
  15.       ps->data[i].age,          //此处age为%d,是因为age在结构体中为int型
  16.       ps->data[i].sex,
  17.       ps->data[i].addr,
  18.       ps->data[i].tele);
  19. }
  20. }   
  21. }
复制代码
6.排序功能
  1. void bubble_sort(struct Contact*ps)
  2. {
  3.   int i=0;
  4.   for(i=0;i<ps->size;i++)
  5.   {
  6.       int j=0;
  7.       for(j=0;j<ps->size-1-i;j++)
  8.     {
  9.         if(ps->data[j].age>ps->data[j+1].age)
  10.       {
  11.           struct PeoInfo tmp=ps->data[j];
  12.           ps->data[j]=ps->data[j+1];
  13.           ps->data[j+1]=tmp;
  14.     }            
  15. }
  16. }
  17. }
  18. void SortContact(const struct Contact*ps)
  19. {
  20.   bubble_sort(ps);
  21.   printf("排序成功\n");        //该功能是通过年龄进行排序的
  22. }
复制代码
三、总结

1.在main函数中,采用&的原因

因此此时我们在main函数中创建了con,此时的con只是一个结构体,因此当我们需要进行操作时,我们需要取其地址,再进行操作,于
是传递的参数便是  &con
2.在使用scanf函数时,为何某些参数不需要&,而有一些参数需要使用&

在增加功能中,我们可以看到scanf中,有些参数传递时需要 &符号,而有些不需要,是因为类型不同,name,sex,addr,tele等参数在
struct PeoInfo中是数组,数组名在使用时会产生 指针常量,指向第一个元素地址,因此不需要,而age需要&符号,是因为此时age是
int类型,需要传递其地址,才能修改其值。
3.在添加功能中,传递的参数:ps->data[ps->size].xxxx 中,为什么访问xxxx时使用的是 点操作符,而不是 箭头操作符

因为此时data[ps->size],此时的data是一个命名的单个的结构体,而不是指针,因此在访问其成员时,使用的是点头操作符。
若此时只有数组名data,则传递的是一个常量指针,此时使用的便是 箭头操作符。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表