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

Pobieranie bliżej nieokreślonej ilości danych do tablicy

Ostatnio zmodyfikowano 2015-03-25 13:32
Autor Wiadomość
Nitr0Skay
Temat założony przez niniejszego użytkownika
Pobieranie bliżej nieokreślonej ilości danych do tablicy
» 2015-03-24 01:47:59
Witam. Mam pewien problem algorytmiczny. Otóż pragnę stworzyć klasę, której metody przyjmą dane podane do użytkownika w postaci liczb do pewnej tablicy (oczywiście sprawdzam, czy zakres jej nie został przekroczony), a następnie posortują zmienne w tej tablicy i wypiszą wynik. Najpierw jednak aby sprawdzić, czy wprowadzanie danych i ich wyprowadzanie działa, postanowiłem przetestować.

Metody Wprowadzania i Wyprowadzania danych wyglądają następująco:

C/C++
void obiekt::zebraj()
{
    double pojemnik = 0;
    cout << "Wprowadź liczby odzielając je spacją: ";
    ileLiczb = 0;
    while( ileLiczb < TAB_MAX )
    {
        cin >> pojemnik;
        if( !cin.good() ) continue;
       
        tab[ ileLiczb ] = pojemnik;
        ileLiczb++;
    }
}

void obiekt::prezentuj()
{
    cout << endl << "Oto wpisane liczby: ";
    for( int i = 0; i < ileLiczb; i++ )
    {
        cout << tab[ i ] << ", ";
    }
}

Problem polega na tym, że w prawdzie program prosi o dane, jednak po ich podaniu w określony sposób program nie odpowiada. Tak jak by coś zapętlało się w nieskończoność nie dając żadnego rezultatu. Ktoś może wie, czym jest to spowodowane ? Nakierujecie mnie może, jak powinno wyglądać takie wprowadzanie liczb do tablicy i ich prosta, wstępna validacja ?? Byłbym wdzięczny
P-129018
Kopczak1995
» 2015-03-24 03:09:26
Hmmm... A może dałbyś jakiś warunek kończący wczytywanie danych? Mam wrażenie, że będziesz tu do rana siedział wklepując cyferki albo do momentu aż tablica po prostu Ci się skończy...
Osobna sprawa, że nie mam pojęcia czym ma być magiczne
continue
 w twoim przypadku... Nie lepiej by dać
break
 i przerwać działanie pętli gdy już odczyt ze strumienia wejścia jest błędny?

A co do pytania, bo w sumie gadam nieco nie na temat :D Masz problem, ponieważ w momencie gdy dane są źle wczytywane przechodzisz do kolejnego obiegu pętli, jednak zauważ, że iteracja nie zachodzi, twoje "ile" nigdy się nie zwiększy, a co za tym idzie nie przekroczy wartości maksymalnej tablicy. Odsyłam tutaj do kursu, poczytaj sobie o słowach kluczowych
continue
 i
break
, bo chyba nie do końca wiesz co robią albo po prostu wypadło Ci z głowy ;)

BTW - świetna pora na kodzenie :D Dopiero się obudziłem, że 3-cia jest i wypadałoby iść spać :P
P-129019
Monika90
» 2015-03-24 10:05:13
Nie wiem czy dobrze rozumiem. Chcesz wczytać co najwyżej TAB_MAX liczb zapisanych w jednej linii?

To powinno wystarczyć
C/C++
void obiekt::zebraj()
{
    cout << "Wprowadź liczby oddzielając je spacją: ";
    string linia;
    getline( cin, linia );
    istringstream in( linia );
    ileLiczb = 0;
    while( ileLiczb < TAB_MAX && in >> tab[ ileLiczb ] )
         ++ileLiczb;
   
}
P-129023
Nitr0Skay
Temat założony przez niniejszego użytkownika
» 2015-03-25 01:48:17
Panie Kopczak
Daję tam
continue
, ze względu na to, że chcę pominąć wszelkie błędne dane, wprowadzone do strumienia.

Użytkownik może podać na przykład:

2 44 8 a y 6 -11 x 3

To chodzi o to, żeby pętla ominęła błędne dane i pobierała kolejne. I tak aż do końca danych (lini).


2 44 8 6 -11 3

Ale ma Pan rację, że coś tu jednak namieszałem. Zapomniałem o warunku kończącym pętle. Samo sprawdzenie, czy zakres tablicy nie został przekroczony nie wystarczy. ;/

Dziękuję za zwrócenie mi uwagi.


Pani Moniko, mam drobne pytanko co do Pani kodu:
Mianowicie, co robi owa linijka kodu ?
C/C++
istringstream in( linia );

Nie będę owijał w bawełnę, iż pierwszy raz widzę takowy zapis :(
P-129129
darko202
» 2015-03-25 13:32:44
P-129140
« 1 »
  Strona 1 z 1