C语言程序设计销售管理系统.docx
《C语言程序设计销售管理系统.docx》由会员分享,可在线阅读,更多相关《C语言程序设计销售管理系统.docx(34页珍藏版)》请在冰豆网上搜索。
C语言程序设计销售管理系统
程序设计工程训练报告
销售管理系统设计
课程名称C语言程序设计工程训练
姓名
院(系)信息科学与工程学院
专业班级
学号
指导教师
教务处制
1需求分析
某公司有四个销售员(编号:
1-4),负责销售五种产品(编号:
1-5)。
每个销售员都将当天出售的每种产品各写一张便条交上来。
每张便条包含内容:
1)销售员的代号,2)产品的代号,3)这种产品的当天的销售额。
每位销售员每天上缴1张便条。
试设计一个便条管理系统,使之能提供以下功能:
1、系统以菜单方式工作
2、便条信息录入功能(便条信息用文件保存)--输入
3、收集到了上个月的所有便条后,读取销售情况
1)计算每个人每种产品的销售额。
2)按销售额对销售员进行排序,输出排序结果(销售员代号)
3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果(需输出产品的代号和销售额)
4)删除便条.
5)对所有便条打印.
2系统总框图和功能模块说明
2.1系统总框图
图1系统总框图
2.2功能模块说明
初始化模块完成储存信息文件的创建。
读取模块完成对储存数据的读取。
输入模块完成便条数据输入和储存。
统计模块完成对每个人每种产品总销售量的统计、对各种产品销售量统计、对每个销售员总销售量的统计。
排序模块完成各种产品销售总量的排名及输出,完成销售员销售总量的排名及输出。
菜单模块完成菜单的打印。
选择模块完成功能的选择。
删除模块完成边条删除
打印模块完成所有便条的打印
3系统设计
3.1主要结构体
structProduct
{intcount;/*记录每人每种产品的便条数*/
intnum;/*编号*/
intsale[31];/*用于储存每次输入的产品销售量*/
intzsale;/*记录每个人每种产品的销售总额*/
structSeller
{charname[15];/*记录员工姓名*/
intnum;/*记录员工代号*/
intsale;/*记录每人所有产品的总销售额*/
structProductproduct[5];/*记录员工旗下的五个产品*/
}seller[4];
};
3.2主要功能函数
voidchushihua(void);/*对系统初始化*/
voidadd(void);/*对每个人每种产品总销售量的统计、对各种产品销售量统计、对每个销售员总销售量的统计。
*/
intread(void);/*读取数据*/
voidarrange(inta[],intn,intsign[]);/*销售量排序及排名,内置函数*/
voids_arrange(void);/*对销售员销售量排序及排名*/
voidp_arrange(intsale[]);/*对每种产品总销售量的排序及排名*/
voidinput(void);/*完成便条的输入和储存*/
voidmenu(void);/*完成菜单的打印*/
voidchoice(void);/*完成功能模块的选择*/
voidbianhao(void);/*对销售员和产品的编号赋值及计算量置0*/
voiddelect(void);/*删除便条*/
voidshow(show);/*打印所有便条*/
3.3关键函数的流程图
下面这个是选择法排序的程序框图,同时将销售员代号或产品代号也加进去排序,写这个比写个程序艰难得多。
这也只是根据自己的理解写出来的,不知道是否正确。
voidarrange(void)函数的程序框图
4系统调试
初始化时的界面
D盘根目录文件写入状况
菜单如下
选择1输入便条
询问是否继续输入
继续依次写入3,2,1004,5,200,3,5,2302,1,1402,5,1201,2,3202,4,200后文本储存状况
选择3时对销售员销售额排名。
销售员2销量:
200+120+200=520销售员3销量:
100+230=330销售员1销量:
320销售员4销量:
200
选择4时对产品销售排
由上面文件储存状况中可计算:
产品5总量=200+230+120=550产品2总量=100+320=420产品3总量=200产品4总量=200产品1总量=0
选择2为删除便条功能删除了2,5,120
现在文件储存状况
选择5是对所有便条打印
也可以手工在d:
\\a.txt中添加便条(格式为:
员工号(tab)产品号(tab)销售量(回车))手工添加351204210032150后文本储存状况
对其输出
下面两个图片是演示插入便条时排错功能
初始化时什么也不输入,程序会排除空文件时读取时错误并重新初始化,下面两个图片演示了这一功能
5总结
一、这个是我测试菜单时写的测试函数。
#include
main()
{voidmenu(void);
voidchoice(void);
menu();
choice();
getch();
}
voidmenu(void)
{
printf("**************************************************\n");
printf("**\n");
printf("*1.输入便条*\n");
printf("*2.按销售额对销售员排序并输出*\n");
printf("*3.统计每种产品的总销售额并排序输出*\n");
printf("*0.退出*\n");
printf("**\n");
printf("**************************************************\n");
}
voidchoice(void)
{
intchoice;
printf("输选择(0~3)\n");
while(scanf("%d",&choice)!
=1||(choice<0||choice>3))
{
while(getchar()!
='\n')
continue;/*此处*/
printf("输入有误,请重新输入0~3\n");
}
switch(choice)
{case1:
printf("111");break;
case2:
printf("222");break;
case3:
printf("333");;break;
case0:
printf("000");;break;
default:
printf("****");break;
}
}
刚开始时没有写程序中注释的那句,导致输入的选择为一个字符串时printf()执行多次。
此句可以吃掉错误输入的字符。
二、这是读取函数。
intread(void)
{FILE*fp;
inti,j,pnum,snum,sale;
if((fp=fopen("d:
\\a.txt","r"))==NULL)
{
printf("读取失败!
初始化\n");
return0;
}
for(i=0;i<4;i++)
{seller[i].num=i+1;
for(j=0;j<5;j++)
seller[i].product[j].num=j+1;
}
fscanf(fp,"%s%s%s%s",seller[0].name,seller[1].name,seller[2].name,seller[3].name);
while(!
feof(fp))
{
fscanf(fp,"%d%d%d\n",&snum,&pnum,&sale);/*此处*/
seller[snum-1].product[pnum-1].count++;
seller[snum-1].product[pnum-1].sale[seller[snum-1].product[pnum-1].count-1]=sale;
}
fclose(fp);
return1;
}
写这个函数时fscanf(fp,"%s%s%s%s\n",seller[0].name,seller[1].name,seller[2].name,selle
[3].name);语句中"%s%s%s%s\n"处少了\n导致最后一条数据读取了两次,导致统计的结果不对,修改这个问题花费我很多时间。
三、voidchoice(void)
{
intchoice,i;
charb;
while(scanf("%d",&choice)!
=1||(choice<0||choice>4))
{
while(getchar()!
='\n')
continue;
printf("输入有误,请重新输入0~4\n");
}
switch(choice)
{case1:
input();
printf("你想继续输入?
(Y继续,其他退出)");
scanf("%c",&b);
getchar();/*此处*/
while(b=='y'||b=='Y')
{
input();
printf("你想继续输入?
(Y继续,其他退出)");
scanf("%c",&b);
getchar();
}
break;
case2:
delect();
printf("你想继续删除?
(Y继续,其他退出)");
scanf("%c",&b);
getchar();/*此处*/
while(b=='y'||b=='Y')
{
delect();
printf("你想继续删除?
(Y继续,其他退出)");
scanf("%c",&b);
getchar();
}
break;
case3:
clean();add();s_arrange();break;
case4:
clean();add();p_arrange(p_sale);break;
case0:
exit
(1);break;
default:
break;
}
}在程序注释处缺少了getchar();而不能吃掉scanf()读取留下的回车,导致了连续输入两次数据后程序自动关闭。
后来为了避免因错误输入而带来的影响,在其中添加了
while(getchar()!
='\n')
continue;
来去除错误输入。
下面是修改后的选择函数。
voidchoice(void)
{
intchoice,i,judge;
charb;
while(scanf("%d",&choice)!
=1||(choice<0||choice>5))
{
while(getchar()!
='\n')
continue;/*此处添加了*/
printf("输入有误,请重新输入0~5\n");
}
switch(choice)
{case1:
input();
printf("你想继续输入?
(Y继续,其他退出)");
scanf("%c",&b);
while(getchar()!
='\n')
continue;/*此处添加了*/
while(b=='y'||b=='Y')
{
input();
printf("你想继续输入?
(Y继续,其他退出)");
scanf("%c",&b);
while(getchar()!
='\n')
continue;/*此处添加了*/
}
break;
case2:
system("cls");
if((judge=delect())==1)
printf("删除成功!
");
elseif(judge==0)
printf("删除失败!
");
printf("你想继续删除?
(Y继续,其他退出)");
scanf("%c",&b);
while(getchar()!
='\n')
continue;/*此处添加了*/
while(b=='y'||b=='Y')
{
if((judge=delect())==1)
printf("删除成功!
");
elseif(judge==0)
printf("删除失败!
");
printf("你想继续删除?
(Y继续,其他退出)");
scanf("%c",&b);
while(getchar()!
='\n')
continue;/*此处添加了*/
}
break;
case3:
clean();add();s_arrange();break;
case4:
clean();add();p_arrange(p_sale);break;
case5:
show();break;
case0:
exit
(1);break;
default:
break;
}
}
四、下面这个是失败的删除函数,本想用最后一条便条覆盖要删除的便条,然后把最后那条便条删除而达到删除便条的目的。
但是下面这个函数有局限性,销售量要都为3位数才行。
voiddelect(void)
{inta,b,c,e,f,g,d[3];
chark[4][10];
charyes;
FILE*fp;
if((fp=fopen("d:
\\a.txt","r+"))==NULL)
{
printf("打开文件失败!
");
getch();
exit(0);
}
fscanf(fp,"%s%s%s%s",k[0],k[1],k[2],k[3]);
loop:
printf("请输入要删除的边条:
(格式:
员工号,产品号,销售量)\n");
scanf("%d,%d,%d",&a,&b,&c);
fseek(fp,-10,2);
fscanf(fp,"%d%d%d\n",&d[0],&d[1],&d[2]);
rewind(fp);
fscanf(fp,"%s%s%s%s",k[0],k[1],k[2],k[3]);
while(!
feof(fp))
{
fscanf(fp,"%d%d%d\n",&e,&f,&g);
if(e==a&&f==b&&g==c)
{
printf("%d%d%d\n",e,f,g);
fseek(fp,-9,1);
fprintf(fp,"%d\t%d\t%d",d[0],d[1],d[2]);
printf("删除成功!
");
fseek(fp,-9,2);
fprintf(fp,"%c\t%c\t%c\t%c%c%c",'','','','','','');
getch();
fclose(fp);
exit
(1);
}
}
printf("该便条不存在!
重新输入请输入Y,退出删除按其他。
\n");
while(scanf("%d",&yes)!
=1)
{
while(getchar()!
='\n')
continue;
printf("输入有误,重新输入请输入Y,退出删除按其他。
\n");
}
if(yes=='y'||yes=='Y')
gotoloop;
else
exit
(1);
}
为了解决这问题,我重做了函数。
下面这个是在创建另一个文件接收便条,从储存便条的文件中读取便条然后写入新建文件,读取过程中忽略要删除的便条从而达到删去便条的目的。
voiddelect(void)
{intcount=0,a,b,c,e,f,g,name[4][10];
FILE*fp,*fp_1;
if((fp=fopen("d:
\\a.txt","r+"))==NULL)
{
printf("打开a.txt文件失败!
");
exit(0);
}
if((fp_1=fopen("d:
\\b.txt","w"))==NULL)
{
printf("打开b.txt文件失败!
");
exit(0);
}
fscanf(fp,"%s%s%s%s\n",name[0],name[1],name[2],name[3]);
fprintf(fp_1,"%s\t%s\t%s\t%s\n",name[0],name[1],name[2],name[3]);
printf("请输入要删除的便条:
(格式:
员工号,产品号,销售量)\n");
scanf("%d,%d,%d",&a,&b,&c);
getchar();
while(!
feof(fp))
{
fscanf(fp,"%d%d%d\n",&e,&f,&g);
if(e==a&&f==b&&g==c&&count!
=1)
{
count++;
continue;
}
fprintf(fp_1,"%d\t%d\t%d\n",e,f,g);
}
fclose(fp);
remove("d:
\\a.txt");
fclose(fp_1);
rename("d:
\\b.txt","d:
\\a.txt");
}
6源程序清单
#include
#include
intp_sale[5]={0,0,0,0,0};/*记录每种产品的总销售额*/
structProduct
{intcount;/*记录每人每种产品的便条数*/
intnum;
intsale[31];/*输入每次的销售量*/
intzsale;/*记录每个人每种产品的销售总额*/
};
structSeller
{charname[15];
intnum;
intsale;/*记录每人所有产品的总销售额*/
structProductproduct[5];
}seller[4];
/*主函数*/
voidmain()
{
voidchushihua(void);
voidclean(void);
voidshow(void);
voidadd(void);
intdelect(void);
intread(void);
voidarrange(inta[],intn,intsign[]);
voids_arrange(void);
voidp_arrange(intsale[]);
voidinput(void);
voidmenu(void);
voidchoice(void);
voidbianhao(void);
system("color0e");
bianhao();
if(read()==0)
chushihua();
while
(1)
{
menu();
choice();
printf("按任意键返回菜单。
");
getch();
system("cls");
}
getch();
}
/*读取函数*/
intread(void)
{FILE*fp;
inti,j,pnum,snum,sale;
if((fp=fopen("d:
\\a.txt","r"))==NULL)
{
printf("读取失败!
初始化\n");
return0;
}
if(getc(fp)==EOF)/*排除空文件时读取错误*/
{
fclose(fp);
remove(fp);
printf("文件为空,重新初始化!
\n");
chushihua();
return1;
}
for(i=0;i<4;i++)
{seller[i].num=i+1;
for(j=0;j<5;j++)
seller[i].product[j].num=j+1;
}
fscanf(fp,"%s%s%s%s",seller[0].name,seller[1].name,seller[2].name,seller[3].name);
while(!
feof(fp))
{
fscanf(fp,"%d%d%d\n",&snum,&pnum,&sale);
seller[snum-1].product[pnum-1].count++;
seller[snum-1].product[pnum-1].sale[seller[snum-1].product[pnum-1].count-1]=sale;
}
fclose(fp);
return1;
}
/*初始化函数*/
voidchushihua(void)
{FILE*fp;
inti,j;
fp=fopen("d:
\\a.txt","w");
for(i=0;i<4;i++)
{seller[i].num=i+1;
for(j=0;j<5;j++)
seller[i].product[j].num=j+1;
}
printf("分别输入编号为1-4员工的名字(格式为姓名回车):
\n");
for(i=0;i<4;i++)
scanf("%s",seller[i].name);
system("cls");
fprintf(fp,"%s\t%s\t%s\t%s\n",seller[0]