简单通讯录

简单通讯录

1.  问题提出

编写一个简单的通讯录管理程序。

2.  功能要求

实现通讯录的显示、增、删、改、查功能。

通讯录要保存在文件中,每次启动程序都从文件中读取当前的所有记录,每次退出程序时都更新通讯录。

通讯录中至少含有以下字段:姓名、电话号码、地址(嵌套结构)、邮政编码、email。

3.  知识点及参考资料

知识点:文件、循环、数组、嵌套结构体、链表(选用)、函数等。

参考资料:C语言程序设计(第二版)(教材)。

4.完整代码:

#include
#include
#include 

// 函数声明
void Shu_Ru();            // 信息录入
void Shou();              // 显示主菜单
void xingmingchaxun();    // 按姓名查询
void dianhuachaxun();     // 按电话查询
void chaxunyemian();      // 信息查询页面
void HeadShow();          // 显示表头
void AllShow();           // 显示所有信息
void xiugai();            // 信息修改
void Dle();               // 信息删除
void xinxixiugai();       // 信息修改或删除操作页面
void weiye();             // 尾页显示

// 定义结构体person,用于存储个人信息
struct person {
    char name[8];     // 名字
    char phone[11];   // 电话
    char addr[100];   // 地址
    char yzbm[10];    // 邮政编码 
    char email[30];   // EMAIL
} pe[100] = {0};      // 初始化结构体数组pe

// 信息录入函数
void Shu_Ru() {
    int c = 0;  // 记录输入的联系人数量
    char r;     // 用于控制是否继续输入
    int i = 0;  
    
    FILE *fp = NULL;
    fp = fopen("d:\\jiandan.txt", "a");  // 以追加模式打开文件
    if (fp == NULL) {
        printf("文件打开失败!\n");
        return;
    }
    
    while (1) {
        // 输入联系人信息
        printf("请输入名字:"); scanf("%s", pe[c].name);
        printf("电话:"); scanf("%s", pe[c].phone);
        printf("地址:"); scanf("%s", pe[c].addr);
        printf("邮政编码:"); scanf("%s", pe[c].yzbm);
        printf("EMAIL:"); scanf("%s", pe[c].email);
        
        // 显示输入的信息
        printf("%s\t%s\t%s\t%s\t%s\n", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
        c++;
        getchar();  // 吸收换行符

        // 判断是否继续输入
        for (;;) {
            printf("按1继续输入,按0结束\n");
            scanf("%c", &r);
            getchar();  // 吸收换行符
            if (r == '1' || r == '0') break;
            printf("输入错误!%c不是1和0,请重新输入......\n", r);
        } 
        
        if (r == '0') break;  // 如果选择结束,退出循环
        
        system("cls");  // 清屏
    }
    
    // 将录入的信息写入文件
    for (i = 0; i < c; i++) {
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
    }
    fclose(fp);  // 关闭文件
}

// 显示主菜单
void Shou() {
    printf("#################          通讯录管理系统  v1.0   ###################\n");
    printf("#####################################################################\n");
    printf("#                                                                   #\n");
    printf("#           1-----------------信息录入-------------------           #\n");
    printf("#                                                                   #\n");
    printf("#           2-----------------信息查询-------------------           #\n");
    printf("#                                                                   #\n");
    printf("#           3-----------------信息查看-------------------           #\n");
    printf("#                                                                   #\n");
    printf("#           4-----------------信息修改-------------------           #\n");
    printf("#                                                                   #\n");
    printf("#           5-----------------退出系统-------------------           #\n");
    printf("#                                                                   #\n");
    printf("#####################################################################\n");
    printf("#####################################################################\n");
}

// 按姓名查询
void Xingmingchaxun() {    
    system("cls");  // 清屏
    char name0[8];  // 存储待查询的姓名
    int i;
    int c = 0;
    
    FILE *fp = NULL;
    fp = fopen("d:\\jiandan.txt", "r");  // 以只读模式打开文件
    if (fp == NULL) {
        printf("文件打开失败!");
        return; 
    }
    
    // 从文件中读取数据到结构体数组
    while (feof(fp) == 0) {
        fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
        c++;
    }
    fclose(fp);  // 关闭文件
    
    // 输入要查询的姓名
    printf("请输入要查询的姓名:");
    scanf("%s", name0);
    
    // 遍历结构体数组,查找匹配的姓名
    for (i = 0; i < c; i++) {
        if (strcmp(name0, pe[i].name) == 0) {
            HeadShow();  // 显示表头
            printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
            printf("-----------------------------------------------------------------------------\n");
            printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
            printf("请按任意键继续......\n");
            getchar();
            break;  // 找到后立即退出,提升效率
        }
    }
    
    if (i == c) printf ("查无此人\n");  // 当没有找到时输出提示
}

// 按电话查询
void Dianhuachaxun() {
    system("cls");  // 清屏
    char phone0[11];  // 存储待查询的电话
    int i;
    int c = 0;
    
    FILE *fp = NULL;
    fp = fopen("d:\\jiandan.txt", "r");  // 以只读模式打开文件
    while (feof(fp) == 0) {
        fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
        c++;
    }
    fclose(fp);  // 关闭文件
    
    // 输入要查询的电话
    printf("请输入要查询的电话:");
    scanf("%s", phone0);
    
    // 遍历结构体数组,查找匹配的电话
    for (i = 0; i < c; i++) {
        if (strcmp(phone0, pe[i].phone) == 0) {
            HeadShow();  // 显示表头
            printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
            printf("-----------------------------------------------------------------------------\n");
            printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
            printf("请按任意键继续......\n");
            getchar();
            break;  // 找到后立即退出
        }
    }
    if (i == c) printf ("查无此人\n");  // 当没有找到时输出提示
}

// 信息查询页面
void chaxunyemian() {
    system("cls");  // 清屏
    char Check_key;
    printf("###################       通讯录管理系统  v1.0   ####################\n");
    printf("#####################################################################\n");
    printf("#                                                                   #\n");
    printf("#                      1------按姓名查询                            #\n");
    printf("#                                                                   #\n");
    printf("#                      2------按电话号码查询                        #\n");
    printf("#                                                                   #\n");
    printf("#                      3------退出查询模块                          #\n");
    printf("#                                                                   #\n");
    printf("#####################################################################\n");
    printf("#####################################################################\n");

    // 输入操作序号
    printf("请输入操作序号:");
    scanf("%c", &Check_key);
    getchar();

    // 根据用户输入进行相应操作
    switch (Check_key) {
        case '1':
            Xingmingchaxun();
            getchar();
            break;
        case '2':
            Dianhuachaxun();
            getchar();
            break;
        case '3':
            printf("按任意键退出......\n");
            getchar();
            return;
        default:
            printf("输入错误!按任意键继续......\n");	
            getchar();
    }
}

// 显示表头
void HeadShow() {
    printf("#################          通讯录管理系统  v1.0   ###################\n");
    printf("---------------------------------------------------------------------\n");
}

// 显示所有信息
void AllShow() {
    system("cls");  // 清屏
    int i;  // 条件变量,循环变量
    char r = '1';
    int c = 0;
    
    FILE *fp = NULL;
    fp = fopen("d:\\jiandan.txt", "r");  // 以只读模式打开文件
    if (fp == NULL) {
        printf("文件打开失败!");
        return; 
    }
    
    while (feof(fp) == 0) {
        fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
        c++;
    }
    fclose(fp);  // 关闭文件
    
    // 显示表头
    HeadShow();
    printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
    printf("-----------------------------------------------------------------------------\n");
    
    // 显示所有联系人信息
    for (i = 0; i < c - 1; i++) {
        printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
    }
    printf("请按任意键继续......\n");
    getchar();
}

// 信息修改函数
void Xiugai() {
    FILE *fp;
    system("cls");  // 清屏
    int i = 0;
    int c = 0;
    char name0[8];
    char phone0[11];
    int x;
    
    fp = fopen("d:\\jiandan.txt", "r+");  // 以读写模式打开文件
    if (fp == NULL) {
        printf("文件打开失败!");
        return;
    }
    
    while (feof(fp) == 0) {
        fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
        c++;
    }
    
    fclose(fp);  // 关闭文件
    
    printf("请输入要修改的记录名字:");
    scanf("%s", name0);
    
    // 查找匹配的联系人信息
    for (i = 0; i < c; i++) {
        if (strcmp(name0, pe[i].name) == 0) {
            printf("该名字的记录如下:\n");
            printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
            printf("-----------------------------------------------------------------------------\n");
            printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
            printf("要修改请输入1,按任意键退出\n");
            scanf("%d", &x);
            if (x == 1) {
                printf("请输入姓名:"); scanf("%s", pe[i].name);
                printf("电话:"); scanf("%s", pe[i].phone);
                printf("地址:"); scanf("%s", pe[i].addr);
                printf("邮政编码:"); scanf("%s", pe[i].yzbm);
                printf("EMAIL:"); scanf("%s", pe[i].email);
            } else break;
        }
    }
    
    // 重新写入文件
    fp = fopen("d:\\jiandan.txt", "w");
    if (fp == NULL) {
        printf("文件打开失败!");
        return;
    }
    
    for (i = 0; i < c - 1; i++) {
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
    }
    fclose(fp);  // 关闭文件
    
    printf("请按任意键继续......\n");
    getchar();
    getchar();
}

// 信息删除函数
void Dle() {
    FILE *fp;
    system("cls");  // 清屏
    int i = 0;
    int c = 0;
    char name0[8];
    char phone0[11];
    int x;
    
    fp = fopen("d:\\jiandan.txt", "r+");  // 以读写模式打开文件
    if (fp == NULL) {
        printf("文件打开失败!");
        return;
    }
    
    while (feof(fp) == 0) {
        fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
        c++;
    }
    
    fclose(fp);  // 关闭文件
    
    printf("请输入要删除的记录名字:");
    scanf("%s", name0);
    
    // 查找匹配的联系人信息
    for (i = 0; i < c; i++) {
        if (strcmp(name0, pe[i].name) == 0) {
            printf("该名字的记录如下:\n");
            printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
            printf("-----------------------------------------------------------------------------\n");
            printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
            printf("要删除请输入1,按任意键退出\n");
            scanf("%d", &x);
            if (x == 1) {
                for (; i < c - 1; i++) {
                    pe[i] = pe[i + 1];  // 将后面的记录前移
                }
                c--;
            } else break;
        }
    }
    
    // 重新写入文件
    fp = fopen("d:\\jiandan.txt", "w");
    if (fp == NULL) {
        printf("文件打开失败!");
        return;
    }
    
    for (i = 0; i < c - 1; i++) {
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
    }
    fclose(fp);  // 关闭文件
    
    printf("请按任意键继续......\n");
    getchar();
    getchar();
}

// 信息修改或删除操作页面
void Xinxixiugai() {
    system("cls");  // 清屏
    char Check_key;
    printf("###################       通讯录管理系统  v1.0   ####################\n");
    printf("#####################################################################\n");
    printf("#                                                                   #\n");
    printf("#                      1------信息修改                              #\n");
    printf("#                                                                   #\n");
    printf("#                      2------信息删除                              #\n");
    printf("#                                                                   #\n");
    printf("#                      3------退出修改模块                          #\n");
    printf("#                                                                   #\n");
    printf("#####################################################################\n");
    printf("#####################################################################\n");

    // 输入操作序号
    printf("请输入操作序号:");
    scanf("%c", &Check_key);
    getchar();

    // 根据用户输入进行相应操作
    switch (Check_key) {
        case '1':
            Xiugai();
            getchar();
            break;
        case '2':
            Dle();
            getchar();
            break;
        case '3':
            printf("按任意键退出......\n");
            getchar();
            return;
        default:
            printf("输入错误!按任意键继续......\n");	
            getchar();
    }
}

// 尾页显示函数
void Weiye() {
    system("cls");  // 清屏
    printf("#####################################################################\n");
    printf("#                                                                   #\n");
    printf("#                      欢迎下次使用本系统,再见!                   #\n");
    printf("#                                                                   #\n");
    printf("#####################################################################\n");
    getchar();
}

// 主函数
int main() {
    system("color f1");  // 设置系统颜色
    char key;
    
    while (1) {
        system("cls");  // 清屏
        Shou();  // 显示主菜单
        printf("请选择对应的操作:");
        scanf("%c", &key);  // 获取用户输入的操作序号
        getchar();
        switch (key) {
            case '1':
                Shu_Ru();
                break;
            case '2':
                chaxunyemian();
                break;
            case '3':
                AllShow();
                break;
            case '4':
                Xinxixiugai();
                break;
            case '5':
                Weiye();
                return 0;
            default:
                printf("输入错误!请按任意键继续......\n");
                getchar();
        }
    }
    return 0;
}

 

 

你可能感兴趣的:(c语言,项目,简单通讯录,学习)