赞
踩
题目
某模拟售货机模块功能描述如下:
(1)该售货机只可接收5元、10元、20元、50元、100元的纸钞。
(2)售货机中售卖的的饮料价格不等,有5元的、10元的、15元的。
(3)用户选择饮料,投入足够的钱,然后按确定按钮,售货机将送出饮料。
(4)若售货机没有零钱找,则一个显示[零钱找完]的红灯亮,投入的钱将会全额退出,饮料不会送出来。
(5)若有零钱找,则显示[零钱找完]的红灯灭,在送出饮料的同时退还多余的钱。
(6)当用户取消交易时,应最大可能还原到初始状态(注意:需要确定什么情况下,交易不可取消)
注意:
(1)此售货机的工作过程要求模拟实物实现,找零的过程不同于电子支付,该售货机需要根据实物货币判断是否有零钱找,若需要找零,应给出找零的方案。同样,投币的过程也是模拟实物的方式,而不同于电子支付。
(2)不合要求的货币将不予接纳。
(3)该售货机的使用规程是:
投币的过程可以设计为循环不断投币,或者:也可以设计为一次性投币。
先投币,然后选择饮料的种类;或者:先选择饮料,后投币;
每笔交易可以选择多个饮料; 或者:每笔交易只可选择一个饮料。
当售货机中无零钱的时候,可以投币和选择饮料吗?
当交易不成功的时候,退出的货币是用户刚投入的,还是零钱箱中的?
… 还有些细节,可以仔细思考一下哦
以上规程,你可以自选,但需要在算法描述中说明。
这个编码并没有设计到很复杂的代码量,或者说涉及到很复杂的代码思维,思路。以及很难的算法设计。
首先:我编写了一个Cin()的函数出来了;里面是机器里面原有的零签数目和输入的金钱数目;
如何:我编写了一个ChooseDrink()的函数,主要是为了记录自己的饮料的种类和树目;
在写的过程中,我是先写一部分开始运行,再测试,运行;如何发现自己还是需要写一个Show函数出来来展现自己的零钱;然后就编写了一个Show函数;我把相应的规律加入进去;
比如:在机器里面原有的零钱数就要展现出来;
运行截图:
然后:在当你投入零钱数之后,相应的机器里面的零钱数会发生改变;
这个情况也要记录下来;
再就是自己的IsSmallchange();判断是否有零钱找的函数;纠结了好久怎么去写找零方案,之前想的特别复杂,不好动笔,其实转换思路之后发现;其实只用5层for循环就可以解决了;最后零钱的找零方案就出来了。然后再用一些真假值去判断就好了。就可以弄出相应的自己想要的东西。最后,我没有写菜单;之后要运行截图的时候才发现,要运行菜单;所以要加入了一个菜单进去了。然后实现了退出功能,也不知道写的好不好,尽量去写了。很不错了,嘿嘿。
PAD:
这是对此题目的PAD图的画法;画的不是很好,还请指正;
#include <cstdio> #include <cctype> #include <iostream> using namespace std; int Drink[] = {5, 10, 15}; int Smallchange[5]; //零钱数; int CategoryofSmallchange[] = {5, 10, 20, 50, 100}; //零钱总数种类; int Sumofdrink = 0; //饮料钱总数; int SmallSum = 0; //零钱总数; int Sum = 0; //输入的零钱总数; void ShowSmallchange() {//展示零钱里面种类和总【【数 cout << "-------------------------------------------------------\n"; cout << "零钱种类 "; for (int i = 0; i < 5; i++) { cout << CategoryofSmallchange[i] << " "; } cout << endl; //输出零钱种类里面的总数; cout << "种类数目 "; for (int i = 0; i < 5; i++) { cout << Smallchange[i] << " "; } cout << endl << endl; } void Cin() { //输入:机器里面有的零钱; //机器里面的种类有:5,10,20,50,100;用于判断之后是否有零钱找; cout << "请准备输入机器里面的总零钱数!\n"; //i表示5,10,20,50,100; for (int j = 0; j < 5; j++) {//j表示i对应的个数; cout << "Smallchange:" << CategoryofSmallchange[j] << endl; cout << "请输入机器里面的零钱数:" ; cin >> Smallchange[j]; SmallSum += CategoryofSmallchange[j] * Smallchange[j]; } cout << "零钱总数:" << SmallSum << endl; ShowSmallchange(); //输入:直到输入到我想要的金额; //输入的金额要种类要统计起来; int money, x; cout << "请输入你想投入的金额:"; cin >> money; do { cout << "请输入你投入的金额:"; cin >> x; Sum += x; if (x != 5 && x != 10 && x != 20 && x != 50 && x != 100) { cout << "投入的零钱不正确!\n"; cout << "吐出投入的不正确的零钱。\n"; Sum -= x; } if (5 == x) //机器里面的零钱总数增加; { Smallchange[0]++; }else if (10 == x) { Smallchange[1]++; }else if (20 == x) { Smallchange[2]++; }else if (50 == x) { Smallchange[3]++; }else if (100 == x) { Smallchange[4]++; } }while (Sum < money); cout << "Sum的总金额:" << Sum << endl; } void ChooseDrink() { //每笔交易可以选择多个饮料; cout << "请输入选择饮料的个数"; int drink, account; cin >> account; int i = 0, Sum_x = 0; //Smallchange的零钱数是:5,10,20,50,100; do { int x; //请输入你需要饮料种类中的个数 cout << "Drink钱数为:" << Drink[i] << " "; cout << "请输入你需要此饮料的个数:"; cin >> x; Sumofdrink += Drink[i] * x; i++; Sum_x += x; } while (Sum_x < account); cout << "购买饮料所需总金额:" << Sumofdrink << endl; } int ok = true; void PlaneChange() { //找零方案; int Sumofchange = Sum - Sumofdrink; int Sumofneed = 0; //需找零; cout << "需找零数目为:" << Sumofchange << endl; if (Sumofchange < 0) { cout << "投入的零钱数不足!\n请重新操作!!\n"; } else if (Sumofchange == 0) { cout << "无需找零,正在给您送出饮料!!!\n"; } else{ //看零钱库里面是否有零钱可找; for (int a = 0; a <= Smallchange[0] ; a++) { for (int b = 0; b <= Smallchange[1] ; b++) { for (int c = 0; c <= Smallchange[2] ; c++) { for (int d = 0; d <= Smallchange[3] ; d++) { for (int e = 0; e <= Smallchange[4] ; e++) { if (a * CategoryofSmallchange[0] + b * CategoryofSmallchange[1] + c * CategoryofSmallchange[2] + d * CategoryofSmallchange[3] + e * CategoryofSmallchange[4] == Sumofchange) { cout << " " << CategoryofSmallchange[0] << "的数目为:" << a << endl; cout << CategoryofSmallchange[1] << "的数目为:" << b << endl; cout << CategoryofSmallchange[2] << "的数目为:" << c << endl; cout << CategoryofSmallchange[3] << "的数目为:" << d << endl; cout << CategoryofSmallchange[4] << "的数目为:" << e << endl; cout << endl; ok = false; } } } } } } if (ok == false) { ok = true; }else { ok = false; } } } void IsSmallchange() {//判断机器里面是否有零钱找; //假设机器里面有零钱找; //输入的钱数目减去饮料的总钱数和机器里面的总零钱数进行对比;得到找零方案; PlaneChange(); if (ok) { cout << "机器准备找出零钱和饮料,请等待!!!\n"; //找出零钱种类的算法; cout << "此时机器里面有零钱找;且红灯灭" ; cout << endl; } else { cout << "机器里面没有足够的零钱去找给您;我们将退还给您零钱!!!\n"; cout << "此时机器里面没有零钱找;且红灯亮" ; cout << endl; } } int main() { Cin(); char chioce; cout << "菜单展示:\n"; cout << "C Q >\n"; do { cin >> chioce; chioce = toupper(chioce); switch (chioce) { case 'C': ChooseDrink(); ShowSmallchange(); IsSmallchange(); break; case 'Q': cout << "退出;"; break; default : cout << "退出购买;"; break; } }while(chioce != 'Q'); return 0; }
下面是找零方案:
再就是退出功能了哈;
只要Q就可以啦;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。