标签:
------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 }
标签:
原文地址:http://www.cnblogs.com/snowimba/p/4855765.html