黑马程序员——C基础---简易通讯录的实现

本文介绍了使用C语言实现简易通讯录的过程,作者在复习时发现文件操作比预期复杂,认识到基础的重要性,表达了继续努力的决心。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

复习的时候本以为文件操作这块很简单,没想到写起来比想象中的难,基础尚不牢固,还需努力

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

//通讯录界面
void face();
//写入文件
void writeToFile();
//添加联系人
void addContact();
//查看联系人
void checkContact();
//搜索联系人
void searchContact();
//修改联系人
void changeContact();
//删除联系人
void deleteContact();

//联系人结构体
typedef struct {
    char name[21];
    char telNum[21];
}LXR;

//通讯录临时存储表(上限100个)
LXR List[100];
//通讯录联系人个数
int contactCount=0;

//文件保存地址
char *path = "/Users/Zxx/Desktop/test/List.data";
int main(int argc, const char * argv[]) {
    
    int cho = 0;
    
    while (1) {
        face();
        scanf("%d",&cho);
        if (cho>6||cho<1) {
            printf("选择有误请重新选择\n");
        }else
            switch (cho) {
                
                case 1:
                    addContact();
                    break;
                    
                case 2:
                    deleteContact();
                    break;
                    
                case 3:
                    changeContact();
                    break;
                    
                case 4:
                    checkContact();
                    break;
                    
                case 5:
                    searchContact();
                    break;
                    
                case 6:
                    return 0;
                    break;
                    
                default:
                    break;
            }
    }
    return 0;
}

/**
 *  绘制界面
 */
void face(){

    printf("***************************\n");
    printf("       欢迎使用通讯录        \n");
    printf("       1、添加联系人         \n");
    printf("       2、删除联系人         \n");
    printf("       3、修改联系人         \n");
    printf("       4、查看所有联系人      \n");
    printf("       5、搜索联系人         \n");
    printf("       6、退出通讯录         \n");
    printf("***************************\n");
    
}

/**
 *  写入通讯录
 */
void writeToFile(){
    
    FILE *fp = fopen(path, "wb");
    //如果打开成功则先将联系人个数写入文件头部,在将所有练习人写入文件
    if (fp!=NULL) {
        fwrite(&contactCount, sizeof(contactCount), 1, fp);
        for (int i=0; i<contactCount; i++) {
            fwrite(&List[i], sizeof(LXR), 1, fp);
        }
    }else{
        printf("文件打开失败,按任意键退出\n");
        getchar();
        return;
    }
    fclose(fp);
}

/**
 *  添加联系人
 */
void addContact(){
    
    printf("您选择添加联系人,请输入姓名\n");
    scanf("%s",List[contactCount].name);
    printf("请输入号码\n");
    scanf("%s",List[contactCount].telNum);
    //添加联系人,则通讯录联系人个数+1
    contactCount++;
    writeToFile();
    printf("联系人添加成功\n");
}

/**
 *  查看联系人
 */
void checkContact(){
    
    FILE *check = fopen(path, "r");
    printf("编号\t姓名\t号码\n");
    if (check==NULL) {
        printf("通讯录为空,请先添加联系人\n");
    }else{
        //如果通讯录不为空,则先读取联系人个数,再逐个读取联系人并输出
        fread(&contactCount, sizeof(contactCount), 1, check);
        for (int i=1;i<=contactCount;i++) {
            LXR temp;
            fread(&temp, sizeof(LXR), 1, check);
            printf("%d\t%s\t%s\n",i,temp.name,temp.telNum);
        }
    }
    fclose(check);
}

/**
 *  搜索联系人
 */
void searchContact(){

    printf("请输入你要搜索的联系人姓名或者号码\n");
    char ch[21];
    scanf("%s",ch);
    int flag=1;
    FILE *check = fopen(path, "r");
    //读取通讯录联系人个数
    fread(&contactCount, sizeof(contactCount), 1, check);
    if (check!=NULL) {
        //循环遍历通讯录
        for (int i=0;i<contactCount;i++) {
            LXR temp;
            fread(&temp, sizeof(LXR), 1, check);
            //将接收的字符串与每个联系人的姓名和电话号码分别比较,若有一个符合,则输出该联系人信息
            if(!strcmp(ch, temp.name)||!strcmp(ch, temp.telNum)){
                printf("已找到你要查找的人\n姓名\t号码\n%s\t%s\n",temp.name,temp.telNum);
                flag = 0;
            }
        }
    }else
        printf("你的通讯录为空,请先添加联系人\n");
    fclose(check);
    if (flag) {
        printf("您的通讯录里没有此人\n");
    }
}

/**
 *  修改联系人
 */
void changeContact(){

    checkContact();
    FILE *change = fopen(path, "rb+");
    
    if (change!=NULL) {
        
        fread(&contactCount, sizeof(contactCount), 1, change);
        printf("请选择你要修改的联系人\n");
        int a,flag=0;
        LXR temp;
        scanf("%d",&a);
        
        if (a<1||a>contactCount) {
            printf("选择有误,请从新选择\n");
        }else{
            printf("请输入姓名\n");
            scanf("%s",temp.name);
            printf("请输入电话号码\n");
            scanf("%s",temp.telNum);
            //读取所有联系人的信息
            for (int i=0;i<=contactCount;i++) {
                fread(&List[i], sizeof(LXR), 1, change);
            }
            printf("你要用\n%s\t%s\n覆盖\n%s\t%s\n1.确认 .2取消\n",temp.name,temp.telNum,List[a-1].name,List[a-1].telNum);
            scanf("%d",&flag);
            if (flag==1) {
                //将新信息覆盖到旧的信息上
                List[a-1] = temp;
                writeToFile();
            }
        }
    }
    fclose(change);
}

/**
 *  删除联系人
 */
void deleteContact(){

    checkContact();
    printf("请选择你要删除的联系人\n");
    int a,flag = 2;
    scanf("%d",&a);
    
    FILE *delete = fopen(path, "rb+");
    if (delete!=NULL) {
        fread(&contactCount, sizeof(contactCount), 1, delete);
        for (int i=0;i<=contactCount;i++) {
            fread(&List[i], sizeof(LXR), 1, delete);
        }
        printf("你要删除的是\n%s\t%s\n是否确认删除?\n1.删除\t2.取消\n",List[a-1].name,List[a-1].telNum);
        scanf("%d",&flag);
        if (flag == 1) {
            //将要删除的联系人后面的所有联系人整体前移一位,然后联系人总数减一
            for (int j=a; j<contactCount; j++) {
                List[j-1]=List[j];
            }
            contactCount--;
            writeToFile();
        }
    }
    fclose(delete);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值