Definizioni ricorsive
|
|
|
- Annibale Orsini
- 9 anni fa
- Visualizzazioni
Transcript
1 Definizioni ricorsive Caso base : (* fact: int -> int *) let rec fact n = if n=0 then 1 else n * fact (n-1) n! = n 1 n = (n 1)! n = n (n 1)! 0! = 1 Il fattoriale è definito in termini di se stesso, ma per un caso più facile. rec è una parola chiave: # let fact_errore n = if n=0 then 1 else n * fact_errore (n-1) ;; Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 1 / 50
2 Definizioni ricorsive Caso base : (* fact: int -> int *) let rec fact n = if n=0 then 1 else n * fact (n-1) n! = n 1 n = (n 1)! n = n (n 1)! 0! = 1 Il fattoriale è definito in termini di se stesso, ma per un caso più facile. rec è una parola chiave: # let fact_errore n = if n=0 then 1 else n * fact_errore (n-1) ;; Error: Unbound value fact_errore Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 1 / 50
3 Ricorsione Nei linguaggi funzionali puri non esistono costrutti di controllo per la realizzazione di cicli quali (for, while, repeat), ma il principale meccanismo di controllo è la ricorsione. La ricorsione è una tecnica per risolvere problemi complessi riducendoli a problemi più semplici dello stesso tipo. Per risolvere un problema ricorsivamente occorre: 1 Identificare i casi semplicissimi (casi di base) che possono essere risolti immediatamente 2 Dato un generico problema complesso, identificare i problemi più semplici dello stesso tipo la cui soluzione può aiutare a risolvere il problema complesso 3 Assumendo di saper risolvere i problemi più semplici (ipotesi di lavoro), determinare come operare sulla soluzione dei problemi più semplici per ottenere la soluzione del problema complesso Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 2 / 50
4 Problema: valutazione di un espressione aritmetica rappresentata da una stringa Obiettivo: scrivere un programma che, data una stringa che rappresenta un operazione aritmetica semplice tra interi non negativi, ne riporti il valore numerico. Esempio: il valore riportato per la stringa "34+12"è l intero 46. Le operazioni consentite sono somma, differenza, prodotto, divisione (intera). Tipo e specifica dichiarativa della funzione principale evaluate: string -> int evaluate s = valore numerico dell espressione rappresentata dalla stringa s. Errore se s non rappresenta un espressione aritmetica semplice Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 3 / 50
5 Progetto: riduzione a sottoproblemi Identificazione di un sottoproblema utile: split_string : string -> int * char * int split_string s = (n,op,m) dove n = primo operando, op = carattere che rappresenta l operazione, m = secondo operando. Per risolvere il problema split_string: cercare il primo carattere non numerico: primo_non_numerico: string -> int primo_non_numerico s = posizione del primo carattere non numerico nella stringa s. Errore se non esiste estrarre una parte di una stringa: substring : string -> int -> int -> string substring s j k = sottostringa di s che va dalla posizione j alla posizione k. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 4 / 50
6 Apriamo il manuale di OCaml Nel Modulo Pervasives val int_of_string : string -> int Convert the given string to an integer. # int_of_string "123";; - : int = 123 Nel Modulo String val sub : string -> int -> int -> string String.sub s start len returns a fresh string of length len, containing the substring of s that starts at position start and has length len. # String.sub " " 2 3;; - : string = "234" val length : string -> int Return the length (number of characters) of the given string. # String.length "pippo";; - : int = 5 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 5 / 50
7 Casi di errore # int_of_string "123pippo";; Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 6 / 50
8 Casi di errore # int_of_string "123pippo";; Exception: Failure "int_of_string". # String.sub " " 2 30;; Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 6 / 50
9 Casi di errore # int_of_string "123pippo";; Exception: Failure "int_of_string". # String.sub " " 2 30;; Exception: Invalid_argument "String.sub". Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 6 / 50
10 Sottoproblema primo_non_numerico (I) primo_non_numerico: string -> int primo_non_numerico s = posizione del primo carattere non numerico nella stringa s. Errore se non esiste Algoritmo (iterativo): iniziando con l indice i=0, si incrementa i fino a che il carattere in posizione i è numerico. Quando il carattere in posizione i non è numerico, riportare il valore di i. Sottoproblema: determinare se un carattere è numerico. (* numeric : char -> bool *) let numeric c = Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 7 / 50
11 Sottoproblema primo_non_numerico (I) primo_non_numerico: string -> int primo_non_numerico s = posizione del primo carattere non numerico nella stringa s. Errore se non esiste Algoritmo (iterativo): iniziando con l indice i=0, si incrementa i fino a che il carattere in posizione i è numerico. Quando il carattere in posizione i non è numerico, riportare il valore di i. Sottoproblema: determinare se un carattere è numerico. (* numeric : char -> bool *) let numeric c = c >= 0 && c <= 9 Nel Modulo String: val get : string -> int -> char String.get s n returns the character at index n in string s. You can also write s.[n] instead of String.get s n. Raise Invalid_argument if n not a valid index in s. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 7 / 50
12 Sottoproblema primo_non_numerico (II) Corpo del ciclo: loop: string -> int -> int loop s i = posizione del primo carattere non numerico in s, a partire dalla posizione i. let rec loop s i = if not (numeric s.[i]) then i else loop s (i+1) primo_non_numerico s = loop s 0 let primo_non_numerico s = loop s 0 (inizializza i a 0 prima di entrare nel ciclo) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 8 / 50
13 Dichiarazioni locali La funzione loop serve soltanto come funzione di supporto per primo_non_numerico: inutile definirla globalmente let primo_non_numerico s = let rec loop s i = if not (numeric s.[i]) then i else loop s (i+1) in loop s 0 La funzione locale vede il parametro s della funzione principale, che in loop non cambia mai. let primo_non_numerico s = (* loop: int -> int *) let rec loop i = if not (numeric s.[i]) then i else loop (i+1) in loop 0 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 9 / 50
14 Soluzione del problema substring substring : string -> int -> int -> string substring s j k = sottostringa di s che va dalla posizione j alla posizione k. Utilizziamo String.sub : string -> int -> int -> string String.sub s start len returns a fresh string of length len, containing the substring of s that starts at position start and has length len. La lunghezza della sottostringa riportata da substring s j k è (k-j)+1, quindi: let substring s j k = String.sub s j ((k-j)+1) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 10 / 50
15 Soluzione del problema split_string split_string : string -> int * char * int split_string s = (n,op,m), dove, se i è la posizione del primo carattere non numerico di s: n è l intero rappresentato dalla sottostringa di s che va dal primo carattere fino a quello in posizione i-1 op è il carattere in posizione i m è l intero rappresentato dalla sottostringa di s che va dal carattere in posizione i+1 fino alla fine della stringa Usiamo: int_of_string : string -> int per la conversione di stringhe in interi String.length: string -> int: String.lengts s = numero di caratteri di s let split_string s = let i = primo_non_numerico s in (int_of_string (substring s 0 (i-1)), s.[i], int_of_string (substring s (i+1) ((String.length s)-1))) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 11 / 50
16 Soluzione del problema principale evaluate Occorre considerare diversi casi a seconda del carattere che rappresenta l operazione (che deve essere una delle 4 operazioni) (* evaluate: string -> int *) let evaluate s = let (n,op,m) = split_string s in if op= + then n+m else if op= - then n-m else if op= * then n*m else if op= / then n/m else??? let (n,op,m) = split_string s: sia n il primo elemento della tripla riportata come valore da split_string s, op il secondo e m il terzo. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 12 / 50
17 Soluzione del problema principale evaluate Occorre considerare diversi casi a seconda del carattere che rappresenta l operazione (che deve essere una delle 4 operazioni) exception BadOperation (* evaluate: string -> int *) let evaluate s = let (n,op,m) = split_string s in if op= + then n+m else if op= - then n-m else if op= * then n*m else if op= / then n/m else raise BadOperation let (n,op,m) = split_string s: sia n il primo elemento della tripla riportata come valore da split_string s, op il secondo e m il terzo. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 12 / 50
18 Espressioni let Dichiarazione locale di una variabile let x = E in F Le espressioni hanno sempre un tipo e un valore. Il tipo e il valore di let x = E in F sono quelli dell espressione che si ottiene da F sostituendo ovunque x con E. x è una variabile locale: x ha un valore (quello dell espressione E) soltanto all interno dell espressione F. quando tutta l espressione let x = E in F è stata valutata, x non ha più un valore. # let x = 1+2 in x*8;; - : int = 24 # x;; Characters 0-1: x;; ^ Unbound value x Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 13 / 50
19 Valutazione di espressioni let let x = E in F viene calcolato il valore v di E; la variabile x viene provvisoriamente legata a v; tenendo conto di questo nuovo legame, viene calcolato il valore di F: questo è il valore dell intera espressione; il legame provvisorio di x viene sciolto: x torna ad avere il valore che aveva prima o nessun valore. Cosa vi ricorda? Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 14 / 50
20 Valutazione di espressioni let let x = E in F viene calcolato il valore v di E; la variabile x viene provvisoriamente legata a v; tenendo conto di questo nuovo legame, viene calcolato il valore di F: questo è il valore dell intera espressione; il legame provvisorio di x viene sciolto: x torna ad avere il valore che aveva prima o nessun valore. Cosa vi ricorda? let x = E in F (function x -> F) E Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 14 / 50
21 Forma generale delle dichiarazioni locali Esempio: let [rec] f <parametri> = <corpo> in E DICHIARAZIONE-LET in ESPRESSIONE È un espressione Il suo valore è il valore che ha ESPRESSIONE nell ambiente che si ottiene estendendo l ambiente attuale mediante DICHIARAZIONE-LET Per valutare in un ambiente A: DICHIARAZIONE-LET in ESPRESSIONE 1 viene valutata DICHIARAZIONE-LET in A (l ambiente A viene esteso) 2 viene valutata ESPRESSIONE nel nuovo ambiente 3 viene ripristinato l ambiente A Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 15 / 50
22 Dichiarazioni locali per evitare di calcolare più volte il valore di una stessa espressione Esempio: dati tre interi n, m e k, determinare il quoziente e il resto di n+m diviso k (* esempio: int * int * int -> int * int *) let esempio (n,m,k) = ((n+m)/k, (n+m) mod k) Il valore di n+m viene calcolato 2 volte let esempio(n,m,k) = let somma = n+m in (somma/k, somma mod k) O, equivalentemente: let esempio(n,m,k) = (function somma -> (somma/k, somma mod k)) (n+m) let esempio(n,m,k) = let aux somma = (somma/k, somma mod k) in aux (n+m) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 16 / 50
23 Esempio: riduzione di una frazione ai minimi termini Rappresentiamo una frazione mediante una coppia di interi. (* gcd : int -> int -> int *) (* gcd a b = massimo comun divisore di a e b *) (* assumendo che almeno uno tra a e b sia diverso da 0 *) let rec gcd a b = if b=0 then (abs a) else gcd b (a mod b) (* fraction : int * int -> int * int *) let fraction (n,d) = let com = gcd n d in (n/com, d/com) Ha senso rendere gcd locale a fraction? Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 17 / 50
24 Esempio: riduzione di una frazione ai minimi termini Rappresentiamo una frazione mediante una coppia di interi. (* gcd : int -> int -> int *) (* gcd a b = massimo comun divisore di a e b *) (* assumendo che almeno uno tra a e b sia diverso da 0 *) let rec gcd a b = if b=0 then (abs a) else gcd b (a mod b) (* fraction : int * int -> int * int *) let fraction (n,d) = let com = gcd n d in (n/com, d/com) Ha senso rendere gcd locale a fraction? Motivi per dichiarare localmente una funzione: non ha significato autonomo consente di risparmiare parametri Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 17 / 50
25 Funzioni in forma currificata (* gcd: int -> int -> int *) let rec gcd a b = if b=0 then (abs a) else gcd b (a mod b) (* gcd2: int * int -> int *) let rec gcd2 (a,b) = if b=0 then (abs a) else gcd2 (b,a mod b) gcd è la forma currificata di gcd2: calcola gli stessi valori, ma consuma un argomento alla volta Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 18 / 50
26 Funzioni in forma currificata (* gcd: int -> int -> int *) let rec gcd a b = if b=0 then (abs a) else gcd b (a mod b) (* times: int -> int -> int *) let times m n = m * n (* gcd2: int * int -> int *) let rec gcd2 (a,b) = if b=0 then (abs a) else gcd2 (b,a mod b) (* mult: int * int -> int *) let mult (m,n) = m * n gcd è la forma currificata di gcd2: calcola gli stessi valori, ma consuma un argomento alla volta times è la forma currificata di mult: calcola gli stessi valori, ma consuma un argomento alla volta times 5: int -> int è un applicazione parziale di times. sum (times 5) 1 10 = 10 k=1 (5 k) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 18 / 50
27 Forma currificata di una funzione su tuple In generale, f c è la forma currificata di f se f : f c : t 1... t n t t 1 (t 2... (t n t)...) e per ogni a 1,..., a n : f (a 1,..., a n ) = (((f c a 1 ) a 2 )...a n ) Le parentesi possono essere omesse sia nel tipo di f c (si associa a destra), sia nell applicazione di f c (si associa a sinistra). 1 variabili (times) Espressioni per denotare funzioni 2 astrazioni funzionali (function x -> function y -> x*y, o anche fun x y -> x*y) 3 espressioni funzionali (comp double (times 5)) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 19 / 50
28 Altri esempi # let pair x y = (x,y);; val pair : a -> b -> a * b = <fun> # let lessthan x y = y < x;; val lessthan : a -> a -> bool = <fun> lessthan 0 è un predicato: essere minore di 0 # let greaterthan x y = y > x;; val greaterthan : a -> a -> bool = <fun> # let equal x y = x=y;; val equal : a -> a -> bool = <fun> equal 8 è un predicato: essere uguale a 8 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 20 / 50
29 Operazioni predefinite in Ocaml Molte operazioni predefinite in Ocaml sono in forma currificata # max;; - : a -> a -> a = <fun> Le operazioni infisse predefinite sono in forma currificata: # ( * );; - : int -> int -> int = <fun> # (=);; - : a -> a -> bool = <fun> Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 21 / 50
30 Definizione di operatori infissi # let (@@) f g x = f(g x);; : ( a -> b) -> ( c -> a) -> c -> b = <fun> # treble;; - : int -> int = <fun> Characters 0-2: Syntax error # (@@);; - : ( a -> b) -> ( c -> a) -> c -> b = <fun> (* f: int -> int *) let f = (times ((+) 100) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 22 / 50
31 Gestione dei casi eccezionali OCaml prevede un tipo di dati particolare, quello delle le eccezioni: exn Le eccezioni consentono di scrivere programmi che segnalano un errore: cioè di definire funzioni parziali. Procedura di definizione di una funzione parziale: se caso eccezionale allora ERRORE altrimenti... Esiste un insieme di eccezioni predefinite: Match_failure, Division_by_zero,... Ma l insieme dei valori del tipo exn può essere esteso, mediante la dichiarazione di eccezioni: (* dichiarazione di eccezione *) exception NegativeNumber I nomi delle eccezioni iniziano tutti con una lettera maiuscola Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 23 / 50
32 Come segnalare un errore Dopo aver dichiarato un eccezione, l eccezione può essere sollevata: (* fact: int -> int fact n solleva l eccezione NegativeNumber se n e negativo, altrimenti riporta il fattoriale di n *) let rec fact n = if n < 0 then raise NegativeNumber (* viene "sollevata" l eccezione *) else if n=0 then 1 else n * fact (n-1) # fact 3;; - : int = 6 # fact (-1);; Exception: NegativeNumber. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 24 / 50
33 Propagazione delle eccezioni # 4 * fact (-1) ;; Exception: NegativeNumber. Se durante la valutazione di un espressione E viene sollevata un eccezione, il calcolo del valore di E termina immediatamente (il resto dell espressione non viene valutato), e viene sollevata l eccezione. (* loop : a -> b *) let rec loop x = loop x;; # let f=fact(-1) in loop f;; Exception: NegativeNumber. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 25 / 50
34 Catturare un eccezione Un eccezione può essere catturata per implementare procedure di questo tipo: calcolare il valore di E se nel calcolo di tale valore si verifica un errore allora... # try 4 * fact(-1) with NegativeNumber -> 0;; - : int = 0 Attenzione: Se E è di tipo exn: 1 E può essere il valore di qualunque funzione 2 E può essere argomento di qualunque funzione Le eccezioni sono eccezioni alla tipizzazione forte. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 26 / 50
35 Uso di eccezioni diverse per identificare il tipo di errore (* primo_non_numerico: string -> int *) let primo_non_numerico s = let rec loop i = if not (numeric s.[i]) then i else loop (i+1) in loop 0 # primo_non_numerico "1234";; Exception: Invalid_argument "index out of bounds". Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 27 / 50
36 Uso di eccezioni diverse per identificare il tipo di errore (* primo_non_numerico: string -> int *) let primo_non_numerico s = let rec loop i = if not (numeric s.[i]) then i else loop (i+1) in loop 0 # primo_non_numerico "1234";; Exception: Invalid_argument "index out of bounds". let primo_non_numerico str = (* aux: int -> int *) let rec aux i = if not (numeric str.[i]) then i else aux (i+1) in try aux 0 with Invalid_argument "index out of bounds" -> raise BadOperation Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 27 / 50
37 Uso di eccezioni diverse (II) (* split_string : string -> int * char * int *) let split_string s = let i = primo_non_numerico s in (int_of_string (substring s 0 (i-1)), s.[i], int_of_string(substring s (i+1)((string.length s)-1))) # split_string "43+abc";; Exception: Failure "int_of_string". Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 28 / 50
38 Uso di eccezioni diverse (II) (* split_string : string -> int * char * int *) let split_string s = let i = primo_non_numerico s in (int_of_string (substring s 0 (i-1)), s.[i], int_of_string(substring s (i+1)((string.length s)-1))) # split_string "43+abc";; Exception: Failure "int_of_string". exception BadInt (* split_string : string -> int * char * int *) let split_string s = let i = primo_non_numerico s in try (int_of_string (substring s 0 (i-1)), s.[i], int_of_string (substring s (i+1) ((String.length s)-1))) with Failure "int_of_string" -> raise BadInt Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 28 / 50
39 Uso sporco delle eccezioni (* conta_digits: string -> int *) (* conta_digits s = numero di caratteri numerici in s *) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 29 / 50
40 Uso sporco delle eccezioni (* conta_digits: string -> int *) (* conta_digits s = numero di caratteri numerici in s *) let conta_digits s = let max_index = (String.length s) - 1 in (* loop: int -> int *) (* loop i = numero di caratteri numerici in s a partire dalla posizione i *) let rec loop i = if i > max_index then 0 else if numeric s.[i] then 1 + loop (i+1) else loop (i+1) in loop 0 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 29 / 50
41 Uso sporco delle eccezioni (* conta_digits: string -> int *) (* conta_digits s = numero di caratteri numerici in s *) let conta_digits s = let max_index = (String.length s) - 1 in (* loop: int -> int *) (* loop i = numero di caratteri numerici in s a partire dalla posizione i *) let rec loop i = if i > max_index then 0 else if numeric s.[i] then 1 + loop (i+1) else loop (i+1) in loop 0 let conta_digits s = let rec loop i = try if numeric s.[i] then 1 + loop (i+1) else loop (i+1) with Invalid_argument "index out of bounds" -> 0 in loop 0 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 29 / 50
42 Uso di pattern nelle dichiarazioni di valore (* evaluate: string -> int *) let evaluate s = let (n,op,m) = split_string s in if op= + then n+m else... Quando si scrive una dichiarazione della forma let x = <ESPRESSIONE>, la variabile x è un (caso particolare di) pattern. La forma generale delle dichiarazioni di valore è: let <PATTERN> = <ESPRESSIONE> # let (x,y) = (3*8, (10<100 or false));; val x : int = 24 val y : bool = true # let (n,op,m) = split_string "23+7";; val n : int = 23 val op : char = + val m : int = 7 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 30 / 50
43 Cos è un pattern? Un pattern è una espressione costituita mediante variabili e costruttori di tipo. Per i tipi introdotti fin qui, i costruttori sono tutti e solo: i valori dei tipi int, float, bool, char, string, unit i costruttori di tuple (coppie, triple,...), cioè parentesi e virgole Esempi: x è un pattern, in quanto variabile; "pippo" è un pattern, in quanto valore, quindi costruttore del tipo string; 2.0 è un pattern, in quanto valore, quindi costruttore del tipo float; (x,y) è un pattern, in quanto espressione ottenuta a partire da variabili e costruttori del tipo coppia; (0,x) è un pattern, in quanto espressione ottenuta a partire da variabili, costruttori del tipo int e costruttori del tipo coppia; (x,true,y) è un pattern, in quanto espressione ottenuta a partire da variabili, costruttori del tipo bool e costruttori del tipo tripla; x+y NON è un pattern in quanto + non è un costruttore; -n NON è un pattern in quanto non è un costruttore. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 31 / 50
44 Restrizione sui pattern In un pattern non possono però esserci occorrenze multiple di una stessa variabile: (con un eccezione, la variabile muta ) (x,x) NON è un pattern Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 32 / 50
45 Pattern matching: confronto con un pattern Un valore V è conforme a un pattern P se è possibile sostuire le variabili in P con sottoespressioni di V in modo tale da ottenere V stesso Pattern matching: confronto di un espressione E con un pattern P: il confronto ha successo se il valore V di E è conforme al pattern P in caso di successo, viene stabilito come sostituire le variabili del pattern P in modo da ottenere V # let (n,op,m) = split_string "23+7";; val n : int = 23 val op : char = + val m : int = 7 In una dichiarazione let <PATTERN> = <ESPRESSIONE>, se il confronto del valore di <ESPRESSIONE> con il <PATTERN> ha successo, l ambiente viene esteso aggiungendo i legami delle variabili che risultano dal pattern matching Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 33 / 50
46 Pattern matching: esempi (I) Pattern Espressione Pattern Matching "pippo" "pippo" Successo "pippo" "pluto" Fallimento "pippo" 0 ERRORE x "pippo" x "pippo" x "pi" "ppo" x "pippo" x 3*8 x 24 ("pippo", true) ("pippo", true) Successo ("pippo",true) ("pippo", 3<0) Fallimento ("pippo", x) ("pippo", 3<0) x false Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 34 / 50
47 Pattern matching: esempi (II) Pattern Espressione Pattern Matching x (2.0, 3<0) x (2.0,false) (n,m) (2.0, 3<0) n 2.0 m false (n,m,k) (2.0, 3<0) ERRORE (n,m,k) (2.0, 3*8, 3>0) n 2.0 m 24 k true (n,(m,k)) (2.0, 3*8, 3>0) ERRORE (n,(m,k)) (2.0, (3*8, 3>0)) n 2.0 m 24 k true Nota : Il pattern matching di un pattern costituito da una sola variabile con qualunque espressione, di qualunque tipo, ha sempre esito positivo. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 35 / 50
48 Uso di pattern nelle dichiarazioni di funzioni Come nelle dichiarazioni di valore, anche nelle dichiarazioni di funzione i parametri sono pattern: (* fraction : int * int -> int * int *) let fraction (n,d) = let com = gcd n d in (n/com, d/com) L unico parametro di fraction è indicato dal pattern (n,d) L uso dei pattern permette di evitare l uso di selettori: let fraction x = let n = fst x in let d = snd x in let com = gcd n d in (n/com, d/com) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 36 / 50
49 Uso di pattern nelle espressioni funzionali Analogamente, nelle espressioni funzionali della forma function x -> <ESPRESSIONE> la variabile x è un caso particolare di pattern. Più in generale, un espressione funzionale ha la forma: function <PATTERN> -> <ESPRESSIONE> Ad esempio, possiamo definire fraction così: let fraction = function (n,d) -> let com = gcd n d in (n/com, d/com) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 37 / 50
50 Chiamata di funzioni definite mediante l uso di pattern (* sort : a * a -> a * a *) let sort (x,y) = if x<y then (x,y) else (y,x) # sort (3*8,100/2);; sort (x,y) - : int * int = (24, 50) y 50 x 24 sort function(x,y) -> sort function(x,y) => Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 38 / 50
51 Forma generale delle espressioni function function P 1 -> E 1 P 2 -> E 2... P n -> E n I pattern P 1,..., P n devono essere tutti dello stesso tipo T 1. Le espressioni E 1,..., E n devono essere tutte dello stesso tipo T 2. Il tipo dell espressione function... è: T 1 T 2. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 39 / 50
52 Esempio let rec fact = function 0 -> 1 n -> n * fact(n-1) Si possono anche usare pattern multipli : let rec fact = function 0 1 -> 1 n -> n * fact(n-1) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 40 / 50
53 Valutazione dell applicazione di funzioni definite mediante espressioni function generali let F = function Pattern 1 -> E 1 Pattern 2 -> E 2... Pattern n -> E n Per valutare F(Expr) (cioè il valore di una funzione F applicata ad una espressione Expr): 1 Viene calcolato il valore V dell argomento Expr. 2 Il valore V viene confrontato con Pattern 1, Pattern 2,..., nell ordine: Se il confronto dà sempre esito negativo, la valutazione riporta un errore. Altrimenti: Sia Pattern i il primo pattern con cui il confronto di V ha successo; si aggiungono provvisoriamente i nuovi legami determinati dal pattern matching. Con questi nuovi legami viene valutato il corpo della funzione E i. Il valore di E i viene riportato come valore di F(Expr). I legami provvisori vengono sciolti. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 41 / 50
54 La variabile muta : esempi di pattern matching Pattern Espressione Pattern Matching _ "pippo" Successo ("pippo", _) ("pippo", 3<0) Successo (n,_,m) (2.0, 3*8, 3>0) n=2.0 m=true (_,_) (2.0, 3*8, 3>0) ERRORE (_,_) (2.0, (3*8, 3>0)) Successo Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 42 / 50
55 Esempi (* xor: bool * bool -> bool *) let xor = function (true,false) (false,true) -> true _ -> false let primo_non_numerico str = let rec aux i =... in try aux 0 with _ -> raise BadOperation let split_string s = let i = primo_non_numerico s in try... with _ -> raise BadInt let conta_digits s = let rec loop i = try... with _ -> 0 in loop 0 Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 43 / 50
56 Espressioni match match E with P 1 -> E 1 P 2 -> E 2... P k -> E k I pattern P 1,..., P n devono essere tutti dello stesso tipo, e dello stesso tipo di E. Le espressioni E 1,..., E n devono essere tutte dello stesso tipo T. Tipo dell espressione match...: T. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 44 / 50
57 Esempio let rec fact n = match n with 0 -> 1 _ -> n * fact(n-1) Cosa succede con questa definizione? let rec fact n = function 0 -> 1 n -> n * fact(n-1) Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 45 / 50
58 Esempio let rec fact n = match n with 0 -> 1 _ -> n * fact(n-1) Cosa succede con questa definizione? let rec fact n = function 0 -> 1 n -> n * fact(n-1) Characters 50-59: n -> n * fact(n-1);; ^^^^^^^^^ Error: This expression has type int -> int but an expression was expected of type int Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 45 / 50
59 evaluate con un espressione match I diversi casi considerati da evaluate si distinguono a seconda della forma del carattere che rappresenta l operatore let evaluate s = let (n,op,m) = split_string s in match op with + -> n+m - -> n-m * -> n*m / -> n/m _ -> raise BadOperation Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 46 / 50
60 Valutazione di espressioni match match F with Pattern 1 -> E 1 Pattern 2 -> E 2... Pattern n -> E n Per valutare l espressione: 1 Viene valutata l espressione F 2 Il valore ottenuto viene confrontato con Pattern 1, Pattern 2,..., nell ordine; se il confronto dà sempre esito negativo, la valutazione riporta un errore (Match_failure). Altrimenti: Sia Pattern i il primo pattern con cui il valore di F si confronta positivamente: si aggiungono provvisoriamente i nuovi legami determinati dal pattern matching. Con questi nuovi legami viene valutata l espressione E i. Il valore di E i viene riportato come valore di Expr. Vengono sciolti i legami provvisori. Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 47 / 50
61 Pattern non esaustivi # let evaluate s = let (n,op,m) = split_string s in match op with + -> n+m - -> n-m * -> n*m / -> n/m;; Characters :...match op with + -> n+m - -> n-m * -> n*m / -> n/m.. Warning 8: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: a val evaluate : string -> int = <fun> # evaluate "35=22";; Exception: Match_failure ("//toplevel//", 16, 5). Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 48 / 50
62 Regole di calcolo per la valutazione di espressioni MODELLO DI CALCOLO: CALCOLARE = RIDURRE # let square x = x * x;; val square : int -> int = <fun> square (3*2) ==> square 6 ==> 6 * 6 ==> 36 square (3*2) ==> (3*2)*(3*2) ==> 6*(3*2) ==> 6*6 ==> 36 Regole di calcolo: CALL BY VALUE: calcolare il valore dell argomento prima di applicare una funzione CALL BY NAME: applicare la funzione prima di aver calcolato il valore dell argomento Regola di calcolo di ML: call by value Eccezioni: espressioni condizionali, operatori booleani Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 49 / 50
63 Necessità di espressioni lazy let rec fact n = if n<=0 then 1 else n * fact(n-1) Call by value: fact 1 ==> if 1 <= 0 then 1 else 1 * fact(1-1) ==> if false then 1 else 1 * fact 0 ==> if false then 1 else 1 * (if 0<=0 then 1 else 0 * fact(0-1)) ==> if false then 1 else 1 * (if true then 1 else 0 * fact(-1)) ==> if false then 1 else 1 * (if true then 1 else 0 * (if -1<=0 then 1 else fact(-1-1))) ==> if false then 1 else 1 * (if true then 1 else 0 * (if true then 1 else fact(-2)))... Programmazione Funzionale (Roma Tre) 02: Introduzione a OCaml (II) 50 / 50
Tecniche per risolvere problemi: riduzione a sottoproblemi più semplici. Ricorsione
Tecniche per risolvere problemi: riduzione a sottoproblemi più semplici Ricorsione 1 Tecniche per risolvere problemi: riduzione a sottoproblemi più semplici Problema: dati tre numeri interi, calcolarne
Esercizi Programmazione I
Esercizi Programmazione I 9 Novembre 201 Esercizio 1 Valutare e dare il tipo delle seguenti espressioni condizionali. 1 char a= a, b= b ; // a ha v a l o r e decimale 97 2 i n t i= 1, j= 2 ; 3 double x=
Definizione di nuovi tipi
Definizione di nuovi tipi Un tipo è un insieme di valori. Per definire un nuovo tipo occorre specificare: 1 un nome per il tipo 2 come costruire i valori del tipo, cioè quali sono i costruttori del tipo.
Programmazione Funzionale
1/9 Programmazione Funzionale Esercizio sulle variabili locali Davide Mottin - Themis Palpanas March 12, 2014 OCaml Funzioni preparatorie Sommario 2/9 Funzioni preparatorie Costruire una funzione val even
Programmazione in Java (I modulo)
Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 5 Alberto Ceselli [email protected] Università degli Studi di Milano 12 Marzo 2013 Le funzioni sono oggetti di prima classe in Scheme In Scheme le funzioni
Programmazione in Python. Moreno Marzolla
Programmazione in Python Moreno Marzolla http://www.moreno.marzolla.name/ Copyright 2011, Moreno Marzolla (http://www.moreno.marzolla.name/teaching/labinf2011/) This work is licensed under the Creative
Corso di Fondamenti di Informatica Il sistema dei tipi in C++
Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Anno Accademico Francesco Tortorella Struttura di un programma C++ // Programma semplice in C++ #include int main() { cout
Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN
Breve Manuale di Riferimento sulla Sintassi Linguaggi e versione aggiornata al 05/02/2004 Sommario Elementi di Base... 2 Dati, Tipi e Dichiarazioni... 2 Tipi di Dato di Base... 2 Tipi di Dato Strutturati...
1 Il Paradigma Imperativo
1 Il Paradigma Imperativo 1.1 Imp : un semplice linguaggio imperativo Abbiamo visto in Fun un meccanismo eager per la valutazione dei parametri di una funzione ed un meccanismo lazy. Una situazione analoga
Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I
Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave
IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale
Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Lettura di dati da input In Java la lettura di dati da input
TABELLA OPERATORI ARITMETICI
ARITMETICA E RICORSIONE Non esiste, in logica, alcun meccanismo per la valutazione di funzioni, operazione fondamentale in un linguaggio di programmazione I numeri interi possono essere rappresentati come
Istruzioni iterative (o cicliche)
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Istruzioni iterative (o cicliche) Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria
PROGRAMMAZIONE STRUTTURATA
PROGRAMMAZIONE STRUTTURATA Programmazione strutturata 2 La programmazione strutturata nasce come proposta per regolamentare e standardizzare le metodologie di programmazione (Dijkstra, 1965) Obiettivo:
Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A
Matematica 13/11/2007 Teoria Compito A Domanda 1 Descrivere, eventualmente utilizzando uno schema, gli elementi funzionali di una CPU. Domanda 2 Java è un linguaggio compilato o interpretato? Motivare
28/02/2014 Copyright V. Moriggia
Informatica per la Finanza 3 Le variabili in VBA Altri I/O 28/02/2014 Copyright 2005-2007 V. Moriggia 1 28/02/2014 3.2 Le variabili in VBA V. Moriggia 1 28/02/2014 3.3 Dichiarazione di variabili in VBA
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa
Algoritmi e basi del C Struttura di un programma
Algoritmi e basi del C Struttura di un programma Marco D. Santambrogio [email protected] Ver. aggiornata al 17 Marzo 2015 Compitini Compitini di INFO: 24 Aprile 2015 4.15pm @ C.G.1 (Ed. 9) 21
Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore
Programma del corso Introduzione agli algoritmi Rappresentazione delle Informazioni Architettura del calcolatore Reti di Calcolatori Elementi di Programmazione Algoritmi e programmi Algoritmo Sequenza
Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche
Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono
Espressioni ed operatori in C
Espressioni ed operatori in C Espressioni Il C è un linguaggio basato su espressioni Una espressione è una notazione che denota un valore mediante un processo di valutazione Una espressione può essere
AA Realizzare un interprete in OCaml
AA 2016-2017 17. Realizzare un interprete in OCaml 1 La stru/ura let x = 3 in x+x;; Parsing Programma (text-file) Rappresentazione Intermedia (IR) Let ( x, Num 3, B_op(Plus, Var x, Var x )) Num 6 Pre/y
VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.
Excel VBA VBA Visual Basic for Application VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole. 2 Prima di iniziare. Che cos è una variabile?
Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro
Laboratorio di Programmazione Lezione 2 Cristian Del Fabbro Prossima lezione GIOVEDÌ 29 OTTOBRE 14:00 Input da tastiera package input; import java.io.*; public class Input { public static void main(string[]
Programmazione Ricorsione
Programmazione Ricorsione Samuel Rota Bulò DAIS Università Ca Foscari di Venezia. Outline Ricorsione Cos è la ricorsione? In matematica... n! = { n (n 1)! se n > 0 1 altrimenti N = {0} {i + 1 : i N} Principio
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER
Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni [email protected] Programmazione prof. Domenico
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Capitolo 5 - Funzioni
Capitolo 5 - Funzioni Divide and conquer Introduzione Costruire un programma da pezzi più piccoli o da singole componenti Questi pezzi più piccoli sono chiamati moduli Ogni singolo pezzo è più facilmente
Linguaggio C - sezione dichiarativa: costanti e variabili
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente
Il linguaggio C. Notate che...
Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione
Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software
Introduzione alla programmazione Algoritmi e diagrammi di flusso F. Corno, A. Lioy, M. Rebaudengo Sviluppo del software problema idea (soluzione) algoritmo (soluzione formale) programma (traduzione dell
Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica
Array in Fortran 90 Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2006/2007 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 1 / 25 Cosa vedremo
= < < < < < Matematica 1
NUMERI NATURALI N I numeri naturali sono: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,... L insieme dei numeri naturali è indicato con la lettera. Si ha cioè: N= 0,1,2,3,4,5,6,7,.... L insieme dei naturali privato
Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl
Approfondimento 2.1 Non è questo il testo dove trattare esaurientemente queste tecniche semantiche. Ci accontenteremo di dare un semplice esempio delle tecniche basate sui sistemi di transizione per dare
INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan
INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan venus.unive.it/borg [email protected] Ricevimento lunedì, prima o dopo lezione 1 Le funzioni in C Le funzioni vengono utilizzate per 3 motivi: Riusabilità
6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
6 - Blocchi e cicli Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it
Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010
Tipi di dati scalari (casting e puntatori) Alessandra Giordani [email protected] Lunedì 10 maggio 2010 http://disi.unitn.it/~agiordani/ I tipi di dati scalari I tipi aritmetici, i tipi enumerativi
Dall algoritmo al programma
Dall algoritmo al programma Il concetto di algoritmo Un algoritmo è una sequenza di passi necessari per risolvere un problema o eseguire una computazione In alcuni casi, lo stesso problema/computazione
MATLAB I/O. Informatica B - A.A. 2012/2013 ACQUISIZIONE DI INPUT DA TASTIERA
MATLAB I/O Informatica B - A.A. 2012/2013 ACQUISIZIONE DI INPUT DA TASTIERA Funzione input valore = input( inserisci un valore ); Matlab stampa a video la stringa inserisci un valore ed aspetta di ricevere
Le Funzioni e la Ricorsione
Aula V Dip. di Matematica G. Castelnuovo Univ. di Roma La Sapienza Le Funzioni e la Ricorsione Igor Melatti Slides disponibili (assieme ad altro materiale) in: http://www.dsi.uniroma1.it/ melatti/programmazione1.2007.2008.html
Il potere espressivo di un linguaggio è caratterizzato da: PROGRAMMA = DATI + CONTROLLO
LINGUAGGI DI PROGRAMMAZIONE Il potere espressivo di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente) quali istruzioni di
Codice binario. Codice. Codifica - numeri naturali. Codifica - numeri naturali. Alfabeto binario: costituito da due simboli
Codice La relazione che associa ad ogni successione ben formata di simboli di un alfabeto il dato corrispondente è detta codice. Un codice mette quindi in relazione le successioni di simboli con il significato
CALCOLO LETTERALE I MONOMI. Il primo tipo di oggetto che incontriamo nel calcolo letterale è il MONOMIO.
CALCOLO LETTERALE Il calcolo letterale è importante perchè ci consente di realizzare un meccanismo di astrazione fondamentale per l'apprendimento in generale. Scrivere, ad esempio, che l'area di un rettangolo
PROGRAMMAZIONE: Le strutture di controllo
PROGRAMMAZIONE: Le strutture di controllo Prof. Enrico Terrone A. S: 2008/09 Le tre modalità La modalità basilare di esecuzione di un programma è la sequenza: le istruzioni vengono eseguite una dopo l
Indice. Prefazione. 3 Oggetti e Java 53
Prefazione xv 1 Architettura dei calcolatori 1 1.1 Calcolatori e applicazioni 1 1.1.1 Alcuni esempi di applicazioni 3 1.1.2 Applicazioni e interfacce 4 1.2 Architettura dei calcolatori 7 1.2.1 Hardware
5 - Istruzioni condizionali
5 - Istruzioni condizionali Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it
Programmazione funzionale
Cognome Nome Matricola Programmazione funzionale 12-09-2014 PROVA SCRITTA 1 2 3 4 5 Somma Il compito ha la durata di 1 ora, per la compilazione attenersi alle seguenti istruzioni: Scrivere in maniera chiara.
ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C
Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria per l Ambiente ed il Territorio Corso di Laurea Specialistica in Ingegneria Civile - Strutture FONDAMENTI DI INFORMATICA 2
Introduzione alla programmazione Esercizi risolti
Esercizi risolti 1 Esercizio Si determini se il diagramma di flusso rappresentato in Figura 1 è strutturato. A B C D F E Figura 1: Diagramma di flusso strutturato? Soluzione Per determinare se il diagramma
Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1
Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1 Cosa è il C++ E un linguaggio di programmazione derivato dal C Può essere usato per modificare il SO Unix e i suoi derivati (Linux)
Insiemistica. Capitolo 1. Prerequisiti. Obiettivi. Gli insiemi numerici di base Divisibilità e fattorizzazione nei numeri interi
Capitolo 1 Insiemistica Prerequisiti Gli insiemi numerici di base Divisibilità e fattorizzazione nei numeri interi Obiettivi Sapere utilizzare opportunamente le diverse rappresentazioni insiemistiche Sapere
RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO
RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO Rappresentazione degli algoritmi Problema Algoritmo Algoritmo descritto con una qualche notazione Programma Defne del procedimento
Istruzioni macchina. Dove sono gli operandi? Ciclo della CPU. Elementi di un istruzione macchina. Rappresentazione delle istruzioni
Istruzioni macchina Linguaggio macchina Insieme delle istruzioni (instruction set) che la CPU puo eseguire Capitolo 10 1 2 Elementi di un istruzione macchina Codice operativo Specifica l operazione da
14 - Metodi e Costruttori
14 - Metodi e Costruttori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:
FUNZIONI RICORSIVE Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento (chiamata) a se stessa. Esempio: Esempi di problemi ricorsivi: 1) Somma dei primi
UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi
UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA Matlab: esempi ed esercizi Sommario e obiettivi Sommario Esempi di implementazioni Matlab di semplici algoritmi Analisi di codici Matlab Obiettivi
LINGUAGGI DI PROGRAMMAZIONE!
LINGUAGGI DI PROGRAMMAZIONE! Il potere espressivo di un linguaggio è! caratterizzato da:! quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente)! quali istruzioni
