Salve ragazzi, ho un problema che non riesco a risolvere. Dato un vettore ordinato di n elementi, bisogna avere un algoritmo che, se un elemento è presente più di 3 volte, cancelli i restanti, facendo ovviamente il left shift dalla loro posizione. Questa è la procedura che ho scritto io:
void cont(int V[],int n){
int i=1,j,s,a,t=1,cn=0;
a=V[0];
do{
if(V[i]==a){
t++;
}
else{
a=V[i];
t=1;
}
if(t>3){
for(j=i;j<n;j++){
V[j]=V[j+1];
}
i--;
cn++;
}
i++;
}while(i<n);
cout<<"Vettore tagliato: \n";
for(i=0;i<n-cn;i++){
cout<<V[i]<<endl;
}
cout<<endl;
}
Una piccola spiegazione:
inizialmente imposto a come il primo elemento, e il contatore t lo imposto a 1.
Quando il ciclo inizia, parte già con i=1, quindi dal secondo elemento. Se l'elemento i è uguale ad a, allora il contatore aumenta, altrimenti a diventa l'elemento i e il contatore ritorna 1.
Quando poi t diventa maggiore di 3, avviene il left shift in quella posizione, ed i viene diminuito di 1, perchè, se aumentassi i anche quando c'è lo shift, il "nuovo elemento" non verrebbe nemmeno controllato, e si passerebbe alla posizione successiva. Poi ci ho messo anche un contatore cn, utile a controllare quanti elementi sono stati scartati in modo poi, per la stampa, da scartare tutti gli elementi "copiati".
Il problema è che ci mette tantissimo ad eseguire le operazioni, qualcosa come un minuto, e alla fine non stampa proprio nulla. Voi che ne pensate?