Problema con un esercizio

di il
10 risposte

Problema con un esercizio

Salve. Ho problemi con questo esercizio:

Un programma deve leggere dall’utente due vettori di 5 elementi ciascuno. Il programma deve creare un ulteriore vettore, che contenga la copia dei soli elementi pari presenti nei due vettori di partenza, e stampare tale vettore.
#include <stdio.h>

#define N 5

int main (){
	
	int A[N], B[N], C[N+N];
	int i=0;
	
	printf("Inserisci i valori del primo vettore:\n");
	
	for (i=1; i<=N; i++){
		scanf("%d", &A[i]);
	}
	
	printf("Inserisci i valori del secondo vettore:\n");
	
	for (i=1; i<=N; i++){
		scanf("%d", &B[i]);
	}
	
	for (i=1; i<=N+N; i++){
		if (A[i]%2==0){
			C[i]=A[i];
		}
	}	
	
	for (i=1; i<=N+N; i++){
		if (B[i]%2==0){
			C[i+N]=B[i];
		}
			
	}
	
	printf("Il vettore con gli elementi pari e'\n");
	
	for (i=1; i<=N+N; i++){
		printf("%d ", C[i]);
	}
		
	
	return 0;
}
Non capisco se sia normale che inserisca 0 se non trova numeri pari. Vorrei riempirlo con solo gli elementi pari che al massimo possono essere N+N ma possono essere di meno. Come potrei tradurlo in codice?

10 Risposte

  • Re: Problema con un esercizio

    Ciao!
    Il problema dovuto agli zeri potrebbe essere (quasi certamente lo è) dovuto dal fatto che alcune posizioni del vettore non sono state inizializzate.
    Non avendo inizializzato il vettore, in esso ci sono contenuti valori "a caso". Dico a caso, perché in realtà dipende dai compilatori, alcuni potrebbero automaticamente impostarli a 0 altri no, e ritrovarti con valori assurdi.

    Questo problema, è dovuto al fatto che non tutte le caselle del vettore C le vai a riempire.
    Di seguito ti metto in ordine un paio di problemi che ho riscontrato nel tuo codice, e in grassetto ti evidenzio quello da te più interessato.

    1) nei cicli for, tutti i cicli for, sia quelli che prendono in input un valore sia quelli che controllano la presenza di elementi da inserire in C tu usi le celle di memoria del vettore da 1 a LunghezzaVettore, il che è sconsigliato farlo.
    Risolvi a questo problema, correggendo i cicli for con (i=0; i<N; i++){...}

    2) Qui il tuo problema, è dovuto al fatto che hai lasciato alcune "caselle" del vettore vuote... questo perchè ti sei basato sempre sull'uso di un'unica variabile (i).
    Per risolvere questo tuo problema, dovrai sfruttare l'uso di due variabili, al fine di controllare le celle del vettore A o B con una (supponiamo i) e quelle del vettore C con un'altra (supponiamo j). Ti ho riportato l'uso qui di sotto.
    
    int i, j=0;
    for(i=0; i<N; i++){
    	if(A[i]%2==0){ //Numero pari
    		C[j]=A[i];
    		j++;
    	}
    }
    for(i=0; i<N; i++){
    	if(B[i]%2==0){ //Numero pari
    		C[j]=B[i];
    		j++;
    	}
    }
    
    Attenzione, anche in questo modo, in coda al vettore C potresti ritrovarti valori pari a 0, perchè appunto non sono stati riempiti, però basta escluderli dalla stampa.

    Una soluzione potrebbe essere che in dichiarazione del vettore C, lo inizializzi tutto per un valore dispari (Es. 1), ovvero un valore che sei sicuro non può essere corretto.
    
    int A[N}, B[N], C[N+N];
    int i;
    for(i=0; i<N+N; i++){
    	C[i]=1;
    }
    
    //... Resto del codice ...
    
    Buona serata,
    - MoraGames
  • Re: Problema con un esercizio

    Occhio Luke che scrivere

    for (i=1; i<=N; i++)

    è sbagliato
  • Re: Problema con un esercizio

    Perché non fornire anche una spiegazione di come mai far partire l'indice da 1 è "sbagliato"?

    @Luke96
    l'indice associato al primo elemento di un array è 0, va da sé quindi che quello associato all'ultimo sarà n-1, dove n è il numero di elementi (ossia la dimensione) del vettore.

    MoraGames_ ha scritto:


    ...
    Per risolvere questo tuo problema, dovrai sfruttare l'uso di due variabili, al fine di controllare le celle del vettore A o B con una (supponiamo i) e quelle del vettore C con un'altra (supponiamo j). Ti ho riportato l'uso qui di sotto.
    
    int i, j=0;
    for(i=0; i<N; i++){
    	if(A[i]%2==0){ //Numero pari
    		C[j]=A[i];
    		j++;
    	}
    }
    for(i=0; i<N; i++){
    	if(B[i]%2==0){ //Numero pari
    		C[j]=B[i];
    		j++;
    	}
    }
    
    Attenzione, anche in questo modo, in coda al vettore C potresti ritrovarti valori pari a 0, perchè appunto non sono stati riempiti, però basta escluderli dalla stampa.

    Una soluzione potrebbe essere che in dichiarazione del vettore C, lo inizializzi tutto per un valore dispari (Es. 1), ovvero un valore che sei sicuro non può essere corretto.
    ...
    Non sarebbe meglio sfruttare il valore finale di j come dimensione dell'array C?!
  • Re: Problema con un esercizio

    Grazie mille a tutti per le esaustive risposte.
    Allora per quanto riguarda il ciclo for con l'inizializzazione di i=1, l'ho vista nelle sezioni di "buona abitudine" che ci sono sul Deitel. Io infatti avevo iniziato a compilare usando i=0, ma avendo visto questa nota in cui dice che è molto più leggibile e più facile da correggere per eventuali modifiche o errori, l'ho cambiato. Alla faccia della buona abitudine . Che poi gli esercizi precedenti giravano bene quindi per me era tutto ok
    Se ai posteri potrebbe servire una versione dell'esercizio:
    #include <stdio.h>
    
    #define N 5
    
    int main (){
    	
    	int A[N], B[N], C[N+N];
    	int i=0, j=0;
    	
    	for(i=0; i<N+N; i++){
    		C[i]=1;
    	}
    	
    	printf("Inserisci i valori del primo vettore:\n");
    	
    	for (i=0; i<N; i++){
    		scanf("%d", &A[i]);
    	}
    	
    	printf("Inserisci i valori del secondo vettore:\n");
    	
    	for (i=0; i<N; i++){
    		scanf("%d", &B[i]);
    	}
    	
    	
    	for(i=0; i<N; i++){
    		if(A[i]%2==0){ //Numero pari
    			C[j]=A[i];
    			j++;
    		}
    	}
    	
    	for(i=0; i<N; i++){
    		if(B[i]%2==0){ //Numero pari
    			C[j]=B[i];
    			j++;
    		}
    	}	
    
    	
    	printf("Il vettore con gli elementi pari e'\n");
    	
    	for (i=0; i<N+N; i++){
    		if (C[i]%2==0){
    			printf("%d ", C[i]);
    		}
    		else {
    			printf("-");
    		}
    		
    	}
    		
    	
    	return 0;
    }
    Grazie ancora a tutti
  • Re: Problema con un esercizio

    Di niente, ma

    Nippolo ha scritto:


    Non sarebbe meglio sfruttare il valore finale di j come dimensione dell'array C?!
    EDIT:

    Luke96 ha scritto:


    ...
    Allora per quanto riguarda il ciclo for con l'inizializzazione di i=1, l'ho vista nelle sezioni di "buona abitudine" che ci sono sul Deitel. Io infatti avevo iniziato a compilare usando i=0, ma avendo visto questa nota in cui dice che è molto più leggibile e più facile da correggere per eventuali modifiche o errori, l'ho cambiato. Alla faccia della buona abitudine .
    Sicuro di aver interpretato bene il consiglio del libro? Di preciso cosa dice questa nota?

    Luke96 ha scritto:


    Che poi gli esercizi precedenti giravano bene quindi per me era tutto ok
    Fortuna, presumo!
  • Re: Problema con un esercizio

    Nippolo ha scritto:


    Di niente, ma

    Nippolo ha scritto:


    Non sarebbe meglio sfruttare il valore finale di j come dimensione dell'array C?!
    Si, teoricamente sarebbe meglio, ma per fare ciò vuol dire che la dimensione dell'array viene dichiarata dopo l'uso dell'array, e per quello che io so è sbagliato, dovrebbe dare errore, o comunque non dovrebbe essere di buona abitudine farlo.
    (O almeno così mi è stato insegnato).

    Una soluzione allo spazio "sprecato" del vettore C potrebbe sicuramente essere l'uso di un ciclo di ricerca dei numeri pari, sia in a che in b.
    Dopo aver fatto ciò dichiarare il vettore C con la lunghezza che si sa certamente che verrà utilizzata.
    Questo però richiederebbe il lavoro (sostanzialmente inutile) di un'altro ciclo for; su parole corte avrebbe senso, su parole lunghe potrebbe risultare estremamente controproducente.
  • Re: Problema con un esercizio

    MoraGames_ ha scritto:


    ...
    Si, teoricamente sarebbe meglio, ma per fare ciò vuol dire che la dimensione dell'array viene dichiarata dopo l'uso dell'array, e per quello che io so è sbagliato, dovrebbe dare errore, o comunque non dovrebbe essere di buona abitudine farlo.
    ...
    Con "dimensione" in questo caso intendo che andremo a stampare solo i primi j elementi (dei 2N totali) dell'array C.
    Qualcosa del genere per intenderci:
    #include <stdio.h>
    
    #define N 2
    
    int main ()
    {
    	int A[N];
    	int B[N];
    	int C[2 * N];
    	int i = 0;
    	int j = 0;
    
    	printf("Inserisci i valori del primo vettore:\n");
    	for(i = 0; i < N; ++i)
            {
    		scanf("%d", &A[i]);
    	}
    	printf("Inserisci i valori del secondo vettore:\n");
    	for(i = 0; i < N; ++i)
    	{
    		scanf("%d", &B[i]);
    	}
    
    	for(i = 0; i < N; ++i)
    	{
    		if(A[i] % 2 == 0)
    		{
    			C[j] = A[i];
    			++j;
    		}
    	}
    	for(i = 0; i < N; ++i)
            {
    		if(B[i] % 2 == 0)
    		{
    			C[j] = B[i];
    			++j;
    		}
    	}
    
    	printf("Il vettore con gli elementi pari e'\n");
    	for(i = 0; i < j; ++i)
            {
    		printf("%d ", C[i]);
    	}
    	return 0;
    }

    MoraGames_ ha scritto:


    (O almeno così mi è stato insegnato).
    In generale cerca sempre di capire qual è la logica (sempre che ce ne sia una ) che c'è dietro ad una nozione che viene imposta dall'alto!
  • Re: Problema con un esercizio

    Nippolo ha scritto:


    Con "dimensione" in questo caso intendo che andremo a stampare solo i primi j elementi (dei 2N totali) dell'array C.
    Ah, certo, in questo senso si, così da stampare i valori del vettore C effettivamente utilizzati.
    Mi scuso, non avevo compreso fosse questo il senso del messaggio.

    - MoraGames
  • Re: Problema con un esercizio

    Sicuro di aver interpretato bene il consiglio del libro? Di preciso cosa dice questa nota?
    Sul libro c'è scritto :
    Usare il valore finale insieme all'operatore relazionale <=, all'interno della condizione di una struttura for, aiuterà ad evitare gli errori di imprecisione di uno. Inizializziamo quindi la variabile di controllo counter ad 1. In seguito sarà verificata la condizione di continuazione del ciclo counter<=10. La variabile di controllo sarà quindi incrementata dall'espressione counter++ e il ciclo ripartirà nuovamente.

    E ci sono una miriade di esempi in cui inizializza counter=1. Forse capisco male io
  • Re: Problema con un esercizio

    Probabilmente il consiglio non era in riferimento agli array.
Devi accedere o registrarti per scrivere nel forum
10 risposte