图书超市收银系统的购书结算处理功能设计

在本节中,我们将以图书超市收银系统的购书结算处理功能设计为例,对本章的内容进行详细地解释。

图书超市收银系统的购书结算处理功能设计

首先,用户在图书超市收银系统的主菜单中选择2.购书结算处理,则进入下一级子菜单:

int ch;

scanf(“%d”,&ch);   

switch(ch)

{

case '2':

system("cls");

printf("购书结算处理\n");

printf("1.会员登陆”);

printf("2.非会员进入");

printf("0.返回");

printf("\n请输入您要进行的操作:");

}

这里,我们需要用户选择,该用户是否是会员,如果是会员,则购书会有折扣,否则,按照原价结算。

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会员的判断和会员购书的结算功能这两个函数的具体实现,就留待读者思考与实现。