Invertire gli elementi di un vettore

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Invertire gli elementi di un vettore

    giulia18395 ha scritto:


    ramcrack ha scritto:


    giulia18395 ha scritto:


    più tardi ci riprovo e vi faccio sapere!!
    Bene... facci sapere
    mentre lo stavo facendo mi sono accorta che non mi usciva neanche questo, ma credo che in realtà siao molto simili (3. Dichiarare un vettore x a 10 interi e y di 10 interi, riempire x e copiare il vettore x nel vettore y al contrario)
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int x[10], i, y[10], j;
    	cout << "riempire il vettore x: ";
    	for (i = 0; i < 10; i++)
    	{
    		cin >> x[i];
    	}
    	for (i = 0; i < 10;i--)
    	{
    		y[j] = x[i];
    	}
    	cout << "vettore y: " << y[i];
    
    	system("pause");
    	return 0;
    }

    Così? Però non è ancora giusto
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int x[10], i, j, temp;
    	for (i = 0; i < 10; i++)
    	{
    		cin >> x[i];
    	}
    	for (i = 0; i < 10; i++)
    	{
    		temp = x[i];
    		x[i] = x[10];
    		x[10] = temp;
    	}
    	for (i = 0; i < 10; i++)
    	{
    		cout << x[i];
    	}
    	system("pause");
    	return 0;
    }
  • Re: Invertire gli elementi di un vettore

    Oregon ha scritto:
    x = x ^ y
    y = x ^ y
    x = x ^ y
    La versione coi più e i meno l'ho capita al volo, questa devo dire che mi impegna ben di più! Proverò a fare un programmino di test e a vedere come opera il meccanismo (che, almeno per ora, non ho capito). A parte che basterebbe anche un foglietto di carta e una matita, per fare le prove...

    Una cosa: per usare questa versione occorre assicurarsi che tutti gli operatori siano dello stesso tipo, vero? Nel senso: sarebbe rischioso se x fosse un int e y un char? E ancora, si possono "mischiare" impunemente tipi con segno e senza segno? Le conversioni automatiche possono fare sfracelli? Cautele?

    =========

    Per il "rovesciamento" di un vettore in genere si trovano soluzioni di questo tipo (qui per una stringa C zero terminated, ma è facile adattare il codice affinché usi vettori d'altra natura).
    /*==============================================================================
    Riceve, tramite il parametro s, un puntatore ad una stringa "zero terminated" e
    la "rovescia" in loco invertendone l'ordine dei caratteri.
    Restituisce lo stesso puntatore ricevuto tramite il parametro s.
    ==============================================================================*/
    
    char *agnirts( char *s ) {
        if( NULL != s ) { /* s deve essere un puntatore valido */
            long i, l, lMezzi;
            char *p, aux;
    
            for( p=s; *p; ++p ); l=p-s; /* ricava la lunghezza della stringa */
    
            /* inverte l'ordine dei caratteri nella stringa */
            for( lMezzi=l/2, i=0; i<lMezzi; ++i ) {
                aux = s[i];
                s[i] = s[l-i-1];
                s[l-i-1] = aux;
            }
        }
    
        return s;
    }
    Con un vettore di int l'opzione zero terminated è sconsigliabile, per cui serve un parametro in più che comunichi la quantità degli elementi contenuti nel vettore stesso, in questo caso dim_v.
    /*==============================================================================
    Riceve, tramite il parametro v, un puntatore ad un vettore di interi e lo
    "rovescia" in loco invertendone l'ordine degli elementi.
    Restituisce lo stesso puntatore ricevuto tramite il parametro v.
    ==============================================================================*/
    
    int *erottev( int *v, unsigned int dim_v ) {
        if( NULL != v ) { /* v deve essere un puntatore valido */
            unsigned int i, vMezzi;
            int *p, aux;
    
            /* inverte l'ordine dei caratteri nel vettore */
            for( vMezzi=v/2, i=0; i<vMezzi; ++i ) {
                aux = v[i];
                v[i] = v[dim_v-i-1];
                v[dim_v-i-1] = aux;
            }
        }
    
        return s;
    }
    Di cose così è pieno il web (e i libri di testo).
  • Re: Invertire gli elementi di un vettore

    Considera le proprietà associativa e commutativa della xor. E anche che

    a xor a = 0

    a xor 0 = a

    Perché dovresti scambiare due tipi diversi di dati? Scambierai due char o due int. Comunque, non ci sono problemi.
  • Re: Invertire gli elementi di un vettore

    AldoBaldo ha scritto:


    Oregon ha scritto:
    x = x ^ y
    y = x ^ y
    x = x ^ y
    La versione coi più e i meno l'ho capita al volo, questa devo dire che mi impegna ben di più! Proverò a fare un programmino di test e a vedere come opera il meccanismo (che, almeno per ora, non ho capito). A parte che basterebbe anche un foglietto di carta e una matita, per fare le prove...

    Una cosa: per usare questa versione occorre assicurarsi che tutti gli operatori siano dello stesso tipo, vero? Nel senso: sarebbe rischioso se x fosse un int e y un char? E ancora, si possono "mischiare" impunemente tipi con segno e senza segno? Le conversioni automatiche possono fare sfracelli? Cautele?

    =========

    Per il "rovesciamento" di un vettore in genere si trovano soluzioni di questo tipo (qui per una stringa C zero terminated, ma è facile adattare il codice affinché usi vettori d'altra natura).
    /*==============================================================================
    Riceve, tramite il parametro s, un puntatore ad una stringa "zero terminated" e
    la "rovescia" in loco invertendone l'ordine dei caratteri.
    Restituisce lo stesso puntatore ricevuto tramite il parametro s.
    ==============================================================================*/
    
    char *agnirts( char *s ) {
        if( NULL != s ) { /* s deve essere un puntatore valido */
            long i, l, lMezzi;
            char *p, aux;
    
            for( p=s; *p; ++p ); l=p-s; /* ricava la lunghezza della stringa */
    
            /* inverte l'ordine dei caratteri nella stringa */
            for( lMezzi=l/2, i=0; i<lMezzi; ++i ) {
                aux = s[i];
                s[i] = s[l-i-1];
                s[l-i-1] = aux;
            }
        }
    
        return s;
    }
    Con un vettore di int l'opzione zero terminated è sconsigliabile, per cui serve un parametro in più che comunichi la quantità degli elementi contenuti nel vettore stesso, in questo caso dim_v.
    /*==============================================================================
    Riceve, tramite il parametro v, un puntatore ad un vettore di interi e lo
    "rovescia" in loco invertendone l'ordine degli elementi.
    Restituisce lo stesso puntatore ricevuto tramite il parametro v.
    ==============================================================================*/
    
    int *erottev( int *v, unsigned int dim_v ) {
        if( NULL != v ) { /* v deve essere un puntatore valido */
            unsigned int i, vMezzi;
            int *p, aux;
    
            /* inverte l'ordine dei caratteri nel vettore */
            for( vMezzi=v/2, i=0; i<vMezzi; ++i ) {
                aux = v[i];
                v[i] = v[dim_v-i-1];
                v[dim_v-i-1] = aux;
            }
        }
    
        return s;
    }
    Di cose così è pieno il web (e i libri di testo).
    Ho guardato gli esempi, ho provato ma dove sbaglio ancora?
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int x[10], i, j, temp=0;
    	for (i = 0; i < 10; i++)
    	{
    		cin >> x[i];
    	}
    	for (i = 0; i < 10; i++)
    	{
    		temp = x[i];
    		x[i] = x[10 - i - 1];
    		x[10 - i - 1] = temp;
    	}
    	for (i = 0; i < 10; i++)
    	{
    		cout << x[i];
    	}
    	system("pause");
    	return 0;
    }
    
  • Re: Invertire gli elementi di un vettore

    Invertire un vettore significa scambiare il generico elemento dell'array con il suo simmetrico rispetto al centro dell'array.
    Gli elementi scambiati sono quelli con lo stesso colore (sia n la dimensione dell'array):

    - n PARI --> x x x x x x

    - n DISPARI -- > x x x x x

    Quanti scambi bisogna effettuare nei due casi per invertire l'array? n (come fai tu) o di meno?
  • Re: Invertire gli elementi di un vettore

    Ops... Ho trovato un errore CLAMOROSO nella versione di rovesciamento del vettore di interi che ho messo come esempio in un mio messaggio precedente. Ovviamente è un'enorme stupidaggine dividere per due il puntatore v: doveva essere dim_v a essere diviso per due per dare dim_vMezzi.
    /*==============================================================================
    Riceve, tramite il parametro v, un puntatore ad un vettore di interi e lo
    "rovescia" in loco invertendone l'ordine degli elementi.
    Restituisce lo stesso puntatore ricevuto tramite il parametro v.
    ==============================================================================*/
    
    int *erottev( int *v, unsigned int dim_v ) {
        if( NULL != v ) { /* v deve essere un puntatore valido */
            unsigned int i, dim_vMezzi;
            int *p, aux;
    
            /* inverte l'ordine dei caratteri nel vettore */
            for( dim_vMezzi=dim_v/2, i=0; i<dim_vMezzi; ++i ) {
                aux = v[i];
                v[i] = v[dim_v-i-1];
                v[dim_v-i-1] = aux;
            }
        }
    
        return s;
    }
  • Re: Invertire gli elementi di un vettore

    Nippolo ha scritto:


    Invertire un vettore significa scambiare il generico elemento dell'array con il suo simmetrico rispetto al centro dell'array.
    Gli elementi scambiati sono quelli con lo stesso colore (sia n la dimensione dell'array):

    - n PARI --> x x x x x x

    - n DISPARI -- > x x x x x

    Quanti scambi bisogna effettuare nei due casi per invertire l'array? n (come fai tu) o di meno?

    ce l'ho fatta!! Certamente questo programmino non lo scorderò mai più
    Grazie mille a tutti
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int x[10], i, j, temp = 0;
    	for (i = 0; i < 10; i++)
    	{
    		cin >> x[i];
    	}
    	for (i = 0; i < 5; i++)
    	{
    		temp = x[i];
    		x[i] = x[10 - i - 1];
    		x[10 - i - 1] = temp;
    	}
    	for (i = 0; i < 10; i++)
    	{
    		cout << x[i];
    	}
    	system("pause");
    	return 0;
    }
    
  • Re: Invertire gli elementi di un vettore

    giulia18395 ha scritto:


    Nippolo ha scritto:


    Invertire un vettore significa scambiare il generico elemento dell'array con il suo simmetrico rispetto al centro dell'array.
    Gli elementi scambiati sono quelli con lo stesso colore (sia n la dimensione dell'array):

    - n PARI --> x x x x x x

    - n DISPARI -- > x x x x x

    Quanti scambi bisogna effettuare nei due casi per invertire l'array? n (come fai tu) o di meno?

    ce l'ho fatta!! Certamente questo programmino non lo scorderò mai più
    Grazie mille a tutti
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int x[10], i, j, temp = 0;
    	for (i = 0; i < 10; i++)
    	{
    		cin >> x[i];
    	}
    	for (i = 0; i < 5; i++)
    	{
    		temp = x[i];
    		x[i] = x[10 - i - 1];
    		x[10 - i - 1] = temp;
    	}
    	for (i = 0; i < 10; i++)
    	{
    		cout << x[i];
    	}
    	system("pause");
    	return 0;
    }
    
    Però mi è rimasto comunque un dubbio, se i vettori fossero 2? Del tipo x a 10 interi e y di 10 interi, riempire x e copiare il vettore x nel vettore y al contrario?
  • Re: Invertire gli elementi di un vettore

    Sarebbe più facile provaci
  • Re: Invertire gli elementi di un vettore

    giulia18395 ha scritto:


    Però mi è rimasto comunque un dubbio, se i vettori fossero 2? Del tipo x a 10 interi e y di 10 interi, riempire x e copiare il vettore x nel vettore y al contrario?
    Ti dò un aiutino...

    Usa un solo ciclo for, all'interno del ciclo metti sia il vettore x che segue l'andamento del ciclo, e sia il vettore y che segue anch'esso l'andamento del ciclo ma al contrario utilizzando una semplicissima formuletta matematica con il segno meno, ed effettui lo scambio dei valori contenuti all'interno dei due vettori, posizione per posizione fino a che il vettore x=10 (se parti da 1), ed il vettore y=1 (se lo fai partire da 11-x)...
  • Re: Invertire gli elementi di un vettore

    ramcrack ha scritto:


    giulia18395 ha scritto:


    Però mi è rimasto comunque un dubbio, se i vettori fossero 2? Del tipo x a 10 interi e y di 10 interi, riempire x e copiare il vettore x nel vettore y al contrario?
    Ti dò un aiutino...

    Usa un solo ciclo for, all'interno del ciclo metti sia il vettore x che segue l'andamento del ciclo, e sia il vettore y che segue anch'esso l'andamento del ciclo ma al contrario utilizzando una semplicissima formuletta matematica con il segno meno, ed effettui lo scambio dei valori contenuti all'interno dei due vettori, posizione per posizione fino a che il vettore x=10 (se parti da 1), ed il vettore y=1 (se lo fai partire da 11-x)...
    Grazie appena riesco ci provo e ti faccio sapere se sono riuscita
  • Re: Invertire gli elementi di un vettore

    OK... ovviamente quando ho detto di fare 11-x, per "x" intendo non il vettore x, ma la variabile che utilizzerai come puntatore nel ciclo di FOR (che potrai chiamare come preferisci, anche pippo volendo...), che sarà la stessa utilizzata sia per incrementare il vettore "x" e sia per decrementare il vettore "y" con la formuletta: 11-pippo...
Devi accedere o registrarti per scrivere nel forum
26 risposte