Member 14660101 Ответов: 2

Нужна помощь пожалуйста кассовый аппарат C++


Привет,
Я работаю над этой программой уже около 2 недель и просто не могу этого сделать, я новичок, мне действительно трудно, и я больше не знаю, что делать. Та часть, где вы должны были получить свои центы обратно, не хочет работать, и я действительно не знаю почему, я пытался оптимизировать как можно лучше свой код, чтобы иметь меньше строк кода, но я не способен это сделать. Некоторая помощь была бы очень признательна, пожалуйста.
Заранее большое спасибо.

#include <iostream>
#include <math.h>
using namespace std;

int main() 
{
	double iAmount_due { 0 };
	double iGiven_money { 0 };
	double iMoney_back;	

	iMoney_back = iGiven_money - iAmount_due;

	int iMoney100 { 0 };
	int iMoney50  { 0 };
	int iMoney20  { 0 };
	int iMoney10  { 0 };
	int iMoney5   { 0 };
	int iMoney2   { 0 };
	int iMoney1   { 0 };
	int iCent25   { 0 }; 
	int iCent10   { 0 };
	int iCent5    { 0 };
	int iCent1    { 0 };

    cout << "Enter the amount due please: " << endl;

	cin >> iAmount_due;

    cout << "Enter the amount given please: " << endl;

	cin >> iGiven_money;


	if (iGiven_money >= iAmount_due) {

	   iMoney_back = iGiven_money - iAmount_due;

	   cout << "We will give you : " << iMoney_back << " $ back" << endl;

	}
	else {	
	   cout << "No money back" << endl;	
	}
       
	while (iGiven_money >= iAmount_due) {
	
		iMoney100 = iMoney_back / 100;
		iMoney_back = (int)iMoney_back % 100;

		cout << "You will get: " << iMoney100 << " X 100 $ " << endl;
	
		iMoney50 = iMoney_back / 50;
		iMoney_back = (int)iMoney_back % 50;

		cout << "You will get: " << iMoney50 << " X 50 $ " << endl;

		iMoney20 = iMoney_back / 20;
		iMoney_back = (int)iMoney_back % 20;

		cout << "You will get: " << iMoney20 << " X 20 $ " << endl;

		iMoney10 = iMoney_back / 10;
		iMoney_back = (int)iMoney_back % 10;

		cout << "You will get: " << iMoney10 << " X 10 $ " << endl; 

		iMoney5 = iMoney_back / 5;
		iMoney_back = (int)iMoney_back % 5;

		cout << "You will get: " << iMoney5 << " X 5 $ " << endl; 

		iMoney2 = iMoney_back / 2;
		iMoney_back = (int)iMoney_back % 2;

		cout << "You will get: " << iMoney2 << " X 2 $ " << endl; 
	
	    iMoney1 = iMoney_back / 1;
		iMoney_back = (int) iMoney_back % 1;

		cout << "You will get: " << iMoney1 << " X 1 $ " << endl;

		iCent25 = iMoney_back / 0.25;
		iMoney_back = fmod ((int)iMoney_back, 0.25);

		cout << "You will get: " << iCent25 << " X 0.25 $ " << endl;

		iCent10 = iMoney_back / 0.10;
		iMoney_back = fmod ((int)iMoney_back , 0.10);

		cout << "You will get: " << iCent10 << " X 0.10 $ " << endl;

		iCent5 = iMoney_back / 0.5;
		iMoney_back = fmod ((int)iMoney_back , 0.5);

		cout << "You will get: " << iCent5 << " X 0.5 $ " << endl;

		iCent1 = iMoney_back / 0.1;
		iMoney_back = fmod ((int)iMoney_back, 0.1);

		cout << "You will get: " << iCent1 << " X 0.1 $ " << endl;

		break;	
	}

	return 0;
}


Что я уже пробовал:

Я перепробовал все, что мог в течение 2 недель, я перепробовал много библиотек c++, чтобы решить свою проблему с десятичными дробями моя программа до сих пор не возвращает мне центы

KarstenK

вы пропустили, чтобы вычесть обратно денежные куски из iMoney_back :-O

остальные ответы не оставляли больше ничего для записи.

2 Ответов

Рейтинг:
1

k5054

Вы делаете integer mod для значений с плавающей запятой, что приводит к целому числу, поэтому если iMoney_back = 2.34, то (int)IMoney_back % 100 значение (int)2, нет (double)2.34

Кроме того, вот некоторые вещи, которые я бы прокомментировал как ваш инструктор

1) здесь много "повторяющегося кода", где вы делаете почти одно и то же снова и снова. Если вы говорили о функциях (иногда называемых методами или подпрограммами), возможно, вы могли бы подумать о том, как вы могли бы поместить подобные биты в подпрограмму.

2)Вы получаете много сообщений о возврате 0 номиналов. Может быть, вы можете придумать способ распечатать только те изменения, которые вы действительно получите?


Рейтинг:
0

Rick York

Я не собираюсь переписывать это для вас, но я думаю, что вам было бы легче думать в терминах центов как "целого" числа. Это означает, что вы должны принять ввод суммы в долларах с центами в качестве дробной части, как вы это делаете сейчас. Затем вы должны сделать другую переменную, которая является целым числом, и это входное значение умножается на 100. Например, если вы введете 123.45, то эта новая переменная будет содержать 12345. Сделайте все ваши вычисления, используя эту переменную, и это будет вся целочисленная математика.

Причина этого заключается в том, что центы-это, по сути, целое число. С деньгами не может быть меньшего значения, поэтому используйте их в качестве базовой единицы. Сто долларов-это 10000 центов, десять долларов-1000 центов, а один доллар-100 центов. После этого номиналы монет становятся целыми величинами. Это значительно упростит ситуацию, и вам будет легче иметь с ней дело. Первый раздел вашего кода должен измениться очень мало - просто умножьте делители на 100. Последняя часть также масштабирует делители на 100, но ее следует изменить, чтобы использовать целочисленную математику.

Один совет, который я дам, касается того, как вы вычисляете свои ценности. Вот один отрывок: :

iMoney50 = iMoney_back / 50;
iMoney_back = (int)iMoney_back % 50;
Вы можете сделать эту функцию, чтобы упростить вещи. Ключ состоит в том, чтобы передать сумму денег в качестве ссылки, так как она будет изменена в функции. Вот этот код :
int GetTypeAmount( int & money, int denomination )
{
    int count = money / denomination;
    money %= denomination;
    return count;
}
Это вернет номер этого номинала денег. Вот последовательность обращений к нему :
int count = 0;
int money = 12345;
count = GetTypeAmount( money, 10000 );
cout << "You will get: " << count << " X 100.00 $" << endl;
count = GetTypeAmount( money, 5000 );
cout << "You will get: " << count << " X  50.00 $" << endl;
count = GetTypeAmount( money, 2000 );
cout << "You will get: " << count << " X  20.00 $" << endl;
count = GetTypeAmount( money, 1000 );
cout << "You will get: " << count << " X  10.00 $" << endl;
count = GetTypeAmount( money, 500 );
cout << "You will get: " << count << " X   5.00 $" << endl;
count = GetTypeAmount( money, 100 );
cout << "You will get: " << count << " X   1.00 $" << endl;
count = GetTypeAmount( money, 25 );
cout << "You will get: " << count << " X   0.25 $" << endl;
count = GetTypeAmount( money, 10 );
cout << "You will get: " << count << " X   0.10 $" << endl;
count = GetTypeAmount( money, 5 );
cout << "You will get: " << count << " X   0.05 $" << endl;
count = money;
cout << "You will get: " << count << " X   0.01 $" << endl;
Вы могли бы сделать еще один шаг вперед и включить выходные данные в функцию, но я оставлю это для вас, чтобы выяснить.