
















































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
ARGOMENTI: sviluppo top-down, procedure, funzioni, parametri, regole di visibilità delle variabili, convenzioni sui nomi, overloading, flusso del controllo, ricorsione, errori di sintassi, errori di semantica, errori di runtime, bug, debugging
Tipologia: Schemi e mappe concettuali
1 / 56
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!

















































Argomenti trattati:
1. Lo Sviluppo Top-Down
1.1 Concetto di algoritmo e livello di astrazione
Nella programmazione, ogni istruzione di un algoritmo deve essere comprensibile e concretamente realizzabile da parte dell'esecutore — sia esso una macchina o un essere umano. Il livello di dettaglio richiesto dipende dalle capacità dell'esecutore: più è esperto, più si possono usare istruzioni ad alto livello di astrazione.
Ad esempio, per risolvere un'equazione di secondo grado, a un esperto di matematica basta un algoritmo di sole due istruzioni (leggi i coefficienti; risolvi l'equazione). A uno studente alle prime armi, invece, occorre un algoritmo molto più dettagliato, con tutti i passi della formula quadratica.
1.2 Il metodo dei raffinamenti successivi
Highlight
Il problema principale viene suddiviso in sottoproblemi più semplici di dimensioni più ridotte, ciascuno dei quali presenta minore complessità. Questo processo iterativo prende il nome di sviluppo Top-Down : si parte dall'alto (problema generale) e si scende verso il basso (sottoproblemi sempre più specifici).
Si ottiene così una struttura ad albero dove:
1.3 Dalla decomposizione del problema alla struttura del programma
Come un problema complesso può essere scomposto in sottoproblemi, analogamente un algoritmo può essere scomposto in sottoalgoritmi , ciascuno dei quali mantiene tutte le caratteristiche fondamentali degli algoritmi (sequenza, selezione, iterazione). Il programma risultante sarà formato da una parte principale (main) e dai sottoprogrammi (moduli) che corrispondono ai sottoalgoritmi.
1.4 Proprietà e vantaggi dei moduli
Il programma viene scomposto in moduli funzionalmente indipendenti. Ogni modulo:
2. Le Procedure
2.1 Definizione
Una procedura è un blocco di istruzioni raggruppate sotto un nome, in modo da poterle richiamare ogni volta che servono senza riscriverle. Le istruzioni vengono solitamente raggruppate in base al compito che svolgono. Per utilizzarle, al programmatore basta indicare il nome della procedura.
2.2 Motivazione: evitare la duplicazione del codice
Supponiamo di voler calcolare l'area di cinque rettangoli diversi. Senza procedure, occorrerebbe ripetere le stesse istruzioni cinque volte. Con una procedura, le istruzioni vengono scritte una sola volta e richiamate ogni volta che servono, trasmettendo i dati tramite parametri.
2.3 Rappresentazione in pseudocodifica
Dichiarazione di una procedura senza parametri:
PROC nomeProcedura ....... ....... FINE
Dichiarazione di una procedura con parametri:
PROC nomeProcedura(nomeParam1, nomeParam2, ..., nomeParamN) ....... ....... FINE
Chiamata della procedura dal programma principale:
INIZIO ....... nomeProcedura(param1, param2, ..., paramN) ....... FINE
2.4 Esempio: area di cinque rettangoli
Dichiarazione della procedura con parametri baseRett e altezzaRett :
PROC calcolaAreaRett(baseRett, altezzaRett) area = baseRett * altezzaRett scrivi(area) FINE
Programma principale che richiama la procedura cinque volte:
INIZIO chiedi(base1, altezza1) — leggi(base1, altezza1) calcolaAreaRett(base1, altezza1) chiedi(base2, altezza2) — leggi(base2, altezza2) calcolaAreaRett(base2, altezza2) ... (ripetuto per i cinque rettangoli) FINE
2.5 Meccanismo di esecuzione
Quando il programma principale richiama una procedura:
Una procedura può a sua volta richiamare altre procedure ( chiamate nidificate ). Il meccanismo di sospensione e ripresa si applica ricorsivamente.
2.6 Riepilogo: tre vantaggi principali delle procedure
INIZIO chiedi(nomeRettangolo) leggi(nomeRettangolo) MENTRE nomeRettangolo <> * ESEGUI stampaAreaRettangolo(nomeRettangolo) FINE
3.4 Sintesi: procedure vs funzioni
Caratteristica Procedura Funzione
Valore di ritorno Nessuno Sì (via RETURN)
Keyword di dichiarazione
Utilizzo tipico Azioni/effetti collaterali (stampa, lettura…)
Calcoli che producono un risultato
Chiamata nel main nomeProcedura(param...) var = nomeFunzione(param...)
4. Procedure e Funzioni in Java: i Metodi
Nel linguaggio Java, sia le procedure che le funzioni vengono implementate usando un unico costrutto: il metodo. La distinzione si riflette nel tipo di ritorno:
Esempio — metodo che calcola l'area (funzione):
static double calcolaAreaRett(double base, double altezza) { double area = base * altezza; return area; }
Esempio — metodo che stampa (procedura):
static void stampaAreaRettangolo(String nomeRett) { Scanner sc = new Scanner(System.in); System.out.print("Base: "); double base = sc.nextDouble(); System.out.print("Altezza: "); double altezza = sc.nextDouble(); double area = calcolaAreaRett(base, altezza); System.out.println(nomeRett + " — area: " + area); }
Programma principale (main):
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Nome rettangolo (* per uscire): "); String nome = sc.next(); while (!nome.equals("")) { stampaAreaRettangolo(nome); System.out.print("Nome rettangolo ( per uscire): "); nome = sc.next(); } }
I dettagli completi sulla sintassi e sull'utilizzo dei metodi in Java (modificatori di accesso, overloading, parametri e variabili locali) saranno approfonditi nel modulo successivo.
Argomenti trattati:
1. Cos'è un Metodo
1.1 Definizione
Tutti i linguaggi di programmazione permettono di raggruppare istruzioni sotto un unico nome in modo da poterle richiamare senza riscriverle. In Java questi blocchi di codice riutilizzabili si chiamano metodi (in altri linguaggi: funzioni, procedure, sottoprogrammi).
1.2 Sintassi di dichiarazione
Ogni metodo deve essere dichiarato all'interno di una classe. La struttura generale è:
[specificatore_accesso] [static] tipo_ritorno nomeMetodo(tipo1 param1, tipo2 param2, ...) { // blocco di codice }
Esempio concreto:
public static int calcolaAreaRettangolo(int base, int altezza) { // blocco di codice }
1.3 Elementi della dichiarazione
Elemento Obbligatori o
Descrizione
Specificatore di accesso public / private / protected
No Stabilisce quali altri metodi possono chiamare questo metodo.
Tipo dichiarazione static No Indica che il metodo appartiene alla classe (static) e non alle singole istanze. Per ora si usano solo metodi static.
Tipo di ritorno int, double, String, …, void
Sì Tipo del valore restituito. void indica che il metodo non restituisce nulla.
Nome del metodo Sì Identificatore usato per richiamare il metodo (es. calcolaArea, stampa).
Parametri No Valori di input del metodo, indicati con tipo e nome separati da virgola.
2. Procedure in Java
2.1 Caratteristiche
Una procedura raggruppa istruzioni riutilizzabili senza produrre un valore di ritorno. In Java si dichiara con tipo di ritorno void :
public static void nomeProcedura(... parametri ...) { // blocco di codice }
void indica che il metodo esegue operazioni (stampa, modifica stato, ecc.) ma non restituisce nessun valore al chiamante.
2.2 Chiamata di una procedura
Dopo la dichiarazione, la procedura si invoca usando solo il suo nome e i valori degli eventuali parametri:
nomeProcedura(param1, param2, ...);
2.3 Esempio completo
Dichiarazione della procedura:
public static void hello(String nome) { System.out.println("Hello " + nome); }
Chiamata nel main:
hello("Mario"); // stampa: Hello Mario
2.4 Regola importante
I valori passati alla procedura devono essere dello stesso tipo dei parametri formali dichiarati nell'intestazione. Se la procedura dichiara String nome, la chiamata deve passare una String; non è possibile passare un int.
3. Funzioni in Java
3.1 Caratteristiche
Una funzione è una procedura speciale che calcola e restituisce un valore al chiamante. Il tipo di ritorno non è mai void, ma il tipo concreto del valore restituito (int, double, String, ecc.). La restituzione avviene con l'istruzione return.
public static tipo-ritorno nomeFunzione(... parametri ...) { tipo-ritorno risultato = ...; .... return risultato; }
3.2 L'istruzione return
return termina l'esecuzione della funzione e restituisce il valore al chiamante. Il tipo del valore restituito deve essere uguale o compatibile (più capiente) con il tipo di ritorno dichiarato:
Tipo ritorno dichiarato Variabile ricevente Esito
int double numero = esempio(); OK — double è più capiente di int
int short numero = esempio(); ERRORE — short è più piccolo di int
3.3 Esempio completo
Dichiarazione della funzione:
public static int calcolaPerimetroQuadrato(int lato) { int perimetro = lato * 4; return perimetro; }
Chiamata nel main:
int lato = 5; int p = calcolaPerimetroQuadrato(lato); // p = 20
La variabile p riceve il valore restituito dalla return. Anche qui vale la regola della compatibilità dei tipi tra parametri chiamante e dichiarazione.
3.4 Confronto sintetico: procedura vs funzione
4. Passaggio dei Parametri
Esistono due modalità generali con cui i linguaggi di programmazione passano i parametri a un metodo: per valore e per riferimento.
4.1 Passaggio per valore
Nel passaggio per valore il chiamante crea una copia del parametro e la passa al metodo. Il metodo lavora sulla copia, quindi qualsiasi modifica effettuata al parametro all'interno del metodo non ha effetto sulla variabile originale del chiamante. Ogni metodo ha il proprio ambiente locale di esecuzione, con celle di memoria separate.
Flusso: base e altezza del main vengono copiati nei parametri b e a del metodo; il valore calcolato (result) viene poi copiato indietro nella variabile area del main.
4.2 Passaggio per riferimento
Nel passaggio per riferimento, invece di copiare il valore, si passa l' indirizzo di memoria della variabile originale. Il metodo accede e modifica direttamente la cella di memoria del chiamante, quindi le modifiche si riflettono sulla variabile originale.
Esempio mnemonico: la variabile nome è memorizzata all'indirizzo 1040 con valore 'Mario'. Per valore si passa 'Mario' (copia); per riferimento si passa 1040 (l'indirizzo), e le modifiche al metodo cambiano direttamente il contenuto di quella cella.
Modalità Cosa si passa Modifica originale?
Per valore Copia del valore No — la variabile originale non cambia
Per riferimento Indirizzo di memoria Sì — la variabile originale viene modificata
5. Passaggio dei Parametri in Java
5.1 Premessa: tipi primitivi e oggetti
In Java ogni valore appartiene a una di queste due categorie:
Quando si copia un tipo primitivo si ottengono due valori indipendenti; quando si copia un riferimento a oggetto, sia l'originale che la copia puntano allo stesso oggetto in memoria.
5.2 Regola in Java
Java usa sempre e solo il passaggio per valore. Tuttavia, per i tipi riferimento (array e oggetti) il valore passato è l'indirizzo di memoria, quindi le modifiche all'oggetto puntato si riflettono sul chiamante:
5.3 Esempio — tipo primitivo (passaggio per valore)
public class Parametri {
public static void main(String[] args) { int var1 = 18; cambiaValore(var1); System.out.println(var1); // stampa: 18 }
public static void cambiaValore(int var1) { var1 = 45; // modifica solo la copia locale } }
L'output è 18 e non 45: la modifica al parametro var1 dentro cambiaValore agisce sulla copia locale, non sulla variabile del main.
5.4 Ordine dei parametri
L'ordine in cui i parametri vengono passati alla chiamata deve corrispondere esattamente all'ordine in cui sono dichiarati nell'intestazione del metodo:
Riepilogo Generale
Metodo: Blocco di codice con un nome, dichiarato in una classe. Unifica il concetto di procedura e funzione in Java. Struttura: [accesso] [static] tipo_ritorno nomeMetodo(params) { corpo } Procedura Java: Metodo con tipo di ritorno void. Non restituisce valori; si chiama con nomeProcedura(args); Funzione Java: Metodo con tipo di ritorno specifico (int, double, String, …). Contiene obbligatoriamente return valore; si assegna con var = nomeFunzione(args); Compatibilità tipi: I parametri nella chiamata devono avere tipo uguale o compatibile con i parametri formali. Il valore di return deve essere compatibile con il tipo dichiarato. Passaggio per valore: Java copia il valore nella variabile locale del metodo. Nessuna modifica al parametro formale cambia la variabile nel chiamante (per tipi primitivi). Passaggio per riferimento (implicito): Per array e oggetti, Java copia l'indirizzo (riferimento). Le modifiche all'oggetto puntato si riflettono nel chiamante. Ordine parametri: Deve corrispondere esattamente alla dichiarazione del metodo.
Attraverso i metodi possiamo riutilizzare un blocco di codice in molte parti del programma, semplicemente richiamando il nome con cui l'abbiamo definito, senza dover riscrivere lo stesso codice più volte.
Programmazione in Java