• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mój projekt, błędy w porownywaniu dwoch typow zmiennych

Object Storage Arubacloud
0 głosów
135 wizyt
pytanie zadane 12 stycznia 2018 w C i C++ przez Piotrek Korzeniewski Początkujący (360 p.)

witam jestem nowy w programowaniu ale napisałem program w ktorym podaje się swoja ilość pieniędzy, za ktora program przelicza ile zeszytow mógłbys sobie kupic, sa 3 typy zeszytow kazdy w innej kwocie i prawie wszystko dziala poprawnie gdyby nie fakt, że gdy podam liczbe (kwote moich pieniedzy) 100, (4,3), (3.4), (3,9) zaczynaja się schody ktorych nie jestem w stanie pojąć gdyż program łamie warunek, prosiłbym o pomoc oraz ewentualne rady co do kodu pozdrawiam. wiem ze nie powinno robic się tak że porownujesz 2 typy zmiennych i pewnie przez to sa bledy... pomocy

#include <iostream>
#include <math.h>
#include <cstdlib>
#include <iomanip>

using namespace std;

int ilosc[2];
long double kwota,reszta[2];

int main()
{
	cout<<" Podaj twoj kapital: ";
	cin>>kwota;
	cout<<endl<<endl<<" Jeden zeszyt z gruba okladka kosztuje 3zl i 30 groszy."
	<<endl<<" Jeden zeszyt z miekka okladka kosztuje 2 zl i 40 groszy."
	<<endl<<" Jeden zeszyt A4 w linie kosztuje 2zl i 90 groszy."
	<<endl<<endl<<" Wiec za kwote "<<kwota<<" zlotych mozesz kupic:"<<endl;
		
	ilosc[0]=kwota/3.30;
	reszta[0]=kwota-(ilosc[0]*3.30);
	ilosc[1]=kwota/2.40;
	reszta[1]=kwota-(ilosc[1]*2.40);
	ilosc[2]=kwota/2.90;
	reszta[2]=kwota-(ilosc[2]*2.90);
	//1
{
	if(kwota>=3.3)
		{
			if((int)reszta[0]==0&&floor(reszta[0]*100)!=0)
				{
					cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<reszta[0]*100<<" groszy";
				}
			else if((int)reszta[0]!=0&&floor(reszta[0]*100)==0)
				{
					cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<(int)reszta[0]<<" zl";
				}
			else if((int)reszta[0]!=0&&floor(reszta[0]*100)!=0)
				{
					cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<(int)reszta[0]<<" zl"<<" i "<<(reszta[0]-(int)reszta[0])*100<<" groszy";
				}
			else if((int)reszta[0]==0&&floor(reszta[0]*100)==0)
				{
					cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i nie otrzymujesz reszty";	
				}
		}
	else
	{
			cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z gruba okladka.";
	}
	 //2
	if(kwota>=2.4)
		{
			if((int)reszta[1]==0&&floor(reszta[1]*100)!=0)
				{
					cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci "<<reszta[1]*100<<" groszy";
				}
			else if((int)reszta[1]!=0&&floor(reszta[1]*100)==0)
				{
					cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci "<<(int)reszta[1]<<" zl";
				}
			else if((int)reszta[1]!=0&&floor(reszta[1]*100)!=0)
				{
					cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci "<<(int)reszta[1]<<" zl"<<" i "<<(reszta[1]-(int)reszta[1])*100<<" groszy";
				}
			else if((int)reszta[1]==0&&floor(reszta[1]*100)==0)
				{
					cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i nie otrzymujesz reszty";	
				}
		}
	else
	{
			cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z miekka okladka.";
	}
	//3
	if(kwota>=2.9)
		{
			if((int)reszta[2]==0&&floor(reszta[2]*100)!=0)
				{
					cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci "<<reszta[2]*100<<" groszy";
				}
			else if((int)reszta[2]!=0&&floor(reszta[2]*100)==0)
				{
					cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci "<<(int)reszta[2]<<" zl";
				}
			else if((int)reszta[2]!=0&&floor(reszta[2]*100)!=0)
				{
					cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci "<<(int)reszta[2]<<" zl"<<" i "<<(reszta[2]-(int)reszta[2])*100<<" groszy";
				}
			else if((int)reszta[2]==0&&floor(reszta[2]*100)==0)
				{
					cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i nie otrzymujesz reszty";	
				}
		}
	else
	{
			cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt A4 w linie.";
	}
		
	return 0;
}
}

 

2 odpowiedzi

0 głosów
odpowiedź 12 stycznia 2018 przez niezalogowany
wybrane 12 stycznia 2018 przez Piotrek Korzeniewski
 
Najlepsza

DRY tak bardzo połamane :(

Tablice mają tylko 2 elementy. Niepotrzebnie kwotę zapisywałeś jako liczbę zmiennoprzecinkową. Mogłeś od razu w groszach jako liczbę zmiennoprzecinkową. Lepiej użyć od razu floor, albo rzutowania na int. Zdecydowanie prościej i czytelniej:

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <string>

int main()
{
	using namespace std;

	const int ile = 3;
	int ilosc[ile];
	int reszta[ile];
	const long double ceny[ile]{ 3.3, 2.4, 2.9 }; // 
	const std::string nazwy[ile]{ "z grubom okladka", "z miekka okladka", "A4 w linie" };

	long double kwota;
	cout << " Podaj twoj kapital: ";
	cin >> kwota;
	cout << "\n";

	for (int i = 0; i < ile; i++)
	{
		cout << "\n Jeden zeszyt " << nazwy[i] << " kosztuje " << int(ceny[i]) << "zl i " << int(ceny[i] * 100) % 100 << " groszy.\n";
		ilosc[i] = int(kwota / ceny[i]);
		reszta[i] = int(100 * (kwota - (ilosc[i] * ceny[i]))); // reszta w groszach, std::floor przy rzutowaniu
	}
	cout << "\n\n Wiec za kwote " << kwota << " zlotych mozesz kupic:\n";

	for (int i = 0; i < ile; i++)
	{
		if (kwota < ceny[i])
		{
			cout << "\n Niestety nie stac cie na ani jeden zeszyt " << nazwy[i];
		}
		else if (reszta[i] < 100)
		{
			cout << "\n " << ilosc[i] << " zeszytow " << nazwy[i] << " i zostanie ci " << reszta[i] << " groszy";
		}
		else if (reszta[i] % 100 == 0)
		{
			cout << "\n " << ilosc[i] << " zeszytow " << nazwy[i] << " i zostanie ci " << reszta[i] / 100 << " zl";
		}
		else if (reszta[i] != 0)
		{
			cout << "\n " << ilosc[i] << " zeszytow " << nazwy[i] << " i zostanie ci "
				<< reszta[i] / 100 << " zl i " << reszta[i] % 100 << " groszy";
		}
		else if (reszta == 0)
		{
			cout << "\n " << ilosc[i] << " zeszytow " << nazwy[i] << " i nie otrzymujesz reszty";
		}
	}
}

Posprawdzaj jeszcze wszystko czy działa, bo kod poprawiałem na prędko (bo mi zupa stygnie).

0 głosów
odpowiedź 12 stycznia 2018 przez Bosswell Nałogowiec (36,470 p.)
Deklarujesz dwa elementy tablicy

int ilosc[2]; // [0, 1]

a odwołujesz się do 3, która nie istnieje.
komentarz 12 stycznia 2018 przez Piotrek Korzeniewski Początkujący (360 p.)
w którym miejscu??

Podobne pytania

0 głosów
2 odpowiedzi 198 wizyt
pytanie zadane 21 lipca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 884 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 p.)
0 głosów
1 odpowiedź 171 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...