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

Problem z obsługą tablicy znaków

Ostatnio zmodyfikowano 2013-11-30 21:34
Autor Wiadomość
nologin
Temat założony przez niniejszego użytkownika
Problem z obsługą tablicy znaków
» 2013-11-16 21:30:27
Zadanie pochodzi z ,,Symfonii C++" z rozdziału o tablicach.
Dana jest tablica znaków w której znajduje się kilkunastowyrazowy C-string. Mamy za zadanie napisać funkcję, która przekopiuje nasz C-string do dwóch tablic. W jednej maje być wyrazy parzyste, a w drugiej nieparzyste. W obu tablicach wyrazy mają być oddzielone spacjami. Funkcja ma być wywoływana trzema argumentami:adres tablicy źródłowej, adres tablicy na wyrazy parzyste, adres tablicy na wyrazy nieparzyste.
Mój problem polega na tym, że napisany przeze mnie program kopiuje tylko pierwszy znak i tyle. Nie wiem, gdzie leży błąd.

 
C/C++
#include <iostream>
using namespace std;
void rozdzielanie( char zrodlo[], char parzyste[], char nieparzyste[] );
void druk( char napis[] );
int main()
{
    char parzyste[ 2000 ];
    char nieparzyste[ 2000 ];
    char zrodlo[ 2000 ] = { "Cyfrowy Polsat spodziewa sie, ze bedzie mial nowe mozliwosci w zakresie dystrybucji tresci telewizyjnych i rozwoju uslug telekomunikacyjnych" };
    rozdzielanie( zrodlo, parzyste, nieparzyste );
    druk( nieparzyste );
   
   
}

////////////////////////////////////////////////////////////////////////////////
void rozdzielanie( char zrodlo[], char parzyste[], char nieparzyste[] )
{
    int x = 0;
    int i = 0;
    int k = 0;
    bool parzystosc = false;
    do
    {
        if( parzystosc == false )
        {
            do {
                nieparzyste[ i ] = zrodlo[ x ];
                x++;
                i++;
            } while( zrodlo[ x - 1 ] == ' ' );
           
            parzystosc = !parzystosc;
        }
       
       
        else
        {
            do {
                parzyste[ k ] = zrodlo[ x ];
                x++;
                k++;
            } while(( zrodlo[ x - 1 ] ) == ' ' );
           
            parzystosc = !parzystosc;
        }
       
       
       
    } while( zrodlo[ x ] == 0 );
   
    parzyste[ k ] = 0;
    nieparzyste[ i ] = 0;
}

//////////////////////////////////////////////////////////

void druk( char napis[] )
{
    for( int m = 0;; m++ )
    {
        if( napis[ m ] == 0 )
        {
            break;
        }
        cout << napis[ m ];
    }
}

//////////////////////////////////////////////////////////}
P-96385
killjoy
» 2013-11-16 21:41:18
Czy jesteś pewien że te pętle:
while(( zrodlo[ x - 1 ] ) == ' ' );
 powinny się wykonywać dopóki znak jest równy
' '
, czy może powinno być wręcz na odwrót?
P-96387
leon_w
» 2013-11-17 13:04:07
Jakoś to poprawiłem i jakoś działa. Niestety jestem zbyt tępy (ale uparty :P), żeby ci wytłumaczyć, gdzie były błędy.
Na pewno tj kolega wyżej pisał, powinien być znak "!='
C/C++
#include <iostream>
#include<string>
using namespace std;
void rozdzielanie( char zrodlo[], char parzyste[], char nieparzyste[] );
void druk( char napis[] );
int main()
{
    char parzyste[ 200 ];
    char nieparzyste[ 200 ];
    char zrodlo[ 200 ] = { "Cyfrowy Polsat spodziewa sie, ze bedzie mial nowe mozliwosci w zakresie dystrybucji tresci telewizyjnych i rozwoju uslug telekomunikacyjnych" };
    rozdzielanie( zrodlo, parzyste, nieparzyste );
    cout << endl << "Drukuje nieparzyste: " << endl;
    druk( nieparzyste );
    cout << endl << "Drukuje parzyste: " << endl;
    druk( parzyste );
    // druk(parzyste);
   
   
}

////////////////////////////////////////////////////////////////////////////////
void rozdzielanie( char zrodlo[], char parzyste[], char nieparzyste[] )
{
    int x = 0;
    int i = 0;
    int k = 0;
    bool parzystosc = 1;
    do
    {
        // cout<<" zaczynam "<<endl;
        if( parzystosc == 0 )
        {
            do {
               
                nieparzyste[ i ] = zrodlo[ x ];
                // cout<<x<<","<<nieparzyste[i];
                x++;
                i++;
            } while( zrodlo[ x ] != ' ' );
           
            //  cout<<x<<" przechodze ";           
            parzystosc = 1;
        }
       
       
        else
        {
            do {
               
                parzyste[ k ] = zrodlo[ x ];
                //  cout<<x<<parzyste[k];
                x++;
                k++;
            } while( zrodlo[ x ] != ' ' );
           
            // cout<<x<<" przechodze 2 ";
            parzystosc = 0;
        }
       
        // cout<<" powtarzam";
       
    } while( zrodlo[ x - 1 ] != 0 );
   
    parzyste[ k ] = 0;
    nieparzyste[ i ] = 0;
}

//////////////////////////////////////////////////////////

void druk( char napis[] )

{
    // cout<<endl<<"drukuje"<<endl;
    for( int m = 0;; m++ )
    {
        if( napis[ m ] == 0 )
             break;
       
        cout << napis[ m ];
    }
}

//////////////////////////////////////////////////////////}


Chyba odwrotnie nieparzyste i parzyste dałem, ale to nie problem.
Nie rozumiem też, dlaczego nie wypisywały się nieparzyste, jeżeli "parzystość" była ustawiona na "0"(chyba ze warunek "while" ustawiłem np "!='h', wtedy wypisywało dobrze do pierwszej litery "h".
Rozumiem, że "0" jest zwracane, gdy funkcja nie znajdzie już więcej żadnego znaku?!
Nologin - ta książka nadaje się? Bo zamierzam kupić.
P-96430
nologin
Temat założony przez niniejszego użytkownika
» 2013-11-30 21:34:41
Dziękuje za pomoc. Tak nawisem mówiąc to porzuciłem ten kod ,  bo uznałem, że ma błędy w samych założeniach i zajrzałem do  odpowiedzi na necie.
Co do symfonii, to uważam jest to dobra inwestycja, chociaż po przerobieniu kursu na tej stronie, który jest bardzo nastawiony na rzeczy praktyczne, dla niektórych może być trochę ciężko przebrnąć przez niektóre rozdziały typowo teoretyczne, np o typach. Porównując z kursem tutaj, jest więcej teorii, ale mam nadzieję, że cię to nie zrazi. Książka jest ciekawie napisana, więc czasem można się nawet pośmiać.
P-97959
« 1 »
  Strona 1 z 1