写一个通讯录
要求能够实现增删改查功能,思路如下:
1.定义人的结构体
2.创建通讯录变量
3.初始化通讯录变量
4.增删改查
实现模块:
229-contact.h
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #pragma once 3. 4. #define MAX_NAME 20 5. #define MAX_SIZE 10 6. #define MAX_TELE 12 7. #define MAX_ADDR 30 8. 9. #define MAX 100 10. 11. //类型的定义 12. typedef struct PeoInfo 13. { 14. char name[MAX_NAME]; 15. char sex[MAX_SIZE]; 16. int age; 17. char tel[MAX_TELE]; 18. char addr[MAX_ADDR]; 19. }PeoInfo; 20. 21. //通讯录 22. typedef struct Contact 23. { 24. PeoInfo data[MAX];//存放添加进来的人信息 25. int sz;//记录当前通讯录中有效信息的个数 26. }Contact; 27. 28. //初始化通讯录 29. void InitContact(Contact* pc); 30. 31. //增加联系人 32. void AddContact(Contact* pc); 33. 34. //打印联系人信息 35. void PrintContact(const Contact* pc); 36. 37. //删除联系人信息 38. void DelContact(Contact* pc); 39. 40. //查找联系人的信息 41. void SearchContact(Contact* pc); 42. 43. //修改联系人的信息 44. void ModifyContact(Contact* pc); 45. 46. //排序联系人 47. void SortByName(Contact* pc);
229-contact.c
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<stdio.h> 3. #include "229-contact.h" 4. #include<string.h> 5. 6. void InitContact(Contact* pc) 7. { 8. pc->sz = 0; 9. 10. //对数组进行初始化,数组名pc->data代表数组首元素的地址,sizeof(数组名)计算的是整个数组的大小 11. // 数组首元素地址 数组大小 12. memset(pc->data, 0, sizeof(pc->data)); 13. } 14. 15. void AddContact(Contact* pc) 16. { 17. if (pc->sz == MAX) 18. { 19. printf("通讯录已满,无法添加\n"); 20. return; 21. } 22. 23. //增加一个人的信息 24. printf("请输入名字:>"); 25. scanf("%s", pc->data[pc->sz].name);//数组名是数组首元素的地址,因此name数组不需要加& 26. 27. printf("请输入年龄:>"); 28. scanf("%d", &(pc->data[pc->sz].age)); 29. 30. printf("请输入性别:>"); 31. scanf("%s", pc->data[pc->sz].sex); 32. 33. printf("请输入电话:>"); 34. scanf("%s", pc->data[pc->sz].tel); 35. 36. printf("请输入地址:>"); 37. scanf("%s", pc->data[pc->sz].addr); 38. 39. pc->sz++; 40. 41. printf("增加成功\n"); 42. } 43. 44. void PrintContact(const Contact* pc) 45. { 46. 47. //打印标题 48. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); 49. 50. //打印数据 51. int i = 0; 52. for (i = 0; i < pc->sz; i++) 53. { 54. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n", 55. pc->data[i].name, 56. pc->data[i].age, 57. pc->data[i].sex, 58. pc->data[i].tel, 59. pc->data[i].addr); 60. } 61. } 62. 63. static int FindByName(Contact* pc, char name[])//其他源文件不需要查看FindByName,因此用static修饰 64. { 65. int i = 0; 66. for (i = 0; i < pc->sz; i++) 67. { 68. if (strcmp(pc->data[i].name, name) == 0)//字符串比较 69. { 70. return i;//找到了 71. } 72. } 73. return -1;//没找到 74. } 75. 76. 77. void DelContact(Contact* pc) 78. { 79. char name[MAX_NAME] = { 0 }; 80. //先判空 81. if (pc->data == 0) 82. { 83. printf("通讯录为空,无需删除\n"); 84. return; 85. } 86. 87. //1.查找要删除的人 88. //有/没有 89. printf("请输入要删除的人的名字:>"); 90. scanf("%s", name); 91. int pos = FindByName(pc, name); 92. if (pos == -1) 93. { 94. printf("要删除的人不存在\n"); 95. return; 96. } 97. //2.删除 98. //如何删除?如果删除3,把3后面的下标为i的元素放在下标为i-1的位置上,假如最后一个元素下标为9, 99. //如果执行data[i+1]就访问越界了,因此i最大不许超过9,会把下标为9也就是最后一个元素移到前一个元素上去,sz-- 100. int i = 0; 101. for (i = pos; i < pc->sz - 1; i++) 102. { 103. pc->data[i] = pc->data[i + 1]; 104. } 105. pc->sz--; 106. printf("删除成功\n"); 107. } 108. 109. void SearchContact(Contact* pc) 110. { 111. char name[MAX_NAME] = { 0 }; 112. 113. //查找 114. //有/没有 115. printf("请输入要查找的人的名字:>"); 116. scanf("%s", name); 117. int pos = FindByName(pc, name); 118. if (pos == -1) 119. { 120. printf("要查找的人不存在\n"); 121. return; 122. } 123. 124. //打印标题 125. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); 126. 127. //打印数据 128. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n", 129. pc->data[pos].name, 130. pc->data[pos].age, 131. pc->data[pos].sex, 132. pc->data[pos].tel, 133. pc->data[pos].addr); 134. 135. } 136. 137. 138. void ModifyContact(Contact* pc) 139. { 140. char name[MAX_NAME] = { 0 }; 141. 142. //查找 143. //有/没有 144. printf("请输入要修改的人的名字:>"); 145. 146. scanf("%s", name); 147. int pos = FindByName(pc, name); 148. if (pos == -1) 149. { 150. printf("要修改的人不存在\n"); 151. return; 152. } 153. else 154. { 155. //修改一个人的信息 156. printf("请输入名字:>"); 157. scanf("%s", pc->data[pos].name);//数组名是数组首元素的地址,因此name数组不需要加& 158. 159. printf("请输入年龄:>"); 160. scanf("%d", &(pc->data[pos].age)); 161. 162. printf("请输入性别:>"); 163. scanf("%s", pc->data[pos].sex); 164. 165. printf("请输入电话:>"); 166. scanf("%s", pc->data[pos].tel); 167. 168. printf("请输入地址:>"); 169. scanf("%s", pc->data[pos].addr); 170. 171. printf("修改成功\n"); 172. } 173. 174. } 175. 176. int sort_by_name(const void* e1, const void* e2) 177. { 178. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); 179. } 180. 181. void SortByName(Contact* pc) 182. { 183. //按照名字来排序 184. qsort(pc->data, pc->sz, sizeof(pc->data[0]), sort_by_name); 185. }
229-test.c
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<stdio.h> 3. #include "229-contact.h" 4. 5. //通讯录 6. //1.通讯录中能够存放1000个人的信息 7. //每个人的信息 8. //名字+年龄+性别+电话+地址 9. //2.增加人的信息 10. //3.删除指定人的信息 11. //4.修改指定人的信息 12. //5.查找指定人的信息 13. //6.排序通讯录的信息 14. 15. void menu() 16. { 17. printf("***************************\n"); 18. printf("******1.add 2.del ****\n"); 19. printf("******3.search 4.modify****\n"); 20. printf("******5.sort 6.print ****\n"); 21. printf("******0.exit ****\n"); 22. printf("***************************\n"); 23. 24. } 25. 26. enum Option 27. { 28. EXIT, 29. ADD, 30. DEL, 31. SEARCH, 32. MODIFY, 33. SORT, 34. PRINT 35. }; 36. 37. int main() 38. { 39. int input = 0; 40. //创建通讯录 41. Contact con;//通讯录 42. //初始化通讯录 43. InitContact(&con); 44. do 45. { 46. menu(); 47. printf("请选择:>"); 48. scanf("%d", &input); 49. 50. //调用增删改查信息时,要把数组名和数组长度传过去 51. switch (input) 52. { 53. case ADD: 54. //增加人的信息 55. AddContact(&con); 56. break; 57. case DEL: 58. //删除人的信息 59. DelContact(&con); 60. break; 61. case SEARCH: 62. //查找人的信息 63. SearchContact(&con); 64. break; 65. case MODIFY: 66. //修改人的信息 67. ModifyContact(&con); 68. break; 69. case SORT: 70. SortByName(&con); 71. break; 72. case PRINT: 73. //打印信息 74. PrintContact(&con); 75. break; 76. case EXIT: 77. break; 78. default: 79. break; 80. } 81. } while(input); 82. 83. return 0; 84. }