黑马程序员----C语言学习笔记之学习总结《通讯录》程序实现

------Java培训、Android培训、iOS培训、.Net培训--------
《通讯录》功能展示
跟着视频自学了一个星期C语言,今天终于搞定了,花了四个小时终于把这个小程序搞定了,也许还有很多bug,不过目前重大bug都搞定了,希望大家多多指出我的错误,或者不合适的地方,共同学习

1、操作界面及框架
1)引入头文件
2)进行必要地宏定义
3)定义文件名称变量、联系人数组、联系人结构体
4)定义函数、并进行函数声明
5)编写循环控制程序
6)显示操作界面
7)根据选择编号执行不同的函数
2、代码实现

主要有三个文件:Contact.h、Contact.c 和main.c

1)Contact.h主要用来声明要用到的函数和全局变量
//
//  Contact.h
//  ContactDemo
//
//  Created by amos on 10/2/15.
//  Copyright (c) 2015 augmentum. All rights reserved.
//

#ifndef ContactDemo_Contact_h
#define ContactDemo_Contact_h

//定义联系人姓名最大长度
#define NAME_LEN 25

//定义联系人电话号码最大长度
#define PHONE_NUMBER_LEN 12

//定义联系人列表长度
#define LIST_LEN 100

//声明联系人保存的文件名
char *filePath;

//声明联系人的总个数
int totalContacts;

/**
 *  定义通讯录结构体
 */

typedef struct {
    int num; //编号
    char name[NAME_LEN]; //姓名
    char phoneNumber[PHONE_NUMBER_LEN]; //电话号码
    
} Contact;


//定义联系人列表
Contact list[LIST_LEN];

/**
 *  增加联系人
 */
void doAdd();

/**
 *  根据姓名删除联系人,num用于指定要删除的联系人编号
 */
void doDelete(char name[]);

/**
 *  修改联系人
 */
void doUpdateByName(char name[]);

/**
 *  根据姓名查询联系人,返回联系人的编号
 */
int doSearchByName(char name[]);

/**
 *  显示功能选项
 */
void doShowMenu();

/**
 *  退出系统
 */
void doExitSystem();

/**
 *  选择功能
 */
void doSwitchFunction(char operation);

/**
 *  写入联系人信息到文件中
 *  num用于指定要删除的联系人编号

 */
void doWriteToFile(Contact list[], int num);

/**
 *  从文件中获取所有联系人信息到联系人列表中
 */
void doGetAllInfo();

#endif

2)Contact.c 文件主要用来实现声明的函数和初始化全局变量

//
//  Contact.c
//  ContactDemo
//
//  Created by amos on 10/2/15.
//  Copyright (c) 2015 augmentum. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include "Contact.h"

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

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


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

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

/**
 *  删除联系人
 */
void doDelete(char name[]){
    //修改之前先打印该联系人的信息
    int num = doSearchByName(name);
    
    if (-1 == num) {
        return;
    }
    
    printf("确定要删除吗(y/n)");
    
    char ch = getchar();
    
    while (ch == '\n') {
        ch = getchar();
    }
    getchar();
    //如果输入了Y那么执行删除
    if ('y' == ch || 'Y' == ch) {
        doWriteToFile(list, num);
    }
}
/**
 *  修改联系人
 */
void doUpdateByName(char name[]){
    //修改之前先打印该联系人的信息
    int num = doSearchByName(name);
    
    if (-1 == num) {
        return;
    }
    
    printf("请输入联系人姓名(不要有空格):");
    scanf("%s", list[num].name);
    printf("请输入联系人电话号码(不要有空格):");
    scanf("%s", list[num].phoneNumber);
    doWriteToFile(list, -2);
}
/**
 *  根据姓名查询联系人,返回联系人的编号
 */
int doSearchByName(char name[]){
    int num = -1;
    doGetAllInfo();
    
    if (0 == totalContacts) {
        printf("没有该联系人....");
        return -1;
    }

    
    for (int i = 0; i < totalContacts; i++) {
        if (strcmp(list[i].name, name) == 0) {
            num = i;
            printf("编号\t|\t姓名\t|\t电话号码\n");
            printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
            break;
        }
    }
    
    if (-1 == num) {
        printf("没有该联系人....");
    }
    
    return num;
}

/**
 *  显示所有联系人的信息
 */
void doShowAllInfo(){
    
    //显示信息之前,先从文件中获取所有联系人的信息
    doGetAllInfo();
    
    if (0 == totalContacts) {
        printf("暂无联系人,请添加联系人....");
        return;
    }
    
    printf("编号\t|\t姓名\t|\t电话号码\n");
    for (int i = 0; i < totalContacts; i++) {
        printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
    }
}

/**
 *  显示功能选项
 */
void doShowMenu(){
    
    //打印菜单
    printf("\n\n*****************菜 单******************\n");
    printf("****    1、显示所有联系人信息          ****\n");
    printf("****    2、根据名字查询联系人信息       ****\n");
    printf("****    3、修改联系人信息             ****\n");
    printf("****    4、增加联系人                ****\n");
    printf("****    5、删除联系人                ****\n");
    printf("****    6、退出系统                  ****\n");
    printf("\n请选择用数字选择功能:");
}

/**
 *  退出系统
 */
void doExitSystem(){
    printf("正在退出系统.......");
    exit(0);
}

/**
 *  选择功能:根据用户输入的选项调用相应的功能
 */
void doSwitchFunction(char operation){
    char name[NAME_LEN];
    switch (operation) {
        case '1':
            doShowAllInfo();
            break;
        case '2':
            
            printf("请输入要查询的联系人姓名(不要有空格):");
            scanf("%s", name);
            doSearchByName(name);
            break;
        case '3':
            printf("请输入要更新的联系人姓名(不要有空格):");
            scanf("%s", name);
            doUpdateByName(name);
            break;
        case '4':
            doAdd();
            break;
        case '5':
            printf("请输入要删除的联系人姓名(不要有空格):");
            scanf("%s", name);
            doDelete(name);
            break;
        case '6':
            doExitSystem();
            break;
        case '\n':
            break;
        default:
            printf("\n请输入1~6 之间的数字选择功能!\n");
    }
}

/**
 *  写入联系人信息到文件中
 */
void doWriteToFile(Contact list[], int num){
    
    //以二进制的方式写入到文件中
    FILE *fp = fopen(filePath, "wb");
    
    //每次写入一个contact信息,每次写1块
    //1、先把联系人个数写入到文件中
    
    
    //2、依次写入联系人信息
    //如果num不等于-2说明是来自于删除操作,此时要更新每个联系人的编号
    if (num != -2) {
        int tempCount = totalContacts--;//删除一个联系人,因此总个数减1
        fwrite(&totalContacts, sizeof(tempCount), 1, fp);
        totalContacts = 0;    //将totalContacts重置,用于重新编号
        
        for (int i = 0 ; i < tempCount; i++) {
            
            if(num == i)//不再保存要删除的联系人
            {
                continue;
            }
            
            list[i].num = totalContacts;//更新联系人编号
            fwrite(&list[i], sizeof(Contact), 1, fp);
        }
        printf("删除成功!");
    }
    else{
        fwrite(&totalContacts, sizeof(totalContacts), 1, fp);
        for (int i = 0 ; i < totalContacts; i++) {
            
            fwrite(&list[i], sizeof(Contact), 1, fp);
        }
        printf("保存成功!");
    }
    
    fclose(fp);
    
}
/**
 *  从文件中获取所有联系人信息到联系人列表中
 */
void doGetAllInfo(){
    FILE *fp = fopen(filePath, "r");
    
    if (NULL == fp) {
        totalContacts = 0;
        return;
    }
    //先读取出联系人总个数
    fread(&totalContacts, sizeof(totalContacts), 1, fp);
    
    if (0 == totalContacts) {
        return;
    }
    //再依次取出联系人信息
    for (int i = 0; i < totalContacts; i++) {
        fread(&list[i], sizeof(Contact), 1, fp);
    }
    fclose(fp);
}

3) 以下是《通讯录》的功能展示部分


1、菜单显示

*****************菜 单******************
****    1、显示所有联系人信息         ****
****    2、根据名字查询联系人信息      ****
****    3、修改联系人信息            ****
****    4、增加联系人               ****
****    5、删除联系人               ****
****    6、退出系统                 ****

2、显示所有联系人信息
      请选择用数字选择功能:1

      暂无联系人,请添加联系人....

3、添加联系人
请选择用数字选择功能:4
增加联系人!
请输入联系人姓名(不要有空格):Amos
请输入联系人电话号码(不要有空格):45646

保存成功!

4、根据名字查询联系人
请选择用数字选择功能:2
请输入要查询的联系人姓名(不要有空格):Amos
编号 | 姓名 | 电话号码

0 | Amos | 123123

5、更新联系人信息
请选择用数字选择功能:3
请输入要更新的联系人姓名(不要有空格):Amos
编号 | 姓名 | 电话号码
0 | Amos | 123123
请输入联系人姓名(不要有空格):AmosLi
请输入联系人电话号码(不要有空格):33333
保存成功!
【再次查询所有联系人信息】

请选择用数字选择功能:1
编号 | 姓名 | 电话号码

0 | AmosLi | 33333

6、删除联系人

请选择用数字选择功能:5
请输入要删除的联系人姓名(不要有空格):AmosLi
编号 | 姓名 | 电话号码
0 | AmosLi | 33333
确定要删除吗(y/n)y
删除成功!
【删除成功后再次查询所有联系人信息】
请选择用数字选择功能:1

暂无联系人,请添加联系人....

7、退出系统
请选择用数字选择功能:6

正在退出系统.......

8.总结

做这个小程序真的考察了很多知识,感觉自己还是不够熟悉。除了开头的菜单设计是参照老师的,后面的代码都是自己想的,有可能没老师的好,不过好歹完全是自己搞的,忙了一天,也是很开心了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章