N
Y
if(strcmp(sada[i].salman.ID,ID)==0)
在屏幕输出他的相关销售数据,flag=1
if(flag==0)输出"Thenumberisnotexist!
"
save()
图2.5查询数据流程图
3代码编写
3.1源程序
/*#include/*I/O函数*/
#include/*其他说明——主要是为了应用exit()函数*/
#include*//*屏幕操作函数*/
intINDEX[32];
structgoods{/*声明货物数据结构体类型*/
intid;
intprice;
intSM1,SM2,SM3;
charname[21];
}goods[32];
3.2Page_title()函数/*主界面函数*/
voidpage_title(char*menu_item){
clrscr();
printf("********SalesManagementSystem********\n\n-%s-\n\n",menu_item);
}///*界面显示*/
3.3return()函数/*返回函数*/
voidreturn_confirm(void){
printf("\npressanykeyreturntomenu\n");/*按任意键返回*/
getch();
}//
3.4goods()函数
voidgoods_new(void){/*货物销售记录新建*/
intn;
page_title("insertgoodsinformation");
for(n=0;n<32;n++)
if(goods[n].id==0)break;
printf("NO:
");/*输入记录*/
scanf("%d",&goods[n].id);
printf("NAME:
");
scanf("%s",&goods[n].name);
printf("price:
");
scanf("%d",&goods[n].price);
return_confirm();
}//
intsearch_id(void){/*通过编号搜索货物记录*/
intn,i;
printf("Pleaseinputgoodsnumber:
");
scanf("%d",&i);
for(n=0;n<32;n++)
{
if(goods[n].id==i&&goods[n].id!
=0)
{
printf("NO:
%d\n",goods[n].id);/*输入数据*/
printf("NAME:
%s\n",goods[n].name);
printf("price:
%d\n",goods[n].price);
returnn;
}
}
printf("\nInputnoerror.\n");
return-1;
}//
voidgoods_del(void){/*货物销售记录删除*/
intn;
page_title("Deletegoodsinformation");
if((n=search_id())!
=-1)
{
goods[n].id=0;
printf("\nGoodsbeendeleted.\n");/*提示删除成功*/
}
return_confirm();
}//
voidgoods_edit(void){/*货物销售记录编辑*/
intn;
page_title("Editgoodsinformation");
if((n=search_id())!
=-1)
{
printf("\nPleaseinputnewinformation:
\nNo:
");/*输入新的记录*/
scanf("%d",&goods[n].id);
printf("Name:
");
scanf("%s",&goods[n].name);
printf("Price:
");
scanf("%d",&goods[n].price);
}
return_confirm();
}//
3.4amount()函数
voidamount_input(void){/*货物销售数量输入*/
ints,n,t;
page_title("Insertsalesamount");
printf("\nPleaseselectNO\n1-SM12-SM23-SM3\n");
scanf("%d",&s);
for(n=0;n<32;n++)
{
if(goods[n].id!
=0)
{
printf("No:
%dName:
%samount:
",goods[n].id,goods[n].name);
scanf("%d",&t);
switch(s)
{
case1:
goods[n].SM1=t;break;
case2:
goods[n].SM2=t;break;
case3:
goods[n].SM3=t;break;
}
}
}
return_confirm();
}//
voidamount_edit(void){/*货物销售数量编辑*/
intn;
page_title("Editamount");
if((n=search_id())!
=-1)
{
printf("SM1:
%dSM2:
%dSM3:
%d\n",goods[n].SM1,goods[n].SM2,goods[n].SM3);
printf("\nPleaseinputnewamount:
\nSM1:
");
scanf("%d",&goods[n].SM1);
printf("SM2:
");
scanf("%d",&goods[n].SM2);
printf("SM3:
");
scanf("%d",&goods[n].SM3);
}
return_confirm();
}//
3.5sort()函数/*对销售数据进行排序整合*/
voidsort_it(charnn){
intn,m,p,x,t[32];
for(n=0;n<32;n++)
{
switch(nn)
{
case'1':
t[n]=goods[n].id;break;/*货物编号显示*/
case'2':
t[n]=goods[n].SM1;break;/*销售员销售记录的汇总与显示*/
case'3':
t[n]=goods[n].SM2;break;
case'4':
t[n]=goods[n].SM3;break;
case'5':
t[n]=goods[n].SM1+goods[n].SM2+goods[n].SM3;break;
}
}
for(n=0;n<32;n++)
{
x=0;
p=-1;
for(m=0;m<32;m++)
{
if(t[m]>x)
{
x=t[m];
p=m;
}
}
t[p]=-1;
INDEX[n]=p;
}
}//
3.6browser()函数/*浏览基本信息和销售数据*/
voidbrowser(void){
intn,x;
chark;
sort_it('1');
while
(1)
{
page_title("BROWSE");
printf("Pleaseselectthenumberofsort\n");
printf("No\tName\tPrice\tSM1\tSM2\tSM3\tsum\n");/*信息汇总与显示*/
for(n=0;n<32;n++)
{
if(INDEX[n]!
=-1)
{
x=INDEX[n];
printf("%d\t%s\t",goods[x].id,goods[x].name);/*所有信息的汇总显示*/
printf("%d\t%d\t",goods[x].price,goods[x].SM1);
printf("%d\t%d\t",goods[x].SM2,goods[x].SM3);
printf("%d\n",goods[x].SM1+goods[x].SM2+goods[x].SM3);
}
}
k=getch();
if(k<'6'&&k>'0')sort_it(k);
elseif(k=='0')break;
elsecontinue;
}
}//
3.7main()函数/*主函数*/
voidmain(void){
menu:
page_title("MENU");
printf("Pleaseinputthenumber\n\n");
printf("1INSERTGOODS\n2MODIFYGOODS\n");
printf("3DELETEGOODS\n4INPUTGOODSAMOUNT\n5MODIFYGOODSAMOUNT\n");
printf("6BROWSEGOODSINFORMATION\n0EXIT\n");
switch(getch())
{
case'1':
goods_new();break;/*输入销售货物记录*/
case'2':
goods_edit();break;/*编辑销售货物记录*/
case'3':
goods_del();break;/*删除销售货物记录*/
case'4':
amount_input();break;/*输入销售数量记录*/
case'5':
amount_edit();break;/*编辑销售数量记录*/
case'6':
browser();break;/*浏览汇总信息*/
case'0':
exit(0);/*退出*/
}
gotomenu;
}
4程序运行及调试
4.1程序调试
先进行人工检查,即静态检查。
在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。
这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多数错误。
为了更有效地进行人工检查,所编的程序应注意力求做到以下几点:
应当采用结构化程序方法编程,以增加可读性;尽可能多加注释,以帮助理解每段程序的作用;在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。
这样既易于阅读也便于调试,各函数之间除用参数传递数据这一渠道以外,数据间尽量少出现耦合关系,便于分别检查和处理。
在人工检查无误后,才可以上机调试。
通过上机发现错误称动态检查。
在编译时给出语法错误的信息,可以根据提示的信息具体找出程序中出错之处并改正之。
应当注意的是有时提示的出错并不是真正出错的行,如果在提示出错的行上找不到错误的话应当到上一行再找。
有时提示出错的类型并非绝对准确,由于出错的情况繁多各种错误互有关联,因止要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。
如果系统提示的出错信息多,应当从上到下一一改正。
有时显示出一大片出错信息往往使人感到问题严重,无从下手。
其实可能只有一二个错误。
在改正语法错误后,程序经过连接就得到可执行的目标程序。
运行程序,输入程序所需数据,就可得到运行结果。
应当对运行结果作分析。
看它是否符合要求。
有时,数据比较复杂,难以立即判断结果是否正确。
可以事先考虑好一批“试验数据”,输入这些数据可以得出容易判断正确与否的结果。
可以在计算的输出结果的程序地方加入一段输出到串口的程序,利用串口窗口可以方便看到结果的,比仿真的都好和直观。
必须考虑周全。
事实上,当程序复杂时很难把所有的可能方案全部都试到,选择典型的情况作试验即可。
运行结果不对,大多属于逻辑错误。
对这类错误往往需要仔细检查和分析才能发现。
可以采用以下办法:
1.将程序与流程图仔细对照,如果流程图是正确的话,程序写错了,是很容易发现的。
2.如果实在找不到错误,可以采用“分段检查”的方法。
在程序不同的位置设几个printf函数语句,输出有关变量的值,往下检查。
直到找到在哪一段中数据不对为止。
这时就已经把错误局限在这一段中了。
不断减小“查错区”,就可能发现错误所在。
3.也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。
当调试完毕,这些语句不要再编译了,也不再被执行了)。
这种方法可以不必一一去printf函数语句,以提高效率。
4.如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题,如有则改正之,接着修改程序。
5.有的系统还提供debug工具,跟踪流程并给出相应信息,使用更为方便。
总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于累积经验。
在程序调试过程中往往反映出一个人的水平,经验和科学态度。
希望读者能给以足够的重视。
上机调试程序的目的决不是为了“验证程序的正确”,而是“掌握调试的方法和技术”,不要一直依赖仿真器来解决,要学会自己找问题,这样慢慢自己就会写出错误较少的实用的程序。
4.2运行与测试
4.2.1主菜单显示界面
图4.1主菜单界面
输入1则执行输入产品数据的功能
输入2则执行修改产品数据的功能
输入3则执行删除产品数据的功能
输入4则执行输