Problema LShift Vettore (C++)

di il
4 risposte

Problema LShift Vettore (C++)

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?

4 Risposte

  • Re: Problema LShift Vettore (C++)

    La funzione e' corretta.
    Devi aver sbagliato qualcosa nel passare i parametri dalla funzione chiamante

    Questo ne e' la dimostrazione
    int main(int args,char **argv)
    {
        int v[]={0,1,2,3,3,3,3,3,4,4,4,4,5,5,6,7,7,8};     //dimensione effettiva = 18
        int n=18;    //dimensione corretta
    
        cont(v,n);
    
        n=-1;        //dimensione non corretta
        cont(v,n);
    
        return 0;
    }
  • Re: Problema LShift Vettore (C++)

    Mi correggo:

    funziona solo se il numero di elementi uguali di fila <7

    Allora credo sia anche un problema logico
  • Re: Problema LShift Vettore (C++)

    Il problemi sono

    1)
    for(j=i; j<n; j++)   
                {
                    V[j]=V[j+1];
                }
    va a leggere fuori dal vettore

    2)
    if(V[i]==a)
            {
                t++;
    alla fine ci saranno molti elementi uguali( precisamente tutti uguali a v[n] ), e quindi entra in un ciclo infinito



    Io ho risolto così
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    void stampaV(int v[],int n);
    
    void cont(int V[],int n)
    {
    stampaV(V,n);
    system("pause");
        int i=1,j,s,a,t=1,cn=0;
        a=V[0];
    
        do
        {
            if(V[i]==a && V[i]!=-1)
            {
                t++;
            }
            else
            {
                a=V[i];
                t=1;
            }
    
            if(t>3)
            {
                for(j=i; j<n-1; j++)   
                {
                    V[j]=V[j+1];
                }
                i--;
                cn++;
                V[n-1]=-1;     //valore di controllo non inseribile nel vettore, tipo un carattere speciale
    stampaV(V,n);
    system("pause");
            }
    
            i++;
        }
        while(i<n);
    
        cout<<"Vettore tagliato: \n";
        for(i=0; i<n-cn; i++)
        {
            cout<<V[i]<<endl;
        }
    
        cout<<endl;
    
    }
    
    void stampaV(int v[],int n)
    {
        cout << endl << endl ;
    
        int i;
        for(i=0;i<n;i++)
            cout << v[i] << endl;
    
        cout << endl << endl;
    
        return;
    }
    
    
    int main(int args,char **argv)
    {
        int v[]={0,11,11,11,11,11,11,11,11,11,11,11,11,3,8};
        int n=15;
    
        cont(v,n);
    
        n=-1;
        cont(v,n);
    
        return 0;
    }
    ovviamente decidi tu il valore di "V[n-1]=-1;"
  • Re: Problema LShift Vettore (C++)

    Ciao, ho risolto, grazie mille! Non capisco come abbia fatto a non pensarci ahahah a volte per delle stupidate ci si complica la vita
Devi accedere o registrarti per scrivere nel forum
4 risposte