从零开始学嵌入式技术之C语言15:客户信息管理系统

一:项目------客户信息管理系统

实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。

(1)主菜单

进入系统,展示主菜单,输入各功能对应的数字编号选择要进行的操作,如下图:

(2)添加客户

输入1,进入"添加客户"界面,需要填写姓名、性别、年龄、电话、邮箱这些信息,如下图:

(3)显示客户列表

输入4,进入"客户列表",显示客户列表信息,如下图 :

(4)修改客户

输入 2,进入"修改客户",首先要输入要修改客户的编号,然后填写信息,如下图:

(5)删除客户

输入 3,进入"删除客户",输入要删除客户的编号,再确认是否删除,如下图:

(6)退出

输出5,经过确认后退出系统,如下图:

二:代码实现

写法1

cpp 复制代码
#include <stdio.h>
#define TOTAL 100
// 定义客户信息相关结构
typedef struct
{
    // 成员需要有哪些
    int id;         // 客户编号,从1开始递增
    char name[20];  // 客户名字
    char sex;       // m==代表男士 g代表女生
    int age;        // 客户的年龄
    char phone[20]; // 客户的手机号
    char email[20]; // 客户邮箱
} Custom;

// 结构体类型的数组,保存客户信息
Custom customArray[TOTAL];
// 数组的最大角标
int limit_length = 99;
// 定义记录已经添加客户个数
int counter = 0;

int update(int id)
{
    // 判断编号是否合法
    if (id < 1 || id > counter)
    {
        printf("\n请输入合法的编号");
        return 0;
    }
    // 修改的编号是合法的
    int index = id - 1;
    // 缓冲区数组
    char buffer[20];
    getchar();
    printf("\n姓名(%s):", customArray[index].name);
    // 键盘输入的数据存储到缓冲区进行判断
    fgets(buffer, sizeof buffer, stdin);
    if (buffer[0] != '\n')
    {
        sscanf(buffer, "%s", customArray[index].name);
    }

    printf("\n性别(%c):", customArray[index].sex);
    // 键盘输入的数据存储到缓冲区进行判断
    fgets(buffer, sizeof buffer, stdin);
    if (buffer[0] != '\n')
    {
        sscanf(buffer, "%c", &customArray[index].sex);
    }

    printf("\n年龄(%d):", customArray[index].age);
    // 键盘输入的数据存储到缓冲区进行判断
    fgets(buffer, sizeof buffer, stdin);
    if (buffer[0] != '\n')
    {
        sscanf(buffer, "%d", &customArray[index].age);
    }

    printf("\n电话(%s):", customArray[index].phone);
    // 键盘输入的数据存储到缓冲区进行判断
    fgets(buffer, sizeof buffer, stdin);
    if (buffer[0] != '\n')
    {
        sscanf(buffer, "%s", customArray[index].phone);
    }

    printf("\n邮箱(%s):", customArray[index].email);
    // 键盘输入的数据存储到缓冲区进行判断
    fgets(buffer, sizeof buffer, stdin);
    if (buffer[0] != '\n')
    {
        sscanf(buffer, "%s", customArray[index].email);
    }
    // 修改成功
    return 1;
}

// 更新客户信息界面
void updateCustom()
{
    // 存储修改客户的编号
    int id;
    // 修改客户信息
    printf("\n**********修改客户**********");
    printf("\n请您输入修改客户的编号(-1退出):");
    scanf("%d", &id);
    // 退出
    if (id == -1)
    {
        printf("\n退出");
        return;
    }

    // 判断更新成功还是失败
    if (update(id))
    {
        printf("\n更新成功");
    }
    else
    {
        printf("\n更新失败");
    }
}

// 返回数值:1代表删除成功 0删除失败
// 形参ID是客户的编码,删除需要条件
int DeleteCustomById(int id)
{
    // 条件判断:删除客户ID合法的
    if (id < 1 || id > counter)
    {
        printf("\n请您输入正确编号");
        // 返回0代表删除失败
        return 0;
    }
    /**********************干掉客户***************************/
    // 删除掉客户下角标
    int index = id - 1;
    for (int i = index; i < counter; i++)
    {
        // 后者覆盖前者
        customArray[i] = customArray[i + 1];
        // 每次后者前移动的时候id-1
        customArray[i].id -= 1;
    }
    // 客户的人数减少一个
    counter--;
    return 1;
}

// 删除客户
void deleteCustom()
{
    int id;
    char choose;
    // 保存用户输入的编号
    // 删除客户提示文字
    printf("\n**********删除客户**********");
    printf("\n请您输入要删除客户的编号(-1退出):");
    scanf("%d", &id);
    // 进行判断:万一半路输入-1,人家不想删除了,退出即可!!!
    if (id == -1)
    {
        printf("\n退出!");
        return;
    }
    // 提示:让用户输入Y/N确定删除操作
    printf("\n确定是否删除(Y/N):");
    // 换行取出(缓冲区)
    getchar();
    scanf("%c", &choose);
    // 进行判断:用户输入进来choose==Y,进行删除客户操作
    if (choose == 'Y')
    {
        // 删除客户的业务---单独封装一个函数
        if (DeleteCustomById(id))
        {
            // 删除成功
            printf("\n删除成功");
        }
        else
        {
            // 删除失败
            printf("\n删除失败");
        }
    }
}

// 查看客户列表
void lookList()
{
    printf("\n**********客户列表**********");
    printf("\n编号\t姓名\t性别\t年龄\t电话\t邮箱\t");
    // 遍历客户信息
    for (int i = 0; i < counter; i++)
    {
        printf("\n%d\t%s\t%c\t%d\t%s\t%s\t", customArray[i].id, customArray[i].name, customArray[i].sex, customArray[i].age, customArray[i].phone, customArray[i].email);
    }
}
// 添加客户
void addCustom()
{
    // 先判断还能不能再添加
    if (counter > limit_length)
    {
        printf("\n会员已经达到上限!");
        // 代表后面的语句不在执行
        return;
    }
    printf("\n**********添加客户**********");

    // 客户编号+1,后期递增+1
    customArray[counter].id = counter + 1;
    // 姓名
    printf("\n姓名:");
    scanf("%s", customArray[counter].name);

    // 性别
    printf("\n性别:");
    getchar();
    scanf("%c", &customArray[counter].sex);

    // 年龄
    printf("\n年龄:");
    getchar();
    scanf("%d", &customArray[counter].age);
    // 电话
    printf("\n电话:");
    getchar();
    scanf("%s", customArray[counter].phone);
    // 邮箱
    printf("\n邮箱:");
    getchar();
    scanf("%s", customArray[counter].email);

    // 统计客户的人员个数+1
    counter++;
}
// 主菜单的code
void mainMenu()
{
    // 定义一个变量存储用户选项值[1-5]
    int select;
    // 定义一个变量,去控制循环语句是不是死循环
    int loop = 1;
    while (loop)
    {
        printf("\n----------客户信息管理软件-----------");
        printf("\n          1:添加客户                ");
        printf("\n          2:修改客户                ");
        printf("\n          3:删除客户                ");
        printf("\n          4:客户列表                ");
        printf("\n          5:退    出                ");
        printf("\n          请选择(1-5):");
        scanf("%d", &select);
        // 条件语句进行条件判断
        switch (select)
        {
        case 1:
            // 添加客户
            addCustom();
            break;
        case 2:
            // 修改客户
            updateCustom();
            break;
        case 3:
            // 删除客户
            deleteCustom();
            break;
        case 4:
            // 查看列表
            lookList();
            break;
        case 5:
            // 输入的如果不是Y|N,一直询问....直到这大哥终于输入Y|N
            char choose;
            do
            {
                printf("确认是否退出Y/N:");
                // 换行符从缓冲区取出
                getchar();
                scanf("%c", &choose);
            } while (choose != 'Y' && choose != 'N');

            // 执行到这里如果输入的Y真的退出
            if (choose == 'Y')
            {
                // 终止死循环
                loop = 0;
                printf("\n退出客户系统管理");
            }

            break;
        default:
            printf("\n请您输入正确选项");
            break;
        }
    }
}

int main()
{

    // 主菜单
    mainMenu();
    return 0;
}

写法2:

cpp 复制代码
#include <stdio.h>
#include <string.h>
// 客户结构体
typedef struct
{
    int id;
    char name[20];
    char sex;
    int age;
    char phone[20];
    char emal[30];
} Customer;
Customer customer[100];     // 创建客户数组
int cont = 0, max_len = 99; // 定义客户数量,和最大限制
int flag = 1;
// 添加客户函数
void add_customer()
{
    printf("----------1添加客户----------\n");

    customer[cont].id = cont + 1;
    printf("姓名\n");
    getchar();
    char buffer[20];
    fgets(buffer,sizeof buffer,stdin);
    sscanf(buffer,"%s",customer[cont].name);
    

    printf("性别\n");
    
    
    scanf("%c", &customer[cont].sex);

    printf("年龄\n");
    
    scanf("%d", &customer[cont].age);

    printf("电话\n");
    
    scanf("%s", customer[cont].phone);

    printf("邮箱\n");
    
    scanf("%s", customer[cont].emal);
    cont++;

    printf("----------添加完成----------\n");
}
// 客户列表
void customer_list()
{
    printf("----------客户列表---------------------------------------\n");
    printf("编号\t姓名\t性别\t年龄\t电话\t\t邮箱\n");
    for (int i = 0; i < cont; i++)
    {
        printf("%d\t%s\t%c\t%d\t%s\t%s\n", customer[i].id, customer[i].name, customer[i].sex, customer[i].age, customer[i].phone, customer[i].emal);
    }
}
// 修改客户
void modify_customer()
{
    printf("----------修改客户----------\n");
    printf("请选择待修改客户编号(-1退出)\n");
    
    int modify_id;
    scanf("%d", &modify_id);
    if (modify_id >= 1)
    {
        char buffer[20];
        printf("姓名(%s)\n", customer[modify_id - 1].name);
        getchar();
        fgets(buffer, sizeof(buffer), stdin);
        if (buffer[0] != '\n')
        {
            sscanf(buffer, "%s", customer[modify_id - 1].name);
        }

        printf("性别(%c)\n", customer[modify_id - 1].sex);

        fgets(buffer, sizeof(buffer), stdin);
        if (buffer[0] != '\n')
        {
            sscanf(buffer, "%c", &customer[modify_id - 1].sex);
        }

        printf("年龄(%d)\n", customer[modify_id - 1].age);

        fgets(buffer, sizeof(buffer), stdin);
        if (buffer[0] != '\n')
        {
            sscanf(buffer, "%d", &customer[modify_id - 1].age);
        }

        printf("电话(%s)\n", customer[modify_id - 1].phone);

        fgets(buffer, sizeof(buffer), stdin);
        if (buffer[0] != '\n')
        {
            sscanf(buffer, "%s", customer[modify_id - 1].phone);
        }

        printf("邮箱(%s)\n", customer[modify_id - 1].emal);

        fgets(buffer, sizeof(buffer), stdin);
        if (buffer[0] != '\n')
        {
            sscanf(buffer, "%s", customer[modify_id - 1].emal);
        }

        printf("----------修改完成----------\n");
        printf("----------修改成功!!!----------\n");
    }
}
// 退出系统
void customer_exit()
{
    char ch;

    do
    {
        printf("是否确定退出Y/N\n");
        getchar();
        scanf("%c", &ch);
    } while (ch != 'Y' && ch != 'N');
    if (ch == 'Y')
    {
        flag = 0;
    }
}
// 删除客户
void del_customer()
{
    printf("----------删除客户----------\n");
    printf("请选择待删除客户编号(-1退出)\n");
    int dle_id;
    scanf("%d", &dle_id);
    if (dle_id >= 1)
    {
        if (dle_id > cont)
        {
            printf("没有该用户,删除失败\n");
        }
        else
        {
            char ch;
            do
            {
                printf("确认是否删除(Y/N)\n");
                getchar();
                scanf("%c", &ch);
            } while (ch != 'Y' && ch != 'N');
            if (ch == 'Y')
            {
                for (int i = dle_id - 1; i < cont; i++)
                {
                    strcpy(customer[i].name, customer[i + 1].name);
                    customer[i].sex = customer[i + 1].sex;
                    customer[i].age = customer[i + 1].age;
                    strcpy(customer[i].phone, customer[i + 1].phone);
                    strcpy(customer[i].emal, customer[i + 1].emal);
                }
                cont--;
                printf("----------删除成功----------\n");
            }
            else
            {
                printf("----------取消删除----------\n");
            }
        }
    }
}
// 主视图函数
void view()
{
    int choose;
    while (flag)
    {
        printf("----------客户信息管理软件----------\n");
        printf("          1 添加客户\n");
        printf("          2 修改客户\n");
        printf("          3 删除客户\n");
        printf("          4 客户列表\n");
        printf("          5 退    出\n");
        printf("          请选择(1-5):\n");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
            add_customer();
            break;
        case 2:
            modify_customer();
            break;
        case 3:
            del_customer();
            break;
        case 4:
            customer_list();
            break;
        case 5:
            customer_exit();
            break;
        default:
            printf("请输入正确的数字\n");
            break;
        }
    }
}
int main()
{
    view();
    return 0;
}
相关推荐
御风@户外15 分钟前
质数生成函数、质数判断备份
算法·acm
闻缺陷则喜何志丹28 分钟前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
Dong雨40 分钟前
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
数据结构·算法·排序算法
析木不会编程1 小时前
【C语言】动态内存管理:详解malloc和free函数
c语言·开发语言
达帮主1 小时前
7.C语言 宏(Macro) 宏定义,宏函数
linux·c语言·算法
是十一月末1 小时前
机器学习之KNN算法预测数据和数据可视化
人工智能·python·算法·机器学习·信息可视化
chenziang11 小时前
leetcode hot100 路径总和
算法
lyx1426061 小时前
leetcode 3083. 字符串及其反转中是否存在同一子字符串
算法·leetcode·职场和发展
茶猫_1 小时前
力扣面试题 39 - 三步问题 C语言解法
c语言·数据结构·算法·leetcode·职场和发展
hunandede1 小时前
Ubuntu网络配置(桥接模式, nat模式, host主机模式)
网络·ubuntu·桥接模式