Trasferimento di vettori in modo ricorsivo

di il
11 risposte

Trasferimento di vettori in modo ricorsivo

Ciao a tutti, l'altro giorno ho fatto un compito in classe, dovevo trasferire gli elementi di un vettore A in un vettore B, senza avere valori uguali.
inoltre dovevo fare una funzione iterativa ed una ricorsiva che chiamava quella iterativa.
vi mostro il programma, non riesco a capire perchè non funziona...
#include <iostream>
using namespace std;
int controllo(int A[],int n,int i);
void trasf(int A[],int B[],int n,int i,int j);
int main()
{
	int i,n;
	cout<<" dimensione del vettore A e B >> ";
	cin>>n;
	int A[n],B[n];
	cout<<"elementi vettore A "<<endl;
	for(i=0;i<n;i++)
	cin>>A[i];
	cout<<"il vettore B "<<endl;
	trasf(A,B,n,0,0);
	for(i=0;i<n;i++)
	cout<<B[i]<<endl;
	return 0;
}
int controllo(int A[],int n,int i)
{  
	for(i=0;i<n;i++)
	{
		if(A[i]==A[i+1])
		return false;
		else
		return true;
	}
}
void trasf(int A[],int B[],int n,int i,int j)
{   
	if(i<n)
	{   
	    
	   if(controllo(A,n,i)==true)
	   {
	   	  B[j]=A[i];
	   	  trasf(A,B,n,i+1,j+1);
	   }
	   else
	   trasf(A,B,n,i+1,j);
	}
	
}

grazie mille in anticipo!!

11 Risposte

  • Re: Trasferimento di vettori in modo ricorsivo

    Io Inizierei con il sostiturire questo pezzo di codice
    int A[n],B[n];
    con questo
    int* A = new int[n];
    int* B = new int[n];
    
    Anche perché dubito che così compila.

    N.B: la variabile n è un valore dinamico quindi non puoi dichiarare i due array staticamente di dimensione n. Occorre allocarli sull'Heap attraverso la new, proprio perché il valore di n lo saprai solo in fase di esecuzione (quando l'utente inserisce il valore di n, e quindi la dimensione desiderata dei due vettori A e B).
  • Re: Trasferimento di vettori in modo ricorsivo

    Può usare quella forma se il compilatore è compliant C99 (VLA Variable-length array), una caratteristica tuttavia che non mi piace tanto ...
  • Re: Trasferimento di vettori in modo ricorsivo

    Ciao, io ho risolto così:
    
    #include <iostream>
    
    using namespace std;
    
    //Controlla se x è presente nel vettore, ritorna true in caso positivo false altrimenti
    bool controllo(int A[],int n,int x);
    //Trasferisce i valori da un vettore ad un altro
    //Ritorna la dimensione del secondo vettore
    int trasf(int A[],int B[],int n,int i,int j);
    
    int main()
    {
       int i,n;
       int dimB = 0;
       
       cout<<" dimensione del vettore A e B >> ";
       cin>>n
       ;
       int A[n],B[dimB];
       cout<<"elementi vettore A "<<endl;
       for(i=0;i<n;i++)
       	cin>>A[i];
       
       dimB=trasf(A,B,n,0,0);
       cout<<"il vettore B "<<endl;
       for(i=0;i<dimB;i++)
       	cout<<B[i]<<endl;
       return 0;
    }
    
    bool controllo(int A[],int n,int x)
    {
    	for(int i=0;i<n;i++) {
    		if (A[i]==x) return true;
    	}
    	return false;
    }
    
    int trasf(int A[],int B[],int n,int i,int j)
    {
    	if (i >= n) return j;
    	else {
    		if(!controllo(B,j,A[i])) {
    			B[j]=A[i];
    			j++;
    		}
    		i++;
    		trasf(A,B,n,i,j);
    	}
    }
    
    Può andare?


    Ricordati di fare attenzione con le dimensioni dei vettori:
    
     for(i=0;i<n;i++)
    {
          if(A[i]==A[i+1])
          ...
    }
    
    Le celle di un vettore di n dimensioni vanno da 0 a n-1; con questo codice se per esempio n=5 ed il tuo indice i è pari a 4 quando tenti di accedere alla posizione A[i+1] stai cercando di accedere ad una cella che non esiste nel vettore (in questo caso A[5]).
    
    for(i=0;i<n;i++)
       cout<<B[i]<<endl;
    
    Qua di nuovo: il secondo vettore (B) conterrà solo i numeri che non si ripetono del primo vettore (A) e di conseguenza avrà dimensione uguale a n solamente se il primo vettore non contiene valori uguali, altrimenti avrà per certo una dimensione minore; se, come in questo caso, scorri un vettore da 0 a n ma n è più grande della dimensione effettiva del vettore accederai a celle di memoria che non fanno parte del vettore e che contengono numeri casuali (ecco perché può capitarti di vedere in output valori enormi tipo 31526 o -21536).

    Maggiori info Index out of bounds[en]
  • Re: Trasferimento di vettori in modo ricorsivo

    oregon ha scritto:


    Può usare quella forma se il compilatore è compliant C99 (VLA Variable-length array), una caratteristica tuttavia che non mi piace tanto ...
    Ormai usando solo compilatori C11 sono diventato intollerante ad alcune cose...
  • Re: Trasferimento di vettori in modo ricorsivo

    CarDeFusco ha scritto:


    Io Inizierei con il sostiturire questo pezzo di codice
    int A[n],B[n];
    con questo
    int* A = new int[n];
    int* B = new int[n];
    
    Anche perché dubito che così compila.

    N.B: la variabile n è un valore dinamico quindi non puoi dichiarare i due array staticamente di dimensione n. Occorre allocarli sull'Heap attraverso la new, proprio perché il valore di n lo saprai solo in fase di esecuzione (quando l'utente inserisce il valore di n, e quindi la dimensione desiderata dei due vettori A e B).

    dev c++ non mi dà questo tipo di errori...
  • Re: Trasferimento di vettori in modo ricorsivo

    ariston077 ha scritto:


    Ciao, io ho risolto così:
    
    #include <iostream>
    
    using namespace std;
    
    //Controlla se x è presente nel vettore, ritorna true in caso positivo false altrimenti
    bool controllo(int A[],int n,int x);
    //Trasferisce i valori da un vettore ad un altro
    //Ritorna la dimensione del secondo vettore
    int trasf(int A[],int B[],int n,int i,int j);
    
    int main()
    {
       int i,n;
       int dimB = 0;
       
       cout<<" dimensione del vettore A e B >> ";
       cin>>n
       ;
       int A[n],B[dimB];
       cout<<"elementi vettore A "<<endl;
       for(i=0;i<n;i++)
       	cin>>A[i];
       
       dimB=trasf(A,B,n,0,0);
       cout<<"il vettore B "<<endl;
       for(i=0;i<dimB;i++)
       	cout<<B[i]<<endl;
       return 0;
    }
    
    bool controllo(int A[],int n,int x)
    {
    	for(int i=0;i<n;i++) {
    		if (A[i]==x) return true;
    	}
    	return false;
    }
    
    int trasf(int A[],int B[],int n,int i,int j)
    {
    	if (i >= n) return j;
    	else {
    		if(!controllo(B,j,A[i])) {
    			B[j]=A[i];
    			j++;
    		}
    		i++;
    		trasf(A,B,n,i,j);
    	}
    }
    
    Può andare?


    Ricordati di fare attenzione con le dimensioni dei vettori:
    
     for(i=0;i<n;i++)
    {
          if(A[i]==A[i+1])
          ...
    }
    
    Le celle di un vettore di n dimensioni vanno da 0 a n-1; con questo codice se per esempio n=5 ed il tuo indice i è pari a 4 quando tenti di accedere alla posizione A[i+1] stai cercando di accedere ad una cella che non esiste nel vettore (in questo caso A[5]).
    
    for(i=0;i<n;i++)
       cout<<B[i]<<endl;
    
    Qua di nuovo: il secondo vettore (B) conterrà solo i numeri che non si ripetono del primo vettore (A) e di conseguenza avrà dimensione uguale a n solamente se il primo vettore non contiene valori uguali, altrimenti avrà per certo una dimensione minore; se, come in questo caso, scorri un vettore da 0 a n ma n è più grande della dimensione effettiva del vettore accederai a celle di memoria che non fanno parte del vettore e che contengono numeri casuali (ecco perché può capitarti di vedere in output valori enormi tipo 31526 o -21536).

    Maggiori info Index out of bounds[en]

    grazie mille per la disponibilità, funziona, però non ho capito perchè usi la x nel controllo e nel trasferimento restituisci j
  • Re: Trasferimento di vettori in modo ricorsivo

    grazie mille per la disponibilità, funziona, però non ho capito perchè usi la x nel controllo e nel trasferimento restituisci j
    Figurati,
    mi fa piacere che tu ti sia interessato
    
    bool controllo(int A[],int n,int x)
    {
       for(int i=0;i<n;i++) {
          if (A[i]==x) return true;
       }
       return false;
    }
    
    Alla funzione controllo vengono passati tre parametri:
  • Re: Trasferimento di vettori in modo ricorsivo

    mafr99 ha scritto:


    CarDeFusco ha scritto:


    Io Inizierei con il sostiturire questo pezzo di codice
    int A[n],B[n];
    con questo
    int* A = new int[n];
    int* B = new int[n];
    
    Anche perché dubito che così compila.

    N.B: la variabile n è un valore dinamico quindi non puoi dichiarare i due array staticamente di dimensione n. Occorre allocarli sull'Heap attraverso la new, proprio perché il valore di n lo saprai solo in fase di esecuzione (quando l'utente inserisce il valore di n, e quindi la dimensione desiderata dei due vettori A e B).

    dev c++ non mi dà questo tipo di errori...
    Dev c++ non dà molti tipi di errori, anche più gravi.
    Immagino che sei agli inizi, ti consiglio più in là di cambiare IDE, magari prova Visual Studio, Netbeans o Eclipse. Abbandona Dev C++
  • Re: Trasferimento di vettori in modo ricorsivo

    ariston077 ha scritto:


    grazie mille per la disponibilità, funziona, però non ho capito perchè usi la x nel controllo e nel trasferimento restituisci j
    Figurati,
    mi fa piacere che tu ti sia interessato
    
    bool controllo(int A[],int n,int x)
    {
       for(int i=0;i<n;i++) {
          if (A[i]==x) return true;
       }
       return false;
    }
    
    Alla funzione controllo vengono passati tre parametri:
    sono una ragazza comunque adesso ho capito, ti sei spiegato bene, grazie ancora!!!
  • Re: Trasferimento di vettori in modo ricorsivo

    Il mio professore ci fa usare dev , ma ho visto che in effetti parecchi lamentano problemi, grazie del consiglio..ne terrò conto lo stesso
  • Re: Trasferimento di vettori in modo ricorsivo

    sono una ragazza comunque adesso ho capito, ti sei spiegato bene, grazie ancora!!!
    Figurati, e scusa per la gaffe :/
    Il mio professore ci fa usare dev , ma ho visto che in effetti parecchi lamentano problemi, grazie del consiglio..ne terrò conto lo stesso
    Se posso ti consiglio di usare code::blocks, è un ottimo IDE; quando iniziai ad usarlo a scuola piacque tanto anche ai miei prof che decisero di sostituirlo al dev.
Devi accedere o registrarti per scrivere nel forum
11 risposte