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

problemowe stringi

Ostatnio zmodyfikowano 2011-02-14 22:42
Autor Wiadomość
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.  
C/C++
# 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 ];
// to co jest do tego miejsca jest narzucone z góry//
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 ) /*głowny*/
            { 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)
P-28234
SeaMonster131
» 2011-02-14 21:13:45
kod daj w
[cpp]....[/cpp]

i jeszcze napisz z czym masz problem :)
P-28235
malan
» 2011-02-14 21:22:56
1. Zapoznaj się z » KursyKurs STC kurs 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
P-28236
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:
C/C++
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.
P-28237
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
C/C++
#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;
}
P-28238
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
P-28239
« 1 »
  Strona 1 z 1