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

------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 }
时间: 2024-08-25 22:14:32

黑马程序员---C基础15【通讯录应用】的相关文章

黑马程序员--java基础学习笔记5

黑马程序员--java基础学习笔记6 一.笔记内容概述: 数组-第二种定义格式.数组-常见操作-遍历-最值-选择排序-冒泡排序-排序位置置换代码提取.数组-排序的性能问题.数组-常见功能-查找-折半查找.进制转换-查表法-整合. 二.常用内容介绍: 1.数组初始化的三种方式: int[] arr = new int[3]; int[] arr = new int[]{1,2,3}; int[] arr = {1,2,3}; 2.查表法: 如果数据中出现了对应关系,而且对应关系的一方是有序的数字编

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员_Java基础加强(下)

8.注解类 注解相当于一种标记,加了注解就等于打上了某种标记,没加就等于没打特殊标记,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记就去干什么事,标记可以加在包.类.字段.方法,方法的参数以及局部变量上. 注解的应用结构图: 为注解增加属性 定义基本类型的属性和应用属性 在注解类中增加String color(); @MyAnnotation(color = "red") 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法 MyAnno

黑马程序员_Java基础加强(上)

1.静态导入 静态导入是jdk1.5版本以后出现的新特性,一般是指导入静态方法,如:import static java.lang.System.out 是指导入系统输出的静态方法. 例: import static java.lang.System.out //导入java.lang包下的System类的静态方法out public class StaticImport { public static void main(String[] args) { int x=1; x++; out.p

黑马程序员-正则表达式基础

正则表达式是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的.正则表达式可以用于搜索.编辑或者是操作文本和数据.它超出了 Java 程序设计语言的标准语法,因此有必要去学习特定的语法来构建正则表达式.正则表达式的变化是复杂的,一旦你理解了它们是如何被构造的话,你就能解析或者构建任意的正则表达式了..正则表达式由一些普通字符和一些元字符组成. 普通字符包括大小写的字母和数字,而元字符则具有特殊的含义.在最简单的情况下,一个正则表达式看上去就是一个普通的查找串.例如,正则表达式"a

黑马程序员——java基础——多线程

 黑马程序员--java基础--多线程 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量.

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象