黑马程序员技术交流社区

标题: C语言综合项目-通讯录 [打印本页]

作者: 堕落天使    时间: 2016-3-20 14:48
标题: C语言综合项目-通讯录

  1. /*
  2. C语言综合应用:实现通讯录。
  3. */


  4. #include <stdio.h>
  5. #include <string.h>

  6. #define NAMELEN 22
  7. #define TELLEN 12
  8. #define LEN 100  //通讯录长度
  9. //匿名通讯录结构体
  10. typedef struct{
  11.    
  12.     char name[NAMELEN];
  13.     char telNum[TELLEN];

  14. }Person;
  15. Person addressBook[LEN];
  16. int totalCount = 0; //通讯录内元素个数。
  17. char *p = "addressBook.data";

  18. /**
  19. *  主函数
  20. */
  21. int main(int argc, const char * argv[]) {
  22.     //函数的声明。
  23.     void init();
  24.     int judgeInput(int n,int min,int max);
  25.     void doList();
  26.     void doAdd();
  27.     void doUpdata();
  28.     void doDelete();
  29.     void doChang();
  30.     void doSearch();
  31.    
  32.     printf("欢迎使用通讯录!\n");
  33.         //通讯录初始化。
  34.     init();
  35.     while (1) {
  36.         printf("\n");
  37.         
  38.         printf("*********************************\n");
  39.         printf("******欢迎使用通讯录 ***************\n");
  40.         printf("*******1、添加联系人 ***************\n");
  41.         printf("*******2、删除联系人 ***************\n");
  42.         printf("*******3、修改联系人 ***************\n");
  43.         printf("*******4、查看所有联系人 ************\n");
  44.         printf("*******5、搜索联系人 ****************\n");
  45.         printf("*******6、退出系统  *****************\n");
  46.         printf("*********************************\n");
  47.         printf("请选择1~6之间的一个操作:\n");
  48.         int fno = 0;
  49.         scanf("%d",&fno);
  50.         //判断输入是否合法。
  51.         judgeInput(fno, 1, 6);
  52.         switch (fno) {
  53.             case 1:
  54.                 printf("您选择的是添加联系人!\n");
  55.                 doAdd();
  56.                 break;
  57.             
  58.             case 2:
  59.                 printf("您选择的是删除联系人\n");
  60.                 doDelete();
  61.                 break;
  62.             
  63.             case 3:
  64.                 printf("您选择的是修改联系人\n");
  65.                 doChang();
  66.                 break;
  67.             
  68.             case 4:
  69.                 printf("您选择的是查看所有联系人\n");
  70.                 doList();
  71.                 break;
  72.             
  73.             case 5:
  74.                 printf("您选择的是搜索联系人\n");
  75.                 doSearch();
  76.                 break;
  77.             
  78.             case 6:
  79.                 printf("您选择的退出系统!\n");
  80.                 printf("系统正在退出······\n");
  81.                 printf("系统已经退出!\n");
  82.                 return 0;
  83.                 break;
  84.                
  85.             default:
  86.                 break;
  87.         }
  88.         
  89.         
  90.         
  91.     }
  92.     return 0;
  93. }

  94. /**
  95. 通讯录初始化
  96. 1、尝试读取文件,如果存在,把文件内容读取到数组中。(r的方式打开)
  97. 2、如果文件不存在,创建文件,并把数组的个数存到文件中。(wb方式打开)
  98. */
  99. void init(){
  100.     FILE *fp = fopen(p, "r");
  101.     if (fp != NULL) {
  102.         fread(&totalCount, sizeof(totalCount), 1, fp);
  103.         for (int i = 0; i<totalCount; i++) {
  104.             fread(&addressBook[i], sizeof(Person), 1, fp);
  105.         }
  106.     } else {
  107.         FILE *fp = fopen(p, "wb");
  108.         fwrite(&totalCount, sizeof(totalCount), 1, fp);
  109.     }
  110.     fclose(fp);
  111.     printf("通讯录初始化完成!\n");
  112. }
  113. /**
  114. *  判断输入是否有误
  115. *
  116. *  @param n   输入的数值
  117. *  @param min 最小值
  118. *  @param max 最大值
  119. *
  120. *  @return <#return value description#>
  121. */
  122. int judgeInput(int n,int min,int max){
  123.     if (n>max || n<min) {
  124.         printf("您输入的结果有误!\n");
  125.         return 0 ;
  126.     } else {
  127.         return 1;
  128.     }
  129. }
  130. /**
  131. *  显示所有联系人
  132. */
  133. void doList(){

  134.     if (totalCount == 0) {
  135.         printf("您的通讯录里还没有小伙伴,请添加联系人!\n");
  136.     }else{
  137.         printf("显示联系人:\n");
  138.         printf("编号:\t  姓名:\t  电话:\t \n");
  139.         for (int i = 0; i<totalCount; i++) {
  140.             
  141.         printf("%d\t  %s\t  %s\t\n",i+1,addressBook[i].name,addressBook[i].telNum);
  142.         }
  143.     }
  144. }
  145. /**
  146. *  添加联系人
  147. */
  148. void doAdd(){
  149.     void doUpdata();
  150.     printf("请输入联系人姓名:(*中间不能有空格)\n");
  151.     scanf("%s",addressBook[totalCount].name);
  152.     printf("请输入联系人电话:(*中间不能有空格)\n");
  153.     scanf("%s",addressBook[totalCount].telNum);
  154.     printf("您确定要添加吗? 1、确定 2、取消\n");
  155.     int flag;
  156.     scanf("%d",&flag);
  157.     if (flag) {
  158.         totalCount++;
  159.         doUpdata();
  160.     }
  161. }
  162. /**
  163. *  更新文件
  164. */
  165. void doUpdata(){
  166.     FILE *fp = fopen(p, "wb");
  167.     if (fp != NULL) {
  168.         fwrite(&totalCount, sizeof(totalCount), 1, fp);
  169.         for (int i  = 0; i<totalCount; i++) {
  170.             fwrite(&addressBook[i], sizeof(Person), 1, fp);
  171.         }
  172.         printf("写入文件更新成功!\n");
  173.     }
  174.     fclose(fp);
  175. }

  176. void doDelete(){
  177.     int fno;
  178.     doList();
  179.     printf("请选择要删除的联系人编号!\n");
  180.     scanf("%d",&fno);
  181.     judgeInput(fno, 1, totalCount);
  182.     if (fno == totalCount) {
  183.         totalCount--;
  184.     } else {
  185.         addressBook[fno-1] = addressBook[fno];
  186.         totalCount--;
  187.     }
  188.     doUpdata();
  189. }
  190. /**
  191. *  修改联系人
  192. */
  193. void doChang(){
  194.     char name[NAMELEN];
  195.     char tel[TELLEN];
  196.     int fno;
  197.     int flag;
  198.     doList();
  199.     printf("请输入要修改的联系人编号!\n");
  200.     scanf("%d",&fno);
  201.     judgeInput(fno, 1, totalCount);
  202.     printf("请输入新的联系人姓名。(中间不能有空格!)\n");
  203.     scanf("%s",name);
  204.     printf("请输入新的电话号码。(中间不能有空格!)\n");
  205.     scanf("%s",tel);
  206.     printf("确认要修改吗? 1、确认 2、取消\n");
  207.     scanf("%d",&flag);
  208.     if (flag) {
  209.         strcpy(addressBook[fno-1].name, name);
  210.         strcpy(addressBook[fno-1].telNum, tel);
  211.         doUpdata();
  212.         printf("联系人修改成功!\n");
  213.     }
  214. }

  215. /**
  216. *  搜索联系人
  217. */
  218. void doSearch(){
  219.     char name[NAMELEN];
  220.     printf("请输入要查找的联系人的姓名。(中间不能有空格!)\n");
  221.     scanf("%s",name);
  222.     int i  = 0;
  223.     for ( i  = 0; i<totalCount; i++) {
  224.         if (strcmp(addressBook[i].name, name) == 0) {
  225.             printf("您查找的联系人 %s的电话是 %s",name,addressBook[i].telNum);
  226.             break;
  227.         }
  228.     }
  229.     if (i == totalCount) {
  230.         printf("对不起,查无此人!\n");
  231.         return ;
  232.     }
  233. }
复制代码


作者: jacku    时间: 2016-3-20 23:58
厉害,这么多都写完了
作者: 堕落天使    时间: 2016-3-21 10:47
jacku 发表于 2016-3-20 23:58
厉害,这么多都写完了

也是不一次就写成功的,中间也出了不少错误,不对的再检查,不会的再看视频,一步步的来,总算是弄完了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2