Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Pomijanie znaków innych niż litery

Ostatnio zmodyfikowano 2013-12-21 19:50
Autor Wiadomość
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:

C/C++
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

C/C++
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;
}

C/C++
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
C/C++
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).
P-99668
MrPoxipol
» 2013-12-20 10:36:54
Sprawdź czy znak znajduje się pomiędzy a a Z.
http://pl.wikipedia.org/wiki​/ASCII
P-99685
LislaV
Temat założony przez niniejszego użytkownika
» 2013-12-20 13:25:37
Przecież mam taką funkcje
C/C++
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.
P-99689
pekfos
» 2013-12-21 15:06:22
Nie można po prostu użyć isalpha()?
P-99731
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 :)
P-99763
« 1 »
  Strona 1 z 1