Pomoc przy poprawianiu błędów w funkcji

2011-09-14 20:00
gość
0

Wiecie co jest nie tak z tą funkcją? Proszę o rady.

enum DIRECTION { DIR_LEFT = "lewo", DIR_RIGHT = "prawo", DIR_STRAIGHT = "prosto"};
int Odnajdywanie(string Cel, bool bPomoc)
{
    cout << "ODNAJDYWANIE WLASCIWEJ DROGI:" << endl;
    cout << "--------------" << endl;

    cout << "Odszukaj droge do: " << Cel << endl << endl;
    cout << "Zasady: przed twoim celem 5 zakretow, a kazdy to 3 mozliwe drogi.\nPoprawna kombinacja drogi jest losowana kazdorazowo. Przy kazdym z rozstajow wybierz kierunkek\nw ktorym sie udajesz\n(lewo/prawo/prosto). Jesli trafisz w slepy zaulek, rozpoczynasz od nowa." << endl;
    Dalej();

    DIRECTION PoprawnyKierunek[4];
    for (int y = 0; y < 5; y++) {
        int nLogic = rand() % 3 + 1;
        switch (nLogic) {
               case 1: PoprawnyKierunek[y] = DIR_LEFT;
               case 2: PoprawnyKierunek[y] = DIR_RIGHT;
               case 3: PoprawnyKierunek[y] = DIR_STRAIGHT;
        }
    }

    bool bMeta = false;
    do {
        for (int i = 0; i < 5; i++) {
            cout << "Zakret numer " << i + 1 << "." << endl;
            cout << "Wybierz kierunek ktorym podazysz. (lewo/prawo/prosto)" << endl;
            string KierunekWpisywany[4];
            DIRECTION Kierunek[4];

            do {
               if (bPomoc == true) cout << "[POMOC OSOBY TRZECIEJ] Wydaje mi sie, ze trzeba pojechac w " << static_cast<string>(PoprawnyKierunek[i]) << endl;
               bBlednaKomenda = false;
               cin >> KierunekWpisywany[i];

               if (KierunekWpisywany[i] == "lewo") Kierunek[i] = DIR_LEFT;
               else if (KierunekWpisywany[i] == "prawo") Kierunek[i] = DIR_RIGHT;
               else if (KierunekWpisywany[i] == "prosto") Kierunek[i] = DIR_STRAIGHT;
               else if (KierunekWpisywany[i] == "lewo" && KierunekWpisywany[i] == "prawo" && KierunekWpisywany[i] == "prosto") bBlednaKomenda = true;
            } while (bBlednaKomenda == true);

            cout << "Podazasz w kierunku: " << static_cast<string>(Kierunek[i]) << endl << endl;

            bool bZlaDroga;
            if (Kierunek[i] != PoprawnyKierunek[i]) bZlaDroga = true;

            if (i == 4) {
                  if (bZlaDroga == false) {
                                  cout << "Docierasz do celu: " << Cel << endl << endl;
                                  bMeta = true;
                  }
                  else if (bZlaDroga == true) {
                       cout << "Slepy zaulek! Cofamy sie i zaczynamy od poczatku!" << endl << endl;
                  }
            }

            Dalej();
        }
    } while (bMeta == false);

    return 0;
}
edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-09-14 20:21
Kumashiro
0

Brzydki font i kolory...
A tak na serio, to może powiedz co się dzieje i jaki błąd otrzymujesz. Będzie łatwiej znaleźć.

Pozostało 580 znaków

2011-09-14 20:31
0

Poczytaj o instrukcji switch i jak się jej używa, teraz nie działa tak jak tobie się wydaje.

Pozostało 580 znaków

2011-09-14 20:36
Kumashiro
0
Zjarek napisał(a)

Poczytaj o instrukcji switch i jak się jej używa, teraz nie działa tak jak tobie się wydaje.

Huh? Co Ty tam wypatrzyłeś? IMHO jest OK, ale późno już, może czegoś nie widzę...

Pozostało 580 znaków

2011-09-14 20:38
0

brak break;


Pozostało 580 znaków

2011-09-14 20:43
Kumashiro
0

break; nie jest obowiązkowy. Ta instrukcja jedynie przerywa sprawdzanie przypadków. Jej brak jest nierozsądny (chociaż tu nie ma to wielkiego znaczenia), ale poprawny. Ale na C++ się nie znam, może tam jest inaczej.

Pozostało 580 znaków

2011-09-14 20:47
1
  1. Dlaczego zmienna "kierunekwpisywany" jest tablicą?
  2. Zmienna "bZlaDroga" nie musi być deklarowana przy każdym obiegu pętli do-while;
  3. Zamiast "<< static_cast<string>(Kierunek[i]) <<" wystarczy "<<KierunekWpisywany[i]<<".

@up Brak break; powiduje w tym przypadku, że za każdym razem kierunek zostanie ustawiony na DIR_STREIGHT.

edytowany 2x, ostatnio: xrisx, 2011-09-14 20:57
Shit, mój błąd. Idę spać. - Kumashiro 2011-09-14 20:49

Pozostało 580 znaków

2011-09-14 20:55
0

Największy problem z tą funkcją jest taki, że to nie jest de facto funkcja a program.
To największy z problemów głównie stylistycznych w tym kodzie.
Inne to:

  • enum pisany dużymi literami
  • nie opisane stałe (4,5)
  • nadmiarowy kod:
while (bBlednaKomenda == true);

zamiast

while (bBlednaKomenda);
  • (nie) "ciekawa" konwersja
    static_cast<string>(PoprawnyKierunek[i])

itd...


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2011-09-14 21:05
0

Mam takie pytanie, od kiedy w C++ można używać stringów w enumach?


w sumie to nie można, a może jakiś kompilator ma takie rozszerzenie? - byku_guzio 2011-09-14 21:09
hahaha, w sumie to nie zwróciłem na to uwagi - xrisx 2011-09-14 21:10
stringi są kompatybilne ze wskaźnikami, a te z int, więc podejrzewam że "sprytny" kompilator by sobie poradził, tylko wynik będzie raczej opłakany - vpiotr 2011-09-14 21:48

Pozostało 580 znaków

2011-09-15 17:24
gość
0

poprawiłem błędy. dodałem break'i i zmieniłem alternatywy enumów ze stringów na int'y.
Dodałem także na potrzeby testowania wykaz poprawnych kierunków po ich losowaniu.
I chcąc sprawdzić, czy dojdę do celu, wpisywałem po kolei poprawne 5 kierunków i...

po wprowadzeniu kolejno 5 razy kierunku program zamiast poinformować o zwycięstwie po prostu się zamyka ("program blebleble przestał działać").

żadnej funkcji abort() ani nic w tym rodzaju nie wprowadzałem. co jest tego przyczyną? oto "chyba" wadliwy fragment:

// zmienna i to licznik do pętli for, numer 4 oznacza ostatnie wykonanie prostej, przynajmniej w mym zamyśle

if (i == 4) {
                  if (bZlaDroga == false) {
                                  cout << "Docierasz do celu: " << Cel << endl << endl;
                                  bMeta = true;
                  }
                  else if (bZlaDroga == true) {
                       cout << "Slepy zaulek! Cofamy sie i zaczynamy od poczatku!" << endl << endl;
                  }
            }

Pozostało 580 znaków

2011-09-15 17:43
0

Po

bMeta=true;

dodaj cin.get();

edytowany 1x, ostatnio: xrisx, 2011-09-15 17:44

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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