C语言销售管理系统

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C语言销售管理系统

凉哈哈   2022-05-28 我要评论

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

试设计一个便条管理系统,使之能提供以下功能:

1、系统以菜单方式工作

2、便条信息录入功能——输入(支持便条信息文件导入)

3、便条信息修改功能

4、便条信息删除功能

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

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

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

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

详情请参考代码,注释写的很详细,希望能给你帮助.

最后的最后有截图展示效果.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define M 155
 
///这些函数下面会详细的介绍的滴!
void detail();
void foreach();
void menu();
void product();
void readdata();
void seller();
void total();
void choice();
void add();
void deleteing();
void update();
void clearing();
 
 
struct ss{
    int sid;///销售代码
    int pid;///产品代号
    int sn;///销售额
}ss[M];
int n;///便条数目
int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};///用户保存员工和产品信息
 
///从文件读取数据
void readdata()
{
    FILE *fp;///定义文件指针
    ///调用fopen函数,以只读模式打开d:\list.txt文件,并验证返回值是否为空
    if((fp=fopen("d:\\list.txt","r"))==NULL)
 
    {
        printf("文件打开失败!\n");
        exit(0);///表示正常的退出
    }
    else
    /**feof是输入输出函数,检查文件是否结束,如结束,则返回非零值,
    否则返回0 .函数原型为:int feof(FILE *fp)**/
        for(n=0;!feof(fp);n++)
        {
            fscanf(fp,"%d %d %d\n",&ss[n].sid,&ss[n].pid,&ss[n].sn);
        } ///保存文件数据到结构体
     fclose(fp);///关闭文件
}
 
///从便条读到的数据分类整理统计
void foreach()
{
    int i;
    for(i=0;i<n;i++)///遍历所有纸条
    {
        switch(ss[i].pid)///按产品分类,再按销售员分类,累加各人各产品销售额
        {
            case 1:///当ss[i].pid为1的时候,也就是当产品代号为1的时候
            switch(ss[i].sid)///查看销售代码
            {
                ///当销售代码为1的时候,累加1号销售员编号为1的产品的销售额
                case 1:s[0][0]+=ss[i].sn;break;
                ///当销售代码为2的时候,累加2号销售员编号为1的产品的销售额
                case 2:s[1][0]+=ss[i].sn;break;
                ///当销售代码为3的时候,累加3号销售员编号为1的产品的销售额
                case 3:s[2][0]+=ss[i].sn;break;
                ///当销售代码为4的时候,累加4号销售员编号为1的产品的销售额
                case 4:s[3][0]+=ss[i].sn;break;
            }
            break;
            ///以下代码同理可得
            case 2:
            switch(ss[i].sid)
            {
                case 1:s[0][1]+=ss[i].sn;break;
                case 2:s[1][1]+=ss[i].sn;break;
                case 3:s[2][1]+=ss[i].sn;break;
                case 4:s[3][1]+=ss[i].sn;break;
            }
            break;
 
            case 3:
            switch(ss[i].sid)
            {
                case 1:s[0][2]+=ss[i].sn;break;
                case 2:s[1][2]+=ss[i].sn;break;
                case 3:s[2][2]+=ss[i].sn;break;
                case 4:s[3][2]+=ss[i].sn;break;
            }
            break;
 
            case 4:
            switch(ss[i].sid)
            {
                case 1:s[0][3]+=ss[i].sn;break;
                case 2:s[1][3]+=ss[i].sn;break;
                case 3:s[2][3]+=ss[i].sn;break;
                case 4:s[3][3]+=ss[i].sn;break;
            }
            break;
 
            case 5:
            switch(ss[i].sid)
            {
                case 1:s[0][4]+=ss[i].sn;break;
                case 2:s[1][4]+=ss[i].sn;break;
                case 3:s[2][4]+=ss[i].sn;break;
                case 4:s[3][4]+=ss[i].sn;break;
            };
            break;
        }
    }
}
 
///菜单选项
void menu()
{
    int c;
    puts("\t\t*********菜单*********************\n\n");
    puts("\t\t 1.查看每人每种产品的销售额\n");
    puts("\t\t 2.按销售额对销售员排序(销售员代号)\n");
    puts("\t\t 3.对每种产品总销售额从高到低排序(产品代号和销售额)\n");
    puts("\t\t 4.输出统计报表\n");
    puts("\t\t 5.录入一条便条信息\n");
    puts("\t\t 6.修改一条便条信息\n");
    puts("\t\t 7.删除一条便条信息\n");
    puts("\t\t 8.退出\n");
    puts("\n\n\t\t*********************************************\n");
    printf("请选择(1-8):[ ]\b\b");
    scanf("%d",&c);
    if(c<1||c>8)///错误输入,重新获取输入
    {
        printf("您输入的选项不在我们服务范围之内\请确定好您要选择的服务,重新输入!!!\n");
        menu();
    }
    else///正确输入
    switch(c)///根据输入实现相应函数调用
    {
        case 1:detail();
        break;
 
        case 2:seller();
        break;
 
        case 3:product();
        break;
 
        case 4:total();
        break;
 
        case 5:add();
        break;
 
        case 6:update();
        break;
 
        case 7:deleteing();
        break;
 
        case 8:exit(0);
    }
}
 
///计算上个月每个人每种产品的销售额
void detail()
{
    int i,j;
    for(i=0;i<4;i++)
    {
        printf("\n\t\t%d 号销售员销售情况:\n",i+1);
        for(j=0;j<5;j++)
             printf("\t\t%d 号产品销售额:%d\n",j+1,s[i][j]);
    }
    choice();
}
 
///按销售额对销售员进行排序,输出排序结果(销售员代号)
void seller()
{
    int i,j,k;
    int sp[4]={0,0,0,0};///存销售员的销售额
    for(i=0;i<4;i++)///统计销售员的销售额
        for(j=0;j<5;j++)
            sp[i]+=s[i][j];
 
    for(i=0;i<4;i++)///排序
    {
        k=0;
        for(j=0;j<4;j++)
        {
            if(sp[k]<sp[j])
                k=j;
        }
        printf("\t\t第%d名是%d号销售员!\n",i+1,k+1);
        sp[k]=-1;
    }
    choice();
}
 
///对每种产品总销售额从高到低排序(产品代号和销售额)
void product()
{
    int i,j,k;
    int p[5]={0,0,0,0,0};///存每种产品的销售额
    for(i=0;i<5;i++)///统计每种产品的销售额
        for(j=0;j<4;j++)
            p[i]+=s[j][i];
 
    for(i=0;i<5;i++)///将产品的销售额进行排序
    {
        k=0;
        for(j=0;j<5;j++)
        {
            if(p[k]<p[j])
                k=j;
        }
        printf("\t\t第%d名是%d号产品!\销售额为%d!\n",i+1,k+1,p[k]);
        p[k]=-1;
    }
    choice();
}
 
///输出统计报表(输出销售代号,产品代号和销售额)
void total()
{
    int i,j;
    printf("\n\t销售员\t产品\t销售额\n");
    for(i=0;i<4;i++)
        for(j=0;j<5;j++)
            printf("\t%d\t%d\t%d\n",i+1,j+1,s[i][j]);
    choice();
}
 
///选择退出系统或返回主菜单
void choice()
{
    int c;
    printf("请选择接下来想做什么:\n1.返回菜单\n2.退出系统\n");
    scanf("%d",&c);
    if(c==1)
        menu();
    else
        exit(0);
}
 
///录入一条便条信息
void add()
{
    printf("请填写您要录入的便条的信息:销售代码,产品代码,销售额\n");
    /**接着readdata()统计的文本中便条的信息到结构体数组里,
    将添加的信息首先保存在那些信息的后面**/
    scanf("%d %d %d",&ss[n].sid,&ss[n].pid,&ss[n].sn);
    FILE *fp;///定义文件指针
    char *str="d:\\list.txt";
    printf("该条记录正在写入文件 list.txt~~~~\n");
    fp=fopen(str,"a");///参数"a"意思是说将新添加的数据接着文本里的数据写,不会覆盖文本里的内容
    fprintf(fp,"\n%d\t%d\t%d",ss[n].sid,ss[n].pid,ss[n].sn);///将结构体里的信息写入文本
    fclose(fp);///关闭文件
    printf("\n该条记录已经写入文件 list.txt,请前往查看!\n");
    switch(ss[n].pid)///借用foreach()函数里的代码,详情请参考foreach()函数
    {
        case 1:///当ss[i].pid为1的时候,也就是当产品代号为1的时候
        switch(ss[n].sid)///查看销售代码
        {
            ///当销售代码为1的时候,累加1号销售员编号为1的产品的销售额
            case 1:s[0][0]+=ss[n].sn;break;
            ///当销售代码为2的时候,累加2号销售员编号为1的产品的销售额
            case 2:s[1][0]+=ss[n].sn;break;
            ///当销售代码为3的时候,累加3号销售员编号为1的产品的销售额
            case 3:s[2][0]+=ss[n].sn;break;
            ///当销售代码为4的时候,累加4号销售员编号为1的产品的销售额
            case 4:s[3][0]+=ss[n].sn;break;
        }
        break;
        ///以下代码同理可得
        case 2:
        switch(ss[n].sid)
        {
            case 1:s[0][1]+=ss[n].sn;break;
            case 2:s[1][1]+=ss[n].sn;break;
            case 3:s[2][1]+=ss[n].sn;break;
            case 4:s[3][1]+=ss[n].sn;break;
        }
        break;
 
        case 3:
        switch(ss[n].sid)
        {
            case 1:s[0][2]+=ss[n].sn;break;
            case 2:s[1][2]+=ss[n].sn;break;
            case 3:s[2][2]+=ss[n].sn;break;
            case 4:s[3][2]+=ss[n].sn;break;
        }
        break;
 
        case 4:
        switch(ss[n].sid)
        {
            case 1:s[0][3]+=ss[n].sn;break;
            case 2:s[1][3]+=ss[n].sn;break;
            case 3:s[2][3]+=ss[n].sn;break;
            case 4:s[3][3]+=ss[n].sn;break;
        }
        break;
 
        case 5:
        switch(ss[n].sid)
        {
            case 1:s[0][4]+=ss[n].sn;break;
            case 2:s[1][4]+=ss[n].sn;break;
            case 3:s[2][4]+=ss[n].sn;break;
            case 4:s[3][4]+=ss[n].sn;break;
        };
        break;
    }
    n++;
    choice();
}
 
/**删除便条信息流程:新建一个临时文件,将不被删除的便条信息存到临时文件里,
然后删除原文件,再将临时文件改名为原文件的文件名**/
void deleteing()
{
    printf("请输入您要删除的便条的信息:销售代码,产品代码,销售额\n");
    int a,b,c;///存用户需要删除的便条的信息
    scanf("%d %d %d",&a,&b,&c);
    printf("请稍等,您选择的便条正在删除~~~\n");
    FILE *fin,*ftp;
    int x,y,z;
    fin=fopen("d:\\list.txt","r");///读打开原文件list.txt
    ftp=fopen("d:\\tmp.txt","w");///写打开临时文件tmp.txt
    if(fin==NULL || ftp==NULL){
        printf("文件打开失败!\n");
        exit(0);
    }
    int m=0;///该变量是控制写入文本是首行不自动换行
    for(int i=0;!feof(fin);i++)
    {
        fscanf(fin,"%d %d %d\n",&x,&y,&z);///从原文件读取到的一行数据放到x,y,z三个变量中
        if(x==a&&y==b&&z==c)///所有的数据相等,说明是要删除的便条,则不写入临时文件
            continue;
        else///将不是要删除的其他便条信息写入临时文件
        {
            if(m==0)
            {
                fprintf(ftp,"%d\t%d\t%d",x,y,z);///不是则将这一行写入临时文件tmp.txt
                m++;
            }
            else
                fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///不是则将这一行写入临时文件tmp.txt
        }
    }
    fclose(fin);
    fclose(ftp);
    system("DEL/f d:\\list.txt");///删除原文件,如果删除错误,会报原因
    ///unlink("d:\\list.txt");///删除原文件
    rename("d:\\tmp.txt","d:\\list.txt");///将临时文件名改为原文件名
    printf("您选择的便条已经删除,请打开文件查看!\n");
    clearing();
    readdata();
    foreach();
    choice();
}
 
///清空之前所统计的原文件里的销售员和销售产品所对应的销售额
void clearing()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<5;j++)
            s[i][j]=0;
    }
}
 
/**更新便条信息流程:新建一个临时文件,将原文件里的东西复制到临时文件中,在复制的过程中,
需要修改的东西修改之后再放入临时文件,然后删除原文件,将临时文件改名为原文件的名字**/
void update()
{
    printf("请输入您要修改的便条的信息:销售代码,产品代码,销售额\n");
    int a,b,c,d,e,x,y,z;
    scanf("%d %d %d",&a,&b,&c);
    printf("请问您要修改该便条中那一项信息:\n(1)销售代码\n(2)产品代码\n(3)销售额\n");
    scanf("%d",&d);
    printf("请问您要将该项信息修改成什么(请输入数字):\n");
    scanf("%d",&e);
    printf("您选择的便条正在修改中~~~~~\n");
    FILE *fin=fopen("d:\\list.txt","r");
    FILE *ftp=fopen("d:\\tmp.txt","w");  ///是充当临时文件作用
    if(!fin)
    {
        printf("不能打开list.txt文件\n");
        exit(1);
    }
    if(!ftp)
    {
        printf("不能打开tmp.txt文件\n");
        exit(1);
    }
    int m=0;///该变量是控制写入文本时首行不自动换行
    ///开始复制
    switch(d)///根据选项修改(1)销售代码 (2)产品代码 (3)销售额
    {
        case 1:///(1)销售代码
        {
               for(int i=0;!feof(fin);i++)
                {
                    fscanf(fin,"%d %d %d\n",&x,&y,&z);
                    if(x==a&&y==b&&z==c)///检验是要修改的行吗
                    {
                        x=e;
                        if(m==0)
                        {
                            fprintf(ftp,"%d\t%d\t%d",x,y,z);///将修改过的数据写入临时文件
                            m++;
                        }
                        else
                            fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///将修改过的数据写入临时文件
                    }
                    else
                    {
                        if(m==0)
                        {
                            fprintf(ftp,"%d\t%d\t%d",x,y,z);///将原本的数据写入临时文件
                            m++;
                        }
                        else
                            fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///将原本过的数据写入临时文件
                    }
                }
            }
            break;
 
        ///以下代码同理可得
        case 2:
        {
            for(int i=0;!feof(fin);i++)
                {
                    fscanf(fin,"%d %d %d\n",&x,&y,&z);
                    if(x==a&&y==b&&z==c)///检验是要修改的行吗
                    {
                        y=e;
                        if(m==0)
                        {
                            fprintf(ftp,"%d\t%d\t%d",x,y,z);///将修改过的数据写入临时文件
                            m++;
                        }
                        else
                            fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///将修改过的数据写入临时文件
                    }
                    else
                    {
                        if(m==0)
                        {
                            fprintf(ftp,"%d\t%d\t%d",x,y,z);///将原本的数据写入临时文件
                            m++;
                        }
                        else
                            fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///将原本过的数据写入临时文件
                    }
                }
        }
        break;
 
        case 3:
        {
            for(int i=0;!feof(fin);i++)
                {
                    fscanf(fin,"%d %d %d\n",&x,&y,&z);
                    if(x==a&&y==b&&z==c)///检验是要修改的行吗
                    {
                        z=e;
                        if(m==0)
                        {
                            fprintf(ftp,"%d\t%d\t%d",x,y,z);///将修改过的数据写入临时文件
                            m++;
                        }
                        else
                            fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///将修改过的数据写入临时文件
                    }
                    else
                    {
                        if(m==0)
                        {
                            fprintf(ftp,"%d\t%d\t%d",x,y,z);///将原本的数据写入临时文件
                            m++;
                        }
                        else
                            fprintf(ftp,"\n%d\t%d\t%d",x,y,z);///将原本过的数据写入临时文件
                    }
                }
        }
        break;
    }
    fclose(fin);
    fclose(ftp);
     printf("您选择的便条已经修改完毕,请打开文件查看!\n");
    system("DEL/f d:\\list.txt");///删除原文件,删除错误的时候会报提示信息
    ///unlink("d:\\list.txt");///删除原文件
    rename("d:\\tmp.txt","d:\\list.txt");///改名
    clearing();
    readdata();
    foreach();
    choice();
}
 
int main()
{
    readdata();///读取文件数据
    foreach();///初始化数组
    menu();///显示主菜单
}

首先在D盘下新建一个文本文档 ,名为 list.txt,在文本文档里存入的数据如下(数据仅供参考):

然后我们开始运行该程序:

对于上图第五项添加便条信息的操作,我们 来看一看文本里的内容(最后一行就是新添的数据)

在我们执行第六个选项的时候,首先需要在D盘下新建一个文本文档  tmp.txt,至于为啥,详情请参考代码,代码里面有详细的解释

我们再去查看D盘里的文件,这时tmp.txt不见了,只剩下  list.txt,里面的内容如下(为什么会酱紫呢?快去查看代码吧):

在我们执行第七个选项的时候,需要在D盘下重新新建一个文本文档  tmp.txt,至于为啥,详情请参考代码,代码里面有详细的解释

我们再去查看D盘里的文件,这时tmp.txt不见了,只剩下  list.txt,里面的内容如下(为什么会酱紫呢?快去查看代码吧):

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们