Błędne zachowanie programu po wykonaniu instrukcji if z komunikatami

0

Cześć.

Od razu ostrzegam że kod będzie długi. Po prostu kiedy indziej rozdzielę go na pliki i headery, a żeby wam go pokazać musiałem połączyć. Proszę was żebyście się nie śmiali, że próbuję tworzyć "system operacyjny". To tylko takie określenie, mój programik bowiem bazuje tylko na paru komendach.

Więc tak. Chciałem żeby mój program nawet w razie przepuszczenia przez sito błędów kompilatora mógł powiadomić użytkownika o błędach logicznych lub błędach samego usera. A to np. komenda dost. dopiero po zalogowaniu, a to komenda niedost. dla osób publicznych, a to komenda niezrozumiała dla programu. Tak więc kiedy chcę sprawdzić jak mój program reaguje na błędy (celowo wpisuję nieznaną mu komendę), to reaguje prawidłowo, jednak gdy po tym wprowadzam poprawną komendę, nie otrzymuję z jego strony żadnej odpowiedzi.
Natomiast jeśli od razu po rozpoczęciu użytkowania wpiszę komendę poprawną, wszystko będzie okej.

Dziwne, prawda?
I uwaga, godzilla nadchodzi ;P

/* IOS - "Ilnicki" - the Operative System of Future
version 0.8c
author: Paweł Ilnicki
developer: Ilnicki Studios GmbH  (xD hehe)*/

#include <iostream>
#include <conio.h>
#include <string>
#include <cmath>

using namespace std;

// Ważne zmienne/stałe
string strKomenda;
const string strHasloAdmin = "niepyskuj";

// Funkcje systemu
string czytaj_notatki()
{
       // tutaj są jakieś tajne notatki admina...
                
       return "IOS System Alert: Komenda 'czytaj_notatki' wykonana pomyslnie";
}

string uruchom_kalkulator()
{
       cout << "KALKULATOR" << endl;
       static int nOpcja;
       do {
          float fLiczba1;
          cout << "Podaj pierwsza liczbe: ";
          std::cin >> fLiczba1;

          float fLiczba2;
          cout << "Podaj druga liczbe: ";
          std::cin >> fLiczba2;
    
          cout << "   Wybierz dzialanie:" << endl;
          cout << "   1 - Dodawanie" << endl;
          cout << "   2 - Odejmowanie" << endl;
          cout << "   3 - Mnozenie" << endl;
          cout << "   4 - Dzielenie" << endl;
          cout << "   5 - Kwadrat liczby a" << endl;
          cout << "   6 - Kwadrat liczby b" << endl;
          cout << "   7 - pierwiastek liczby a" << endl;
          cout << "   8 - pierwiastek liczby b" << endl << endl;
          cout << "   0 - Wyjdz do systemu" << endl;
          cout << "" << endl;
          cout << "Wybierasz opcje... ";
          std::cin >> nOpcja;
    
          switch (nOpcja)
          {
                 case 1: cout << fLiczba1 << "+" << fLiczba2 << "=" << fLiczba1 + fLiczba2; break;
                 case 2: cout << fLiczba1 << "-" << fLiczba2 << "=" << fLiczba1 - fLiczba2; break;
                 case 3: cout << fLiczba1 << "*" << fLiczba2 << "=" << fLiczba1 * fLiczba2; break;
                 case 4: 
                 if (fLiczba2 == 0)
                 {
                             cout << "Dzielnik nie moze być zerem! Ponow probe!";
                 }
                 else
                 {
                    cout << fLiczba1 << ":" << fLiczba2 << "=" << fLiczba1 / fLiczba2;
                 }
                 break;
                 case 5: cout << fLiczba1 << " do potegi 2 " << "= " << pow(fLiczba1, 2); break;
                 case 6: cout << fLiczba2 << " do potegi 2 " << "= " << pow(fLiczba2, 2); break;
                 case 7: cout << "Pierwiastek z liczby " << fLiczba1 << "= " << sqrt(fLiczba1); break;
                 case 8: cout << "Pierwiastek z liczby " << fLiczba2 << "= " << sqrt(fLiczba2); break;
                 case 0: cout << "Wybrales wyjscie do systemu."; break;
                 default: cout << "Pomyliles sie przy wyborze funkcji." << endl;
          }
          cout << "" << endl << endl;
       } while (nOpcja > 0);
          
       return "IOS System Alert: Komenda 'uruchom_kalkulator' wykonana pomyslnie";
}

// TUTAJ TE FUNKCJE TRZEBA DOKOŃCZYĆ, BO JESZCZE ICH NIE NAPISAŁEM
string uruchom_wirtualny_pawel()
{
       
       cout << "" << endl << endl;
    
       return "IOS System Alert: Komenda 'uruchom_wirtualny_pawel' wykonana pomyslnie";
} 

string uruchom_mapa_swiata()
{
       /* mapa świata będzie polegała na tekstowym zobrazowaniu mapy powiatu sulęcińskiego
       będzie można poprosić o zmierzenie dł. mdz. dwoma miejscowościami itd. */
       
       cout << "" << endl << endl;
    
       return "IOS System Alert: Komenda 'uruchom_mapa_swiata' wykonana pomyslnie";
} 

string uruchom_quiz()
{
       
       cout << "" << endl << endl;
    
       return "IOS System Alert: Komenda 'uruchom_quiz' wykonana pomyslnie";
} 

string uruchom_nuda()
{
       cout << "" << endl << endl;
    
       return "IOS System Alert: Komenda 'uruchom_nuda' wykonana pomyslnie";
}
// RESZTA PONIŻEJ TO JUŻ GOTOWY KOD PROGRAMU W WERSJI 0.8c

int main()
{
    cout << "ZUNIFIKOWANY SYSTEM OPERACYJNY ILNICKI STUDIOS" << endl;
    cout << "VER. 0.8c" << endl;
    cout << "--------------------------------------------------------" << endl << endl;
    
    // Krok 1: Pokaż dostępne komunikaty
    cout << " Komendy poczatkowe:" << endl;
    cout << "---------------------------------------" << endl;
    cout << "zaloguj                   zaloguj sie do systemu operacyjnego" << endl;
    cout << "zaloguj_publiczny         zaloguj natychmiastowo jako osoba publiczna" << endl << endl;
    
    cout << " Komendy dostepne po operacji 'zaloguj'" << endl;
    cout << "---------------------------------------" << endl;
    cout << "czytaj_notatki            czytaj notatki" << endl;
    cout << "uruchom_kalkulator        uruchom program kalkulator" << endl;
    cout << "uruchom_wirtualny_pawel   zapytaj go o pomoc w trudnych sprawach!" << endl;
    cout << "uruchom_mapa_swiata       zobacz mape okolicy" << endl;
    cout << "uruchom_quiz              uruchom gre z pytaniami" << endl;
    cout << "uruchom_nuda              program na nude w domu" << endl;
    cout << "exit                      konczy program" << endl << endl;
    
    // Krok 2: Pobierz od użytkownika komendę
    bool bKomendaPoprawna = true;
    do {
        cin >> strKomenda;
    
        // Krok 3: Spr. czy jest dostępna lub poprawna i ew. powtórzenie podania komendy
        if (strKomenda == "czytaj_notatki" || strKomenda == "uruchom_kalkulator" || strKomenda == "uruchom_wirtualny_pawel" || strKomenda == "uruchom_mapa_swiata" || strKomenda == "uruchom_quiz" || strKomenda == "uruchom_nuda" || strKomenda == "exit")
        {
               bKomendaPoprawna = false;
               cout << "IOS Error: Komenda dostepna po zalogowaniu. Sprobuj ponownie." << endl << endl;
        }
        if (strKomenda != "czytaj_notatki" && strKomenda != "uruchom_kalkulator" && strKomenda != "uruchom_wirtualny_pawel" && strKomenda != "uruchom_mapa_swiata" && strKomenda != "uruchom_quiz" && strKomenda != "uruchom_nuda" && strKomenda != "zaloguj" && strKomenda != "zaloguj_publiczny" && strKomenda != "exit")
        {
                       bKomendaPoprawna = false;
                       cout << "IOS Error: Komenda niepoprawna. Wpisuj komendy tylko podane w tabelkach." << endl; cout << "Sprobuj ponownie." << endl << endl;
        }
        if (bKomendaPoprawna == true)
        {
                             cout << "" << endl;
        }
    } while (bKomendaPoprawna == false);

    
    // Krok 4: W zależności od wybranej komendy - zaloguj lub zaloguj_publicznie odpowiednio zareaguj
    bool bZalogowanoAdministrator = false;
    bool bZalogowanoPubliczny = false;
    bool bZalogowanoPomyslnie = false;
    
    // Krok 5: Zaloguj użytkownika do konta administrator lub jako osobę publiczną o ograniczonych możliwościach
    do {
       if (strKomenda == "zaloguj")
       {
          for (int nLiczbaProb = 6; nLiczbaProb > 0; )
          {
              string strPropozycjaHasla;
              cout << "Podaj haslo... Pozostalo prob: " << nLiczbaProb << endl;
              cin >> strPropozycjaHasla;
                    
              cout << "" << endl;
        
              if (strPropozycjaHasla == strHasloAdmin)
              {
                 cout << "Poprawne haslo. Przekierowanie do konta w systemie." << endl << endl;
                 bZalogowanoAdministrator = true;
                 bZalogowanoPomyslnie = true;
                 break;
              }
              else
              {
                  cout << "Niepoprawne haslo. Sprobuj ponownie." << endl << endl;
                  nLiczbaProb--;
              }
           }
       }
       else if (strKomenda == "zaloguj_publiczny")
       {
                   bZalogowanoPubliczny = true;
                   bZalogowanoPomyslnie = true;
                   cout << "Zalogowano pomyslnie. Przekierowanie do konta w systemie." << endl << endl;
       }
    } while (bZalogowanoPomyslnie == false);
    
    // Krok 6: Przyjmuj i wykonuj rozkazy otrzymane od użytkownika dopóki bRozkazExit przyjmuje wartość false
    bool bRozkazExit = false;
    do {
        do {
           cin >> strKomenda;
           
           if (strKomenda == "czytaj_notatki" && bZalogowanoPubliczny == true)
           {
                          bKomendaPoprawna = false;
                          cout << "IOS System Alert: Osoby publiczne nie moga czytac notatek uzytkownikow." << endl << endl;
           }
           if (strKomenda != "czytaj_notatki" && strKomenda != "uruchom_kalkulator" && strKomenda != "uruchom_wirtualny_pawel" && strKomenda != "uruchom_mapa_swiata" && strKomenda != "uruchom_quiz" && strKomenda != "uruchom_nuda" && strKomenda != "zaloguj" && strKomenda != "zaloguj_publiczny" && strKomenda != "exit")
           {
                       bKomendaPoprawna = false;
                       cout << "IOS Error: Komenda niepoprawna. Wpisuj komendy tylko podane w tabelkach." << endl; cout << "Sprobuj ponownie." << endl << endl;
           }
           if (bKomendaPoprawna == true)
           {
                             cout << "" << endl;
           }
        } while (bKomendaPoprawna == false);
        
        cout << "" << endl;
        
        // Przemianowanie komendy na liczbę
        int nKomenda;
        if (strKomenda == "czytaj_notatki") nKomenda = 1; 
        if (strKomenda == "uruchom_kalkulator") nKomenda = 2; 
        if (strKomenda == "uruchom_wirtualny_pawel") nKomenda = 3; 
        if (strKomenda == "uruchom_mapa_swiata") nKomenda = 4; 
        if (strKomenda == "uruchom_quiz") nKomenda = 5; 
        if (strKomenda == "uruchom_nuda") nKomenda = 6; 
        if (strKomenda == "exit") nKomenda = 0;
        
        // Instrukcja switch do poszczególnych komend
        switch (nKomenda)
        {
               case 1: czytaj_notatki(); break;
               case 2: uruchom_kalkulator(); break;
               case 3: uruchom_wirtualny_pawel(); break;
               case 4: uruchom_mapa_swiata(); break;
               case 5: uruchom_quiz(); break;
               case 6: uruchom_nuda(); break;
               case 0: cout << "IOS System Alert: System Ilnicki zamyka swoje procesy i wylaczy sie za chwile." << endl; break;
               default: cout << "IOS Error: Komenda niepoprawna. Wpisuj komendy tylko podane w tabelkach." << endl;
        } 
        
        // Instrukcja sprawdzająca czy użytkownik wprowadził komendę "exit"
        if (strKomenda == "exit")
        {
                       bRozkazExit = true;
        }
    } while (bRozkazExit == false);
    
    return 0;
}

0

Problemem jest to, że jeżeli wprowadzi się niepoprawną komendę to zmienna bKomendaPoprawna przyjmie wartość false i już nigdy nie przyjmie wartości true -> nigdy nie opuści pętli.

0

Już w porządku.
warunek:

if (bKomendaPoprawna == true)

zamieniłem na:

if (strKomenda == "zaloguj" || strKomenda == "zaloguj_publiczny")

i działa okej.

0

if (strKomenda != "czytaj_notatki" && strKomenda != "uruchom_kalkulator" && strKomenda != "uruchom_wirtualny_pawel" && strKomenda != "uruchom_mapa_swiata" && strKomenda != "uruchom_quiz" && strKomenda != "uruchom_nuda" && strKomenda != "zaloguj" && strKomenda != "zaloguj_publiczny" && strKomenda != "exit")
{

Za takie coś powinno się obowiązkowo wysyłać na chłostę.
Pomyśl, jak mogłoby być to zrobione inaczej :)

0

Jak nic tu by się zdała mapa wskaźników do funkcji, w której kluczem byłaby komenda.

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