Informatica 2 Liceo Scientifico Scienze Applicate/Funzioni Void e non Void: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 23:
Pensiamo di scrivere una funzione che clacoli il doppio di un numero <br />
 
<source lang=c>
 
float doppio(float n)
{ float z;
Riga 29:
return z;
}
</source >
che poteva essere anche scritta come
<source lang=c>
 
float doppio(float n)
{
return 2*n;
}
</source >
 
perche' quello che viene restituito e' il valore dell'espressione (una volta calcolato) dopo l'istruzione return, ricordate inoltre che la funzione termina dopo aver restituito il valore e quindi eventuali istruzioni dopo il return non vengono eseguite, la funziona termina anche se incontra la } di chiusura del codice della funzione.<br />
 
 
Ora una volta scritta la funzione doppio possiamo scrivere delle espressioni di calcolo del tipo:
<source lang=c>
 
z=3*4*sqrt(56)-doppio(5);
</source >
 
oppure
<source lang=c>
 
z=3+doppio(sqrt(45));
</source >
 
in questo caso il risultato della radice sqrt (che e' una funzione non void) viene usato compe parametro attuale della funzione doppio.<br />
 
I parametri attuali possono essere specifiati attraverso delle costanti , delle singole variabili o delle espressioni di calcolo ( nella realta' le costanti e le singole variabili sono le forme piu' semplici di una espressione di calcolo).Allora possiamo anche scrivere:
<source lang=c>
z= 1+doppio( doppio(3));
</source >
oppure
<source lang=c>
z= doppio( 10 + doppio ( sqrt(4) )) +22;
</source >
 
ora z=50 cioe' si comportano come le espressioni matematiche che utilizziamo di solito.<br />
Line 59 ⟶ 63:
le funzioni void non possono invece essere inserite in espressioni di calcolo, cioe' se<br />
 
<source lang=c>
 
void doppio ( float *n)
{ *n= *n*2;
}
</source >
 
non posso scrivere
<source lang=c>
float a=4;
z=doppio( &a)+7;
</source >
 
ma invece
<source lang=c>
float a=4;
doppio( &a);
z=a+7;
</source >
 
== Funzioni Ricorsive ==
Le funzioni (void e non void) possono essere richiamate non solo da altre funzioni ma anche all'interno della funzione stessa, in questo caso si parla di funzioni ricorsive ( che cioe' richiamano se stesse)<br />
Line 94 ⟶ 100:
se vogliamo scrivere una funzione ricorsiva per il calcolo dell' n! scriviamo<br />
 
<source lang=c>
 
long fattoriale (long n)
{ if(n==0)
Line 101 ⟶ 107:
return n*fattoriale(n-1);
}
</source >
se richiamo la funzione con
<source lang=c>
 
z=fattoriale(3);
</source >
 
succede che si attiva il codice della funzione fattoriale(3) che si ferma nel calcolo di return 3*fattoriale(2)
si ferma perche' deve ottenere il risultato della chiamata alla funzione fattoriale(2)<br />
Line 137 ⟶ 143:
per passare un vettore di n elementi allora possiamo <br />
 
dimensione vettore parametro attuale parametro formale uso parametro formale nella funzione parametro attuale
costante (esempio=10) vett int v[10] int v[102]=7; v[2]=7; vett
variabile k vett int v[],k int n int v[2],=7; int n v[2]=7; vett,k
variabile k vett int *p ,k int n int *(p+2)=7; , int n *(p+2)=7; vett,k
per passare una matrice di nr*nc elementi allora possiamo <br />
 
dimensione matrice parametro attuale parametro formale uso parametro formale nella funzione parametro attuale
riga e colonna costanti 4*6 int m[4][6] mat int m[42][63]=7; m[2][3]=7; mat
riga var colonna costante 6 int matm[][6], int nr int m[2][63],=7; int nr m[2][3]=7; mat,nr
riga e col variabili mat,nr,nc int *p , int nr, int nc *(p+2*nc+3)=7; mat,nr,nc
o per elemento i,j *(p+i*nc+j)=7;
una variabile singola puo' essere passata per valore ,per indirizzo o per reference<br />
 
parametro attuale parametro formale uso parametro formale nella funzione parametro attuale
per valore 5/ a / 3*aint z int k=z+4; k=z+4; 5/ a / 3*a
per indirizzo &a int *p *p=6; int *p *p=6; &a
per reference a int &k k=7 int &k k=7 a
il passaggio per reference e' un passaggio per indirizzo con sintassi semplificata , scrivendo il nome della variabile passo il suo indirizzo, il parametro attuale davanti al nome ha il simbolo & per ricordare che il passaggio e' per reference, la variabile formale (che nasconde internamente il puntatore) viene usata normalmente e tutto quello che le succede si riflette sulla variabile attuale