Appunti Informatica Classe 3
Appunti Informatica Classe 3
Origini dellInformatica I linguaggi di programmazione Problemi ed Algoritmi Modelli Grafici Introduzione a JAVA La grammatica allorigine dei linguaggi di programmazione Prolog e Lisp La ricorsione La programmazione strutturata Vettori e Matrici
pag. 2 pag. 4 pag. 6 pag. 19 pag. 23 pag. 30 pag.38 pag. 46 pag. 49 pag. 55
Linformatica non
Alla base dell informatica non c il computer ma il pensiero logico , il computer per linformatica uno strumento come il telescopio per lastronomia . Che cosa significa INFORMATICA INFORMATICA = INFORMAZIONE + AUTOMATICA ( nei paesi anglosassoni Computer Science ) Linformazione un dato in grado di aumentare la conoscenza di una realt
DOMANDA
RISPOSTA
CALCOLATORE
INFORMAZIONI
Per informatica si intende linsieme delle scienze e delle tecnologie che riguardano i concetti di :
ORIGINI della INFORMATICA TECNOLOGIA Abaco e calculi Automi meccanici Telai Orologi Calcolatrici meccaniche MATEMATICA Algoritmo Algebra di Boole Assioma di induzione (Peano) Church , Turing , Godel LINGUAGGI Linguaggio naturale Linguaggio macchina Linguaggio alto livello Linguaggio visuale ( icone )
Cobol
Basic , Pascal , PL1 Ada Lisp Prolog C , C++ , Java
ASSEMBLATIVI - assembly
IMPERATIVI
FUNZIONALI - LISP
LOGICI - PROLOG
Programma sorgente
CALCOLATORE Compilatore
Nei linguaggi interpretati nel computer deve essere presente un INTERPRETE del linguaggio ( macchina virtuale ) che legge ed interpreta ( traduce in codice eseguibile dal computer ) le istruzioni .
Programma sorgente
Risultato
CALCOLATORE Interprete
Pi lento Portabilit maggiore
ATTENZIONE : JAVA un linguaggio prima compilato e poi interpretato 1. La compilazione di un file java
Pippo.java Pippo.class
CALCOLATORE
javac
2. Lesecuzione del file , che viene interpretato dalla macchina virtuale
Pippo.class Risultato
CALCOLATORE
java
La cosa risulta automatica utilizzando un editor , ad esempio jcreator .
Problemi
Un problema `e un quesito cui si vuole dare risposta o un obiettivo che si intende perseguire.
Esercizi Per i problemi che seguono si individuino i dati ed i risultati e si dica se il problema ben formulato o meno . Se ben formulato descrrivere un procedimento risolutivo del problema . 1. Dato il perimetro e l'area di un triangolo , determinare le misure dei lati 2. Dato il perimetro e l'area di un rettangolo , determinare la misura del lato ad esso equivalente 3. Dato il perimetro e l'area di un rettangolo , determinare la misura della diagonale 4. Dato il perimetro di un rettangolo , determinarne l'area 5. Dato il perimetro e l'area di un rettangolo , detrminare la misura dei lati 6. Noti i cateti di un triangolo rettangolo calcolre l'altezza relativa alla ipotenusa
ALGORITMO
Chiariamoci le idee Problema un qualsiasi quesito , di natura diversa , a cui dare soluzione. Algoritmo la sequenza di azioni da fare o istruzioni da impartire a qualcuno per risolvere il problema dato. ( procedimento risolutivo ) Programma la traduzione in un linguaggio formalizzato delle azioni definite dallalgoritmo.( visione statica ) Processo linsieme di attivit o azioni svolte dal microprocessore quando si manda in esecuzione il programma ( visione dinamica )
Strategia Operativa Analisi del problema , ovvero individuare lobiettivo da conseguire ed i dati iniziali Soluzione , ovvero individuare le azioni da svolgere sui dati iniziali per ottenere il risultato desiderato. Astrazione : Capacit di generalizzare la soluzione Verifica , ovvero valutazione del risultato ottenuto
ESEMPIO Prendiamo a pretesto il noto problema del contadino che deve attraversare un fiume trasportando un lupo una pecora e un cavolo . Proviamo ad individuare un algoritmo , ovvero scriviamo a parole quello che deve fare il contadino . Trasporta pecora altra sponda Torna indietro Trasporta cavolo altra sponda Carica pecora Torna indietro Scarica pecora
9
Trasporta lupo altra sponda Torna indietro Trasporta pecora altra sponda Altro problema Disponendo di una bilancia a due piatti in grado di valutare se i due pesi sono uguali o diversi individuare quale tra tre monete quella falsa sapendo che la moneta falsa ha un peso diverso rispetto a quelle buone.
Algoritmo risolutivo Peso M1 e M2 ( peso due monete ) Se sono uguali M3 falsa Altrimenti lascio M1 e sostituisco M2 con M3 Se sono uguali M2 falsa Altrimenti M1 falsa. ( Sono sufficienti due pesate per risolvere ) Ancora pi complicato Ora le monete sono quattro , di cui una sola falsa. Algoritmo risolutivo Peso M1 e M2 Se sono uguali sono entrambe buone ( caso 1 ) Altrimenti una delle due falsa.( caso 2 ) Sostituisco M2 con M3 caso 1 : Se sono uguali M4 falsa Altrimenti M3 falsa caso 2 : Se sono uguali M2 falsa Altrimenti M1 falsa
10
Calcolo del MCD Dati due numeri naturali non entrambi nulli trovare il loro MCD ( Massimo Comune Divisore) ESEMPIO : A=25 B=15 MCD = 5 Algoritmo di Euclide a) MCD tra a e 0 a b) MCD tra a e b uguale a MCD tra b ed il resto della divisione tra a e b Proviamo lalgoritmo con a = 25 e b = 15 . MCD (25,15) MCD(15,10) MCD(10,5) MCD(5,0) 5 Soluzione linguaggio naturale Per calcolare il MCD tra a e b : Copia il valore di a in x e quello di b in y . Se y=0 allora x il MCD cercato altrimenti poni in y il resto della divisione tra x e y e sostituisci il contenuto di x con quello di y e ripeti il procedimento. Soluzione pseudo codice X a , Y b Finch Y 0 R resto ( X : Y ) X Y , Y R Fine finche MCD = X Soluzione java ( programma ) public int MCD ( int a , int b) { int x = a ; int y = b ; int r = 0 ; while ( y != 0 ) { r = x%y ; x= y ; y= r ; } return x ; }
11
12
Esercizi per casa Di ogni problema , si provi ad individuare lalgoritmo risolutivo. La stesura dellalgoritmo deve avvenire definendo la sequenza di semplici azioni da svolgere. Dato un numero intero dire se pari o dispari. Dati tre numeri interi dire quale sia il maggiore. Dati tre numeri interi dire se possono essere i lati di un triangolo. Dati due numeri calcolare il loro Massimo Comune Divisore. (MCD) Dati due numeri calcolare il loro Minimo Comune Multiplo. ( mcm ) Dato un numero intero dire se un numero primo. Dati due intervalli chiusi di numeri interi dire se si intersecano. Esempio : [ 2, 6] e [ 4, 9] [ 4,6] 8. Data una bilancia a due piatti , in grado di valutare se i pesi sono uguali o diversi , e tre monete di cui una falsa , individuare la moneta falsa sapendo che ha un peso diverso da quelle buone. 9. Come esercizio precedente ma con quattro monete di cui una falsa. Come esercizio precedente ma con dodici monete di cui una falsa. Come calcolare le radici della equazione di secondo grado ax2+bx+c. Dato un numero intero n calcolare la somma di tutti i numeri compresi tra 1 e n . Dato un numero intero calcolarne il fattoriale. Si ricorda che il fattoriale di un numero ottenuto moltiplicandolo per il prodotto di tutti i numeri interi che lo precedono . Esempio : fatt(4)=4*3*2*1. Dato un numero intero calcolarne il valore della serie di Fibonacci. Si ricorda che la serie di Fibonacci prodotta in questo modo : Fib(0)=0 , Fib(1)=1 e Fib(n) = Fib(n-1)+Fib(n-2) 1. 2. 3. 4. 5. 6. 7.
10.
11.
12. 13.
14.
15. Dire se due regine poste su una scacchiera si trovano sotto presa , ovvero se sono sulla stessa riga o sulla stessa colonna o sulla stessa diagonale. 16. Data una sequenza di quattro numeri interi ( a,b,c,d) e un operatore di ordinamento , sort( x , y ) , che inverte la posizione dei due numeri se y < x , si trovi il modo di ordinare in modo crescente i quattro numeri della sequenza.
pos num
A 3
B 5
C 4
D 7 sort ( b,c )
pos num
A 3
B 4
C 5
D 7
13
Diagrammi di Flusso
A=1 B=4
STOP
14
Quanto valgono le variabili I , SOMMA e N al termine del flusso ? Quale dei problemi precedenti risolve il seguente flusso ? Esempi di pseudocodice ( linguaggio di comodo )
1. Nella ipotesi che a = 8 , b = 2 , c = 12 , quale valore verr stampato utilizzando il seguente pseudocodice se a > b allora massimo = a altrimenti massimo = b se c > massimo allora massimo = c stampa massimo 2. Nella ipotesi che i = 1 , a = -4 , n = 6 , quale sequenza di stampa verr visualizzata. 3. Finch (i < n) and (i > a) or ( i=2) fai i=i+2 n=n1 a=a+2 stampa a stampa i stampa n fine fai
4. Si supponga di disporre della funzione resto ( a , b ) in grado di valutare il
resto della operazione di divisione a : b . esempi : a = resto ( 9 , 4 ) b = resto ( 11, 3 ) Finch (i < 13) fai r = resto ( i , 3 ) se r=0 stampa i i = i +1 fine fai (a=1) ( b = 2)
15
Esercizi di LOGICA
La Pila A contiene dischi di tre colori : Verde , Rosso, Blu. Le Pila B e C sono inizialmente vuote. Spostando un solo disco alla volta , da una pila ad unaltra pila , fare in modo che la Pila A contenga solo dischi verdi la Pila B solo dischi rossi e la Pila C solo dischi blu.
PILA A
PILA B
PILA C
Disponete di un cerino , di una miccia lunga 130 centimetri e di una forbice . Vi noto che la miccia brucia in 24 minuti . Vi chiudono in una stanza , senza orologio , e vi chiedono di uscirne dopo 21 minuti . Come operate per risolvere il problema ? Calcolare l area del disegno sapendo che la distanza d = 1 metro
d
16
PROBLEMI INTRATTABILI e IRRISOLTI Un problema INTRATTABILE se la sua complessit computazionale lo rende di fatto non risolvibile , IRRISOLTO se non esiste o non si ancora individuato un algoritmo di risoluzione . ESEMPI Calcolare le radici della eseguente equazione diafontea : 3x2y + 5y2 7xy + x 3 = 0 ( IRRISOLTO )
Problema del commesso viaggiatore ( INTRATTABILE ) Problema dei colori ( IRRISOLTO ) Dato un numero a 1000000000000 cifre verificare se primo ( INTRATTABILE )
COMPLESSITA' COMPUTAZIONALE La complessit computazionale di un algoritmo la quantit di operazioni ( e di tempo ) necessarie per produrre la soluzione . Indicando con n la dimensione dei dati da trattare si hanno le seguenti complessit :
17
ESEMPI di COMPLESSITA'
Trovare il massimo tra n numeri > O ( n ) Cercare un numero tra n numeri ordinati O ( lg2 n ) La torre di Hanoi O ( 2n ) Trovare un numero in una matrice n x n O ( n2 ) Commesso viaggiatore O ( n ! )
+ efficiente ( veloce )
- efficiente ( lento )
)> O(n!)
18
MODELLI GRAFICI Sono modelli utilizzati in ambito INFORMATICO che consentono una
rappresentazione grafica di un algoritmo FLOW CHART DIAGRAMMA di TRACCIA DIAGRAMMA delle CLASSI DIAGRAMMA di SEQUENZA MODELLO ER
Il Flow Chart ( o diagramma di flusso ) un modello che utilizza dei simboli grafici di tipo geometrico , i simboli sono :
19
Facciamo subito un esempio per capire come usare e leggere i flow chart
Se ( cond1 ) { Istr1 Istr2 } Altrimenti { Istr3 } Istr4 Istr2 Istr1 Istr3 VERA
cond1
FALSA
Istr4
VERA a<7
FALSA
b=b+1 a=a-1
b=a+b
a=a+b
20
START
Leggi A e B
X=A Y=B
NO
Y=0
SI
MCD = X
R=A%B
X=Y
Stampa MCD
Y=R STOP
Molto pi utile il Diagramma di traccia , da usare per analizzare gli errori di programmazione , usatelo per analizzare ( debug ) i vostri programmi . Consente di rappresentare levoluzione dinamica del programma , ovvero i valori assunti dalle variabili quando il programma va in esecuzione . Il diagramma di traccia una tabella in cui sono presenti le seguenti colonne Colonna delle istruzioni Una colonna per ogni variabile presente nellalgoritmo Una colonna per ogni condizione presente nellalgoritmo Una colonna per le operazioni di input ed una per quelle di output
21
Vediamo un esempio per chiarirci le idee. Calcolo del MCD Leggi a Leggi b X a Yb Finch Y 0 R resto ( X : Y ) X Y , Y R Fine finche MCD = X Stampa MCD
istruzione
Leggi a Leggi b X a Yb Y 0 R resto (X:Y) X Y Y R Y 0 R resto (X:Y) X Y Y R Y 0 MCD = X Stampa MCD
a 9
b 4
Y 0
MCD
INPUT OUTPUT 9 4
22
Introduzione a JAVA Java un linguaggio orientato agli oggetti (OOP) di tipo general purpose ovvero atto allo sviluppo di programmi di ogni genere , con le seguenti caratteristiche : Multi piattaforma e Portabilit Grafica indipendente dalla piattaforma ( awt , swing ) Linguaggio ad oggetti puro Forte controllo dei tipi Supporto a : programmazione web sicurezza robustezza internazionalizzazione Gestione ottimale del multithread ( multitasking ) Librerie molte ricche Come si dichiarano i dati Nella stesura di un programma necessario utilizzare dei dati , i dati sono definiti variabili o attributi . La dichiarazione di una variabile ha la seguente forma : Tipo Tipo ESEMPI : int int voto ; numero = 4 ; // dichiarazione ed inizializzazione float lato, altezza ; nomeVariabile ; nomeVar1 , nomeVar2 ;
23
Un dato pu essere come una costante , ovvero non modificabile ; anteponendo il modificatore final , ovvero : final int PIPPO = 12 ; GLI OPERATORI in JAVA Per modificare i dati sono necessari gli operatori , vediamo i pi significativi :
Le tabelle di VERITA
24
L Operatore di assegnamento Dopo aver svolto delle operazioni si desidera assegnare il risultato ad una variabile , la cosa possibile utilizzando loperatore = , che assegna alla variabile il risultato . ESEMPIO : int a = 2 ; int somma = 3 + a ; STRUTTURA DI UN PROGRAMMA IN JAVA /** * Primo esempio di programma in java * autore : S. Cecchin * data: 10/10/2009 */ public class Prova { public static void main(String[] args){ System.out.println("Ciao Mondo" ); } }
25
Istruzioni di controllo Sono le istruzioni che consentono di controllare e condizionare lesecuzione del programma .
Listruzione if semplice Consente di valutare una condizione o pi condizioni definite da una espressione logica e di eseguire un blocco di istruzioni se la condizione soddisfatta.
if ( condizione ) { istr 1; istr2; .. } Listruzione if else Consente di valutare una condizione o pi condizioni definite da una espressione logica e di eseguire un blocco di istruzioni o un blocco di istruzioni alternative in funzione della condizione . Se vera si svolge il blocco dopo if , se falsa si esegue il blocco dellelse. if ( condizione ) { istr 1; istr2; }
26
else
{ istr3; }
Listruzione if nidificata Viene utilizzata quando le condizioni da verificare sono molte e per ogni situazione si vuole attivare una diversa strategia . if( condizione1 ) { blocco1 ; } else if ( condizione2 ) { blocco2; } else if ( condizione3 ) { blocco3; } else { blocco4 } Listruzione switch Si usa quando si deve valutare il valore di una variabile che pu assumere una serie prestabilita e nota di valori . switch ( variabile ) { case valore1 : blocco1 ; break ; case valore2 : blocco2; break; default : } bloccoN ;
27
Cicli in java
Ciclo while : while ( condizione) { blocco di istruzioni }
FALSE
cond
Ciclo for
FALSE
cond
incr
Ciclo do while : do
Blocco istruzioni
VERO
cond
FALSE 28
valiniziale ; while( condizione ) { . incremento } Due istruzioni particolari da usare nei cicli break , consente di uscire dal ciclo continue , si passa allinizio del ciclo successivo
< inizio ciclo > continue break < fine ciclo >
29
Grammatiche
Un linguaggio di programmazione una notazione comprensibile ad un calcolatore per rappresentare un algoritmo. Un linguaggio formata da : Alfabeto , insiemo finito e non vuoto di simboli ( a, b , 3 ,4 ,? >... ) Lessico , insieme di stringhe (parole) formate con elementi dell'alfabeto ( casa , for , +23,3) Frase , insieme di parole appartenenti ad un definito lessico posti in sequenza secondo una opportuna sintassi ( o grammatica) ( if ( a>9 ) .. ) Un programma un algoritmo scritto in un linguaggio di programmazione Usando il concetto di frase, sintassi e semantica illustrate in precedenza . Un programma una frase scritta in un linguaggio di programmazione ed analizzabile dal punto di vista LESSICALE : si verifica che ogni parola della frase sia corretta SINTATTICO: si verifica la forma linguistica in cui scritto SEMANTICO : si valuta il significato della frase ( che sia di senso compiuto ) ESEMPIO : Mario andato a squola ( errore lessicale) Io ho andato ( corretto lessicalmente , errore sintattico ) La penna sta mangiando ( corretto lessicalmente e sintatticamente , errore semantico ) La sintassi specifica come costruire un programma La semantica definisce il significato del programma Per i linguaggi di programmazione la grammatica deve essere espressa in modo formale, non ambiguo. Gli strumenti pi usati sono
1.notazione Backus-Naur (Backus-Naur Form, BNF)
2.diagrammi sintattici
Simboli primitivi o simboli terminali : . 0 1 2 3 4 5 6 7 8 9 Tramite < ... > si denota un costrutto o simbolo non terminale Il simbolo ::= significa mentre il simbolo | significa oppure, quindi <cifra> 0 oppure 1 oppure 2 ... <sequenza-cifre> una cifra oppure una cifra seguita da una sequenza di cifre <numero-reale> una sequenza di cifre seguita da . e da una sequenza di cifre Per distinguere le diverse occorrenze dello stesso costrutto si usa il pedice <numero-reale> ::= <sequenza-cifre>1 . <sequenza-cifre>2
30
Vt: alfabeto di simboli terminali denotati con simbolo terminale Vn: alfabeto di simboli non terminali denotati con <simbolo non terminale> P: insieme di regole di produzione
<simbolo-non-terminale> ::= stringa1 | stringa2 | ... | stringan dove stringai denota una qualsiasi sequenza finita di simboli terminali e non terminali
31
BNF estesa
X ::= [a]b equivale a X ::= b|ab X ::= {a}n b equivale a X ::= b|ab|aab| ripetendo a fino a n volte
X ::= {a}b equivale a X ::= b|ab|aab| ripetendo a un numero di volte indefinito Equivale ad avere nella grammatica la produzione X ::= b | aX (ricorsiva)
Diagrammi sintattici
32
di frasi ( programma ): dallo scopo applicare ripetutamente le produzioni fino ad ottenere una stringa composta di soli simboli terminali
Convalida
di frasi ( compilatore ): data una stringa composta di soli terminali, verificare se c una sequenza di produzioni che la genera a partire dallo scopo
Il
sintattico
33
Grammatica ambigua
<expr> ::= x | y | z | <expr> | <expr> + <expr> | <expr> * <expr>
Esempio di Grammatica ambigua: genera lo stesso elemento con due alberi sintattici:
la grammatica di un linguaggio di programmazione non deve essere ambigua
34
Linguaggio
un
BNF il fatto che non ci possono essere due variabili con lo stesso nome, cio che una variabile deve essere dichiarata una (ed una sola) sola volta
ANALIZZATORI
analisi lessicale: controlla che i simboli utilizzati appartengano all'alfabeto analisi grammaticale: verifica il rispetto delle regole grammaticali analisi sintattica contestuale: verifica restrizioni di tipo contestuale
35
Costruire la GRAMMATICA Definire una grammatica in grado di produrre le parole casa e ciao nel suo vocabolario ( la soluzione non unica ) ,si utilizzi : Vt = ( a, i, o, s, c)
36
Verifica
o
64932 ottenibile? <num_pari>::= <num><num_pari> ::=<num>2 ::= <num>32 ::= <num>932 ::=<num>4932 ::= 64932 ESERCIZI per casa
1. Scrivere una grammatica che generi tutte e sole le stringhe che iniziano per a e finiscono per c . ( ovvero ac , aaabc , abcbc .. ) Vt = ( a , b , c ) 2. Scrivere una grammatica che generi tutte e sole le stringhe del tipo : ac , aacc , aaabccc Vt = ( a , b , c ) 3. Dato il seguente diagramma sintattico , con S come scopo : ( con uguale numero di a e di c )
37
DOMANDE Dire quali sono i simboli terminale e quelli non terminali Dire quali delle seguenti stringhe appartengono alla grammatica b , a * b , a:b , a*ba:a , a Tradurre i diagrammi in BNF , ovvero definire la grammatica
PROLOG e LISP
Affrontiamo ora due particolari linguaggi di programmazione : PROLOG PROgrammazione LOGica LISP LISt Programm Sono linguaggi che richiedono un atteggiamento mentale diverso ma risultano performanti se applicati in alcuni ambiti , ad esempio in quello della intelligenza artificiale. La PROGRAMMAZIONE LOGICA ( PROLOG ) E' una programmazione DICHIARATIVA . Il programma consiste in una serie di fatti ( conoscenze ) e di regole ( conseguenze logiche ) , dopo aver fornito regole e fatti si interroga il programma per avere delle risposte.
38
Ogni sistema intelligente si basa sulla capacit di : utilizzare le conoscenze ( premesse note ) operare secondo logica deduttiva ( inferenza logica )
CARATTERI PARTICOLARI :
_ qualsiasi , X \= Y , X == Y
Come si scrive un programma prolog Serve la capacit di scomporre il problema individuando gli elementi base della realt che si vuole descrivere Risolvere i casi semplici con regole semplici e banali Definire le regole generali che descrivono il problema Con regole logiche sfruttando le regole generali precedenti costruire le soluzioni dei casi meno semplici Sfruttare la propria LOGICA DEDUTTIVA
ESEMPI di PROLOG La realt che vogliamo descrivere la seguente : Socrate un uomo Cecchin un dio Tutti gli uomini sono mortali Il figlio di un uomo un uomo Un dio un figo
39
PROGRAMMA uomo(socrate). dio(cecchin). mortale(X):-uomo(X). uomo(figlio(Y)):-uomo(Y). figo(X):-dio(X). // fatto // fatto // regola // regola // regola (a) (b) (c) (d) (e)
Risposta : uomo(socrate) (d) uomo(figlio(socrate)) (d) uomo(figlio(figlio(socrate))) ( c ) mortale(figlio(figlio(socrate))) Siamo partiti da un fatto ( non confutabili ) e per INFERENZA LOGICA si dimostrato che VERO . ? figo( CHI ) Risposta : ( chi figo )
Proviamo ora a descrivere una realt matematica , ovvero l'insieme dei numeri naturali e le operazionei di somma e prodotto sui naturali . Facciamo una premessa , l insieme dei numeri naturali
N e un opportuna successione di simboli secondo la seguente tabella :
0 1 2 3 ... n
s(s(..s(0))))..)
40
Definiamo i numeri naturali : a) naturale(0). b) naturale( s(N) ) :- naturale(N). Le operazioni c) somma(0,X,X). 0+X = X
d) somma(s(X),Y,S(Z)) :- somma(X,Y,Z). e) prodotto(0,Y,0). 0*Y= 0 f) prodotto(s(X),Y,Z) :- ptodotto(X,Y,W) , somma(Y,W,Z). L'unica cosa da chiarire la regola ( f ) , vediamo di spiegarla : X* Y=W Y + W = Z Y + ( X * Y ) = Z Y + XY = Z Y ( 1 + X ) = Z Y + S(X) = Z Interroghiamo il programma con le seguenti domande : ? naturale(X). X=0 ancora ? s X= s(0) ancora ? s X=s(s(0)) ..... ? somma( s(0), s(s(0)),X ) ( quanto fa 1 + 2 ) X= s(s(s(0))) ancora ? s NO ? somma( X, s(0),s(s(s(0)))). ( quanto fa 3-1 ) X= s(s(0)) ? somma( X , s(s(0)),s(0)) ( quanto fa 1-2 ) NO ( non esisono naturali negativi ) ( quali sono i naturali )
41
? somma( X, Y , s(s(0))) ( quali sono coppie X Y che sommati danno 2 ) X=0 , Y = s(s(0)). Ancora ? S X= s(0) , Y= s(0) Ancora ? S X = s(s(0)) , Y = 0 Ancora ? S NO ? prodotto( s(s(0)) , s(s(s(0))) ) ( quanto fa 2 per 3 ) ? prodotto ( X , Y , s(s(s(s(s(s(o)))))) ) , somma( X,Y , s(s(s(s(s(0))))) ) Esistono due naturali X e Y la cui somma 5 ed il cui prodotto 6 . ? prodotto( s(s(0)) , X , H ) , somma( H , Y , s(s(s(s(s(0))))) ) , somma( s(0) , Y , X ) Risolve il sistema 2X + Y = 5 X Y=1
ESEMPI da studiare
42
2 ) Secondo
FATTI insegna(ricci,inglese,classe_2A). insegna(giorgi,matematica,classe_1B). insegna(rippi,italiano,classe_1B). frequenta(giorgio,classe_1B). frequenta(maria,classe_2A). frequenta(mirco,classe_1B). REGOLE insegnante_di(Professore,Ragazzo):- insegna(Professore,_,Classe), frequenta(Ragazzo,Classe). Se faccio questa domanda cosa ottengo : insegnante_di(ricci,Ragazzo). insegnante_di(Professore,giorgio). insegnante_di(Professore,Ragazzo). Sapreste costruire una REGOLA per conoscere i compagni di classe compagno_classe ( X,Y):- frequenta(X,C), frequenta(Y,C). Sapreste costruire una REGOLA per conoscere tutti gli insegnanti di una classe insegnante_classe ( X , C ):- insegna(X,_,C); Sapreste costruire una REGOLA per conoscere tutti gli insegnanti di una materia insegnante_materia ( X , M ):- insegna(X,M,_);
puo_rubare(tony,X)
43
La PROGRAMMAZIONE FUNZIONALE ( LISP ) Si basa sul concetto matematico di funzione e sfrutta la composizione di pi funzioni per produrre la soluzione . La programmazione funzionale risulta elegante nella forma , sintetica in scrittura e chiara .
Una trattazione completa di questo linguaggio richiederebbe lo studio delle liste e delle principali operazioni su di esse . Limitiamoci ad alcuni esempi in cui si sfrutta la ricorsione come strumento di soluzione dei problemi . Esempio di programmazione FUNZIONALE Proviamo a descrivere la funzione RESTO . a ) RESTO ( X , Y ) X se X < Y b) RESTO ( X , Y ) RESTO ( X Y , Y ) se X > =Y Vediamo se funziona : RESTO ( 3 , 5 ) ( a ) = 3 , infatti 3 / 5 fa 0 con resto di 3 RESTO ( 10 , 4) ( b) RESTO ( 6 , 4 ) (b) RESTO ( 2 , 4 ) (a) = 2 Proviamo a descrivere la funzione MCD . a) MCD ( X , 0 ) X b) MCD ( X; Y ) MCD ( Y , RESTO ( X, Y ) ) se Y \= 0
44
Si osservi che la soluzione proposta sfrutta la definizione della funzione RESTO data precedentemente . Vediamo con un esempio come funziona : MCD ( 45 , 30 ) MCD ( 45 , 30 ) MCD ( 30 , RESTO(45,30)) MCD ( 30 , RESTO(15,30)) MCD ( 30 , 15 ) MCD(15 , RESTO(30 , 15 )) MCD ( 15 , RESTO(15 , 15 )) MCD ( 15 , RESTO( 0 , 15) ) MCD( 15 , 0 ) 15
45
LA RICORSIONE
Quando la soluzione di un problema si ottiene ricorrendo al problema stesso , ovvero qundo un algoritmo ( metodo ) fa riferimento a se stesso . In altre parole all'interno dell'algoritmo ( metodo ) c' una chiamata a se stesso. Ci sono problemi naturalmente ricorsivi Ogni problema ricorsivo anche iterativo , non viceversa
Vediamo un esempio per chiarirci le idee. Calcolare la potenza an , con a \= 0 . SOLUZIONE ITERATIVA an = 1 se n = 0 n a = a a a a a .. se n\=0 SOLUZIONE RICORSIVA an = 1 an = an-1 a se n = 0 se n\=0
potenza ( a , n ) { int ris = 1; if( n = = 0 ) ris ; else for(int i = 1 ; i <= n ; i++ ) ris = ris * a ; return ris; }
potenza ( a , n ) { int ris = 1 ; if( n = = 0 ) ris ; else ris = a * potenza(a , n-1) ; return ris ; }
La soluzione ricorsiva risulta pi sintetica e chiara concettualmente , richiede sempre due cose : a) La legge ( o funzione ) di chiusura o terminazione , ovvero an = 1 se n = 0 b) La funzione ricorsiva che porta verso la chiusura , ovvero an = a an-1 se n\=0 Vediamo in pratica come funziona la soluzione ricorsiva con l' esempio 23 , a = 2 n = 3 . 23 (b) 2 22 (b) 2 2 2 (b) 2 2 2 20 (a) 2 2 2 1 = 8 Temporalmente le cose avvengono seconda la sequenza : 23 2 22 2 2 2 20 1 2 4 8
46
SVANTAGGI Bisogna possedere una logica mentale ricorsiva , non sempre naturale L'esecuzione del programma richiede un maggior spazio di memoria ( stack overflow ) L'esecuzione del programma richiede pi tempo ( pi lento ) ESERCIZI sulla RICORSIONE 1. Deteminare la soluzione ricorsiva che consente di calcolare il prodotto di due numeri interi . 2. Deteminare la soluzione ricorsiva che consente di calcolare il fattoriale di un numero. 3. Determinare la soluzione ricorsiva che consente di calcolare la somma degli interi compresi tra N e M ( estermi compresi ) 4. Determinare la soluzione ricorsiva che consente di invertire una stringa. 5. Determinare la soluzione ricorsiva che consente di calcolare la sequenza di Fibonacci , si ricorda che la sequenza di Fibonacci la seguente : Fib(0) = 1 Fib(1) = 1 Fib(2) = Fib(1) + Fib(0) Fib(n) = Fib(n-1) + Fib(n-2) // in genere se n> 1 6. Determinare la soluzione ricorsiva che consente di valutare se un numero intero primo.
47
SOLUZIONI di PROBLEMI RICORSIVI // Conta le cifre da cui composto un numero static long contaCifre(int n) { if(n<10) return 1; else return 1 + contaCifre(n/10) ; } // Calcola il Fattoriale di un numero static long fatt(int n) { if(n==0) return 1; else return n*fatt(n-1); } // Calcola il MCD tra due numeri in modo ricorsivo static int mcdRicorsivo(int n, int m) { if(m == 0) return n; else return mcdRicorsivo(m,n%m); } // Valuta se un numero primo static boolean primo(int n) { return primoAux(n,2); } // Funzione ausialiare alla precedente static boolean primoAux(int n,int a) { if(n%a==0) return n==a; else return primoAux(n,a+1); } // Calcola il valore di Fibonacci di un numero static long fib(int n) { if (n==0 || n == 1 ) return 1 ; else return fib(n-1)+fib(n-2) ; } // Come il precedente ma usando un algoritmo pi efficiente static long fibVeloce(int n) { if(n==0 || n==1) return 1 ; else return fibAux(0,1,1,n); } // Funzione ausiliare alla precedente static long fibAux(long penultimo,long ultimo,int x, int n) { if (n == x) return penultimo + ultimo; else return fibAux(ultimo,penultimo+ultimo,x+1,n); }
48
// Come calcolare la potenza di un numero static double potenzaVeloce(double x, int n) { if(n==0) return 1.0 ; else if(n %2 == 0) return quadrato(potenzaVeloce(x,n/2)); else return x*potenzaVeloce(x,n-1); } // Come calcolare il quadrato di un numero static double quadrato(double x) { return x*x; }
La Programmazione Strutturata
Un progrmma si definisce strutturato quando risulta scritto in modo ordinato senza inutili ripetizioni di linee di codice ed di facile lettura e comprensione . Il programma suddiviso in procedure ( aree autonome di codice ) , ed ogni procedura risolve un particolare problema. Le procedure possono ricevere degli attributi e tornare dei dati.
Fase di ANALISI
La cosa pi importante nella stesura de programma la fase di analisi del problema . La gran parte del tempo viene dedicata a questo aspetto. Una cattiva analisi , o peggio la sua assenza , generano soluzioni inadeguate poco strutturate e con forti limitazioni di sviluppo . Le metodologie che si possono utilizzare nella fase di analisi sono sostanzialmente tre :
49
Alla base della programmazione strutturata c' il concetto di sottoprogramma che viene concretizzato nella stesura di una procedura o metodo in java . Un metodo , che un sottoprogramma , viene scritto una sola volta ma pu essere utilizzato pi volte dal main o da altri sottoprogrammi. SINTASSI di un metodo public static tipo NomeMetodo ( lista ) { attributi locali corpo return esito // se non void } BNF tipo = void | int | double | float | char | String | array | Object lista = { attributo , } attributo = void | tipo variabile esito = variabile | valoreNumerico ESEMPIO public static int Somma ( int a , int b) { int somma = a+b ; return somma }
50
Vediamo un semplice esempio di programmazione strutturata , il calcolo delle radici di una equazione di secondo grado : ax2 + bx + c = 0
51
ESERCIZI da SVOLGERE in CLASSE 1. Definire con metodologia TOP DOWN i sottoproblemi che una coppia di sposi con un bimbo piccolo deve risolvere per assistere ad un concerto. 2. Applicando la metodologia BOTTOM UP dire quali problemi si possono risolvere disponendo della soluzione ai seguenti sottoproblemi So cercare una cosa So usare una cosa 3. Utilizzando la metodologia TOP DOWN calcolare l'area della seguente figura
4. Si vuole costruire n programma in grado di svolgere le operazioni di somma e prodotto tra frazioni , ad esempio 2/3 ( + 2/5 ) . Quali sottoproblemi bisogna risolvere ?
52
4. Scrivere un programma in grado di operare con le stringhe , ovvero di : Concatenare due stringhe ( al + ba = alba ) Estrarre la sottostringa ( 3 caratteri) ( classe cla ) Cercare una sottostringa in una stringa ( cercare st in asta )( boolean ) 5. Scrivere un programma che calcoli quanto vi costano o vi rendano NUMGIORNI di interessi in banca sapendo che se siete debitori vi viene applicato un tasso di interesse annuo di TASSODEBITO e se siete in credito vi viene applicato un tasso di interesse annuo pari a TASSOCREDITO. ( ad esempio si pu supporre che TASSODEBITO = 12% e TASSOCREDITO = 1% ) 6. Costruire una libreria Matematica che contiene una serie di metodi con le seguenti caratteristiche : Calcolare il valore assoluto di un numero Calcolare la radice quadrata di un numero ( la sua parte intera ) , ovvero la radice di 38 6 4 Calcolare lelevamento a potenza di un numero intero , ad esempio 5 Calcolare la parte intera di un numero , ad esempio 5,67 5 Tradurre in numero intero un numero ricevuto come Stringa , ovvero 23 23 7. Scrivere un programma che sia in grado di calcolare la resistenza equivalente di un circuito elettrico composto da solo bipoli passivi ( ovvero con sole resistenze ).
53
Gli Attributi GLOBALI Vengono inizializzati una sola volta Restano allocate per l'intera durata del programma ( Area Dati )
Vengono inizializzati ogni volta che si esegue il metodo o ambito Restano allocati solo per la durata del metodo ( Area Stack)
REGOLE di VISIBILITA'
1. Un attributo visibile nell'ambito in cui definito e negli ambiti che gli sono interni 2. Se esistono due o pi attributi con lo stesso nome si fa riferimento a quello pi vicino ( pi locale )
54
Vettori e Matrici
Diamo per prima cosa la definizione di array ( vettore ) e di matrice . Definizione : Struttura in grado di contenere pi oggetti dello stesso tipo ( omogenei ) A una dimensione ( vettore ) [2,4,6] A pi dimensioni ( matrice ) |2 5 6| |3 6 7| |2 0 2|
Per poter usare un array si deve : 1.Dichiarare l array 2.Definire la sua dimensione 3.Riempirlo di valori
ESEMPI int[] i // vettore di interi String[] nomi // vettore di stringhe float[] numeri // vettore di float Studente[] classe // vettore di oggetti , prossimo anno
ESEMPI i = new int [4] nomi = new String [10] numeri = new float[6]
55
Un vettore pu essere dichiarto e la sua dimensione pu essere definita in modo sintetico con una sola istruzione
Si pu dichiarare e definire dimensione e valori contenuti con una sola istruzione int[] i = { 1 , 4 , -3 } Equivale a : int[] i i = new int [3] i[0] = 1 i[1] = 4 i[2] = -3 Chiarimenti importanti int[] v = new int [3] v { null , null , null }
int[] v = { 3 , -5 , 7 } v { 3 , -5 , 7 } Gli indici per identificare i singoli elementi dell'array partono dal valore 0 ed arrivano al valore numElementi 1 , ovvero un vettore di dimensione 5 avr un indice che si muove da 0 a 4 . Convenzione usate per gli indici : v[ i ] v[ i ] [ j ] v[ i ] [ j ] [ k ]
LA MATRICE
E un vettore bidimensionale int scacchiera[] [] scacchiera = new int [3] [3] ATTENZIONE scacchiera [RIGA ] [COLONNA ]
56
col 0
Rig 0 Rig 1 Rig 2
col 1
col 2
schacchiera [ 1 ] [ 2 ] = 5
/* * Definizione di un vettore , acquisizione della sua dimensione * e caricamento dei valori da tastiera, sua visualizzazione. **/ class CreaInserisci { static InOut tastiera = new InOut(); public static void main(String[] args) { // definizione del vettore e della sua dimensione int[] vett; int dim; // acquisizione della dimensione dim=dimensioneVett(); // carico i valori vett=carica(dim); // visualizzo il vettore visualizza(vett); } static int dimensioneVett(){ System.out.println("Inserire dimensione vettore :"); return tastiera.leggiInt(); }
57
static int[] carica(int quanti){ int[] a = new int[quanti]; for(int i=0;i<quanti;i++) { System.out.println("Inserire valore " + i + " : "); a[i]= tastiera.leggiInt(); } System.out.println("Fine Inserimento"); return a; }
static void visualizza(int[] a) { System.out.print("VETTORE : "); for(int i=0; i<a.length; i++) System.out.print(a[i]+" "); System.out.println(" "); } } VEDIAMO UN ESEMPIO in JAVA ( matrice ) /* * Esercizio che cre una matrice 3X3 di numeri interi in grado di calcolare * la somma delle singole righe e delle singole colonne **/ public class Matrice { static final int dim = 3; static int[][] mat = new int[dim][dim]; // la matrice
58
sommaDiagonali(); } public static void crea(){ for(int i = 0 ; i < dim ; i++) for(int j = 0 ; j < dim ; j++) mat[i][j] = (int)(Math.random()*100); } public static void visualizza(){ for(int i = 0 ; i < dim ; i++){ for(int j = 0 ; j < dim ; j++) System.out.print(" "+mat[i][j]); System.out.println(" "); } } public static void sommaRighe(){ for(int i = 0 ; i < dim ; i++){ int somma = 0; for(int j = 0 ; j < dim ; j++) somma+=mat[i][j]; System.out.println("Riga "+i+" = "+ somma); } } public static void sommaColonne(){ for(int j = 0 ; j < dim ; j++){ int somma = 0; for(int i = 0 ; i < dim ; i++) somma+=mat[i][j]; System.out.println("Colonna "+j+" = "+ somma); } } }
59
P
< >
60
Analisi della complessit La ricerca pu essere sequenziale, ovvero si passano in rassegna tutti gli elementi del vettore dal primo all'ultimo . Il numero di confronti a cui siamo costretti varia , ovvero :
Caso
Ottimo (primo) Medio Pessimo(ultimo)
Numero Confronti
1 n/2 n
Se si opera su un vettore ordinato si pu utilizzare l'algoritmo di Ricerca Binaria , suddividendo ogni volta in due il vettore si riduce la complessit , ovvero :
Caso
Ottimo (primo) Medio Pessimo(ultima divisione)
Numero Confronti
1 Tra 2 e Lg2 n+1 Lg2 n+1
Se si opera un confronto tra i due metodi nella ipotesi che n = 15 si vede che : Caso Medio Ricerca Sequenziale n/2 = 7 Caso Pessimo Ricerca Binaria Lg2 n+1 = Lg2 16 = 4 Come si pu vedere dall'esempio la possibilit di operare su un vettore ordinato riduce di molto la complessit di calcolo delle operazioni di ricerca . Quindi il caso di vedere come si possa ordina un vettore . Algoritmi di ORDINAMENTO L'ordinamento di un vettore pu essere crescente o decrescente. Tutti gli algoritmi di ordinamento consentono di ordinare un vettore ma con efficienze diverse . + EFFICIENTE - COMPLESSO + VELOCE
61
Algoritmi di orinamento 1. 2. 3. 4. Per minimi o massimi successivi o per selezione Per Inserimento A Bolla ( BubbleSort ) monodirezionale o bidirezionale Quick Sort ( ricorsivo )
Gli algoritmi sono in ordine cresce nte di efficienza . Per minimi o massimi successivi o per selezione : Si scorre il vettore trovando il valore minore ( o maggiore) e lo si pone in prima posizione , si scorre il vettore partendo dalla seconda posizione trovando il valore minore ( o maggiore) e lo si pone in seconda posizione .. si prosegue finch si sono ordinati tutti gli elementi del vettore , semplice ma poco efficiente. Per Inserimento : Si opera con lo stesso criterio con cui si ordinano le carte da gioco , pi efficiente ma obbliga a shiftamenti . A Bolla ( BubbleSort ) : La bolla una coppia di valori contigui ( vicini ) , si considera la bolla composta dal primo e secondo elemento invertendoli se non sono ordinati , quindi si considera la bolla tra il secondo ed il terzo elemento invertendoli se non sono ordinati , si opera in questo modo finch si consira la bolla composta dal penultimo ed ultimo elemento . Se nel corso dell'ultimo scorrimento dell'intero vettore non si sono verificati scambi tra gli elementi delle bolle il vettore ordinato altrimenti si opera un ulteriore scorrimento . Obbliga a molti scambi ma efficiente. Quick Sort ( ricorsivo ) : Fondamentalmente si opera una suddivisione in due sottovettori e si itera il procedimento di suddivisione finch non si formano vettori di un solo elemento . Molto veloce ed efficiente ma complesso da impementare in termini di codice .
62