pekfos |
» 2018-08-24 18:46:13 Teraz jeszcze przydało by się wypisać które elementy się powtarzają i ile razy. |
Teraz o tym piszesz..? Algorytm będzie zupełnie inny. Zaraz i tak niechybnie pojawi się gotowy kod, więc nie ma co się rozpisywać. W razie czego, pomocne hasło do wyszukania to "histogram". |
|
tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem - histogram » 2018-08-25 20:14:22 Witajcie, rozwiązałem mój problem korzystając z histogramu: for( int i = 0; i < 256; i++ ) histogram[ i ] = 0;
for( int i = 0; i < r; i++ ) histogram[( int ) tab[ i ] ] ++;
for( int i = 0; i < 256; i++ ) { if( histogram[ i ] != 0 ) cout << "Liczba " << i << " powtorzyla sie: " << histogram[ i ] << " razy" << endl; } Natomiast rozwiązanie nie jest tak do końca idealne gdyż gdy w tablicy podam wartości np.: {2,3,3,4} w wyniku otrzymuje: Liczba 2 powtorzyla sie: 1 razy Liczba 3 powtorzyla sie: 2 razy Liczba 4 powtorzyla sie: 1 razy Moje pytanie, jak zrobić by liczba która występuje w tablicy tylko jeden raz nie byla traktowana jako powtórzenie? |
|
YooSy |
» 2018-08-25 20:22:30 if( histogram[ i ] > 1 ) { } ? |
|
pekfos |
» 2018-08-25 20:31:22 Trochę nieodpowiedni kod znalazłeś. Ten jest do wyznaczania histogramu z ciągu bajtów, nie liczb ogólnie. U ciebie użytkownik podaje liczby z większego zakresu, niż [0; 255]. Powinieneś użyć std::map<> / std::unordered_map<>. |
|
tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem » 2018-08-26 12:49:27 YooSy dzięki za podpowiedz. pekfos ja dopiero zaczynam moją przygodę z programowaniem i niestety z twoich wskazówek mało co rozumiem gdyż tłumaczysz to w sposób nie przystępny dla początkujących ale i tak dzięki za wskazówki. Temat jak na razie zamknięty. Dziękuje wszystkim za pomoc. |
|
mateczek |
» 2018-08-26 13:35:52 pekfos ja dopiero zaczynam moją przygodę z programowaniem i niestety z twoich wskazówek mało co rozumiem |
mówi, że twój kod nie zadziała dla liczb większych równych 256. Bo masz tablicę na 256 elementów. Pytanie czy potrzebujesz by działał dla większego zakresu?? Jeśli znasz zakres możesz rozszerzyć tablicę. Jeśli zakres jest nieznany lub zbyt duży. Wówczas trzeba poszukać innej metody Najprostsza z opcji którą podpowiedział Pekfos to użycie kontenera map<int, int> #include <iostream> #include<map> using namespace std;
int main() { map < int, int > tablica; for( int i = 0; i < 5; i++ ) { int temp; cout << "podaj liczbę " << i + 1 << " "; cin >> temp; tablica[ temp ] ++; cout << endl; } for( auto element: tablica ) { cout << element.first << " wystąpił " << element.second << " razy" << endl; } }
2 z opcji to Możesz najpierw posortować tablicę (wtedy liczenie elementów jest banalne) #include <iostream> #include<vector> #include<algorithm> using namespace std;
int main() { vector < int > tablica { 1, 2, 3, 1, 3, 5, 2 }; sort( tablica.begin(), tablica.end() ); for( auto element: tablica ) { cout << element << " "; } }
3 najmniej eleganckie rozwiązanie jakie mi przyszło do głowy to Możesz przejechać tablicę dwoma pętlami for #include <iostream> #include<vector> using namespace std; void isDuplicate( vector < int > & t ) { for( size_t i = 0; i < t.size(); i++ ) { int licznik = 0; for( size_t j = 0; j < t.size(); j++ ) { if(( i > j ) &&( t[ i ] == t[ j ] ) ) break; if( t[ i ] == t[ j ] ) licznik++; } if( licznik > 1 ) cout << t[ i ] << " wystepuje " << licznik << " razy" << endl; } } int main() { vector < int > tablica { 2, 3, 2, 3, 4, 8, 24, 33, 33 }; isDuplicate( tablica ); }
można tak ale wyniki będą dublowane #include <iostream> #include<vector> using namespace std; void isDuplicate( vector < int > & t ) { for( size_t i = 0; i < t.size(); i++ ) { int licznik = 0; for( size_t j = 0; j < t.size(); j++ ) { if( t[ i ] == t[ j ] ) licznik++; } if( licznik > 1 ) cout << t[ i ] << " wystepuje " << licznik << " razy" << endl; } } int main() { vector < int > tablica { 2, 3, 2, 3, 4, 8, 24, 33, 33 }; isDuplicate( tablica ); }
|
|
tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem » 2018-08-26 15:30:30 Dzięki mateczek za takie wyjaśnienie, teraz mam materiał do analizowania i dobry przykład do nauki. Ale widzę ze długa droga przede mną. Mam nadzieje że będziecie pomagać w trudnych chwilach :) Dzięki! |
|
1 « 2 » |