1 Parte 5 Fondamenti di Programmazione. 2 Programmazione Concetti base: dati istruzioni Dati: variabili tipi Istruzioni: istruzioni base strutture di.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

INFORMATICA Algoritmi fondamentali
Process synchronization
TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Procedure e funzioni ricorsive
LE FUNZIONI IN C Sommario 1 Introduzione 2 Moduli di programma in C
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Metodologie di Programmazione = decomposizione basata su astrazioni
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Frontespizio Economia Monetaria Anno Accademico
Anno accademico Array e puntatori in C.
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Funzioni definite dall’utente
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 20 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
Algebra di Boole ed elementi di logica
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Algoritmo di Ford-Fulkerson
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Programmazione 1 9CFU – TANTE ore
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
eliana minicozzi linguaggi1a.a lezione2
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
La Programmazione Ricorsiva
Le funzioni.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
Calcolo del Massimo Comun Divisore
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
Radix-Sort(A,d) // A[i] = cd...c2c1
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Massimo Comun Divisore
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
Parte 5 Laboratorio di Informatica Dott.ssa Elisa Tiezzi
14 marzo 2002 Avvisi:.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
Ricorsione Strumento potente per definizioni matematiche
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 5 (Deitel) Le funzioni Indice degli argomenti Introduzione Moduli nei programmi C 5.3.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Complessità di un algoritmo
Astrazione procedurale ed eccezioni
Le variabili in Java Nella programmazione tradizionale, una variabile è una porzione di memoria in cui è immagazzinato un certo tipo di dato. Per esempio.
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Programmazione ad oggetti
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Allievi Elettrici - AA Le funzioni ricorsive in C
Transcript della presentazione:

1 Parte 5 Fondamenti di Programmazione

2 Programmazione Concetti base: dati istruzioni Dati: variabili tipi Istruzioni: istruzioni base strutture di controllo sotto-programmi

3 Sotto-programmi Necessità di scomporre programmi complessi Sotto-programma: insieme di istruzioni a cui è dato un nome il nome usato come sostituto dellintero insieme di istruzioni Esempio generare un numero intero casuale compreso tra 1 e 100 raggruppare le necessarie istruzioni in un sotto-programma di nome randomNumber ogni volta che il programma deve generare un numero intero casuale compreso tra 1 e 100, lo può fare con una semplice istruzione: randomNumber() Vantaggi: risparmio di scrittura, organizzazione, riutilizzo

4 Sotto-programmi in Java In Java, i sotto-programmi sono chiamati metodi Interfaccia (sintattica) di un metodo: nome del metodo input richiesto output fornito Sintassi della dichiarazione: Tipo_Output Nome_Metodo(Lista_Input) Blocco // corpo del metodo

5 Tipologie di metodi Alcuni metodi (talvolta, detti funzioni) eseguono unazione e ritornano un singolo valore esempio: il metodo randomNumber genera un numero intero casuale compreso tra 1 e 100 e ne ritorna il valore Altri metodi (talvolta, detti procedure) si limitano ad eseguire unazione esempio: il metodo printWelcomeMessage stampa un messaggio di benvenuto

6 Tipo di ritorno dei metodi Sempre specificato Può essere: tipo di dato primitivo (come char oppure int ) classe (come String ) void se nessun valore viene ritornato Un metodo (non void ) può essere usato ovunque è lecito usare il suo tipo di ritorno esempio: int r = randomNumber();

7 Istruzione return I metodi che ritornano un valore devono eseguire, allinterno del corpo, unistruzione return che include il valore da ritornare Esempio: int randomNumber() { int r = 1+(int)(Math.random()*99); return r; }

8 Esempio di metodo void Definizione del metodo printWelcomeMessage : void printWelcomeMessage() { System.out.println(``Hello!); System.out.println(``Welcome to paradise!); } Questo metodo esegue unazione (stampa un messaggio di benvenuto) ma non ritorna alcun valore

9 Nomi di metodi Buone regole di programmazione: verbi per nominare metodi senza un valore di ritorno realizzano un azione esempio: printIntegerNumber nomi per nominare metodi con un valore di ritorno creano (ritornano) un dato, ovvero una cosa esempio: randomNumber iniziare il nome di un metodo con una lettera minuscola

10 Parametri di un metodo Metodi più flessibili (e quindi più utili) con valori di input (detti valori passati o parametri) Parametri e loro tipi di dato specificati allinterno delle parentesi tonde successive al nome del metodo questi sono i parametri formali lista di parametri separati da virgole Invocando un metodo, vanno inseriti (allinterno delle parentesi tonde) valori del tipo specificato e nellordine specificato questi sono gli argomenti, o parametri attuali

11 Esempio Dichiarazione: int randomNumber(int min, int max) { return min+(int)(Math.random()*(max-min)); } parametri formali: min e max Invocazione: int m = 10; int M = 20; int r = randomNumber(m, M); argomenti: m ed M

12 Passaggio per valore Parametri formali sono locali al loro metodo variabili usate come argomenti non possono essere modificate dal metodo metodo riceve solo il loro valore Quando un metodo è invocato, il valore di ciascun argomento è copiato nel (assegnato al) corrispondente parametro formale numero di argomenti uguale a numero di parametri formali tipo di dati degli argomenti uguale a quello dei corrispondenti parametri formali parametri formali inizializzati con i valori passati

13 Variabili locali ad un blocco Variabile dichiarata allinterno di un blocco: vista solo allinterno del blocco locale al blocco, per cui è chiamata variabile locale se il blocco è il corpo di un metodo, la variabile è detta essere una variabile locale del metodo quando il blocco termina lesecuzione, le variabili locali spariscono riferimenti a variabili locali fuori del blocco corrispondente causano errori di compilazione Variabile dichiarata nellinizializzazione di un for è locale al ciclo for non può essere usata fuori del ciclo

14 Quando e dove Dichiarare una variabile fuori di tutti i blocchi ma allinterno di un metodo la rende disponibile a tutti i blocchi del metodo Buone regole di programmazione dichiarare le variabili immediatamente prima di utilizzarle inizializzare le variabili al momento della dichiarazione non dichiarare variabili allinterno di cicli richiede tempo la creazione e la distruzione di una variabile eccezione: variabili dichiarate nellinizializzazione di un ciclo for

15 Programmazione procedurale Obiettivo Concepire la costruzione di programmi di grande dimensione e complessità come composizione di componenti (procedure) costruite ad hoc esistenti Vantaggi dominare la complessità ridurre i costi aumentare parallelismo nello sviluppo

16 Scomporre e comporre Principio del divide et impera Suddividere per isolare parti il più possibile autonome ed indipendenti Parti potenzialmente riutilizzabili

17 Autonomia ed indipendenza Ogni parte deve avere una sua coesione da un punto di vista logico deve rappresentare unastrazione significativa Ogni parte deve essere il più possibile indipendente dalle altre parti

18 Procedura È una parte del sistema complessivo Deve avere, rispetto alle altre parti, uninterfaccia ben definita interfaccia: tutto ciò che è necessario conoscere per poter usare la procedura

19 Procedure e metodi Un metodo Java può essere considerato come una procedura La sua interfaccia è specificata nellintestazione È bene che non modifichi variabili che non sono locali indipendenza dalle altre procedure

20 Relazione di utilizzo Procedura A usa procedura B se, per svolgere il proprio compito, deve accedere alla procedura B attraverso quanto definito nellinterfaccia di questultima esempio: se il metodo F invoca il metodo G, allora F usa G

21 Interfaccia/implementazione Occorre distinguere tra questi due aspetti Interfaccia dice ciò che le altre procedure possono conoscere Implementazione è come ciò che viene offerto attraverso linterfaccia è effettivamente realizzato

22 Struttura di un programma Procedura principale Più procedure asservite a quella principale Ciascuna di questultime, a sua volta, ne può usare altre

23 Una visione grafica procedura principale procedura asservita P1 procedura asservita P2 procedura asservita P4 procedura asservita P3 AB A usa B procedura asservita P5

24 Realizzazione in Java Procedura principale procedura main Per ciascuna procedura asservita interfaccia dichiarazione implementazione definizione del corpo

25 Esempio Programma che genera due frazioni Decide se sono apparenti: numeratore multiplo di denominatore proprie: numeratore minore di denominatore Confronta le due frazioni Riduce le due frazioni ai minimi termini Riduce le due frazioni allo stesso denominatore Esegue le quattro operazioni

26 Struttura (parziale) main isApparentisProperisFETS isFBTS computeRN computeRD computeGCD

27 Frazioni apparenti e proprie boolean isApparent(int n, int d) { return (n % d == 0); } boolean isProper(int n, int d) { return (n < d); }

28 Confronto tra frazioni boolean isFETS(int n1,int d1,int n2,int d2) { return (n1*d2 == n2*d1); } boolean isFBTS(int n1,int d1,int n2,int d2) { return (n1*d2 > n2*d1); }

29 Calcolo del MCD (1) int computeGCD(int n, int d){ int count = 2, min = n, GCD = 1; if (n > d) min = d; while (count <= min) { if ((n%count == 0) && (d%count == 0)) GCD = count; ++count; } return GCD; }

30 Semplificazione di frazioni int computeRN(int n, int d) { return (n / computeGCD(n, d)); } int computeRD(int n, int d) { return (d / computeGCD(n, d)); }

31 Procedura principale void main() { int n1 = 1+(int)(Math.random()*99); int d1 = 1+(int)(Math.random()*99); int n2 = 1+(int)(Math.random()*99); int d2 = 1+(int)(Math.random()*99);... }

32 Calcolo del MCD (2) int computeGCD(int n, int d){ int GCD = n; if (n > d) GCD = d; while (GCD > 1) { if ((n%GCD == 0) && (d%GCD == 0)) break; --GCD; } return GCD; }

33 Algoritmo di Euclide Proprietà: se r è il resto della divisione di a per b (a b), allora i divisori comuni di a e b coincidono con quelli di b ed r MCD(a, b) = MCD(b, r) dove r = a mod b Algoritmo: se b=0, allora MCD(a, b) = a, altrimenti MCD(a, b) = MCD(b, a mod b)

34 Calcolo del MCD (3) int computeGCD(int n, int d) { int temp = 0; while (d > 0) { temp = d; d = n % d; n = temp; } return n; }

35 Ricorsione Strumento potente per definizioni matematiche Possibilità di definire insieme infinito di oggetti con regola finita possibilità di descrivere un insieme infinito di computazioni con un programma finito

36 Ricorsione in matematica Le formule matematiche sono spesso espresse in termini ricorsivi Esempio: definizione di fattoriale 1!=1 N!=N * (N-1)!

37 Metodi ricorsivi Contengono riferimenti espliciti a sé stessi direttamente ricorsivi Un metodo ne invoca un altro e lesecuzione di questultimo porta ad un certo punto ad invocare nuovamente (direttamente o indirettamente) il metodo originale indirettamente ricorsivi

38 Ricorsione infinita Requisito fondamentale: chiamata ricorsiva subordinata ad una condizione che ad un certo istante deve divenire non soddisfatta Qualsiasi definizione ricorsiva deve avere una parte non ricorsiva, detta base della ricorsione, che permette alla ricorsione stessa di terminare Nellesempio precedente del fattoriale la base è 1! che è posto uguale ad 1

39 Variabili in metodi ricorsivi Ogni invocazione genera un nuovo insieme di variabili locali Ogni parametro riceve un valore iniziale in base alla nuova invocazione Ogni volta che il metodo termina si ritorna al metodo che lo ha chiamato ( che potrebbe essere lo stesso)

40 Numeri di Fibonacci Schema più complicato di composizione ricorsiva che potrebbe (e dovrebbe) essere tradotto in forma iterativa Definizione: fib 0 = 0 fib 1 = 1 fib n+1 = fib n + fib n-1

41 Implementazione ricorsiva int computeFib(int n) { if (n == 0) return 0; if (n == 1) return 1; return computeFib(n-1)+computeFib(n-2); }

Numero di invocazioni Numero totale di invocazioni cresce esponenzialmente

43 Implementazione iterativa int computeFib(int n) { int i = 1, x = 1, y = 0; while (i < n) { i = i+1; x = x+ y; y = x -y; } return x; }

44 Considerazioni Ricorsione deve essere evitata se esiste una soluzione iterativa ovvia Non vuol dire evitare la ricorsione a qualunque costo esistono molte buone applicazioni della ricorsione algoritmi per loro natura ricorsivi vanno implementati con metodi ricorsivi

45 Le torri di Hanoi inventato nel 1880 da Lucas Tre aste (o torri) ed n dischi di dimensioni diverse (con buco per inserirli nelle aste) Allinizio tutti i dischi sono nellasta 1 in ordine decrescente di grandezza Obiettivo: portarli nella torre 3 rispettando le regole seguenti nessun disco mai sopra uno più piccolo si può spostare un solo disco alla volta dischi sempre collocati su una torre (non a parte) solo disco in cima ad una torre può essere spostato

46 Algoritmo ricorsivo Obiettivo: spostare k dischi da torre 1 a torre 3 Algoritmo: Spostare k-1 dischi da torre 1 a torre 2 Spostare 1 disco da torre 1 a torre 3 Spostare k-1 dischi da torre 2 a torre 3

47 Implementazione 1 void moveTowers(int k, int o,int d) { if (k > 0) { moveTowers(k-1, o, 6-o-d); System.out.println("Sposta da "+o+"a"+d); moveTowers(k-1,6-o-d,d); }