# Informatica 2 Liceo Scientifico Scienze Applicate/Funzioni Void e non Void

Informatica 2 Liceo Scientifico Scienze Applicate
Copertina Tutti i moduli · Sviluppo
* Linguaggi di programmazioneInformatica 2 Liceo Scientifico Scienze Applicate/Linguaggi di programmazione
* Compilare un programmaInformatica 2 Liceo Scientifico Scienze Applicate/Compilare un programma
* CiaoMondoInformatica 2 Liceo Scientifico Scienze Applicate/CiaoMondo
* AreaRettangoloInformatica 2 Liceo Scientifico Scienze Applicate/AreaRettangolo
* AreaTrapezioInformatica 2 Liceo Scientifico Scienze Applicate/AreaTrapezio
** Compito1Informatica 2 Liceo Scientifico Scienze Applicate/Compito1
* Programmazione ImperativaInformatica 2 Liceo Scientifico Scienze Applicate/Programmazione Imperativa
* Diagrammi di FlussoInformatica 2 Liceo Scientifico Scienze Applicate/Diagrammi di Flusso
* Operatori AritmeticiInformatica 2 Liceo Scientifico Scienze Applicate/Operatori Aritmetici
* Istruzione ifInformatica 2 Liceo Scientifico Scienze Applicate/Istruzione if
** Esercizio Equazione 2^ gradoInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio Equazione 2^ grado
** Esercizio Calcola lo ScontoInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio Calcola lo Sconto
** Esercizio Calcola lo Sconto2Informatica 2 Liceo Scientifico Scienze Applicate/Esercizio Calcola lo Sconto2
* Operatori LogiciInformatica 2 Liceo Scientifico Scienze Applicate/Operatori Logici
** Esercizio x interno all'intervalloInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio x interno all'intervallo
** Esercizio x esterno all'intervalloInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio x esterno all'intervallo
* Istruzione switchInformatica 2 Liceo Scientifico Scienze Applicate/Istruzione switch
** Esercizio Scelta EquazioneInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio Scelta Equazione
* Altre Istruzioni di Scelta o DiramazioneInformatica 2 Liceo Scientifico Scienze Applicate/Altre Istruzioni di Scelta o Diramazione
* Istruzioni di RipetizioneInformatica 2 Liceo Scientifico Scienze Applicate/Istruzioni di Ripetizione
** Es (do-while) Indovina il numeroInformatica 2 Liceo Scientifico Scienze Applicate/Es (do-while) Indovina il numero
** Es (while) La nonna è stancaInformatica 2 Liceo Scientifico Scienze Applicate/Es (while) La nonna è stanca
** Es (for) Somma di 5 numeriInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Somma di 5 numeri
** Es (for) Analisi sequenza datiInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Analisi sequenza dati
** Es (for) Sequenze NumericheInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Sequenze Numeriche
** Es (for) SupermarketInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Supermarket
** Es (while) Bisca ClandestinaInformatica 2 Liceo Scientifico Scienze Applicate/Es (while) Bisca Clandestina
* Compito2Informatica 2 Liceo Scientifico Scienze Applicate/Compito2
* I vettoriInformatica 2 Liceo Scientifico Scienze Applicate/I vettori
** Es Usiamo i vettoriInformatica 2 Liceo Scientifico Scienze Applicate/Es Usiamo i vettori
** Es2 Usiamo i vettoriInformatica 2 Liceo Scientifico Scienze Applicate/Es2 Usiamo i vettori
** Es3 Supermarket con vettoriInformatica 2 Liceo Scientifico Scienze Applicate/Es3 Supermarket con vettori
** Compito dic 2019Informatica 2 Liceo Scientifico Scienze Applicate/Compito dic 2019
** BubbleSortInformatica 2 Liceo Scientifico Scienze Applicate/BubbleSort
** Ricerca DicotomicaInformatica 2 Liceo Scientifico Scienze Applicate/Ricerca Dicotomica
* Matrici e ArrayInformatica 2 Liceo Scientifico Scienze Applicate/Matrici e Array
** Es matrici battaglia navaleInformatica 2 Liceo Scientifico Scienze Applicate/Es matrici battaglia navale
** Es matrici 1Informatica 2 Liceo Scientifico Scienze Applicate/Es matrici 1
** Es matrici 2Informatica 2 Liceo Scientifico Scienze Applicate/Es matrici 2
* PuntatoriInformatica 2 Liceo Scientifico Scienze Applicate/Puntatori
* StructInformatica 2 Liceo Scientifico Scienze Applicate/Struct
** Es Bubble Sort con StructInformatica 2 Liceo Scientifico Scienze Applicate/Es Bubble Sort con Struct
* FunzioniInformatica 2 Liceo Scientifico Scienze Applicate/Funzioni
* Funzioni Void e non VoidInformatica 2 Liceo Scientifico Scienze Applicate/Funzioni Void e non Void
** esercizi1 funzioniInformatica 2 Liceo Scientifico Scienze Applicate/esercizi1 funzioni
** esercizi2 funzioniInformatica 2 Liceo Scientifico Scienze Applicate/esercizi2 funzioni
** esercizi3 funzioniInformatica 2 Liceo Scientifico Scienze Applicate/esercizi3 funzioni
* BacktrackingInformatica 2 Liceo Scientifico Scienze Applicate/Backtracking
* TemplateInformatica 2 Liceo Scientifico Scienze Applicate/Template
* FileInformatica 2 Liceo Scientifico Scienze Applicate/File
** File di TestoInformatica 2 Liceo Scientifico Scienze Applicate/File di Testo
** File BinariInformatica 2 Liceo Scientifico Scienze Applicate/File Binari
** File RecordsInformatica 2 Liceo Scientifico Scienze Applicate/File Records
** Es FilesInformatica 2 Liceo Scientifico Scienze Applicate/Es Files
* Esercizi VacanzeInformatica 2 Liceo Scientifico Scienze Applicate/Esercizi Vacanze
** Esercizi1Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi1
** Esercizi2Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi2
** Esercizi3Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi3
* Olimpiadi Informatica
** NobileChimicoInformatica 2 Liceo Scientifico Scienze Applicate/NobileChimico
** Sunnydale
** MappaAnticaInformatica 2 Liceo Scientifico Scienze Applicate/MappaAntica
Modifica il sommario

## Funzioni

Come e' stato detto precedentemente le funzioni vengono usate per risolvere problemi parametrici, il fatto di concentrare le istruzioni per risolvere un particolare problema in una sezione limitata del codice (quella fra le { } ) permette di trovare eventuali errori più semplicemente , il fatto di scrivere il codice della funzione solo una volta e di poterlo richiamare successivamente facendo corrispondere i parametri attuali (quelli della chiamata) con quelli della dichiarazione (formali) consente una maggior compattezza del codice e in presenza di eventuali modifica della funzione ( ad esempio se l'iva del calcolo passa dal 20% al 21%) di dover mettere mano solo all'interno del codice della funzione e di aver automaticamente aggiornato il funzionamento in tutto il resto del programma ( nei diversi punti di chiamata). Inoltre l'uso delle funzioni permette l'utilizzo di conoscenze di altri programmatori semplicemente tramite una chiamata alla funzione. Ora vediamo di evedenziare altre caratteristiche.

## Funzioni Void e Funzioni non void

Le funzioni del C si dividono in funzioni void e non void (quelle dove possiamo restituire un valore tramite l'istruzione return). Ora noi le abbiamo distinte dicendo se si restituisce un solo singolo valore usiamo quelle non void altrimenti usiamo quelle void, in realta' piu' che sul numero di parametri restituiti dobbiamo porre la nostra attenzione sulla modalita' di restituzione del risultato, quando abbiamo una funzione non void, il valore restituito tramite return permette di inserire il risultato in una espressione di calcolo, mentre le funzioni void non possono farlo e si limitano al massimo a restituire uno o piu' valori (usando dei puntatori) in specifiche celle di memoria il cui indirizzo e' passato in fase di chiamata della funzione usando i parametri attuali. Quindi se vogliamo scrivere una funzione che puo' essere inserita in una espressione di calcolo (cioe che si combina con il calcolo di una espressione matematica) usiamo le funzioni non void altrimenti usiamo le funzioni void. Pensiamo al calcolo di (-b-sqrt(delta) )/(2*a) sqrt e' una funzione non void che calcola sqrt(delta) e il risultato di questo calcolo viene inserito nella piu' ampia espressione (-b -sqrt(delta)).... al posto della chiamata sqrt(delta)
Pensiamo di scrivere una funzione che calcoli il doppio di un numero
che poteva essere anche scritta come
perché 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 funzione termina anche se incontra la } di chiusura del codice della funzione.
Ora una volta scritta la funzione doppio possiamo scrivere delle espressioni di calcolo del tipo:
z=3*4*sqrt(56)-doppio(5);
oppure
z=3+doppio(sqrt(45));
in questo caso il risultato della radice sqrt (che è una funzione non void) viene usato come parametro attuale della funzione doppio.
I parametri attuali possono essere specificati attraverso delle costanti, delle singole variabili o delle espressioni di calcolo (nella realtà le costanti e le singole variabili sono le forme più semplici di una espressione di calcolo). Allora possiamo anche scrivere:
z= 1+doppio( doppio(3));
oppure
z= doppio( 10 + doppio ( sqrt(4) )) +22;
ora z=50 cioe' si comportano come le espressioni matematiche che utilizziamo di solito.
le funzioni void non possono invece essere inserite in espressioni di calcolo, cioe' se
non posso scrivere
ma invece

## 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)
Un tipico esempio e' il calcolo del fattoriale, in matematica il fattoriale del numero n si indica con il simbolo n! e per calcolarlo si seguono le seguenti regole
NB con n si intende un numero naturale 0,1,2,3,4,....
quindi 3!= 3* 2! = 3* 2 *1!= 3*2*1*0!= 3*2*1*1 = 6
si noti la particolare definizione del fattoriale il fattoriale del numero n e' uguale a n moltiplicato per il fattoriale di n-1 in cui non spiego esattamente come calcolare il fattoriale, ma dico solo che per calcolare il fattoriale di n devo saper fare il fattoriale di n-1 , quindi spiego il fattoraile in funzione di se stesso (ecco la ricorsivita'); e poi per poter fare effettivamente il calcolo devo completare la spiegazione con una condizione di terminazione se n e' uguale a zero allora il fattoriale vale 1
Tutti i problemi ricorsivi (come pure le soluzioni dei problemi ricorsivi) hanno 2 elementi
* una definizione/espressione ricorsiva (in cui spiego una cosa in funzione di se stessa)
* e una condizione di terminazione
se vogliamo scrivere una funzione ricorsiva per il calcolo dell' n! scriviamo
se richiamo la funzione con
succede che si attiva il codice della funzione fattoriale(3) che si ferma nel calcolo di return 3*fattoriale(2) si ferma perché deve ottenere il risultato della chiamata alla funzione fattoriale(2)
a questo punto si attiva una copia del codice della funzione fattoriale con valore di n=2 questa funzione fattoriale(2) si ferma pure lei nel calcolo di
in memoria si forma una terza copia del codice della funzione fattoriale con un valore n=1 (attenzione ogni funzione fattoriale ha una propria variabile locale di nome n con valori diversi) che si ferma nel calcolo return 1*fattoriale(0) perché in attesa del risultato della chiamata alla funzione fattoriale(0)
ora in memoria si crea una quarta copia della funzione rivolta al calcolo del fattoriale(0), in questo caso si attiva la condizione di terminaziome e return restituisce il valore 1 al precedente fattoriale (a questo punto la quarta copia del codice essendo la funzione terminata viene rimossa dalla memoria
ora la terza copia della funzione che ha ricevuto il risultato del fattoriale di zero puo' terminare il calcolo return 1*fattoriale(0) che restituisce il valore 1 (la terza copia del fattoriale termina e viene rimossa dalla memoria ora la seconda copia della funzione che ha ricevuto il risultato del fattoriale di uno puo' terminare il calcolo return 2*fattoriale(1) che restituisce 2 (la seconda copia del fattoriale termina e viene rimossa dalla memoria)
ora la prima copia della funzione che ha ricevuto il risultato del fattoriale di due puo' terminare il calcolo return 3*fattoriale(2) che restituisce 6 (la prima copia del fattoriale termina e viene rimossa dalla memoria) ora z=fattoriale(3) riceve il valore del fattoriale(3) che vale 6 e lo assegna alla variabile z
Quindi nell'uso delle funzioni ricorsive c'e' una fase di espansione in cui si creano piu' copie della funzione ricorsiva e una fase di contrazione del numero di copie della funzione ricorsiva che parte quando si raggiunge la condizione di terminazione e termina quando si riesce a calcolare l'espressione iniziale.
Alcuni problemi di natura ricorsiva sono risolvibili semplicemente usando delle funzioni ricorsive, problemi di natura ricorsiva possono essere risolti anche non ricorsivamente, ma di solito con struttura risolutiva piu' complicata anche se piu, veloce (caso quicksort).

## Passaggio dei parametri alle funzioni

Quando si utilizza una funzione possono essere passati anche degli array, il passaggio di un array (vettore,matrice etc) avviene sempre per indirizzo, la copia dei valori di un array (dal parametro attuale a quello formale) viene infatti considerata una operazione troppo onerosa, questo comporta che quando passiamo l'indirizzo di un vettore o di una matrice permettiamo alla funzione chiamata tramite i puntatori di cambiare i valori nelle celle di memoria della matrice passata. Ricordatevi inoltre che il passaggio dei parametri rallenta l'esecuzione del codice, per velocizzare al massimo una funzione possiamo usare le variabili globali.
I puntatori essendo fonte di errore tendono ad essere nei linguaggi di programmazione moderni sostituiti/nascosti da una sintassi semplificata che permette pero' di ottenere lo stesso risultato.
per passare un vettore di n elementi allora possiamo
per passare una matrice di nr*nc elementi allora possiamo
una variabile singola puo' essere passata per valore ,per indirizzo o per reference
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