C语言程序设计销售管理系统.docx

上传人:b****5 文档编号:3268771 上传时间:2022-11-21 格式:DOCX 页数:34 大小:504.73KB
下载 相关 举报
C语言程序设计销售管理系统.docx_第1页
第1页 / 共34页
C语言程序设计销售管理系统.docx_第2页
第2页 / 共34页
C语言程序设计销售管理系统.docx_第3页
第3页 / 共34页
C语言程序设计销售管理系统.docx_第4页
第4页 / 共34页
C语言程序设计销售管理系统.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

C语言程序设计销售管理系统.docx

《C语言程序设计销售管理系统.docx》由会员分享,可在线阅读,更多相关《C语言程序设计销售管理系统.docx(34页珍藏版)》请在冰豆网上搜索。

C语言程序设计销售管理系统.docx

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]

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 制度规范

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1