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

Proszę o pomoc ,algorytm Boyera i Moore

Ostatnio zmodyfikowano 2011-03-03 20:13
Autor Wiadomość
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 )
C/C++
#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"; // <-- tutaj potrzebuje pomocy
    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 ]
P-28752
pekfos
» 2011-03-02 18:21:42
kod w [cpp][/cpp] wstaw.

nie można tak przypisać ciągu. użyj strcpy()
P-28753
kacpioza
Temat założony przez niniejszego użytkownika
re
» 2011-03-02 18:29:09
spróbuje , thx za pomoc :) <piwko>
P-28756
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 :/

C/C++
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
P-28759
pekfos
» 2011-03-02 19:09:04
może dla tego ze do wskaźnika na wczytany ciąg wrzucasz adres znaku
P-28760
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 :/
P-28763
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



C/C++
#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;
}

P-28816
« 1 »
  Strona 1 z 1