• c语言:通讯录管理系统(增删查改)


     前言:通讯录管理系统一共三个版本,除此文章以外还有如下俩个版本,大家可以根据需求自取:

    动态分配内测版c语言:通讯录管理系统(动态分配内存版)-CSDN博客

    文件版本c语言:通讯录管理系统(文件版本)-CSDN博客

    目录

    一.大体的框架

    主函数初步设计

    联系人的数据结构设计

    菜单目录

    二.初始化通讯录内容

    三.增加联系人

    四.删除联系人信息

    五.查询联系人信息

    六.修改联系人的信息

    完整代码 

    Contct.h

    Contact.cpp

    test.cpp


    一.大体的框架

    我们分为 3 个文件来设计:

    • Contact.h: 包含头文件的声明,对函数的声明,以及宏的申明
    • Contact.cpp: 通讯录管理系统中具体每一个函数的实现
    • test.cpp: 主函数,根据用户的选择进行调用相应的函数

    主函数初步设计

            主函数中,我们用 do...while... 来完成用户持续使用通讯录管理系统的需求,当用户不想再使用通讯录后只要输入 0 就可以结束 do...while... 循环从而结束整个程序

            后续编程中,我们只需要对各个输入的函数进行补充就可以了,同时在枚举类型 options 中从上往下是从 0 开始的赋值,这样更方便我们理解阅读,增强了程序的可读性

    1. //枚举,增加程序的可读性
    2. enum options
    3. {
    4. EXIT,
    5. ADD,
    6. DEL,
    7. SEACH,
    8. MODIFY,
    9. SHOW
    10. };
    11. int main()
    12. {
    13. int input = 0;
    14. //创建通讯录
    15. Contact con;
    16. //初始化通讯录
    17. InitContact(&con);
    18. do
    19. {
    20. menu();
    21. printf("请输入你的选择: ");
    22. scanf("%d", &input);
    23. switch (input)
    24. {
    25. //增加联系人信息
    26. case ADD:
    27. break;
    28. //删除联系人信息
    29. case DEL:
    30. break;
    31. //查找某个联系人的信息
    32. case SEACH:
    33. break;
    34. //修改某个联系人的信息
    35. case MODIFY:
    36. break;
    37. //展示通讯录内的每一个联系人的信息
    38. case SHOW:
    39. break;
    40. //退出通讯录管理系统
    41. case EXIT:
    42. printf("通讯录已退出\n");
    43. break;
    44. //预防非法输入
    45. default:
    46. printf("输入错误,请重新输入\n");
    47. break;
    48. }
    49. }while(input);
    50. return 0;
    51. }

    联系人的数据结构设计

            使用俩个结构体来完成我们设计的需求,一个结构体 PeopleInformation 用来保存每一个用户的各种信息,另一个结构体 Contact 用来保存整个通讯录的信息,而在通讯录的信息中就得包含每一个用户的信息,因此我们将 PeopleInformation结构体 嵌套在 结构体Contact

            使用宏定义来方便我们后续修改调整数据大小,同时也可以增加程序的可读性

    1. #define Name_Max 20
    2. #define Tel_Number 12
    3. #define Sex_Max 5
    4. #define Address_Max 30
    5. #define Contact_Max 100
    6. //联系人结构体
    7. typedef struct PeopleInformation
    8. {
    9. char name[Name_Max];
    10. char telnumber[Tel_Number];
    11. int age;
    12. char sex[Sex_Max];
    13. char address[Address_Max];
    14. }PeoInfor;
    15. //通讯录结构体
    16. typedef struct Contact
    17. {
    18. PeoInfor data[Contact_Max];//存放联系人结构体
    19. int size;//记录当前通讯录中有多少个联系人
    20. }Contact;

    菜单目录

    剩下的就只有根据我们的菜单目录来设计每一个函数的具体实现了

    1. void menu()
    2. {
    3. printf("-----------------------------\n");
    4. printf("--- 1.添加联系人 -----\n");
    5. printf("--- 2.删除联系人 -----\n");
    6. printf("--- 3.查找联系人 -----\n");
    7. printf("--- 4.修改联系人信息 -----\n");
    8. printf("--- 5.显示全部信息 -----\n");
    9. printf("--- 0.退出通讯录 -----\n");
    10. printf("-----------------------------\n");
    11. }

    二.初始化通讯录内容

    为了方便,我们将通讯录中每一个人的全部信息置 0

    1. void InitContact(Contact* cp)
    2. {
    3. //判断非空
    4. assert(cp);
    5. cp->size = 0;
    6. memset(cp->date, 0, sizeof(cp->date));
    7. }

    三.增加联系人

            在增加之前先进行判断,首先要判断传入的指针非空,其次要判断当前情况下通讯录是否已经满了,如果满了就告诉用户通讯录已满,如果没有满再进行添加新的联系人

    接下来分别使用指针进行访问输入就可以了,这里我们通过添加联系人姓名进行举例讲解:

            首先,我们添加联系人的函数拿到的参数是一个指针,指向通讯录结构体,这个结构体中有俩个成员,一是我们要存放的数据,二是当前结构体有多少个联系人,那我们就需要利用这个指针在访问我们要存放是数据,所以是 cp->data 这样的操作使我们访问到了通讯录结构体的数据数组,然后我再根据数组的下标来访问每一个单独的联系人的数据

            在这里利用通讯录结构体中的第二个成员 cp->size 来帮助我们访问到数据数组中单个联系人的内容,在用 “ . ” 访问单个联系人的每一条成员变量,从而进行赋值操作

    1. void AddContact(Contact* cp)
    2. {
    3. //判断非空
    4. assert(cp);
    5. //判断未满
    6. if (cp->size == Contact_Max)
    7. {
    8. printf("通讯录已满,无法再添加新的联系人\n");
    9. return;
    10. }
    11. printf("请输入要添加的联系人的姓名:\n");
    12. scanf("%s", cp->data[cp->size].name);
    13. printf("请输入要添加的联系人的电话号:\n");
    14. scanf("%s", cp->data[cp->size].telnumber);
    15. printf("请输入要添加的联系人的年龄:\n");
    16. scanf("%d", &(cp->data[cp->size].age));
    17. printf("请输入要添加的联系人的性别:\n");
    18. scanf("%s", cp->data[cp->size].sex);
    19. printf("请输入要添加的联系人的住址:\n");
    20. scanf("%s", cp->data[cp->size].address);
    21. cp++;
    22. printf("添加成功\n");
    23. }

    四.删除联系人信息

            删除联系人之前我们首先需要做的就是查询到联系人,只有找到联系人后,才能完成删除的工作,因此,我们先封装一个函数通过联系人的姓名进行查找,对整个结构体数组遍历,然后使用 strcmp 函数来比较用户输入的名字和我们要查找的名字,这样就可以找出联系人,并且返回数组的下标,如果没有找到就返回 -1 

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

            找到要删除的元素的位置后,我们就将整个数组从后往前覆盖,这样就达到了删除联系人的信息的目的

    1. void DelContact(Contact* cp)
    2. {
    3. assert(cp);
    4. char name[Name_Max];
    5. if (cp->size == 0)
    6. {
    7. printf("通讯录为空,无需删除\n");
    8. return;
    9. }
    10. printf("请输入选择删除的联系人的姓名:\n");
    11. scanf("%s", name);
    12. int ret = FindPeople(cp, name);
    13. if (ret == -1)
    14. {
    15. printf("要删除的联系人不存在\n");
    16. return;
    17. }
    18. for (int i = ret; i < cp->size; i++)
    19. {
    20. cp->data[i] = cp->data[i + 1];
    21. }
    22. cp->size--;
    23. printf("删除成功\n");
    24. }

    五.查询联系人信息

    查询在刚才查找到的基础上进行打印输出就可以了

    1. void SeachPeople(Contact* cp)
    2. {
    3. assert(cp);
    4. char name[Name_Max];
    5. if (cp->size == 0)
    6. {
    7. printf("通讯录为空\n");
    8. return;
    9. }
    10. printf("请输入选择查找的联系人的姓名:\n");
    11. scanf("%s", name);
    12. int ret = FindPeople(cp, name);
    13. if (ret == -1)
    14. {
    15. printf("要查找的联系人不存在\n");
    16. return;
    17. }
    18. //名字 年龄 性别 电话 地址
    19. //xxx xxx xxx xxx xxx
    20. printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    21. //打印个人的信息
    22. printf("%-20s%-5d%-5s%-12s%-30s\n", cp->data[ret].name, cp->data[ret].age, cp->data[ret].sex, cp->data[ret].telnumber, cp->data[ret].address);
    23. }

    六.修改联系人的信息

    大体思路也和上面一样,先找到联系人的在数组中的位置,然后再进行修改

    1. void ModifyContact(Contact* cp)
    2. {
    3. assert(cp);
    4. char name[Name_Max];
    5. if (cp->size == 0)
    6. {
    7. printf("通讯录为空\n");
    8. return;
    9. }
    10. printf("请输入选择修改的联系人的姓名:\n");
    11. scanf("%s", name);
    12. int ret = FindPeople(cp, name);
    13. if (ret == -1)
    14. {
    15. printf("要修改的联系人信息不存在\n");
    16. return;
    17. }
    18. printf("请输入要修改的联系人的姓名:\n");
    19. scanf("%s", cp->data[ret].name);
    20. printf("请输入要修改的联系人的电话号:\n");
    21. scanf("%s", cp->data[ret].telnumber);
    22. printf("请输入要修改的联系人的年龄:\n");
    23. scanf("%d", &(cp->data[ret].age));
    24. printf("请输入要修改的联系人的性别:\n");
    25. scanf("%s", cp->data[ret].sex);
    26. printf("请输入要修改的联系人的住址:\n");
    27. scanf("%s", cp->data[ret].address);
    28. printf("修改成功\n");
    29. }

    完整代码 

    Contct.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #define Name_Max 20
    6. #define Tel_Number 12
    7. #define Sex_Max 5
    8. #define Address_Max 30
    9. #define Contact_Max 100
    10. //联系人结构体
    11. typedef struct PeopleInformation
    12. {
    13. char name[Name_Max];
    14. char telnumber[Tel_Number];
    15. int age;
    16. char sex[Sex_Max];
    17. char address[Address_Max];
    18. }PeoInfor;
    19. //通讯录结构体
    20. typedef struct Contact
    21. {
    22. PeoInfor data[Contact_Max];//结构体数组存放联系人结构体
    23. int size;//记录当前通讯录中有多少个联系人
    24. }Contact;
    25. //目录
    26. void menu();
    27. //初始化通讯录
    28. void InitContact(Contact* cp);
    29. //增加联系人
    30. void AddContact(Contact* cp);
    31. //删除联系人
    32. void DelContact(Contact* cp);
    33. //通过姓名进行查找联系人
    34. int FindPeople(Contact* cp, char name[]);
    35. //展示全部通讯录信息
    36. void ShowContact(const Contact* cp);
    37. //查询联系人
    38. void SeachPeople(Contact* cp);
    39. //修改联系人信息
    40. void ModifyContact(Contact* cp);

    Contact.cpp

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "Contact.h"
    3. void menu()
    4. {
    5. printf("\n");
    6. printf("-----------------------------\n");
    7. printf("--- 1.添加联系人 -----\n");
    8. printf("--- 2.删除联系人 -----\n");
    9. printf("--- 3.查找联系人 -----\n");
    10. printf("--- 4.修改联系人信息 -----\n");
    11. printf("--- 5.显示全部信息 -----\n");
    12. printf("--- 0.退出通讯录 -----\n");
    13. printf("-----------------------------\n");
    14. }
    15. //初始化通讯录
    16. void InitContact(Contact* cp)
    17. {
    18. //判断非空
    19. assert(cp);
    20. cp->size = 0;
    21. memset(cp->data, 0, sizeof(cp->data));
    22. }
    23. //增加联系人
    24. void AddContact(Contact* cp)
    25. {
    26. //判断非空
    27. assert(cp);
    28. //判断未满
    29. if (cp->size == Contact_Max)
    30. {
    31. printf("通讯录已满,无法再添加新的联系人\n");
    32. return;
    33. }
    34. printf("请输入要添加的联系人的姓名:\n");
    35. scanf("%s", cp->data[cp->size].name);
    36. printf("请输入要添加的联系人的电话号:\n");
    37. scanf("%s", cp->data[cp->size].telnumber);
    38. printf("请输入要添加的联系人的年龄:\n");
    39. scanf("%d", &(cp->data[cp->size].age));
    40. printf("请输入要添加的联系人的性别:\n");
    41. scanf("%s", cp->data[cp->size].sex);
    42. printf("请输入要添加的联系人的住址:\n");
    43. scanf("%s", cp->data[cp->size].address);
    44. cp->size++;
    45. printf("添加成功\n");
    46. }
    47. //通过姓名进行查找联系人
    48. int FindPeople(Contact* cp, char name[])
    49. {
    50. assert(cp);
    51. for (int i = 0; i < cp->size; i++)
    52. {
    53. if (strcmp(cp->data[i].name, name) == 0)
    54. {
    55. return i;
    56. }
    57. }
    58. return -1;
    59. }
    60. //删除联系人
    61. void DelContact(Contact* cp)
    62. {
    63. assert(cp);
    64. char name[Name_Max];
    65. if (cp->size == 0)
    66. {
    67. printf("通讯录为空,无需删除\n");
    68. return;
    69. }
    70. printf("请输入选择删除的联系人的姓名:\n");
    71. scanf("%s", name);
    72. int ret = FindPeople(cp, name);
    73. if (ret == -1)
    74. {
    75. printf("要删除的联系人不存在\n");
    76. return;
    77. }
    78. for (int i = ret; i < cp->size-1 ; i++)
    79. {
    80. cp->data[i] = cp->data[i + 1];
    81. }
    82. cp->size--;
    83. printf("删除成功\n");
    84. }
    85. //查询联系人
    86. void SeachPeople(Contact* cp)
    87. {
    88. assert(cp);
    89. char name[Name_Max];
    90. if (cp->size == 0)
    91. {
    92. printf("通讯录为空\n");
    93. return;
    94. }
    95. printf("请输入选择查找的联系人的姓名:\n");
    96. scanf("%s", name);
    97. int ret = FindPeople(cp, name);
    98. if (ret == -1)
    99. {
    100. printf("要查找的联系人不存在\n");
    101. return;
    102. }
    103. //名字 年龄 性别 电话 地址
    104. //xxx xxx xxx xxx xxx
    105. printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    106. //打印个人的信息
    107. printf("%-10s%-5d%-5s%-12s%-30s\n", cp->data[ret].name, cp->data[ret].age, cp->data[ret].sex, cp->data[ret].telnumber, cp->data[ret].address);
    108. }
    109. //展示全部通讯录信息
    110. void ShowContact(const Contact* cp)
    111. {
    112. assert(cp);
    113. if (cp->size == 0)
    114. {
    115. printf("通讯录为空\n");
    116. return;
    117. }
    118. //名字 年龄 性别 电话 地址
    119. //xxx xxx xxx xxx xxx
    120. printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    121. for (int i = 0; i < cp->size; i++)
    122. {
    123. //打印每个人的信息
    124. printf("%-10s%-5d%-5s%-12s%-30s\n",cp->data[i].name, cp->data[i].age, cp->data[i].sex, cp->data[i].telnumber, cp->data[i].address);
    125. }
    126. }
    127. //修改联系人信息
    128. void ModifyContact(Contact* cp)
    129. {
    130. assert(cp);
    131. char name[Name_Max];
    132. if (cp->size == 0)
    133. {
    134. printf("通讯录为空\n");
    135. return;
    136. }
    137. printf("请输入选择修改的联系人的姓名:\n");
    138. scanf("%s", name);
    139. int ret = FindPeople(cp, name);
    140. if (ret == -1)
    141. {
    142. printf("要修改的联系人信息不存在\n");
    143. return;
    144. }
    145. printf("请输入要修改的联系人的姓名:\n");
    146. scanf("%s", cp->data[ret].name);
    147. printf("请输入要修改的联系人的电话号:\n");
    148. scanf("%s", cp->data[ret].telnumber);
    149. printf("请输入要修改的联系人的年龄:\n");
    150. scanf("%d", &(cp->data[ret].age));
    151. printf("请输入要修改的联系人的性别:\n");
    152. scanf("%s", cp->data[ret].sex);
    153. printf("请输入要修改的联系人的住址:\n");
    154. scanf("%s", cp->data[ret].address);
    155. printf("修改成功\n");
    156. }

    test.cpp

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "Contact.h"
    3. //枚举,增加程序的可读性
    4. enum options
    5. {
    6. EXIT,
    7. ADD,
    8. DEL,
    9. SEACH,
    10. MODIFY,
    11. SHOW
    12. };
    13. int main()
    14. {
    15. int input = 0;
    16. //创建通讯录
    17. Contact con;
    18. //初始化通讯录
    19. InitContact(&con);
    20. do
    21. {
    22. menu();
    23. printf("请输入你的选择: ");
    24. scanf("%d", &input);
    25. switch (input)
    26. {
    27. //增加联系人信息
    28. case ADD:
    29. AddContact(&con);
    30. break;
    31. //删除联系人信息
    32. case DEL:
    33. DelContact(&con);
    34. break;
    35. //查找某个联系人的信息
    36. case SEACH:
    37. SeachPeople(&con);
    38. break;
    39. //修改某个联系人的信息
    40. case MODIFY:
    41. ModifyContact(&con);
    42. break;
    43. //展示通讯录内的每一个联系人的信息
    44. case SHOW:
    45. ShowContact(&con);
    46. break;
    47. //退出通讯录管理系统
    48. case EXIT:
    49. printf("通讯录已退出\n");
    50. break;
    51. //预防非法输入
    52. default:
    53. printf("输入错误,请重新输入\n");
    54. break;
    55. }
    56. }while(input);
    57. return 0;
    58. }

            

            本次的分享就到此为止了,本文不涉及到文件操作,下篇文章,笔者将为大家带来如何通过文件操作,将我们的通讯录防止在文件中,以便我们多次重复打开和操作,如有错误,欢迎积极指出,感谢您的支持

  • 相关阅读:
    数据结构--5.2马踏棋盘算法(骑士周游问题)
    从电竞男孩到CEO,他如何用电子签实现事业腾飞
    windows10上运行magic keyboard和magic mouse
    JAVA:实现Disjoint Sets不相交集合算法(附完整源码)
    cartographer_pose_graph_2d
    实践 | 大型基金管理公司数据脱敏体系建设
    懒加载
    Linux 文件搜索命令Find详解
    SpringBoot集成Kafka低版本和高版本
    Python 利用pymysql和openpyxl操作MySQL数据库并插入Excel数据
  • 原文地址:https://blog.csdn.net/m0_69519887/article/details/133463119