c语言笔记之项目客户信息管理系统

项目2——客户信息管理系统

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

2.1需求说明

2.1.1主菜单

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

2.1.2添加客户

输入1,进入“添加客户”界面,需要填写姓名、性别、年龄、电话、邮箱这些信息,如下图:
在这里插入图片描述

2.1.3显示客户列表

输入4,进入“客户列表”,显示客户列表信息,如下图:
在这里插入图片描述

2.1.4修改客户

输入 2,进入“修改客户”,首先要输入要修改客户的编号,然后填写信息,如下图:
在这里插入图片描述

2.1.5删除客户

输入 3,进入“删除客户”,输入要删除客户的编号,再确认是否删除,如下图:
在这里插入图片描述

2.1.6退出

输出5,经过确认后退出系统,如下图:
在这里插入图片描述

2.2流程分析

2.2.1总流程图

在这里插入图片描述

2.2.2添加客户流程图

在这里插入图片描述

2.2.3显示客户列表流程图

在这里插入图片描述

2.2.4修改客户流程图

(1)修改客户总体流程图:
在这里插入图片描述

(2)具体执行修改部分的流程图:
在这里插入图片描述

2.2.5删除客户流程图

在这里插入图片描述

2.2.6退出流程图

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define MAX_CAPACITY 30
void menu();
void exits();
void showView();
void addCustomer();
void deleteCoustomer();
int getCustomerIndex(int);
void modifyView();
int removeCustomer(int);
/**
 * 声明结构体
 */
struct Customer
{
    int id;
    char name[10];
    char gender;
    int age;        // 年龄
    char phone[20]; // 电话
    char email[30]; // 电子邮件
};
// 声明结构体数组
struct Customer customers[MAX_CAPACITY];
// 记录添加客户的个数
int total;
int loop = 1;

int main()
{

    // customers[0].id = 1;
    // strcpy(customers[0].name,"张三");
    // customers[0].gender = 'f';
    // customers[0].age = 67;
    // strcpy(customers[0].phone,"2345678978654");
    // strcpy(customers[0].email,"2345678876543");
    // total += 1;

    menu();
    getchar();
    getchar();
    return 0;
}

/**
 * 显示客户管理软件的界面
 */

void menu()
{

    // 控制整体界面的显示
    while (loop)
    {
        printf("客户信息管理软件\n");
        printf("1 添加客户\n");
        printf("2 修改客户\n");
        printf("3 删除客户\n");
        printf("4 客户列表\n");
        printf("5 退    出\n");
        printf("请选择(1-5):\n");

        int selection; // 记录用户的选择
        scanf("%d", &selection);

        switch (selection)
        {
        case 1:
            addCustomer();
            break;

        case 2:
            modifyView();
            break;
        case 3:
            deleteCoustomer();
            break;
        case 4:
            showView();
            break;
        case 5:
            exits();
            break;
        }
    }
    printf("退出客户信息管理系统,欢迎下次光临!\n");
}

/**
 * 修改客户
 */

void modifyView()
{
    printf("修改客户\n");
    printf("请选择修改客户的编号");
    int modifyId;
    scanf("%d", &modifyId);
    if (modifyId == -1)
    {
        return;
    }

    int modifyIndex = getCustomerIndex(modifyId);
    if (modifyIndex == -1)
    {
        printf("不存在此编号的客户!修改失败!\n");
        return;
    }

    // 代码能执行到此位置,表示此编号的客户可以修改
    struct Customer *cust = &customers[modifyIndex];

    printf("修改客户");

    // 先声明一个通用的字符串,用于存储可能要修改的数据
    char info[30];
    getchar();
    
    printf("姓名(%s)", cust->name);
    // scanf("%s", info);
    /**
     * fgets:stdin是标准输入从键盘获取的指针,他从steam中获取数据,
     * 数据最长是info的字节长度,遇到\n结束,连带着\n一起装入
     * info数组中
     * 
     * sscanf:函数是格式化输入,遇到换行符或者空格结束,但是换行符和
     * 空格并不会一起存入cust->name中
    */
    fgets(info,sizeof(info),stdin);
    printf("%s",info);
    if (!(info[0] == '\n'))
    {
        // strcpy(cust->name, info);
        sscanf(info,"%s",cust->name);
    }


    printf("性别(%c)", cust->gender);
    fgets(info,sizeof(info),stdin);
    if (!(info[0] == '\n'))
    {
        // strcpy(cust->name, info[0]);
        sscanf(info,"%c",&cust->gender);
    }

    printf("年龄(%d)", cust->age);
    fgets(info,sizeof(info),stdin);
    if (!(info[0] == '\n'))
    {
        // cust->age = info[0];
        sscanf(info,"%d",&cust->age);
    }

    printf("电话(%s)", cust->phone);
    fgets(info,sizeof(info),stdin);
    if (!info[0] == '\n')
    {
        // strcpy(cust->phone, info);
        sscanf(info,"%s",cust->phone);

    }

    printf("邮箱(%s)", cust->email);
    fgets(info,sizeof(info),stdin);
    if (!(info[0] == '\n'))
    {
        // strcpy(cust->email, info);
        sscanf(info,"%s",cust->email);

    }

    printf("修改完成\n");
}

/**
 * 判断指定编号的客户是否存在
 * 如果客户存在,返回-1
 * 如果客户存在 返回此编号的客户所在数组中的索引位置
 */

int getCustomerIndex(int id)
{

    for (int i = 0; i < total; i++)
    {
        if (customers[i].id == id)
        {
            return i;
        }
    }

    return -1;
}

/**
 * 删除指定索引位置的客户
 * 删除失败,返回0
 * 删除成功,返回非0
 */

int removeCustomer(int index)
{
    if (index < 0 || index >= total)
    {
        return -1;
    }

    // 通过循环遍历的方式,将index后续位置依次前移,实现删除的效果
    for (int i = index; i < total - 1; i++)
    {
        customers[i] = customers[i + 1];
        // 如果需要修改编号的话
        customers[i].id = index + 1;
    }

    total--;
    return 1;
}

void deleteCoustomer()
{
    printf("--------------删除客户----------\n");
    printf("请选择待删除客户的编号(-1退出):");
    int deleteId;
    scanf("%d", &deleteId);
    if (deleteId == -1)
    {
        return;
    }

    // 判断给定的客户编号对应的客户是否存在
    int deleteIndex = getCustomerIndex(deleteId);
    if (deleteIndex == -1)
    {
        printf("不存在指定编号的客户\n");
        return;
    }

    // 如果代码可以执行到此位置,表示指定编号的客户是存在的
    // 判断是否要删除
    getchar();
    printf("确认是否删除(y/n)");
    char isDelete;
    scanf("%c", &isDelete);
    if (isDelete == 'n')
    {
        return;
    }
    else if (isDelete == 'y')
    {
        // 确定要删除
        // 具体删除的过程
        if (removeCustomer(deleteIndex) != 0)
        {
            printf("-------删除成功-----------\n");
        }
        else
        {
            printf("删除不成功");
        }
    }
    else
        printf("你输入的选择有误!\n");
}

/**
 * 添加用户
 */

void addCustomer()
{

    if (total < MAX_CAPACITY)
    {
        printf("------------------添加客户--------------\n");

        struct Customer *cust = &customers[total];

        // 编号自动累加
        cust->id = total + 1;

        printf("姓名:");
        char name[10];
        scanf("%s", name);
        strcpy(cust->name, name);

        getchar();

        printf("性别:");
        char sex;
        scanf("%c", &sex);
        cust->gender = sex;

        printf("年龄:");
        int age;
        scanf("%d", &age);
        cust->age = age;

        printf("电话:");
        char phone[20];
        scanf("%s", phone);
        strcpy(cust->phone, phone);

        printf("邮箱:");
        char email[20];
        scanf("%s", email);
        strcpy(cust->email, email);

        printf("添加完成\n");

        total++;
    }
    else
    {
        printf("客户列表已满,添加失败\n");
    }
}

/**
 * 显示某个具体客户的信息
 */

void showCustomer(struct Customer *custptr)
{

    printf("%d\t%s\t%c\t%d\t%s\t%s\n", custptr->id, custptr->name, custptr->gender,
           custptr->age, custptr->phone, custptr->email);
}

/**
 * 显示客户列表
 */

void showView()
{
    if (total == 0)
    {
        printf("系统中没有任何客户信息!请先添加\n");
    }
    else
    {
        printf("-----------客户列表---------\n");
        printf("编号\t姓名\t性别\t年龄\t电话\t\t邮箱\n");
        // 遍历数组元素
        for (int i = 0; i < total; i++)
        {
            showCustomer(&customers[i]);
        }
    }
}

void exits()
{
    printf("确认是否退出(y/n)");
    char isExit;

    while (1)
    {
        getchar();
        scanf("%c", &isExit);
        if (isExit == 'y' || isExit == 'n')
        {
            break;
        }
        else
        {
            printf("输入有误,请重新输入(y/n)");
        }
    }
    if (isExit == 'y')
    {
        loop = 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值