C语言静态版通讯录怎么实现

其他教程   发布日期:2025年03月15日   浏览次数:234

这篇文章主要介绍“C语言静态版通讯录怎么实现”,在日常操作中,相信很多人在C语言静态版通讯录怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言静态版通讯录怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    1. 配置运行环境

    本通讯录运用到了三个文件

    test.c //测试通讯录的相关功能

    contact.h //声明

    contact.c //通讯录的实现模块

    2. 通讯录的实现

    想要做通讯录,首要任务就是要把模块想好。

    先打印一个通讯录的界面菜单

    1. void menu()
    2. {
    3. printf("********************************
    4. ");
    5. printf("***** 1. add 2. del ***
    6. ");
    7. printf("***** 3. search 4. modify***
    8. ");
    9. printf("***** 5. show 6. sort ***
    10. ");
    11. printf("***** 0. exit ***
    12. ");
    13. printf("********************************
    14. ");
    15. }

    2.1 通讯录的功能目录

    通讯录的功能有7种:

    • 增加联系人

    • 删除指定联系人

    • 查找联系人

    • 修改联系人的信息

    • 对联系人的排序

    • 显示联系人的信息

    • 退出通讯录

    创建人的信息的结构体类型

    第一步是封装一个人的信息的结构体类型

    由于封装的结构体类型的名字太长,总是写的话感觉太麻烦了

    对 struct PeoInfo进行了typdef类型重命名

    struct PeoInfp 改成 PeoInfp

    1. //表示一个人的信息
    2. typedef struct PeoInfo
    3. {
    4. char name[20];
    5. int age;
    6. char sex[5];
    7. char tele[12];
    8. char addr[30];
    9. }PeoInfo;

    以上的数值如果以后会经常用到的话,可以用#define 来定义,方便以后修改

    1. #define MAX 100
    2. #define MAX_NAME 20
    3. #define MAX_SEX 5
    4. #define MAX_TELE 12
    5. #define MAX_ADDR 30

    2.2 增加信息功能代码的实现

    1. //增加通讯录信息
    2. void AddContact(Contact* pc)
    3. {
    4. if (DATA_MAX == pc->sz)
    5. {
    6. printf("通讯录信息存储空间已满!
    7. ");
    8. return;
    9. }
    10. printf("请输入名字:> ");
    11. scanf("%s", pc->data[pc->sz].name);
    12. printf("请输入年龄:> ");
    13. scanf("%d", &(pc->data[pc->sz].age));
    14. printf("请输入性别:> ");
    15. scanf("%s", pc->data[pc->sz].sex);
    16. printf("请输入电话:> ");
    17. scanf("%s", pc->data[pc->sz].tele);
    18. printf("请输入住址:> ");
    19. scanf("%s", pc->data[pc->sz].addr);
    20. printf("信息添加成功!
    21. ");
    22. pc->sz++;
    23. }

    2.3 显示信息功能代码的实现

    1. void ShowContact(const Contact* pc)
    2. {
    3. int i = 0;
    4. //姓名 年龄 性别 电话 地址
    5. //zhangsan 20 男 123456 北京
    6. //
    7. //打印标题
    8. printf("%-10s %-4s %-5s %-12s %-30s
    9. ", "姓名", "年龄", "性别", "电话", "地址");
    10. //打印数据
    11. for (i = 0; i < pc->sz; i++)
    12. {
    13. printf("%-10s %-4d %-5s %-12s %-30s
    14. ",
    15. pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    16. }
    17. }

    2.4 删除信息功能代码的实现

    1. void DelContact(pContact pc)
    2. {
    3. char name[MAX_NAME] = { 0 };
    4. if (pc->sz == 0)
    5. {
    6. printf("通讯录为空,无法删除
    7. ");
    8. return;
    9. }
    10. //删除
    11. //1. 找到要删除的人 - 位置(下标)
    12. printf("输入要删除人的名字:>");
    13. scanf("%s", name);
    14. int pos = FindByName(pc, name);
    15. if (pos == -1)
    16. {
    17. printf("要删除的人不存在
    18. ");
    19. return;
    20. }
    21. int i = 0;
    22. //2. 删除 - 删除pos位置上的数据
    23. for (i = pos; i<pc->sz-1; i++)
    24. {
    25. pc->data[i] = pc->data[i + 1];
    26. }
    27. pc->sz--;
    28. printf("删除成功
    29. ");
    30. }

    2.5 查询信息功能代码的实现

    1. void SearchContact(const Contact* pc)
    2. {
    3. char name[MAX_NAME] = {0};
    4. printf("请输入要查找人的名字:>");
    5. scanf("%s", name);
    6. //查找
    7. int pos = FindByName(pc, name);
    8. if (pos == -1)
    9. {
    10. printf("要查找的人不存在
    11. ");
    12. return;
    13. }
    14. //打印
    15. printf("%-10s %-4s %-5s %-12s %-30s
    16. ", "姓名", "年龄", "性别", "电话", "地址");
    17. //打印数据
    18. printf("%-10s %-4d %-5s %-12s %-30s
    19. ",
    20. pc->data[pos].name,
    21. pc->data[pos].age,
    22. pc->data[pos].sex,
    23. pc->data[pos].tele,
    24. pc->data[pos].addr);
    25. }

    2.6 修改信息功能代码的实现

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

    2.7 按名字排序信息功能代码的实现

    1. //按照名字来排序
    2. int cmp_by_name(const void* e1, const void* e2)
    3. {
    4. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    5. }
    6. void SortContact(Contact* pc)
    7. {
    8. qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    9. printf("排序成功
    10. ");
    11. }

    3. 完整静态版本通讯录的全部源码

    3.1 contact.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "contact.h"
    3. void InitContact(Contact* pc)
    4. {
    5. pc->sz = 0;
    6. memset(pc->data, 0, sizeof(pc->data));
    7. }
    8. void AddContact(Contact* pc)
    9. {
    10. if (pc->sz == MAX)
    11. {
    12. printf("通讯录已满,无法增加
    13. ");
    14. return;
    15. }
    16. printf("请输入名字:>");
    17. scanf("%s", pc->data[pc->sz].name);
    18. printf("请输入年龄:>");
    19. scanf("%d", &(pc->data[pc->sz].age));
    20. printf("请输入性别:>");
    21. scanf("%s", pc->data[pc->sz].sex);
    22. printf("请输入电话:>");
    23. scanf("%s", pc->data[pc->sz].tele);
    24. printf("请输入地址:>");
    25. scanf("%s", pc->data[pc->sz].addr);
    26. pc->sz++;
    27. printf("添加成功
    28. ");
    29. }
    30. void ShowContact(const Contact* pc)
    31. {
    32. int i = 0;
    33. //姓名 年龄 性别 电话 地址
    34. //hengchuan 20 男 123456 北京
    35. //
    36. //打印标题
    37. printf("%-10s %-4s %-5s %-12s %-30s
    38. ", "姓名", "年龄", "性别", "电话", "地址");
    39. //打印数据
    40. for (i = 0; i < pc->sz; i++)
    41. {
    42. printf("%-10s %-4d %-5s %-12s %-30s
    43. ",
    44. pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    45. }
    46. }
    47. static int FindByName(const Contact* pc, char name[])
    48. {
    49. int i = 0;
    50. for (i = 0; i < pc->sz; i++)
    51. {
    52. if (0 == strcmp(pc->data[i].name, name))
    53. {
    54. return i;
    55. }
    56. }
    57. return -1;
    58. }
    59. void DelContact(pContact pc)
    60. {
    61. char name[MAX_NAME] = { 0 };
    62. if (pc->sz == 0)
    63. {
    64. printf("通讯录为空,无法删除
    65. ");
    66. return;
    67. }
    68. //删除
    69. //1. 找到要删除的人 - 位置(下标)
    70. printf("输入要删除人的名字:>");
    71. scanf("%s", name);
    72. int pos = FindByName(pc, name);
    73. if (pos == -1)
    74. {
    75. printf("要删除的人不存在
    76. ");
    77. return;
    78. }
    79. int i = 0;
    80. //2. 删除 - 删除pos位置上的数据
    81. for (i = pos; i < pc->sz - 1; i++)
    82. {
    83. pc->data[i] = pc->data[i + 1];
    84. }
    85. pc->sz--;
    86. printf("删除成功
    87. ");
    88. }
    89. void SearchContact(const Contact* pc)
    90. {
    91. char name[MAX_NAME] = { 0 };
    92. printf("请输入要查找人的名字:>");
    93. scanf("%s", name);
    94. //查找
    95. int pos = FindByName(pc, name);
    96. if (pos == -1)
    97. {
    98. printf("要查找的人不存在
    99. ");
    100. return;
    101. }
    102. //打印
    103. printf("%-10s %-4s %-5s %-12s %-30s
    104. ", "姓名", "年龄", "性别", "电话", "地址");
    105. //打印数据
    106. printf("%-10s %-4d %-5s %-12s %-30s
    107. ",
    108. pc->data[pos].name,
    109. pc->data[pos].age,
    110. pc->data[pos].sex,
    111. pc->data[pos].tele,
    112. pc->data[pos].addr);
    113. }
    114. void ModifyContact(Contact* pc)
    115. {
    116. char name[MAX_NAME] = { 0 };
    117. printf("请输入要修改人的名字:>");
    118. scanf("%s", name);
    119. int pos = FindByName(pc, name);
    120. if (pos == -1)
    121. {
    122. printf("要修改的人不存在
    123. ");
    124. return;
    125. }
    126. //修改
    127. printf("请输入名字:>");
    128. scanf("%s", pc->data[pos].name);
    129. printf("请输入年龄:>");
    130. scanf("%d", &(pc->data[pos].age));
    131. printf("请输入性别:>");
    132. scanf("%s", pc->data[pos].sex);
    133. printf("请输入电话:>");
    134. scanf("%s", pc->data[pos].tele);
    135. printf("请输入地址:>");
    136. scanf("%s", pc->data[pos].addr);
    137. printf("修改成功
    138. ");
    139. }
    140. //按照名字来排序
    141. int cmp_by_name(const void* e1, const void* e2)
    142. {
    143. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    144. }
    145. void SortContact(Contact* pc)
    146. {
    147. qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    148. printf("排序成功
    149. ");
    150. }

    3.2 contact.h

    1. #pragma once
    2. #include <stdio.h>
    3. #include <string.h>
    4. #include <stdlib.h>
    5. #include <errno.h>
    6. #define MAX 100
    7. #define MAX_NAME 20
    8. #define MAX_SEX 5
    9. #define MAX_TELE 12
    10. #define MAX_ADDR 30
    11. //表示一个人的信息
    12. typedef struct PeoInfo
    13. {
    14. char name[MAX_NAME];
    15. int age;
    16. char sex[MAX_SEX];
    17. char tele[MAX_TELE];
    18. char addr[MAX_ADDR];
    19. }PeoInfo;
    20. //静态版本的设计
    21. typedef struct Contact
    22. {
    23. PeoInfo data[MAX];//存放数据
    24. int sz;//记录通讯录中的有效信息个数
    25. }Contact, *pContact;
    26. //初始化通讯录
    27. void InitContact(Contact* pc);
    28. //增加指定联系人
    29. void AddContact(Contact* pc);
    30. //显示联系人信息
    31. void ShowContact(const Contact* pc);
    32. //删除指定联系人
    33. //void DelContact(Contact* pc);
    34. void DelContact(pContact pc);
    35. //查找指定联系人
    36. void SearchContact(const Contact* pc);
    37. //修改通讯录
    38. void ModifyContact(Contact* pc);
    39. //排序通讯录元素
    40. void SortContact(Contact* pc);

    3.3 test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "contact.h"
    3. void menu()
    4. {
    5. printf("********************************
    6. ");
    7. printf("***** 1. add 2. del ***
    8. ");
    9. printf("***** 3. search 4. modify***
    10. ");
    11. printf("***** 5. show 6. sort ***
    12. ");
    13. printf("***** 0. exit ***
    14. ");
    15. printf("********************************
    16. ");
    17. }
    18. enum Option
    19. {
    20. EXIT,
    21. ADD,
    22. DEL,
    23. SEARCH,
    24. MODIFY,
    25. SHOW,
    26. SORT
    27. };
    28. int main()
    29. {
    30. int input = 0;
    31. Contact con;//通讯录
    32. //初始化通讯录
    33. //加载文件的信息到通讯录中
    34. InitContact(&con);
    35. do
    36. {
    37. menu();
    38. printf("请选择:>");
    39. scanf("%d", &input);
    40. switch (input)
    41. {
    42. case ADD:
    43. AddContact(&con);
    44. break;
    45. case DEL:
    46. DelContact(&con);
    47. break;
    48. case SEARCH:
    49. SearchContact(&con);
    50. break;
    51. case MODIFY:
    52. ModifyContact(&con);
    53. break;
    54. case SHOW:
    55. ShowContact(&con);
    56. break;
    57. case SORT:
    58. SortContact(&con);
    59. break;
    60. case EXIT:
    61. printf("退出通讯录
    62. ");
    63. break;
    64. default:
    65. printf("选择错误
    66. ");
    67. break;
    68. }
    69. } while (input);
    70. return 0;
    71. }

    4. 静态版本通讯录的缺点

    缺点:

    通讯录的大小是固定的 - 100个元素当通讯录退出后,重新运行,之前的信息都丢了

    当前通讯录中的信息都是保存在内存中的,程序退出,内存就回收了,下一次重新运行程序,内存重新分配,之前的数据就不见了

    以上就是C语言静态版通讯录怎么实现的详细内容,更多关于C语言静态版通讯录怎么实现的资料请关注九品源码其它相关文章!