Pomoc w rozwiazaniu zadania

Odpowiedz Nowy wątek
2015-06-06 00:30

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

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?

edytowany 1x, ostatnio: piotrino, 2015-06-06 00:31

Pozostało 580 znaków

2015-06-06 00:45

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

Lokalizacja: Kraków

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.

Pozostało 580 znaków

2015-06-06 00:49

Rejestracja: 6 lat temu

Ostatnio: 2 miesiące temu

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;
}
"magiczne liczby" czy tworzenie zmiennej dla każdej liczby nie tworzy bałaganu w postaci nadmiarowej ilości zmiennych? - Narkan 2015-06-06 02:02
Nie. Tworzysz stałe właśnie po to żeby unikać magicznych liczb. - twonek 2015-06-06 09:11
Ja tu zawsze staram się używać jak najmniejszej ilości zmiennych a tu psikus xD no cóż, trzeba zmienić przyzwyczajenia - Narkan 2015-06-06 10:13
Trzymaj się zasady minimalizacji zasięgu (deklaracja zmiennej najpóźniej jak się da, o jak najmniejszym zasięgu) i nie będzie bałaganu. - twonek 2015-06-06 16:47

Pozostało 580 znaków

2015-06-06 22:48

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

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.
> 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`
> 
> 
```cpp
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....

Pozostało 580 znaków

2015-06-06 23:09

Rejestracja: 6 lat temu

Ostatnio: 2 miesiące temu

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);

Pozostało 580 znaków

2015-06-07 13:55

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

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:
> 
```cpp
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....?

edytowany 1x, ostatnio: piotrino, 2015-06-07 13:56

Pozostało 580 znaków

2015-06-07 14:05

Rejestracja: 6 lat temu

Ostatnio: 2 miesiące temu

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?

Pozostało 580 znaków

2015-06-07 14:14

Rejestracja: 6 lat temu

Ostatnio: 4 miesiące temu

Lokalizacja: Warszawa

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ść)


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

Biały Terrorysta
2015-06-07 14:40
Biały Terrorysta
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...

źle rozumiesz :) - Niikelion 2015-06-07 14:43

Pozostało 580 znaków

2015-06-07 14:43

Rejestracja: 6 lat temu

Ostatnio: 4 miesiące temu

Lokalizacja: Warszawa

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?


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

2015-06-07 15:19

Rejestracja: 6 lat temu

Ostatnio: 2 miesiące temu

0
cout <<endl<< "Ile masz metalu: " <<endl;
cin >> metal;
...

Pozostało 580 znaków

Odpowiedz

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