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

Błędy w programie

Object Storage Arubacloud
0 głosów
90 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez Atman Użytkownik (810 p.)

Mam program symulujący automat z kawą. Jednak pojawia się kilka błędów z któymi nie umiem się uporać.

 

Pętla do while nie działa poprawnie przy wrzuceniu za małej ilości pieniędzy, ponadto nie wylicza się z niej reszta, np. gdy cena wynosi 12:50 a zapłata to 10 zł i późniejsza dopłata w postaci 3 zł nie wydaje reszty.

Problem jest również z funkcją zaokrąglającą użytą przy wydawaniu reszty.

 

Bardzo proszę o pomoc

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

float Odczytaj_plik(std::string sciezkaDoPliku)
{
	{
		ifstream odczyt(sciezkaDoPliku);

		if (odczyt.is_open())
		{
			char wiersz[10000];
			while (odczyt.getline(wiersz, 10000))
			{
				cout << wiersz << endl;
			}
		}
		odczyt.close();
	}
	return 0;
}

void  informacja()
{
	cout << "=================" << endl; 
	cout << "POBIERANIE KUBKA..." << endl;
	cout << "NALEWANIE ..." << endl;
	cout << "MOZESZ ODEBRAC KAWE :) ZYCZYMY SMACZNEJ KAWUSI I MILEGO DNIA" << endl;
		
}

int main()
{
	string sciezkaDoPliku = "kawy.txt";
	Odczytaj_plik(sciezkaDoPliku);

		int wybor, wielkosc;
		cout << "Podaj numer " << endl;
		cin >> wybor;

		switch (wybor)
		{

		case 1:

			cout << "Wybrales Espresso" << endl;
			break;

		case 2:

			cout << "Wybrales Flat White" << endl;
			break;

		case 3:

			cout << "Wybrales Cappuccino" << endl;
			break;

		case 4:

			cout << "Wybrales Latte Maccihiato" << endl;
			break;
		}

		if (wybor > 4 || wybor < 1)

		{
			system("PAUSE");
			return 0;
		}
		
		cout<<"Jesli chcesz mala kawe wybierz 1, jesli duza wybierz 2"<<endl;
		cin >> wielkosc;
		if (wielkosc == 1)
		{
			cout << "Wybrales mala kawe. Swietna decyzja" << endl;
		}
		else
		{
			cout<<"Wybrales duza kawe. Swietna decyzja" << endl; 
		} 
		
		switch (wybor)
		{

		case 1:

			if (wielkosc == 1)
			{
				kwota = 6.20;
			}
			else
			{
				kwota = 9.5;
			}
			break;

		case 2:

			if (wielkosc == 1)
			{
				kwota = 8.70;
			}
			else
			{
				kwota = 12.50;
			}
			break;
			

		case 3:

			if (wielkosc == 1)
			{
				kwota = 5.0;
			}
			else
			{
				kwota = 7.20;
			}
			break;

		case 4:

			if (wielkosc == 1)
			{
				kwota = 7.50;
			}
			else
			{
				kwota = 10.0;
			}
			break;
		}
		double round(kwota);
		cout <<"Wybrana przez ciebie kawa kosztuje " << kwota <<" zl.  Wrzuc pieniadze"<< endl;
		double ilosc, ilosc2, R=0;
		cout << "Podaj ile pieniendzy wrzuciles" << endl;
		cin >> ilosc;
		if (ilosc < kwota)
		{
			do {
				cout << "Za malo, dorzuc " << endl;
				cout << "Ile pieniendzy dorzuciles?" << endl;
				cin >> ilosc2;

				ilosc =+ ilosc2;

			} while (ilosc >= kwota);

			R = ilosc - kwota;
		}

		else
		{
			R = ilosc - kwota;
			cout << "Reszta to: " << R <<" zl"<< endl;
		}


		int reszta(int argc, char* argv[]);
		
			//tablica dostepnych nominalow
			double N[7] = { 10, 5, 2, 1, 0.5, 0.2, 0.1 };
			int  P;
			int i = 0;
          
			while (R > 0)
			{
				double round(R);
				if (R >= N[i])
				{
					P = R / N[i];
					R = R - (N[i] * P); //zmniejsz reszte o wydany nominal
					cout << N[i] << " zl   x " << P << endl; //wypisz wynik
				}
				i++;            //rozpatrz kolejny nominal
			}
			informacja();
		

system("PAUSE");
return 0;
}

 

 

 

1 odpowiedź

+1 głos
odpowiedź 2 czerwca 2020 przez LuQ232 Mądrala (7,200 p.)
edycja 2 czerwca 2020 przez LuQ232
 
Najlepsza

Było pare drobnych błędów:

1. Po pierwsze u mnie kompilator krzyczy, że nie ma zainicjalizowanej zmiennej kwota. Wrzuciłem zaraz po int main(){

float kwota;

2. Pomyłka =+ na +=

ilosc += ilosc2;

3. Warunek while powinien być odwrotny:

 do {
                cout << "Za malo, dorzuc " << endl;
                cout << "Ile pieniendzy dorzuciles?" << endl;
                cin >> ilosc2;

                ilosc += ilosc2;
            } while (ilosc < kwota);

            R = ilosc - kwota;

4. Zmiana warunku w while wyliczającym resztę. U Ciebie przekraczałeś tablicę i program pobierał dane z kosmosu. Stąd warunek i<7 (aby nie przekroczyć tablicy).


            while (i<7 && R!= 0)
            {
                if (R >= N[i])
                {
                    P = R / N[i];
                    R -= (N[i] * P); //zmniejsz reszte o wydany nominal
                    cout << N[i] << " zl   x " << P << endl; //wypisz wynik
                }
                i++;            //rozpatrz kolejny nominal
            }

 

 

CAŁY KOD:


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


void  informacja()
{
    cout << "=================" << endl;
    cout << "POBIERANIE KUBKA..." << endl;
    cout << "NALEWANIE ..." << endl;
    cout << "MOZESZ ODEBRAC KAWE :) ZYCZYMY SMACZNEJ KAWUSI I MILEGO DNIA" << endl;

}

int main()
{
    float kwota;

        int wybor, wielkosc;
        cout << "Podaj numer " << endl;
        cin >> wybor;

        switch (wybor)
        {

        case 1:

            cout << "Wybrales Espresso" << endl;
            break;

        case 2:

            cout << "Wybrales Flat White" << endl;
            break;

        case 3:

            cout << "Wybrales Cappuccino" << endl;
            break;

        case 4:

            cout << "Wybrales Latte Maccihiato" << endl;
            break;
        }

        if (wybor > 4 || wybor < 1)

        {
            system("PAUSE");
            return 0;
        }

        cout<<"Jesli chcesz mala kawe wybierz 1, jesli duza wybierz 2"<<endl;
        cin >> wielkosc;
        if (wielkosc == 1)
        {
            cout << "Wybrales mala kawe. Swietna decyzja" << endl;
        }
        else
        {
            cout<<"Wybrales duza kawe. Swietna decyzja" << endl;
        }

        switch (wybor)
        {

        case 1:

            if (wielkosc == 1)
            {
                kwota = 6.20;
            }
            else
            {
                kwota = 9.5;
            }
            break;

        case 2:

            if (wielkosc == 1)
            {
                kwota = 8.70;
            }
            else
            {
                kwota = 12.50;
            }
            break;


        case 3:

            if (wielkosc == 1)
            {
                kwota = 5.0;
            }
            else
            {
                kwota = 7.20;
            }
            break;

        case 4:

            if (wielkosc == 1)
            {
                kwota = 7.50;
            }
            else
            {
                kwota = 10.0;
            }
            break;
        }

        cout <<"Wybrana przez ciebie kawa kosztuje " << kwota <<" zl.  Wrzuc pieniadze"<< endl;
        float ilosc, ilosc2,R=0;
        cout << "Podaj ile pieniendzy wrzuciles" << endl;
        cin >> ilosc;
        if (ilosc < kwota)
        {
            do {
                cout << "Za malo, dorzuc " << endl;
                cout << "Ile pieniendzy dorzuciles?" << endl;
                cin >> ilosc2;

                ilosc += ilosc2;
            } while (ilosc < kwota);

            R = ilosc - kwota;
        }

        else
        {
            R = ilosc - kwota;
            cout << "Reszta to: " << R <<" zl"<< endl;
        }



            //tablica dostepnych nominalow
            double N[7] = { 10, 5, 2, 1, 0.5, 0.2, 0.1 };
            int  P=0;
            int i = 0;

            while (i<7 && R>= 0.0)
            {
                if (R >= N[i])
                {
                    P = R / N[i];
                    R -= (N[i] * P); //zmniejsz reszte o wydany nominal
                    cout << N[i] << " zl   x " << P << endl; //wypisz wynik
                }
                i++;            //rozpatrz kolejny nominal
            }
            informacja();


system("PAUSE");
return 0;
}

 

komentarz 2 czerwca 2020 przez Atman Użytkownik (810 p.)
Program śmiga super, jedyne co jeszcze nie do końca działa to reszta z dziesięciogroszówek. Raz działa a raz nie a ja nie wiem dlaczego. Może przez zaokrąglenie?
komentarz 2 czerwca 2020 przez LuQ232 Mądrala (7,200 p.)
Zmień w kodzie double na floaty! Post zaraz edytuję

Podobne pytania

0 głosów
0 odpowiedzi 321 wizyt
0 głosów
3 odpowiedzi 583 wizyt
0 głosów
2 odpowiedzi 153 wizyt
pytanie zadane 27 sierpnia 2016 w Inne języki przez niezalogowany

92,547 zapytań

141,389 odpowiedzi

319,508 komentarzy

61,931 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!

...