Skocz do zawartości

Prosty problem, nauka programowania


Idź do rozwiązania Problem ogarnięty przez Prorok,

Recommended Posts

Witam, postanowiłem zacząć się uczyć programować wraz z poradnikami Pana Mirosława Zelenta na yt. Ogólnie idzie mi dość dobrze, jestem co prawda dopiero po 2 lekcji, ale postanowiłem odrobinę rozbudować kod i mam z nim problem. 

#include <iostream>
 
using namespace std;
 
string login, haslo;
int main()
{
    cout << "Login: ";
    cin >> login;
    cout << "Haslo: ";
    cin >> haslo;
    if ((login=="admin")&&(haslo=="password"))
        {
            cout << "Witamy w aplikacji!" << endl;
            cout << "Co chcialbys teraz zrobic?:" << endl;
            cout << "A: isc na piwo" << endl;
            cout << "B: isc na kebaba" << endl;
            cout << "C: isc na pizze" << endl;
            cout << "Odpowiedz: ";
            string odp;
            cin >> odp;
                if ((odp=="A")||(odp=="a"))
                {
                    cout << "I czego jeszcze gowniarzu?" << endl;
                }
                if ((odp=="B")||(odp=="b"))
                {
                    cout << "Najlepszy jest w alibabie." << endl;
                }
                if ((odp=="C")||(odp=="c"))
                {
                    cout << "To idz." << endl;
                }
                else
                {
                    cout << "To nie odpowiedz";
                }
        }
 
        else
        {
            cout << "Bledny login lub haslo." << endl;
        }
    return 0;
 
}

Login i hasło wchodzi bez problemu, natomiast następna opcja już średnio. Po wybraniu opcji C jest okej, ale po A i B dopisuje mi jeszcze "To nie odpowiedz" z warunku else. Robiłem coś podobnego wczoraj, też miałem ten problem, zacząłem wpisywać klamry w sumie bez zrozumienia i zadziałało. Może mi ktoś powiedzieć, jak powinny być ułożone? Po wpisaniu loginu i hasła dalsze operacje mam w całości w klamrach, po podaniu odpowiedzi wszystkie if i else są na jednym poziomie, natomiast czynności po spełnieniu warunku są w osobnych klamrach. Zamykając sobie minusami przy liczniku linijek kolejne czynności wszystko też wygląda raczej dobrze. Korzystam z Code::Blocks'a.

Będę wdzięczny jak ktoś mi wskaże błąd i wyjaśni, dlaczego tak a nie inaczej. Bez tego nie przejdę do dalszej części kursu, najpierw chciałbym opanować to na zadowalający poziom jak na początkującego, bo doświadczenie mam zerowe. Pozdrawiam :)

 

PS. program bez sensu, ale on nie ma mieć sensu, chciałem po prostu poćwiczyć. 

Edytowane przez Prorok
Link to post
Share on other sites

Struktura ELSE { } w twoim kodzie odnosi się tylko do ostatniego warunku IF, więc zostanie wykonana zawsze gdy odpowiedź jest inna niż "C" lub "c".

 

Do tego co chcesz zrobić najwygodniej będzie użyć struktury SWITCH

 

Przeczytasz o tym np tutaj:

http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Instrukcja-warunkowa-if-else/16

http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Warunek-wielokrotnego-wyboru-switch-case/17

 

Edit:

 

Ewentualnie możesz pisać:

 

if (warunek1) {
// spelniony warunek1
} else if (warunek2) {
// spelniony warunek2
} else if (warunek3) {
// spelniony warunek3
} else {
// nie spelniony zaden z powyzszych warunków
}
Edytowane przez tig3r
  • Popieram 1
Link to post
Share on other sites

Oczywiście że ci wypisuje cout << "To nie odpowiedz";.  Dlatego że podajesz A przechodzi przez pierwszy if , warunek spełniony więc go wykonuje. Idzie dalej drugi if jest niespełniony więc idzie dalej i dochodzi do trzeciego if który tez jest niespełniony ale w wypadku niespełnienia warunku if odp=C ma wykonać else więc to robi. Inaczej mówiąc ten else jest tylko do ostatniego IF. Datego jak chcesz robic takie coś używasz konstrukcji switch

 

switch( zmienna )
{
case wartosc_1:
    //jakiś kod jeżeli zmienna równa się wartosc_1
    break;
    
case wartosc_2:
    //jakiś kod jeżeli zmienna równa wartosc_2
    break;
    
    //...
case wartosc_n:
    //jakiś kod jeżeli zmienna równa wartosc_n
    break;
    
default:
    //jakiś kod gdy zmienna równa sie coś innego
    break;
}

  • Popieram 1
Link to post
Share on other sites
  • Rozwiązanie

Dzięki panowie, z "else if" działa jak należy. Co ciekawe, próbowałem tak wcześniej, ale musiałem gdzieś się pomylić, bo nie kod nie chciał się skompilować. Do struktur switch itp. jeszcze nie doszedłem, ale już rozumiem gdzie popełniłem błąd. Cóż, najwięksi architekci zaczynali od babek z piasku, wiec jeszcze sporo przede mną. Dzięki wielkie! 

Link to post
Share on other sites

Zawsze jak nie wiesz co się dzieje w programie to spróbuj zrobić to co ja ci rozpisałem prześledzić co jest po kolei wykonywane. Ja się uczyłem na stareńkim kompilatorze C++ Borlanda i tam była opcja wykonania programu linia po linii. W takich prościutkich programach świetna sprawa żeby zorientować się jak to działa i dlaczego (gdzie ) nam coś nie działa. W sumie można tego kompilatora używać teraz w emulatorze dosa czyli dosbox 

  • Popieram 1
Link to post
Share on other sites

Tak, próbowałem to prześledzić, ale sam się wprowadziłem najwidoczniej w błąd przez moją, póki co niezbyt rozległą wiedzę. Myślałem, że umieszczając te trzy ify na równi z else zadziała to tak, że po pierwszym spełnionym warunku nie przejdzie do następnych. Teraz tak na to patrzę i widzę, że moje myślenie było bez sensu, bo gdyby odpowiedź spełniała kilka warunków, to błędem by było zatrzymanie się po pierwszym spełnionym. W każdym razie kod ruszył, a mnie oświeciło.

Jeszcze mam pytanie odnośnie IDE, co myślicie o Visual Studio? Mam dostęp do softu z dreamsparka, poradniki wiadomo - na sofcie darmowym, bo nie każdy ma dostęp do płatnego oprogramowania, a do piractwa nikogo nie będą nakłaniać :).

Link to post
Share on other sites

Jak cie stać.. Visual studio jest potrzebne do pisania programów pod Windows GUI. Do takich prostych podstaw programowania aż nadto wystarczy ci darmowe gcc

edit

Tfu miałem na myśli  Dev-C++  używające gcc

  Edytowane przez kombajn
  • Popieram 1
Link to post
Share on other sites

Nie stać, mam go za darmo, dreamspark w szkole. Kojarzę ten program, bo w tamtym roku do matury z informatyki na nim ćwiczyli. Ale póki co będę dalej się uczył na code::blocks'ie. Jeszcze raz dzięki wielkie za zainteresowanie tematem! :) 

Link to post
Share on other sites
Gość
This topic is now closed to further replies.
  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...