//

//  main.c

//  手机通讯录

//

//  Created by Kevin-Dfg on 16/4/19.

//  Copyright © 2016年 Kevin-Dfg. All rights reserved.

//

#include <stdio.h>

#include <string.h>

 

// =====================变量的定义==================================

 

//定义宏 去描述 联系人名字数组和联系人号码数组的长度

#define NAME_LEN 30

#define NUM_LEN 30

//定义一个宏 去描述联系人列表最多可以放多少个联系人

#define MAX_LEN 1000

#define MYFILENAME "day12.txt"

 

//描述联系人的信息 --》 结构体

struct Person{

    //联系人的姓名

    char name[NAME_LEN];

    //联系人的号码

    char num[NUM_LEN];

};

 

//多个联系人信息 --》 批量的联系人信息--》 结构体数组去描述整个联系人列表信息   定义一个足够长的数组 去保存我们想要存的联系人信息

struct Person peoples[MAX_LEN];

 

//创建一个变量  描述当前数组中 有多少个联系人

int current = 0;

 

// ======================函数的声明=================================

 

//初始化数据

void init();

 

//添加联系人

void addP();

 

//删除联系人

void delP();

 

 

 

 

我的github:       https://github.com/Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C

//修改联系人

void updP();

 

//展示联系人

void showP();

 

//搜索联系人

 

void searchP();

 

//展示功能列表

void showTitle();

 

//写入文件操作

void writToFile();

 

/*

 1.调用初始化函数

 2.写循环 将 展示功能 放入循环中

 3. 提示用户输入序号 表示要执行哪个功能

 4。接收用户的输入

 5.根据序号进行选择执行那些功能    调用对应的函数

 

 

 **/

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

    

    //主逻辑

    init();

    while (1) {

        //展示功能项

        showTitle();

        //给用户提示 请输入功能项的序号

        printf("请输入对应功能的序号 : ");

        //接收用户的输入

        int user = 0;

        scanf("%d",&user);

        //做简单的判断 去容错

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

            printf("没有此功能 别闹 \n");

            return 0;

        }

        //假如用户输入的是 6

        if (user == 6) {

            printf("选择了 退出系统  \n");

            return 0;

        }

        

        

        //判断用户的输入 选择不同的功能

        switch (user) {

            case 1:

                printf("选了 1 添加联系人操作 \n");

                addP();

                break;

            case 2:

                printf("选了 2 删除联系人操作 \n");

                delP();

                break;

                

            case 3:

                printf("选了 3 修改联系人操作 \n");

                updP();

                break;

                

            case 4:

                printf("选了 4 展示联系人操作 \n");

                showP();

                

                break;

                

            case 5:

                printf("选了 5 搜索联系人操作 \n");

                searchP();

                break;

                

            default:

                break;

        }

        

    }

    

    

    

    return 0;

}

 

// ===================函数的实现====================================

//初始化数据

//把文件中的数据 读取出来 存入到 内存中的结构体数组中

void init(){

    //1.引入头文件

    

    //2.定义文件指针 并打开文件

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

    if(fp != NULL){

        //3.操作文件

        //读取数据 到内存中

        //把文件中存多少条数据 取出

        fread(&current, sizeof(int), 1, fp);

        

        //根据存了多少条数据 进行读取操作

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

            

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

        }

        printf("读取完毕 \n");

    }else{

        // 没有上一次  ---> 第一次使用

        //printf("");

    }

    //4.关闭文件

    fclose(fp );

    

    printf("初始化完毕 \n");

}

 

//添加联系人

 

//1.提示 输入联系人名字

//2.接收联系人名字

//3.提示 输入联系人号码

//4.接收联系人号码

//5.确定添加吗

//6.接受用户的选择

//7.根据用户的选择做出添加操作

//7.1 添加到内存中的联系人数组中

//7.2 current 进行自增1

//7.3 将联系人信息写入到文件

 

void addP(){

    

    //1.提示 输入联系人名字

    printf("请输入联系人的名字 :(注意请不要输入空格 )\n");

    //2.接收联系人名字

    char name[NAME_LEN];

    scanf("%s",name);

    //3.提示 输入联系人号码

    printf("请输入联系人号码:(注意请不要输入空格)\n");

    //4.接收联系人号码

    char num[NUM_LEN];

    scanf("%s",num);

    

    //5.确定添加吗

    printf("确定添加吗? 1(确定) , 0(取消) : ");

    //6.接受用户的选择

    int user = 0;

    scanf("%d",&user);

    //7.根据用户的选择做出添加操作

    if (user) {

        //7.1 添加到内存中的联系人数组中

        strcpy(peoples[current].name, name);

        strcpy(peoples[current].num, num);

        //7.2 current 进行自增1

        current++;

        //7.3 将联系人信息写入到文件

        //调用 写入文件操作

        writToFile();

    }

    

    

    

    

    

    

    printf("添加联系人完毕 !\n");

}

 

//删除联系人

//思路: 让用户输入序号 来确定要删除那个联系人      删除数组中这个指定联系人的信息   同时 更新文件

//1.展示联系人列表

//2.提示用户输入序号

//3.接收这个序号

//4.简单容错

//5.提示用户是否确定删除

//6.接收用户的选择

//7.根据用户的选择执行   删除数组元素的操作

//8.更新文件

void delP(){

    //1.展示联系人列表

    showP();

    

    //2.提示用户输入序号

    printf("请输入要删除的联系人的序号 : \n");

    //3.接收这个序号

    int ser = -1;

    scanf("%d",&ser);

    

    //4.简单容错

    if (ser <0 || ser >= current) {

        printf("没有该序号 功能执行完毕 \n");

        return;

    }

    //5.提示用户是否确定删除

    printf("是否确定删除  1(确定) 0(取消)\n");

    //6.接收用户的选择

    int flag = 0;

    scanf("%d",&flag);

    

    if (flag == 1) {

        //7.根据用户的选择执行   删除数组元素的操作

        //7.1 假如用户输入的是 最后一个元素的时候 此时删除数组最后一个元素  数组长度--

        //        if (ser == current-1) {

        //            current--;

        //        }else{

        //             //7.2 如果删除的不是最后一个元素的时候  移动后续的元素   数组长度--

        //            for (int i = ser; i< current; i++) {

        //                peoples[i] = peoples[i+1];

        //            }

        //            current--;

        //

        //        }

        //

        

        if (ser < current) {

            for (int i = ser; i< current-1; i++) {

                peoples[i] = peoples[i+1];

            }

            

        }

        

        current--;

        

        //8.更新文件

        writToFile();

    }

    

    

    

    

    printf("删除联系人完毕 !\n");

}

 

//修改联系人

//思路 : 让用户输入新联系人信息    拿着这个新联系人信息 根据用户输入的 序号 去修改 联系人数组中指定的位置  并更新文件

void updP(){

    //1.展示联系人列表

    showP();

    //2.请输入要修改的联系人的 序号

    printf("请输入联系人的序号 ");

    //3.接收这个序号

    int serial = -1;

    scanf("%d",&serial);

    //简单容错

    if (serial <0 || serial>=current) {

        printf("无此人 \n");

        return;

    }

    //4.提示用户输入新的名字

    printf("请输入联系人的新名字:(请不要带空格)\n");

    

    //5.接收这个新的名字

    char name[NAME_LEN];

    scanf("%s",name);

    

    //6.提示用户输入新的电话号

    printf("请输入联系人的新号码:(请不要输入空格)\n");

    

    //7.接收新的电话号

    char num[NUM_LEN];

    scanf("%s",num);

    

    //是否确认修改

    printf("确定修改吗 ? 1(确定)  0(取消) \n");

    int flag = 0 ;

    scanf("%d",&flag);

    

    if (flag ==1 ) {

        //8.根据用户输入的序号找到数组的指定位置 进行修改

        strcpy(peoples[serial].name, name);

        strcpy(peoples[serial].num, num);

        //9.更新文件

        writToFile();

        

    }

    printf("修改联系人完毕 !\n");

    showP();

    

}

 

//展示联系人

//1.提示执行展示联系人操作

//2.打印表头

//3.遍历联系人列表 ---> 结构体数组

void showP(){

    

    //1.提示执行展示联系人操作

    printf("执行展示联系人操作\n");

    //2.打印表头

    printf("序号\t\t\t\t姓名\t\t\t\t号码\t\t\t\t\t\n");

    //3.遍历联系人列表 ---> 结构体数组

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

        printf("%d\t\t\t\t%s\t\t\t\t%s\n",i,peoples[i].name,peoples[i].num);

    }

    printf("展示联系人完毕 !\n");

}

 

//搜索联系人

//让用户输入联系人的名字   拿着这个名字遍历 联系人数组 一旦找到跟名字一样的 打印联系人的号码. 如果没有找到说没有改联系人

//1.给用户提示 输入联系人的名字

//2.接收用户输入的名字

//3.遍历结构体数组 查找是否有该名字 如果有 打印联系人的号码

//4.如果没有 给一个提示

 

void searchP(){

    //1.给用户提示 输入联系人的名字

    printf("请输入联系人的名字:(名字请不到带空格 )\n");

    

    //2.接收用户输入的名字

    char name[NAME_LEN];

    scanf("%s",name);

    

    //3.遍历结构体数组 查找是否有该名字 如果有 打印联系人的号码

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

        //判断用户输入的名字 与我们联系人的名字是否一样

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

            printf("%s的 电话号码是 %s \n",name,peoples[i].num);

            return;

        }

    }

    

    printf("没有找到 \n");

    

    

    //4.如果没有 给一个提示

    

    

    printf("搜索联系人完毕 !\n");

}

 

//展示功能列表

void showTitle(){

    

    

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

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

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

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

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

    printf("****** 4、展示所有联系人 ****\n");

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

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

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

    

}

 

//写入文件操作的实现

 

void writToFile(){

    //1.引入头文件

    //2.定义文件指针  并 打开文件

    FILE *fp = fopen(MYFILENAME, "w+");

    if (fp != NULL) {

        //3.操作文件

        //把数组中所有的数据都写入到文件中保持文件的完整性 .

        

        fwrite(&current, sizeof(int), 1, fp);

        

        

        //遍历

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

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

        }

        

        

        

    }else{

        printf("文件打开失败 \n");

    }

    

    //4.关闭文件

    fclose(fp);

    printf("写入文件  \n");

}

 

 

 

我的github:https://github.com/Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C