• 简易实现通讯录(1.0)


     前言

    我们还是像以前一样,分为三个文件来书写,分别是contact.h,contact.c,test.c

    分别用来声明函数,实现函数和测试函数功能,现在就让我们开始吧.

    1.基本逻辑

    首先我们定义通讯录里的数据,我们定义为结构体

    1. typedef struct PeoInfo
    2. {
    3. char name[NAME_MAX];
    4. int age;
    5. char sex[SEX_MAX];
    6. char tele[TELE_MAX];
    7. char addr[ADDR_MAX];
    8. }PeoInfo;

    然后我们希望这个通讯录有100条数据,我们也定义成一个结构体

    1. typedef struct Contact
    2. {
    3. PeoInfo data[100];
    4. int sz;//人的信息个数
    5. }Contact;

    接着就是经典设计一份菜单,然后switch case语句来选择要实现的功能

    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. }

    为了增强代码的可读性,我们将原来的case后面的数转换成了枚举常量.

    1. enum Option
    2. {
    3. EXIT,
    4. ADD,
    5. DEL,
    6. SEARCH,
    7. MODIFY,
    8. SHOW,
    9. SORT
    10. };

    接下来就是主函数部分,我们使用一个do while语句来保证循环可以一直进行

    1. int main()
    2. {
    3. int input = 0;
    4. //创建通讯录
    5. Contact con;//通讯录
    6. //初始化通讯录
    7. InitContact(&con);
    8. do {
    9. menu();
    10. printf("请输入你的选择:>");
    11. scanf("%d", &input);
    12. switch (input)
    13. {
    14. case ADD:
    15. AddContact(&con);
    16. break;
    17. case DEL:
    18. DelContact(&con);
    19. break;
    20. case SEARCH:
    21. SearchContact(&con);
    22. break;
    23. case MODIFY:
    24. ModifyContact(&con);
    25. break;
    26. case SHOW:
    27. ShowContact(&con);
    28. break;
    29. case SORT:
    30. SortContact(&con);
    31. break;
    32. case EXIT:
    33. break;
    34. default:
    35. printf("输入错误,请重新输入\n");
    36. }
    37. } while (input);
    38. return 0;
    39. }

    下面我们开始写函数.

    为了方便修改通讯录中个人信息的大小,我们定义了一些宏来解决.

    1. //类型的声明
    2. #define NAME_MAX 20
    3. #define SEX_MAX 5
    4. #define TELE_MAX 12
    5. #define ADDR_MAX 30
    6. #define MAX 100

    2.函数功能的实现

    2.1初始化通讯录

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

    2.2 添加功能

    1. void AddContact(Contact* pc)
    2. {
    3. assert(pc);
    4. if (pc->sz == MAX)
    5. {
    6. printf("通讯录已满,无法增加");
    7. return;
    8. }
    9. printf("请输入名字:>\n");
    10. scanf("%s", pc->data[pc->sz].name);
    11. printf("请输入年龄:>\n");
    12. scanf("%d", &(pc->data[pc->sz].age));
    13. printf("请输入性别:>\n");
    14. scanf("%s", (pc->data[pc->sz].sex));
    15. printf("请输入电话:>\n");
    16. scanf("%s", (pc->data[pc->sz].tele));
    17. printf("请输入地址:>\n");
    18. scanf("%s", (pc->data[pc->sz].addr));
    19. pc->sz++;
    20. printf("增加成功\n");
    21. }

    2.3 展示功能 

    1. void ShowContact(const Contact* pc)
    2. {
    3. assert(pc);
    4. if (pc->sz == 0)
    5. {
    6. printf("通讯录为空,无需打印\n");
    7. return;
    8. }
    9. printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    10. for (int i = 0; i < pc->sz; i++)
    11. {
    12. //打印信息
    13. printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    14. }
    15. }

    2.4 查找函数

    由于下面要实现的查找功能,修改删除功能都需要先找到该条数据,所以我们以姓名查找为例,定义一个查找函数.这样也能增强代码的复用性.

    1. int FindByName(Contact* pc, char name[])
    2. {
    3. assert(pc);
    4. int i = 0;
    5. for (i = 0; i < pc->sz; i++)
    6. {
    7. if (strcmp(pc->data[i].name, name) == 0)
    8. {
    9. return i;
    10. }
    11. }
    12. return -1;
    13. }

    2.5 删除联系人 

    注:数组中的元素的删除不了的,只能覆盖,所以把后面的向前覆盖即可.

    1. void DelContact(Contact* pc)
    2. {
    3. char name[NAME_MAX];
    4. assert(pc);
    5. if (pc->sz == 0)
    6. {
    7. printf("通讯录为空,无法删除\n");
    8. }
    9. printf("请输入要删除的人的名字\n");
    10. scanf("%s", name);
    11. //找到名字叫name的人
    12. int ret = FindByName(pc, name);//找到返回下标,找不到返回-1
    13. if (ret == -1)
    14. {
    15. printf("要删除的人不存在\n");
    16. return;
    17. }
    18. //删除这个人
    19. int i = 0;
    20. for (i = ret; i sz-1 ; i++)
    21. {
    22. pc->data[i] = pc->data[i + 1];
    23. }
    24. pc->sz--;
    25. printf("删除成功\n");
    26. }

    2.6 查找联系人

    1. void SearchContact(Contact* pc)
    2. {
    3. assert(pc);
    4. char name[NAME_MAX];
    5. printf("请输入要查找的人的姓名\n");
    6. int ret = FindByName(pc->data, name);
    7. if (ret == -1)
    8. {
    9. printf("要查找的人不存在\n");
    10. return;
    11. }
    12. printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
    13. }

    2.7 修改联系人

    1. void ModifyContact(Contact* pc)
    2. {
    3. assert(pc);
    4. char name[NAME_MAX];
    5. scanf("%s", name);
    6. int ret = FindByName(pc, name);
    7. if (ret == -1)
    8. {
    9. printf("要修改的人的信息不存在\n");
    10. return;
    11. }
    12. //修改的逻辑
    13. else
    14. {
    15. printf("请输入名字:>");
    16. scanf("%s", pc->data[ret].name);
    17. printf("请输入年龄:>");
    18. scanf("%d", &(pc->data[ret].age));
    19. printf("请输入性别:>");
    20. scanf("%s", pc->data[ret].sex);
    21. printf("请输入电话:>");
    22. scanf("%s", pc->data[ret].tele);
    23. printf("请输入地址:>");
    24. scanf("%s", pc->data[ret].addr);
    25. printf("修改完成\n");
    26. }
    27. }

    2.8 按照姓名排序联系人

    1. static int sort_by_name(const void* e1, const void* e2)
    2. {
    3. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    4. }
    5. void SortContact(Contact* pc)
    6. {
    7. if (pc->sz == 0)
    8. {
    9. printf("一个人没有你排什么顺序,啊小丑!\n");
    10. }
    11. qsort(pc->data, pc->sz, sizeof((pc->data)[0]), sort_by_name);
    12. ShowContact(pc);
    13. }

    2.9 test.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include "contact.h"
    3. //测试功能
    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 Option
    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. menu();
    32. printf("请输入你的选择:>");
    33. scanf("%d", &input);
    34. switch (input)
    35. {
    36. case ADD:
    37. AddContact(&con);
    38. break;
    39. case DEL:
    40. DelContact(&con);
    41. break;
    42. case SEARCH:
    43. SearchContact(&con);
    44. break;
    45. case MODIFY:
    46. ModifyContact(&con);
    47. break;
    48. case SHOW:
    49. ShowContact(&con);
    50. break;
    51. case SORT:
    52. SortContact(&con);
    53. break;
    54. case EXIT:
    55. break;
    56. default:
    57. printf("输入错误,请重新输入\n");
    58. }
    59. } while (input);
    60. return 0;
    61. }

    2.10 contact.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include "contact.h"
    3. void InitContact(Contact* pc)
    4. {
    5. assert(pc);
    6. pc->sz = 0;
    7. memset(pc->data, 0, sizeof(pc->data));
    8. }
    9. void AddContact(Contact* pc)
    10. {
    11. assert(pc);
    12. if (pc->sz == MAX)
    13. {
    14. printf("通讯录已满,无法增加");
    15. return;
    16. }
    17. printf("请输入名字:>\n");
    18. scanf("%s", pc->data[pc->sz].name);
    19. printf("请输入年龄:>\n");
    20. scanf("%d", &(pc->data[pc->sz].age));
    21. printf("请输入性别:>\n");
    22. scanf("%s", (pc->data[pc->sz].sex));
    23. printf("请输入电话:>\n");
    24. scanf("%s", (pc->data[pc->sz].tele));
    25. printf("请输入地址:>\n");
    26. scanf("%s", (pc->data[pc->sz].addr));
    27. pc->sz++;
    28. printf("增加成功\n");
    29. }
    30. void ShowContact(const Contact* pc)
    31. {
    32. assert(pc);
    33. if (pc->sz == 0)
    34. {
    35. printf("通讯录为空,无需打印\n");
    36. return;
    37. }
    38. printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    39. for (int i = 0; i < pc->sz; i++)
    40. {
    41. //打印信息
    42. printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    43. }
    44. }
    45. int FindByName(Contact* pc, char name[])
    46. {
    47. assert(pc);
    48. int i = 0;
    49. for (i = 0; i < pc->sz; i++)
    50. {
    51. if (strcmp(pc->data[i].name, name) == 0)
    52. {
    53. return i;
    54. }
    55. }
    56. return -1;
    57. }
    58. void DelContact(Contact* pc)
    59. {
    60. char name[NAME_MAX];
    61. assert(pc);
    62. if (pc->sz == 0)
    63. {
    64. printf("通讯录为空,无法删除\n");
    65. }
    66. printf("请输入要删除的人的名字\n");
    67. scanf("%s", name);
    68. //找到名字叫name的人
    69. int ret = FindByName(pc, name);//找到返回下标,找不到返回-1
    70. if (ret == -1)
    71. {
    72. printf("要删除的人不存在\n");
    73. return;
    74. }
    75. //删除这个人
    76. int i = 0;
    77. for (i = ret; i sz-1 ; i++)
    78. {
    79. pc->data[i] = pc->data[i + 1];
    80. }
    81. pc->sz--;
    82. printf("删除成功\n");
    83. }
    84. void SearchContact(Contact* pc)
    85. {
    86. assert(pc);
    87. char name[NAME_MAX];
    88. printf("请输入要查找的人的姓名\n");
    89. int ret = FindByName(pc->data, name);
    90. if (ret == -1)
    91. {
    92. printf("要查找的人不存在\n");
    93. return;
    94. }
    95. printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
    96. }
    97. void ModifyContact(Contact* pc)
    98. {
    99. assert(pc);
    100. char name[NAME_MAX];
    101. scanf("%s", name);
    102. int ret = FindByName(pc, name);
    103. if (ret == -1)
    104. {
    105. printf("要修改的人的信息不存在\n");
    106. return;
    107. }
    108. //修改的逻辑
    109. else
    110. {
    111. printf("请输入名字:>");
    112. scanf("%s", pc->data[ret].name);
    113. printf("请输入年龄:>");
    114. scanf("%d", &(pc->data[ret].age));
    115. printf("请输入性别:>");
    116. scanf("%s", pc->data[ret].sex);
    117. printf("请输入电话:>");
    118. scanf("%s", pc->data[ret].tele);
    119. printf("请输入地址:>");
    120. scanf("%s", pc->data[ret].addr);
    121. printf("修改完成\n");
    122. }
    123. }
    124. static int sort_by_name(const void* e1, const void* e2)
    125. {
    126. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    127. }
    128. void SortContact(Contact* pc)
    129. {
    130. if (pc->sz == 0)
    131. {
    132. printf("一个人没有你排什么顺序,啊小丑!\n");
    133. }
    134. qsort(pc->data, pc->sz, sizeof((pc->data)[0]), sort_by_name);
    135. ShowContact(pc);
    136. }

    2.11 contact.h

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. #include
    6. //类型的声明
    7. #define NAME_MAX 20
    8. #define SEX_MAX 5
    9. #define TELE_MAX 12
    10. #define ADDR_MAX 30
    11. #define MAX 100
    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[100];
    23. int sz;//人的信息个数
    24. }Contact;
    25. //初始化通讯录
    26. void InitContact(Contact* pc);
    27. //增加联系人
    28. void AddContact(Contact* pc);
    29. //显示联系人
    30. void ShowContact(const Contact* pc);
    31. //删除联系人
    32. void DelContact(Contact* pc);
    33. //查找联系人
    34. void SearchContact(Contact* pc);
    35. //修改联系人
    36. void ModifyContact(Contact* pc);
    37. //排序联系人
    38. void SortContact(Contact* pc);

  • 相关阅读:
    leetcode 经典题目42.接雨水
    智能位移监测,更新传统井盖的功能
    vue3学习源码笔记(小白入门系列)------watch watchEffect是如何工作的
    数据结构之单向循环链接,双向循环链表的常用方法封装
    互联网Java工程师面试题·微服务篇·第一弹
    leetcode 739. 每日温度、496. 下一个更大元素 I
    Ubuntu镜像下载地址
    【Python】Python 将一个文件夹备份到一个 ZIP 文件
    【算法训练-排序算法 三】【排序应用】合并区间
    [MIT 6.830 SimpleDB] Lab1 Exercise 1-3
  • 原文地址:https://blog.csdn.net/qiuqiushuibx/article/details/133250996