C语言期末销售管理系统设计

销售管理系统设计

某公司有四个销售员(编号:1-4),负责销售五种产品(编号:1-5)。每个销售员都将当天出售的每种产品各写一张便条交上来。每张便条包含内容:

1)销售员的代号

2)产品的代号

3)这种产品的当天的销售额。

每位销售员每天上缴1张便条。试设计一个便条管理系统,使之能提供以下功能:

1、便条信息录入功能(便条信息用文件保存)--输入

2、收集到了上个月的所有便条后,读取销售情况

1)计算每个人每种产品的销售额。

2)按销售额对销售员进行排序,输出排序结果(销售员代号)

3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果(需输出产品的代号和销售额)

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
/*定义日期结构体*/
typedef struct Date
{
    int year;
    int month;
    int day;
} Date;

/*定义便条结构体*/
typedef struct note
{
    Date date;
    int price[5];
} note;

/*定义员工结构体*/
typedef struct staff
{
    char name[10];
    char sex[3];
    int age;
    int id;
} staff;

/* 全局变量部分 */
note not[31];                   //便条数组not,以一个月为准
staff sta[5];                   //员工数组sta,后续用于读取文件中所有员工信息并保存
int ID;                         //某员工的编号
int productPrice[5][5]= {0};    //销售额数组
char s[10]="Note_.txt";         //控制文件的打开选择


/* 选择界面函数 */
void choiceMenu();              //主菜单
void administrator();           //管理员操作
void funstaff();                //员工操作


/* 销售情况 */
void findStaffSale();           //查询员工的销售情况 2
void findProductSale();         //查询产品的销售情况 2
void statistics();              //计算销售额 3
void printSale();               //打印销售额 2


/* 员工相关函数 */
int readData_staff();           //从文件中读取员工信息,返回员工人数 3
void saveData_staff(int n);     //将n个员工数据写入到文件中 3
int printStaff();               //打印文件的所有员工数据 2
void addStaff();                //增加员工 1
void delStaffs();               //清除所有员工信息 1
void changeStaff();             //修改员工信息 1


/* 便条相关函数 */
int readData_note();            //从文件中读取便条内容,返回便条数据个数 3
void saveData_notes(int n);     //将n个便条数据写入到文件中 3
int printNote();                //打印文件的所有便条数据 1
void addNote();                 //上传便条 1
void changeNote();              //修改便条信息 1
void delNotes();                //清除所有便条内容 1


/*查询产品的销售情况*/
void findProductSale()
{
    int i,j,k,tmp;
    int id[5]= {0,1,2,3,4},sum[5]= {0};
    statistics();   //先在productPrice中计算好所有人各个产品的销售额
    for(i=0; i<5; i++)
        for(j=0; j<5; j++)
            sum[i]+=productPrice[j][i];     // 统计某产品销售额之和
    for(i=0; i<4; i++) //与员工销售额排序相同,修改为按产品销售额排序
        for(j=0; j<4; j++)
            if(sum[j]<sum[j+1])
            {
                tmp=id[j];
                id[j]=id[j+1];
                id[j+1]=tmp;
                //先交换id,后交换销售额
                tmp=sum[j];
                sum[j]=sum[j+1];
                sum[j+1]=tmp;
            }
    printf("按产品销售额排序的结果为:\n");
    printf("产品代号\t销售额\n");
    for(i=0; i<5; i++)
        printf("%4d\t\t%d\n",id[i]+1,sum[i]);
    printf("\n");
}


/*查询员工的销售情况*/
void findStaffSale()
{
    int i,j,k,tmp;
    int id[5]= {0,1,2,3,4},sum[5]= {0};
    statistics();
    for(i=0; i<5; i++)
        for(j=0; j<5; j++)
            sum[i]+=productPrice[i][j];  // 统计某员工所有产品的销售总额
    for(i=0; i<4; i++) //冒泡排序
        for(j=0; j<4; j++)
            if(sum[j]<sum[j+1])//按销售额排序,同时记录销售额对应的员工id的排序
            {
                tmp=id[j];
                id[j]=id[j+1];
                id[j+1]=tmp;
                //id先交换,再交换销售额
                tmp=sum[j];
                sum[j]=sum[j+1];
                sum[j+1]=tmp;
            }
    printf("按员工销售额排序的结果为:\n");
    printf("员工代号\t销售额\n");
    for(i=0; i<5; i++)
        printf("%4d\t\t%d\n",id[i]+1,sum[i]);
    printf("\n");
}


/*打印销售员各个产品的销售额*/
void printSale()
{
    int i,j,k,tmp;
    statistics();
    printf("销售员各个产品的销售额:\n\n\t\t");
    for(j=0; j<5; j++)
        printf("%d号产品\t",j+1);
    printf("\n");
    for(i=0; i<5; i++)
    {
        printf("销售员%d:\t",i+1);
        for(j=0; j<5; j++)
            printf("%d\t",productPrice[i][j]);
        printf("\n");
    }
}


/*计算销售额*/
void statistics()
{
    system("cls");
    //计算每个人每种产品的销售额,行对应id代号,列对应销售额数据
    int i,j,k,tmp;
    for(i=0; i<5; i++)
        for(j=0; j<5; j++)
            productPrice[i][j]=0;  // 初始化
    for(i=0; i<5; i++)
    {
        ID=i+1;
        k=readData_note();//该员工共有多少便条数据
        k--;
        while(k>=0)
        {
            for(j=0; j<5; j++)
                productPrice[i][j]+=not[k].price[j];//统计数据
            k--;
        }
    }
}


/*清除便条内容*/
void delNotes()
{
    printf("请确认删除哪个员工的便条:");
    scanf("%d",&ID);
    s[4]='0'+ID;              /*确认打开哪个员工的便条内容*/
    FILE *p=fopen(s,"w+");
    fclose(p);
    if (!feof(p))
        printf("删除成功!\n");
    else
        printf("删除失败!\n");
}


/*清除员工信息*/
void delStaffs()
{
    FILE *p=fopen("StaffInfo.txt","w+");//以写方式打开直接清空
    if (!feof(p))
        printf("删除成功!\n");
    else
        printf("删除失败!\n");
    fclose(p);
}


/*从文件中读取便条,返回便条数据个数*/
int readData_note()
{
    int n=0;
    s[4]='0'+ID;              /*确认打开哪个员工的便条内容*/
    FILE* p = fopen(s,"rb");
    if (p != NULL)
    {
        int k;
        while (1)
        {
            k = fread(not+n,sizeof(note), 1, p);
            // 每个数据块存储到not数组的各个元素中,大小为sizeof(note),每次存1个,文件指针p
            if (k != 1)
                break;
            n++;
        }
        fclose(p);
        return n;
    }
    return 0;
}


/*将n个便条数据写入到文件中*/
void saveData_notes(int n)
{
    char s[10]="Note_.txt";
    s[4]='0'+ID;
    FILE* p=fopen(s,"wb");
    if(p!=NULL)
    {
        fwrite(not,sizeof(note),n,p);
        // not数组用于存储某员工一个月的便条数据,共有n条,大小为sizeof(note),文件指针p
        fclose(p);
    }
    else
        printf("文件保存失败!\n");
}


/*打印文件中的所有便条数据*/
int printNote()
{
    system("cls");
    int n;
    n=readData_note();  /*从文件中读取便条数据个数*/
    if(n==0)
    {
        printf("当前员工无便条数据!\n");
        return 0;
    }
    printf("%d号员工共有%d个便条数据:\n\n",ID,n);
    for(int i=0; i<n; i++)
    {
        printf("便条%d:\t",i+1);
        printf("日期:%d年%d月%d日\n",not[i].date.year,not[i].date.month,not[i].date.day);
        printf("产品代号\t销售额\n");
        printf("--------------------\n");
        for(int j=0; j<5; j++)
            printf("%d\t\t%d\n",j+1,not[i].price[j]);
        printf("--------------------\n\n");
    }
    return n;
}


/*上传便条*/
void addNote()
{
    system("cls");
    int flag,n;
    n=readData_note();
    if(n==31)
    {
        printf("本月便条数据已满,不可添加!\n");
        return;
    }
    else printf("共有%d条便条",n);
    do
    {
        if(n==31)
        {
            printf("本月便条数据已满!\n");
            break;
        }
        printf("请输入日期(空格分开,如2022 01 01):\n");// 输入日期
        scanf("%d%d%d",&not[n].date.year,&not[n].date.month,&not[n].date.day);
        printf("请输入1-5号产品的销售额:\n");     // 输入对应产品销售额
        for(int i=0; i<5; i++)
            scanf("%d",&not[n].price[i]);
        n++;
        printf("是否继续上传便条?(1是/0否):\n");
    }
    while(scanf("%d",&flag)&&flag==1);
    saveData_notes(n);
}


/*从文件中读取员工信息,返回员工人数*/
int readData_staff()
{
    int n = 0;
    FILE* p = fopen("StaffInfo.txt", "rb"); // 二进制读打开
    if (p != NULL)
    {
        int k;
        while (1) //除非读取失败,否则一直循环
        {
            k = fread(sta + n, sizeof(staff), 1, p);
        // fread数据块读函数,第一个参数是用于接收数据的地址,所以存入每个块就需要sta+n
        // 第二个是对象的大小,第三个是读取对象的个数,第四个是文件指针
            if (k != 1)
                break;
            n++;
        }
        fclose(p);
        return n;
    }
    else
    {
        printf("读取失败!");
        return 0;
    }

}


/*将n个员工数据写入到文件中*/
void saveData_staff(int n)
{
    FILE* p = fopen("StaffInfo.txt", "wb");     //二进制写打开
    if (p != NULL)
    {
        fwrite(sta, sizeof(staff), n, p);
    // fwrite数据块写函数,第一个参数是读取数据的首地址,第二个是数组每个元素的大小
    // 第三个是需要写入的个数,第四个是文件指针
        fclose(p);
    }
    else
        printf("文件保存失败!\n");
}

/*打印文件的所有员工数据*/
int printStaff()
{
    system("cls");
    int n=readData_staff();     // 读取员工信息
    if (n == 0)
    {
        printf("无员工数据!\n");
        return 0;
    }
    printf("共有%d个员工:\n", n);
    printf("姓名\t性别\t年龄\tid\n\n");
    for (int i = 0; i < n; i++)
        printf("%s\t%s\t%d\t%d\n", sta[i].name, sta[i].sex, sta[i].age, sta[i].id);
    return n;
}


/*增加员工*/
void addStaff()
{
    system("cls");
    int n,flag;
    n=printStaff();     // 打印员工信息并返回员工个数
    if(n==5)
    {
        printf("人数已满!不可添加\n");
        return ;
    }
    do
    {
        system("cls");
        if(n==5)
        {
            printf("\n人数已满,不可添加!\n");
            break;
        }
        printf("请输入姓名、性别、年龄:\n");
        scanf("%s%s%d", sta[n].name,sta[n].sex,&sta[n].age);
        sta[n].id = n+1;    // id对应n+1
        n++;
        printf("\n是否继续添加(1是/0否):");
        while(getchar()!='\n');
    }
    while (n<5&&scanf("%d", &flag)&&flag);
    saveData_staff(n);
}


/*改变员工信息*/
void changeStaff()
{
    int flag, x, n;
    system("cls");
    n=printStaff();     // 打印员工信息并返回员工个数
    if(!n)
    {
        printf("是否添加员工?(1是/0否):");      // 无员工时询问是否添加
        if(scanf("%d",&flag)&&flag==1)      // return语句放在if内部,之前放在外部导致bug
        {
            addStaff();
            return;
        }
    }
    else
    {
        printf("是否删除所有员工?(1是/0否):");  // 有员工时询问是否需要清除
        if(scanf("%d",&flag)&&flag==1)
        {
            delStaffs();
            return;
        }
    }
    do
    {
        do
        {
            printf("请选择要进行修改的员工id(1至%d):\n", n);
            scanf("%d", &x);
        }
        while (!(x >= 1 && x <= n ));
        printf("请输入姓名、性别、年龄:\n");
        scanf("%s%s%d", sta[x-1].name,sta[x-1].sex,&sta[x-1].age);
        printf("\n\t\t是否继续修改?(1/是,0/否):[ ]\b\b");
    }
    while (scanf("%d", &flag) && flag == 1);
    saveData_staff(n);
}


/*改变便条信息*/
void changeNote()
{
    int flag, x, n;
    system("cls");
    n=printNote();  //打印所有便条,并获取便条个数
    if(!n)
    {
        printf("是否添加便条?(1是/0否):");  // 没有便条数据时询问是否要添加
        if(scanf("%d",&flag)&&flag==1)
            addNote();
        return ;
    }
    do
    {
        do
        {
            printf("请选择要进行修改的便条(1至%d):\n", n);
            scanf("%d", &x);
        }while (!(x >= 1 && x <= n ));
        printf("请输入日期(空格分开,如2022 01 01):\n");   // 便条数据先存进结构体数组,后续保存回文件
        scanf("%d%d%d",&not[n-1].date.year,&not[n-1].date.month,&not[n-1].date.day);
        printf("请输入1-5号产品的销售额:\n");
        for(int i=0; i<5; i++)
            scanf("%d",&not[n-1].price[i]);
        printf("\n\t\t是否继续修改?(1/是,0/否):[ ]\b\b");
    }
    while (scanf("%d", &flag) && flag == 1);
    saveData_notes(n);  // 保存便条数据
}


/*管理员操作*/
void administrator()
{
    int x,flag;
    do
    {
        do
        {
            system("cls");
            printf("\t\t############################\n");
            printf("\t\t#####1.添加员工#############\n");
            printf("\t\t#####2.修改员工信息#########\n");
            printf("\t\t#####3.删除便条内容#########\n");
            printf("\t\t#####4.查询产品销售情况#####\n");
            printf("\t\t#####5.查询员工销售情况#####\n");
            printf("\t\t#####6.打印员工#############\n");
            printf("\t\t#####7.打印销售额###########\n");
            printf("\t\t#####8.退出系统#############\n");
            printf("\t\t############################\n");
            printf("\t\t请选择功能[  ]\b\b\b");
            scanf("%d", &x);
            switch (x)
            {
            case 1:
                addStaff();
                break;
            case 2:
                changeStaff();
                break;
            case 3:
                delNotes();
                break;
            case 4:
                findProductSale();
                break;
            case 5:
                findStaffSale();
                break;
            case 6:
                printStaff();
                break;
            case 7:
                printSale();
                break;
            case 8:
            {
                printf("\n欢迎下次使用!");
                exit(0);
            }
            break;
            default:
            {
                while (getchar() != '\n');
                printf("\t\t\t输入有误,请重新输入!\n");
                system("pause");    // 暂停,保证输入提示信息正常显示不被清屏
            }
            }
        }while (!(x >= 1 && x <= 8));
        printf("是否返回管理员功能选择界面?(1是/0否):");
    }while(scanf("%d",&flag)&&flag==1);//执行完内部功能后选择是否返回选择界面,也就是是否继续循环
}


/*员工操作*/
void funstaff()
{
    int x,flag;
    do{
        printf("\t\t请输入自己的id(1到5):");
    }while(!scanf("%d",&ID)||ID<1||ID>5);    // 员工登录时输入个人id,便于后续对应的操作(ID全局变量)
    do
    {
        system("cls");
        printf("\t\t############################\n");
        printf("\t\t###1.上传便条###############\n");
        printf("\t\t###2.修改便条信息###########\n");
        printf("\t\t###3.打印便条数据###########\n");
        printf("\t\t###4.退出系统###############\n");
        printf("\t\t############################\n");
        printf("\t\t请选择功能:[ ]\b\b");
        scanf("%d", &x);
        while (!(x >= 1 && x <= 4))
        {
            while (getchar() != '\n');
            printf("\t\t输入有误,请重新输入!\n");
            printf("\t\t请选择功能:[ ]\b\b");
            scanf("%d", &x);
        }
        switch (x)
        {
        case 1:
            addNote();
            break;
        case 2:
            changeNote();
            break;
        case 3:
            printNote();
            break;
        case 4:
        {
            printf("欢迎下次使用!");
            exit(0);
        }
        break;
        }
        printf("是否返回销售员的功能选择界面?(1是/0否):");  //执行完功能后选择是否返回上级界面
    }
    while(scanf("%d",&flag)&&flag==1);
}


/*主菜单*/
void choiceMenu()
{
    int x;
    system("cls");      // 清屏操作
    printf("\t\t\t############################\n");
    printf("\t\t\t######1.管理员登录##########\n");
    printf("\t\t\t######2.销售员的登录########\n");
    printf("\t\t\t######3.退出系统############\n");
    printf("\t\t\t############################\n");
    printf("\t\t\t请选择功能:[ ]\b\b");
    scanf("%d", &x);
    while (!(x >= 1 && x <= 3))
    {
        while (getchar() != '\n');      // 用户输入字符等非法数据时,清除缓冲区
        printf("\t\t\t输入有误,请重新输入!\n");
        printf("\t\t\t请选择功能:[ ]\b\b");
        scanf("%d", &x);
    }
    if (x == 1) administrator();
    else if (x == 2) funstaff();
    else
    {
        printf("欢迎下次使用!\n");
        exit(0);
    }
}


int main()
{
    int flag;
    do
    {
        choiceMenu();
        printf("是否返回主菜单(1是/0否):");
    }
    while(scanf("%d",&flag)&&flag==1);
    printf("欢迎下次使用!");
    return 0;
}

  • 14
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OrientalGlass

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值