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

[c++] wykrywanie ilości powtórzeń

Ostatnio zmodyfikowano 2013-12-08 10:22
Autor Wiadomość
TenZwykly
Temat założony przez niniejszego użytkownika
[c++] wykrywanie ilości powtórzeń
» 2013-12-07 14:23:31
Witam,
Potrzebuję pomocy przy wykrywaniu ilości powtórzeń w tablicy. Samo znalezienie powtarzających się liczb nie jest problemem, tak samo jak zliczenie ile razy co się powtarza, problem zaczyna się gdy chce te dane jakoś wykorzystać - przykładowo, jeżeli 1 wystąpi dwa razy i 2 wystąpi trzy razy to coś się dzieje (coś na zasadzie pokera, że jak jest właśnie jedna para i jedna trójka to mamy full'a).

To jest moja funkcja wykrywająca powtórzenia (reszty programu chyba nie ma sensu wklejać, wpisywanie liczb do tablicy jest realizowane poprawnie w innej funkcji):
C/C++
void powtorki( int tab[] ) {
    int i;
    int p = 1;
    for( i = 0; i < 10; i++ ) {
        if( tab[ i ] == tab[ i + 1 ] ) {
            p++;
        }
        else {
            cout << tab[ i ] << " wystepuje " << p << " razy" << endl;
            p = 1;
        }
    }
}

Próbowałem dawać warunki if... zagnieżdżone w else ale nie dawało to pożądanego efektu. Mam nadzieję, że pomożecie. :)
P-98572
pekfos
» 2013-12-07 14:37:03
ale nie dawało to pożądanego efektu.
A jaki dawało? Takie sprawdzanie wymaga posortowanych danych. Jeśli nie chcesz sortować, użyj tablicy lub std::map<>.
P-98573
TenZwykly
Temat założony przez niniejszego użytkownika
» 2013-12-07 15:03:48
A jaki dawało?
Ze względu na to, że wszystko było zagnieżdżone w pętli wartości się sumowały a nie bardzo mi o to chodziło, bardziej mam na myśli np. dwie zmienne liczące powtórzenia, i np. jeżeli p1 = 2, p2=3 to mamy "full'a".

Jeżeli chodzi o sortowanie to... mam funkcję, która sortuje liczby w tablicy od najmniejszej do największej, o to chodzi?
P-98574
pekfos
» 2013-12-07 15:18:02
bardziej mam na myśli np. dwie zmienne liczące powtórzenia, i np. jeżeli p1 = 2, p2=3 to mamy "full'a".
To użyj tablic lub std::map<>.
P-98577
TenZwykly
Temat założony przez niniejszego użytkownika
» 2013-12-07 21:34:36
Próbowałem, trochę mi to zajęło bo musiałem też naprawić kilka innych rzeczy ale ostatecznie wyszło takie coś:
C/C++
void( int tab[] ) {
    int i;
    int liczTab[ 6 ];
    for( i = 0; i < 6; i++ ) {
        liczTab[ i ] = 0;
    }
   
    for( i = 0; i < 6; i++ ) {
        if( 0 <= i && i < 6 ) {
            liczTab[ static_cast < int >( tab[ i ] ) ] ++;
        }
    }
   
    for( i = 0; i <= 6; i++ ) {
        cout << "Liczba " << i << static_cast < char >( i ) << " wystepowala " << liczTab[ i ] << "raz(y)\n";
    }
}

Problem jest taki, że jak liczy to dodaje o jedną wartość za dużo (powiedzmy coś występuje 2 razy a on pokazuje, że 3) a ilość powtórzeń ostatniej liczby, w tym przypadku 6, jest losowa (i nie chodzi mi o pseudolosowość jak z randa, zazwyczaj ma wartość -milioncoś). Gdzie powinienem wprowadzić poprawki?
P-98648
docentpp
» 2013-12-07 22:39:52
Czy w tym warunku nie ma błędu logicznego
albo  literowego ?

If jest TRUE dla kazdego i w petli for,
więc po co IF.....?

C/C++
for( i = 0; i < 6; i++ ) {
    if( 0 <= i && i < 6 ) { // ###########   ??????
        liczTab[ static_cast < int >( tab[ i ] ) ] ++;

 
P-98655
pekfos
» 2013-12-07 22:47:42
ilość powtórzeń ostatniej liczby, w tym przypadku 6, jest losowa
Nigdzie nie modyfikujesz indeksu 6, więc masz tam nieokreślone wartości (i prawdopodobnie wychodzisz poza tablicę).
P-98657
TenZwykly
Temat założony przez niniejszego użytkownika
» 2013-12-07 23:12:31
Dopiero po wysłaniu poprzedniego posta uświadomiłem sobie, że te nieokreślone wartości oznaczają wyjście poza tablice. Powiększyłem więc rozmiar liczTab, dzięki czemu wszystko wyświetla się tak jak chciałem.

C/C++
void powtorki( int tab[] ) {
    int i, j;
    int liczTab[ 7 ];
    for( i = 0; i < 7; i++ ) {
        liczTab[ i ] = 0;
    }
   
   
    for( i = 1; i <= 6; i++ ) {
        for( j = 0; j < TAB_MAX; j++ ) {
            if( 0 <= i && i <= 6 ) {
                liczTab[ static_cast < int >( tab[ j ] ) ] ++;
            }
        }
        for( i = 1; i <= 6; i++ ) {
            cout << "Liczba " << static_cast < int >( i ) << " wystepowala " << liczTab[ i ] << "raz(y)\n";
           
        }
    }
}

Nie wiem czy to jest do końca poprawnie napisane, podejrzewam, że da się lepiej, więc może ktoś bardziej doświadczony znajdzie tu coś co można by było poprawić. Niemniej jednak dziękuję za pomoc. :)
P-98659
« 1 » 2
  Strona 1 z 2 Następna strona