C语言销售管理系统
凉哈哈 人气:0某公司有四个销售员(编号: 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,里面的内容如下(为什么会酱紫呢?快去查看代码吧):
加载全部内容