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

Problem z while

Ostatnio zmodyfikowano 2009-04-20 16:46
Autor Wiadomość
Riant
Temat założony przez niniejszego użytkownika
Problem z while
» 2009-04-19 19:38:37
Witam.

Mam taki oto kod:
C/C++
while( !plik1.eof() )
{
    plik1 >> slowo1;
    if( szukany1 == slowo1 )
    {
        system( "cls" );
        plik1 >> slowo1;
        cout << endl << PL( "Słowo: " ) << szukany1 << endl << PL( "Przetłumaczone: " ) << slowo1 << endl;
    } else { cout << "Nie ma tego słowa w bazie."; }
}

I dlaczego gdy uruchomię program i warunek if(szukany1==slowo1) jest spełniony,
to wyświetla się:

Słowo: JakieśSłowo
Przetłumaczone: JakieśSłowo2
Nie ma tego słowa w bazie.

Dlaczego wyświetla się else skoro if jest spełniony? Co źle napisałem?
Oczywiście kawałek "Nie ma tego słowa w bazie." wyświetla się tyle razy, ile jest wierszy do sprawdzenia w bazie, ale to już inny problem.
P-5853
pekfos
» 2009-04-19 19:45:12
C/C++
while( !plik1.eof() )
{
    plik1 >> slowo1;
    if( szukany1 == slowo1 )
    {
        system( "cls" );
        plik1 >> slowo1;
        cout << endl << PL( "Słowo: " ) << szukany1 << endl << PL( "Przetłumaczone: " ) << slowo1 << endl;
        break;
    } else { cout << "Nie ma tego słowa w bazie."; }
}

to powinno pomóc

//edit:
break sprawia że pętla sie urywa czyli przestajesz dalej pobierać dane z pliku. przecież następne słowa w pliku nie będą takie jak szukany1 przez co w następnych przebiegach spełnia sie warunek else
P-5854
DejaVu
Rozwiązanie
» 2009-04-19 19:46:59
C/C++
bool znaleziono = false;
while( !plik1.eof() )
{
    plik1 >> slowo1;
    if( szukany1 == slowo1 )
    {
        znaleziono = true;
        break;
    } //if
} //while

if( znaleziono == true )
{
    cout << endl << PL( "Słowo: " ) << szukany1 << endl << PL( "Przetłumaczone: " ) << slowo1 << endl;
} else
{
    cout << "Nie ma tego słowa w bazie.";
} //else
P-5855
Riant
Temat założony przez niniejszego użytkownika
» 2009-04-19 19:57:13
Dzięki! Działa. :D
Ale żeby nie zakładać nowego tematu...
Jeśli warunek if nie jest spełniony, to else jest wyświetlany tyle razy
ile jest wierszy w bazie.
Jak mogę to ograniczyć, żeby komunikat że słowa nie ma wyświetlał się tylko raz?
Chodzi mi konkretnie w jaki sposób można się dowiedzieć, czy dany tekst został już wyświetlony?
Tak schematycznie:
C/C++
if( cout << "Nie ma słowa w bazie"; != 1 )
{
    cout << "Nie ma słowa w bazie";
}
O coś takiego mi chodzi.
Jest jakiś sposób by sprawdzić czy tekst "Nie ma słowa w bazie" został już
wyświetlony?
P-5857
driver1995
» 2009-04-19 20:05:40
Np. coś takiego możesz zrobić:
C/C++
bool costam = true;
//kod
if( costam == true )
{
    cout << "Nie ma slowa w bazie";
    costam = false;
}
Jeśli dobrze zrozumiałem, o co Ci chodzi to powinno ujść...
P-5858
Riant
Temat założony przez niniejszego użytkownika
» 2009-04-19 20:16:41
Piotrze Szawdyński po użyciu Twojego sposobu w switch wyrzuca mi błędy:

C/C++
int main()
{
   
    system( "color F0" );
    string szukany1, slowo1;
    string szukany2, slowo2;
    bool znaleziono = false;
    do
    {
        cout << PL( "Coś tam"; )
        int wybor;
        cin >> wybor;
        switch( wybor )
        {
        case 1:
            {
                system( "cls" );
                coutPL( "Coś tam" );
                break;
            }
        case 2:
            {
                system( "cls" );
                cout << PL( "Coś tam." );
                break;
            }
        case 3:
            {
               
                ifstream plik1( "slownik1.txt" );
                while( !plik1.eof() )
                {
                    plik1 >> slowo1;
                    if( szukany1 == slowo1 )
                    {
                        znaleziono = true;
                        break;
                    } //if
                } //while
               
                if( znaleziono == true )
                {
                    plik1 >> slowo1;
                    cout << endl << PL( "Słowo: " ) << szukany1 << endl << PL( "Przetłumaczone: " ) << slowo1 << endl;
                } else
                {
                    cout << PL( "Nie ma tego słowa w bazie." );
                } //else
            }
            break;
        }
    case 4:
        {
            system( "cls" );
            ifstream plik2( "slownik2.txt" );
            cout << "Wpisz szukany wyraz: ";
            cin >> szukany2;
            while( !plik2.eof() )
            {
                plik2 >> slowo2;
                if( szukany2 == slowo2 )
                {
                    system( "cls" );
                    plik2 >> slowo2;
                    cout << endl << PL( "Słowo: " ) << szukany2 << endl << PL( "Przetłumaczone: " ) << slowo2 << endl;
                } else { cout << PL( "Nie ma słowa w bazie." );
                }
                break;
            }
            default:
            exit( 0 );
        }
    } while( 1 );
   
    getch();
    return 0;
}


C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp In function `int main()':
163 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp case label `4' not within a switch statement
181 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp case label not within a switch statement
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected `while' before '}' token
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected `(' before '}' token
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected primary-expression before '}' token
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected `)' before '}' token
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected `;' before '}' token
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp At global scope:
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected unqualified-id before "while"
184 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected `,' or `;' before "while"
185 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected constructor, destructor, or type conversion before ';' token
186 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected unqualified-id before "return"
186 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected `,' or `;' before "return"
187 C:\Documents and Settings\Administrator\Pulpit\BezNazwy1.cpp expected declaration before '}' token

driver1995 jak rozwiążę ten problem, sprawdzę Twój pomysł. Z góry dzięki. ;-)
P-5859
setless
» 2009-04-19 21:31:43
A od kiedy to case'y wyrzuca się przed switch'a ? Poza tym masa innych błędów składniowych. O ile sposób Tobie przedstawiony ( już dwukrotnie ) jest dobry, o tyle gorzej z Twoją, jego implementacją. Przeczytaj i przeanalizuj pierwsze 2 udzielone odpowiedzi.
P-5863
Riant
Temat założony przez niniejszego użytkownika
» 2009-04-19 21:59:51
setless
A gdzie ja case'a wrzuciłem przed switch'a?

A po drugie, gdy zamiast:
C/C++
bool znaleziono = false;
while( !plik1.eof() )
{
    plik1 >> slowo1;
    if( szukany1 == slowo1 )
    {
        znaleziono = true;
        break;
    } //if
} //while

if( znaleziono == true )
{
    cout << endl << PL( "Słowo: " ) << szukany1 << endl << PL( "Przetłumaczone: " ) << slowo1 << endl;
} else
{
    cout << "Nie ma tego słowa w bazie.";
} //else
Było:
C/C++
while( !plik1.eof() )
{
    plik1 >> slowo1;
    if( szukany1 == slowo1 )
    {
        system( "cls" );
        plik1 >> slowo1;
        cout << endl << PL( "Słowo: " ) << szukany1 << endl << PL( "Przetłumaczone: " ) << slowo1 << endl;
    }
    break;
    else { cout << "Nie ma tego słowa w bazie."; }
}
To program dobrze się kompilował.
Więc nie pisz że "masa" błędów składniowych. Takie to ja widzę.
Możliwe że coś namieszałem w związku z nowym kawałkiem kodu.
Przeanalizuję jak pisałeś. Ale dalej nie wiem gdzie jest błąd i co
go powoduje.
P-5864
« 1 » 2
  Strona 1 z 2 Następna strona