UNIVAC Il primo calcolatore concepito ed impostato come

  • Slides: 69
Download presentation
UNIVAC Il primo calcolatore concepito ed impostato come prodotto commerciale, fu realizzato da Eckert

UNIVAC Il primo calcolatore concepito ed impostato come prodotto commerciale, fu realizzato da Eckert e Mauchly (gli stessi costruttori dell’ENIAC) per l’Ufficio Centrale di Statistica degli Stati Uniti. Sommario L’algebra di Boole Fu teorizzata dal matematico inglese George Boole (1810 1864) nel lavoro “Analisi Matematica della Logica”, pubblicato nel 1847. Include un insieme di operazioni su variabili logiche (o variabili booleane), che possono assumere i due soli valori true e false, indicati da 1 e 0. Le tecniche sviluppate nell’algebra booleana possono essere applicate all’analisi ed alla progettazione dei circuiti elettronici, poiché essi sono realizzati con dispositivi che possono assumere solo due stati. Gli algoritmi Su insiemi di costanti e variabili logiche possono essere definite funzioni che hanno esse stesse la caratteristica di assumere due soli valori. La definizione di una funzione booleana può essere effettuata per mezzo di una tabella di verità, verità che indica il valore della funzione in corrispondenza di ogni possibile configurazione dei valori degli argomenti. Le funzioni booleane possono essere scritte e manipolate anche con metodi algebrici, dato un insieme di funzioni (o operazioni) elementari tramite le quali poter esprimere ogni altra funzione. Analisi e programmazione Algoritmi e loro proprietà Esempi di algoritmi Costanti e variabili, istruzioni, proposizioni e predicati I linguaggi per la formalizzazione di algoritmi I diagrammi a blocchi Gli algoritmi iterativi I vettori La pseudocodifica Introduzione ai linguaggi di programmazione di alto livello 1

Gli algoritmi 2

Gli algoritmi 2

Analisi e programmazione 1 Tramite un elaboratore si possono risolvere problemi di varia natura:

Analisi e programmazione 1 Tramite un elaboratore si possono risolvere problemi di varia natura: emissione di certificati anagrafici, gestione dei c/c di un istituto di credito, prenotazioni ferroviarie, etc. Il problema deve essere formulato in modo opportuno, perché sia possibile utilizzare un elaboratore per la sua soluzione Per analisi e programmazione si intende l’insieme delle attività preliminari atte a risolvere problemi utilizzando un elaboratore, dalla formulazione del problema fino alla predisposizione dell’elaboratore Scopo dell’analisi: definire un algoritmo Scopo dell’analisi: Scopo della programmazione: tradurre l’algoritmo in un programma 3

Analisi e programmazione 2 Algoritmo elenco finito di istruzioni che specificano le operazioni eseguendo

Analisi e programmazione 2 Algoritmo elenco finito di istruzioni che specificano le operazioni eseguendo le quali un operatore umano risolve una classe di problemi Un particolare problema della classe viene risolto utilizzando l’apposito algoritmo sui dati che lo caratterizzano Un algoritmo non può essere eseguito direttamente dall’elaboratore Programma “ricetta” che traduce l’algoritmo ed è direttamente comprensibile, pertanto eseguibile, da parte di un elaboratore Linguaggio di programmazione linguaggio rigoroso che permette la formalizzazione di un algoritmo in un programma 4

Analisi e programmazione 3 Esempio Problema: Effettuare un accredito su un c/c bancario Soluzione:

Analisi e programmazione 3 Esempio Problema: Effettuare un accredito su un c/c bancario Soluzione: Utilizzare un programma Soluzione: che serva per predisporre il calcolatore all’accredito di una qualunque cifra su un qualunque c/c; cifra da accreditare e numero di c/c sono i dati caratteristici del problema Algoritmo + dati Uomo + Calcolatrice Risultati Programma + dati Elaboratore Risultati Analogie tra le azioni che devono essere eseguite da un operatore umano e, in modo automatico, tramite un elaboratore 5

Le fasi del procedimento di analisi e programmazione Problema ANALISI Relazioni tra problema, analisi,

Le fasi del procedimento di analisi e programmazione Problema ANALISI Relazioni tra problema, analisi, algoritmo, programmazione, programma, dati ed elaborazione Algoritmo PROGRAMMAZIONE Programma ELABORAZIONE Dati Risultati 6

Algoritmo: definizione Algoritmo deriva dal nome del matematico arabo Al Khuwarizmi, vissuto nel IX

Algoritmo: definizione Algoritmo deriva dal nome del matematico arabo Al Khuwarizmi, vissuto nel IX secolo d. C. ; esempi di algoritmo sono presenti su tavolette babilonesi risalenti al 1800 1600 a. C. Un algoritmo è una successione di istruzioni o passi che definiscono le operazioni da eseguire sui dati per ottenere i risultati; un algoritmo fornisce la soluzione ad una classe di problemi Lo schema di esecuzione di un algoritmo specifica che i passi devono essere esecuzione eseguiti in sequenza, salvo diversa indicazione esplicita Ogni algoritmo è concepito per interagire con l’ambiente esterno per acquisire dati e comunicare messaggi o risultati; i dati su cui opera ogni Dati singola istruzione sono forniti dall’esterno o sono frutto di istruzioni eseguite Algoritmo in precedenza. Ambiente esterno Risultati o messaggi 7

Esempio 1 Il gioco dell’undici Problema: Undici fiammiferi sono disposti su un tavolo Problema:

Esempio 1 Il gioco dell’undici Problema: Undici fiammiferi sono disposti su un tavolo Problema: Il primo giocatore (A) può raccogliere da 1 a 3 fiammiferi Il secondo giocatore (B) ne raccoglie a sua volta 1, 2 o 3 I giocatori alternano le loro mosse finché sul tavolo non ci sono più fiammiferi Il giocatore che è costretto a raccogliere l’ultimo fiammifero è il perdente Algoritmo: strategia vincente per il giocatore A che gioca per Algoritmo: primo prima mossa: A raccoglie 2 fiammiferi mosse successive: se B raccoglie k fiammiferi (k 3), allora A raccoglie 4 k fiammiferi 8

Esempio 2 Ordinamento di un mazzo di carte Problema: Sia dato un mazzo da

Esempio 2 Ordinamento di un mazzo di carte Problema: Sia dato un mazzo da 40 carte da ordinare in modo Problema: che le cuori precedano le quadri, che a loro volta precedono fiori e picche; le carte di uno stesso seme sono ordinate dall’asso al re Algoritmo: Si suddivida il mazzo in 4 mazzetti, ciascuno costituito da tutte le carte dello stesso seme Si ordinino le carte di ciascun mazzetto dall’asso al re Si prendano nell’ordine i mazzetti delle cuori, quadri, fiori e picche 9

Esempio 3 Radici di equazioni di 2° grado Problema: Calcolo delle radici reali dell’equazione

Esempio 3 Radici di equazioni di 2° grado Problema: Calcolo delle radici reali dell’equazione di secondo Problema: grado ax 2+bx+c=0 Algoritmo: 1) 2) 3) 4) 5) 6) 7) Acquisire i coefficienti a, b, c Calcolare = b 2 4 ac Se <0 non esistono radici reali, eseguire l’istruzione 7) Se = 0, x 1= x 2 = b/2 a, poi eseguire l'istruzione 6) Porre x 1 = ( b + )/2 a, x 2 = ( b )/2 a Comunicare i valori x 1, x 2 Fine 10

Proprietà degli algoritmi 1 Affinché una “ricetta”, un elenco di istruzioni, possa essere considerato

Proprietà degli algoritmi 1 Affinché una “ricetta”, un elenco di istruzioni, possa essere considerato un algoritmo, devono essere soddisfatti i seguenti requisiti: Finitezza: ogni algoritmo deve essere finito, cioè composto da un numero finito di istruzioni, ciascuna delle quali deve essere eseguita in tempo finito ed un numero finito di volte Generalità: ogni algoritmo deve fornire la soluzione per una classe di problemi; deve pertanto essere applicabile a qualsiasi insieme di dati appartenenti all’insieme di definizione o definizione dominio dell’algoritmo e deve produrre risultati che appartengono all’insieme di arrivo o insieme di arrivo codominio Non ambiguità: devono essere definiti in modo chiaro i passi successivi da eseguire; devono essere evitati paradossi, contraddizioni ed ambiguità; il significato di ogni istruzione deve essere univoco per chiunque esegua l’algoritmo 11

Proprietà degli algoritmi 2 Inoltre, sono proprietà essenziali (se non caratterizzanti) degli algoritmi. .

Proprietà degli algoritmi 2 Inoltre, sono proprietà essenziali (se non caratterizzanti) degli algoritmi. . . la correttezza. . . e l’efficienza Un algoritmo è corretto se perviene alla soluzione del compito cui è preposto, senza difettare di alcun passo fondamentale Un algoritmo è efficiente se perviene alla soluzione del problema nel modo più veloce possibile e/o usando la minor quantità di risorse fisiche, fatta salva la correttezza 12

Il gioco dell’undici (continua…) La strategia vincente per il gioco dell’undici è un algoritmo

Il gioco dell’undici (continua…) La strategia vincente per il gioco dell’undici è un algoritmo in quanto. . . …è finito, perché termina sempre dopo 6 mosse …è generale, perché permette al giocatore A di vincere, qualunque sia la strategia utilizzata da B …è non ambiguo, perché tutte le situazioni possibili sono prese in considerazione e per ognuna sono ben specificate le azioni da compiere 13

Ancora sugli algoritmi. . . Un algoritmo deve poter essere eseguito da chiunque, senza

Ancora sugli algoritmi. . . Un algoritmo deve poter essere eseguito da chiunque, senza che l’esecutore sia stato necessariamente coinvolto nella formulazione del problema o nella descrizione del metodo risolutivo Gli algoritmi devono essere formalizzati per mezzo di appositi linguaggi, dotati di strutture linguistiche garantiscano precisione e sintesi I linguaggi naturali non soddisfano questi requisiti, infatti. . . …sono ambigui: ambigui la stessa parola può assumere significati diversi in contesti differenti (pesca è un frutto o un’attività sportiva) …sono ridondanti: lo stesso concetto può essere espresso in molti modi ridondanti diversi, ad es. “somma 2 a 3”, “calcola 2+3”, “esegui l’addizione tra 2 e 3” 14

Costanti e variabili 1 I dati su cui opera un algoritmo sono costanti e

Costanti e variabili 1 I dati su cui opera un algoritmo sono costanti e costanti variabili Un dato è costante quando il suo valore non può essere aggiornato durante l’esecuzione dell’algoritmo, né cambia per esecuzioni diverse Una variabile è una coppia <nome, valore>: può essere immaginata come una scatola sulla quale è scritto un nome e che può contenere un valore Valore Nome Rappresentazione di una variabile 15

Costanti e variabili 2 Il valore di una variabile deve appartenere all’insieme di definizione,

Costanti e variabili 2 Il valore di una variabile deve appartenere all’insieme di definizione, definizione su cui si opera mediante regole opportune, specifiche dell’insieme Data una variabile <x, v>, x è il nome della variabile e v è il nome suo valore attuale; le variabili sono indeterminate in fase di attuale definizione dell’algoritmo, ma corrispondono a valori ben precisi durante ogni esecuzione Esempio: Esempio Nell’algoritmo di risoluzione delle equazioni di 2° grado, a, b, c non corrispondono a nessun valore finché non si esegue l’algoritmo per trovare le soluzioni di una specifica equazione, ad esempio x 2 9 x 4=0: in fase di esecuzione, a=1, b= 9, c= 4; nell’istruzione =b 2 4 ac, è la variabile che contiene il valore del discriminante 16

Assegnazione 1 L’istruzione di assegnazione definisce il valore attuale di una assegnazione variabile, che

Assegnazione 1 L’istruzione di assegnazione definisce il valore attuale di una assegnazione variabile, che resta inalterato fino all’assegnazione successiva L’assegnazione si rappresenta con il simbolo “ ”: nome di variabile espressione che si legge “assegna alla variabile nome di variabile il valore di espressione” espressione ; l’espressione a destra di è costituita da variabili, costanti e operatori L’assegnazione viene così eseguita: si valuta l’espressione a destra di , sostituendo ai nomi di variabile i loro valori attuali; il risultato deve appartenere all’insieme di definizione della variabile a sinistra di il valore calcolato diventa il nuovo valore della variabile il cui nome appare a sinistra di 17

Assegnazione 2 I nomi delle variabili possono essere scelti in modo arbitrario, ma è

Assegnazione 2 I nomi delle variabili possono essere scelti in modo arbitrario, ma è opportuno selezionare nomi significativi del contenuto della variabile Viceversa, è necessario rispettare la regola dell’ordinamento: regola dell’ordinamento Quando una variabile appare, in un’assegnazione, a destra di , deve essere già istanziata cioè le deve essere già stato assegnato un valore 18

Assegnazione 3 Esempi a b+c 10 a x x+3 6 4 b c Prima

Assegnazione 3 Esempi a b+c 10 a x x+3 6 4 b c Prima dell’assegnazione Dopo l’assegnazione 14 x Prima dell’assegnazione 17 x Dopo l’assegnazione 19

Le istruzioni 1 Istruzioni operative, che producono risultati Istruzioni operative Istruzioni di controllo, controllo

Le istruzioni 1 Istruzioni operative, che producono risultati Istruzioni operative Istruzioni di controllo, controllo che controllano il verificarsi di condizioni specificate e, in base al risultato del controllo, determinano il flusso di istruzioni da eseguire Istruzioni di salto, che alterano il normale flusso di esecuzione delle salto istruzioni di un algoritmo, specificando quale sia la successiva istruzione da eseguire nelle istruzioni di salto condizionato, condizionato l’effettiva esecuzione del salto è condizionata al verificarsi di una ipotesi specificata l’istruzione di salto incondizionato produce sempre un salto incondizionato Istruzioni di ingresso/uscita, ingresso/uscita che specificano come debba essere effettuata una trasmissione di dati o messaggi fra l’algoritmo e l’ambiente esterno Istruzioni di inizio/fine esecuzione, esecuzione che indicano l’inizio/la fine dell’algoritmo 20

Le istruzioni 2 Esempio: Esempio Calcolo delle radici di equazioni di 2° grado “acquisire

Le istruzioni 2 Esempio: Esempio Calcolo delle radici di equazioni di 2° grado “acquisire i coefficienti a, b, c” è un’istruzione di lettura (ingresso) “calcolare =b 2 4 ac” è un’istruzione operativa “se =0, x 1=x 2= b/2 a” è un’istruzione di controllo, infatti l’assegnazione x 1=x 2= b/2 a viene eseguita solo se =0 “comunicare i valori x 1, x 2” è un’istruzione di scrittura (uscita) “eseguire l'istruzione 6)” è un’istruzione di salto incondizionato “se <0 eseguire l’istruzione 7)” è un’istruzione di salto condizionato, perché 7) è la prossima istruzione da eseguire solo se <0 21

Proposizioni e predicati 1 Una proposizione è un costrutto linguistico del quale si può

Proposizioni e predicati 1 Una proposizione è un costrutto linguistico del quale si può asserire o negare la veridicità Esempi “Roma è la capitale della Gran Bretagna” falsa “ 3 è un numero intero” vera Il valore di verità di una proposizione è il suo essere vera o falsa valore di verità Una proposizione è un predicato se il suo valore di verità dipende predicato dall’istanziazione di alcune variabili Esempi “la variabile età è minore di 30” “la variabile base è maggiore della variabile altezza” 22

Proposizioni e predicati 2 La valutazione di un predicato è l’operazione che permette di

Proposizioni e predicati 2 La valutazione di un predicato è l’operazione che permette di determinare se il predicato è vero o falso, sostituendo alle variabili i loro valori attuali I valori vero e valori logici o vero falso sono detti falso valori logici booleani Proposizioni e predicati possono essere espressi concisamente per mezzo degli operatori relazionali: operatori relazionali = (uguale) (diverso) > (maggiore) < (minore) (maggiore o uguale) (minore o uguale) I predicati che contengono un solo operatore relazionale sono detti semplici 23

Proposizioni e predicati 3 Dato un predicato p, il predicato not p, detto opposto

Proposizioni e predicati 3 Dato un predicato p, il predicato not p, detto opposto negazione logica di logica p, ha i valori di verità opposti rispetto a p Dati due predicati p e q, la congiunzione logica di logica p e q, p and q, è un predicato vero solo quando p e q sono entrambi veri, e falso in q tutti gli altri casi Dati due predicati p e q, la disgiunzione logica di logica p e q, p or q, è un predicato falso solo quando p e q sono entrambi falsi, e vero in tutti gli altri casi I predicati nei quali compare almeno uno fra gli operatori logici not, not and, composti and or sono detti or La tavola di verità di un predicato composto specifica il valore del verità predicato per ognuna delle possibili combinazioni dei suoi argomenti 24

Proposizioni e predicati 4 Esempio Le tavole di verità per i predicati p and

Proposizioni e predicati 4 Esempio Le tavole di verità per i predicati p and q e p or q sono le seguenti: p q p and q p or q falso falso vero falso vero vero 25

Proposizioni e predicati 5 Esempio not (base > altezza) not è vero solo quando

Proposizioni e predicati 5 Esempio not (base > altezza) not è vero solo quando il valore di base è minore o uguale del valore di altezza età > 30 and età < 50 and è vero solo quando il valore di età è compreso tra 30 e 50 base > altezza or base > 100 or è vero quando il valore di base è maggiore del valore di altezza, o quando il valore di base è maggiore di 100, o quando entrambe le condizioni sono verificate 26

I linguaggi per la formalizzazione di algoritmi 27

I linguaggi per la formalizzazione di algoritmi 27

I diagrammi a blocchi 1 Il linguaggio dei diagrammi a blocchi è un possibile

I diagrammi a blocchi 1 Il linguaggio dei diagrammi a blocchi è un possibile formalismo per la descrizione di algoritmi; il diagramma a blocchi, o flowchart, è una rappresentazione grafica dell’algoritmo Un diagramma a blocchi definisce il flusso di operazioni da flusso eseguire per realizzare la trasformazione dai dati iniziali ai risultati, descritta nell’algoritmo Un particolare simbolo grafico, un blocco elementare, elementare è associato ad ogni tipo di istruzione; ovvero, ogni istruzione è rappresentata all’interno di un blocco la cui forma grafica è determinata dal tipo di istruzione I blocchi sono collegati tra loro da linee di flusso, munite di flusso frecce, che indicano il susseguirsi di azioni elementari 28

I diagrammi a blocchi 2 begin leggi/scrivi A X Blocco iniziale Blocco azione Blocco

I diagrammi a blocchi 2 begin leggi/scrivi A X Blocco iniziale Blocco azione Blocco di lettura/scrittura vero end scrivi X Blocco finale C falso Blocco di controllo Blocco di scrittura Blocchi elementari 29

I diagrammi a blocchi 3 Un diagramma a blocchi è un insieme di blocchi

I diagrammi a blocchi 3 Un diagramma a blocchi è un insieme di blocchi elementari composto da: un blocco iniziale un blocco finale un numero finito n (n 1) di blocchi di azione e/o di blocchi di lettura/scrittura un numero finito m (m 0) di blocchi di controllo 30

I diagrammi a blocchi 4 L’insieme dei blocchi elementari che costituiscono un algoritmo deve

I diagrammi a blocchi 4 L’insieme dei blocchi elementari che costituiscono un algoritmo deve soddisfare le seguenti condizioni: ciascun blocco di azione o di lettura/scrittura ha una sola freccia entrante ed una sola freccia uscente ciascun blocco di controllo ha una sola freccia entrante e due frecce uscenti ciascuna freccia entra in un blocco oppure si inserisce in un’altra freccia ciascun blocco è raggiungibile dal blocco iniziale raggiungibile il blocco finale è raggiungibile da qualsiasi altro blocco raggiungibile Un blocco B è raggiungibile a partire da un blocco A, se esiste raggiungibile una sequenza di blocchi X 1, X 2, …, Xn, tali che A=X 1, B=Xn e Xi, i=1, …, n 1, Xi è connesso con una freccia a Xi+1 31

I diagrammi a blocchi 5 begin Diagramma a blocchi dell’algoritmo per il calcolo delle

I diagrammi a blocchi 5 begin Diagramma a blocchi dell’algoritmo per il calcolo delle radici dell’equazione di 2° grado ax 2 + bx + c = 0 Leggi a, b, c delta b 2 4 ac Vero delta<0 Vero Falso delta=0 Falso x 1 b/2 a x 1 ( b+sqrt(delta))/2 a x 2 b/2 a x 2 ( b sqrt(delta))/2 a scrivi x 1 e x 2 scrivi “non ci sono radici reali” end 32

Schemi di composizione 1 Fra tutti i possibili schemi di flusso ne esistono alcuni

Schemi di composizione 1 Fra tutti i possibili schemi di flusso ne esistono alcuni che sono detti schemi fondamentali di composizione Schema di sequenza: è uno schema elementare o uno schema sequenza: di sequenza begin A S 1, S 2, …, Sn schemi di flusso end 33

Schemi di composizione 2 Schema di selezione: un blocco di controllo subordina l’esecuzione di

Schemi di composizione 2 Schema di selezione: un blocco di controllo subordina l’esecuzione di due possibili schemi di flusso al verificarsi di una condizione Nel primo caso, lo schema S viene eseguito solo se la condizione C è vera; se C è falsa, non viene eseguita alcuna azione Nel secondo caso, viene eseguito solo uno dei due schemi Sv o Sf, in dipendenza del valore di verità della condizione 34

Schemi di composizione 3 Schema di iterazione: si itera l’esecuzione di un dato schema

Schemi di composizione 3 Schema di iterazione: si itera l’esecuzione di un dato schema iterazione: di flusso Nel primo caso, S può non venire mai eseguito, se la condizione C è subito falsa; nel secondo caso, S viene eseguito almeno una volta Quando lo schema S viene eseguito finché la condizione C si mantiene vera si parla di iterazione per vero; si ha un’ iterazione vero per falso quando S viene eseguito finché C è falsa per falso 35

Schemi di composizione 4 Gli schemi di flusso sono… …aperti quando consentono una sola

Schemi di composizione 4 Gli schemi di flusso sono… …aperti quando consentono una sola esecuzione di una sequenza di blocchi elementari …chiusi quando permettono più di un’iterazione della sequenza chiusi di blocchi Gli schemi di sequenza e di selezione sono aperti, lo schema di iterazione è chiuso 36

Gli algoritmi iterativi 1 Accade spesso che, per risolvere un problema, un certo insieme

Gli algoritmi iterativi 1 Accade spesso che, per risolvere un problema, un certo insieme di operazioni debba essere eseguito un dato numero di volte Esempio: Calcolare la somma di tre Esempio interi consecutivi Note: Note La variabile somma è un contenitore somma di somme parziali, finché non si ottiene la somma totale richiesta La soluzione del problema viene raggiunta eseguendo azioni simili per un numero opportuno di volte 37

Gli algoritmi iterativi 2 Il ciclo o loop è uno schema di flusso per

Gli algoritmi iterativi 2 Il ciclo o loop è uno schema di flusso per descrivere, in modo conciso, situazioni in cui uno gruppo di operazioni deve essere ripetuto più volte La condizione di fine ciclo viene verificata ogni volta che si esegue il ciclo; se la condizione assume valore vero (falso), le istruzioni vengono reiterate, altrimenti si esce dal ciclo La condizione di fine ciclo può essere verificata prima o dopo l’esecuzione dell’iterazione Le istruzioni di inizializzazione, inizializzazione assegnano valori iniziali ad alcune variabili (almeno a quella che controlla la condizione di fine Ciclo controllo in testa Ciclo controllo in coda ciclo) 38

Gli algoritmi iterativi 3 Problema: Calcolare la somma di tre Problema interi consecutivi Note:

Gli algoritmi iterativi 3 Problema: Calcolare la somma di tre Problema interi consecutivi Note: Note La fase di inizializzazione riguarda la somma e l’indice del ciclo Il controllo di fine ciclo viene effettuato in coda 39

Gli algoritmi iterativi 4 Un ciclo è definito quando è noto a priori il

Gli algoritmi iterativi 4 Un ciclo è definito quando è noto a priori il numero di iterazioni: definito un ciclo definito è detto anche enumerativo Un contatore del ciclo tiene memoria di quante iterazioni sono state effettuate; può essere utilizzato in due modi: incremento del contatore: il contatore viene inizializzato ad un contatore valore minimo (ad es. 0) e incrementato ad ogni esecuzione del ciclo; si esce dal ciclo quando il valore del contatore eguaglia il numero di iterazioni richieste decremento del contatore: contatore il contatore viene inizializzato al numero di iterazioni richiesto e decrementato di uno ad ogni iterazione; si esce quando il valore del contatore raggiunge 0 40

Gli algoritmi iterativi 5 Un ciclo è indefinito quando non è possibile conoscere a

Gli algoritmi iterativi 5 Un ciclo è indefinito quando non è possibile conoscere a priori quante volte verrà eseguito La condizione di fine ciclo controlla il valore di una o più variabili modificate da istruzioni che fanno parte dell’iterazione Comunque, un ciclo deve essere eseguito un numero finito di volte, cioè si deve verificare la terminazione dell’esecuzione del ciclo 41

Gli algoritmi iterativi 6 Problema: Calcolo della media di Problema un insieme di numeri;

Gli algoritmi iterativi 6 Problema: Calcolo della media di Problema un insieme di numeri; non è noto a priori quanti sono i numeri di cui deve essere calcolata la media I numeri vengono letti uno alla volta fino a che non si incontra un x = 0, che segnala la fine dell’insieme 42

I vettori 1 Le variabili, definite come coppie <nome, valore>, sono scalari Una coppia

I vettori 1 Le variabili, definite come coppie <nome, valore>, sono scalari Una coppia <nome, insieme di valori > è una variabile vettore o array e può essere immaginata come un contenitore diviso in scomparti; ciascun scomparto può contenere un valore, detto elemento o componente del vettore Ciascuna componente è individuata dal nome del vettore, seguito dal relativo numero progressivo, racchiuso fra parentesi tonde: l’indice del vettore La dimensione di un vettore è il numero dei suoi elementi dimensione I vettori sono particolarmente utili per collezionare dati fra loro correlati, sui quali devono essere effettuate le stesse operazioni 43

I vettori 2 v(1) v(2) v(3) v(4) Vettore v, costituito dai 4 elementi v(1),

I vettori 2 v(1) v(2) v(3) v(4) Vettore v, costituito dai 4 elementi v(1), v(2), v(3), v(4) L’utilizzo di variabili vettoriali, in un algoritmo, presuppone la dichiarazione esplicita della loro dimensione La dimensione del vettore costituisce un limite invalicabile per la selezione delle componenti del vettore Esempio: v(100) asserisce che il vettore v è costituito da 100 Esempio elementi; possono essere selezionati v(12), v(57), v(89), ma non v(121) o v(763), che non esistono 44

I vettori 3 Esempio: Calcolare il vettore somma di due vettori di uguale Esempio

I vettori 3 Esempio: Calcolare il vettore somma di due vettori di uguale Esempio dimensione n 5 7 a(1) a(2) 6 9 0 a(3) 1 3 a(4) 5 b(1) b(2) b(3) 11 16 1 8 c(2) c(3) c(4) c(1) b(4) 45

I vettori 4 Esempio: algoritmo per calcolare Esempio il vettore somma di due vettori

I vettori 4 Esempio: algoritmo per calcolare Esempio il vettore somma di due vettori Note: Note L'utilità dei vettori consiste nell’impiego della tecnica iterativa in modo da effettuare la stessa operazione su tutti gli elementi del vettore Usando la variabile contatore di un ciclo come indice degli elementi di un vettore è possibile considerarli tutti, uno alla volta, ed eseguire su di essi l’operazione desiderata 46

I vettori 5 Esempio: Esempio Algoritmo per il calcolo del massimo elemento di un

I vettori 5 Esempio: Esempio Algoritmo per il calcolo del massimo elemento di un vettore vero 47

La pseudocodifica 1 La pseudocodifica è un linguaggio per la descrizione di algoritmi PASCAL

La pseudocodifica 1 La pseudocodifica è un linguaggio per la descrizione di algoritmi PASCAL like La descrizione di un algoritmo mediante pseudocodifica si compone di due parti. . . la dichiarazione delle variabili usate nell’algoritmo dichiarazione delle variabili la descrizione delle azioni dell’algoritmo descrizione delle azioni 48

La pseudocodifica 2 Tipo delle variabili Il tipo di una variabile indica l’insieme dei

La pseudocodifica 2 Tipo delle variabili Il tipo di una variabile indica l’insieme dei valori che possono tipo essere assegnati a quella variabile Su costanti e variabili di un tipo è possibile effettuare le operazioni che sono proprie di quel tipo e tutte le operazioni di confronto (utilizzando gli operatori relazionali) Sono permessi i seguenti 4 tipi: integer, integer real, real boolean, boolean string q 49

La pseudocodifica 3 integer: sono le variabili cui possono essere assegnati numeri interi; integer

La pseudocodifica 3 integer: sono le variabili cui possono essere assegnati numeri interi; integer le costanti di tipo integer sono numeri interi, ad es. 1, 3, 150 real: sono le variabili cui possono essere assegnati numeri razionali; real le costanti real possono essere rappresentate in notazione decimale, con un “. ” che separa la parte intera dalla parte decimale (ad es. , 5. 17, 12. 367, 123. , 0. 005) o in notazione scientifica (23. 476 E+2=2347. 6, 456. 985 E 4=0. 0456985) boolean: boolean sono le variabili cui possono essere assegnati i valori logici; le costanti logiche sono true e true false string q: sono le variabili cui possono essere assegnate parole (o stringhe) stringhe costituite da q caratteri; le costanti string q sono costituite da parole di q caratteri racchiusi tra apici (che non fanno parte della costante); ad es. , ‘FABIO’ è una costante string 5, ‘+’ è una costante string 1 e ‘ 124’ string 3 50

La pseudocodifica 4 Dichiarazione delle variabili La dichiarazione delle variabili è un elenco, preceduto

La pseudocodifica 4 Dichiarazione delle variabili La dichiarazione delle variabili è un elenco, preceduto dalla parola var, delle variabili sulle quali l’algoritmo opera var Le variabili sono suddivise per tipo: quelle dello stesso tipo sono separate l’una dall’altra da una “, ”; l’elenco delle variabili dello stesso tipo è seguito dai “: ” e dall’indicazione del tipo; gli elenchi di variabili di tipo diverso sono separati dal “; ”, l’ultimo elenco è seguito da un “. ” Esempio: Esempio var i, j, a(20): integer; var integer p, q: real; real nome: string 20; 20 sw: boolean 51

La pseudocodifica 5 Descrizione delle azioni Gli schemi di flusso fondamentali sono descritti utilizzando

La pseudocodifica 5 Descrizione delle azioni Gli schemi di flusso fondamentali sono descritti utilizzando convenzioni linguistiche: ad ogni schema di composizione corrisponde una convenzione linguistica La descrizione di un algoritmo deve soddisfare le seguenti regole: a) b) c) d) e) La prima azione dell’algoritmo è preceduta dalla parola begin; begin L’ultima azione dell’algoritmo è seguita dalla parola end; end L’azione di lettura è rappresentata dalla parola read; read L’azione di scrittura è rappresentata dalla parola write; write Lo schema di sequenza di n flussi S 1, S 2, …, Sn è rappresentato da S 1 ; S 2 ; … Sn ; 52

La pseudocodifica 6 S, Sf, Sv, sono schemi f) Gli schemi di selezione sono

La pseudocodifica 6 S, Sf, Sv, sono schemi f) Gli schemi di selezione sono rappresentati come: g) Gli schemi di iterazione sono rappresentati come: 53

La pseudocodifica 7 Esistono convezioni linguistiche alternative in relazione a particolari schemi di flusso

La pseudocodifica 7 Esistono convezioni linguistiche alternative in relazione a particolari schemi di flusso Esempio: Ciclo enumerativo Esempio Nel caso che il valore di “incremento” sia 1, la parte “step incremento” della frase for. . . for endfor può essere omessa endfor 54

La pseudocodifica 8 Esempio: Esempio Algoritmo per il calcolo del vettore somma di due

La pseudocodifica 8 Esempio: Esempio Algoritmo per il calcolo del vettore somma di due vettori di numeri razionali var a(100), b(100), c(100): real; var real i, n: integer begin read n; read for i for from 1 from to n to do do read a(i), b(i); read c(i) a(i) + b(i); write c(i) write endfor end 55

La pseudocodifica 9 Esempio: Algoritmo per il calcolo del massimo elemento di un Esempio

La pseudocodifica 9 Esempio: Algoritmo per il calcolo del massimo elemento di un Esempio vettore di numeri razionali var max, v(100): real; var real i, n: integer begin read n; read for i for from 1 from to n to do read v(i) read endfor max v(1); for i for from 2 from to n to do if max < v(i) if then max v(i) then endif endfor write max write end 56

La pseudocodifica 10 Esempio: Algoritmo per il calcolo delle radici di equazioni di Esempio

La pseudocodifica 10 Esempio: Algoritmo per il calcolo delle radici di equazioni di Esempio 2° grado var x 1, x 2, a, b, c, delta: real. var real begin read a, b, c; read delta b 2 4 ac; if delta <0 if then write “non esistono radici reali” write else if delta =0 if then x 1 b/2 a; then x 2 x 1 else x 1 ( b + delta)/2 a; else x 2 ( b delta)/2 a endif write x 1, x 2 write endif end 57

Introduzione ai linguaggi di programmazione di alto livello 58

Introduzione ai linguaggi di programmazione di alto livello 58

Cenni storici 1 Benché siano macchine in grado di compiere operazioni complesse, i calcolatori

Cenni storici 1 Benché siano macchine in grado di compiere operazioni complesse, i calcolatori devono essere “guidati” per mezzo di istruzioni appartenenti ad un linguaggio specifico e limitato, a loro comprensibile A livello hardware, i calcolatori riconoscono solo comandi semplici, del tipo “copia un numero”, “addiziona due numeri”, “confronta due numeri” : questi comandi definiscono il set di istruzioni della macchina e i programmi che li utilizzano direttamente sono i programmi in linguaggio macchina In linguaggio macchina ogni operazione richiede l’attivazione di numerose istruzioni base (il linguaggio riflette l’organizzazione della macchina più che la natura del problema da risolvere); inoltre, qualunque entità istruzioni, variabili, dati è rappresentata da numeri binari: i programmi sono difficili da scrivere, leggere e mantenere 59

Cenni storici 2 Negli anni `50, tutti i programmi erano scritti in linguaggio macchina

Cenni storici 2 Negli anni `50, tutti i programmi erano scritti in linguaggio macchina o in assembly (o assembler) assembler In assembly ogni istruzione è identificata da una sigla piuttosto che da un numero e le variabili sono rappresentate da nomi piuttosto che da numeri Esempio: carica il numero 8 nel primo registro libero della CPU Esempio 0011 1000 LOAD 8 0011 1000 Codice istruzione Linguaggio macchina Assembly I programmi scritti in assembly necessitano di un apposito programma assemblatore per tradurre le istruzioni tipiche del linguaggio in istruzioni macchina 60

Cenni storici 3 L’assembly definisce una notazione simbolica che è in stretta relazione con

Cenni storici 3 L’assembly definisce una notazione simbolica che è in stretta relazione con i codici in linguaggio macchina registro LOAD R 1, MEM 1 CMP R 1, R 2 BEQ RISZERO STORE R 1, MEM 1 RISZERO: LOAD R 2, MEM 2 Assemblatore 1000110110101010010000000000101 1100000000000001000 100110110101010100 100010010101101001000001100 OPCODE (LOAD) 61

Cenni storici 4 Oggi si utilizza l’assembly solo se esistono vincoli stringenti sui tempi

Cenni storici 4 Oggi si utilizza l’assembly solo se esistono vincoli stringenti sui tempi di esecuzione; viceversa si usano linguaggi più vicini al linguaggio naturale, i linguaggi di alto livello I linguaggi di alto livello sono elementi intermedi di una varietà di linguaggi ai cui estremi si trovano il linguaggio macchina, da un lato, ed i linguaggi naturali, come l’italiano e l’inglese, dall’altro I linguaggi di programmazione, progettati per manipolare informazioni, differiscono dai linguaggi naturali: sono infatti meno espressivi ma più precisi (non ambigui) 62

Scopi e caratteristiche 1 I linguaggi di programmazione di alto livello consentono al programmatore

Scopi e caratteristiche 1 I linguaggi di programmazione di alto livello consentono al programmatore di trattare oggetti complessi senza doversi preoccupare dei dettagli della particolare macchina sulla quale il programma viene eseguito Richiedono un compilatore o un interprete che sia in grado di tradurre le istruzioni del linguaggio di alto livello in istruzioni macchina di basso livello eseguibili dal calcolatore Un compilatore è un programma “simile” ad un assemblatore, ma più complesso, infatti… esiste una corrispondenza biunivoca fra istruzioni in assembler ed istruzioni macchina ogni singola istruzione di un linguaggio di alto livello corrisponde a molte istruzioni in linguaggio macchina: quanto più il linguaggio di programmazione si discosta dal linguaggio macchina, tanto più il lavoro di traduzione del compilatore è difficile 63

Scopi e caratteristiche 2 Esempio: Esempio In PASCAL, l’assegnazione PASCAL e : = (a+b)

Scopi e caratteristiche 2 Esempio: Esempio In PASCAL, l’assegnazione PASCAL e : = (a+b) (c+d); calcola l’espressione e, ottenuta eseguendo una serie di operazioni aritmetiche sulle variabili a, b, c, e d, salvando opportunamente il risultato nella posizione di memoria etichettata da e ; in linguaggio assembly la stessa istruzione potrebbe essere riscritta nel modo seguente: LOAD a, %r 0 LOAD b, %r 1 ADD %r 0, %r 1 LOAD c, %r 2 LOAD d, %r 3 ADD %r 2, %r 3 MULT %r 1, %r 3 STORE %r 3, e 64

Scopi e caratteristiche 3 I linguaggi che non dipendono dall’architettura della macchina offrono due

Scopi e caratteristiche 3 I linguaggi che non dipendono dall’architettura della macchina offrono due vantaggi fondamentali: i programmatori non devono cimentarsi con i dettagli architetturali di ogni calcolatore i programmi risultano più semplici da leggere e da modificare portabilità, portabilità leggibilità, leggibilità mantenibilità 65

L’essenza della programmazione di alto livello, ovvero dell’uso di linguaggi di elevata potenza espressiva,

L’essenza della programmazione di alto livello, ovvero dell’uso di linguaggi di elevata potenza espressiva, risiede nella capacità di astrazione, astrazione cioè nella possibilità di prescindere dai dettagli considerati inessenziali ai fini della soluzione di un problema, favorendo con ciò la concentrazione sugli elementi fondamentali. Un linguaggio di programmazione deve fornire all'utente buoni meccanismi per definire autonomamente tutte le astrazioni di cui ha bisogno: il programmatore, deve disporre di strumenti sufficienti per spiegare al calcolatore tutte le operazioni che intende effettuare. Scopi e caratteristiche 4 La funzione svolta da un programma ben strutturato in un linguaggio di programmazione di alto livello può essere facilmente compresa da un lettore: i simboli e le istruzioni utilizzate si avvicinano più ai simboli ed alle istruzioni di uso comune che non a quelle interne del calcolatore. Portabilità: Portabilità i programmi scritti per un calcolatore possono essere utilizzati su qualsiasi altro calcolatore, previa ricompilazione Leggibilità: Leggibilità la relativa similitudine con i linguaggi naturali rende i programmi più semplici, non solo da scrivere, ma anche da leggere Mantenibilità: Mantenibilità con questo termine si intende far riferimento a modifiche di tipo correttivo, perfettivo, evolutivo e adattivo; i programmi scritti in linguaggi di alto livello sono più semplici da modificare e da correggere La possibilità di codificare algoritmi in maniera astratta si traduce in una migliore comprensibilità del codice e quindi in una più facile analisi di correttezza 66

Scopi e caratteristiche 5 Eventuale svantaggio dell’uso dei linguaggi di alto livello è la

Scopi e caratteristiche 5 Eventuale svantaggio dell’uso dei linguaggi di alto livello è la riduzione di efficienza: riduzione di efficienza È possibile utilizzare istruzioni macchina diverse per scrivere programmi funzionalmente equivalenti: il programmatore ha un controllo limitato sulle modalità con cui il compilatore traduce il codice Tuttavia… i compilatori attuali ricorrono a trucchi di cui molti programmatori ignorano l’esistenza La ragione fondamentale per decretare la superiorità dei linguaggi di alto livello consiste nel fatto che la maggior parte dei costi di produzione del software è localizzata nella fase di manutenzione, per la quale la leggibilità e la portabilità sono cruciali 67

Un esempio di programma PASCAL begin leggi n, ncomp Problema: Problema Si legga una

Un esempio di programma PASCAL begin leggi n, ncomp Problema: Problema Si legga una lista di valori, la cui lunghezza non è nota a priori (è un dato in ingresso), stampando un opportuno messaggio se un certo valore, anch’esso letto a run time, appartiene o non appartiene alla lista trovato FALSE i 1 leggi ncorr = ncomp trovato TRUE Falso i i+1 Vero i n Falso “trovato un numero uguale” Vero trovato = TRUE end Falso “non trovato un numero uguale” 68

PROGRAM Search(input, output); PROGRAM (* Ricerca di un valore desiderato in una lista *)

PROGRAM Search(input, output); PROGRAM (* Ricerca di un valore desiderato in una lista *) VAR n: INTEGER; (* lunghezza della lista *) INTEGER ncomp: INTEGER; (* termine di paragone *) INTEGER ncorr: INTEGER; (* valore nella lista *) INTEGER trovato: BOOLEAN; (* TRUE se si è trovato *) BOOLEAN i: INTEGER; (* contatore dei valori della lista *) INTEGER BEGIN READ(n); READ WRITELN(‘Ci sono’, n, ‘valori. ’); WRITELN READ(ncomp); READ WRITELN(‘Ricerca di’, ncomp, ‘. ’); WRITELN trovato : = FALSE; (* non ancora trovato alcun valore *) FALSE FOR i = 1 TO n FOR TO DO BEGIN READ(ncorr); READ WRITELN(ncorr); WRITELN IF ncorr = ncomp IF THEN trovato : = TRUE; (* trovato un valore uguale *) THEN TRUE END (* fine ciclo for *) END IF trovato IF THEN WRITELN (‘Trovata corrispondenza’) THEN WRITELN ELSE WRITELN (‘Non trovata corrispondenza’); ELSE WRITELN END (* fine programma Search *) END 69