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. #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; }
|
|
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 |
|
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. |
|
Piastlis |
» 2015-05-13 09:27:53 Sam sobie odpowiedziałeś.Licz "zawodowo" a poprawki "amatorskie" dopiero przy pisaniu wyników... |
|
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. |
|
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. |
|
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. |
|
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: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! |
|
« 1 » |