
在本节中,我们将以图书超市收银系统的购书结算处理功能设计为例,对本章的内容进行详细地解释。
首先,用户在图书超市收银系统的主菜单中选择2.购书结算处理,则进入下一级子菜单:
int ch;
scanf(“%d”,&ch);
switch(ch)
{
case '2':
system("cls");
printf("购书结算处理\n");
printf("1.会员登陆”);
printf("2.非会员进入");
printf("0.返回");
}
这里,我们需要用户选择,该用户是否是会员,如果是会员,则购书会有折扣,否则,按照原价结算。
int ch2;
scanf(“%d”,&ch2);
if(ch2=='0')
break;
system("cls");
if(ch2=='1')
{
if(isVIP()) //判断是否VIP会员
{
if(Checkout(book,0.5)) //按折扣结算
{
system("cls");
printf("购买成功\n”);
system("pause");
break;
}
}
}
else
{
if(Checkout(book)) //非会员,正常结算
{
system("cls");
printf("购买成功\n”);
system("pause");
break;
}
}
}
}
在这里,我们调用isVIP()函数来判断该用户是否具有会员资格,该函数的原型设计为:
boolisVIP()
该函数本身不接受参数,而判断是否是VIP会员的过程,在函数体中实现,我们需要在isVIP函数中接收客户输入的用户名和密码,来判断客户是否是VIP会员,如是,返回真,否则返回假。这一部分功能,请读者思考实现。
在判断客户是否是VIP会员之后,我们调用了Checkout来进行购书结算。这是一个重载的函数,无论客户是否是VIP会员,我们都是调用同样的函数来结算,只不过对于VIP会员来说,会调用带有一个折扣的参数的Checkout函数。Checkout函数的原型如下:
double Checkout(Book book[100]) //非会员
double Checkout(Book book[100],float Percent) //会员
Checkout函数返回值为double类型,它计算购书的总价格,因此,一个必不可少的参数则是Book book[100]——库存图书的清单,代表有哪些书是可以购买的。此外,如果是VIP会员,我们需要给出VIP会员所能享受的折扣float Percent。
我们以非会员的购书结算为例,看看Checkout函数是如何实现的:
double Checkout(Book book[100])
{
double sum=0;
for(;;)
{
system("cls");
char in_ISBN[14]; //图书编号
bool k=false;
printf("非会员结账\n");
printf("请输入你要购买的图书编号:");
我们需要客户输入需要购买的图书编号:
scanf(“%s”,in_ISBN);
查找图书库,匹配图书库中是否有用户想要购买的书:
for(inti=0;i<100;i++)
{
if(!strcmp(book[i].ISBN,in_ISBN))
发现书库中某本书与客户欲购买的图书编号一致,即:书库中存在该书,那么我们要求客户输入购买的数量,并打印出购书清单与总金额。
{
printf("请输入购买数量:";
intin_buy;
scanf(“%d”,&in_buy);
book[i].buy+=in_buy;
printf("编号\t书名\t价格\t作者\t出版社\t数量");
for(int j=0;j<counter;j++)
{
if(book[j].buy!=0)
{
printf(“%s\t”,book[j].ISBN);
printf(“%s\t”,book[j].Name);
printf(“%f\t”,book[j].Price);
printf(“%s\t”,book[j].Author);
printf(“%s\t”,book[j].publish);
printf(“%d\t”,book[j].buy);
}
}
printf("-----------------------------------\n");
sum+=book[i].Price*book[i].buy;
printf("结账信息总价格:%f\n",sum);
k=true;
break;
}
}
如果书库中不存在客户指定的书,那么系统需要告诉客户错误的信息,让用户选择是否继续购买。
if(!k)
{
printf("未发现该书籍\n");
printf("是否继续选择图书?Y/N\n";
char opt;
scanf(“%c”,&opt);
if(opt=='n'||opt=='N')
return0;
continue;
}
客户选择了一本书之后,提升客户是否继续购买,如购买,则回到循环初始处,输入下一个图书编号,如不继续购买,则询问是否结账。
printf("是否继续选择图书?Y/N\n";
char opt;
scanf(“%c”,&opt);
if(opt=='n'||opt=='N')
{
printf("确认结账?Y/N\n");
char opt;
scanf(“%c”,&opt);
如果用户选择不结帐,那么本次购买取消,将购书清单中所有书的数量清空,函数结束返回。
if(opt=='n'||opt=='N')
{
for(int j=0;j<counter;j++)
{
book[j].buy=0;
}
return 0;
}
如用户确认结账,那么我们调用savedata函数将本次购书的历史记录保存下来,购书结束,正常返回。
savedata(book,sum);
return 1;
}
}
}
至此,我们将购书结算这一部分功能做出了详细解释,VIP会员的判断和会员购书的结算功能这两个函数的具体实现,就留待读者思考与实现。