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): 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. :) |
|
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<>. |
|
TenZwykly Temat założony przez niniejszego użytkownika |
» 2013-12-07 15:03:48 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? |
|
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<>. |
|
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ś: 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? |
|
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.....? for( i = 0; i < 6; i++ ) { if( 0 <= i && i < 6 ) { liczTab[ static_cast < int >( tab[ i ] ) ] ++;
|
|
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ę). |
|
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. 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. :) |
|
« 1 » 2 |