• 通讯录的实现


    目录

    设计思路

    文件准备

    test.c

    contact.c

    contact.h

    通讯录的实现

    基础定义

    打印菜单

    菜单效果

    主函数

    初始化通讯录

    添加联系人

    删除联系人

    查找联系人

    修改联系人

    排序联系人

    冒泡排序

    qsort排序

    通讯录最终效果


    设计思路

    文件准备

    test.c

    测试通讯录

    contact.c

    函数的实现

    contact.h

    函数的类型和声明

    通讯录的实现

    基础定义

    1. #define MAX 100
    2. #define MAX_NAME 20
    3. #define MAX_SEX 5
    4. #define MAX_TELE 12
    5. #define MAX_ADDR 30
    6. //人的信息
    7. typedef struct PeoInfo
    8. {
    9. char name[MAX_NAME];
    10. int age;
    11. char sex[MAX_SEX];
    12. char tele[MAX_TELE];
    13. char addr[MAX_ADDR];
    14. }PeoInfo;
    15. //通讯录
    16. typedef struct Contact
    17. {
    18. PeoInfo date[MAX];
    19. int count;
    20. }Contact;

    代码开头使用了#define来定义需要用到的值   

    这种方法只需修改一次值   不用在海量的代码中一次次修改 

    是非常不错的代码设计技巧

    Contact的元素有   存放练习人信息的结构体数组date  以及  联系人数量count

    Peoinfo的元素则为  联系人的姓名  年龄  性别  电话  住址

    打印菜单

    1. //打印菜单
    2. void menu()
    3. {
    4. printf("********************************************************\n");
    5. printf("******** 1.增加联系人 2.删除联系人 ********\n");
    6. printf("******** 3.查找联系人 4.修改联系人 ********\n");
    7. printf("******** 5.显示联系人 6.排序联系人 ********\n");
    8. printf("******** 0.退出通讯录 ********\n");
    9. printf("********************************************************\n");
    10. }

    菜单效果

    主函数

    设计分支选项   选择操作函数

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

    我们可以看到 主函数运用了Switch分支语句对选项进行了分类   在这里运用了一个枚举的小技巧

    将选择值赋予对应的选项  方便我们在代码调试快速找到对应的问题

    初始化通讯录

    1. //初始化通讯录函数
    2. void InitContact(Contact* pc)
    3. {
    4. assert(pc);
    5. memset(pc->date,0,sizeof(pc->date));
    6. pc->count = 0;
    7. }

    memset   三个参数分别为       初始化空间的地址    初始化内容     初始化空间的字节大小

    添加联系人

    1. //添加联系人
    2. void AddContact(Contact* pc)
    3. {
    4. assert(pc);
    5. if (pc->count == MAX)
    6. {
    7. printf("通讯录已满无法添加\n");
    8. }
    9. printf("请输入需要添加人的信息\n");
    10. printf("请输入姓名:>");
    11. scanf("%s", pc->date[pc->count].name);
    12. printf("请输入年龄:>");
    13. scanf("%d", &(pc->date[pc->count].age));
    14. printf("请输入性别:>");
    15. scanf("%s", pc->date[pc->count].sex);
    16. printf("请输入电话:>");
    17. scanf("%s", pc->date[pc->count].tele);
    18. printf("请输入住址:>");
    19. scanf("%s", pc->date[pc->count].addr);
    20. pc->count++;
    21. }

    删除联系人

    1. //删除指定联系人
    2. void DelContact(Contact* pc)
    3. {
    4. assert(pc);
    5. if (pc->count == 0)
    6. {
    7. printf("通讯录为空,无法删除\n");
    8. return;
    9. }
    10. assert(pc);
    11. char name[MAX_NAME] = { 0 };
    12. printf("请输入要删除人的名字:>");
    13. scanf("%s",name);
    14. 找到要删除的联系人
    15. //int i = 0;
    16. //int del = 0;
    17. //int flag = 0;
    18. //for ( i = 0; i < pc->count; i++)
    19. //{
    20. // if (strcmp(name,pc->date[i].name) == 0) //字符比较用strcmp
    21. // {
    22. // del = i;
    23. // flag = 1;
    24. // break;
    25. // }
    26. //}
    27. //if (flag == 0)
    28. //{
    29. // printf("要删除的人不存在\n");
    30. // return;
    31. //}
    32. int del = FindByName(pc,name);
    33. if (del == -1)
    34. {
    35. printf("要删除的人不存在\n");
    36. return;
    37. }
    38. //删除坐标为del的联系人
    39. int i = 0;
    40. for ( i = del; i < pc->count-1; i++)
    41. {
    42. pc->date[i] = pc->date[i + 1];
    43. }
    44. pc->count--;
    45. printf("成功删除联系人\n");
    46. }

    查找联系人

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

    修改联系人

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

    排序联系人

    冒泡排序

    1. //冒泡排序
    2. void SortContact(Contact* pc)
    3. {
    4. if (pc->count == 0)
    5. {
    6. printf("通讯录为空,无法排序!!!\n");
    7. return;
    8. }
    9. if(pc->count == 1)
    10. {
    11. printf("只有一位联系人,无需排序!!!\n");
    12. return;
    13. }
    14. int i = 0;
    15. int j = 0;
    16. PeoInfo temp = { 0 };
    17. for ( i = 0; i < pc->count-1; i++)
    18. {
    19. for (j = 0; j < pc->count-i-1; j++)
    20. {
    21. if (strcmp(pc->date[i].name, pc->date[i + 1].name) < 0)
    22. {
    23. PeoInfo temp = pc->date[i];
    24. pc->date[i] = pc->date[i + 1];
    25. pc->date[i + 1] = temp;
    26. }
    27. }
    28. }
    29. printf("排序成功\n");
    30. }

    qsort排序

    1. //qsort调用
    2. int compar(const void* p1, const void* p2)
    3. {
    4. return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
    5. }
    6. void QsortContact(Contact* pc)
    7. {
    8. // 首元素地址 元素个数 元素大小 比较函数
    9. qsort(pc->date, pc->count, sizeof(pc->date[0]), compar);
    10. printf("排序成功\n");
    11. }

    qsort四个参数分别是  首元素地址   元素个数    元素大小        比较函数

    通过比较名字长度   从而对整个结构体进行交换

    通讯录最终效果

  • 相关阅读:
    (附源码)springboot点餐系统 毕业设计 100908
    node前端常用
    LiveData简单使用
    SQL数据分析之流程控制语句【if,case...when详解】
    STM32F103学习1-keil5工程建立的步骤和模板傻瓜教程
    halcon 区域Region(HObject)的传输
    配电室综合监测系统的组网与应用
    【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)
    java-单列集合List详解
    计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】
  • 原文地址:https://blog.csdn.net/Jay_0824/article/details/133080922