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

[C++] Dziele napisu na wyrazy z użyciem char.

Ostatnio zmodyfikowano 2014-03-22 21:57
Autor Wiadomość
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:
C/C++
#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.
P-107002
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:
C/C++
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 ) // jezeli doszlismy do konca wzoru to znaczy ze on tam jest
         return true; // i wychodzimy z funkcji zwracajac true
   
    // inne przypadki to gdzy znaki się nie zgadzaja albo doszlismy do konca tablicy. W obu tych przypadkach zwracamy false
    return false;
}

no i np.
C/C++
char tab[] = "aaBCdddB",
wzor[] = "BC";

jestCiag( tab, wzor, 2 ); //zwroci true
jestCiag( tab, wzor, 7 ); //false itd.. mysle ze zrozumiale ;)

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
P-107006
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.
P-107007
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()?
P-107009
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
P-107010
pekfos
» 2014-03-22 16:49:59
ale tu się chyba nie przyda bo ona porównuje całe tablice
Nieprawda.
P-107011
stryku
» 2014-03-22 16:56:09
no w sumie masz rację.

EDIT
Chociaż nie. Jak byś tu zastosował strcmp()?
P-107012
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 ;)
P-107017
« 1 » 2
  Strona 1 z 2 Następna strona