Liczba wystąpień z rzędu
Ostatnio zmodyfikowano 2017-05-25 18:08
nopedope Temat założony przez niniejszego użytkownika |
Liczba wystąpień z rzędu » 2017-05-24 12:12:23 Witam serdecznie, Piszę program, w którym mam za zadanie zliczyć ilość wystąpień liczby w stu elementowej tablicy z rzędu. Muszę wyniki przekazać do tablicy, by móc potem zrobić algorytm ze znajdowaniem maksymalnego elementu, by dowiedzieć się która liczba najdłużej występuje z rzędu np: 0011222234433=liczba 2 najdłużej występuje z rzędu. <algorytm znajdowania maksimum później zrobię, najpierw chcę tablicę tab2, która będzie miała wyniki zliczonych powtórzeń dla wszystkich liczb od 0 do 9) z_rzedu( int * tab ) { int rozmiar; int * tab2 = new int[ rozmiar ]; int licznik = 0; int j, k = 0; while( k < 10 ) { licznik = 0; for( int i = 0, j = 0; i < 99, j < rozmiar; i++ ) { if( tab[ i ] == tab[ i + 1 ] ) licznik++; else if( tab[ i ] != tab[ i + 1 ] && licznik != 0 ) { tab2[ j ] = licznik; j++; } } rozmiar = j; for( int z = 0; z < rozmiar; z++ ) { cout << tab2[ z ] << " "; } cout << "liczba " << k << " wystapila z rzedu " << tab2[ rozmiar ] << " razy.\n"; k++; } }
Wiem że mam coś źle z tablicą dynamiczną, bo wywala błąd "terminate called after throwing an instance of 'std::bad_alloc'. |
|
hit |
» 2017-05-24 12:18:54 Ja bym zmienił podejście. Jeśli chcesz wiedzieć tylko to, która cyfra wystąpiła w najdłuższym ciągu, to możesz zapamiętywać pierwszą cyfrę, zliczać jej wystąpienia do momentu trafienia innej cyfry, wtedy zapisać sobie jaka to była cyfra i ile razy wystąpiła ( w osobnych zmiennych, które wyświetlisz na końcu ). Skoro trafiłeś na inną cyfrę niż zliczana, to zerujesz tymczasową zmienną i liczysz do ponownego trafienia innej cyfry. Następnie porównujesz to z zapisanymi wcześniej danymi. Jeśli było więcej wystąpień to je nadpisujesz, jeśli nie to zliczasz dla kolejnej nowej cyfry. Może trochę niejasno to opisałem ale to chyba dużo szybsze i krótsze. |
|
ArgonZapan |
» 2017-05-25 02:17:41 int rozmiar; int * tab2 = new int[ rozmiar ]; Kompilator nie wie że ma być 100 :P btw. ten rozmiar albo bym przekazywał jako 2 parametr do funckji, albo odgórnie, ustawić 100 np. int zrzedu( int tab[ 100 ] ) { } lub int zrzedu( int * tab, size_t rozmiar ) |
|
hit |
» 2017-05-25 10:14:45 Jeśli rozmiar jest z góry podany to nie widzę sensu używania wskaźników. Wkleję Ci to co opisałem w drugim komentarzu: #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
int main() { srand( time( NULL ) ); int rozmiar = 100; int tab[ rozmiar ]; int cyfra = - 1, ile = 0; int cyfra_tmp = - 1, ile_tmp = 0; for( int i = 0; i < rozmiar; i++ ) tab[ i ] = rand() % 10; for( int i = 0; i < rozmiar; i++ ) { cout << tab[ i ]; if( tab[ i ] != cyfra_tmp ) { if( ile_tmp > ile ) { ile = ile_tmp; cyfra = cyfra_tmp; } cyfra_tmp = tab[ i ]; ile_tmp = 1; } else ile_tmp++; } cout << "\ncyfra: " << cyfra << endl; cout << "lw: " << ile << endl; return 0; }
Edit: Przykład, który podałem zadziała błędnie jeśli najdłuższy będzie ostatni ciąg - należałoby to sprawdzać po zakończeniu pętli. Jednak nie wiem, czy w ogóle chcesz zmieniać podejście także na razie to zostawiam. ;) |
|
nopedope Temat założony przez niniejszego użytkownika |
» 2017-05-25 18:08:57 Ooo dokładnie o to mi chodziło :) Kombinowałam ze wskaźnikami, bo chciałam utworzyć drugą tablicę z samymi wynikami wszystkich cyfr ile razy się powtórzyły (stąd nieznany rozmiar, bo nie wiadomo ile razy doszło do powtórzeń), a potem znaleźć największy element. Ale Twoje rozwiązanie jest o wiele łatwiejsze, dziękuję bardzo za pomoc i pozdrawiam :) |
|
« 1 » |