Malina94 Temat założony przez niniejszego użytkownika |
[C++] Dziele napisu na wyrazy z użyciem char. » 2014-03-22 16:03:19 Witam! Mam za zadanie napisać program, który będzie dzielił napis na wyrazy. Napis składa się z wyrazów i separatorów. Separator to znak lub kilka znaków oddzielających wyrazy, natomiast wyraz to pozostałe znaki. Przykład: wejście m4link4 4 -1- 1 123abc456def abcdef wyjście m link - - 123 456 Na wejściu podaję napis, a po spacji separator. Na wyjściu otrzymują wyrazy rozdzielone spacją. Nie mogę operować tutaj na stringach. Jedynie char, char* i ich tablice, a maksymalna długość napisu, separatora i wyrazu nie może przekroczyć 10000 znaków. Bardzo słabo programuję, przez co program mi nie wychodzi. :/ Ogólnie wiem, że muszę użyć tutaj wskaźników, ale póki co próbowałam coś wymyślić bez używania ich, w celu rozgryzienia algorytmu. Na ten moment mam coś takiego: #include <iostream> using namespace std;
int main() { char para[ 1000 ] = { }; char separator[ 1000 ] = { }; char wyraz[ 1000 ] = { }; cin >> para >> separator; for( int i = 0; i < 1000; i++ ) { for( int j = 0; j < 1000; j++ ) { if(( para[ i ] != separator[ j ] ) && para != NULL ) { wyraz[ i ] = para[ i ]; } else { wyraz[ i ] = ' '; } } } return 0; }
Wykonanie jest kalekie, ale ideą było wykonanie dwóch pętli, z czego zewnętrzna leci po elementach pary, a wewnętrzna separatora. Jeśli, dla wybranego elementu pary nie znajdę takiego samego elementu w separatorze, to wpisuję go do wyrazu, a jeśli dla elementu pary znalazłam taki sam w separatorze, to wpisuję spację. Niestety nawet to nie działa, bo program wpisuje całą parę w wyraz. Bardzo proszę o wskazówki. //W tablice wpisałam 1000 zamiast 10000 w ramach testowania. |
|
stryku |
» 2014-03-22 16:31:38 ja to bym zrobił sobie na Twoim miejscu funkcję, która przyjmuje dwie tablice i patrzy czy są one równe(czy mają te same znaki po kolei) lub funkcję, która przyjmuje dwie tablice(wskaźniki na nie) i numer znaku od którego zacząć w jednej sprawdzanie czy istnieje dalej taki ciąg. Z racji tego, że nie bardzo wytłumaczyłem i pewnie nie wiesz o co chodzi to prosz: bool jestCiag( char * tab1, char * wzor, int i ) { int nr = 0; while( tab1[ i ] != NULL && wzor[ nr ] != NULL && tab1[ i ] == wzor[ nr ] ) { ++i; ++nr; } if( wzor[ nr ] == NULL ) return true; return false; }
no i np. char tab[] = "aaBCdddB", wzor[] = "BC";
jestCiag( tab, wzor, 2 ); jestCiag( tab, wzor, 7 );
no i teraz po prostu przelatujesz sobie przez Twoje tablice i sprawdzasz. Tego już nie podam spróbuj sama ;) Co do Twojego kodu ja bym zrobił to na pętlach while |
|
Monika90 |
» 2014-03-22 16:34:52 stryku, nie porównuj wartości typu char z NULL. NULL jest dla wskaźnków, char to nie jest wskaźnik. |
|
pekfos |
» 2014-03-22 16:43:43 Wystarczy przejechać po wszystkich znakach słowa początkowego wywołując strchr() dla sprawdzenia, czy aktualny znak jest separatorem - jeśli jest, wypisujemy spację, jeśli nie, wypisujemy aktualny znak. Potem tylko jakiś bool dla ograniczenia ilości wypisywanych spacji. | ja to bym zrobił sobie na Twoim miejscu funkcję, która przyjmuje dwie tablice i patrzy czy są one równe(czy mają te same znaki po kolei) lub funkcję, która przyjmuje dwie tablice(wskaźniki na nie) i numer znaku od którego zacząć w jednej sprawdzanie czy istnieje dalej taki ciąg. | strcmp()? |
|
stryku |
» 2014-03-22 16:48:59 @Monika90 Dzięki za uwagę :)
@pekfos trochę głupio, że nie usunąłem tego początku mojej wypowiedzi. Masz rację z strcmp(), ale tu się chyba nie przyda bo ona porównuje całe tablice |
|
pekfos |
» 2014-03-22 16:49:59 | ale tu się chyba nie przyda bo ona porównuje całe tablice |
Nieprawda. |
|
stryku |
» 2014-03-22 16:56:09 no w sumie masz rację.
EDIT Chociaż nie. Jak byś tu zastosował strcmp()? |
|
pekfos |
» 2014-03-22 17:21:29 Nie zastosowałbym. W tym przypadku lepsze jest strchr(), lub tablica 256 booli (chyba, że źle zrozumiałem zadanie). Jeśli musiałbym użyć strcmp(), to podawałbym wskaźniki na odpowiednie miejsca w tekście i zrobiłbym dobry użytek z wartości zwracanej ;) |
|
| « 1 » 2 |