当前位置:   article > 正文

软件工程:模拟售货机模块功能实验

软件工程:模拟售货机模块功能实验

软件工程:模拟售货机模块功能实验

题目

某模拟售货机模块功能描述如下:
(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209

运行案例

(1)比如:用户一次投入10元货币,选择一个5元饮料,按确定,售货机 此时没有零钱找,那么,会有什么输出

在这里插入图片描述

(2)比如:用户投入5元,然后又投入5元,然后选择一个10元的饮料,售货机 此时有零钱,那么……

在这里插入图片描述

(3)再比如:用户选择一个5元饮料,然后选择数量3,确定,然后提示需投币15元,用户投入100元,然后找零50元1张,20元1张,10元1张,5元1张,(也可能是5元17张),出饮料。

在这里插入图片描述
下面是找零方案:在这里插入图片描述

(4)比如:用户投币后,选择饮料,但是没有按确定,而是选择了取消,则退出投入的货币(注意:退出的货币是用户投入的,还是零钱箱中的)

再就是退出功能了哈;
只要Q就可以啦;
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/233548
推荐阅读