C语言-通讯录

简介: C语言-通讯录

写一个通讯录

要求能够实现增删改查功能,思路如下:

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. }


相关文章
|
1月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
19 2
|
1月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
6月前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
3月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
5月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-2
|
5月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
5月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
32 2
|
6月前
|
存储 C语言
C语言实现通讯录
C语言实现通讯录
40 2
|
6月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
51 2