静态通讯录的实现

简介: 静态通讯录的实现

本篇博客将实现一个简易静态通讯录,通讯录实现增删改差,显示,排序等基本功能。后续会改善版本,来解决内存多余等问题。

首先是程序实现的方式:

采用模块化的方式,通讯录分为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/


相关文章
|
12月前
【动态通讯录】
【动态通讯录】
41 0
|
5月前
|
存储 编译器 C语言
通讯录详解(静态版,动态版,文件版)
通讯录详解(静态版,动态版,文件版)
49 0
|
12月前
|
存储
【静态通讯录】
【静态通讯录】
31 0
|
存储
C实现通讯录(静态版+动态版)(一)
C实现通讯录(静态版+动态版)
34 0
C实现通讯录(静态版+动态版)(一)
|
存储
通讯录(静态版)
通讯录(静态版)
|
C语言
C/【静态通讯录】
C/【静态通讯录】
静态通讯录
C语言学习——教你学会静态通讯录的实现(保姆级教程哦~)
通讯录(静态版)(二)
大家好,有好久没有带大家一起搞实战的编程了,今天就给大家带来一个简单的通讯录小系统
62 0
|
存储
通讯录(静态版)(一)
大家好,有好久没有带大家一起搞实战的编程了,今天就给大家带来一个简单的通讯录小系统
79 0