1 Variabili Globali Le variabili globali sono variabili che possono venire usate da tutte le funzioni intendiamo definire e dal programma principale stesso.

Slides:



Advertisements
Presentazioni simili
Premessa: si assume di aver risolto (correttamente
Advertisements

Analizzatori Lessicali con JLex
Generazione di Codice Intermedio
Algoritmi e Programmazione
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Semantica Operazionale di un frammento di Java: lo stato.
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Chiara Mocenni - Sistemi di Supporto alle Decisioni I – aa Sistemi di Supporto alle Decisioni I Dynamic Programming Chiara Mocenni Corso di.
Chiara Mocenni - Sistemi di Supporto alle Decisioni I – aa Sistemi di Supporto alle Decisioni I Scelte di consumo Chiara Mocenni Corso di laurea.
Anno accademico Il preprocessore del linguaggio C.
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
Anno accademico Array e puntatori in C.
RICONOSCIMENTO DI SEQUENZE DI EVENTI
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.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Caratteri e stringhe di caratteri
Iterazione enumerativa (for)
Funzioni definite dall’utente
JAVASCRIPT DIFFERENZA TRA JAVASCRIPT E JAVA TAG LO SCRIPT OGGETTI LE CLASSI FUNZIONE GESTORE DI EVENTI ELEMENTI DEL LINGUAGGI è un vero e proprio linguaggio.
Gli Indici di Produttività di Divisia
Algoritmo di Ford-Fulkerson
Algoritmi e strutture Dati - Lezione 7
Allocazione dinamica della memoria
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 PROGRAMMAZIONE II Introduzione alla ricorsione
Algoritmi e Strutture Dati (Mod. B)
Trimr Gauss, tra le altre, fornisce una preziosissima funzione che risulta di estrema utilità nell’ambito matriciale. Questa funzione, chiamata trimr(x,t,b),
LISP.
Introduzione alla programmazione ll
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
nome: sequenza di caratteri usata per denotare un oggetto
Dichiarazioni e tipi predefiniti nel linguaggio C
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Il Linguaggio C.
Le funzioni.
Espressioni condizionali
Normalizzazione Le forme normali certificano che la base di dati soddisfa criteri di qualità che mirano ad evitare le ridondanze e i conseguenti effetti.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Gestione degli errori, delegates,eventi 1. Eccezione – Situazione anomala che potrebbe avvenire durante lesecuzione del programma – try{…}catch(…){…}finally{…}
Presentazione a cura di:
Metodo della moltiplicazione
Elementi di Informatica di base
Radix-Sort(A,d) // A[i] = cd...c2c1
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
IL MASSIMO DI UN ARRAY ESERCIZIO
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
Massimo comun divisore
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Tecnologie di InternetDocument Type Definition Dott. Nicola Dragoni Document Type Definition  Document Type Definition (DTD)  Documento XML valido 
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Sottoprogrammi e funzioni
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
Approfondimenti SQL.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Dal problema al programma – ciclo di sviluppo del software La scrittura del programma è solo una delle fasi del processo di sviluppo di un'applicazione.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Criteri di divisibilità
L’unità frazionaria ESEMPIO Rappresentazione
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi Lezione n°9.
Transcript della presentazione:

1 Variabili Globali Le variabili globali sono variabili che possono venire usate da tutte le funzioni intendiamo definire e dal programma principale stesso. Si tratta di variabili che sono definite al di fuori del corpo di ogni funzione, e che sono accessibili da tutti i blocchi del programma. Per dichiarare una variabile globale, si mette la dichiarazione prima della definizione di ogni funzione. Si osservi che i nostri programmi possono contenere una sola variabile globale con un dato nome, diciamo n, mentre possono contenere molteplici variabili locali con lo stesso nome (n), dato che ciascuna di queste risiede in un differente contesto lessicale. Come vedremo, la funzione SETQ consente di creare variabili globali.

2 In LisP è possibile stabilire il valore di un atomo mediante limpiego di una funzione speciale, la funzione SETQ. Il suo effetto è quello di trasformare il valore del suo primo argomento nel valore del suo secondo argomento. Vediamo alcuni esempi, CG-USER(1): (SETQ ZERO 0) (0) CG-USER(2): (SETQ classifica (milan juve lazio)) (MILAN JUVE INTER) La funzione predefinita SETQ consente lassegnazione simultanea di più variabili, ad esempio, CG-USER(3): (SETQ pigreco 3.14 radicedidue 1.41 a pigreco) (3.14)... naturalmente anche gli altri valori sono stati assegnati. In questultimo caso, la funzione SETQ accetta n coppie di operandi e assegna ad ogni primo elemento di una coppia il valore del secondo elemento corrispondente. La funzione predefinita: SETQ

3 (SETQ string1 '(a b c d e 8 e d c b a)) (SETQ string2 '(Madam Im Adam)) (SETQ string3 '(A man a plan a canal Panama)) (SETQ string4 '(rats live on no evil star)) (SETQ string5 '(Sit on a potato pan otis)) (defun PPal(inlist) (cond ((null inlist) nil). CG-USER(1): (Ppal string3)... CG-USER(2): (car string4) RATS Uno degli impieghi che possiamo fare della funzione SETQ è quello di creare, allinizio del nostro programma, alcune variabili globali, i cui valori possano servirci, ad esempio, come valori di input per il programma stesso. Ad esempio, Come usiamo SETQ

4 Ogni variabile ha uno scope, che possiamo identificare con la porzione di codice nel quale è contenuta la variabile. Le variabili che compaiono fra gli argomenti di una funzione, dato che il loro scope è ristretto al corpo della funzione, sono dette variabili locali. Si consideri lesempio seguente: (defun DOUBLE (n) (* n 2 )) Si osservi che, ad ogni chiamata della funzione DOUBLE, viene creata una nouva variabile locale di nome n. Dentro il corpo della funzione DOUBLE, il nome n si riferisce a questa variabile, ma, fuori dal corpo della funzione, può accadere che n sia il nome di unaltra variabile. Variabili Locali

5 La funzione predefinita: LET La funzione predefinita LET ha come obiettivo la creazione di variabili locali. La sintassi generale della funzione è la seguente, (LET ( (var-1 value-1) (var-2 value-2). (var-n value-n) ) body) Il corpo di LET segue esattamente le stesse regole del corpo di una qualunque funzione.

6 CG-USER(1): (defun MEDIA (x y) (let((sum (+ x y))) (list x y 'media= (/ sum 2.0)))) CG-USER(2): (media 1 10) (1 10 MEDIA= 5.5) Quello che segue è un semplice esempio delluso della funzione LET per la creazione di variabili locali. Si osservi che la variabile SUM è locale, poichè la porzione di codice nella quale è contenuta (il suo scope), non è altro che il corpo della funzione MEDIA... fuori da questa funzione, SUM potrebbe non avere il significato che abbiamo inteso assegnarle. Un esempio per LET

7 Lesempio seguente mostra come sia possibile creare simultaneamente più duna variabile locale, CG-USER(1): (defun duetto (x) (let((star (first x)) (co-star (third x))) (list co-star 'accompagnata 'da star))) CG-USER(2): (duetto '(fred e ginger)) (GINGER ACCOMPAGNATA DA FRED)... con più di una variabile locale

8 La funzione predefinita: LET* La funzione predefinita LET* è simile alla funzione LET ed ha il medesimo obiettivo: la creazione di variabili locali. Lunica differenza fra le due funzioni risiede nel fatto che LET* crea variabili locali in sequenza, consentendo lutilizzazione delle variabili appena create. Ad esempio, Questo metodo per creare varibili locali è utile ogni volta che si intende assegnare un nome a diversi passi intermedi di una lunga computazione. CG-USER(1): (defun cambia-prezzo (old new) (let*((diff (- new old)) (proporzione (/ diff old)) (percentuale (* proporzione 100.0))) (list il prezzo è variato del percentuale %))) CG-USER(2): (cambia-prezzo 5 15) (IL PREZZO E VARIATO DEL %)

9 (I) Differenze fra LET e LET*... CG-USER(1): (defun faulty-size-range (x y z) (let((biggest (max x y z)) (smallest (min x y z)) (r (/ biggest smallest 1.0)) ) (list 'factor 'of r) )) CG-USER(2): (faulty-size-range ) Error: Attempt to take the value of the unbound variable `BIGGEST' Lesempio seguente mostra un uso scorretto della funzione LET per la creazione di variabili locali. Sapreste indicare il perchè lesempio provoca un malfunzionamento del programma?

10 (faulty-size-range ) Enter FAULTY-SIZE-RANGE with inputs 35, 87, and 4 create variables X, Y, and Z, with values 35, 87, and 4 (let...) (max x y z) 87 (min x y z) 4 (/ biggest smallest 1.0) Error! BIGGEST unassigned variable Il tracciato della valutazione di faulty-size-range

11 CG-USER(3): (defun correct-size-range (x y z) (let*((biggest (max x y z)) (smallest (min x y z)) (r (/ biggest smallest 1.0)) ) (list 'factor 'of r) )) CG-USER(4): (correct-size-range ) (FACTOR OF 1.75) (II) Differenze fra LET e LET*... Lesempio seguente mostra come assegnare correttamente i valori a più variabili, sfruttando la capacità della funzione LET* di creare le varibili in sequenza.

12 Il tracciato della valutazione di correct-size-range (correct-size-range ) Enter CORRECT-SIZE-RANGE with inputs 35, 87, and 4 create variables X, Y, and Z, with values 35, 87, and 4 (let*...) (max x y z) 87 create variable BIGGEST, with value 87 (min x y z) 4 create variable SMALLEST, with value 4 (/ biggest smallest 1.0) create variable R, with value (list factor of r) (FACTOR OF 21.75) Result of LET* is (FACTOR OF 21.75) Result of CORRECT-SIZE-RANGE is (FACTOR OF 21.75)

13 Il Crivello di Eratostene Algoritmo che consente di individuare tutti i numeri primi minori di un dato numero Supponiamo di voler trovare tutti i numeri primi minori o uguali ad n. Assai poco formalmente, diciamo che lalgoritmo procede manipolando la lista dei numeri che vanno da 3 a n (il caso in cui n è uguale a 1 ed n uguale a 2,rappresentano i casi di terminazione dellalgoritmo). Ricorsivamente, il problema viene decomposto in problemi più semplici: per liste di lunghezza n-1, n-2, n-3,..., fino alla base della definizione. La ricostruzione della lista, dunque, avviene testando se ogni nuovo elemento che deve essere aggiunto è o meno multiplo di uno almeno dei numeri già presenti, nel qual caso viene omesso dalla ricostruzione e si passa a testare il numero successivo. Il controllo su n rappresenta lultimo passo della computazione. La lista che in tal modo si ottiene non contiene alcun numero che risulti multiplo di altri numeri (nessun numero precedente lo divide)... ogni elemento della lista è un numero primo !

14 CG-USER(1): (funf 7) 0[4]: (FUNF 7) 1[4]: (FUNF 6) 2[4]: (FUNF 5) 3[4]: (FUNF 4) 4[4]: (FUNF 3) 5[4]: (FUNF 2) 5[4]: returned (2) 5[4]: (FUNG 3 (2)) 6[4]: (FUNH 3 (2)) 7[4]: (FUNK 2 3) 7[4]: returned NIL 7[4]: (FUNH 3 NIL) 7[4]: returned NIL 6[4]: returned NIL 5[4]: returned (3 2) 4[4]: returned (3 2) 4[4]: (FUNG 4 (3 2)) 5[4]: (FUNH 4 (3 2)) 6[4]: (FUNK 3 4) 6[4]: returned NIL 6[4]: (FUNH 4 (2)) 7[4]: (FUNK 2 4) 7[4]: returned T 6[4]: returned T 5[4]: returned T 4[4]: returned (3 2) 3[4]: returned (3 2) 3[4]: (FUNG 5 (3 2)) 4[4]: (FUNH 5 (3 2)) 5[4]: (FUNK 3 5) 5[4]: returned NIL 5[4]: (FUNH 5 (2)) 6[4]: (FUNK 2 5) 6[4]: returned NIL... 6[4]: (FUNH 5 NIL) 6[4]: returned NIL 5[4]: returned NIL 4[4]: returned NIL 3[4]: returned (5 3 2) 2[4]: returned (5 3 2) 2[4]: (FUNG 6 (5 3 2)) 3[4]: (FUNH 6 (5 3 2)) 4[4]: (FUNK 5 6) 4[4]: returned NIL 4[4]: (FUNH 6 (3 2)) 5[4]: (FUNK 3 6) 5[4]: returned T 4[4]: returned T 3[4]: returned T 2[4]: returned (5 3 2) 1[4]: returned (5 3 2) 1[4]: (FUNG 7 (5 3 2)) 2[4]: (FUNH 7 (5 3 2)) 3[4]: (FUNK 5 7) 3[4]: returned NIL 3[4]: (FUNH 7 (3 2)) 4[4]: (FUNK 3 7) 4[4]: returned NIL 4[4]: (FUNH 7 (2)) 5[4]: (FUNK 2 7) 5[4]: returned NIL 5[4]: (FUNH 7 NIL) 5[4]: returned NIL 4[4]: returned NIL 3[4]: returned NIL 2[4]: returned NIL 1[4]: returned ( ) 0[4]: returned ( ) ( )

15 (defun FUNF (n) (cond ((<= n 1) nil) ((= n 2) '(2)) (t (FUNG n (FUNF (1- n)))) )) Lalgoritmo di Eratostene (defun FUNG (n ps) (cond ((FUNH n ps) ps) (t (cons n ps)) )) (defun FUNH (n p) (cond ((null p) nil) ((numberp p) (FUNK p n)) ((FUNK (car p) n) t) (t (FUNH n (cdr p))) )) (defun FUNK (n m) (cond ((integerp (/ m n)) t) (t nil) )) La funzione FUNF è la funzione principale; definisce la base (cioè, le condizioni di terminazione per la ricorsione) ed il passo ricorsivo. 1- n e 1+ n sono funzioni predefinite di incremento e decremento di uno. Se il controllo eseguito dalla funzione FUNH è positivo - cioè se n è multiplo di qualche numero già presente nella lista - la funzione FUNG restituisce la lista senza n; restituisce una nuova lista con in testa n, altrimenti. La funzione FUNH, a valori nellinsieme dei booleani {T, NIL}: ritorna il vero, se n è multiplo di qualche numero già presente nella lista, il falso, altrimenti. Il controllo che svolge riguarda il numero n la testa della lista di numeri che, ricorsivamente, è stata decomposta e in parte ricostruita. FUNH esegue il controllo su tutti glli elementi della lista (ricorsione sulla coda). La funzione FUNK, a valori nellinsieme dei booleani {T, NIL}: ritona il vero, se il suo secondo argomento è multiplo del primo; il falso, altrimenti. Si osservi luso di integerp: non vale il metodo tradizionale per testare se n divide m.