[C++] Pomijanie znaków innych niż litery
Ostatnio zmodyfikowano 2013-12-21 19:50
LislaV Temat założony przez niniejszego użytkownika |
[C++] Pomijanie znaków innych niż litery » 2013-12-19 21:19:52 Chcę udoskonalić mojego konsolowego wisielca tak, aby ignorował wszystkie inne znaki niż litery. Pętla gry wygląda tak: for(;; ) { system( "cls" ); int intPodanyZnak = static_cast < int >( podanyZnak ); cout << " Zgaduj " << gracz << "! "; cout << endl << endl << endl; rysujWisielca( bledy ); cout << endl; wypiszZakodowanyWyraz( szukanyWyraz, dlugoscSzukanegoWyrazu, podanyZnak, zakodowanyWyraz ); cout << endl; cout << endl; wypiszUzyteZnaki( podanyZnak, uzyteZnaki, licznik, intPodanyZnak ); cout << endl << endl; if( zakodowanyWyraz == szukanyWyraz ) { wygrana( szukanyWyraz, licznik, gracz ); break; } if( bledy == 8 ) { przegrana( szukanyWyraz, gracz ); break; } cout << " Podaj litere: "; podanyZnak = getch(); cout << endl; if( licznik > 0 ) { if( czyNiepoprawna( intPodanyZnak ) ) { continue; } } if( byloPodane( podanyZnak, uzyteZnaki ) ) { continue; } if( !czyDobraLitera( szukanyWyraz, podanyZnak ) ) { bledy++; } licznik++; }
I jeszcze 2 funkcje, które sprawdzają znaki void wypiszUzyteZnaki( char znak, string & uzyteZnaki, int licznik, int numer ) { int dlugosc = uzyteZnaki.length(); for( int i = 0; i < dlugosc; i++ ) { if( uzyteZnaki[ i ] == znak || numer < 65 || numer > 122 ) { cout << " Uzyto nastepujacych liter: " << uzyteZnaki; return; } } uzyteZnaki += znak; uzyteZnaki += ", "; if( licznik == 0 ) { uzyteZnaki.erase( 0, 2 ); } cout << " Uzyto nastepujacych liter: " << uzyteZnaki; }
bool czyNiepoprawna( int numer ) { if( numer < 65 || numer > 122 ) { return true; } else { return false; } }
Według mnie to powinno działać, w końcu podawany jest znak, i jeśli nie jest on literą to pętla wykonuje sie to continue. Zamiast tego jest tak, że podaje litery i jest dobrze, potem podaje jakis inny znak i jakimś cudem zwiększa mi sie zmienna "błędy" (a licznik zostaje nie ruszony), ale gdy znowu wcisnę jakiś znak nie będący literą to już nic sie nie dzieje. Dopiero gdy podam znowu litere i potem nie litere to znowu błędy sie zwiększają itd. Po drugie nie do końca wiem o co chodzi z tym licznikiem w miejscu if( licznik > 0 ) { if( czyNiepoprawna( intPodanyZnak ) ) { continue; } } bo gdy usune ten pierwszy warunek to potem ucina mi pierwszą litere w użytych znakach (np, zamiast p, e, k, u jest , e, k, u). |
|
MrPoxipol |
» 2013-12-20 10:36:54 |
|
LislaV Temat założony przez niniejszego użytkownika |
» 2013-12-20 13:25:37 Przecież mam taką funkcje bool czyNiepoprawna( int numer ) { if( numer < 65 || numer > 122 ) { return true; } else { return false; } }
Jako numer podawany jest oczywiście kod znaku. Od 91 do 96 są jeszcze znaki nie będące literami, ale na razie ich nie dodałem tam do warunku. |
|
pekfos |
» 2013-12-21 15:06:22 Nie można po prostu użyć isalpha()? |
|
LislaV Temat założony przez niniejszego użytkownika |
» 2013-12-21 19:50:07 Działa! Szkoda, że wcześniej nie wiedziałem o tej funkcji, oszczędziłbym sobie kilka godzin zmarnowanych na szukaniu błędu.. Dzięki :) |
|
« 1 » |