本篇博客将实现一个简易静态通讯录,通讯录实现增删改差,显示,排序等基本功能。后续会改善版本,来解决内存多余等问题。
首先是程序实现的方式:
采用模块化的方式,通讯录分为test.c、contact.c两个源文件和contact.h一个头文件。
test.c:主函数接口引入。
contact.c:函数功能的实现
contact.h:头文件引入、函数声明、结构体声明。
先从主函数看起:test.c
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include"contact.h" 3. void menu() 4. { 5. printf("★★★★★★★ Welcome to address book!★★★★★★★\n"); 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. 14. } 15. 16. /* 17. * 1添加联系人信息 18. 2删除指定联系人信息 19. 3查找指定联系人信息 20. 4修改指定联系人信息 21. 5显示所有联系人信息 22. 6以名字排序所有联系人 23. 0退出通讯录 24. */ 25. 26. int main() 27. { 28. int input = 0; 29. Contact con;//通讯录 30. 31. //初识化通讯录 32. InitContact(&con); 33. 34. do 35. { 36. menu(); 37. printf("请选择:>"); 38. scanf("%d", &input); 39. switch (input) 40. { 41. case 1: 42. AddContact(&con);//添加联系人 43. break; 44. case 2: 45. DelContact(&con);//删除联系人 46. break; 47. case 3: 48. SearchContact(&con);//查找联系人 49. break; 50. case 4: 51. ModifyContact(&con);//修改联系人 52. break; 53. case 5: 54. ShowContact(&con);//显示联系人 55. break; 56. case 6: 57. SortContact(&con);//排序通讯录内容 58. break; 59. case 0: 60. printf("退出通讯录\n"); 61. break; 62. default: 63. printf("输入的指令有误,请重新输入!\n"); 64. break; 65. } 66. 67. 68. } while (input); 69. 70. 71. 72. return 0; 73. }
注意:利用do while来实现菜单的应用
contact.h
1. #pragma once 2. #include<stdio.h> 3. #include<assert.h> 4. #include<string.h> 5. #include<stdlib.h> 6. #define MAX 100 7. #define MAX_NAME 20 8. #define MAX_SEX 10 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. 20. 21. 22. }PeoInfo; 23. //通讯录 24. typedef struct Contact 25. { 26. PeoInfo data[MAX];//存放人的信息 27. int count;//记录当前通讯录人数 28. 29. }Contact; 30. 31. void InitContact(Contact* pc);//初始化通讯录 32. 33. 34. void AddContact(Contact* pc);//添加联系人 35. 36. 37. void ShowContact(const Contact* pc);//显示联系人 38. 39. 40. void DelContact(Contact* pc);//删除联系人 41. 42. 43. void SearchContact(Contact* pc);//查找联系人 44. 45. 46. void ModifyContact(Contact* pc);//修改联系人 47. 48. 49. void SortContact(Contact* pc);//排序通讯录内容
我们采用分模块中的.h文件主要是对需要的一些函数的声明,结构体的实现等进行处理,可以把整个工程所需要的头文件等等内容都包含于此,只需要在源文件中加上该.h文件名就可以利用。另外一些常用的数值我们可以借助#define来进行定义,使用的时候可以更加方便
contact.c
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include"contact.h" 3. //初始化通讯录 4. void InitContact(Contact* pc) 5. { 6. assert(pc); 7. pc->count = 0; 8. memset(pc->data, 0, sizeof(pc->data));//分配内存 9. 10. 11. 12. } 13. //添加联系人 14. void AddContact(Contact* pc) 15. { 16. assert(pc); 17. if (pc->count == MAX) 18. { 19. printf("通讯录已满,无法添加\n"); 20. return; 21. } 22. printf("请输入名字:>"); 23. scanf("%s", pc->data[pc->count].name); 24. printf("请输入年龄:>"); 25. scanf("%d", &(pc->data[pc->count].age)); 26. printf("请输入性别:>"); 27. scanf("%s", pc->data[pc->count].sex); 28. printf("请输入电话:>"); 29. scanf("%s", pc->data[pc->count].tele); 30. printf("请输入地址:>"); 31. scanf("%s", pc->data[pc->count].addr); 32. 33. pc->count++; 34. printf("添加成功!\n"); 35. 36. } 37. 38. 39. //显示联系人 40. void ShowContact(const Contact* pc) 41. { 42. assert(pc); 43. printf("%20s\t%5s\t%5s\t%12s\t%30s\n", "姓名", "年龄", "性别", "电话", "地址"); 44. int i = 0; 45. for (i = 0; i < pc->count; i++) 46. { 47. printf("%20s\t%5d\t%5s\t%12s\t%30s\n", 48. pc->data[i].name, 49. pc->data[i].age, 50. pc->data[i].sex, 51. pc->data->tele, 52. pc->data[i].addr); 53. } 54. } 55. 56. static int FindByName(Contact* pc, char name[])//查找名字 57. { 58. assert(pc); 59. int i = 0; 60. for (i - 0; i < pc->count; i++) 61. { 62. if (0 == strcmp(pc->data[i].name, name)) 63. { 64. return i; 65. } 66. } 67. return -1; 68. } 69. 70. 71. void DelContact(Contact* pc)//删除联系人 72. { 73. char name[MAX_NAME] = { 0 }; 74. assert(pc); 75. if (pc->count == 0) 76. { 77. printf("通讯录为空,没有信息可以删除!\n"); 78. return; 79. } 80. printf("请输入要删除联系人的姓名:>"); 81. scanf("%s", name); 82. //删除 83. //1、查找 84. int pos = FindByName(pc, name); 85. if (pos == -1) 86. { 87. printf("要删除的人不存在\n"); 88. return; 89. } 90. //2、删除 91. int i = 0; 92. for (i = pos; i < pc->count-1; i++) 93. { 94. pc->data[i] = pc->data[i + 1];//覆盖 95. } 96. 97. pc->count--; 98. printf("删除成功!\n"); 99. 100. 101. } 102. 103. 104. void SearchContact(Contact* pc)//查找联系人 105. { 106. char name[MAX_NAME] = { 0 }; 107. assert(pc); 108. printf("请输入要查找联系人的姓名:>"); 109. scanf("%s", name); 110. //1、查找 111. int pos = FindByName(pc, name); 112. if (pos == -1) 113. { 114. printf("要查找的人不存在\n"); 115. return; 116. } 117. //2打印 118. printf("%20s\t%5s\t%5s\t%12s\t%30s\n", "姓名", "年龄", "性别", "电话", "地址"); 119. printf("%20s\t%5d\t%5s\t%12s\t%30s\n", 120. pc->data[pos].name, 121. pc->data[pos].age, 122. pc->data[pos].sex, 123. pc->data[pos].tele, 124. pc->data[pos].addr); 125. } 126. 127. 128. 129. 130. void ModifyContact(Contact* pc)//修改联系人 131. { 132. char name[MAX_NAME] = { 0 }; 133. assert(pc); 134. printf("请输入要修改的联系人的姓名:>"); 135. scanf("%s", name); 136. //1、查找 137. int pos = FindByName(pc, name); 138. if (pos == -1) 139. { 140. printf("要查找的人不存在\n"); 141. return; 142. } 143. 144. printf("要修改的人的信息已经查找到,接下来开始修改\n"); 145. //2修改 146. 147. printf("请输入名字:>"); 148. scanf("%s", pc->data[pos].name); 149. printf("请输入年龄:>"); 150. scanf("%d", &(pc->data[pos].age)); 151. printf("请输入性别:>"); 152. scanf("%s", pc->data[pos].sex); 153. printf("请输入电话:>"); 154. scanf("%s", pc->data[pos].tele); 155. printf("请输入地址:>"); 156. scanf("%s", pc->data[pos].addr); 157. 158. printf("修改成功!\n"); 159. 160. 161. 162. } 163. 164. int cmp_peo_by_name(const void* e1, const void* e2) 165. { 166. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); 167. 168. } 169. //按照名字排序 170. void SortContact(Contact* pc)//排序通讯录内容 171. { 172. assert(pc); 173. qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name); 174. printf("排序成功!\n"); 175. 176. }
contact.c主要是对contact.h中声明的函数进行实现,也可以添加一些新的函数,更有助于实现声明的函数。
对于一些不熟悉的函数,或者不知道怎么模拟实现的可以参照http://www.cplusplus.com/