Pomoc w rozwiazaniu zadania

0

Witam. C++ uczę się od dwóch miesięcy. Uczę się ze strony C++ Miroslaw Zelent. Mam jedno zadanie do zrobienia, proste.Ale utknąłem w jednym miejscu:

 #include <iostream>

using namespace std;
float ilosckrazownikow;
float mt = 20000;
float kr = 7000;
float dr = 2000;
int main()
{
    for(;;)
    {



    cout <<endl<< "Ile masz metalu: " <<endl;
    cin>> mt;
    cout<<"Ile masz Krysztalu: "<<endl;
    cin>>kr;
    cout <<"Ile masz Deuterow: " <<endl;
    cin>>dr;

        if  ((mt>=20000)&&(kr>=7000) &&(dr>=2000))
        {
            cout<<endl<<"kupiles 1 krazoownik";
        }



        else if  ((mt <20000)||(kr<7000)||(dr<2000))
        {
            cout<<endl<<"Nie stac cie na krazownik";
        }


        else
        {
            cout<<endl<<"Podales niepoprawne dane";
        }



    }
    return 0;
}

Progam chodzi prawie tak jak powinien, ale po podaniu prawidłowych odpowiedzi pokazuje mi komunikat: "kupiles jeden krazownik", chodzi mi o to, że jak podam ilosc metali więcej , za które mogę kupić 2,4 lub wiecej krążowników... I po podaniu parametrów powinienem dostać komunikat np. "kupiles 4 krązowniki" . Czy to muszę dać w pętli ? Bardzo prosiłbym o podpowiedz?

0

Przecież widzisz, że w pętli podajesz za każdym razem dane i wtedy sprawdzasz czy wystarczą na 1 krążownik czy nie. Jeśli tak to wypisujesz zawsze że kupiłeś 1 krążownik a inaczej, że Cię nie stać. Program sam cudownie nie zgadnie, że zamiast '1' ma wypisać inną wartość. Jeżeli chcesz żeby tak było to w pętli jeśli jest spełniony warunek inkrementujesz sobie jakąś zmienną i ją wstawiasz do tego wypisywanego komunikatu.

1
float ilosckrazownikow;
float mt = 20000;
float kr = 7000;
float dr = 2000;

  1. Te zmienne powinny być w main, unikaj zmiennych globalnych.
  2. Nie używaj takich skrótów do nazywania zmiennych. Te zmienne powinny się nazywać metal, krysztal i deuter.
  3. int lepiej się sprawdzi tutaj niż float
else if  ((mt <20000)||(kr<7000)||(dr<2000))

if jest zbędny tutaj, ten warunek musi być spełniony. Poza tym koszty trzymaj w zmiennych, unikaj "magicznych liczb" w kodzie.

Gdybyś miał te zmienne jako inty, to wystarczy

const int kosztMetalu = 20000;
const int kosztKrysztalu = 7000;
const int kosztDeuteru = 2000;

int ileMoznaKupic = min({metal/kosztMetalu, krysztal/kosztKrysztalu, deuter/kosztDeuteru}); 
if (ileMoznaKupic > 0)
{
    cout << "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
}
0
twonek napisał(a):
float ilosckrazownikow;
float mt = 20000;
float kr = 7000;
float dr = 2000;

  1. Te zmienne powinny być w main, unikaj zmiennych globalnych.
  1. Nie używaj takich skrótów do nazywania zmiennych. Te zmienne powinny się nazywać metal, krysztal i deuter.
  2. int lepiej się sprawdzi tutaj niż float
else if  ((mt <20000)||(kr<7000)||(dr<2000))

if jest zbędny tutaj, ten warunek musi być spełniony. Poza tym koszty trzymaj w zmiennych, unikaj "magicznych liczb" w kodzie.

Gdybyś miał te zmienne jako inty, to wystarczy

const int kosztMetalu = 20000;
const int kosztKrysztalu = 7000;
const int kosztDeuteru = 2000;

int ileMoznaKupic = min({metal/kosztMetalu, krysztal/kosztKrysztalu, deuter/kosztDeuteru}); 
if (ileMoznaKupic > 0)
{
    cout << "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
}

Dzięki za uwagi Wam :) Próbowałem przerobić program na :

 #include <iostream>

using namespace std;



int main()
{


 int metal,krysztal,deuter;
 int kosztMetalu = 20000;
 int kosztKrysztalu = 7000;
 int kosztDeuteru = 2000;

    for(;;)
    {


        cout <<endl<< "Ile masz metalu: " <<endl;
        cin>> kosztMetalu;
        cout<<"Ile masz Krysztalu: "<<endl;
        cin>>kosztKrysztalu;
        cout <<"Ile masz Deuterow: " <<endl;
        cin>>kosztDeuteru;

        int ileMoznaKupic = min({metal/kosztMetalu, krysztal/kosztKrysztalu, deuter/kosztDeuteru});
        if (ileMoznaKupic > 0)
        {
            cout << "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
        }


        if  ((kosztMetalu <20000)||(kosztKrysztalu<7000)||(kosztDeuteru<2000))
        {
            cout<<endl<<"Nie stac cie na krazownik";
        }


        else
        {
            cout<<endl<<"Podales niepoprawne dane";
        }



    }
    return 0;
}

Ale mam probem z linią: int ileMoznaKupic = min({metal/kosztMetalu, krysztal/kosztKrysztalu, deuter/kosztDeuteru}); , jeszcze pokombinuję..Dzięki za uwagi... Dużo nauki jeszce przede mną, jeśli chodzi o programowanie....

0
int kosztMetalu = 20000;
int kosztKrysztalu = 7000;
int kosztDeuteru = 2000;

Zdefiniuj te rzeczy jako const int, bo to są stałe, które nigdy się nie zmieniają. Poza tym wtedy od razu kompilator by wykrył następny błąd:

cin>> kosztMetalu;
cin>>kosztKrysztalu;
cin>>kosztDeuteru;

wczytujesz nie do tych zmiennych co trzeba.

int ileMoznaKupic = min({metal/kosztMetalu, krysztal/kosztKrysztalu, deuter/kosztDeuteru}); 

To jest konstrukcja z C++11, która pozwala wywołać funkcję std::min z dowolną ilością argumentów. Zamiast niej można 2 razy wywołać min "normalnie":

int tmp = min(metal/kosztMetalu, krysztal/kosztKrysztalu);
int ileMoznaKupic = min(tmp, deuter/kosztDeuteru);
0
twonek napisał(a):
int kosztMetalu = 20000;
int kosztKrysztalu = 7000;
int kosztDeuteru = 2000;

Zdefiniuj te rzeczy jako const int, bo to są stałe, które nigdy się nie zmieniają. Poza tym wtedy od razu kompilator by wykrył następny błąd:

cin>> kosztMetalu;
cin>>kosztKrysztalu;
cin>>kosztDeuteru;

wczytujesz nie do tych zmiennych co trzeba.

Tu mam problem , do jakich zmiennych wczytać , żeby pytało mnie o koszt metalu , koszt krysztalu itp.... Przy typie const....

twonek napisał(a):
int ileMoznaKupic = min({metal/kosztMetalu, krysztal/kosztKrysztalu, deuter/kosztDeuteru}); 

To jest konstrukcja z C++11, która pozwala wywołać funkcję std::min z dowolną ilością argumentów. Zamiast niej można 2 razy wywołać min "normalnie":

int tmp = min(metal/kosztMetalu, krysztal/kosztKrysztalu);
int ileMoznaKupic = min(tmp, deuter/kosztDeuteru);

Ponizej na nowo pokombinowałem, ale teraz w ogóle zle mi liczy.....Pokazuje me zle wyniki...Np. jak wpisze metal: 44000,kryształ:15000, Deuter:5000. To powinienem dostać wynik: ze zakupiłem dwa krążowniki....

 #include <iostream>

using namespace std;



int main()
{

    int metal,krysztal,deuter;
    int kosztMetalu = 20000;
    int kosztKrysztalu = 7000;
    int kosztDeuteru = 2000;

    for(;;)
    {


        cout <<endl<< "Ile masz metalu: " <<endl;
        cin >> kosztMetalu;
        cout<<"Ile masz Krysztalu: "<<endl;
        cin>>kosztKrysztalu;
        cout <<"Ile masz Deuterow: " <<endl;
        cin>>kosztDeuteru;

        int tmp = min(metal/kosztMetalu, krysztal/kosztKrysztalu);
        int ileMoznaKupic = min(tmp, deuter/kosztDeuteru);
        {
            cout<< "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
        }


        if  ((kosztMetalu <20000)||(kosztKrysztalu<7000)||(kosztDeuteru<2000))
        {
            cout <<endl<<"Nie stac cie na krazownik";
        }


        else
        {
            cout<<endl<<"Podales niepoprawne dane";
        }



    }
    return 0;
}

Pokombinuję jeszcze..., z typem const mam błedy... I tu pytanie, czy wartość const musi być używane w tym wypadku, czy może być samo int....?

0

Pokombinuję jeszcze..., z typem const mam błedy..
Bo tak ma być! Właśnie w ten sposób kompilator mówi Ci, że robisz głupstwo. kosztMetalu to stały koszt jednego krążownika w metalu. Nie wczytujesz do niego, tylko do metal! Zresztą popatrz na tę linię:

int tmp = min(metal/kosztMetalu

Nie zastanawia Cię, jaką wartość ma zmienna metal?

0

... wczytujesz koszt metalu(czyli ile zużywasz, a to chcesz mieć stałe) i nie wczytujesz ile masz metalu(bo wczytujesz koszt a nie ilość)

0
twonek napisał(a):

Pokombinuję jeszcze..., z typem const mam błedy..
Bo tak ma być! Właśnie w ten sposób kompilator mówi Ci, że robisz głupstwo. kosztMetalu to stały koszt jednego krążownika w metalu. Nie wczytujesz do niego, tylko do metal! Zresztą popatrz na tę linię:

int tmp = min(metal/kosztMetalu

Nie zastanawia Cię, jaką wartość ma zmienna metal?

Coś rozumiem, tzn. ze jak koszMetalu = 20000;,to jest stały koszt tego, i do tego nie mam wprowadzać swoich danych z klawiatury? Dobrze rozumiem?
Poniżej poprawiony kod z const:

 #include <iostream>

using namespace std;



int main()
{

    int metal,krysztal,deuter;
     const int kosztMetalu = 20000;
   const  int kosztKrysztalu = 7000;
   const  int kosztDeuteru = 2000;

    for(;;)
    {


        cout <<endl<< "Ile masz metalu: " <<endl;
        //cin >> kosztMetalu;
        cout<<"Ile masz Krysztalu: "<<endl;
       // cin>>kosztKrysztalu;
        cout <<"Ile masz Deuterow: " <<endl;
        //cin>>kosztDeuteru;

        int tmp = min(metal/kosztMetalu, krysztal/kosztKrysztalu);
        int ileMoznaKupic = min(tmp, deuter/kosztDeuteru);
        {
            cout<< "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
        }


        if  ((kosztMetalu <20000)||(kosztKrysztalu<7000)||(kosztDeuteru<2000))
        {
            cout <<endl<<"Nie stac cie na krazownik";
        }


        else
        {
            cout<<endl<<"Podales niepoprawne dane";
        }



    }
    return 0;

}

Alb zle rozumiem, ale zle jestem rozumiany.... Chodzi mi, żeby przy tych wartosciach metalu:20000, kryształ:7000, Deuter:2000... Podaję z klawiatury inne wartosci niż wyzej przy wartościach metalu, krysztalu , deuteru.... I na podstawie danych , które podaję z klawiatury, dostaję komunikat ze kupiłem np. 2 krązowniki czy 4 krązowniki...

0

to co do tej pory robiłeś to ustawiałeś koszt metalu i innych surowców a potem wczytywałeś ten koszt... może dla odmiany wczytuj ilość danego surowca zamiast ilości potrzebnej do budowy?

0
cout <<endl<< "Ile masz metalu: " <<endl;
cin >> metal;
...
0
twonek napisał(a):
cout <<endl<< "Ile masz metalu: " <<endl;
cin >> metal;
...

Tak robiłem całkowicie na początku, i działało, tylko nie wylicza mi ile kupiłem danych krązowników, po podanych przeze mnie danych..
if((kosztMetalu >=20000) && (kosztKrysztalu>=7000) &&(kosztDeuteru >=2000)) Przy tym ifie wylicza mi ze kupuje mi jeden krazownik, obojętnie ile danych wprowadzę powyżej tych zmiennych: 20000,7000,2000. Jeśli wprowadzę wielokrotność tych danych, to powinno mi dać wynik np. 2 lub 4 krązowniki zostały kupione.... Kolega Szeszwe dał mi podpowiedz:
Jeżeli chcesz żeby tak było to w pętli jeśli jest spełniony warunek inkrementujesz sobie jakąś zmienną i ją wstawiasz do tego wypisywanego komunikatu. I tu muszę próbować znalezc rozwiązanie...

0

Chyba jednak szybciej będzie jak podam gotowca zamiast wskazówek.

#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
    const int kosztMetalu = 20000;
    const  int kosztKrysztalu = 7000;
    const  int kosztDeuteru = 2000;
   	
    int metal, krysztal, deuter;
 
    for(int i = 0; i < 3; ++i)
    {
        cout << "Ile masz metalu: " << endl;
        cin >> metal;
        cout<<"Ile masz Krysztalu: " << endl;
        cin >> krysztal;
        cout <<"Ile masz Deuterow: " << endl;
        cin >> deuter;
 
        int tmp = min(metal/kosztMetalu, krysztal/kosztKrysztalu);
        int ileMoznaKupic = min(tmp, deuter/kosztDeuteru);
        if (ileMoznaKupic > 0)
        {
            cout<< "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
        }
        else
        {
            cout << "Nie stac cie na krazownik" << endl;
        }
    }
    return 0;
}
0
twonek napisał(a):

Chyba jednak szybciej będzie jak podam gotowca zamiast wskazówek.

Nie o gotowca mi chodziło....tylko o podpowiedzi. Ale mimo to dzięki. Byłem blisko rozwiązania...
if (ileMoznaKupic > 0) tego brakowało... Co do tego:

 int metal, krysztal, deuter;

   // for(int i = 0; i < 3; i++) - **to nie jest potrzebna**
0
Biały Terrorysta napisał(a):

Byłem blisko rozwiązania...

Biały Terrorysta napisał(a):
Jeżeli chcesz żeby tak było to w pętli jeśli jest spełniony warunek inkrementujesz sobie jakąś zmienną i ją wstawiasz do tego wypisywanego komunikatu. 

I tu muszę próbować znalezc rozwiązanie...

0
twonek napisał(a):
Biały Terrorysta napisał(a):

Byłem blisko rozwiązania...

Biały Terrorysta napisał(a):
Jeżeli chcesz żeby tak było to w pętli jeśli jest spełniony warunek inkrementujesz sobie jakąś zmienną i ją wstawiasz do tego wypisywanego komunikatu. 

I tu muszę próbować znalezc rozwiązanie...

Ostatni problem związany z tym zadaniem... Chodzi mi ze jak podam ilość metalu jako liczbę ujemną np. -21000 , to po wprowadzeniu danych do konca dostaję komunikat: wprowadzono błedne dane z powodu ze daję liczbę ujemną... W kodzie spróbowałem zastosować taką implementację:

     

   int tmp = min(metal/kosztMetalu, krysztal/kosztKrysztalu);
     int ileMoznaKupic = min(tmp, deuter/kosztDeuteru);
        if (ileMoznaKupic > 0)
        {
            cout<<endl<< "Mozna kupic: " << ileMoznaKupic << " krazownikow" << endl;
        }
          else if ((  metal < 0)&&( krysztal < 0)&&( deuter <0))
    {
        cout<<endl<<"Podales nieprawidlowe dane";
    }
    else
    {

        cout<<"Nie stac cie na ten krazownik";
    }

    } 

Program się uruchamia, ale dostaję komunikat albo o ilosci krązownikow, lub ze nie stać cię na krązownik. Tak jakby ta liczba ujemna którą podaję przy metalu, krysztale lub deuterze nie wnosiła nic.... W jaki sposób moge rozwiązać ten problem...

0

Zamień && na ||

0
twonek napisał(a):

Zamień && na ||

Wielkie dzięki, moja nieuwaga.... Bardzo dziękuję za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1