Esercizi sugli array e funzioni

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Esercizi sugli array e funzioni

    1) SEMPRE return 0; (o altro valore) alla fine di main()
    2) dichiari il vettore con una dimensione non costante, partendo per di più da una variabile non inizializzata; a seconda della versione del C che usi il vettore potrebbe avere una lunghezza qualsiasi tra 0 elementi e millemila elementi, oppure il compilatore potrebbe sbatterti in faccia una bella notifica d'errore e rifiutarsi di fare il suo lavoro
    3) per ora, a meno che ti sia richiesto esplicitamente di fare diversamente, usa vettori a dimensione fissa, magari sovradimensionandoli con un valore "etichettato" con un #define
    4) hai chiuso il ciclo for() di "fusione" troppo avanti, andava chiuso PRIMA di if(i<lunghezza*2)

    Consiglio da "smanettone": dedica tanta, TANTA attenzione alla cosiddetta "indentazione", perché aiuta davvero a tenere traccia di quel che si sta facendo.
  • Re: Esercizi sugli array e funzioni

    @AldoBaldo, NON HAI CAPITO la questione fondamentale!

    NON E' codice che devi presentare a qualcuno che mastica C/C++ come il pane, ma a qualcuno che vede questo codice PER LA PRIMA VOLTA e quello che mostri SONO LE PRIME LINEE DI CODICE che vede.
    Che cavolo ne sa lui/lei che NULL e' un puntatore generico, che f(qualsiasi_cosa_non_zero) e VERO, che 'typedef unsigned long size_t', ecc..

    Certi discorsi li puoi fare con qualcuno con k*(tuoi_anni_di_esperienza) e k>1.0, NON con uno che ha k=0.00001

    Quindi, ATTENTO a fare il saputello, rischi di fare dei scivoloni dolorosi.
    Come si dice dalle mie parti 'tas pisulat, lassa favelar tu mare che le piu vecia'!

    Nota/1: a parte qualche esempio ultra-semplice o casi MOLTO specifici (ambienti embedded) quante volte nella tua ziovine vita ti e' capitato di allocare STATICAMENTE un vettore?
    Manipolazione di stringhe?

    Il rapporto 'eps= ((float)n_allocazione_statica_vettore)/n_allocazione_dinamica_vettore' e' maggiore di zero e piccolo a piacere!

    Nota/2: ho usato l'allocazione dinamica perche' TU hai proposto una signature con 'int*' e NON 'int[]'. NON E' per nulla ovvio che le due sintassi abbiano la stessa semantica. INVECE ragionando in termini di 'int*' fin da subito, ti risparmi una cosa in piu' (ed al momento inutile) da sapere.
  • Re: Esercizi sugli array e funzioni

    Ho fatto questo codice, deve prendere due vettori ordinati, unirli e creare un vettore ordinato.

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
    
    int lunghezza, lunghtot;
    int v1[lunghezza], v2[lunghezza], vtot[lunghtot];
    int i, a, b;
    
    printf("Quanto lungo il vettore?\n\n");
    scanf("%d", &lunghezza);
    
    lunghtot=lunghezza*2;
    
    printf("Inserisci gli elementi del primo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: ", i+1);
    	scanf("%d", &v1[i]);
    	}
    printf("Stampa gli elementi del primo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: %d\n", i+1, v1[i]);
    
    	}
    
    printf("Inserisci gli elementi del secondo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: ", i+1);
    	scanf("%d", &v2[i]);
    	}
    printf("Stampa gli elementi del secondo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: %d\n", i+1, v2[i]);
    
    	}
    
    
    
    
    for (i=0, a=0, b=0; i<lunghtot && a<lunghezza && b<lunghezza; i++)
    	{
    	if(v1[a] <= v2[b])
    		{
    		vtot[i]=v1[a];
    		a= a + 1;
    		}
    	else
    		{
    		vtot[i]=v2[b];
    		b = b + 1;
    		}
    
    if(i<lunghtot)
    	{
    	if(b==lunghezza)
    		{
    		for( ; i<lunghtot; i++, a++)
    		vtot[i]=v1[a];
    		}
    	else
    		{
    		for( ; i<lunghtot; i++, b++)
    		vtot[i]=v2[b];
    		}
    	}
    
    printf("Il vettore ordinato e':\n");
    for(i=0; i<lunghtot; i++)
    	{
    	printf("elemento %d: %d \n", i+1, vtot[i]);
    	}
    	
    }
    
    }
    
    
    	
    
    
    
    
    
    
    
    


    Compilando così questo è il risultato:

    Quanto lungo il vettore?

    2
    Inserisci gli elementi del primo vettore

    Elemento 1: 1
    Elemento 2: 5
    Stampa gli elementi del primo vettore

    Elemento 1: 1
    Elemento 2: 5
    Inserisci gli elementi del secondo vettore

    Elemento 1: 3
    Elemento 2: 4
    Stampa gli elementi del secondo vettore

    Elemento 1: 3
    Elemento 2: 4
    Il vettore ordinato e':
    elemento 1: 3
    elemento 2: 4
    elemento 3: -982010178
    elemento 4: 32763
  • Re: Esercizi sugli array e funzioni

    migliorabile ha scritto:


    @AldoBaldo, NON HAI CAPITO la questione fondamentale!

    NON E' codice che devi presentare a qualcuno che mastica C/C++ come il pane, ma a qualcuno che vede questo codice PER LA PRIMA VOLTA e quello che mostri SONO LE PRIME LINEE DI CODICE che vede.
    Che cavolo ne sa lui/lei che NULL e' un puntatore generico, che f(qualsiasi_cosa_non_zero) e VERO, che 'typedef unsigned long size_t', ecc..

    Certi discorsi li puoi fare con qualcuno con k*(tuoi_anni_di_esperienza) e k>1.0, NON con uno che ha k=0.00001

    Quindi, ATTENTO a fare il saputello, rischi di fare dei scivoloni dolorosi.
    Come si dice dalle mie parti 'tas pisulat, lassa parlar tu mare che le piu vecia'!

    Nota/1: a parte qualche esempio ultra-semplice o casi MOLTO specifici (ambienti embedded) quante volte nella tua ziovine vita ti e' capitato di allocare STATICAMENTE un vettore?
    Manipolazione di stringhe?

    Il rapporto 'eps= ((float)n_allocazione_statica_vettore)/n_allocazione_dinamica_vettore' e' maggiore di zero e piccolo a piacere!

    Nota/2: ho usato l'allocazione dinamica perche' TU hai proposto una signature con 'int*' e NON 'int[]'. NON E' per nulla ovvio che le due sintassi abbiano la stessa semantica. INVECE ragionando in termini di 'int*' fin da subito, ti risparmi una cosa in piu' (ed al momento inutile) da sapere.
    Ho fatto qualche lezione con il software R, ma poca roba, tipo metti i dati in un vettore e fai la media.
    Poi si ho fatto anche i vettori in algebra lineare, e le operazioni e i vettori di variabili (2 variabili solitamente) in probabilità.
    Ho passato tutti questi esami, e anche bene, quindi si dovrei saperne di vettori, ma mi mettono abbastanza in crisi.
  • Re: Esercizi sugli array e funzioni

    Vero_vev, hai controllato i quattro punti che ti ho indicato? Il trucco è lì (in particolare ai punti 2 e 4).

    MIgliorabile, mi indichi dove ho usato C++ anziché C nel mio esempio? Mi interessa, così la prossima volta evito di rifarlo.
  • Re: Esercizi sugli array e funzioni

    vero_vev ha scritto:


    Ho fatto questo codice, deve prendere due vettori ordinati, unirli e creare un vettore ordinato.

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
    
    int lunghezza, lunghtot;
    int v1[lunghezza], v2[lunghezza], vtot[lunghtot];
    int i, a, b;
    
    printf("Quanto lungo il vettore?\n\n");
    scanf("%d", &lunghezza);
    
    lunghtot=lunghezza*2;
    
    printf("Inserisci gli elementi del primo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: ", i+1);
    	scanf("%d", &v1[i]);
    	}
    printf("Stampa gli elementi del primo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: %d\n", i+1, v1[i]);
    
    	}
    
    printf("Inserisci gli elementi del secondo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: ", i+1);
    	scanf("%d", &v2[i]);
    	}
    printf("Stampa gli elementi del secondo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: %d\n", i+1, v2[i]);
    
    	}
    
    
    
    
    for (i=0, a=0, b=0; i<lunghtot && a<lunghezza && b<lunghezza; i++)
    	{
    	if(v1[a] <= v2[b])
    		{
    		vtot[i]=v1[a];
    		a= a + 1;
    		}
    	else
    		{
    		vtot[i]=v2[b];
    		b = b + 1;
    		}
    
    if(i<lunghtot)
    	{
    	if(b==lunghezza)
    		{
    		for( ; i<lunghtot; i++, a++)
    		vtot[i]=v1[a];
    		}
    	else
    		{
    		for( ; i<lunghtot; i++, b++)
    		vtot[i]=v2[b];
    		}
    	}
    
    printf("Il vettore ordinato e':\n");
    for(i=0; i<lunghtot; i++)
    	{
    	printf("elemento %d: %d \n", i+1, vtot[i]);
    	}
    	
    }
    
    }
    
    
    	
    
    
    
    
    
    
    
    


    Compilando così questo è il risultato:

    Quanto lungo il vettore?

    2
    Inserisci gli elementi del primo vettore

    Elemento 1: 1
    Elemento 2: 5
    Stampa gli elementi del primo vettore

    Elemento 1: 1
    Elemento 2: 5
    Inserisci gli elementi del secondo vettore

    Elemento 1: 3
    Elemento 2: 4
    Stampa gli elementi del secondo vettore

    Elemento 1: 3
    Elemento 2: 4
    Il vettore ordinato e':
    elemento 1: 3
    elemento 2: 4
    elemento 3: -982010178
    elemento 4: 32763
    Hai dichiarato i due vettori con al posto della grandezza delle variabili non inizializzate. Quando dichiari una variabile senza assegnargli un valore il C gli assegna comunque un valore che può partire da 0 sino a numeri enormi. Per dichiarare dei vettori crea una costante con la direttiva #define prima del main. Ad esempio:
    
    #include <stdio.h>
    #define MAX 30
    
    int main(){
    int v[MAX];
    }
    
    Poi successivamente utilizzerai le variabili contatore per accedere agli elementi del vettore.
  • Re: Esercizi sugli array e funzioni

    Grazie mille a tutti!
    Ho sistemato gli ultimi errori (il define e la parentesi sbagliata). il codice risultante è questo:
    #include<stdio.h>
    #include<stdlib.h>
    #define MAX 50
    
    int main(){
    
    int lunghezza, lunghtot;
    int v1[MAX], v2[MAX], vtot[MAX*2];
    int i, a, b;
    
    printf("Quanto lungo il vettore?\n\n");
    scanf("%d", &lunghezza);
    
    lunghtot=lunghezza+lunghezza;
    
    printf("Inserisci gli elementi del primo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: ", i+1);
    	scanf("%d", &v1[i]);
    	}
    printf("Stampa gli elementi del primo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: %d\n", i+1, v1[i]);
    
    	}
    
    printf("Inserisci gli elementi del secondo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: ", i+1);
    	scanf("%d", &v2[i]);
    	}
    printf("Stampa gli elementi del secondo vettore\n\n");
    
    for(i=0; i<lunghezza; i++)
    	{
    	printf("Elemento %d: %d\n", i+1, v2[i]);
    
    	}
    
    
    
    
    for (i=0, a=0, b=0; i<lunghtot && a<lunghezza && b<lunghezza; i++)
    	{
    	if(v1[a] <= v2[b])
    		{
    		vtot[i]=v1[a];
    		a= a + 1;
    		}
    	else
    		{
    		vtot[i]=v2[b];
    		b = b + 1;
    		}
    }
    if(i<lunghtot)
    	{
    	if(b==lunghezza)
    		{
    		for( ; i<lunghtot; i++, a++)
    		vtot[i]=v1[a];
    		}
    	else
    		{
    		for( ; i<lunghtot; i++, b++)
    		vtot[i]=v2[b];
    		}
    	}
    
    printf("Il vettore ordinato e':\n");
    for(i=0; i<lunghtot; i++)
    	{
    	printf("elemento %d: %d \n", i+1, vtot[i]);
    	}
    	
    
     return 0;
    }
    
    
    	
    
    
    
    
    
    
    
    
    vi ringrazio in particolar modo per le spiegazioni dettagliate, mi sono servite moltissimo. Domani mi metto di impegno e faccio l'esercizio completo
  • Re: Esercizi sugli array e funzioni

    Questo, invece, e' un consiglio da 'professionista' :

    quando fai gli esercizi, evita il piu' possibile di dover fornire dati da tastiera, ma prepara i valori DIRETTAMENTE via codice.

    in questo caso, all'inizio del programma, PRE riempi i vettori con un certo numero di valori (al momento saranno costanti, ma potresti generare anche a caso), invece di chiederli da tastiera con la scanf mediante un ciclo

    Questo riduce notevolmente i tempi per fare le prove: devi solo compilare, eseguire e vedere il risultato, invece di: compilare, eseguire, fornire i dati uno alla volta a manina, vedere il risultato.

    Questa e' una buona pratica che si sposa perfettamente con le tecniche di testing del codice che di chiama: test unit, quindi NON E' una cattiva pratica di programmazione.

    Infatti, la pratica insegna che le parti piu' VARIABILI di un programma sono proprio le COSTANTI

    Un modo per inizializzare il vettore e' il seguente:
    
    int vettore[] = {1,2,3,4,5,6,7,8,9,10}; 
    int altrov[10] = {1,2,3};
    
  • Re: Esercizi sugli array e funzioni

    Grazie mille veramente! Siete stati utilissimi
Devi accedere o registrarti per scrivere nel forum
23 risposte