Contare le ripetizioni dei valori di un vettore

Esercizio semplice è contare quante volte un singolo numero si ripete all’interno di un vettore. Leggermente più ostico è contare le ripetizioni di tutti i numeri presenti nel vettore di partenza e tenerne memoria in altre strutture dati di supporto.

L’idea è semplice. Prendiamo un vettore di esempio con i seguenti valori

2 2 1 3 2 5 6 5 7 5 2

Prendendo ogni singolo numero, contiamo le ripetizioni ottenendo:

2 si ripete 4 volte

1 si ripete 1 volta

3 si ripete 1 volta

5 si ripete 2 volte

6 si ripete 1 volta

7 si ripete 1 volta

Bene, compreso il senso delle ripetizioni, vogliamo salvarci a parte un vettore con i valori individuali 2, 1, 3, 5, 6, 7 in un vettore e  4, 1,1,2,1,1 in un terzo vettore.

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <iomanip>      // std::setw

using namespace std;

#define N 100

void generaVettore(int _vettore[])
{
    //genero un vettore con numeri da 1 a 10
    int numero;

    for (int i= 0; i < N; i++)
    {
        numero = rand() % 10 + 1;
        _vettore[i] = numero;
    }
}

void inizializza(int _vettore[])
{
    for(int i=0; i < N; i++)
    {
        _vettore[i] = 0; //inizializzo i vettori di supporto a zero
    }
}

bool cerca(int _vettore[], int _numero)
{
    for(int i=0; i < N; i++)
    {
        if(_vettore[i] == _numero)
            return true;
    }

    return false;
}

int cercaIndice(int _vettore[], int _numero)
{
    for(int i=0; i < N; i++)
    {
        if(_vettore[i] == _numero)
            return i;
    }
    return -1; //torna in caso di errore
}

void stampa(int _vettore[])
{
    for (int i=0; i < N; i++)
        if (_vettore[i])
            cout << setw(3)<<_vettore[i];
}

int main()
{
    srand(time(NULL));

    int indice=0;
    int indiceDaAggiornare= 0;
    int vettoreNumeri[N];
    generaVettore(vettoreNumeri);

    int vettoreModale[N];
    int vettoreRipetizioni[N];

    inizializza(vettoreModale);
    inizializza(vettoreRipetizioni);

    //comincio a scorrere il vettore dei numeri casuali
    for (int i=0; i < N; i++)
    {
        if (!cerca(vettoreModale,vettoreNumeri[i]))
        {
            //non ho catalogato il numero ancora
            vettoreModale[indice]=  vettoreNumeri[i];
            vettoreRipetizioni[indice]= 1;
            indice++;
        }
        else
        {
            indiceDaAggiornare= cercaIndice(vettoreModale,vettoreNumeri[i]);
            vettoreRipetizioni[indiceDaAggiornare]++;
        }
    }

    stampa(vettoreNumeri);
    cout << endl << "-------------------------------------------------------------------------"<<endl;
    cout << "Vettore elementi   :";
    stampa(vettoreModale);
    cout << endl;
    cout << "Vettore ripetizioni:";
    stampa(vettoreRipetizioni);

    return 0;
}

Ultima modifica 5 Giugno 2022

Lascia un commento