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

Minimalna liczba zapisana w programie nie wyświetla się prawidłowo.

VPS Starter Arubacloud
0 głosów
405 wizyt
pytanie zadane 26 maja 2017 w C i C++ przez Piotrek Korzeniewski Początkujący (360 p.)
edycja 26 maja 2017 przez Arkadiusz Waluk

Witam, mam pytanie otóż napisałem programik z głowy, który oblicza jaka maksymalną liczbę zeszytów w jakiej cenie możesz kupić i ile reszty ewentualnie ci zostanie. Problem jest następujący, jeżeli podam minimalną liczbę za jaką możesz kupić jeden zeszyt reszta w tym programie nie wyświetla się poprawnie. Nie dzieję się tak w przypadku podania większej liczby niż minimalna. Błąd występuje w trzech typach zeszytów. Mam nadzieję, że będzie mi ktoś w stanie pomóc. (wiem ze program nie jest napisany najlepiej ale dopiero staram się opanować ten język programowania.)

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

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.30)
    {
        cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z gruba okladka.";
    }
    else if(kwota>=3.30)
    {
    if(reszta[0]==0)
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka oraz nie otrzymujesz reszty.";
    }
    else if(reszta[0]<1)
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<reszta[0]*100<<" groszy.";
    }
    if(reszta[0]==1)
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 1 zl.";
    }
    else if((reszta[0]>1)&&(reszta[0]<2))
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 1 zl i "<<(reszta[0]*100)-100<<" groszy.";
    }
    if(reszta[0]==2)
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 2 zl.";
    }
    else if((reszta[0]>2)&&(reszta[0]<3))
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 2 zl i "<<(reszta[0]*100)-200<<" groszy.";
    }
    if(reszta[0]==3)
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 3 zl.";
    }
    else if(reszta[0]>3)
    {
        cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 3zl i "<<(reszta[0]*100)-300<<" groszy.";
    }
    }
    ///2/////////////////////////////////////////////////////////////////////////
    if(kwota<2.40)
    {
        cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z miekka okladka.";
    }
    else if(kwota>=2.40)
    {
    if(reszta[1]==0)
    {
        cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka oraz nie otrzymujesz reszty.";
    }
    else if(reszta[1]<1)
    {
        cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci "<<reszta[1]*100<<" groszy.";
    }
    if(reszta[1]==1)
    {
        cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 1 zl.";
    }
    else if((reszta[1]>1)&&(reszta[1]<2))
    {
        cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 1 zl i "<<(reszta[1]*100)-100<<" groszy.";
    }
    if(reszta[1]==2)
    {
        cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 2 zl.";
    }
    else if(reszta[1]>2)
    {
        cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 2 zl i "<<(reszta[1]*100)-200<<" groszy.";
    }
    }
    ///3/////////////////////////////////////////////////////////////////////////
    if(kwota<2.90)
    {
        cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt A4 w linie.";
    }
    else if(kwota>=2.90)
    {
    if(reszta[2]==0)
    {
        cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie oraz nie otrzymujesz reszty";
    }
    else if(reszta[2]<1)
    {
        cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci "<<reszta[2]*100<<" groszy.";
    }
    if(reszta[2]==1)
    {
        cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 1 zl.";
    }
    else if((reszta[2]>1)&&(reszta[2]<2))
    {
        cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 1 zl i "<<(reszta[2]*100)-100<<" groszy.";
    }
    if(reszta[2]==2)
    {
        cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 2 zl.";
    }
    else if(reszta[2]>2)
    {
        cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 2 zl i "<<(reszta[2]*100)-200<<" groszy.";
    }
    }
    
    return 0;
}

 

komentarz 26 maja 2017 przez Arkadiusz Waluk Ekspert (287,550 p.)

Pamiętaj na przyszłość, że kod na forum wstawiamy w przeznaczony do tego bloczek.

komentarz 26 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
Oki sorki

3 odpowiedzi

0 głosów
odpowiedź 26 maja 2017 przez Dexterim Dyskutant (8,370 p.)
wybrane 27 maja 2017 przez Piotrek Korzeniewski
 
Najlepsza
Problem jest trochę innej natury raz cos napisał kolega wcześniej wychodzisz po za zakres tablicy. Stosując zmienne globalne nie musisz ich zerować bo są zero z definicji. Odradzam jednak korzystanie z nich bo to ZŁO :D

Problem z którym się mierzysz do porówywanie z liczbami rzeczywistymi korzystać z typu long double który jest dość precyzyjny ale tak czy siak pojawiają sie jakieś śmieci na którymś miejsu po przecinku. Jeśli chcesz porównywać ze sobą liczy typu zmienno przecinkowego to powinieneś stosować konwencje mniejsze wieksze np: w twoim przypadku

reszta[0] < 0.001 && reszta[0] > -0.001
komentarz 26 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
Okej rozumiem to, i faktycznie działa, ale tylko w połowie. Co jeśli ktoś poda kwotę 3.31? wtedy ten sposób nie działa poprawnie.
komentarz 26 maja 2017 przez Dexterim Dyskutant (8,370 p.)
wyrzuć long double i daj double tak jak powiedziałem wszystko się sprowadza do działania na liczbach zmienno przecinkowych. Zresztą co Ci źle działa?
0 głosów
odpowiedź 26 maja 2017 przez Kurogami12 Bywalec (2,610 p.)
edycja 26 maja 2017 przez Kurogami12
int ilosc[3] = {0,0,0};
long double kwota = 0,reszta[3] = {0,0,0};

zawsze tablica ma w sobie miejsca od 0 do rozmiar tablicy - 1 bo ostatni element jest już zajęty od razu i nie można go zmieniać oczywiście to samo dotyczy reszty. Poza tym (o czym zapomniałem) warto wyzerować te dane na początku

komentarz 26 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
I co? przez to program mi nie działa poprawnie?
komentarz 26 maja 2017 przez Kurogami12 Bywalec (2,610 p.)
przez to i jak dodałem przez to, że masz niewyzerowane dane, często są tzw śmieci z kompilatora przez które jak piszesz jakieś dane i ich wcześniej nie zerujesz no to wychodzą po prostu takie niestworzone liczby
komentarz 26 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
nic to nie pomoglo
komentarz 26 maja 2017 przez Kurogami12 Bywalec (2,610 p.)
jaką konkretnie wpisujesz kwotę że ci nie działa i co dokładnie wyświetla?
komentarz 26 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
3.3, 2.4, 2.9
komentarz 26 maja 2017 przez Kurogami12 Bywalec (2,610 p.)
#include <iostream>
#include <math.h>
#include <cstdlib>
 
using namespace std;
 
int ilosc[3] = {0,0,0};
float kwota = 0,reszta[3] = {0,0,0}, pomocnicza;
 
int main()
{
    cout<<" Podaj twoj kapital: ";
    cin>>kwota;//2.4
    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;
    pomocnicza = ilosc[0] * 3.3;
    reszta[0]=kwota-pomocnicza;
    ilosc[1]=kwota/2.40;
    pomocnicza = ilosc[1] * 2.4;
    cout<<pomocnicza;
    reszta[1]=kwota-pomocnicza;
    ilosc[2]=kwota/2.90;
    pomocnicza = ilosc[2] * 2.9;
    reszta[2]=kwota-pomocnicza;

cały początek zmień na taki to powinno ci działać (nie wiem czemu użyłeś typu long double swoją drogą ale nie wnikam)

komentarz 26 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)
Nie dość, że nie działa to jeszcze wynik groszy pokazuje źle, dałem long double, żeby wynik zaokrąglało bo teraz wychodzi 0.9999999999999999999999999 a ma być 1
0 głosów
odpowiedź 27 maja 2017 przez Piotrek Korzeniewski Początkujący (360 p.)

Wszystko zostało poprawione tutaj jest poprawny kod. 

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

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.30)
	{
		cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z gruba okladka.";
	}
	else if(kwota>=3.30)
	{
	if((reszta[0]>-0.1)&&(reszta[0]<0.1))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka oraz nie otrzymujesz reszty.";
	}
	if((reszta[0]>0.1)&&(reszta[0]<1))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci "<<reszta[0]*100<<" groszy.";
	}
	if((reszta[0]>1)&&(reszta[0]<1.1))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 1 zl.";
	}
	if((reszta[0]>1.1)&&(reszta[0]<2))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 1 zl i "<<(reszta[0]*100)-100<<" groszy.";
	}
	if((reszta[0]>2)&&(reszta[0]<2.1))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 2 zl.";
	}
	if((reszta[0]>2.1)&&(reszta[0]<3))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 2 zl i "<<(reszta[0]*100)-200<<" groszy.";
	}
	if((reszta[0]>3)&&(reszta[0]<3.1))
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 3 zl.";
	}
	if(reszta[0]>3.1)
	{
		cout<<endl<<" "<<ilosc[0]<<" zeszytow z gruba okladka i zostanie ci 3zl i "<<(reszta[0]*100)-300<<" groszy.";
	}
	}
	///2/////////////////////////////////////////////////////////////////////////
	if(kwota<2.40)
	{
		cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt z miekka okladka.";
	}
	else if(kwota>=2.40)
	{
	if((reszta[1]>-0.1)&&(reszta[1]<0.1))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka oraz nie otrzymujesz reszty.";
	}
	if((reszta[1]>0.1)&&(reszta[1]<1))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci "<<reszta[1]*100<<" groszy.";
	}
	if((reszta[1]>1)&&(reszta[1]<1.1))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 1 zl.";
	}
	if((reszta[1]>1.1)&&(reszta[1]<2))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 1 zl i "<<(reszta[1]*100)-100<<" groszy.";
	}
	if((reszta[1]>2)&&(reszta[1]<2.1))
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 2 zl.";
	}
	if(reszta[1]>2.1)
	{
		cout<<endl<<" "<<ilosc[1]<<" zeszytow z miekka okladka i zostanie ci 2 zl i "<<(reszta[1]*100)-200<<" groszy.";
	}
	}
	///3/////////////////////////////////////////////////////////////////////////
	if(kwota<2.90)
	{
		cout<<endl<<" Niestety nie stac cie na ani jeden zeszyt A4 w linie.";
	}
	else if(kwota>=2.90)
	{
	if((reszta[2]>-0.1)&&(reszta[2]<0.1))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie oraz nie otrzymujesz reszty";
	}
	if((reszta[2]>0.1)&&(reszta[2]<1))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci "<<reszta[2]*100<<" groszy.";
	}
	if((reszta[2]>1)&&(reszta[2]<1.1))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 1 zl.";
	}
	if((reszta[2]>1.1)&&(reszta[2]<2))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 1 zl i "<<(reszta[2]*100)-100<<" groszy.";
	}
	if((reszta[2]>2)&&(reszta[2]<2.1))
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 2 zl.";
	}
	if(reszta[2]>2.1)
	{
		cout<<endl<<" "<<ilosc[2]<<" zeszytow A4 w linie i zostanie ci 2 zl i "<<(reszta[2]*100)-200<<" groszy.";
	}
	}
	
	return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 139 wizyt
+1 głos
1 odpowiedź 301 wizyt
0 głosów
2 odpowiedzi 533 wizyt

92,452 zapytań

141,262 odpowiedzi

319,081 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...