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

C++ problem z programem

Ostatnio zmodyfikowano 2018-08-26 15:30
Autor Wiadomość
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".
P-172207
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:
C/C++
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?
P-172210
YooSy
» 2018-08-25 20:22:30
if( histogram[ i ] > 1 ) { }
?
P-172211
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<>.
P-172212
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.
P-172215
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>
C/C++
#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;
    }
   
    // wyświetlenie
    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)

C/C++
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
    vector < int > tablica { 1, 2, 3, 1, 3, 5, 2 };
    //sortowanie tablicy
    sort( tablica.begin(), tablica.end() );
    // wyświetlenie posortowanej
    for( auto element: tablica ) {
        cout << element << " ";
    }
    //policzenie staje się banalne
   
   
}


3 najmniej eleganckie rozwiązanie jakie mi przyszło do głowy to
 Możesz przejechać tablicę dwoma pętlami for
C/C++
#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; // pominięcie. Element "tablica[i]" został znaleziony przed a to znaczy że został już policzony
            // zabezpieczenie przed wielokrotnym liczeniem tego samego elementu
           
            if( t[ i ] == t[ j ] ) licznik++; //zwiększ licznik jeśli znalazłeś pasujący element
           
        }
        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
C/C++
#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 );
}
P-172216
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!
P-172217
1 « 2 »
Poprzednia strona Strona 2 z 2