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

Kod z wykorzystanie funkcji rfind() nie dziala poprawnie

Ostatnio zmodyfikowano 2015-05-13 14:00
Autor Wiadomość
Huxyf
Temat założony przez niniejszego użytkownika
Kod z wykorzystanie funkcji rfind() nie dziala poprawnie
» 2015-05-12 21:11:02
Witam,
Dzisiaj napisałem taki programik oparty na funkcjach przeszukujących tekst, w celu utrwalenia informacji zawartych w tutejszym kursie. Wszystko działa, lecz dostrzegłem iż przy wybraniu opcji wyszukiwanie od tylu wraz z frazą > 1 program podaje indeksy o jeden mniejsze np. przy 1 i 2 znaku podaje 0-1 a nie 1-2.

C/C++
#include <iostream>
#include <string>

using namespace std;

void Wyszukaj( string tekst, string fraza, int & ile, int pozycje[], bool r )
{
    unsigned int pozycja;
    int x = 0;
   
    if( r == false )
    {
        pozycja = tekst.find( fraza );
    }
    if( r == true )
    {
        pozycja = tekst.rfind( fraza );
    }
   
    while( pozycja != string::npos )
    {
       
        if( r == false )
        {
            pozycje[ x ] = pozycja;
            pozycje[ x + 1 ] = pozycja +( fraza.size() - 1 );
            pozycja = tekst.find( fraza, pozycja + fraza.size() );
        }
       
        if( r == true )
        {
            pozycje[ x ] = pozycja -( fraza.size() - 1 );
            pozycje[ x + 1 ] = pozycja;
            if( pozycja < fraza.size() )
            {
                ile++;
                return;
            }
            pozycja = tekst.rfind( fraza, pozycja - fraza.size() );
        }
       
        x += 2;
        ile++;
       
    }
}

bool Wybierz_tryb()
{
    int znak;
    bool blad;
    cout << endl << "Tryby wyszukiwania" << endl;
    cout << "[0] Od przodu" << endl;
    cout << "[1] Od tylu" << endl << endl;
    cout << "Wybierz tryb wyszukiwania: ";
   
    for(;; )
    {
        cin.clear();
        cin.sync();
        cin >> znak;
        blad = cin.fail();
        if(( znak == 0 ) &&( blad == false ) )
        {
            return false;
        }
        if( znak == 1 )
        {
            return true;
        }
        cout << endl << "Nieprawidlowy tryb! ";
        cout << "Wybierz ponownie tryb wyszukiwania: ";
    }
}

void Wynik( string tekst, string fraza, int & ile, int pozycje[] )
{
    int dlugosc, x = 1;
   
    dlugosc = fraza.size();
    cout << endl << "---\tRAPORT KONCOWY\t---" << endl << endl;
   
    if( ile == 0 )
    {
        cout << "Nie znaleziono frazy \"" << fraza << "\"!";
        return;
    }
   
    cout << "Fraza \"" << fraza << "\" zostala znaleziona " << ile << " razy!" << endl;
    cout << "Miejsca znalezienia fraz:" << endl;
   
    for( int i = 0; i <( 2 * ile ); i += 2 )
    {
        if( dlugosc == 1 )
        {
            cout << x << ". " << pozycje[ i ] + 1 << endl;
        }
        else if( dlugosc > 1 )
        {
            cout << x << ". " << pozycje[ i ] + 1 << "-" << pozycje[ i + 1 ] + 1 << endl;
        }
        x++;
    }
}

int main()
{
    string ciag = "", fraza = "";
    int pozycje[ 1000 ];
    int ile = 0;
    bool tryb;
   
    cout << "----------------------" << endl;
    cout << "| WYSZUKAJ W TEKSCIE |" << endl;
    cout << "----------------------" << endl << endl;
   
    cout << "Wpisz tekst: ";
    getline( cin, ciag );
    cout << endl << "Wyszukaj fraze: ";
    getline( cin, fraza );
   
    tryb = Wybierz_tryb();
    Wyszukaj( ciag, fraza, ile, pozycje, tryb );
    Wynik( ciag, fraza, ile, pozycje );
   
    return 0;
}
P-132144
darko202
» 2015-05-13 08:03:02
dziwne, u mnie działa :)
szukanie od tyłu

tekst = "Ola ma kota"
fraza = "ma"

pozycja = 4

tekst[4] = m
tekst[5] = a

------------------

tekst = "Ola ma kota i ma psa"
fraza = "ma"

pozycja = 14

tekst[14] = m
tekst[15] = a
 

pamiętasz że jest tekst[0] = O
P-132170
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-13 09:17:15
Właśnie w tym sęk że tworzyłem ten kod pod przeciętną osobę, która nie wie że w programowaniu tablice indeksowane są od zera. Dlatego przy wyświetlaniu wyświetlałem indeksy o 1 większe. Czyli tak naprawdę gdy widzisz pozycje[1] = 1 to ona mam w rzeczywistości 0. I nie wiem dlaczego ale dla pozostałych opcji wyświetla poprawnie.
P-132172
Piastlis
» 2015-05-13 09:27:53
Sam sobie odpowiedziałeś.Licz "zawodowo" a poprawki "amatorskie" dopiero przy pisaniu wyników...
P-132173
Maciek
» 2015-05-13 09:40:35
Nie analizowałem jeszcze twojego programu bardzo dokładie, ale nie wiem dlaczego po wybraniu trybu wyszukiwania aplikacja kończy swoje działanie, wklejam całą konsolę:

----------------------
| WYSZUKAJ W TEKSCIE |
----------------------

Wpisz tekst: asdaddasdasdassasssss

Wyszukaj fraze: dd

Tryby wyszukiwania
[0] Od przodu
[1] Od tylu

Wybierz tryb wyszukiwania: 1
<terminated>

Jak widać we frazie znajduje się ciąg "dd". Może będzie potrzebny jeszcze debug :). Pozdrawiam.
P-132174
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-13 10:29:36
Piastlis - Mógłbyś jaśniej?

Maciek - Wiesz co u mnie wszystko działa, tylko tj. już pisałem złe pozycje podaje. Spróbuj może jeszcze coś wyszukać, ponieważ byłem pewny że jest OK.
P-132177
Piastlis
» 2015-05-13 10:35:02
Obliczenia i testowanie dla indeksowania od 0.Jak wszystko zadziała poprawka o 1 przy pisaniu wyników.Nie mieszaj 2 systemów bo bardzo łatwo się pomylisz. 
P-132178
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-13 14:00:57
Piastlis - Ale ja właśnie tak robię, na końcu dopiero wyświetlam o 1 większe wartości.

Ponownie przeanalizowałem fragment kodu przypisujądego pozycje przy wyborze sortowania wykorzystującego funkcje rfind().

Fragment kodu:
C/C++
if( r == true )
{
    pozycje[ x ] = pozycja -( fraza.size() - 1 );
    pozycje[ x + 1 ] = pozycja;
    if( pozycja < fraza.size() )
    {
        ile++;
        return;
    }
    pozycja = tekst.rfind( fraza, pozycja - fraza.size() );
}

PRZYKŁAD 1.

aayfdcs
0123456

pozycja = 1

pozycje[ x ] = 1 - (2 - 1) = 1 - 1 = 0
pozycje[ x + 1 ] = 1

Obie wartości przy wyświetlaniu zwiększamy o 1

Wynik: 1-2


PRZYKŁAD 2.

aaaahyd
0123456

pozycja = 3

pozycje[ x ] = 3 - (4 - 1) = 3 - 3 = 0
pozycje[ x + 1 ] = 3

Obie wartości przy wyświetlaniu zwiększamy o 1

Wynik: 1-4

Teoretycznie powinno być ok, dlatego nadal nie mogę zlokalizować problemu. Proszę o pomoc!
P-132188
« 1 »
  Strona 1 z 1