码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员---C基础15【通讯录应用】

时间:2015-10-05 15:35:34      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

【通讯录应用】

 

  1 //
  2 //  main.c
  3 //  15_通讯录
  4 //
  5 //  Created by snowimba on 15/9/28.
  6 //  Copyright © 2015年 snowimba. All rights reserved.
  7 //
  8 
  9 //引入头文件
 10 #include <stdio.h>
 11 #include <string.h>
 12 
 13 //进行宏定义
 14 #define N 100       //定义通讯录容量
 15 #define NAME_LEN 22 //定义联系人姓名长度
 16 #define NUM_LEN 12  //定义电话号码长度
 17 
 18 //***************定义部分*************
 19 //定义联系人结构体
 20 typedef struct{
 21     //联系人姓名
 22     char name[NAME_LEN];
 23     //联系人电话号码
 24     char telNum[NUM_LEN];
 25 
 26 }Person;
 27 
 28 //存储所有联系人,联系人的数组
 29 Person contacts[N]; //能够存储100个联系人
 30 
 31 //定义联系人的个数
 32 int totalContactCount=0;
 33 
 34 //接收用户输入的编号
 35 int fno;
 36 
 37 //定义数据文件保存的位置
 38 char *filePath = "telbook.data";
 39 
 40 //*************函数声明部分************
 41 int validateInput(int num,int min,int max);
 42 void doAdd();
 43 void doDelete();
 44 void doUpdate();
 45 void doList();
 46 void doSearchByName();
 47 void init();
 48 void writeFile();
 49 
 50 int main(int argc, const char * argv[]) {
 51     
 52     init();
 53     printf("通讯录初始化完成!\n");
 54     
 55     while (1) {
 56     
 57         //软件的界面显示出来
 58         printf("\n**********************************\n");
 59         printf("*********  欢迎使用通讯录  *********\n");
 60         printf("*********  1、添加联系人   *********\n");
 61         printf("*********  2、删除联系人   *********\n");
 62         printf("*********  3、修改联系人   *********\n");
 63         printf("*********  4、查看所有联系人  *******\n");
 64         printf("*********  5、搜索联系人   *********\n");
 65         printf("*********  6、退出系统     *********\n");
 66         printf("**********************************\n\n");
 67         
 68         //提示用户选择一个序号
 69         printf("请选择1-6之间的功能编号\n");
 70         scanf("%d",&fno);
 71         
 72         //判断编号是否合法
 73         validateInput(fno, 1, 6);
 74         
 75         switch (fno) {
 76             case 1:
 77                 //执行添加
 78                 doAdd();
 79                 break;
 80             case 2:
 81                 //执行删除
 82                 doDelete();
 83                 break;
 84             case 3:
 85                 //执行修改
 86                 doUpdate();
 87                 break;
 88             case 4:
 89                 //执行显示所有联系人
 90                 doList();
 91                 break;
 92             case 5:
 93                 //执行查找
 94                 doSearchByName();
 95                 break;
 96             case 6:
 97                 //执行退出系统
 98                 printf("系统正在退出...\n");
 99                 printf("退出系统成功!\n");
100                 return 0;
101                 break;
102                 
103             default:
104                 break;
105         }
106 
107     }
108     
109     return 0;
110 }
111 
112 /**
113  *  验证输入是否合法
114  *
115  *  @param num 待验证的数
116  *  @param min 最小值
117  *  @param max 最大值
118  *
119  *  @return 1 非法,0正常
120  */
121 int validateInput(int num,int min,int max){
122 
123     if (num<min||num>max) {
124         printf("非法的输入\n");
125         return 1;
126     }
127     return 0;
128 }
129 
130 /**
131  *  添加联系人
132     思路:
133     1、提示用户输入联系人姓名,接收联系人姓名
134     2、提示用户输入电话号码,接收电话号码
135     3、确认操作
136     4、联系人个数加1
137     5、把联系人信息写入到文件中
138  */
139 void doAdd(){
140     
141     printf("您选择的是添加联系人,请按照提示操作:\n");
142     
143     //1、提示用户输入联系人姓名,接收联系人姓名
144     printf("请输入联系人姓名(注意不要有空格):\n");
145     scanf("%s",contacts[totalContactCount].name);
146     
147     //2、提示用户输入电话号码,接收电话号码
148     printf("请输入联系人电话号码(注意不要有空格):\n");
149     scanf("%s",contacts[totalContactCount].telNum);
150     
151     //3、确认操作
152     int flag;
153     printf("您确认要添加吗?\n1.确认 0.取消\n");
154     scanf("%d",&flag);
155     if (flag) {
156         printf("联系人添加成功!\n");
157         //4、联系人个数加1
158         totalContactCount++;
159         //5、把联系人信息写入到文件中
160         writeFile();
161     }
162 }
163 
164 /**
165  *  删除联系人
166     思路:
167     前提:系统已经完成了初始化工作(如果文件存在则读取文件中的所有数据)
168     1、首先做一个判断
169     int totalContactCount=0; //表示没有联系人
170     2、如果不等于0
171     3、打印出联系人列表
172     4、提示选择您要删除联系人编号
173     5、对应编号数组元素为空
174         确认是否删除;
175     6、写入文件
176     7、开始遍历,并且输出联系人
177  */
178 void doDelete(){
179     
180     printf("您选择的是删除联系人,请按照提示操作:\n");
181     
182     //1、判断通讯录是否为空
183     if (totalContactCount==0) {
184         printf("您的通讯录为空,请添加联系人!\n");
185     }else{
186         //输出格式
187         printf("编号\t 姓名\t 电话\t \n");
188         //2、遍历联系人数组
189         for (int i=0; i<totalContactCount; i++) {
190             
191             printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
192             
193         }
194         int num;
195         //4、提示选择您要删除联系人编号
196         printf("输入您要删除联系人编号:\n");
197         scanf("%d",&num);
198         //判断是否非法
199         if(validateInput(num, 1, totalContactCount)){
200         
201             return ;
202         }
203         
204         //5、确认操作
205         int flag;
206         printf("您确认要删除%d\t%s 吗?\n1.确认 0.取消\n",num,contacts[num-1].name);
207         scanf("%d",&flag);
208         if (flag) {
209             for (int i=num-1; i<totalContactCount-1; i++) {
210                 //将数组数据从编号位置前移覆盖
211                 strcpy(contacts[i].name, contacts[i+1].name);
212                 strcpy(contacts[i].telNum, contacts[i+1].telNum);
213 
214             }
215             printf("联系人删除成功!\n");
216             //联系人个数减1
217             totalContactCount--;
218             //把联系人信息写入到文件中
219             writeFile();
220             
221         }
222     }
223 }
224 
225 /**
226  *  修改联系人
227  */
228 void doUpdate(){
229 
230     printf("您选择的是修改联系人,请按照提示操作:\n");
231     
232     //1、判断通讯录是否为空
233     if (totalContactCount==0) {
234         printf("您的通讯录为空,请添加联系人!\n");
235     }else{
236         //输出格式
237         printf("编号\t 姓名\t 电话\t \n");
238         //2、遍历联系人数组
239         for (int i=0; i<totalContactCount; i++) {
240             
241             printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
242             
243         }
244         int num;
245         Person arr;
246         //4、提示选择您要修改联系人编号
247         printf("输入您要修改联系人编号:\n");
248         scanf("%d",&num);
249         //判断是否非法
250         if(validateInput(num, 1, totalContactCount)){
251             
252             return ;
253         }
254         //提示用户输入修改的联系人姓名,接收联系人姓名
255         printf("请输入联系人姓名(注意不要有空格):\n");
256         scanf("%s",arr.name);
257         
258         //提示用户输入修改的电话号码,接收电话号码
259         printf("请输入联系人电话号码(注意不要有空格):\n");
260         scanf("%s",arr.telNum);
261         
262         //5、确认操作
263         int flag;
264         printf("您确认要将\n%s\t\%s修改为\n%s\t%s吗?\n1.确认 0.取消\n",contacts[num-1].name,contacts[num-1].telNum,arr.name,arr.telNum);
265         scanf("%d",&flag);
266         if (flag) {
267                 
268                 strcpy(contacts[num-1].name, arr.name);
269                 strcpy(contacts[num-1].telNum, arr.telNum);
270             
271             printf("联系人修改成功!\n");
272             
273             //把联系人信息写入到文件中
274             writeFile();
275             
276         }
277 
278     }
279     
280 }
281 
282 /**
283  *  显示所有联系人
284     思路:
285     前提:系统已经完成了初始化工作(如果文件存在则读取文件中的所有数据)
286     1、首先做一个判断
287         int totalContactCount=0; //表示没有联系人
288     2、如果不等于0
289         开始遍历,并且输出联系人
290  */
291 void doList(){
292 
293     printf("您选择的是显示所有联系人,联系人列表如下:\n");
294     
295     //判断通讯录是否为空
296     if (totalContactCount==0) {
297         printf("您的通讯录为空,请添加联系人!\n");
298     }else{
299         //输出格式
300         printf("编号\t 姓名\t 电话\t \n");
301         //遍历联系人数组
302         for (int i=0; i<totalContactCount; i++) {
303             
304             printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
305             
306         }
307     
308     }
309 
310 }
311 
312 /**
313  *  搜索联系人
314  */
315 void doSearchByName(){
316 
317     printf("您选择的是搜索联系人,请按照提示操作:\n");
318     
319     //判断通讯录是否为空
320     if (totalContactCount==0) {
321         printf("您的通讯录为空,请添加联系人!\n");
322     }else{
323         Person arr; //新建一个结构变量来保存用户搜索数据
324     //提示用户输入要搜索的姓名或者电话号码
325         printf("请您输入要搜索的姓名或者电话号码(注意不要有空格)\n");
326         scanf("%s",arr.name);
327         int n=0;    //定义一个搜索计数
328         //与数组内数据进行对比
329         for (int i=0; i<totalContactCount; i++) {
330             //如果一致则显示搜索结果
331             if (strcmp(arr.name,contacts[i].name)==0||strcmp(arr.name,contacts[i].telNum)==0) {
332                 n++;
333                 printf("搜索结果如下:\n");
334                 printf("编号\t 姓名\t 电话\t \n");
335                 printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
336             }
337             
338         }
339         //如果计数n=0则是未找到,则显示没有该联系人
340         if (n==0) {
341             printf("没有该联系人\n");
342         }
343     }
344 
345 }
346 
347 /**
348  通讯录的初始化工作
349  1、尝试读取数据文件
350  2、读取成功,说明文件存在
351         如果存在,要读取联系人数据,保存到联系人数组 contacts
352  3、如果读取失败,说明我们是第一次使用通讯录
353         如果是第一次使用
354         1)创建联系人数据文件
355         2)把当前联系人个数写入文件中 totalContactCount = 0
356  */
357 void init(){
358     
359     //定义文件指针,并且打开文件
360     FILE *fp = fopen(filePath, "r");
361     
362     if (fp!=NULL) {
363     
364         //第一步:读取联系人个数   4
365         fread(&totalContactCount, sizeof(totalContactCount), 1, fp);
366         
367         //第二步:读取每一个联系人  34
368         for (int i=0; i<totalContactCount; i++) {
369             //读取联系人数据到数组中
370             fread(&contacts[i], sizeof(Person), 1, fp);
371         }
372     }else{
373     
374         //创建文件
375         fp = fopen(filePath, "wb");
376         //写入联系人的个数
377         fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
378         printf("通讯录文件创建成功!\n");
379     
380     }
381     //关闭文件指针
382     fclose(fp);
383 
384 }
385 
386 /**
387  *  写入文件中
388  思路:
389  1、以wb方式打开文件
390  2、先写联系人个数
391  3、写每个联系人数据
392  */
393 void writeFile(){
394     
395     //1、以wb方式打开文件
396     FILE *fp = fopen(filePath, "wb");
397     if (fp!=NULL) {
398         
399         //2、先写联系人个数
400         fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
401         
402         //3、写每个联系人数据
403         for (int i=0; i<totalContactCount; i++) {
404             fwrite(&contacts[i], sizeof(Person), 1, fp);
405             
406         }
407         
408         printf("文件更新成功\n");
409     }
410     
411     //关闭文件
412     fclose(fp);
413     
414 }

 

 

 

 

黑马程序员---C基础15【通讯录应用】

标签:

原文地址:http://www.cnblogs.com/snowimba/p/4855765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!