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

销售管理系统设计

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

1)销售员的代号

2)产品的代号

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

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

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

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

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

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

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

#include 
#include 
#include 
/*定义日期结构体*/
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]=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= 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",¬[n-1].date.year,¬[n-1].date.month,¬[n-1].date.day);
        printf("请输入1-5号产品的销售额:\n");
        for(int i=0; i<5; i++)
            scanf("%d",¬[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;
}

你可能感兴趣的:(日常练习,c语言,其他,经验分享,学习)