iskierka0076 Temat założony przez niniejszego użytkownika |
problemowe stringi » 2011-02-14 21:07:04 mam problem z zadaniem, które polega na tym że:
Dana jest tablica tekstów tab , i tablica par słów. Tablica słów pełni rolę słownika, w której w kolumnie zerowej znajdują się słowa, a w kolumnie pierwszej ich zamienniki. Zadanie ma polegać na napisaniu funkcji która w tabeli tekstów zamieni, słowa ze słownika na ich zamienniki. Oraz zwróci liczbę zamian.
# include <stdio.h> # include <string.h> # define DLU 25 int transA( char * tab[], int tlines, char * sl[][ 2 ], int slines ); char tekst[][ DLU ] = { { "ala ma kotalota" }, { "jola ma kota ota i jota" }, { "charlota ma kota i jota" } }; char * tabWskT[ sizeof( tekst ) / 2 * DLU ]; char slowa[][ 2 ][ DLU ] = { { "ala", "jan" }, { "kota", "rybe" }, { "jota", "lisa" } }; char * tabWskS[ sizeof( slowa ) / 2 * DLU ][ 1 ];
int trans( char * tab[], int tlines, char * sl[][ 2 ], int dlines ) { int nl = 0; for( int k = 0; k < tlines( slowa ); k++ ) { char * pot; pot = sl[ k ][ 0 ]; char * pot sl[ k ][ 0 ]; char * tru; tru = sl[ k ][ 1 ]; size_t patlen = strlen( pot ); for( int i = 0; i < slines; i++ ) { int rozmiar = strlen( tab[ i ] ) - patlen + 1; int j = 0; while( j < rozmiar ) { if( !strncmp tab[ i + j ], pot, patlen ) { strncpy tab[ i + j ], tru, patlen ); j += patlen; nl++; } else j++; } return nl; }
problemy zaczynają się przy if (!strncmp tab[i+j], pot, patlen) |
|
SeaMonster131 |
» 2011-02-14 21:13:45 kod daj w [cpp]....[/cpp] i jeszcze napisz z czym masz problem :) |
|
malan |
» 2011-02-14 21:22:56 1. Zapoznaj się z Kurs STC i wstaw kod w tagi. 2. Szczerze Ci powiem, że kod nie wygląda najlepiej. Skorzystaj najlepiej z std::string . Masz narzucone jakiego typu zmienne powinieneś wykorzystać? /edit: Już widzę, co masz na narzucone ;p |
|
DejaVu |
» 2011-02-14 22:05:48 W zasadzie formułując problem w ten sposób poszukujesz gotowego rozwiązania... jedno z nich może wyglądać tak:
std::string wynik; for( int i = 0; i < zrodlo.size(); i++ ) { std::string dopasowany_wynik = dopasowano( zrodlo, i, zbior_poszukiwanych_napisow ); if( dopasowany_wynik.size() > 0 ) { wynik += dopasowany_wynik; i += dopasowany_wynik.size() - 1; } else wynik += zrodlo[ i ]; }
Wydajne rozwiązanie to nie jest, ale powinno być skuteczne. |
|
malan |
» 2011-02-14 22:37:36 Ja nie wiem w ogóle, po co to przesyłanie do funkcji tych tablic itp. Podziękuj prowadzącemu zajęcia za piękne zadanie... @DejaVu: A tak? ;p #include <cstdio> #include <cstring> #include <string>
#define DLU 25
int transA( char * tab[], int tlines, char * sl[][ 2 ], int slines );
char tekst[][ DLU ] = { { "ala ma kotalota" }, { "jola ma kota ota i jota" }, { "charlota ma kota i jota" } };
char slowa[][ 2 ][ DLU ] = { { "ala", "jan" }, { "kota", "rybe" }, { "jota", "lisa" } };
int main() { printf( "%d\n", transA( 0, 0, 0, 0 ) ); for( int i = 0; i < 3; ++i ) printf( "%s\n", tekst[ i ] ); }
int transA( char * tab[], int tlines, char * sl[][ 2 ], int slines ) { int counter = 0; std::size_t pos = 0; for( int i = 0; i < 3; ++i ) { std::string text = tekst[ i ]; for( int j = 0; j < 3; ++j ) { pos = text.find( slowa[ j ][ 0 ] ); while( pos != std::string::npos ) { text.erase( pos, strlen( slowa[ j ][ 0 ] ) ); text.insert( pos, slowa[ j ][ 1 ] ); ++counter; pos = text.find( slowa[ j ][ 0 ], pos + 1 ); } } strcpy( tekst[ i ], text.c_str() ); } return counter; } |
|
DejaVu |
» 2011-02-14 22:42:44 Ja dzisiaj już jestem zwolniony z myślenia - jeżeli uważasz, że działa Twoje rozwiązanie to dobrze :) mnie to lotto - nie mój problem ;p |
|
« 1 » |