[C] Problema inversione Array

di il
12 risposte

[C] Problema inversione Array

Buonasera, dovrei produrre un programma che legge gli elementi di un array e li stampa invertendo il primo con l'ultimo, il secondo con il penultimo, il terzo con il terzultimo e così via. So che il mio ragionamento è sbagliato, ma non riesco a trovare il modo di farlo, qualcuno potrebbe aiutarmi? Grazie mille! Ah! Non devo fare uso di funzioni.
Qui il mio codice:
#include <stdio.h>

int main(){
     int i=0,n,m=0;
     printf("Inserisci grandezza vettore:");
	 scanf("%d", &i);
	 int elementi[i];
	 for( n=0; n<i; n++ ){
     printf("Elemento %d: ", n+1) ;
     scanf("%d", &elementi[n]) ;
	 }
	 for(i--; i>=m; i-- ){
	 	int p=0,b=0;
b=elementi[i];
p=elementi[m];
elementi[i]=p;
elementi[m]=b;
m++;
}

for(n; n>=0; n-- ){
printf("%d", elementi[n]) ;
}
return 0;
	 }

12 Risposte

  • Re: [C] Problema inversione Array

    Ti basta un ciclo da 0 alla metà del numero di elementi (n/2). Usi l'indice del ciclo e il valore n-indice-1 per identificare gli elementi da scambiare.
  • Re: [C] Problema inversione Array

    oregon ha scritto:


    Ti basta un ciclo da 0 alla metà del numero di elementi (n/2). Usi l'indice del ciclo e il valore n-indice-1 per identificare gli elementi da scambiare.
    Visto la mia elevata ignoranza in materia, come magari forse hai già notato, non sono riuscito a capire la tua soluzione, o almeno non ho la più pallida idea di come si faccia. Grazie comunque!
  • Re: [C] Problema inversione Array

    Ma perché non provi a scrivere il ciclo for che ti ho suggerito e ne parliamo?
  • Re: [C] Problema inversione Array

    oregon ha scritto:


    Ma perché non provi a scrivere il ciclo for che ti ho suggerito e ne parliamo?
    #include <stdio.h>

    int main(){
    int i=0,n,m=0,p=0;
    printf("Inserisci grandezza vettore:");
    scanf("%d", &i);
    int elementi;
    for( n=0; n<i; n++ ){
    printf("Elemento %d: ", n+1) ;
    scanf("%d", &elementi[n]) ;
    }
    for(i--; i>=n; i-- ){
    p=elementi[m];
    elementi[m]= elementi;
    elementi=p;
    m++;
    n++;

    }

    for(n; n>=0; n-- ){
    printf("%d", elementi[n]) ;
    }
    return 0;
    }


    La mia idea è, che il ciclo for si ripete tante volte quanto richiesto dall'utente, e fino qua va bene. Poi chiamo con una variabile(p) l'elemento che si trova in m, nel primo caso 0, poi faccio in modo che l'elemento in 0 assuma il valore dell'ultima, e che l'ultima assuma quello di p, cioè in m, poi sommo 1 a m, 1 a n(per arrivare a metà ed evitare di fare n/2) e a fine del ciclo i diminuisce partendo da dal secondo valore in posizione 1 e il penultimo. Quando i valori saranno uguali la stampa dovrebbe avvenire simultaneamente. Non capisco cosa concettualmente è sbagliato.
  • Re: [C] Problema inversione Array

    Ciao, tranquillo nessuno è nato insegnato, pensa io fino a 6 mesi fa non sapevo nemmeno fare #include <stdio.h>.
    Avvolte le cose semplici possono sembrare complicate ad un ragazzo che sta entrano per la prima volta nell ambito della programmazione.
    Ma tranquillo la fame vien mangiando.
    L'esercizio richiede l'applicazione di una terza variabile chiamata variabile di appoggio(non sono un programmatore ma sono un ragazzo al primo anno di programmazione universitaria, quindi sicuramente la mia soluzione verrà raffinata da chi ne sa di più di me).
    Faccio prima ha postarti il codice, ho usato i sottoprogrammi e anche la programmazione non strutturata(unico punto di ingresso più punti di uscita).
    Se hai dubbi contattami tranquillamente.

    ah volevo solo dirti una cosa che a me hanno insegnato prima che scrivessi il programma HELLO WORD, "Anche l'occhio vuole la sua parte".
    #include <stdio.h>
    
    #define N 5
    
    // Spazio per prototipi
    void inserisciArray(int* arrayGenerico);
    void visualizzaArray(int* arrayGenerico);
    void invertiPosizioni(int* arrayGenerico);
    
    int main(){
    // in questo caso non uso il menu' di comandi ma renderebbe il codice molto più leggibile.
    	int collezione[N];
    	inserisciArray(collezione);
    	visualizzaArray(collezione);
    	printf("Sto invertendo gli elementi. [Attendete]\n");
    	invertiPosizioni(collezione);
    	printf("Collezione con elementi inverititi.\n");
    	visualizzaArray(collezione);
    	return 0;
    }
    
    void inserisciArray(int* arrayGenerico){   // int* arrayGenerico  corrisponde a int arrayGenerico[dimenzione]
    	printf("Inserisci gli elementi.\n");
    	int i;
    	for(i = 0; i < N; i++){
    		scanf("%d", &arrayGenerico[i]);
    	}
    	return;
    }   
    
    void visualizzaArray(int* arrayGenerico){   // int* arrayGenerico  corrisponde a int arrayGenerico[dimenzione]
    	printf("Inserisci gli elementi.\n");
    	int i;
    	for(i = 0; i < N; i++){
    		printf("Elemento %d : %d\n", i + 1, arrayGenerico[i]);
    	}
    	return;
    }   
    
    void invertiPosizioni(int* arrayGenerico){
    	int i, tmp;
    	int posCorrispondente = N - 1;   // l'array va da 0 a n-1.
    	for(i = 0; i < N; i++){
    		if(i == posCorrispondente){
    			//printf("***** Sono uscito %d\n",i); stampa di debug.
    			return;  // programmazione non strutturata.
    		}
    		tmp = arrayGenerico[i];   // per scambiare due valori devo copiare uno dei valori in una variabile temporane per non perdere dati.
    		arrayGenerico[i]  = arrayGenerico[posCorrispondente];   // eseguo lo scambio pogiando il primo nell ultimo.(Prendo in considerazione il primo caso)
    		arrayGenerico[posCorrispondente] = tmp;     // metto il valore della variabile temporanea al suo posto.
    		posCorrispondente--; //descremento la posizioneCorrispondente
    		printf("%d\n", posCorrispondente);
    	}
    	return;
    }
  • Re: [C] Problema inversione Array

    cazyjoker96 ha scritto:


    Ciao, tranquillo nessuno è nato insegnato, pensa io fino a 6 mesi fa non sapevo nemmeno fare #include <stdio.h>.
    Avvolte le cose semplici possono sembrare complicate ad un ragazzo che sta entrano per la prima volta nell ambito della programmazione.
    Ma tranquillo la fame vien mangiando.
    L'esercizio richiede l'applicazione di una terza variabile chiamata variabile di appoggio(non sono un programmatore ma sono un ragazzo al primo anno di programmazione universitaria, quindi sicuramente la mia soluzione verrà raffinata da chi ne sa di più di me).
    Faccio prima ha postarti il codice, ho usato i sottoprogrammi e anche la programmazione non strutturata(unico punto di ingresso più punti di uscita).
    Se hai dubbi contattami tranquillamente.

    ah volevo solo dirti una cosa che a me hanno insegnato prima che scrivessi il programma HELLO WORD, "Anche l'occhio vuole la sua parte".
    #include <stdio.h>
    
    #define N 5
    
    // Spazio per prototipi
    void inserisciArray(int* arrayGenerico);
    void visualizzaArray(int* arrayGenerico);
    void invertiPosizioni(int* arrayGenerico);
    
    int main(){
    // in questo caso non uso il menu' di comandi ma renderebbe il codice molto più leggibile.
    	int collezione[N];
    	inserisciArray(collezione);
    	visualizzaArray(collezione);
    	printf("Sto invertendo gli elementi. [Attendete]\n");
    	invertiPosizioni(collezione);
    	printf("Collezione con elementi inverititi.\n");
    	visualizzaArray(collezione);
    	return 0;
    }
    
    void inserisciArray(int* arrayGenerico){   // int* arrayGenerico  corrisponde a int arrayGenerico[dimenzione]
    	printf("Inserisci gli elementi.\n");
    	int i;
    	for(i = 0; i < N; i++){
    		scanf("%d", &arrayGenerico[i]);
    	}
    	return;
    }   
    
    void visualizzaArray(int* arrayGenerico){   // int* arrayGenerico  corrisponde a int arrayGenerico[dimenzione]
    	printf("Inserisci gli elementi.\n");
    	int i;
    	for(i = 0; i < N; i++){
    		printf("Elemento %d : %d\n", i + 1, arrayGenerico[i]);
    	}
    	return;
    }   
    
    void invertiPosizioni(int* arrayGenerico){
    	int i, tmp;
    	int posCorrispondente = N - 1;   // l'array va da 0 a n-1.
    	for(i = 0; i < N; i++){
    		if(i == posCorrispondente){
    			//printf("***** Sono uscito %d\n",i); stampa di debug.
    			return;  // programmazione non strutturata.
    		}
    		tmp = arrayGenerico[i];   // per scambiare due valori devo copiare uno dei valori in una variabile temporane per non perdere dati.
    		arrayGenerico[i]  = arrayGenerico[posCorrispondente];   // eseguo lo scambio pogiando il primo nell ultimo.(Prendo in considerazione il primo caso)
    		arrayGenerico[posCorrispondente] = tmp;     // metto il valore della variabile temporanea al suo posto.
    		posCorrispondente--; //descremento la posizioneCorrispondente
    		printf("%d\n", posCorrispondente);
    	}
    	return;
    }
    Ti ringrazio tantissimo sia per il tuo tempo dedicato a me e sia per la tua pazienza. Visto che devo fare il programma sena l'uso di funzioni, ho provato aiutandomi tantissimo dal tuo cercando di farne uno senza. Sono arrivato a questo punto:
    #include <stdio.h>
    
    int main(){
         int i=0,n,p;
         printf("Inserisci grandezza vettore:");
        scanf("%d", &i);
        int elementi[i];
        for( n=0; n<i; n++ ){
         printf("Elemento %d: ", n+1) ;
         scanf("%d", &elementi[n]) ;
        }
       int  tmp;
       int posCorrispondente = i-1
       for(n = 0; n < i; n++){
          if(n == posCorrispondente){
          	for(i; i>=0; i-- ){
    printf("%d", elementi[i]) ;
    }
    return 0;
          }
          tmp = elementi[n]; 
          elementi[n]  = elementi[posCorrispondente];
          elementi[posCorrispondente] = tmp; 
          posCorrispondente--;
          printf("%d\n", posCorrispondente);
        
    }
    for(n; n>=0; n-- ){
    printf("%d", elementi[n]) ;
    }
    return 0;
        }
    Cosa continuo a sbagliare? Grazie mille in anticipo!
  • Re: [C] Problema inversione Array

    Prova a seguire il mio suggerimento ... Con una sola for scambi gli elementi e finisce ... È anche semplice da comprendere...
  • Re: [C] Problema inversione Array

    oregon ha scritto:


    Prova a seguire il mio suggerimento ... Con una sola for scambi gli elementi e finisce ... È anche semplice da comprendere...
    sinceramente non ho capito, è questo il punto, mi dispiace
  • Re: [C] Problema inversione Array

    Cosa non hai capito? Se non provi ad iniziare a scrivere la for come si fa a vedere cosa non hai capito?
  • Re: [C] Problema inversione Array

    Sono giunto ad una conclusione!
    #include <stdio.h>
    main()
    {
    int i=0, j=0, temp,p=0,n;
    printf("Inserisci grandezza vettore:");
    	scanf("%d", &n);
    	int elementi[n];
    for( p=0; p<n; p++ ){
    printf("Elemento %d: ", p+1) ;
    scanf("%d", &elementi[p]) ;
    }
    j =n-1;
    while (i <= j) {
    temp = elementi[i];
    elementi[i] = elementi[j];
    elementi[j] = temp;
    i++;
    j--;
    }
    for(int i=0; i<n; i++ ){
    printf("%d", elementi[i]) ;
    }
    return 0;
        }
    Finalmente sono riuscito a farlo! Grazie a tutti
  • Re: [C] Problema inversione Array

    Questo è un altro tipo di codice rispetto a quello che avevi usato fino ad ora... Comunque basta i<j e la variabile i nell'ultimo ciclo non ha senso crearla, esiste già...
  • Re: [C] Problema inversione Array

    justin99 ha scritto:


    cazyjoker96 ha scritto:


    Ciao, tranquillo nessuno è nato insegnato, pensa io fino a 6 mesi fa non sapevo nemmeno fare #include <stdio.h>.
    Avvolte le cose semplici possono sembrare complicate ad un ragazzo che sta entrano per la prima volta nell ambito della programmazione.
    Ma tranquillo la fame vien mangiando.
    L'esercizio richiede l'applicazione di una terza variabile chiamata variabile di appoggio(non sono un programmatore ma sono un ragazzo al primo anno di programmazione universitaria, quindi sicuramente la mia soluzione verrà raffinata da chi ne sa di più di me).
    Faccio prima ha postarti il codice, ho usato i sottoprogrammi e anche la programmazione non strutturata(unico punto di ingresso più punti di uscita).
    Se hai dubbi contattami tranquillamente.

    ah volevo solo dirti una cosa che a me hanno insegnato prima che scrivessi il programma HELLO WORD, "Anche l'occhio vuole la sua parte".
    #include <stdio.h>
    
    #define N 5
    
    // Spazio per prototipi
    void inserisciArray(int* arrayGenerico);
    void visualizzaArray(int* arrayGenerico);
    void invertiPosizioni(int* arrayGenerico);
    
    int main(){
    // in questo caso non uso il menu' di comandi ma renderebbe il codice molto più leggibile.
    	int collezione[N];
    	inserisciArray(collezione);
    	visualizzaArray(collezione);
    	printf("Sto invertendo gli elementi. [Attendete]\n");
    	invertiPosizioni(collezione);
    	printf("Collezione con elementi inverititi.\n");
    	visualizzaArray(collezione);
    	return 0;
    }
    
    void inserisciArray(int* arrayGenerico){   // int* arrayGenerico  corrisponde a int arrayGenerico[dimenzione]
    	printf("Inserisci gli elementi.\n");
    	int i;
    	for(i = 0; i < N; i++){
    		scanf("%d", &arrayGenerico[i]);
    	}
    	return;
    }   
    
    void visualizzaArray(int* arrayGenerico){   // int* arrayGenerico  corrisponde a int arrayGenerico[dimenzione]
    	printf("Inserisci gli elementi.\n");
    	int i;
    	for(i = 0; i < N; i++){
    		printf("Elemento %d : %d\n", i + 1, arrayGenerico[i]);
    	}
    	return;
    }   
    
    void invertiPosizioni(int* arrayGenerico){
    	int i, tmp;
    	int posCorrispondente = N - 1;   // l'array va da 0 a n-1.
    	for(i = 0; i < N; i++){
    		if(i == posCorrispondente){
    			//printf("***** Sono uscito %d\n",i); stampa di debug.
    			return;  // programmazione non strutturata.
    		}
    		tmp = arrayGenerico[i];   // per scambiare due valori devo copiare uno dei valori in una variabile temporane per non perdere dati.
    		arrayGenerico[i]  = arrayGenerico[posCorrispondente];   // eseguo lo scambio pogiando il primo nell ultimo.(Prendo in considerazione il primo caso)
    		arrayGenerico[posCorrispondente] = tmp;     // metto il valore della variabile temporanea al suo posto.
    		posCorrispondente--; //descremento la posizioneCorrispondente
    		printf("%d\n", posCorrispondente);
    	}
    	return;
    }
    Ti ringrazio tantissimo sia per il tuo tempo dedicato a me e sia per la tua pazienza. Visto che devo fare il programma sena l'uso di funzioni, ho provato aiutandomi tantissimo dal tuo cercando di farne uno senza. Sono arrivato a questo punto:
    #include <stdio.h>
    
    int main(){
         int i=0,n,p;
         printf("Inserisci grandezza vettore:");
        scanf("%d", &i);
        int elementi[i];
        for( n=0; n<i; n++ ){
         printf("Elemento %d: ", n+1) ;
         scanf("%d", &elementi[n]) ;
        }
       int  tmp;
       int posCorrispondente = i-1
       for(n = 0; n < i; n++){
          if(n == posCorrispondente){
          	for(i; i>=0; i-- ){
    printf("%d", elementi[i]) ;
    }
    return 0;
          }
          tmp = elementi[n]; 
          elementi[n]  = elementi[posCorrispondente];
          elementi[posCorrispondente] = tmp; 
          posCorrispondente--;
          printf("%d\n", posCorrispondente);
        
    }
    for(n; n>=0; n-- ){
    printf("%d", elementi[n]) ;
    }
    return 0;
        }
    Cosa continuo a sbagliare? Grazie mille in anticipo!


    Non ho provato ad eseguire il codice, quindi non so dirti se funziona, ma sicuramente se uno lo vedesse per la prima volta, non riuscirebbe a capire la logica del codice (scusami, sono stato insegnato in questo modo). le mie procedure nel codice non contengono altro che un ciclo for. quindi banalmente potresti usarli anche nel main, facendo un po di attenzione ai nomi delle variabili.
    Ho visto che prendi in input anche la dimensione dell'array, sintatticamente nulla da dire, ma se per sbaglio cambi il valore alla variabile che indica la dimensione del tuo vettore?? Credo che il metodo più semplice da usare e dichiarare una Costante globale, visibile a tutti.
    Del resto il trucco sta nell'appoggiarsi in una variabile temporanea.
Devi accedere o registrarti per scrivere nel forum
12 risposte