• 通讯录的实现(详解)


    本篇博客将为大家带来通讯录的实现!!!

    目录

    通讯录的基本介绍:

     通讯录的实现过程:

    1.设计通讯录的目录

    2.基础菜单的实现:

    3.定义人的信息

    4.定义通讯录的信息

    5.创建通讯录并且初始化

    6.添加联系人的信息

    7.显示通讯录的信息

    8.删除联系人的信息

    9.查找联系人的信息

    10.修改联系人的信息

    11.排序联系人的信息—按名字排序

    完整代码展现:

    test.c:

    contact.c:

    contact.h:

    结语:


    通讯录的基本介绍:

    记录一个人的基本信息,并且需要它可以实现增删查改等功能;

    可以保存100个人的信息                                    人的信息:

            1.添加联系人信息;                                    名字

            2.删除联系人信息;                                    年龄

            3.查找联系人信息;                                    性别

            4.修改联系人信息;                                    电话

            5.显示联系人信息;                                    地址

            6.排序联系人信息;

            0.退出程序 

         


     通讯录的实现过程:

    建议:实现之前我们可以分成三个模块

    test.c用于专门测试通讯录功能

    contact.c用于实现通讯录具体功能

    contact.h用于实现接口的声明

    1.设计通讯录的目录

    1. void menu()
    2. {
    3. printf("******************************************\n");
    4. printf("***** 1.add 2.del ****\n");
    5. printf("***** 3.search 4.modify ****\n");
    6. printf("***** 5.show 6.sort ****\n");
    7. printf("***** 0. exit ****\n");
    8. printf("******************************************\n");
    9. }

    2.基础菜单的实现:

    1. #include
    2. void menu()
    3. {
    4. printf("******************************************\n");
    5. printf("***** 1.add 2.del ****\n");
    6. printf("***** 3.search 4.modify ****\n");
    7. printf("***** 5.show 6.sort ****\n");
    8. printf("***** 0. exit ****\n");
    9. printf("******************************************\n");
    10. }
    11. enum
    12. {
    13. EXIT,
    14. ADD,
    15. DEL,
    16. SEARCH,
    17. MODIFY,
    18. SHOW,
    19. SORT
    20. };
    21. int main()
    22. {
    23. int input = 0;
    24. do
    25. {
    26. menu();
    27. printf("请输入:>");
    28. scanf("%d", &input);
    29. switch (input)
    30. {
    31. case ADD:
    32. break;
    33. case DEL:
    34. break;
    35. case SEARCH:
    36. break;
    37. case MODIFY:
    38. break;
    39. case SHOW:
    40. break;
    41. case SORT:
    42. break;
    43. case EXIT:
    44. printf("退出通讯录\n");
    45. break;
    46. default:
    47. printf("选择错误,请重新选择\n");
    48. break;
    49. }
    50. } while (input);
    51. return 0;
    52. }

    3.定义人的信息

    1. #define NAME_MAX 20
    2. #define SEX_MAX 5
    3. #define TELE_MAX 12
    4. #define ADDR_MAX 30
    5. //定义人的信息
    6. typedef struct PeoInfo
    7. {
    8. char name[NAME_MAX];
    9. int age;
    10. char sex[SEX_MAX];
    11. char tele[TELE_MAX];
    12. char addr[ADDR_MAX];
    13. }PeoInfo;

    4.定义通讯录的信息

    1. #define MAX 100
    2. typedef struct Contact
    3. {
    4. PeoInfo data[MAX];//存放数据
    5. int sz;//记录的时当前通讯录中存放的人的信息个数
    6. }Contact;

    5.创建通讯录并且初始化

    通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化

    1. void InitContact(Contact* con)
    2. {
    3. assert(con);
    4. con->sz = 0;
    5. memset(con->data, 0, sizeof(con->data));
    6. }

     现在已经全部初始化为0 如果不初始化将会是随机值

    注:实现过程都是在contact.c中的文件实现

    6.添加联系人的信息

    1. void ADDContact(Contact* con)
    2. {
    3. assert(con);
    4. //判断一下通讯录是否满了
    5. if (con->sz == MAX)
    6. {
    7. printf("通讯录已满,无法添加\n");
    8. return ;
    9. }
    10. printf("请输入联系人名字\n");
    11. scanf("%s", con->data->name);
    12. printf("请输入联系人年龄\n");
    13. scanf("%d", &(con->data->age));
    14. printf("请输入联系人性别\n");
    15. scanf("%s", con->data->sex);
    16. printf("请输入联系人电话\n");
    17. scanf("%s", con->data->tele);
    18. printf("请输入联系人地址\n");
    19. scanf("%s", con->data->addr);
    20. con->sz++;
    21. printf("添加完成\n");
    22. }

    7.显示通讯录的信息

    既然已经完成了添加联系人的信息了,我们可以显示一下到底输入了什么

    1. void SHOWContact(Contact* con)
    2. {
    3. assert(con);
    4. if (con->sz == 0)
    5. {
    6. printf("通讯录无内容\n");
    7. return;
    8. }
    9. printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    10. int i;
    11. for (i = 0; i < con->sz; i++)
    12. {
    13. printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name,
    14. con->data[i].age,
    15. con->data[i].sex,
    16. con->data[i].tele,
    17. con->data[i].addr);
    18. }
    19. }

    8.删除联系人的信息

    1. int Fing_by_name(Contact* con, char* name)
    2. {
    3. assert(con);
    4. int i;
    5. for (i = 0; i < con->sz; i++)
    6. {
    7. if (strcmp(con->data[i].name, name) == 0)
    8. {
    9. return i;
    10. }
    11. }
    12. return -1;
    13. }
    14. void DELContact(Contact* con)
    15. {
    16. char name[NAME_MAX];
    17. assert(con);
    18. if (con->sz == 0)
    19. {
    20. printf("通讯录为空,无法删除\n");
    21. return ;
    22. }
    23. printf("请输入你想删除联系人的名字:\n");
    24. scanf("%s", name);
    25. // 查找通讯录里有没有该名字
    26. int ret=Fing_by_name(con, name);
    27. if (ret == -1)
    28. {
    29. printf("要删除的人不存在\n");
    30. return ;
    31. }
    32. //否则返回他的下标
    33. //思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可
    34. int i;
    35. for (i = ret; i < con->sz - 1; i++)
    36. {
    37. con->data[i] = con->data[i + 1];
    38. }
    39. con->sz--;
    40. printf("删除成功\n");
    41. }

    不懂的可以看里面的注释,这个先要写一个查找函数,在删除

    9.查找联系人的信息

    1. void SEARCHContact(Contact* con)
    2. {
    3. char name[NAME_MAX];
    4. assert(con);
    5. if (con->sz == 0)
    6. {
    7. printf("通讯录为空,无法查找\n");
    8. return;
    9. }
    10. printf("请输入你想查找联系人的名字:\n");
    11. scanf("%s", name);
    12. int ret = Fing_by_name(con, name);
    13. if (ret == -1)
    14. {
    15. printf("要查找的人不存在\n");
    16. return;
    17. }
    18. printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,
    19. con->data[ret].age,
    20. con->data[ret].sex,
    21. con->data[ret].tele,
    22. con->data[ret].addr);
    23. }

    思路很简单了 ,先查找出来 再打印出来

    10.修改联系人的信息

    1. void MODIFYContact(Contact* con)
    2. {
    3. char name[NAME_MAX];
    4. assert(con);
    5. if (con->sz == 0)
    6. {
    7. printf("通讯录为空,无法修改\n");
    8. return;
    9. }
    10. printf("请输入你想修改联系人的名字:\n");
    11. scanf("%s", name);
    12. int ret = Fing_by_name(con, name);
    13. if (ret == -1)
    14. {
    15. printf("要修改的人不存在\n");
    16. return;
    17. }
    18. printf("请输入联系人名字:");
    19. scanf("%s", con->data[ret].name);
    20. printf("请输入联系人年龄:");
    21. scanf("%d", &(con->data[ret].age));
    22. printf("请输入联系人性别:");
    23. scanf("%s", con->data[ret].sex);
    24. printf("请输入联系人电话:");
    25. scanf("%s", con->data[ret].tele);
    26. printf("请输入联系人地址:");
    27. scanf("%s", con->data[ret].addr);
    28. printf("修改完成\n");
    29. }

    先查找到改信息 在重新输入

    11.排序联系人的信息—按名字排序

    1. int cmp_by_name(const void* e1, const void* e2)
    2. {
    3. return strcmp( ((PeoInfo*)e1)->name , ((PeoInfo*)e2)->name);
    4. }
    5. void SORTContact(Contact* con)
    6. {
    7. assert(con);
    8. if (con->sz == 0)
    9. {
    10. printf("通讯录为空,无法排序\n");
    11. return;
    12. }
    13. qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);
    14. printf("排序完成\n");
    15. }

     这里要运用的qosrt函数,不会的可以看我之前的文章有介绍,很好实现的


    完整代码展现:

    test.c:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include "contact.h"
    4. void menu()
    5. {
    6. printf("******************************************\n");
    7. printf("***** 1.add 2.del ****\n");
    8. printf("***** 3.search 4.modify ****\n");
    9. printf("***** 5.show 6.sort ****\n");
    10. printf("***** 0. exit ****\n");
    11. printf("******************************************\n");
    12. }
    13. enum
    14. {
    15. EXIT,
    16. ADD,
    17. DEL,
    18. SEARCH,
    19. MODIFY,
    20. SHOW,
    21. SORT
    22. };
    23. int main()
    24. {
    25. int input = 0;
    26. //创建通讯录
    27. Contact con;
    28. //初始化通讯录
    29. InitContact(&con);
    30. do
    31. {
    32. menu();
    33. printf("请输入:>");
    34. scanf("%d", &input);
    35. switch (input)
    36. {
    37. case ADD:
    38. ADDContact(&con);
    39. break;
    40. case DEL:
    41. DELContact(&con);
    42. break;
    43. case SEARCH:
    44. SEARCHContact(&con);
    45. break;
    46. case MODIFY:
    47. MODIFYContact(&con);
    48. break;
    49. case SHOW:
    50. SHOWContact(&con);
    51. break;
    52. case SORT:
    53. SORTContact(&con);
    54. break;
    55. case EXIT:
    56. printf("退出通讯录\n");
    57. break;
    58. default:
    59. printf("选择错误,请重新选择\n");
    60. break;
    61. }
    62. } while (input);
    63. return 0;
    64. }

    contact.c:

    1. #include "contact.h"
    2. void InitContact(Contact* con)
    3. {
    4. assert(con);
    5. con->sz = 0;
    6. memset(con->data, 0, sizeof(con->data));
    7. }
    8. void ADDContact(Contact* con)
    9. {
    10. assert(con);
    11. //判断一下通讯录是否满了
    12. if (con->sz == MAX)
    13. {
    14. printf("通讯录已满,无法添加\n");
    15. return ;
    16. }
    17. printf("请输入联系人名字:");
    18. scanf("%s", con->data[con->sz].name);
    19. printf("请输入联系人年龄:");
    20. scanf("%d", &(con->data[con->sz].age));
    21. printf("请输入联系人性别:");
    22. scanf("%s", con->data[con->sz].sex);
    23. printf("请输入联系人电话:");
    24. scanf("%s", con->data[con->sz].tele);
    25. printf("请输入联系人地址:");
    26. scanf("%s", con->data[con->sz].addr);
    27. con->sz++;
    28. printf("添加完成\n");
    29. }
    30. void SHOWContact(Contact* con)
    31. {
    32. assert(con);
    33. if (con->sz == 0)
    34. {
    35. printf("通讯录无内容\n");
    36. return;
    37. }
    38. printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    39. int i;
    40. for (i = 0; i < con->sz; i++)
    41. {
    42. printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name,
    43. con->data[i].age,
    44. con->data[i].sex,
    45. con->data[i].tele,
    46. con->data[i].addr);
    47. }
    48. }
    49. int Fing_by_name(Contact* con, char* name)
    50. {
    51. assert(con);
    52. int i;
    53. for (i = 0; i < con->sz; i++)
    54. {
    55. if (strcmp(con->data[i].name, name) == 0)
    56. {
    57. return i;
    58. }
    59. }
    60. return -1;
    61. }
    62. void DELContact(Contact* con)
    63. {
    64. char name[NAME_MAX];
    65. assert(con);
    66. if (con->sz == 0)
    67. {
    68. printf("通讯录为空,无法删除\n");
    69. return ;
    70. }
    71. printf("请输入你想删除联系人的名字:\n");
    72. scanf("%s", name);
    73. // 查找通讯录里有没有该名字
    74. int ret=Fing_by_name(con, name);
    75. if (ret == -1)
    76. {
    77. printf("要删除的人不存在\n");
    78. return ;
    79. }
    80. //否则返回他的下标
    81. //思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可
    82. int i;
    83. for (i = ret; i < con->sz - 1; i++)
    84. {
    85. con->data[i] = con->data[i + 1];
    86. }
    87. con->sz--;
    88. printf("删除成功\n");
    89. }
    90. void SEARCHContact(Contact* con)
    91. {
    92. char name[NAME_MAX];
    93. assert(con);
    94. if (con->sz == 0)
    95. {
    96. printf("通讯录为空,无法查找\n");
    97. return;
    98. }
    99. printf("请输入你想查找联系人的名字:\n");
    100. scanf("%s", name);
    101. int ret = Fing_by_name(con, name);
    102. if (ret == -1)
    103. {
    104. printf("要查找的人不存在\n");
    105. return;
    106. }
    107. printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,
    108. con->data[ret].age,
    109. con->data[ret].sex,
    110. con->data[ret].tele,
    111. con->data[ret].addr);
    112. printf("查找完成");
    113. }
    114. void MODIFYContact(Contact* con)
    115. {
    116. char name[NAME_MAX];
    117. assert(con);
    118. if (con->sz == 0)
    119. {
    120. printf("通讯录为空,无法修改\n");
    121. return;
    122. }
    123. printf("请输入你想修改联系人的名字:\n");
    124. scanf("%s", name);
    125. int ret = Fing_by_name(con, name);
    126. if (ret == -1)
    127. {
    128. printf("要修改的人不存在\n");
    129. return;
    130. }
    131. printf("请输入联系人名字:");
    132. scanf("%s", con->data[ret].name);
    133. printf("请输入联系人年龄:");
    134. scanf("%d", &(con->data[ret].age));
    135. printf("请输入联系人性别:");
    136. scanf("%s", con->data[ret].sex);
    137. printf("请输入联系人电话:");
    138. scanf("%s", con->data[ret].tele);
    139. printf("请输入联系人地址:");
    140. scanf("%s", con->data[ret].addr);
    141. printf("修改完成\n");
    142. }
    143. int cmp_by_name(const void* e1, const void* e2)
    144. {
    145. return strcmp( ((PeoInfo*)e1)->name , ((PeoInfo*)e2)->name);
    146. }
    147. void SORTContact(Contact* con)
    148. {
    149. assert(con);
    150. if (con->sz == 0)
    151. {
    152. printf("通讯录为空,无法排序\n");
    153. return;
    154. }
    155. qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);
    156. printf("排序完成\n");
    157. }

    contact.h:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define NAME_MAX 20
    7. #define SEX_MAX 5
    8. #define TELE_MAX 12
    9. #define ADDR_MAX 30
    10. #define MAX 100
    11. //定义人的信息
    12. typedef struct PeoInfo
    13. {
    14. char name[NAME_MAX];
    15. int age;
    16. char sex[SEX_MAX];
    17. char tele[TELE_MAX];
    18. char addr[ADDR_MAX];
    19. }PeoInfo;
    20. typedef struct Contact
    21. {
    22. PeoInfo data[MAX];//存放数据
    23. int sz;//记录的时当前通讯录中存放的人的信息个数
    24. }Contact;
    25. //初始化通讯录
    26. void InitContact(Contact* con);
    27. //添加联系人的信息
    28. void ADDContact(Contact* con);
    29. //显示通讯录的信息
    30. void SHOWContact(Contact* con);
    31. //删除联系人的信息
    32. void DELContact(Contact* con);
    33. //查找联系人的信息
    34. void SEARCHContact(Contact* con);
    35. //修改联系人的信息
    36. void MODIFYContact(Contact* con);
    37. //排序联系人的信息-按名字
    38. void SORTContact(Contact* con);

    结语:

    首先非常感谢大家的观看,这只是一个初步的通讯录,它还可以进阶实现

    这个通讯录还存在很多缺陷:

    1.它不能保存完成,一旦退出就消失了

    2.它至少固定的大小,我们只开创了100个联系人,万一少于联系人,这个就浪费了很多的空间

    所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。

  • 相关阅读:
    车牌检测识别功能实现(pyqt)
    NVIDIA安装最新显卡驱动
    Vue3 - $attrs 的几种用法(1个或多个根元素、Options API 和 Composition API)
    Java实现 leetcode-946. 验证栈序列
    Java 和 PHP GC 的差异和差异出现的原因
    【MHA】MySQL高可用MHA介绍8-常见错误以及解决
    Jetpack Compose Side Effects in Details 副作用的详细信息
    牛客网刷题记录 || 运算符与分支
    Spring原理分析--获取Environment资源对象
    dedecms系统织梦会员登录二级域名不能跨域
  • 原文地址:https://blog.csdn.net/chaodddddd/article/details/133243764