






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Corso di Laboratorio di Matematica e informatica del prof. Fabio Sartori. Programmazione strutturata. Metodi.
Tipologia: Appunti
1 / 10
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







Fino ad ora abbiamo sempre considerato i programmi come una sequenza di istruzioni senza una struttura ben precisa. L’unica chiara limitazione che abbiamo dato è il blocco, delimitato da una coppia di parentesi graffe; esso ci consente di andare in profondità (blocco dentro a un altro blocco), ma non permette di espandersi in larghezza. → problema! ad esempio questo può non andare bene per il concetto di visibilità della variabile, non ci permette di considerare programmi allo stesso livello… Come possiamo quindi aumentare la potenza espressiva di un programma? Introduciamo un metodo sintattico che ci permette di dividere un programma in sottoprogrammi Esempio
- calcolo dell’area di un quadrato va bene quanto fatto fin’ ora: voglio risolvere un problema → 1 algoritmo → 1 programma creo un programma in cui dichiaro la variabile int lato e inserisco l’istruzione di calcolo dell’area del quadrato come latoxlato - calcolo dell’area di un quadrilatero il programma creato prima non è più sufficiente, non permette di calcolare l’area di tutti i quadrilateri: devo riuscire a uniformare il programma di modo che permetta di calcolare l’area di tutti i quadrilateri. - innanzitutto dichiaro 3 variabili: lato maggiore, lato minore, altezza - inserisco un’istruzione di tipo Scanner con cui chiedo all’utente di quale quadrilatero calcolare l’area - l’algoritmo sarà un enorme if una rappresentazione di questo tipo ha diversi problemi. Se voglio calcolare l’area del rombo chiamerei lato maggiore e minore le due diagonali: attribuiamo semanticamente un nome sbagliato a due entità completamente diverse, mentre il nostro obiettivo dev'essere quello di scrivere programmi che rappresentano porzioni di realtà → errore logico (concettuale di rappresentazione) Se pensassi di risolvere questo problema dichiarando le variabili direttamente nel blocco dell’if, creo un altro problema “bloccando” le variabili all’interno di esso Qual è quindi la soluzione? STRUTTURARE IL PROGRAMMA Il programma viene diviso in tanti blocchi funzionali (sottoprogrammi), che stanno tutti sullo stesso livello, ognuno dei quali è dedicato a una specifica funzione. Il main fa da collettore, invoca un certo sottoprogramma quando ne abbiamo bisogno. Ogni linguaggio di programmazione ha un diverso costrutto per dividere il programma in sottoprogrammi; Java usa i metodi.
I metodi sono blocchi di istruzioni, sempre racchiusi tra parentesi graffe {} che svolgono una funzione che si vuole poter richiamare all’interno di un programma, senza riscriverli di volta in volta. Abbiamo già usato invocazioni o chiamate a metodi diverse volte:
Il corpo o body del metodo contiene la sequenza di istruzioni che deve essere eseguita nel momento in cui il metodo viene invocato. Si tratta quindi di un blocco che è racchiuso tra parentesi graffe {} e segue la definizione della signature o intestazione del metodo stesso. Se il metodo restituisce un valore, l’ultima istruzione che viene eseguita deve essere return valore, dove il valore scritto deve essere compatibile con il valore indicato nella signature. Si noti che return è un’istruzione bloccante (come il break): quando la inserisco, il metodo si interrompe, per questo va messa un’unica istruzione di return e alla fine, se fosse messa a metà del blocco, bloccherebbe tutta l’istruzione. Inoltre si ricordi che il return consente di ritornare un solo valore → limitazione dal punto di vista espressivo Se il metodo non restituisce valore non ho l’obbligo di inserire la keyword return. Un caso particolare si ha quando in un metodo che non restituisce valore nel void è presente return; o return ; → in questo caso all’istruzione return è stato assegnato un valore vuoto che è compatibile con void. non si tratta quindi di un errore di compilazione, il programma funziona comunque (NB per quiz) INVOCAZIONE L’intestazione di un metodo può essere usata per richiamare, attraverso l’operazione di “call” o “invocazione” il suo codice in uno o più punti del programma. Quando ciò accade l’esecuzione dell’invocante si ferma, esso passa in stato di attesa, mentre il controllo passa al metodo. Iniziano così ad essere eseguite le istruzioni del metodo invocato, che non è altro che un sottoprogramma, quindi quando il metodo invocato termina (per via di un return o per la fine delle istruzioni associate), il metodo invocante riprende l’esecuzione dal punto dopo che aveva invocato il metodo ; viene prima eventualmente assegnato il valore ritornato dal metodo. La definizione del metodo invocato può essere nella stessa classe dell’invocante o in un’altra → creazione di classi di libreria di metodi che invoco quando mi servono METODI STATICI Si tratta di metodi che non richiedono un oggetto per essere utilizzati e sono quelli che useremo maggiormente. Sono identificati dalla parola chiave static. Ho due possibilità circa dove scrivere il codice che implementa un metodo
Un metodo statico si invoca nel seguente modo: NomeClasse.nomeMetodo NB: se il metodo è definito nella stessa classe in cui viene invocato, il nome della classe puo' essere omesso. PARAMETRI ATTUALI Nel passaggio dei parametri (invocazione) sostituisco ai parametri formali i cosiddetti parametri attuali, dove la parola attuale va intesa nel significato del termine inglese actual, ossia concreto. Nei paramenti formali ho la dichiarazione delle variabili, quando invoco un metodo passo dei valori concreti, veri. Gli argomenti possono essere:
Dove si dichiara il codice del metodo? Esso può essere scritto dove vogliamo all’interno della definizione di classe, l’importante è che non venga definito all’interno di un altro metodo. Ovviamente non può essere dichiarato all’esterno della classe. RECORD DI ATTIVAZIONE Cosa succede in memoria durante l’invocazione? In generale sappiamo che ogni programma per essere eseguito deve risiedere in memoria, e questo vale quindi anche per i metodi, che sono sottoprogrammi: perché l’invocazione abbia effetto deve essere caricata in memoria un’immagine dello stato del sottoprogramma, dove indicato tutto ciò che gli serve per funzionare. Se pensiamo quindi all’esempio del calcolo del massimo, all’inizio in memoria ho solo il main. Quando si passa a “calcola massimo” il main si blocca, viene creata un’area con tutte le informazioni che servono a “calcola massimo” per funzionare; quando esso ha terminato, l’area di memoria viene eliminata e il controllo torna a chi lo aveva invocato. → tecnica A PILA: il primo metodo ad andar via è l’ultimo ad essere stato invocato.
In prima approssimazione possiamo quindi dire che quando un programma viene compilato, il compilatore Java crea un’area di memoria dedicata, detta record di attivazione, per ogni metodo M dichiarato nel programma. Tale record di attivazione ha ampiezza sufficiente a memorizzare dati indispensabili durante l'esecuzione del metodo, quali, ad esempio, le variabili locali di M (cioè le variabili dichiarate nel corpo di M), i parametri, ed il risultato, se non è di tipo void. Quando, durante l'esecuzione del programma, il metodo M viene chiamato, una copia R del record di attivazione di M viene inserita nella pila dei record di attivazione (in cima alla pila). Lo spazio di R destinato a memorizzare i parametri viene immediatamente aggiornato inserendo il valore dei parametri che sono stati passati da chi ha chiamato il metodo. Il valore delle variabili locali che vengono usate dal metodo sarà memorizzato nell'apposito spazio di R riservato alle variabili. L'eventuale risultato sarà anch'esso memorizzato nell'apposito spazio riservato in R. Quando il metodo termina, R viene rimosso dalla pila dei record di attivazione; se il metodo ritorna un valore, nel record di attivazione del chiamante viene copiato il valore di ritorno. Il programma terminerà quando non avrò più record di attivazione, e l’ultimo ad essere eliminato sarà quello del main (che come detto prima ha una funzione di controllo, definisce la sequenza con cui i sottoprogrammi sono invocati). Il record di attivazione ha ampiezza sufficiente a memorizzare dati indispensabili durante le esecuzioni del metodo, quali:
Variabili locali: