黑马程序员-C语言下的通讯录

———–android培训、java培训、java学习型技术博客、期待与您交流!————

一:系统需求


欢迎来到通讯录
* 1.增加联系人
* 2.删除联系人
* 3.修改联系人
* 4.查看联系人
* 5.搜索联系人
* 6.退出通讯录


显示界面如上所示,联系人的字段包括姓名,电话号码。

二:技术分析
可能用到的技术有:
1.宏定义
2.结构体
3.文件读写
要注意的地方:
1.函数声明
2.界面搭建
3.按编号执行函数

三:实现

//头文件
#include <stdio.h>
#include <string.h>
//宏定义
#define N 100  //通讯录容量
#define NAMELEN 22 //姓名
#define NUMLEN 12  //电话号码长度
//定义联系人数组,联系人结构体
typedef struct{
      char name[NAMELEN];
      char telNum[NUMLEN];
}Person;

//联系人数组
Person contacts[N];   //

//联系人的个数
int totalContactCount=0;
//接受用户输入的编号
int fno;
//定义数据文件保存的位置
char *filePath = "telbook.data";


//函数声明
int validateInput(int num,int min,int max);
void doAdd();
void doDelete{};
void doUpdate();
void doList();
void doSearchByName();

void writeFile()



int main(){
      init();
      printf("初始化完成");

      while(1){
        printf("1增\n");
        printf("2删\n");
        printf("3改\n");
        printf("4查\n");
        printf("5搜\n");
        printf("6退\n");

        prinrf("请选择功能");
        scanf{"%d",&fno};

        //判断编号是否合法
        int validateInput(fno,0,6);

        switch (fno){
            case 1:doAdd();break;
            case 2:doDelete();break;
            case 3:doUpdate();break;
            case 4:doList();break;
            case 5:doSearch();break;
            case 6:return 0;break;
            default :
                    break;            
        }
    }

return 0;
}

//验证是否合法,1非法,0正常
int validateInput(int num,int min,int max){
        if(num<min || num>max){
        printf("非法");
        return 1;
    }

    return 0;
}

/**
增加联系人
1.提示用户输入姓名和电话
2.接受用户输入的内容
3.保存到联系人数据
4.写入到文件中
*/
void doAdd(){
        printf("增加联系人,请安提示操作");
       //提示,接受,确认,联系人个数加1,写入文件
       printf("输入联系人姓名:(*注意姓名中间不能有空格)");
       scanf("%s",contacs[totalContactCount].name);

        printf("电话号码");
        scanf("%s",contacts[].tel);

        int flag;
        printf("1.去人2 。取消");
        scanf("%d",&flag);
        if(flag){
            totalContactCount ++;
        //写入到文件中
        writeFile();
        }

}

/**
删除联系人
1.提示用户输入一个联系人编号
2.判断编号是否合法 编号不能大雨联系人个数
3.提示用户在确认删除
4.开始删除联系人
    1.删除的元素正好是数组的最后一个元素
    只需要让联系人个数-1
    2.如果删除的元素不是数组的最后一个元素
    需要移动元素,联系人数量-1
5.同步更新到文件中

*/
void doDelete{}{
        int no;
        printf("请输入联系人编号:\n");
        scanf("%d",&no);
        if(validateInput(no,1,totalContactCount)){
            return ;
        }
        int flag;
        printf("删除联系人后,数据无法恢复,确认删除吗?")
        scanf("%d",&flag);

        if(flag){
            if(no == totalContactCount){
                    totalContactCount--;
            }else{

                for(int i=no;i<totalContactCount;i++){
                        contacts[i-1]=contacts[i];
                }
                totalContactCount--;
        }
         writeFile();
        }
}


/**
修改联系人
思路:
1.提示用户输入编号
2.验证编号是否合法
3.提示用户输入姓名和电话
4.提示用户确认修改
5.写入文件
*/
void doUpdate(){
        int no;
        printf("请输入编号");
        scanf("%d",&no);
       if( validateInput(no,1,totalContactCount)){
        return;
        }else{
            char name1[NAMELEN];
            char tel[NUMLEN];
            printf("姓名");
            scanf("%s",contacts[no-1].name);//错误,  常量赋值?
            scanf("%s",name1);
            printf("电话");
            scanf("%s",tel);
            strcpy(contacts[no-1].name,name1);
             strcpy(contacts[no-1].telNum,tel);

        }
        writeFile();

}


/**
思路:系统已经完成初始化工作,如果文件存在则读取文件中的数据
        1.判断 totalContactCount ==0;//没有联系人
        2. 如果不等于0
        开始遍历,输出联系人信息
*/
void doList(){
        if(totalContactCount ==0){
           printf("通讯录还没小伙伴,请添加联系人");
        }else{
        //输出格式
        printf("编号\t 姓名\t 电话\t \n")
            for(int i=0; i<totalContactCount;i++){
                printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
            }
        }
}

/**
搜索联系人
1.提示输入联系人姓名
2.遍历contacts[i].name,比较
     查找到相同,输出
      没有查找到,提示
*/
void doSearchByName(){
        char name[NAMELEN];
        printf("姓名");
        scanf("%s",name);
        for(int i = 0; i<totalContactCount;i++){
                if(strcmp(contacts[i].name,name)==0){
                         printf("%s\t %s\t",contacts[i].name,contacts.telNum);
                           ruturn;
                }

        }
        printf("查找不到");

}

//初始化函数
/**1.尝试读取数据文件
   2.如果读取成功,说明文件存在
       如果存在,读取联系人数据,保存数组contacts
   3.如果读取失败, 说明第一次用通讯录
     创建联系人文件
     把当前联系人的个数写入到文件中 totalContactCount =0;
*/
void init(){
        //定义文件指针,并打开文件
        FILE *fp = fopen(filePath, "r");

        if(fp!=NULL){
            //1 读取联系人个数
                fread(&totalContactCount, sizeof(totalContactCount),1,fp);
            //2 读取每一个联系人
            for(int i=0; i<totalContactCount; i++){
                fread(&contacts[i], sizeof(Person), 1, fp);
            }

        }else{
        //创建文件
        fp = fopen(filePath,"wb");
            fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);
        printf("创建成功\n")
        //写入联系人个数

        }
        //关闭指针文件个
        fclose(fp);

}

/**
些数据到文件中
1.以wb方式打开、
2.先写联系人个数
3.些每个联系人数据
4.关闭文件
*/
void writeFile(){
        FILE *fp=fopen(filePath, "wb");
        if(fp!= NULL){
            fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
        }

        for(int i = 0; i<totalContactCount;i++){
                fwrite(&contacts[i],sizeof(Person),1,fp);
        }

        printf("写文件数据更新成功!")
        fclose(fp);
}

四:结果截图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值