Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Programmazione in Java - Parte 3 - Funzioni, Schemi e mappe concettuali di Programmazione Java

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

2025/2026

In vendita dal 16/04/2026

airruh
airruh 🇮🇹

4.7

(17)

73 documenti

1 / 56

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
L'ORGANIZZAZIONE DEI PROGRAMMI
Corso di Programmazione in Java — Dispensa didattica
Argomenti trattati:
• Lo sviluppo Top-Down
• Le Procedure
• Le Funzioni
• Le Procedure e le Funzioni in Java
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38

Anteprima parziale del testo

Scarica Programmazione in Java - Parte 3 - Funzioni e più Schemi e mappe concettuali in PDF di Programmazione Java solo su Docsity!

L'ORGANIZZAZIONE DEI PROGRAMMI

Corso di Programmazione in Java — Dispensa didattica

Argomenti trattati:

  • Lo sviluppo Top-Down
  • Le Procedure
  • Le Funzioni
  • Le Procedure e le Funzioni in Java

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:

  • ogni rettangolo è detto nodo ;
  • il nodo in cima è la radice , che rappresenta il problema principale;
  • i nodi senza ulteriori diramazioni sono detti foglie e corrispondono ai sottoproblemi elementari già risolvibili direttamente.

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:

  • svolge un compito preciso e ben definito;
  • ha un nome univoco che lo identifica;

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:

  • l'esecuzione del programma chiamante viene sospesa ;
  • si eseguono le istruzioni della procedura dall'inizio alla fine;
  • al termine della procedura, il controllo torna al programma chiamante, riprendendo dall'istruzione successiva alla chiamata.

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

  • Riusabilità interna: codice ripetuto più volte nello stesso programma con dati diversi viene scritto una sola volta e richiamato con i parametri appropriati.
  • Riusabilità tra programmi: parti di codice comuni a più programmi vengono organizzate come procedure autonome e condivise.
  • Leggibilità e struttura: il programma principale descrive le macro-operazioni con i loro nomi, rendendo il codice auto-documentante.

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

PROC FUNC

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:

  • void → il metodo si comporta come una procedura (non restituisce nulla);
  • tipo specifico (int, double, String, …) → il metodo si comporta come una funzione.

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.

I METODI IN JAVA — PARTE 1

Corso di Programmazione in Java — Dispensa didattica

Argomenti trattati:

  • Cos'è un Metodo e la sua sintassi
  • Procedure in Java (metodi void)
  • Funzioni in Java (metodi con tipo di ritorno)
  • Passaggio dei parametri
  • Passaggio dei parametri in Java

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:

  • Tipi primitivi: int, double, float, long, short, byte, char, boolean. Le variabili di tipo primitivo contengono direttamente il valore.
  • Oggetti (tipi riferimento): String, array, e tutte le classi. Le variabili oggetto non contengono l'oggetto stesso, ma un riferimento (indirizzo di memoria) all'oggetto.

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:

  • Tipi primitivi: passaggio per valore puro → nessuna modifica alla variabile originale.
  • Array e oggetti: passaggio per valore dell'indirizzo (effetto di riferimento) → le modifiche al contenuto dell'oggetto/array si riflettono nel 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

I Metodi (Parte 2)

  • Regole di visibilità delle variabili
  • Convenzione sul nome dei metodi
  • Overloading dei metodi
  • Flusso del controllo
  • Esercizio pratico completo