实现一个简易的通讯录

我们先可以简单的写出一个整体的大纲

//首先是创建一个联系人的信息,用一个结构体表示出来
typedef struct PersonInfo
{
 //一个联系人的信息
 char name[1024];
 char sex[1024];
 char age[1024];
 char phone[1024];
 char addrss[1024];
 char company[1024];
}PersonInfo;
 
其次是在创建一个结构体,将每个联系人都存放在里面
typedef struct Book
{
 //可以容纳联系人的个数
 PersonInfo book[MAX_PERSONINFO];//这里MAX_PERSONINFO是指想要创建一个存放多少人的通讯录
 int size;//通讯录的有效区间
}Book;
Book g_person_book;
 
在制作一个简易的菜单,实现显示功能
int Menu()
{
 printf("通讯录! ");
 printf("================================ ");
 printf("1.新增联系人 ");
 printf("2.查找联系人 ");
 printf("3.删除联系人 ");
 printf("4.修改联系人 ");
 printf("5.排序联系人 ");
 printf("6.查看全部联系人 ");
 printf("7.清空全部联系人 ");
 printf("0.退出 ");
 printf("================================ ");
 int choice = 0;
 printf("请输入您的选择:");
 scanf("%d",&choice);
 return choice;
}
 
接下来就完成具体的通讯录功能的实现
 
//所有的函数在传入的参数为指针的时候都需要进行非空的判定
void Init(Book* person_book)
{
 assert(person_book != NULL);
}
void Add_PersonInfo(Book* person_book)
{
 assert(Add_PersonInfo != NULL);
}
void Find_PersonInfo(Book* person_book)
{
 assert(person_book != NULL);
}
void Del_PersonInfo(Book* person_book)
{
 assert(person_book != NULL);
}
void Modify_PersonInfo(Book* person_book)
{
 assert(person_book != NULL); 
}
void Sort_PersonInfo(Book* person_book)
{
 assert(person_book != NULL);
}
void PrintAll_PersonInfo(Book* person_book)
{
 assert(person_book != NULL);
}
void ClearAll_PersonInfo(Book* person_book)
{
 assert(person_book != NULL);
}
 
在就是main函数的实现
在这里要注意一点就是,在通讯录的功能选择上,如果选择用 if 来实现,那么就会嵌套太多的 if,else,这里使用的是转移表的方式来实现
 
int main()
{
 //这里使用转移表的形式实现选项功能
 typedef void(*function)(Book*);
 function function_book[] = {
  Add_PersonInfo,
  Find_PersonInfo,
  Del_PersonInfo,
  Modify_PersonInfo,
  Sort_PersonInfo,
  PrintAll_PersonInfo,
  ClearAll_PersonInfo,
 };
 //初始化结构体
 Init(&g_person_book);
 
 while (1)
 {
  int choice = Menu();
  if (choice == 0)
  {
   printf("Goodbye! ");
   break;
  }
  if (choice < 0 || choice>7)
  {
   printf("您的输入不合法!请重新输入!");
   continue;
  }
  function_book[choice-1](&g_person_book);
 }
 return 0;
}
 
下面是完整的代码:
  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<assert.h>
  5 #include<string.h>
  6 #define MAX_PERSONINFO 200
  7 
  8 typedef struct PersonInfo
  9 {
 10     //每个联系人的信息
 11     char name[1024];
 12     char sex[1024];
 13     char age[1024];
 14     char phone[1024];
 15     char addrss[1024];
 16     char company[1024];
 17 }PersonInfo;
 18 
 19 typedef struct Book
 20 {
 21     //可以容纳联系人的个数
 22     PersonInfo book[MAX_PERSONINFO];
 23     int size;//通讯录的有效区间
 24 }Book;
 25 
 26 Book g_person_book;
 27 
 28 int Menu()
 29 {
 30     printf("通讯录!
");
 31     printf("================================
");
 32     printf("1.新增联系人
");
 33     printf("2.查找联系人
");
 34     printf("3.删除联系人
");
 35     printf("4.修改联系人
");
 36     printf("5.排序联系人
");
 37     printf("6.查看全部联系人
");
 38     printf("7.清空全部联系人
");
 39     printf("0.退出
");
 40     printf("================================
");
 41     int choice = 0;
 42     printf("请输入您的选择:");
 43     scanf("%d", &choice);
 44     return choice;
 45 }
 46 
 47 void Init(Book* person_book)
 48 {
 49     assert(person_book != NULL);
 50     memset(person_book, 0, sizeof(Book));
 51 }
 52 
 53 void Add_PersonInfo(Book* person_book)
 54 {
 55     assert(Add_PersonInfo != NULL);
 56 
 57     //查看是否达到最大储存量
 58     if (person_book->size >= MAX_PERSONINFO)
 59     {
 60         printf("添加失败!联系人已满!");
 61         return;
 62     }
 63     printf("新增联系人:
");
 64     printf("请输入联系人姓名:");
 65     //***********************scanf("%s", &((person_book->book[person_book->size]).name));
 66     PersonInfo* p = &person_book->book[person_book->size];
 67     scanf("%s", &p->name);
 68     printf("请输入联系人性别:");
 69     scanf("%s", &p->sex);
 70     printf("请输入联系人年龄:");
 71     scanf("%s", &p->age);
 72     printf("请输入联系人电话:");
 73     scanf("%s", &p->phone);
 74     printf("请输入联系人地址:");
 75     scanf("%s", &p->addrss);
 76     printf("请输入联系人公司:");
 77     scanf("%s", &p->company);
 78 
 79     printf("添加成功!
");
 80     ++person_book->size;
 81 }
 82 
 83 void Find_PersonInfo(Book* person_book)
 84 {
 85     assert(person_book != NULL);
 86     printf("请输入您要查找的姓名:");
 87     char find_name[1024] = { 0 };
 88     scanf("%s", &find_name);
 89     for (int i = 0; i < person_book->size; ++i)
 90     {
 91         PersonInfo* p = &person_book->book[i];
 92         if (strcmp(find_name, person_book->book[i].name) == 0)
 93         {
 94             printf("查找成功!
");
 95             printf("[%d]    %s	%s	%s	%s	%s	%s
",
 96                 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
 97         }
 98         else
 99         {
100             printf("查找失败!n");
101         }
102     }
103 }
104 
105 void Del_PersonInfo(Book* person_book)
106 {
107     assert(person_book != NULL);
108     printf("删除联系人!
");
109 
110     for (int i = 0; i < person_book->size; ++i)
111     {
112         PersonInfo* p = &person_book->book[i];
113         printf("[%d]    %s	%s	%s	%s	%s	%s
",
114             i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
115     }
116     printf("请输入您要删除的序号:");
117     int num = 0;
118     scanf("%d", &num);
119     if (num < person_book->size || num >= person_book->size)
120     {
121         printf("您的输入不合理,删除失败!
");
122         return;
123     }
124     printf("您确定要删除联系人:
");
125     PersonInfo* p = &person_book->book[num];
126     printf("[%d]    %s	%s	%s	%s	%s	%s
",
127         num, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
128     printf("输入Y确定删除!
");
129     char yes[1024] = { 0 };
130     scanf("%s", &yes);
131     if (strcmp(yes, "Y") != 0)
132     {
133         printf("删除失败!
");
134         return;
135     }
136     //执行删除操作
137     //1.用最后一个元素覆盖要删除的元素
138     PersonInfo* p1 = &person_book->book[person_book->size];
139     PersonInfo* p2 = &person_book->book[num];
140     *p1 = *p2;
141 
142     //2.在 size ++ 改变有效区间
143     --person_book->size;
144     printf("删除成功!
");
145 
146 }
147 
148 void Modify_PersonInfo(Book* person_book)
149 {
150     assert(person_book != NULL);
151 
152     //按姓名修改
153     printf("请输入您要修改的联系人的姓名:
");
154     char name[1024] = { 0 };
155     scanf("%s", &name);
156     int i = 0;
157     for (; i < person_book->size; ++i)
158     {
159         if (strcmp(name, person_book->book[i].name) == 0)
160         {
161             break;
162         }
163     }
164     if (strcmp(name, person_book->book[i].name) != 0)
165     {
166         printf("修改失败!没有相应的联系人!
");
167         return;
168     }
169 
170     printf("您要修改的联系人是否为:
");
171     PersonInfo* p = &person_book->book[i];
172     printf("[%d]    %s	%s	%s	%s	%s	%s
",
173         i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
174     printf("输入Y确定:");
175     char str[1024] = { 0 };
176     scanf("%s", &str);
177     if (strcmp(str, "Y") != 0)
178     {
179         printf("修改失败!
");
180     }
181 
182     //开始修改
183     printf("请输入联系人名字:");
184     scanf("%s", &p->name);
185     printf("请输入联系人性别:");
186     scanf("%s", &p->sex);
187     printf("请输入联系人年龄:");
188     scanf("%s", &p->age);
189     printf("请输入联系人电话:");
190     scanf("%s", &p->phone);
191     printf("请输入联系人地址:");
192     scanf("%s", &p->addrss);
193     printf("请输入联系人公司:");
194     scanf("%s", &p->company);
195 
196     printf("修改成功!
");
197 
198 }
199 
200 void Sort_PersonInfo(Book* person_book)
201 {
202     assert(person_book != NULL);
203 
204     //按姓名排序,应用冒泡排序的方式写
205     PersonInfo temp = { 0 };
206     int num = 0;//[0,num]表示未排序区间,[num,size]表示已经排序的区间
207     int i = (person_book->size) - 1;
208     for (; num < person_book->size; ++num)
209     {
210         for (; i > num; --i)
211         {
212             //升序排序
213             if (strcmp((person_book->book[i].name), (person_book->book[i - 1].name)) < 0)
214             {
215                 //person_book->book[i + 1].name = person_book->book[i].name;
216                 temp = person_book->book[i - 1];
217                 person_book->book[i - 1] = person_book->book[i];
218                 person_book->book[i] = temp;
219             }
220         }
221     }
222 
223     //打印出联系人
224     for (; i < person_book->size; ++i)
225     {
226         PersonInfo* p = &person_book->book[i];
227         printf("[%d]    %s	%s	%s	%s	%s	%s
",
228             i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
229     }
230 
231 }
232 
233 void PrintAll_PersonInfo(Book* person_book)
234 {
235     assert(person_book != NULL);
236     printf("打印成功!共打印%d条信息!
", person_book->size);
237     for (int i = 0; i < person_book->size; ++i)
238     {
239         PersonInfo* p = &person_book->book[i];
240         printf("[%d]    %s	%s	%s	%s	%s	%s
",
241             i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
242     }
243 }
244 
245 void ClearAll_PersonInfo(Book* person_book)
246 {
247     assert(person_book != NULL);
248 
249     //可以直接将有效区间size设置为0
250     printf("是否确定要删除所有联系人!
");
251     printf("输入Y表示确定:");
252     char str[1024] = { 0 };
253     scanf("%s", &str);
254 
255     if (strcmp(str, "Y") != 0)
256     {
257         printf("删除失败!
");
258     }
259 
260     person_book->size = 0;
261 }
262 
263 int main()
264 {
265     //这里使用转移表的形式实现选项功能
266     typedef void(*function)(Book*);
267     function function_book[] = {
268         Add_PersonInfo,
269         Find_PersonInfo,
270         Del_PersonInfo,
271         Modify_PersonInfo,
272         Sort_PersonInfo,
273         PrintAll_PersonInfo,
274         ClearAll_PersonInfo,
275     };
276 
277     //初始化结构体
278     Init(&g_person_book);
279 
280     while (1)
281     {
282         int choice = Menu();
283         if (choice == 0)
284         {
285             printf("Goodbye!
");
286             break;
287         }
288         if (choice < 0 || choice>7)
289         {
290             printf("您的输入不合法!请重新输入!");
291             continue;
292         }
293         function_book[choice - 1](&g_person_book);
294 
295     }
296     return 0;
297 }
 
原文地址:https://www.cnblogs.com/cuckoo-/p/10533732.html