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

Kurs C++ odc.17 Praca Domowa

0 głosów
207 wizyt
pytanie zadane 24 lutego 2016 w C i C++ przez Youshimoto Nowicjusz (240 p.)

Cześć!

Jestem właśnie przy ostatnim odcinku z serii tutorialów C++ Mirka :) Napisałem pracę domową z odcinka o operacjach matematycznych, czy ktoś mógłby sprawdzić jak prezentuję się ten kod? (sprawdzenie czy wystraczy surowców na kupienie statku)

#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;
int m,k,d,t,c[2];
int main()
{
    cout << "Podaj ilość metalu: ";
    cin>>m;
    cout<<"Podaj ilość krysztaˆu: ";
    cin>>k;
    cout<<"Podaj ilość deutretu: ";
    cin>>d;
    if ((m || k || d)<0)
    {
        cout<<"Ujemna liczba, co? Bardzo śmieszne... :)";
            return 0; getch();getch();
    }
    c[0] = m/20000;
    c[0] = trunc(c[0]);
    c[1] = k/7000;
    c[1] = trunc(c[1]);
    c[2] = d/2000;
    c[2] = trunc(c[2]);


    int b=c[0];
    if (c[1]<b) b=c[1];
    if (c[2]<b) b=c[2];
    cout<<"Ilość statków które możesz kupić "<<b<<endl;
    return 0;
    getch(); getch();
}

 

1 odpowiedź

0 głosów
odpowiedź 24 lutego 2016 przez niezalogowany
edycja 24 lutego 2016

No niekoniecznie dobrze (żeby nie powiedzieć tragicznie):

  1. nieuzasadnione użycie zmienne globalnych (mogłyby być w funkcji main)
  2. niekoniecznie najlepsze nazewnictwo (nazwy zmiennych są niezrozumiałe)
  3. (m || k || d) < 0 znaczy co innego niż ci się wydaje, ten warunek nie ma szans na bycie mniejszy od zera, a to dlatego że sprawdzasz, czy: m != 0 lub k != 0 lub  d != 0, wynikiem tego wyrażenia może być 0 lub 1 (fałsz / prawda) i dopiero ta wartość jest sprawdzana, czy jest mniejsza od 0
  4. return 0; getch();getch(); źle, w momencie gdy wykonasz return 0 (0 oznacza, że program wykonał się prawidłowo, a wykonał się źle więc powinien być jakiś inny errorcode), nigdy nie wykonasz getch, itd
  5. if (c[2]<b) b=c[2]; overflow, zadeklarowałeś tablicę o o wielkości 2 a odwołujesz się do 3. elementu
  6. Styl pisania kodu jest słaby, pisanie wielu instrukcji w jednej linii jest uznawane za nieeleganckie
komentarz 24 lutego 2016 przez Youshimoto Nowicjusz (240 p.)
Mógłbyś powiedzieć mi trochę więcej o. 3. I 5. ? Czemu są sprawdzane warunki m!=0 itp? Zawsze też myślałem że np. w tablica[2] można przechowywać 3 elementy :/
komentarz 24 lutego 2016 przez niezalogowany

To co musisz wiedzieć to w C/C++ wartości, które są równe zero oznaczają także wartość false, z kolei każda inna wartość oznacza true.

Z kolei każdy if składa się z wyrażenia logicznego, które może być proste lub złożone, dalej każde wyrażenie logiczne może przyjmować jako wartość 0 lub 1, np (1 OR 0) to 1, (1 AND 0) to 0, itd.

If, to nic innego jak skok warunkowy, który sprawdza/oblicza wartość wyrażenia w nawiasie i skacze poza blok { } jeżeli wartość jest równa 0, np

bool expr = true;
if( expr ) // if się wykona, bo wartość pod wyrażeniem to 1 (wyrażenie zwraca prawdę)
{
  // do something
}

Z kolei w przypadku gdybyśmy chcielibyśmy skorzystać z tego skrótowego zapisu i zapisać coś w stylu if (expr == false), to musimy wykonać negację, tj.:

bool expr = false; // = 0
if( !expr ) // if się wykona, bo wartość pod wyrażeniem to 1, bo !0 = 1 (przy założeniu że możliwe wartości to 0 i 1)
{
  // do something
}

Wróćmy do Twojego kodu, ale uprośmy go nieco:

int m = 1, k = 0;

if(m || k)
{ // to powinnyśmy zobaczyć
   cout << "m = 1  k = 0" << endl;
}


m = 0;
k = 0;
if(m || k)
{ // tego nie zobaczymy
   cout << "m = 0  k = 0" << endl;
}


m = k = 1;
{ // to zobaczymy
   cout << "m = k = 1" << endl;
}

Jak widzisz pojedyncze liczby niosą za sobą wartość, policzmy na piechotę wykonanie twojego if'a: załóżmy, że m = 1, k = 0, d = -7:

// liczymy: ((m || k || d)<0)

// pierwsze mamy nawiasy, więc zaczynamy od wyrażenia w nawiasach
// wszystkie operatory są o równym prorytecie więc liczmy od lewej

// krok 1
(m || k) <=> (1 || 0) => 1 // bo 1 lub 0 daje 1, pamiętamy logikę

// krok 2
(1 || d) <=> (1 || -7) => /* jak mówiłem każda wartość różna od 0 to logiczna jedynka) (1 || 1) <=> 1

// krok 3 - porównanie
(1 < 0) => 0 // oczywiste

Myślę, że to jest już mniej więcej jasne.

Idźmy do kolejnego pytania, dlaczego int tablica[2] miałoby oznaczać tablicę 3-elementową? Ten zapis oznacza: stwórz dwuelementową tablicę, można (bo język tego nie zbrania) odwoływać się do dalszych indeksów, ale pamiętaj że są tam śmieci (lub inne dane) i program może ci się posypać

komentarz 24 lutego 2016 przez Youshimoto Nowicjusz (240 p.)
Dzięki wielkie bro :)

Podobne pytania

0 głosów
1 odpowiedź 190 wizyt
0 głosów
1 odpowiedź 639 wizyt
pytanie zadane 26 stycznia 2018 w C i C++ przez jezyk2796 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 9 grudnia 2017 w C i C++ przez antekwi546 Użytkownik (510 p.)

93,424 zapytań

142,420 odpowiedzi

322,637 komentarzy

62,782 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...