• 问题总会出现,不过解决问题的方法也会出现!!!

代码练习-54-通讯录

代码练习 小雨 608次浏览 已收录 0个评论

—— ——-



//
//  main.c
//  <a href="http://vqboy.com/tag/c" title="查看更多关于C语言的文章" target="_blank">C语言</a>-通讯录

#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];//能够存储100个联系人
//定义联系人的个数
int totalContactCount=0;
//接收用户输入的编号
int fno;
//定义数据文件保存的位置
char *filePath = "telBook.data";




//************** 函数的声明部分 *********************
//判断编号是否合法
int validataInput(int num,int min,int max);

void doAdd();
void doDelete();
void doUpdate();
void doList();
void doSearchByName();
//初始化
void init();
//写文件
void writeFile();





//************** 主函数部分 *********************
int main(int argc, const char * argv[]) {
    /**
     1、引入头文件
     2、进行必要的宏定义
     3、定义文件名称变量、联系人数组、联系人结构体
     4、定义函数,并进行函数声明
     5、编写循环控制程序
     6、显示操作界面
     7、根据编号执行不同的函数

     */

    init();
    printf("通讯录初始化完成...n");

    while(1){
        printf("n");
        //软件的界面显示出来
        printf("***********************************n");
        printf("********* 欢迎使用通讯录  ***********n");
        printf("********* 1、添加联系人  ************n");
        printf("********* 2、删除联系人  ************n");
        printf("********* 3、修改联系人  ************n");
        printf("********* 4、查看所有联系人  *********n");
        printf("********* 5、搜索联系人  ************n");
        printf("********* 6、退出系统  **************n");
        printf("***********************************nn");

        //提示用户选择一个序号
        printf("请选择1-6之间的功能编号:n");
        scanf("%d",&fno);
        //判断编号是否合法
        validataInput(fno, 1, 6);

        switch (fno) {
            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");
                return 0;
                break;

            default:
                break;
        }



    }

    return 0;
}


/**
 *  验证输入是否合法
 *
 *  @param num 输入的编号
 *  @param min 编号最小值
 *  @param max 编号最大值
 *
 *  @return 1 输入非法;0 输入合法
 */
int validataInput(int num,int min,int max){

    if (num < min || num > max) {
        printf("您输入的是非法编号!n");
        return 1;
    }
    return 0;

}

/**
 *  增加联系人
 */
void doAdd(){
    printf("您选择的是增加联系人,请按提示操作:n");
    //1、提示用户输入联系人姓名
    printf("请输入联系人姓名:(*注意联系人姓名中间不能有空格)n");
    //2、接收联系人
    scanf("%s",contacts[totalContactCount].name);

    //3、提示用户输入电话号码
    printf("请输入联系人电话号码:(*注意号码中间不能有空格)n");
    //4、接收电话号码
    scanf("%s",contacts[totalContactCount].telNum);
    //5、确认添加
    int flag;
    printf("您确认要添加数据吗?1、确定 2、取消n");
    scanf("%d",&flag);
    if (flag==1) {
        //6、联系人的个数+1
        totalContactCount++;
        //7、把联系人信息写入到文件中
        writeFile();
    }else{
        printf("您取消了本次添加!n");
    }

}

/**
 *  删除联系人
 */
void doDelete(){
    printf("您选择的是删除联系人,请按提示操作:n");
    doList();
    //1、提示用户输入一个联系人编号
    printf("请输入您想要删除的联系人的编号:n");
    int no;
    scanf("%d",&no);
    //2、判断编号是否合法 编号不能大于联系人个数
    if (validataInput(no, 1, totalContactCount)) {
        return ;
    }else{
        //3、提示用户再次确认删除
        printf("请问您是否确认要删除编号为:%d的联系人? 1.确认 2.取消n",no);
        int flag;
        scanf("%d",&flag);
        if (flag==1) {
            //4、开始删除数组元素
            //  1)删除的元素正好是数组的最后一个元素
            //      只需要让联系人个数-1
            if (no==totalContactCount) {
                totalContactCount--;
            }else{
                //  2)如果删除的元素不是数组的最后一个元素
                //      需要移动元素
                for (int i=no-1; i<totalContactCount-1; i++) {
                    contacts[i]=contacts[i+1];
                }
                //      联系人个数-1
                totalContactCount--;
            }
            //5、同步将数据更新到文件中
            writeFile();
        }
    }

}

/**
 *  修改联系人
 */
void doUpdate(){
    printf("您选择的是修改联系人,请按提示操作:n");
    doList();
    //1.请输入您想要修改的编号
    printf("请输入您想要修改的编号n");
    int no;
    scanf("%d",&no);
    //2.判断用户输入编号的合法性
    if (validataInput(no, 1, totalContactCount)) {
        return;
    }
    //3.如果合法请用户输入新的数据
    char nameNew[NAMELEN];
    char telNumNew[NUMLEN];
    printf("请输入新联系人姓名:(*注意联系人姓名中间不能有空格)n");
    scanf("%s",nameNew);
    printf("请输入新联系人号码:(*注意号码中间不能有空格)n");
    scanf("%s",telNumNew);
    //4.确认用户是否修改数据
    printf("请问您是否确认要修改编号为:%d的联系人? 1.确认 2.取消n",no);
    int flag;
    scanf("%d",&flag);
    if (flag==1) {
        strcpy(contacts[no-1].name, nameNew);
        strcpy(contacts[no-1].telNum, telNumNew);
    //5.将数据同步文件
        writeFile();
    }else{
    //6.取消修改
        printf("您没有修改联系人!n");
    }


}

/**
 *  查看所有联系人
    思路:
    前提:系统已经完成了初始化工作(如果文件存在则读取文件中的所有的数据)
    1、首先做一个判断
        totalContactCount==0 //表示没有联系人
    2、如果不等于0
        开始遍历,并且输出联系人的信息
 */
void doList(){
    printf("显示所有联系人,请按提示操作:n");
    if (totalContactCount==0) {
        printf("对不起,您的通讯录还没有小伙伴!快来添加你的小伙伴吧。。n");
    }else{
        //打印输出格式
        printf("编号t 名字 t 号码n");
        //遍历联系人数组
        for (int i=0; i<totalContactCount; i++) {
            printf("%dt %st %sn",i+1,contacts[i].name,contacts[i].telNum);
        }

    }
}

/**
 *  查找联系人
 */
void doSearchByName(){
    printf("您选择的是查找联系人,请按提示操作:n");

    //1.请求用户输入要查询的联系人名字
    printf("请输入您所要查找的联系人姓名:(*注意联系人姓名中间不能有空格)n");
    char nameTarger[NAMELEN];
    scanf("%s",nameTarger);
    //2.查找用户输入的联系人名字(遍历)
    int i;
    for (i=0; i<totalContactCount; i++) {
         //3.找到联系人,就输出联系人对应的号码
        if (strcmp(nameTarger, contacts[i].name)==0) {
            printf("您所查找的联系人:%s 的号码是:%sn",nameTarger,contacts[i].telNum);
            break;//跳出循环,重名的情况不照顾
        }

    }
    //4.没有找到联系人,提示查无此人
    if (i==totalContactCount) {
        printf("对不起,查无此人!n");
    }


}

/**
 通讯录的初始化工作
 1、尝试读取数据文件
 2、如果读取成功,说明文件存在
    如果存在要读取联系人数据,保存到联系人数组contacts
 3、如果读取失败,说明我们是第一次使用通讯录
    如果是第一次使用
    (1)创建联系人数据文件
    (2)把当前联系人的个数写入到文件中 totalContactCount=0
 */
void init(){
    //定义文件指针,并且打开文件
    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, "wb");
        //写入联系人的个数
        fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
        printf("通讯录文件创建成功n");
    }
    //关闭文件指针
    fclose(fp);
}

/**
 *  写文件
 */
void writeFile(){
    //1.声明文件指针变量并打开文件
    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("数据更新成功!n");
    }

    //关闭文件
    fclose(fp);

}

本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址