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

[CR] C++ (#2): Instrukcja warunkowa if. Decyzje w programie

Object Storage Arubacloud
+4 głosów
7,953 wizyt
pytanie zadane 5 kwietnia 2016 w Nasze poradniki przez Mirosław Zelent Nałogowiec (34,750 p.)

CR = Code Review. O co chodzi? Zajrzyj tutaj
Pełna lista wszystkich Code Review? Zajrzyj tutaj

https://www.youtube.com/watch?v=hXLbgSh1Wo0

Kod z odcinka - bankomat:

#include <iostream>

using namespace std;

string PIN;

int main()
{
    cout << "Witaj w naszym banku!" << endl;
    cout << "Podaj numer PIN:";
    cin >> PIN;

    if(PIN=="1729")
    {
        cout<<"Poprawny PIN";
    }
    else
    {
        cout<<"Niepoprawny PIN";
    }
    return 0;
}

Kod z odcinka - logowanie:

#include <iostream>

using namespace std;

string login, haslo;

int main()
{
    cout << "Podaj login: ";
    cin >> login;
    cout << "Podaj haslo: ";
    cin >> haslo;

    if ((login=="admin")&&(haslo=="szarlotka"))
    {
        cout<<"Udalo sie zalogowac!";
    }
    else
    {
        cout<<"nie udalo sie zalogowac!";
    }

    return 0;
}

Kod z odcinka - sprawdzenie wieku:

#include <iostream>

using namespace std;

int wiek;

int main()
{
    cout << "Ile masz lat: ";
    cin >> wiek;

    if (wiek<18)
    {
        cout<<"Nie jestes pelnoletni i nie mozesz zostac prezydentem";
    }
    else if ((wiek>=18) && (wiek<35))
    {
        cout<<"Jestes pelnoletni ale nie mozesz zostac prezydentem";
    }
    else
    {
        cout<<"Jestes pelnoletni i mozesz zostac prezydentem";
    }
    return 0;
}

Paczka z odcinka: POBIERZ​

4 odpowiedzi

+6 głosów
odpowiedź 5 kwietnia 2016 przez SebekChlebek Stary wyjadacz (11,290 p.)
edycja 5 kwietnia 2016 przez SebekChlebek

Myślę, że jeśli już mówione jest o decyzjach w programie i wspomina Pan o instrukcji warunkowej if, to także warto by było poinformować o innych sposobach zrobienia tego samego, taka parafraza. Instrukcja switch jest wytłumaczona w #6 odcinku, lecz nie o to mi chodzi. Sądzę, że wyrażenie warunkowe już w tym momencie mogłoby się spodobać początkującemu programiście oraz pomóc. Pomoc w postaci takiej, że uczeń zaoszczędzi sobie pisania i gubienia się we własnych klamrach (chodzi oczywiście o proste warunki i instrukcje, wiem, że wyrażenie warunkowe nie zastąpi if'a).


Przykład pierwszego programu z odcinka przy użyciu tematu mojej wypowiedzi: 

#include <iostream>

using namespace std;

int main()
{
    string PIN;

    cout << "Witaj w naszym banku!" << endl;
    cout << "Podaj numer PIN: ";
    cin >> PIN;

    cout << ((PIN=="1729")? "Poprawny PIN" : "Niepoprawny PIN");
    return 0;
}

 

Drugi program:

#include <iostream>

using namespace std;

int main()
{
    string login, haslo;
    cout << "Podaj login: ";
    cin >> login;
    cout << "Podaj haslo: ";
    cin >> haslo;

    cout << (((login=="admin")&&(haslo=="szarlotka"))?
            "Udalo sie zalogowac!" : "Nie udalo sie zalogowac!" );

    return 0;
}

I trzeciego na siłę byśmy mogli zrobić tym sposobem ale to się mija z celem mojej wypowiedzi której ideą jest uproszczenie jak najbardziej tego zagadnienia oraz pokazanie alternatywy dla if'a. Można to sobie porównać z programami z oryginału - widać różnicę.


Dla zainteresowanych którzy nie spotkali się z tym sposobem lub początkujących którzy przybyli z YouTube:

To co wyżej jest napisane to wyrażenie warunkowe, operator. Nie instrukcja. Ten sposób zwraca różne wartości, od string'ów do double'ów.

Przykład:

wynik_wyrazenia = (liczba > 10)? 20 : 40;

wynik_wyrazenia przyjmie wartość 20 jeśli (if) liczba będzie większa od 10, jeśli nie (else) przyjmie wartość 40.

Proste i logiczne jak if'y.

warunek? wartosc_jesli_true : wartosc_jesli_false

Warunku nie trzeba dawać w nawias, lecz on poprawia czytelność kodu.

Można dać kilka warunków jak ja to zrobiłem w drugim przykładzie:

((login=="admin")&&(haslo=="szarlotka"))?
            "Udalo sie zalogowac!" : "Nie udalo sie zalogowac!"

Jeśli ktoś dalej nie rozumie odsyłam do Wikipedii i Google

Operator warunkowy - Wikipedia

Obrazek pokazujący działanie: (Źródło: Wikipedia)

 

To by było chyba na tyle, może na pierwszy rzut oka wydaje się, "A po co mi to jak to jest to samo co ify", ale zaoszczędzi to Ci dużo pisania.

Jeśli ktoś zauważył jakiś błąd, niedopatrzenie, proszę mnie poinformować.

2
komentarz 5 kwietnia 2016 przez draghan VIP (106,230 p.)

warto by było poinformować o innych sposobach zrobienia tego samego,

Nie polecam stosowania tego operatora w miejsce konstrukcji if-else, bo to nie jest to samo. Nie zwróciłeś w swojej wypowiedzi uwagi na to, że ten operator jedynie zwraca wartość, a więc odpada wszędzie tam, gdzie wymaga się większej ilości działań lub po prostu nie ma sensu żadnej wartości zwracać - ergo: operator nie zastąpi if-else.

Ponadto, blok if-else jest o wiele bardziej czytelny. Jeśli korzystamy z operatora wyboru zakresu + jakiegoś szablonu (nie daj boże - zagnieżdżonego), w dodatku warunek jest trochę bardziej skomplikowany... To robi się misz-masz. Owszem, czasami jest tego wygodnie użyć, ale nie jest to tak cudowne rozwiązanie, jak wynika z Twojego opisu. ;)

komentarz 5 kwietnia 2016 przez SebekChlebek Stary wyjadacz (11,290 p.)

Tak zgadzam się, pominąłeś ostatnie zdanie mojego wstępu:

(chodzi oczywiście o proste warunki i instrukcje, wiem, że wyrażenie warunkowe nie zastąpi if'a).

 Podczas tej wypowiedzi, głównie chodziło mi o te nieskomplikowane, z jedną instrukcją if'y.

1
komentarz 5 kwietnia 2016 przez draghan VIP (106,230 p.)
Nie widziałem tego wcześniej, może rzeczywiście mi umknęło - w takim razie przepraszam. Ale komentarz zostawię dla potomnych.
komentarz 8 kwietnia 2016 przez Shiro Stary wyjadacz (10,300 p.)

@Dragham
 

Nie polecam stosowania tego operatora w miejsce konstrukcji if-else, bo to nie jest to samo. Nie zwróciłeś w swojej wypowiedzi uwagi na to, że ten operator jedynie zwraca wartość, a więc odpada wszędzie tam, gdzie wymaga się większej ilości działań lub po prostu nie ma sensu żadnej wartości zwracać - ergo: operator nie zastąpi if-else.

Możesz wytłumaczyć dokładnie w jakim przypadku to nie za działa? Nie do końca rozumiem ;/ 

komentarz 1 czerwca 2016 przez draghan VIP (106,230 p.)
edycja 1 czerwca 2016 przez draghan

Możesz wytłumaczyć dokładnie w jakim przypadku to nie za działa? Nie do końca rozumiem ;/ 

Wybacz, Shiro, jakoś uciekł mi ten wątek. Inaczej mówiąc, operator ?: służy do warunkowego zwracania wartości, nie do warunkowego sterowania przebiegiem.

Przykład:

int i, j, k, l;
// ...
/*  Poniższe dwie konstrukcje są funkcjonalnie równoważne,
    bo warunkowo zwracasz jedną wartość.
*/
if(j > 0)
{
    i = k;
}
else
{
    i = l;
}

i = (j > 0) ? k : l;

/*  Poniższej konstrukcji już nie zastąpisz operatorem ?:, ponieważ
    nie służy on do selektywnego wykonania grupy instrukcji.
    Załóżmy, że każda z wywołanych funkcji zwraca void.
*/
if(j > 0)
{
    doSomething();
    doSomethingElse();
}
else
{
    doDifferentThing();
}

 

+2 głosów
odpowiedź 5 kwietnia 2016 przez niezalogowany
edycja 5 kwietnia 2016

Ja mam uwagę dotyczącą listingu 3 (ze sprawdzeniem wieku). Już odpuszczam sobie zmienne globalne, których problematyka była poruszona przy CR lekcji 1 przeze mnie i @adrian17.

Mamy tutaj pewną redundancję jeżeli chodzi o pierwszą część drugiego warunku, dla pozbycia się niejasności wyjustujmy je sobie w czytelniejszej (przyjaźniejszej) formie:

  1. IF wiek < 18
  2. ELIF
    1. wiek >= 18 --AND
    2. wiek < 35   --+
  3. ELSE

Zastanówmy się razem, co tutaj mamy: jeżeli (1) jest fałszywe to wiek musi być >= 18, z kolei (2) wykonuje się wyłącznie w przypadku gdy (1) jest fałszywe. Korzystając z wniosku przy (1) wiemy, że (2.1) jest ZAWSZE prawdziwe, co oznacza że jedyny warunek który ma wpływ na wykonanie (2) to (2.2).

Sam ten zapis (2) miałby sens jedynie wtedy gdyby warunki były zrobione wyłącznie na IF, a nie ELIF.

komentarz 8 kwietnia 2016 przez Shiro Stary wyjadacz (10,300 p.)
przywrócone 10 kwietnia 2016 przez Shiro
Proszę Cie napisz kod normalnie ..
komentarz 8 kwietnia 2016 przez niezalogowany
Nie rozumiem w jakim celu? Ten "psudokod" to jest pewne uproszczenie kodu MZ, dzięki czemu jest mi prościej się do niego dowodzić w moim pseudo-dowodzie pokazującym zbyteczność warunku 2.1
komentarz 8 kwietnia 2016 przez Shiro Stary wyjadacz (10,300 p.)

Po prostu taki kod:

if(wiek<18)

else if(wiek>=18&&wiek<35)
    
else

Jest czytelniejszy .. i tyle 

komentarz 8 kwietnia 2016 przez niezalogowany
@Shiro moim zdaniem to jest pewnego rodzaju zaciemnienie sytuacji, bo skoro w kolejnym warunku upewniamy się że dopiero co sprawdzona rzecz jest wciąż jest identyczna to zakładamy że pomiędzy tymi dwoma krokami (sprawdzającymi) coś mogło się zmienić.

Także w tym przypadku ten argument mnie nie przekonuje.
komentarz 10 kwietnia 2016 przez Shiro Stary wyjadacz (10,300 p.)
Okey, okey chyba się nie zrozumieliśmy.

Dla jasności takie działanie, które było zrealizowane przy okazji odcinku 2 c++ to redundacja i również nie jestem jego zwolennikiem gdyż to są nadmiarowe linie kodu. Potem taki programista w większym programie może popełnić kilka takich redundacji i spowolnić program, a my chcemy aby działał on możliwie jak najszybciej.

Mi chodziło jedynie aby nasz pasjonat @szymon zamknął kod w tagach kod tych tagach które pokolorują nam składnie przez co nasz kod stanie się czytelniejszy.

Pozdrawiam Shiro (Sebastian Hryszko)
komentarz 10 kwietnia 2016 przez niezalogowany

@Shiro, tylko że ja nie napisałem żadnego kodu, tylko wziąłem kod MZ i wrzuciłem go w punkty (pseudokod może być także wypunktowany i nie musi być w tagach, bo w tym przypadku mamy listę kroków) aby lepiej ukazać kolejność wykonywania instrukcji i ułatwić sobie pisanie dowodu. Także ten zabieg był celowy

1
komentarz 10 kwietnia 2016 przez Shiro Stary wyjadacz (10,300 p.)
Dobra nieważne .. Miłych zer i jedynek ;)
komentarz 31 maja 2016 przez jpacanowski VIP (101,940 p.)

Jest czytelniejszy .. i tyle 

Nie każdy musi znać języki C-podobne.

0 głosów
odpowiedź 31 maja 2016 przez Builder Nowicjusz (220 p.)

Używam Visual Studio Community 2015, kod programu identyczny. Ktoś coś doradzi czy pozostaje przerzucić się na Code::Blocks ? :)

komentarz 31 maja 2016 przez MrMock Bywalec (2,890 p.)
z tego co wyczytałem dodanie na górze #include <string> może pomóc
komentarz 31 maja 2016 przez Builder Nowicjusz (220 p.)
Dzięki wielkie! Wierze ze to poprostu wina IDE, chociaż bede dociekliwy.
komentarz 2 czerwca 2016 przez draghan VIP (106,230 p.)

I jak, zaincludowanie <string> pomogło?

Wierze ze to poprostu wina IDE

Bardziej "wina" kompilatora, niż IDE. ;)

Powinieneś założyć nowy wątek, który dotyczyłby Twojego problemu. Tutaj umieszczamy rewizje programów z kursu pana Mirosława, a Twoja odpowiedź nie jest związana z rewizją kodu. ;) To tak na przyszłość. :)

komentarz 3 czerwca 2016 przez Builder Nowicjusz (220 p.)
tak, dzieki wielkie :)

Ok zapamietam :)
0 głosów
odpowiedź 12 listopada 2018 przez wierzba56 Nowicjusz (160 p.)

Wszystko fajnie, ale po napisaniu w code bloksie przykładu z OR/AND podaje inny wynik niż na filmie:

#include <iostream>

using namespace std;

int x,a;

int main()
{

    cout<<"podaj x: ";
    cin>>x;
    cout<<"podaj a: ";
    cin>>a;



    if((x<=5)||(x>12)||(a!=7)&&(a>15))
    {
        cout<<"prawda";
    }
    else
    {
        cout<<"falsz";
    }


    return 0;
}

Czy to ja coś źle robię czy o co chodzi? Proszę powiedzcie.

EDIT: zmienne z filmu to x=3 a=7 i program pokazuje PRAWDA a nie FAŁSZ

komentarz 12 listopada 2018 przez niezalogowany

Przeczytaj adnotację do tego momentu:

Korekta: w C++ operator && ma pierwszeństwo nad || (tak jak np. w matematyce mnożenie ma pierwszeństwo przed dodawaniem). Stąd tak naprawdę mówię tutaj jedynie o takim warunku: if((x<=5 || x>12 || a!=7) && a>15)

Podobne pytania

0 głosów
3 odpowiedzi 510 wizyt
+2 głosów
1 odpowiedź 5,378 wizyt
+3 głosów
2 odpowiedzi 10,793 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...