C语言综合运用-------------编写 < 通讯录 >

半城伤御伤魂 提交于 2020-04-07 13:29:18

//

//  main.c

//  通讯录项目

//

//  Created by Elkins.Zhao on 15/3/24.

//  Copyright (c) 2015年 elkins. All rights reserved.

//

 

#include <stdio.h>

 

// 导入头文件

#include <string.h>

 

// 定义宏(联系人数组的长度,姓名长度,电话号码长度)

#define LEN 100

#define NAME_LEN 22

#define TELNUM_LEN 16

 

// 定义联系人结构体

typedef struct {

    // 定义联系人姓名

    char name[NAME_LEN];

    // 定义联系人电话号码

    char telNum[TELNUM_LEN];

    

} Person;   // 给结构体起别名

 

// 定义联系人数组

Person contacts[LEN];

 

// 定义变量保存联系人数量

int totalContactCount = 0;  // 初始化为0,表示通讯录没有人

 

// 定义变量保存文件名称

char *filePath = "telbook.data";

 

// 定义函数并声明

void doAdd();           // 添加联系人

void doDelete();        // 删除联系人

void doUpdate();        // 更新联系人

void doList();          // 列出所有联系人

void doSearchByName();  // 按姓名搜索联系人

void init();            // 初始化

void writeToFile();     // 写入文件

 

 

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

    

    // 定义变量接收用户输入的编号

    int num = 0;

    // 初始化系统

    init();

    

    int flag = 1;   // 定义flag为退出的标记

    

    while (flag) {

        

        // 打印功能界面

        printf("\n\n**************************\n");

        printf("****** 欢迎使用通讯录 ******\n");

        printf("****** 1、添加联系人  ******\n");

        printf("****** 2、删除联系人  ******\n");

        printf("****** 3、修改联系人  ******\n");

        printf("****** 4、查看所有联系人 ****\n");

        printf("****** 5、搜索联系人  ******\n");

        printf("****** 6、退出系统    ******\n");

        printf("**************************\n\n");

        

        printf("请输入1-6之间的序号,选择要执行的功能\n");

        

        // 接收用户输入的编号

        scanf("%d", &num);

        // 判断用户输入的编号是否合法

        if (num < 1 || num > 6) {

            

            printf("输入有误!\n");

            

        }else{

        

            // 如果输入的编号合法,选择相应的功能

            switch (num) {

                case 1:

                    doAdd();

                    break;

                case 2:

                    doDelete();

                    break;

                case 3:

                    doUpdate();

                    break;

                case 4:

                    doList();

                    break;

                case 5:

                    doSearchByName();

                    break;

                case 6:

                    // 推出系统

                    printf("正在退出系统...\n");

                    printf("系统已经退出!\n");

                    // reurn 0

                    flag = 0;   // flag = 1

                    break;

                    

                default:

                    break;

            }

        

        }

    }

    

    return 0;

}

 

 

// 添加联系人函数

void doAdd(){

 

    printf("您正在执行的是添加联系人的操作:\n");

    

    // 定义数组接收联系人信息

    char name[NAME_LEN];

    char telNum[TELNUM_LEN];

    // 提示用户输入联系人信息

    printf("请输入联系人姓名:   [*联系人姓名中间不能有空格]\n");

    // 接收联系人信息

    scanf("%s", name);

    // 提示输入电话号码信息

    printf("请输入联系人电话号码:[*联系人电话中间不能有空格]\n");

    // 接收电话号码

    scanf("%s",telNum);

    

    // 再次提示用户是否要添加联系人

    int nn;     // 用nn代表用户输入的时确定还是取消

    printf("您确定要添加这个联系人吗? 0.取消  1.确认\n");

    scanf("%d", &nn);

    if (nn) {

        // nn == 1 保存联系人到联系人数组中

        // 利用字符串copy函数

        strcpy(contacts[totalContactCount].name, name);

        strcpy(contacts[totalContactCount].telNum, telNum);

        // copy以后让联系人的个数自增

        totalContactCount++;

        // 把最新的数组写入到文件中

        writeToFile();

    }

    

}

 

// 删除联系人函数

void doDelete(){

 

    printf("您正在执行的是添加联系人的操作:\n");

    // 列出当前所有联系人

    doList();

    // 提示用户输入要删除的联系人的编号(一次只能删一个)

    printf("请输入要删除的联系人的编号(一次只能删一个):\n");

    int nn; // 用nn代表要删除的联系人编号

    scanf("%d", &nn);

    

    // 判断输入的编号是否合法

    if (nn < 1 || nn > totalContactCount) {

        

        // 如果编号不合法,return

        return ;

    }

    

    // 定义变量表示是否删除联系人

    int confirm = 0;

    // 提示用户是否删除

    printf("联系人删除后将无法恢复,请确认是否要删除: 0.取消  1.确认\n");

    scanf("%d", &confirm);

    if (confirm) {

        // 用户选择删除联系人

        // 判断要删除的联系人是否是最后一个

        if (nn == totalContactCount) {

            

            // 总人数 - 1  相当于不读取最后一个联系人的信息

            totalContactCount--;

            

        }else{

            // 移动元素

            // 从nn开始,后面的每个元素都覆盖前一个元素的信息

            for (int i = nn; i < totalContactCount; i++) {

                

                // 数组元素信息覆盖

                contacts[i - 1] = contacts[i];

            }

            // 循环结束 总人数 - 1

            totalContactCount--;

        }

        // 把修改后的联系人数组同步到文件中

        writeToFile();

    }

    

}

 

// 修改联系人函数

void doUpdate(){

 

    printf("您正在执行的是修改联系人的操作:\n");

    // 列出当前所有联系人

    doList();

    // 提示用户输入要修改的联系人的编号

    printf("请输入要修改的联系人的编号:\n");

    int nn; // 用nn代表要修改的联系人编号

    scanf("%d", &nn);

    

    // 判断输入的编号是否合法

    if (nn < 1 || nn > totalContactCount) {

        

        // 如果编号不合法,return

        return ;

    }

    

    // 定义联系人信息存储修改的联系人的信息

    char name[NAME_LEN];

    char telNum[TELNUM_LEN];

    

    // 提示用户输入联系人信息

    printf("请输入联系人姓名:   [*联系人姓名中间不能有空格]\n");

    // 接收联系人信息

    scanf("%s", name);

    // 提示输入电话号码信息

    printf("请输入联系人电话号码:[*联系人电话中间不能有空格]\n");

    // 接收电话号码

    scanf("%s",telNum);

 

    // 提示用户再次确认修改

    printf("联系人修改后将无法恢复,请确认是否要修改: 0.取消  1.确认");

    int confirm = 0;

    scanf("%d", &confirm);

    

    // 判断用户是否确认修改

    if (confirm) {

        

        // 用户确认修改联系人

        // 利用字符串copy函数

        strcpy(contacts[nn - 1].name, name);

        strcpy(contacts[nn - 1].telNum, telNum);

        // 同步写入文件中

        writeToFile();

        

    }

}

 

// 列出当前全部联系人函数

void doList(){

 

    printf("您正在执行的是查询所有联系人的操作:\n");

    // 先判断totalContactCount是否等于0

    if (totalContactCount == 0) {

        // 联系人为空

        printf("去年买了个表,联系人全丢了!\n");

        

    }else{

    

        // 打印联系人信息的表头

        printf("编号\t\t\t姓名\t\t\t电话\n");

        // 联系人不为空,打印所有联系人

        for (int i = 0; i < totalContactCount; i++) {

            

            // 遍历输出所有联系人的信息

            printf("%d\t\t\t%s\t\t\t%s\t\t\t\n", i + 1, contacts[i].name, contacts[i].telNum);

        }

    

    }

    

}

 

// 按姓名查找联系人函数

void doSearchByName(){

 

    printf("您正在执行的是搜索联系人的操作:\n");

    

    // 提示用户输入一个联系人的姓名

    printf("请输入联系人姓名:   [*联系人姓名中间不能有空格]\n");

    // 接收用户输入的信息

    char name[NAME_LEN];

    scanf("%s", name);

    

    // 遍历联系人数组

    int i;

    for (i = 0; i < totalContactCount; i++) {

        

        // 进行字符串比较

        if (strcmp(contacts[i].name, name) == 0) {

            

            // 此时说明找到了

            // 输出联系人信息

            printf("您要查找的联系人信息为: %s的电话是: %s\n", name, contacts[i].telNum);

            // 找到以后,跳出循环

            break;

        }

    

    }

    // 如果没有找到,提示用户

    if (i == totalContactCount) {

        

        printf("Sorry, 查无此人!\n");

    }

    

}

 

// 初始化函数

void init(){

 

    printf("系统正在初始化...\n");

    

    // 定义文件指针,尝试打开文件

    FILE *fp = fopen(filePath, "r");

    // 如果能打开,说明文件存在

    if (fp != NULL) {

        // 读取联系人的数量

        fread(&totalContactCount, sizeof(totalContactCount), 1, fp);

        // 根据联系人数量循环把联系人信息读取出来

        for (int i = 0; i < totalContactCount; i++) {

            // 读取联系人数组中的信息

            fread(&contacts[i], sizeof(Person), 1, fp);

        }

    }else{

        // 文件打开失败

        // 创建文件

        fp = fopen(filePath, "w");

        // 写入联系人的数量(已经在全局变量中初始化为0)

        fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);

        

        printf("联系人数据文件创建成功\n");

    }

    // 关闭文件指针

    fclose(fp);

    fp = NULL;

    

    printf("系统初始化完成!\n");

    

}

 

// 写入文件函数

void writeToFile(){

    

    // 打开文件

    FILE *fp = fopen(filePath, "w");

    // 判断是否打开成功

    if (fp != NULL) {

        

        // 先把联系人的数量写入文件中

        fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);

        // 把每个联系人的数据都写入文件中

        for (int i = 0; i < totalContactCount; i++) {

            // 循环每次把一个人的数据写入联系人数组中

            fwrite(&contacts[i], sizeof(Person), 1, fp);

        }

        // 循环结束说明联系人已经全部写入联系人数组中

        printf("数据更新完成!\n");

    }

    // 关闭文件

    fclose(fp);

    fp = NULL;

 

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!