kacpioza Temat założony przez niniejszego użytkownika |
Proszę o pomoc ,algorytm Boyera i Moore » 2011-03-02 18:19:25 Prosił bym o pomoc jest napisane w kodzie w komentarzu z czym , albowiem po przypisaniu tam do tej zmiennej char p jakiejś wartości po szukaniu odwzorowania wywala mi błąd ,oraz niektóre literki sprawdzi ,a niektóre nie i raz FALSE mi wyjdzie czyli -1 a raz TRUE czyli 0 ,a chodzi mi o to ,aby dla całego wyrazu ,a nie pojedynczej literki :/ wiem ,że to na bitach operuje ,może wy macie jakieś pomysły :/ był bym wdzięczny :) program ma być wykorzystywany do szukania tekstu w plikach (tekst do szukania wprowadzony przez użytkownika ) #include <fstream> #include <iostream> #include <conio.h>
using namespace std;
const int K = 26 * 2 + 2 * 2 + 1; int shift[ K ]; int indeks( char c ) { switch( c ) { case ' ': return 0; case 'ę': return 53; case 'Ę': return 54; case 'ł': return 55; case 'Ł': return 56; default: if( islower( c ) ) return c - 'a' + 1; else return c - 'A' + 27; } }
void init_shifts( char * w ) { int M = strlen( w ); for( int i = 0; i < K; i++ ) shift[ i ] = M; for( int i = 0; i < M; i++ ) shift[ indeks( w[ i ] ) ] = M - i - 1; }
int bm( char * w, char * t ) { init_shifts( w ); int i, j, N = strlen( t ), M = strlen( w ); for( i = M - 1, j = M - 1; j > 0; i--, j-- ); while( t[ i ] != w[ j ] ) { int x = shift[ indeks( t[ i ] ) ]; if( M - j > x ) i += M - j; else i += x; if( i >= N ) return - 1; j = M - 1; } return i; } int main() { ifstream is; char c, b, plik[ 256 ]; char * o; char * p; char * z; int i = 256; int l = 0; int x = 0; p = new char[ i ]; p = "jakis tekst"; z = new char[ l ]; cout << "Nazwa pliku:"; cin.get( plik, 256 ); is.open( plik ); b = is.good(); if( !b ) { puts( "Plik nie istnieje" ); _sleep( 1000 ); return 0; } else { while( is.good() ) { l = l + 1; c = is.get(); i++; if( i > 6 ) i = 0; if( is.good() ) { o =& c; cout << bm( p, o ) << endl; z[ l ] = c; cout << z[ l ]; } } x = l; for( l = 0; l > x; l++ ) { } } is.close(); getch(); return 0; }
[ / i ] |
|
pekfos |
» 2011-03-02 18:21:42 kod w [cpp][/cpp] wstaw.
nie można tak przypisać ciągu. użyj strcpy() |
|
kacpioza Temat założony przez niniejszego użytkownika |
re » 2011-03-02 18:29:09 spróbuje , thx za pomoc :) <piwko> |
|
kacpioza Temat założony przez niniejszego użytkownika |
re » 2011-03-02 19:05:44 nie chce kopiować mi znaków , nie mam pojęcia dlaczego :/ while( is.good() ) { c = is.get(); if( is.good() ) { o =& c; if( bm( p, o ) == 0 ) { strcpy( str, o ); } } }
widać ,że kopiuje ale puste pole tylko |
|
pekfos |
» 2011-03-02 19:09:04 może dla tego ze do wskaźnika na wczytany ciąg wrzucasz adres znaku |
|
kacpioza Temat założony przez niniejszego użytkownika |
re » 2011-03-02 19:29:46 chyba spróbuje zapisać to w hexie moża tak zadziała :/ |
|
kacpioza Temat założony przez niniejszego użytkownika |
re » 2011-03-03 20:13:29 Może się komuś przyda i coś pomyśli dla początkujących oczywiście :P tutaj macie kodzik ,teraz kminie tylko zamianę textu jak już mam pobraną pozycje :P danego wyrazu #include <fstream> #include <iostream> #include <conio.h>
using namespace std;
const int K = 26 * 2 + 2 * 2 + 1; int shift[ K ]; int indeks( char c ) { switch( c ) { case ' ': return 0; case 'ę': return 53; case 'Ę': return 54; case 'ł': return 55; case 'Ł': return 56; default: if( islower( c ) ) return c - 'a' + 1; else return c - 'A' + 27; } }
void init_shifts( char * w ) { int M = strlen( w ); for( int i = 0; i < K; i++ ) shift[ i ] = M; for( int i = 0; i < M; i++ ) shift[ indeks( w[ i ] ) ] = M - i - 1; }
int bm( char * w, char * t ) { init_shifts( w ); int i, j, N = strlen( t ), M = strlen( w ); for( i = M - 1, j = M - 1; j > 0; i--, j-- ); while( t[ i ] != w[ j ] ) { int x = shift[ indeks( t[ i ] ) ]; if( M - j > x ) i += M - j; else i += x; if( i >= N ) return - 1; j = M - 1; } return i; } int main() { ifstream is; ifstream iss; ofstream os; long poz; char c, b, plik[ 256 ]; char * o, * p, * buff;; int i = 1024, j = 0, ilosc, spr; p = new char[ 1024 ]; spr = 0; int a; cout << "Nazwa pliku:"; cin >> plik; cout << endl; cout << "Przeszukiwanie:"; cin >> p; is.open( plik ); iss.open( plik ); b = is.good(); a = sizeof( p ) / sizeof( char ); cout << a; if( !b ) { puts( "Plik nie istnieje" ); _sleep( 1000 ); return 0; } else { iss.seekg( 0, ios::end ); ilosc = iss.tellg(); iss.seekg( 0, ios::beg ); buff = new char[ ilosc ]; iss.read( buff, ilosc ); iss.close(); while( is.good() ) { c = is.get(); o =& c; if( is.good() ) { cout << " " j++; while( spr != a ) { if( bm( p + spr, o ) == 0 ) { cout << c; } spr++; } spr = 0; } } } cout << endl; cout << "ilosc znakow w tekscie to:" << ilosc << endl; cout << "caly tekst wyglada tak:" << endl; cout.write( buff, ilosc ); delete[] buff; is.close(); getch(); return 0; }
|
|
« 1 » |