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

Zadanie domowe z lekcji 32. Działa ale mam pewien problem.

Ostatnio zmodyfikowano 2016-11-20 00:50
Autor Wiadomość
MDK
Temat założony przez niniejszego użytkownika
Zadanie domowe z lekcji 32. Działa ale mam pewien problem.
» 2016-11-19 18:54:37
Mam problem z warunkiem w pętli for. Chociaż zadanie działa tak, jak powinno, wiem, że to nie jest dobre rozwiązanie. W tej chwili mam to tak:
 
for( znalezionaPoz; znalezionaPoz <= 100; znalezionaPoz++ )
 - pętla pozwala mi wprawdzie wyszukać zadaną frazę w tekście, jednak długość wiersza jest ustawiona na sztywno, w przykładzie na 100. Na pewno nie jest to optymalne rozwiązanie. Choć działa szybko(ale nie optymalnie szybko), to problem z wyszukiwaniem wystąpi jeśli wiersz jest dłuższy niż np. podane 100 znaków. Jednak jeśli próbuję zrobić tak:
for( znalezionaPoz; znalezionaPoz != string::npos; znalezionaPoz++ )
, co jak sądzę powinno automatycznie kończyć warunek po napotkaniu końca wiersza, dzieje się inaczej. Pętla kończy się chyba dopiero, gdy przeleci cały rozmiar typu size_t, całkowicie ignorując koniec wiersza i trwa to bardzo długo.
Jak napisać warunek, żeby po dojściu do końca wiersza pętla się kończyła?

C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void wyswietl( string nazwa, string szukanaFraza )
{
    ifstream plik;
    string wiersz;
    size_t znalezionaPoz;
   
    plik.open( nazwa );
   
    while( getline( plik, wiersz ) )
    {
        znalezionaPoz = wiersz.find( szukanaFraza );
       
        for( znalezionaPoz; znalezionaPoz <= 100; znalezionaPoz++ )
        {
           
            if( znalezionaPoz == wiersz.find( szukanaFraza, znalezionaPoz ) )
                 cout << wiersz << endl;
           
        }
    }
   
    plik.close();
}

int main()
{
    string fraza = "cpp";
    wyswietl( "cpp0x.txt", fraza );
    return 0;
}
P-153928
mateczek
» 2016-11-19 19:20:25
C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void wyswietl( string nazwa, string szukanaFraza ) {
    ifstream plik( nazwa );
    string wiersz;
    size_t znalezionaPoz;
    size_t jmp = szukanaFraza.size(); // o ile skoczyć przy następnym wyszukiwaniu
    while( getline( plik, wiersz ) ) {
        for( znalezionaPoz = wiersz.find( szukanaFraza ); znalezionaPoz != string::npos; znalezionaPoz = wiersz.find( szukanaFraza, znalezionaPoz + jmp ) )
        {
            cout << wiersz << endl;
        }
    }
}

int main()
{
    string fraza = "cpp";
    wyswietl( "cpp0x.txt", fraza );
    return 0;
}


A jak chcesz tylko sprawdzić czy w wierszu występuje choć raz to tak !!!
C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void wyswietl( string nazwa, string szukanaFraza ) {
    ifstream plik( nazwa );
    string wiersz;
    size_t znalezionaPoz;
    while( getline( plik, wiersz ) ) {
        znalezionaPoz = wiersz.find( szukanaFraza );
        if( znalezionaPoz != string::npos ) {
            cout << wiersz << endl;
        }
    }
}

int main()
{
    string fraza = "cpp";
    wyswietl( "cpp0x.txt", fraza );
    return 0;
}
P-153929
MDK
Temat założony przez niniejszego użytkownika
» 2016-11-20 00:50:29
Ok, dzięki!
Zamykam.
P-153945
« 1 »
  Strona 1 z 1