北京联合大学c语言实训商店商品管理信息系统Word文档下载推荐.docx
《北京联合大学c语言实训商店商品管理信息系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北京联合大学c语言实训商店商品管理信息系统Word文档下载推荐.docx(63页珍藏版)》请在冰豆网上搜索。
2.进入子菜单,并编辑商品信息。
例如,向商品档案添加新商品,删除原有商品,处理员有商品的新进货量、新销售量、报废量。
在子菜单中选择4,返回主菜单;
选择0,退出整个系统。
3.统计销售额情况。
在此项中统计每种商品的销售额、剩余数、毛利(毛利=销售额-进价×
销售量)。
4.进入子菜单,并查询商品信息。
如根据品名、剩余数(小于5大于20)进行查询。
在子菜单中选择3,返回主菜单;
5.进入子菜单,并显示商品信息。
显示方式有3种,即按原来商品顺序显示、按销售额从高到低的顺序显示、按毛利从高到低的顺序显示,由于商品较多,所以要求分屏显示。
在子菜单选择4,返回主菜单;
6.创新功能——给商品分类。
7.主菜单中选择0:
显示结束信息(如“感谢使用本软件!
已正常退出,按任意键结束。
”),按任意键后,退出本系统。
3.任务分工:
(1):
编辑商品信息;
创新功能:
给商品分类的主函数、给商品分类中的按生活用品分。
(2)郭欣桐:
创建商品档案、查询商品信息;
给商品分类中的按食品分。
(3)胡岩松:
统计销售情况、显示商品信息;
给商品分类中的按学习用品分。
注:
流程图与实训报告由三个人共同分担完成。
第2部分设计实训题目功能
1.总体设计:
(1)模块设计:
如下图菜单:
-------------------------------
|请输入选项编号(0-6)|
|1——创建商品档案|
|2——编辑商品信息|
|3——统计销售情况|
|4——查询商品信息|
|5——显示商品信息|
|6——创新功能|
|0——退出系统|
--------------------------------
****************************************
|请输入选项编号(0-4)|
|1——添加新商品|
|2——删除原有商品|
|3——修改原有商品信息|
|4——返回|
*****************************************
|请输入选项编号(0-3)|
|1——按品名查询|
|2——按剩余数查询|
|3——返回|
|1——按原来顺序显示|
|2——按销售额高低显示|
|3——按毛利高低显示|
(2)定义各函数的主要功能:
①主函数:
将需要的函数都放在主函数中,当需要不同的函数的时候便可用主函数调用不同的函数,运用主函数可以方便调用其它函数。
②创建商品档案函数:
向原有商品档案中添加新的商品以及有关信息。
③编辑商品信息函数:
可以添加新商品、删除原有商品、修改原有商品信息。
④统计销售情况函数:
可以统计每种商品的销售额、剩余数、毛利。
⑤查询商品信息函数:
可以查询商品信息,分为按品名查询、按剩余数查询。
⑥显示商品信息函数:
可以显示出商品信息,按原来顺序显示、按销售额高低显示、按毛利高低显示。
⑦创新功能函数:
给商品分类——可以将商品分为3类,按生活用品分类、按食品分类、按学习用品分类。
(3)程序模块图:
2.算法设计:
(1)显示子菜单。
用printf函数将菜单项一项项地打印到屏幕上,界面中的边框可以通过多个printf语句输出的“|”和“-”拼接起来。
(2)菜单项的选择。
菜单应根据用户的选择做出不同的反应,因此需要使用分支结构实现选择选项的功能。
鉴于目前仅仅是做主菜单,还不能实现各菜单项的具体功能,因此该程序中暂时根据用户的选择,输出对应菜单的编号。
根据题意,主菜单含有7个菜单项,属于多分支条件判断,使用带break的switch语句最为合适。
需要注意的是,还要处理当用户输入错误时的情况。
(3)重复显示主菜单。
因为本实例具有重复选择主菜单的功能,因此需要使用循环结构。
在本实例中主菜单至少显示一次,然后才判断是否继续选择主菜单,所以使用do-while循环比较好,因为do-while循环是先执行循环体,然后在判断表达式。
作为菜单,应该给用户一个正常的出口,即满足一定条件时退出程序。
为了给用户提供方便,我们采用人机对话形式,当用户选择某一菜单项后,系统立即完成相应的功能,然后询问用户是否需要继续选择,只要用户选择继续(输入y或Y),主菜单就在屏幕上反复出现,只有单用户选择不再继续(输入n或N)时,才可以退出主菜单。
除此之外,为了使用方便,在主菜单中还特设0选项,选择它也能正常退出程序。
为了实现上述功能,有关语句都应放在do-while循环体中。
设计算法时应考虑如何时程序具有容错能力。
例如,当用户在应答是否继续时,如果输入的是合法数据(即y、Y、n或N),则程序继续下一步操作;
如果输入的是非法数据(即y、Y、n或N以外的字符),则应让用户重新输入,这时需要在是否继续的问题上加一个循环判断,这种功能常用do-while实现。
(4)流程图(如下图所示):
主模块流程图
创建商品档案模块的流程图
编辑商品信息模块的流程图
添加新商品模块的流程图
删除原有商品模块的流程图
修改原有商品信息流程图
统计销售情况的流程图
查询商品信息的流程图
按品名查询流程图
按剩余数查询流程图
显示商品信息流程图
按原来顺序显示模块的流程图
按销售额高低显示的流程图
按毛利高低显示的模块
创新功能流程图
按生活用品分类流程图
按食品和学习用品分类似
3.数据结构:
structgoods
{charbh[10];
charpm[30];
floatjj;
floatsj;
intjhl;
intxsl;
floatxse;
intsys;
floatml;
};
此结构体为存放商品信息,编号bh[10],商品名pm[30],进价jj,售价sj,进货量jhl,销售量xsl,销售额xse,剩余数sys,毛利ml.
4.程序代码设计:
voidmycreate()
{inti=1;
floatx,y,z,t;
structgoodstemp={0};
FILE*fp=NULL;
fp=fopen("
d:
\\cwz\\goods.txt"
"
w"
);
if(fp==NULL)
{printf("
\n打开文件夹失败!
\n"
return;
}
system("
cls"
printf("
\n请输入第1个记录:
编号(用#结束输入):
"
do
{gets(temp.bh);
}while(strcmp(temp.bh,"
)==0);
品名(用#结束输入):
gets(temp.pm);
进价(用#结束输入):
scanf("
%f"
&
x);
temp.jj=x;
售价(用#结束输入):
y);
temp.sj=y;
进货量(用#结束输入):
%d"
temp.jhl);
销售量(用#结束输入):
temp.xsl);
销售额(用#结束输入):
z);
temp.xse=z;
剩余数(用#结束输入):
temp.sys);
毛利(用#结束输入):
t);
temp.ml=t;
while(temp.bh[0]!
='
#'
&
temp.pm[0]!
)
{fprintf(fp,"
%4s%12s%8.1f%8.1f%8d%8d%8.1f%8d%8.1f\n"
temp.bh,temp.pm,
temp.jj,temp.sj,temp.jhl,temp.xsl,temp.xse,temp.sys,temp.ml);
i++;
printf("
\n请输入第%d个记录:
i);
do
{gets(temp.bh);
}while(strcmp(temp.bh,"
gets(temp.pm);
scanf("
temp.jj=x;
temp.sj=y;
temp.xse=z;
temp.ml=t;
}
fclose(fp);
voidmyedit()
{charchoose='
\0'
yes_no='
;
{
myprint1();
choose=getch();
switch(choose)
{case'
1'
:
myadd();
break;
case'
2'
mydelete();
3'
mymodify();
4'
return;
0'
exit(0);
default:
\n%c为非法选项!
choose);
}
if(choose=='
)break;
\n要继续选择吗(Y/N)?
{
yes_no=getche();
}while(yes_no!
Y'
&
yes_no!
y'
N'
n'
}while(yes_no=='
||yes_no=='
voidmyadd()
{
charc='
intn=0;
structgoodstemp={0},record[N]={0},*p=NULL;
r"
\n打开文件失败!
p=record;
原有商品信息为:
while(feof(fp)==0)
{fscanf(fp,"
%s%s%f%f%d%d%f%d%f"
p->
bh,p->
pm,&
x,&
y,&
p->
jhl,&
xsl,&
z,&
sys,&
pm,x,y,p->
jhl,p->
xsl,z,p->
sys,t);
p->
jj=x;
sj=y;
xse=z;
ml=t;
p++;
n++;
getchar();
\n请输入新记录的编号:
}while(strcmp(temp.bh,"
请输入新记录的品名:
gets(temp.pm);
请输入新记录的进价:
temp.jj);
请输入新记录的售价:
temp.sj);
请输入新记录的进货量:
请输入新记录的销售量:
请输入新记录的销售额:
temp.xse);
请输入新记录的剩余数:
请输入新记录的毛利:
temp.ml);
for(p=record;
p<
record+n;
p++)
if(strcmp(temp.bh,p->
bh)==0)
{printf("
编号重复,要重新输入吗(Y/N)?
do
{c=getche();
}while(c!
c!
putchar('
/n'
break;
if(p==record+n){*p=temp;
break;
}while(c=='
||c=='
for(p=record;
record+n+1;
fprintf(fp,"
pm,p->
jj,p->
sj,p->
xsl,p->
xse,p->
sys,p->
ml);
voidmydelete()
\n按商品编号删除(b),还是按品名删除(p)?
c=getche();
if(c=='
b'
B'
)del_bh();
elseif(c=='
p'
P'
)del_pm();
elseprintf("
\n非法字符!
voiddel_bh()
chartempbh[10]="
structgoodsrecord[N]={0},*p=NULL,*k=NULL;
pm,
&
jj=x,p->
sj=y,p->
x,y,p->
\n请输入要删除的商品编号:
gets(tempbh);
for(k=record;
k<
k++)
if(strcmp(tempbh,k->
bh)==0)break;
if(k<
record+n)
{for(p=k;
k+n-1;
*p=*(p+1);
record+n-1;
else
\n无此商品!
fp=fopen("
if(fp==NULL)
fprintf(fp,"
fclose(fp);
voiddel_pm()
chartemppm[10]="
%4s%12s%8.1f%8.1f%8d%10d%10.1f%8d%10.1f\n"
\n请输入要删除的商品名:
gets(temppm);
if(strcmp(temppm,k->
pm)==0)
if(