A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

2)Contact.c 文件主要用来实现声明的函数和初始化全局变量
  1. //
  2. //  Contact.c
  3. //  ContactDemo
  4. //
  5. //  Created by amos on 10/2/15.
  6. //  Copyright (c) 2015 augmentum. All rights reserved.
  7. //

  8. #include <stdio.h>
  9. #include <string.h>
  10. #include "Contact.h"

  11. //定义并初始化联系人保存的文件名
  12. char *filePath = "contactList.data";

  13. //定义并初始化联系人的总个数
  14. int totalContacts = 0;


  15. /**
  16. *  增加联系人
  17. */
  18. void doAdd(){
  19.    
  20.     printf("增加联系人!\n");
  21.    
  22.     printf("请输入联系人姓名(不要有空格):");
  23.     scanf("%s", list[totalContacts].name);
  24.     printf("请输入联系人电话号码(不要有空格):");
  25.     scanf("%s", list[totalContacts].phoneNumber);

  26.     //自动给该联系人编号
  27.     list[totalContacts].num = totalContacts;
  28.    
  29.     totalContacts++;
  30.     doWriteToFile(list, -2);
  31. }

  32. /**
  33. *  删除联系人
  34. */
  35. void doDelete(char name[]){
  36.     //修改之前先打印该联系人的信息
  37.     int num = doSearchByName(name);
  38.    
  39.     if (-1 == num) {
  40.         return;
  41.     }
  42.    
  43.     printf("确定要删除吗(y/n)");
  44.    
  45.     char ch = getchar();
  46.    
  47.     while (ch == '\n') {
  48.         ch = getchar();
  49.     }
  50.     getchar();
  51.     //如果输入了Y那么执行删除
  52.     if ('y' == ch || 'Y' == ch) {
  53.         doWriteToFile(list, num);
  54.     }
  55. }
  56. /**
  57. *  修改联系人
  58. */
  59. void doUpdateByName(char name[]){
  60.     //修改之前先打印该联系人的信息
  61.     int num = doSearchByName(name);
  62.    
  63.     if (-1 == num) {
  64.         return;
  65.     }
  66.    
  67.     printf("请输入联系人姓名(不要有空格):");
  68.     scanf("%s", list[num].name);
  69.     printf("请输入联系人电话号码(不要有空格):");
  70.     scanf("%s", list[num].phoneNumber);
  71.     doWriteToFile(list, -2);
  72. }
  73. /**
  74. *  根据姓名查询联系人,返回联系人的编号
  75. */
  76. int doSearchByName(char name[]){
  77.     int num = -1;
  78.     doGetAllInfo();
  79.    
  80.     if (0 == totalContacts) {
  81.         printf("没有该联系人....");
  82.         return -1;
  83.     }

  84.    
  85.     for (int i = 0; i < totalContacts; i++) {
  86.         if (strcmp(list[i].name, name) == 0) {
  87.             num = i;
  88.             printf("编号\t|\t姓名\t|\t电话号码\n");
  89.             printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
  90.             break;
  91.         }
  92.     }
  93.    
  94.     if (-1 == num) {
  95.         printf("没有该联系人....");
  96.     }
  97.    
  98.     return num;
  99. }

  100. /**
  101. *  显示所有联系人的信息
  102. */
  103. void doShowAllInfo(){
  104.    
  105.     //显示信息之前,先从文件中获取所有联系人的信息
  106.     doGetAllInfo();
  107.    
  108.     if (0 == totalContacts) {
  109.         printf("暂无联系人,请添加联系人....");
  110.         return;
  111.     }
  112.    
  113.     printf("编号\t|\t姓名\t|\t电话号码\n");
  114.     for (int i = 0; i < totalContacts; i++) {
  115.         printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
  116.     }
  117. }

  118. /**
  119. *  显示功能选项
  120. */
  121. void doShowMenu(){
  122.    
  123.     //打印菜单
  124.     printf("\n\n*****************菜 单******************\n");
  125.     printf("****    1、显示所有联系人信息          ****\n");
  126.     printf("****    2、根据名字查询联系人信息       ****\n");
  127.     printf("****    3、修改联系人信息             ****\n");
  128.     printf("****    4、增加联系人                ****\n");
  129.     printf("****    5、删除联系人                ****\n");
  130.     printf("****    6、退出系统                  ****\n");
  131.     printf("\n请选择用数字选择功能:");
  132. }

  133. /**
  134. *  退出系统
  135. */
  136. void doExitSystem(){
  137.     printf("正在退出系统.......");
  138.     exit(0);
  139. }

  140. /**
  141. *  选择功能:根据用户输入的选项调用相应的功能
  142. */
  143. void doSwitchFunction(char operation){
  144.     char name[NAME_LEN];
  145.     switch (operation) {
  146.         case '1':
  147.             doShowAllInfo();
  148.             break;
  149.         case '2':
  150.             
  151.             printf("请输入要查询的联系人姓名(不要有空格):");
  152.             scanf("%s", name);
  153.             doSearchByName(name);
  154.             break;
  155.         case '3':
  156.             printf("请输入要更新的联系人姓名(不要有空格):");
  157.             scanf("%s", name);
  158.             doUpdateByName(name);
  159.             break;
  160.         case '4':
  161.             doAdd();
  162.             break;
  163.         case '5':
  164.             printf("请输入要删除的联系人姓名(不要有空格):");
  165.             scanf("%s", name);
  166.             doDelete(name);
  167.             break;
  168.         case '6':
  169.             doExitSystem();
  170.             break;
  171.         case '\n':
  172.             break;
  173.         default:
  174.             printf("\n请输入1~6 之间的数字选择功能!\n");
  175.     }
  176. }

  177. /**
  178. *  写入联系人信息到文件中
  179. */
  180. void doWriteToFile(Contact list[], int num){
  181.    
  182.     //以二进制的方式写入到文件中
  183.     FILE *fp = fopen(filePath, "wb");
  184.    
  185.     //每次写入一个contact信息,每次写1块
  186.     //1、先把联系人个数写入到文件中
  187.    
  188.    
  189.     //2、依次写入联系人信息
  190.     //如果num不等于-2说明是来自于删除操作,此时要更新每个联系人的编号
  191.     if (num != -2) {
  192.         int tempCount = totalContacts--;//删除一个联系人,因此总个数减1
  193.         fwrite(&totalContacts, sizeof(tempCount), 1, fp);
  194.         totalContacts = 0;    //将totalContacts重置,用于重新编号
  195.         
  196.         for (int i = 0 ; i < tempCount; i++) {
  197.             
  198.             if(num == i)//不再保存要删除的联系人
  199.             {
  200.                 continue;
  201.             }
  202.             
  203.             list[i].num = totalContacts;//更新联系人编号
  204.             fwrite(&list[i], sizeof(Contact), 1, fp);
  205.         }
  206.         printf("删除成功!");
  207.     }
  208.     else{
  209.         fwrite(&totalContacts, sizeof(totalContacts), 1, fp);
  210.         for (int i = 0 ; i < totalContacts; i++) {
  211.             
  212.             fwrite(&list[i], sizeof(Contact), 1, fp);
  213.         }
  214.         printf("保存成功!");
  215.     }
  216.    
  217.     fclose(fp);
  218.    
  219. }
  220. /**
  221. *  从文件中获取所有联系人信息到联系人列表中
  222. */
  223. void doGetAllInfo(){
  224.     FILE *fp = fopen(filePath, "r");
  225.    
  226.     if (NULL == fp) {
  227.         totalContacts = 0;
  228.         return;
  229.     }
  230.     //先读取出联系人总个数
  231.     fread(&totalContacts, sizeof(totalContacts), 1, fp);
  232.    
  233.     if (0 == totalContacts) {
  234.         return;
  235.     }
  236.     //再依次取出联系人信息
  237.     for (int i = 0; i < totalContacts; i++) {
  238.         fread(&list[i], sizeof(Contact), 1, fp);
  239.     }
  240.     fclose(fp);
  241. }

  242. 3)main.c文件是程序主循环入口
  243. //
  244. //  main.c
  245. //  ContactDemo
  246. //
  247. //  Created by amos on 10/2/15.
  248. //  Copyright (c) 2015 augmentum. All rights reserved.
  249. //

  250. #include <stdio.h>
  251. #include "Contact.h"


  252. int main(int argc, const char * argv[])
  253. {

  254.     //定义用户选择的功能选项
  255.     char operation = '0';
  256.    
  257.     //1、开始系统
  258.    
  259.     doShowMenu();
  260.     while (operation != 6){
  261.         
  262.         operation =  getchar();
  263.         if ('\n' == operation) {
  264.             continue;
  265.         }
  266.         
  267.         getchar();//用于吸收多余的回车符
  268.         //根据用户选择切换要使用的功能
  269.         doSwitchFunction(operation);
  270.         doShowMenu();
  271.     }
  272.    
  273.     return 0;
  274. }
复制代码


1 个回复

倒序浏览
很好,我已收录,可能点招时会用到。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马