Sottoprogrammi: motivazioni. Funzioni e procedure. Un esempio motivante. Un esempio motivante

Documenti analoghi
Funzioni e Procedure in C. Funzioni e Procedure in C

int main(){ int numero; /* numero di cui voglio calcolare il fattoriale */ int fatt; /* memorizzo il fattoriale di numero */ int somma=0;

Il passaggio parametri per indirizzo

Funzioni e procedure

Carlo Ghezzi, Gian Pietro Picco

Ottenere una modifica del parametro attuale

LABORATORIO di INFORMATICA

FUNZIONI E PROCEDURE IN C. Docente: Giorgio Giacinto AA 2009/2010. dall utente, sia predefiniti, il C consente di creare funzioni e procedure

Variabili e Funzioni. Informatica 1 / 19

Linguaggio C: le funzioni. Introduzione e sintassi

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Linguaggio C: le funzioni. Introduzione e sintassi

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Introduzione. per astrarre delle operazioni complesse

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Funzioni e Procedure. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

Il linguaggio C. Puntatori e dintorni

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Il linguaggio C. Notate che...

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Esercizi. FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo. Funzioni

Esercizi. La funzione swapint() primo tentativo

C funzioni à scope di variabili

Introduzione al linguaggio C Puntatori

Array k-dimensionali

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 4 Aprile 2013

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Introduzione al linguaggio C Funzioni

Funzioni, Stack e Visibilità delle Variabili in C

Passaggio dei parametri

Funzioni, Stack e Visibilità delle Variabili in C

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.

Funzioni in C. Fondamenti di Informatica. Daniele Loiacono

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 20 Aprile 2016

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Introduzione al C. Lez. 2. Funzioni e Puntatori

C: panoramica. Violetta Lonati

Esercizio (o esempio?)

Passaggio dei parametri. Passaggio dei parametri

Dati due punti sul piano calcolare la loro distanza

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Il linguaggio C. Istruzioni, funzioni, dati strutturati

Concetto di Funzione e Procedura METODI in Java

- tipo - costruttori di tipo - typedef: alias per i nuovi tipi

Introduzione al C. Lez. 2 Funzioni e Puntatori

Fondamenti di Informatica

Corso di Informatica Modulo T3 2 Ambiente locale e globale

Indirizzi e tipi puntatore a

Il linguaggio C. Notate che...

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

LB5 FUNZIONI cap. 7 del testo

cout << "Inserisci un numero:" << endl; cin >> n; ris = n*2; cout << "Il doppio di " << n << " e " << ris << endl;

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Puntatori e array. Violetta Lonati

Esercizio 1: media di numeri reali (uso funzioni e struct)

Perché il linguaggio C?

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Corso di Informatica A.A

Record di Attivazione Cenni sulla ricorsione

Informatica B Prof. Di Nitto, Morzenti Prova del 18 novembre 2004 Cognome e Nome... Numero Matricola... (in stampatello)

Informatica (A-K) 12. Linguaggio C -3

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1)

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Strategie di programmazione

Elementi di Informatica A. A. 2016/2017

Le funzioni: la dichiarazione

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Programmazione (imperativa)

Strutture di controllo

Linguaggio C - sezione dichiarativa: costanti e variabili

Prof. G. Ascia. Le funzioni. Fondamenti di Informatica

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Funzioni e Procedure. Marco D. Santambrogio Ver. aggiornata al 21 Marzo 2014

Programmazione C. Funzioni e Procedure Call by value

FUNZIONI: IL MODELLO A RUN-TIME!

Esercizio 1: parole nel testo

Programmazione Procedurale in Linguaggio C++

Perché il linguaggio C?

ESEMPIO PROCEDURE. return IN UNA PROCEDURA. Disegnare, per un dato n, la seguente figura * *** ***** ******* ********* ***********

Strutture Dati Dinamiche

Un programma deve essere scritto come collezione di tante piccole funzioni perché:

Esercizi. Filtraggio

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Aritmetica dei puntatori

Transcript:

Sottoprogrammi: motivazioni Funzioni e procedure Riusabilità (scrivere una sola volta del codice usato più volte) Astrazione (esprimere in modo sintetico operazioni complesse) Politecnico di Milano Sede di Cremona Gianpaolo Cugola Dipartimento di Elettronica e Informazione cugola@elet.polimi.it http://www.elet.polimi.it/~cugola Informatica A - Cugola 2 Un esempio motivante #define MaxNumMov 10000 typedef struct { int giorno; int mese; int anno; Data; typedef struct { char causale[100]; Data data; Come float importo; calcolare il Movimento; totale delle typedef struct { entrate? int nummovimenti; Movimento dati[maxnummov]; ElencoMovimenti; ElencoMovimenti entrate; ElencoMovimenti uscite; float saldo; e il totale delle uscite? Un esempio motivante Potremmo scrivere: float totentrate, totuscite; totentrate = 0; for(i=0; i<entrate.nummovimenti; i++) { totentrate += entrate.dati[i].importo; totuscite = 0; for(i=0; i<uscite.nummovimenti; i++) { totentrate += uscite.dati[i].importo; saldo = totentrate totuscite; Informatica A - Cugola 3 Informatica A - Cugola 4

Un esempio motivante Ma ci piacerebbe di più scrivere: saldo = tot(entrate) tot(uscite); mettendo a fattor comune il codice simile Ma per fare questo dobbiamo definire un sottoprogramma che calcola tot Si tratta di un programma asservito al programma principale Il sottoprogramma deve essere prima di tutto definito e poi può essere invocato (chiamato) Struttura di un programma in presenza di sottoprogrammi [parte di direttive] [dichiarazione degli elementi condivisi da programma principale e sottoprogrammi (costanti, tipi, variabili, )] [definizioni di sottoprogrammi (main incluso)] Informatica A - Cugola 5 Informatica A - Cugola 6 Visibilità e tipi di sottoprogrammi Programma principale e sottoprogrammi possono usare Elementi dichiarati nella propria parte dichiarativa Elementi dichiarati nella parte dichiarativa globale I sottoprogrammi possono essere di due tipi Funzioni Restituiscono un valore al chiamante Procedure Svolgono un compito per il chiamante ma non restituiscono un valore specifico Un esempio di funzione intestazione corpo float tot(elencomovimenti mov) { float totale; totale = 0; for(i=0; i<mov.nummovimenti; i++) { totale += mov.dati[i].importo; return totale; Informatica A - Cugola 7 Informatica A - Cugola 8

Intestazione L intestazione o testata (header) della funzione contiene informazioni rilevanti per l uso corretto della medesima Tipo del risultato Rappresenta il codominio della funzione Nome della funzione Lista degli argomenti della funzione (parametri formali) tra parentesi tonde Rappresenta il dominio della funzione Ogni parametro formale è dichiarato indicandone il tipo (built-in o user-defined) e il nome Ricevono un valore nel momento in cui la funzione viene invocata Esempi di intestazioni float tot ( ElencoMovimenti mov ) tipo del risultato nome tipo parametro parametri formali nome Altri esempi: boolean contiene( ElencoMovimenti mov, Movimento m ) ElencoMovimenti estrai( ElencoMovimenti mov, int mese, int anno ) Informatica A - Cugola 9 Informatica A - Cugola 10 Corpo della funzione Simile al corpo del programma principale Composto da: Parte dichiarativa Contiene dichiarazioni locali Parte esecutiva Contiene il codice della funzione Esempio di corpo { parte dichiarativa float totale; totale = 0; for(i=0; i<mov.nummovimenti; i++) { totale += mov.dati[i].importo; return totale; parte esecutiva Informatica A - Cugola 11 Informatica A - Cugola 12

Dichiarazioni locali Tipi e variabili necessari per l esecuzione del sottoprogramma ma inutili al programma principale Stesse regole della parte dichiarativa del main Nuove dichiarazioni di tipi di costanti di altri sottoprogrammi (solo prototipi) L istruzione return Termina l esecuzione della funzione restituendo il controllo al chiamante Restituisce un valore al chiamante Visto dal chiamante il valore restituito è il valore dell espressione rappresentata dall invocazione della funzione Possono esserci più istruzioni return Ovviamente a ogni chiamata se ne esegue solo una Informatica A - Cugola 13 Informatica A - Cugola 14 Invocazione di funzioni Sintassi ispirata alla notazione matematica: nome_funzione(parametri_attuali); Parametri attuali: valori degli argomenti ai quali viene applicata la funzione Ogni parametro attuale è un espressione e può contenere altre chiamate di funzione Una chiamata di funzione sintatticamente definisce un espressione Una funzione, applicata ai suoi argomenti, fornisce un valore del suo codominio Esempi float t = tot ( mieimovimenti ); nome parametro attuale Altri esempi: saldo = tot(entrate) tot(uscite); if(contiene(mieimovimenti, m)) printf( ); movdic = estrai(mieimovimenti, 12, 2002); x = sin(y) cos(pigreco alfa); x = cos(atan(y) beta); Informatica A - Cugola 15 Informatica A - Cugola 16

Prototipi delle funzioni Una funzione può essere invocata solo se precedentemente definita o almeno dichiarata Definizione e dichiarazione non sono sinonimi Definizione : comprende intestazione + corpo) Dichiarazione (detta prototipo) : sola intestazione della funzione seguita dal ; Va posta nella parte dichiarativa globale o nella parte dichiarativa propria dei sottoprogrammi che chiamano la funzione (main incluso) Informatica A - Cugola 17 Mettiamo insieme il tutto #define MaxNumMov 10000 direttive typedef struct { int giorno; int mese; int anno; Data; typedef struct { char causale[100]; Data data; parte float importo; dichiarativa Movimento; globale typedef struct { int nummovimenti; Movimento dati[maxnummov]; ElencoMovimenti; float tot(elencomovimenti mov); dichiarazione funzione main() { ElencoMovimenti entrate; ElencoMovimenti uscite; /* lettura dati */ printf( Saldo : %f, tot(entrate)-tot(uscite)); float tot(elencomovimenti mov) { float totale; totale = 0; for(i=0; i<mov.nummovimenti; i++) { totale += mov.dati[i].importo; return totale; definizione di sottoprogrammi (incluso il sottoprogramma principale) Informatica A - Cugola 18 Funzioni: Esercizi Si scriva la funzione: boolean contiene(elencomovimenti mov, Movimento m) Si scriva la funzione: ElencoMovimenti estrai(elencomovimenti mov, int mese, int anno) Si scriva una funzione per calcolare la distanza in giorni tra due date Procedure A volte si vuole definire un sottoprogramma che non si comporta come una funzione, ma semplicemente realizza una operazione o esegue un azione senza restituire alcun valore al chiamante Esempi Aggiungere un movimento a un elenco di movimenti Stampare un elenco di movimenti Ordinare un array di interi... In questo caso usiamo delle procedure Sono definite esattamente come le funzioni ma nell intestazione il tipo del valore di ritorno è void Informatica A - Cugola 19 Informatica A - Cugola 20

Esempi di procedure void stampamov(movimento m) { printf( %d-%d-%d %s %f, m.data.giorno, m.data.mese, m.data.anno, m.causale, m.importo); void stampaelenco(elencomovimenti mov) { for(i=0; i<mov.nummovimenti; i++) { stampamov(mov.datio[i]); printf( \n ); Funzioni e procedure predefinite Standard library del C include sottoprogrammi di vasto uso non riscoprire continuamente l acqua calda I/ O, trigonometriche, esponenziali, logaritmiche, gestione stringhe, Informatica A - Cugola 21 Informatica A - Cugola 22 /* Programma Concatenazione di stringhe */ #include <stdio.h> #include <string.h> #define LunghezzaArray 50 main() { char PrimaStringa[LunghezzaArray], SecondaStringa[LunghezzaArray], StringaConc[2 * LunghezzaArray]; LunghezzaConc; unsigned scanf( %s, PrimaStringa); /* NB scanf assume caratteri!= spazio */ scanf( %s, SecondaStringa); if (strcmp(primastringa, SecondaStringa) <= 0 ){ strcpy(stringaconc, PrimaStringa); strcat(stringaconc, SecondaStringa); else { strcpy(stringaconc, SecondaStringa); strcat(stringaconc, PrimaStringa); LunghezzaConc = strlen(stringaconc); printf( Concatenazione stringhe lette: %s.\n lunga %d caratteri\n, StringaConc, LunghezzaConc); Informatica A - Cugola 23 Ambiente locale e globale Le variabili dichiarate localmente ad un sottoprogramma sono visibili solo in quel sottoprogramma Vengono allocate all istante dell invocazione e deallocate al termine dell esecuzione del sottoprogramma Per ogni invocazione si ha una nuova allocazione Lo stesso vale per i parametri formali E altresì possibile dichiarare delle variabili globali Dichiarate nella parte dichiarativa globale Accessibili tanto al main quanto a tutti gli altri sottoprogrammi Vengono allocate alla partenza del programma e deallocate solo al termine del programma Informatica A - Cugola 24

Ambiente globale e side effects Nell istante in cui un sottoprogramma modifica una variabile globale genera ciò che si chiama un effetto collaterale ( side effect ) Gli effetti collaterali riducono la leggibilità del codice In condizioni normali un sottoprogramma vede solo le variabili dichiarate localmente e il suo ambito d azione resta così chiaramente confinato (non vede variabili dichiarate in altri sottoprogrammi) Il chiamante sa che al termine della chiamata, a meno del valore restituito, lo stato complessivo del programma è invariato Lo stesso non è più vero in presenza di effetti collaterali Effetti collaterali: Un esempio void faiqualchecosa(); main() { i = 7; faiqualchecosa(); printf( %d, i); Cosa ci aspettiamo che venga stampato? Un 7? Dipende!!! Se faiqualcosa ha effetti collaterali void faiqualchecosa() { i = 12; In questo caso il main stampa il valore 12 Informatica A - Cugola 25 Informatica A - Cugola 26 Effetti collaterali: Un altro esempio int x; int calcola(int par); main() { x = 1; x = calcola(1); /* ora x vale 2 */ x = calcola(1); /* ora x vale 3 */ int calcola(int par) { return (par + x) Gli Gli effetti collaterali diminuiscono la la leggibilità del del codice Il passaggio parametri in dettaglio Al momento dell invocazione i parametri attuali sono passati al sottoprogramma per valore (o per copia) Il valore del parametro attuale è copiato, al momento dell invocazione, nel parametro formale Parametro attuale e parametro formale hanno vita distinta Esempio: void f(int i) { i = 10; Il valore di j è: 0 main() { int j = 0; f(j); printf( Il valore di j è: %d,j); Informatica A - Cugola 27 Informatica A - Cugola 28

Esercizio Si scriva un programma per gestire i risultati di un compito Il programma deve permettere l inserimento dei dati, la stampa dei risultati, il calcolo della media L inserimento dei dati deve essere possibile risultato per risultato Il programma deve presentare un menu iniziale con le diverse opzioni (aggiunta di un nuovo risultato, stampa dei risultati, stampa della media) Se necessario si faccia uso di variabili globali Il blocco Può comparire ovunque la sintassi preveda una istruzione Composto da due parti racchiuse tra graffe Una parte dichiarativa (facoltativa) Una sequenza di istruzioni Due blocchi possono essere: Annidati (uno è interno all altro) Paralleli (entrambi interni a un terzo ma non annidati tra di loro) Informatica A - Cugola 29 Informatica A - Cugola 30 int g1, g2; char g3; int f1(int par1, int par2 ); / * Prototipo di f1 * / main () { int a, b; int f2(int par3, int par1 ); / * Prototipo di f2 */ { char a, c; { float a; / * Fine blocco2 * / / * Fine blocco1 * / / * Finemain * / int f1(int par1, int par2) { int d; { int e; / * Fine blocco3 * / { int d; / * Fine blocco4 * / / * Fine f1 * / int f2(int par3, int par4) { int f; / * Fine f2 * / modello a contorni Informatica A - Cugola 31 Regole di visibilità Un elemento si dice visibile in un certo punto del codice se può essere usato e referenziato tramite l identificatore in quel punto del codice Elementi dichiarati nella parte dichiarativa globale del programma: Visibili da tutti sottoprogrammi (incluso main) e i blocchi dei sottoprogrammi Identificatori predefiniti del linguaggio si intendono dichiarati nella parte dichiarativa globale Elementi dichiarati nella parte dichiarativa di un sottoprogramma Visibili da istruzioni del suo corpo, inclusi i blocchi interni Elementi dichiarati nella parte dichiarativa di un blocco Visibili nelle istruzioni del blocco, inclusi i blocchi interni Informatica A - Cugola 32

Deroga alla regola La dichiarazione di un elemento in un sottoprogramma o in un blocco maschera eventuali entità omonime più esterne Lifetime delle variabili Va dalla creazione (allocazione della memoria) alla distruzione (rilascio della memoria deallocata) Variabili globali Vengono allocate alla partenza del programma e deallocate al termine Variabili dichiarate nella parte dichiarativa di un sottoprogramma (main incluso) Vengono allocate alla partenza del sottoprogramma e deallocate al termine dell esecuzione del medesimo Variabili dichiarate in un blocco Vengono allocate quando l esecuzione entra nel loro ambito di visibilità e deallocate quando si esce dall ambito di visibilità N.B. Veriabili dichiarate in sottoprogrammi o blocchi eseguiti più volte vengono riallocate di volta in volta in zone di memoria potenzialmente differenti Non vengono conservati i valori prodotti da precedenti esecuzioni Informatica A - Cugola 33 Informatica A - Cugola 34 Parametri passati per indirizzo Finora i sottoprogrammi hanno potuto Restituire un valore Modificare l ambiente globale Ricevere parametri per valore (senza aver modo di modificare i parametri attuali) Il passaggio per indirizzo costituisce un altro modo per far avvenire effetti sul chiamante attraverso la chiamata di sottoprogrammi Passaggio per indirizzo: Un esempio motivante Consideriamo la seguente definizione della funzione aggiungi void aggiungi(movimento m, ElencoMovimenti mov) { strcpy(mov.dati[mov.nummovimenti].causale, m.causale); mov.dati[mov.nummovimenti].data = m.data; mov.dati[mov.nummovimenti].importo = m.importo; mov.nummovimenti++; Cosa succede dopo l esecuzione del seguente frammento di codice? ElencoMovimenti mieimov; Movimento mo; scanf( %d-%d-%d %s %f, &m.data.giorno, &m.data.mese, &m.data.anno, m.causale, &m.importo); aggiungi(mo, mieimovimenti); Purtroppo non quello che vorremmo! La procedura aggiungi modifica il parametro formale mov ma non il parametro attuale mieimov Il parametro formale è solo una copia del parametro attuale Alla fine dell esecuzione della procedura il parametro formale mov modificato è addirittura deallocato Informatica A - Cugola 35 Informatica A - Cugola 36

Come ottenere una modifica del parametro attuale? 1. Il parametro formale viene definito di tipo puntatore al tipo del parametro attuale desiderato 2. Alla chiamata viene passato l indirizzo (usando &) del parametro attuale Deve essere una variabile, NON una generica espressione Di una espressione non è possibile estrarre l indirizzo 3. Nel corpo della funzione viene usato l operatore di dereferenziazione per accedere al parametro attuale desiderato mediante il suo indirizzo L esempio corretto attraverso l uso del passagio per indirizzo void aggiungi(movimento m, ElencoMovimenti *mov) { strcpy(mov->dati[mov->nummovimenti].causale, m.causale); mov->dati[mov->nummovimenti].data = m.data; mov->dati[mov->nummovimenti].importo = m.importo; mov->nummovimenti++; Informatica A - Cugola 37 Informatica A - Cugola 38 Procedure e funzioni Facile trasformare una funzione in procedura (risultato come parametro aggiuntivo) funzione int f(int par1) { return risultato; chiamata con istruzione y = f(x); diventa la procedura void f(int par1,int * par2) { * par2 = risultato; chiamata con istruzione f(x, &y); Parametri di tipo array Quando un array viene passato ad un sottoprogramma come parametro attuale Viene passato per valore l indirizzo di base dell array (indirizzo della prima componente) NB: gli elementi dell array NON vengono copiati nel parametro formale Di fatto è passato per indirizzo Il parametro formale della funzione viene trattato come un puntatore Informatica A - Cugola 39 Informatica A - Cugola 40

Esempi Forme equivalenti typedef double TipoArray[MaxN umelem] / * n è la porzione occupata dell' array*/ double sum(tipoarray a, int n) double sum(double *a, int n) double sum(double a[ ], int n) Esempio: Moltiplicare gli elementi di un array double mul (double a[ ], int n) { /* n porzione occupata dell'array passato * / double ris; ris = 1.0; for ( i = 0; i < n; i = i + 1 ) ris = ris * a[i]; return ris; Informatica A - Cugola 41 Informatica A - Cugola 42 Parametri di tipo struttura Si possono passare per valore o per indirizzo Un risultato può essere di tipo struttura N.B.: anche se contiene un campo array! Informatica A - Cugola 43 Valore vs. Indirizzo Per valore Parametri attuale e formale sono distinti Le funzionalità del sottoprogramma restano chiaramente confinate maggiore leggibilità NON permette di restituire un risultato al chiamante Il passaggio per valore richiede una copia del parametro che porta via tempo. Il passaggio per indirizzo è più efficente Per indirizzo Parametro attuale e formale di fatto coincidono Permette di restituire risultato al chiamante Si copia l indirizzo dimensione fissa NON occorre lunga copiatura Informatica A - Cugola 44

Passaggio per indirizzo: Esercizi Si realizzi la funzione scambia che presi due interi come parametro li scambia Si riscriva l esercizio relativo alla gestione dei risultati di un compito sfruttando il passaggio per indirizzo ed eliminando così le variabili globali Si scrivano le funzioni per gestire uno stack di interi. Si usi lo stack per invertire una sequenza di interi Informatica A - Cugola 45