Buongiorno, mi sono imbattuto nella risoluzione di questo esercizio:
"Leggi un vettore e ordina i suoi elementi in base alla frequenza con cui sono presenti (in ordine crescente) e stampalo.
Ad esempio: 243223 --> 433222".
A prima vista mi sembrava banale invece mi ha preso un po' di tempo.
Riporto il mio codice abbastanza articolato.
La mia domanda è: esiste un modo più semplice ed elegante per risolverlo? (con più semplice intendo più corto )
Grazie a tutti.
#include <iostream>
#define DM 100
using namespace std;
int conta(int V[DM], int dim, int y){ // passo il vettore e un suo elemento
e mi dice quante volte quel elemento è presente (frequenza)
int cont=0;
for(int i=0; i<dim; i++){
if(V[i]==V[y])
cont++;
}
return cont;
}
void stampa(int a, int b){ //stampa un numero (a) b volte (frequenza)
for(int i=0; i<b; i++){
cout<<a;
}
}
int main(){
int V[DM], dim, freq[DM][DM],cont_r;
do{
cout<<"Inserisci la dimensione del vettore (da 1 a 100)"<<endl;
cin>>dim;
}while(dim<1 || dim> DM);
for(int i=0; i<dim; i++){
cout<<"Inserisci l'elemento in posizione "<<i<<endl;
cin>>V[i];
}
for(int i=0; i<dim; i++){ //creo una matrice con due colonne, la prima
il valore dell'elemento, la seconda la sua frequenza.
freq[i][0]=V[i];
freq[i][1]=conta(V,dim,i);
cont_r++;
}
int min,temp1,temp2;
for(int i=0; i<cont_r-1; i++){ //ordino gli elementi della matrice in
ordine crescente in base alla colonna delle frequenze
min = i;
for(int j=i+1; j<cont_r; j++)
if(freq[j][1] < freq[min][1])
min = j;
temp1=freq[min][1];
freq[min][1]=freq[i][1];
freq[i][1]=temp1;
temp2=freq[min][0];
freq[min][0]=freq[i][0];
freq[i][0]=temp2;
}
for(int i=0; i<cont_r; i++){ // stampo il vettore non ordinato
cout<<V[i];
}
cout<<"--->";
int p=0;
for(int i=0; i<cont_r; i++){
for(int j=0; j<i; j++){ // evito di stampare due volte lo stesso
elemento
if(freq[i][0]==freq[j][0]){
p=1;
}
}
if(p==0)//stampo il vettore ordinato
stampa(freq[i][0], freq[i][1]);
p=0;
}
return 0;
}
[\code]