Sommario • Problema computazionale • Sviluppo software • Algoritmi – Diagrammi di Flusso; – Pseudo Codice • Istruzioni Sequenziali, Condizionali, Cicliche; • Javascript Informatica di Base -- R.Gaeta 1 Il Problema computazionale • È computazionale un problema che da alcuni dati iniziali porta ad un risultato in uscita tramite almeno una sequenza preordinata di passi; • Esempi nella vita pratica si trovano facilmente nell’arte culinaria o nella musica. Informatica di Base -- R.Gaeta 2 Esempi Il Risotto alla Zucca: - Abbiamo gli ingredienti (riso, zucca, olio, prezzemolo, cipolla, sale, etc.) con le giuste quantità; - Seguiamo la ricetta; - Serviamo il piatto a tavola. Informatica di Base -- R.Gaeta 3 Altro esempio L’esecuzione della nona di Beethoven: - Abbiamo l’orchestra, il direttore ed i musicisti; - Seguiamo lo spartito; - La musica riempie la sala. Informatica di Base -- R.Gaeta 4 Ma… • Non è così facile come sembra! • Per scrivere la “sequenza di passi” bisogna essere un bravo cuoco o un bravo compositore (o entrambi, come Rossini); • Anche per sapere “eseguire” bisogna imparare l’arte (bisogna avere un ottimo esecutore). Informatica di Base -- R.Gaeta 5 Il “cuore” dell’informatica • definizione di un particolare problema computazionale • scrittura di un algoritmo che lo risolve • scrittura del programma che traduce i passi dell’algoritmo in termini comprensibili dal computer Informatica di Base -- R.Gaeta 6 Il “cuore” dell’informatica • Ovvero, dato un problema bisogna definire un procedimento (l’algoritmo) che possa essere eseguito automaticamente da un esecutore a partire dai dati in ingresso per risolvere il problema (fornire i risultati in uscita) algoritmo input esecutore output Informatica di Base -- R.Gaeta 7 Quindi… problema risolutore esecutore essere umano algoritmo calcolatore esecuzione Informatica di Base -- R.Gaeta 8 Cosa è un Algoritmo • Un algoritmo (procedimento) è una sequenza finita di passi (azioni) che un esecutore è in grado di eseguire affinché venga risolto (in un tempo finito) un dato problema computazionale. • Ogni passo deve essere eseguibile dall’esecutore e in un tempo finito. • Un algoritmo determina un procedimento sequenziale (un passo dopo l’altro secondo un ordine specificato chiamato flusso di esecuzione) • La cosa difficile è scrivere una sequenza di passi che risolvano il problema computazionale e NON scrivere un programma per il calcolatore Informatica di Base -- R.Gaeta 9 Esecutore di algoritmi • Un esecutore è caratterizzato da – il linguaggio che è in grado di interpretare – l’insieme di azioni che è in grado di compiere – l’insieme delle regole che ad ogni frase corretta del linguaggio (costrutto linguistico) associano le relative azioni da compiere Informatica di Base -- R.Gaeta 10 Caratteristiche di un algoritmo • Tutte le azioni specificate dall’algoritmo devono essere eseguibili dall’esecutore – sono azioni elementari • In caso contrario, si deve scomporre un problema complesso in più sotto-problemi più semplici • Per ogni problema più semplice deve esistere un’istruzione nel linguaggio adottato per la scrittura degli algoritmi la cui esecuzione lo risolve. Informatica di Base -- R.Gaeta 11 Esempio di algoritmo L’esecutore è un essere umano che è solo in grado di premere tasti ed usare il mouse • Accendere il calcolatore • Accendere il monitor • Scrivere il nome utente • Scrivere la password • Premere il tasto invio • Se compare il messaggio di “password scaduta” allora cambiare la password altrimenti accedere al desktop di windows Informatica di Base -- R.Gaeta 12 Esempio: scomposizione in sotto-problemi • Ma l’esecutore sa direttamente eseguire il comando “cambiare la password”? • NO! Abbiamo definito in maniera precisa ed univoca che cosa l’esecutore è in grado di fare per cui dobbiamo scrivere un algoritmo per la risoluzione del problema “cambiare la password” – scrivere una sequenza di almeno sei caratteri – ri-scrivere, per conferma, la stessa sequenza – premere il tasto invio • Per esercizio, avendo ormai esperienza di come si accede all’aula 15, completate l’algoritmo!! Informatica di Base -- R.Gaeta 13 Caratteristiche di un algoritmo • Formulazione generale – • Passi eseguibili univoci e non ambigui – • la soluzione individuata non deve dipendere solo da valori predefiniti dei dati, cosi che l’algoritmo sia utilizzabile nel maggior numero possibile di casi “abbastanza”, “a volontà”, “un pochetto”, non sono adatti ad esecutori come i calcolatori. Determinismo – una volta fatto un passo, in maniera univoca quello successivo può essere determinato dall’esecutore anche se ci sono alternative • Finitezza del numero di passi • Terminazione – • prima o poi l’esecuzione dell’algoritmo deve terminare La finitezza del numero dei passi implica la terminazione? Informatica di Base -- R.Gaeta 14 Caratteristiche di un algoritmo Ogni passo (azione) deve • terminare entro un intervallo finito di tempo • produrre un effetto osservabile • produrre lo stesso effetto ogni volta che viene eseguito a partire dalle stesse condizioni iniziali Informatica di Base -- R.Gaeta 15 Elementi degli algoritmi • Oggetti: le entità su cui opera l’algoritmo – Dati iniziali del problema, informazioni ausiliarie, risultati parziali e finali – Le informazioni sono dette dati (anche i risultati parziali e finali) e possono essere variabili o costanti • Operazioni: Interventi da effettuare sui dati – Calcoli, confronti, ricopiature,acquisizioni, emissioni, ecc. • Flusso di controllo: l’indicazione delle possibili successioni dei passi dell’algoritmo – La correttezza dei risultati dipende non solo dalla corretta esecuzione delle singole operazioni, ma anche dalla corretta sequenza con cui sono eseguite Informatica di Base -- R.Gaeta 16 Flusso di controllo e di esecuzione • Flusso di controllo: la descrizione a priori di tutte le possibili sequenze nell’esecuzione dei passi dell’algoritmo, in particolare di operazioni in alternativa e di operazioni da ripetere più volte ciclicamente • Flusso di esecuzione: la sequenza di operazioni effettivamente seguita durante una particolare esecuzione dell’algoritmo e che dipende dai particolari valori che i dati assumono in quell’esecuzione Informatica di Base -- R.Gaeta 17 Cosa è un programma • Il programma è la “scatola nera” che risolve il problema computazionale; • Il programma è una sequenza di istruzioni che devono essere eseguite; • Il programma è la traduzione per il computer dei passi dell’algoritmo • Deve essere scritto tramite un linguaggio che il computer capisca (linguaggio macchina); • Il programmatore utilizza un linguaggio di programmazione che poi viene tradotto (da qualcosa) in linguaggio macchina; Informatica di Base -- R.Gaeta 18 Dall’uomo al calcolatore uomo pseudo codice diagramma di flusso algoritmo programma linguaggio di programmazione ad alto livello traduttore linguaggio macchina esecuzione del processore input calcolatore output Informatica di Base -- R.Gaeta 19 Fasi di creazione di un programma 1. Studio Preliminare 2. Analisi del Sistema 6. Manutenzione e Test 3. Progettazione 5. Implementazione 4. Sviluppo Informatica di Base -- R.Gaeta 20 Le fasi • Analisi del problema computazionale (individuare input ed output, etc.) • Progettazione di una soluzione proponendo una suddivisione del problema in sottoproblemi più semplici; alla fine di questa fase, per ogni sottoproblema si deve scrivere l’algoritmo utilizzando pseudo-codici e diagrammi di flusso; • Stesura del programma a implementazione vera e propria partire dall’algoritmo: • Test del programma: alfa testing, beta testing, debugging • Produzione documentazione e distribuzione Informatica di Base -- R.Gaeta 21 Un altro esempio di algoritmo Preparazione del Risotto alla Zucca da parte di un esecutore in grado di aggiungere, tagliare, mescolare, tostare, mantecare,… 1. Preparare il soffritto ed il brodo; 2. Aggiungere la zucca a pezzettini al soffritto; 3. Mescolare fino a quando la zucca non è un purè; 4. Aggiungere il riso al soffritto; 5. Fare tostare il riso; poi bagnarlo con il vino; 6. Aggiungere brodo fino a quando il riso è cotto; 7. Aggiungere prezzemolo, pepe e burro; 8. Se preferisci salato, allora aggiungi sale; Informatica di Base -- R.Gaeta 22 Sottoproblemi • L’algoritmo precedente è un altro esempio di cosa significa scomporre un problema in sottoproblemi; – Come si prepara un soffritto? – Come si prepara un brodo? • Ogni sottoproblema può essere scomposto in problemi via via più elementari; • Per ogni problema elementare deve esistere un’istruzione nel linguaggio adottato la cui esecuzione lo risolve. Informatica di Base -- R.Gaeta 23 Alto e basso livello • Man mano che si suddivide il problema in sottoproblemi, si scende di livello; • Se ci si avvicina al linguaggio umano, si parla di linguaggi di Alto livello; • Se ci si avvicina al linguaggio macchina, si parla di linguaggi di Basso livello; Informatica di Base -- R.Gaeta 24 Linguaggi Linguaggio umano (es. Italiano) Descrizione di un algoritmo (es. diagrammi di flusso, pseudo codice, etc…) Linguaggi di Programmazione (es. C, VBasic, Java, Logo, etc…) Alto livello Linguaggio Macchina Basso livello Informatica di Base -- R.Gaeta 25 Linguaggi di programmazione • Linguaggio macchina – Codifica binaria delle istruzioni – Diverso per ogni architettura – Istruzioni e operazioni elementari coincidono • Linguaggio Assembler – Sempre a livello macchina, ma codifica simbolica delle istruzioni – Es: ADD R1, R6 STORE R1, RAM[255] MOV R1, #4 Informatica di Base -- R.Gaeta 26 Linguaggi di programmazione • Linguaggio ad alto livello (HLL - High-Level Languages – Elaboratore virtuale • Operazioni molto più astratte delle operazioni HW – Es: x = y+2 z = cos(x) – Linguaggio indipendente dalla piattaforma! – Possibile mediante l’esistenza di traduttori Informatica di Base -- R.Gaeta 27 Linguaggi di programmazione Programma sorgente (HLL) Traduttore Programma eseguibile (bit) Informatica di Base -- R.Gaeta 28 Traduttori “somma due interi” … “stampa un messaggio” Traduttore Traduttore ... Uomo 010101010111 010101111111 101010101010 101010101011 Macchina Informatica di Base -- R.Gaeta 29 Traduttori • Due schemi – Compilatori – Interpreti Informatica di Base -- R.Gaeta 30 Compilatori • Traduzione avviene in due passi: – Compilazione vera e propria – Collegamento (link) • Dopo la fase di link, il programma può essere eseguito direttamente • Ogni fase produce un file corrispondente all’aggiunta di informazioni di vario tipo – Formato oggetto – Formato eseguibile Informatica di Base -- R.Gaeta 31 Compilatori sorgente COMPILATORE COMPILATORE LINKER LINKER oggetto eseguibile Libreria 01011010 01010100 11111111 ... Informatica di Base -- R.Gaeta 32 Linker • Risolve i riferimenti ad indirizzi di memoria – Indirizzi logici => indirizzi fisici • Aggiunge al codice le librerie: – Funzioni pre-compilate e riutilizzabili (es. funzioni matematiche) e distribuite con il compilatore – Codice scritto in precedenza – Due schemi: • Librerie statiche • Librerie dinamiche Informatica di Base -- R.Gaeta 33 Interpreti • Il formato interno viene generato traducendo il formato sorgente • Il programma viene interpretato eseguito istruzione per istruzione. ed interpretando e immediatamente • Non viene generato né formato intermedio (oggetto) né eseguibile. Informatica di Base -- R.Gaeta 34 Compilatori vs. interpreti • Linguaggi compilati: – Vantaggi: • Formato del programma eseguibile più efficiente → esecuzione più veloce • Migliore supporto per istruzioni “complesse” e programmi di grandi dimensioni – Svantaggi: • Rallentamento tempo di sviluppo dei programmi • Maggiori requisiti di spazio di memoria (il compilatore è un programma sofisticato) • Linguaggi interpretati: – Ideali in ambiente didattico per lo sviluppo rapido di programmi. Informatica di Base -- R.Gaeta 35 Portabilità del software • Possibilità per un programma di poter essere eseguito su piattaforme HW e SW diverse da quelle su cui è stato sviluppato compilatore Windows codice sorgente compilatore Linux compilatore MacOS codice eseguibile Windows codice eseguibile Linux codice eseguibile MacOS Informatica di Base -- R.Gaeta 36 Linguaggi di programmazione • FORTRAN – FORmula TRANslation (1956) • calcoli tecnico-scientifici (ambiente fisico/matematico) • svariate librerie • compilato • COBOL – COmmerce and Business Oriented Language (1960) • elaborazione di archivi, tabulati • applicazioni contabili Informatica di Base -- R.Gaeta 37 Linguaggi di programmazione • BASIC – Beginner’s All-purpose Symbolic Instruction Code (1962) • relativamente semplice • capacità grafiche • interpretato • versioni “evolute” (VisualBasic) • PASCAL – (1972) • Linguaggio molto “formale” (progetto accademico) • Programmazione strutturata • Utile per la didattica • Compilato Informatica di Base -- R.Gaeta 38 Linguaggi di programmazione • C – Bell Labs (1972) • Evoluzione più efficiente del PASCAL • Istruzioni per ottimizzazione del codice • efficiente • Molto usato nella programmazione di sistema • compilato • C++ – Bell Labs (‘80) • Evoluzione del C ad oggetti • Diverso paradigma di programmazione • Include il C • compilato Informatica di Base -- R.Gaeta 39 Linguaggi di programmazione • Java – Sun MicroSystems (‘90) • Evoluzione del C++ • Schema misto compilato+interpretato • Portabilità universale tramite formato intermedio (bytecode) • Vasta gamma di librerie • Supporto alla programmazione web • Perl – GNU project (‘90) • interpretato • complesso, ma molto potente • molto utilizzato nella programmazione web • programmi=>script Informatica di Base -- R.Gaeta 40 Sviluppo di programmi • Per la costruzione di un programma conviene: 1. condurre un’analisi del problema da risolvere 2. elaborare un algoritmo della soluzione rappresentato in un linguaggio adatto alla comprensione degli esseri umani ma abbastanza vicino ai linguaggi di programmazione 3. produrre un programma programmazione scelto scritto nel linguaggio di Informatica di Base -- R.Gaeta 41 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione dei contenitori di dati (variabili) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 42 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione dei contenitori di dati (variabili) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 43 FASE 1: problema e sua analisi • L’analisi di un problema è la primissima cosa da fare quando si è di fronte alla richiesta di risolverlo • Bisogna capire bene il problema prima di pensare di risolverlo! • L’analisi del problema deve fornire come prodotto: – un nome ed una breve descrizione di cosa si vuol fare – un elenco di requisiti, ovvero, di richieste, vincoli che il programma deve soddisfare Informatica di Base -- R.Gaeta 44 Esempio di Analisi del problema: ax2+bx+c • Problema: CALCOLO RADICI • Descrizione: calcolare le soluzioni reali di una equazione di secondo grado • Requisiti: l’equazione può avere nessuna soluzione reale, due soluzioni coincidenti, o due soluzioni distinte. Si devono, in questi casi, evidenziare il messaggio – nessuna radice – radici coincidenti r (dove r è il valore delle radici) – radici distinte r1 ed r2 (dove r1 ed r2 sono il valore delle radici) Informatica di Base -- R.Gaeta 45 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione dei contenitori di dati (variabili) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 46 FASE 2: specifica funzionale • Una specifica funzionale descrive: – quali sono i dati iniziale, ovvero i dati di input (ingresso) da elaborare – qual è il risultato atteso in funzione dei dati in ingresso (output, uscita dell’algoritmo) Informatica di Base -- R.Gaeta 47 Esempio di specifica funzionale CALCOLO RADICI: specifica funzionale • INPUT: i numeri reali a,b,c che sono i coefficienti dell’equazione da risolvere • OUTPUT: i messaggi – “nessuna radice reale” – “x1=x2=r” se l’equazione ha due radici reali coincidenti pari ad r – “x1=r1, x2=r2” se l’equazione ha due radici reali distinte pari ad r1 ed r2 Informatica di Base -- R.Gaeta 48 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione dei contenitori di dati (variabili) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 49 FASE 3: scrittura dell’algoritmo • Descrizione dell’algoritmo, ovvero, dei passi da eseguire per giungere al risultato di uscita partendo dai dati in input • La prima stesura non necessariamente deve essere completa di ogni dettaglio. in genere, si procede per raffinamenti successivi Informatica di Base -- R.Gaeta 50 Esempio di stesura preliminare di algoritmi CALCOLO RADICI: stesura preliminare dell’algoritmo • risolvo il problema calcolando il discriminante (delta) dell’equazione • analizzo i vari casi di delta – <0 – =0 – >0 • costruisco per ognuno di questi casi il messaggio da produrre in output • Successivamente si definiscono le variabili (contenitori di dati) coinvolte e dettaglio la specifica dell’algoritmo usando un diagramma di flusso o lo pseudo codice. Informatica di Base -- R.Gaeta 51 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione delle variabili (contenitori di dati) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 52 FASE 3.1: definizione delle variabili • Ogni algoritmo deve tenere traccia (memorizzare) i valori dei dati in input, dei risultati in output, e dei valori intermedi calcolati durante l’esecuzione dei passi • A questo fine si usano delle variabili (contenitori di dati). Ogni variabile ha un nome associato al dato (valore) memorizzato. • Una variabile è una astrazione (semplificazione) della nozione di area di memoria (una o più celle della RAM, un registro generale) contenente i bit rappresentanti i dati • I dati contenuti in una variabile hanno un tipo (si dice che una variabile è di un certo tipo) che caratterizza un insieme di elementi e le operazioni che sono possibili su di essi Informatica di Base -- R.Gaeta 53 FASE 3.1: definizione delle variabili • Ogni variabile memorizza il valore di un dato • Ogni dato appartiene ad un tipo di dato • Un tipo di dato è: un insieme di elementi, rappresentabili in modo finito, dotato di operazioni primitive su di esso • ESEMPIO: il tipo di dato intero – è l’insieme dei numeri interi, sequenze di cifre, con segno – dotato di operazioni primitive ed effettivamente eseguibili come somma (+), differenza (-), prodotto (*), divisione intera (/), resto. Informatica di Base -- R.Gaeta 54 FASE 3.1: definizione delle variabili • Le variabili da usare per memorizzare i valori dei dati intermedi dipendono dall’algoritmo • All’inizio della stesura di un algoritmo difficilmente si è già a conoscenza di quante e quali variabili si dovranno usare • Ad ogni raffinamento dell’algoritmo si possono aggiungere o togliere variabili fino ad arrivare all’uso corretto di ognuna Informatica di Base -- R.Gaeta 55 Esempio di definizione di variabili CALCOLO RADICI: variabili usate • ci vogliono tante variabili quanti sono i dati in input. In questo caso ci vogliono tre variabili che chiamiamo a,b,c per i coefficienti dell’equazione • ci vogliono tante variabili quanti sono i dati in uscita. In questo caso, servono due variabili r1,r2 per il valore delle radici dell’equazione • ci vogliono alcune variabili per tenere conto di dati intermedi da calcolare e modificare per ottenere la soluzione. In questo caso, potremmo usare una variabile per memorizzare il valore del discriminante. La variabile la chiamiamo delta • Il tipo di tutte queste variabili è float (numeri reali). Informatica di Base -- R.Gaeta 56 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione delle variabili (contenitori di dati) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 57 Descrizione di un algoritmo • Si descrive un algoritmo cercando di sintetizzare il più possibile la sua sequenza di passi; • Non si utilizza un linguaggio di programmazione specifico, ma è meglio utilizzare qualcosa di più generale; • Pseudo-codici o Diagrammi di Flusso Informatica di Base -- R.Gaeta 58 Descrizione di un algoritmo • Un algoritmo descrive operazioni: due tipi fondamentali di – calcoli ottenibili tramite le operazioni primitive su tipi di dato (valutazione di espressioni) – azioni che consistono nella modifica del valore associato alle variabili Informatica di Base -- R.Gaeta 59 Descrizione di un algoritmo • Un algoritmo operazioni: descrive due tipi fondamentali di – calcoli ottenibili tramite le operazioni primitive su tipi di dato (valutazione di espressioni) – azioni che consistono nella modifica del valore associato alle variabili Informatica di Base -- R.Gaeta 60 Calcoli: espressioni valutabili • L’esecutore dell’algoritmo valuta espressioni dove gli elementi possono essere variabili o valori costanti – 3 * X + sin (Y * sqrt(z)) – b*b-4*a*c – h/j – k / 2.23 – 192 Informatica di Base -- R.Gaeta 61 Calcoli: espressioni booleane (logiche) • Ci sono anche particolari tipi di espressioni chiamate booleane o logiche • Sono espressioni che possono dare origine a due soli possibili valori: VERO o FALSO • Una proposizione della quale dobbiamo valutare se è vera o falsa • Per costruire un’espressione logica si possono usare le seguenti relazioni: – = (uguaglianza); – < (minore); <= (minore o uguale); – > (maggiore); >= (maggiore o uguale); – <> (diverso); Informatica di Base -- R.Gaeta 62 Esempi di espressioni booleane (logiche) • A seconda del valore delle variabili l’espressione booleana può essere vera o falsa – b*b-4*a*c = 0 – h / j <> 2.4 – k / 2.23 > p – 192 <= 12 Informatica di Base -- R.Gaeta 63 Calcoli: espressioni logiche complesse - NOT • Possiamo costruire espressioni booleane più complesse grazie ad alcune regole della cosiddetta algebra booleana; • Se A è un’espressione logica, anche Not A (la negazione logica di A) lo è A Not A Vero Falso Falso Vero Informatica di Base -- R.Gaeta 64 Congiunzione (AND) • Se A e B sono espressioni logiche, anche A and B lo è; A B A and B Vero Vero Vero Vero Falso Falso Falso Vero Falso Falso Falso Falso Informatica di Base -- R.Gaeta 65 Disgiunzione (OR) • Se A e B sono espressioni logiche, anche A or B lo è; A B A or B Vero Vero Vero Vero Falso Vero Falso Vero Vero Falso Falso Falso Informatica di Base -- R.Gaeta 66 Descrizione di un algoritmo • Un algoritmo operazioni: descrive due tipi fondamentali di – calcoli ottenibili tramite le operazioni primitive su tipi di dato (valutazione di espressioni) – azioni che consistono nella modifica del valore associato alle variabili Informatica di Base -- R.Gaeta 67 Azioni: modifica valori delle variabili • L’esecutore di un algoritmo deve poter compiere azioni che hanno un effetto sui dati gestiti • Le azioni più semplici sono assegnamenti a variabili • Un assegnamento ad una variabile si denota con VARIABILE:= ESPRESSIONE • con il seguente significato: 1. l’esecutore valuta l’espressione a destra del := 2. e poi modifica il valore della variabile con il risultato della valutazione dell’espressione Informatica di Base -- R.Gaeta 68 Esempi di azioni: assegnamenti a variabili • L’esecutore valuta espressioni dove gli elementi possono essere variabili o valori costanti e se ne assegna il valore ad una variabile – pippo := 3 * X + sin (Y * sqrt(z)) – delta := b*b-4*a*c – a := h / j – W := k / 2.23 – M := 192 – T := p – x := x + 1 • Una variabile non può essere “vuota”: ad una variabile deve sempre essere associato un valore • Il valore contenuto in una variabile è l’ultimo assegnatole e resta inalterato finché una successiva assegnazione non modifica il valore stesso Informatica di Base -- R.Gaeta 69 Formalismi per la descrizione di algoritmi • Per descrivere in passi di un algoritmo bisogna essere precisi e non ambigui • Il linguaggio naturale degli esseri umani si presta a interpretazioni non univoche • Si usano due formalismi: – diagrammi di flusso: formalismo grafico – pseudo-codice: linguaggio con istruzioni simili a quelle dei linguaggi di programmazione • si possono usare in alternativa Informatica di Base -- R.Gaeta 70 Specifica di inizio e di fine • Ogni algoritmo deve avere un inizio ed una fine start start …… …… …… …… …… …… end end Informatica di Base -- R.Gaeta 71 Input ed output di dati • Ogni algoritmo parte da dati in ingresso per produrre dati in uscita (problema computazionale) …… read X readX …… …… write Z write Z …… Informatica di Base -- R.Gaeta 72 Specifica delle azioni • Ogni algoritmo specifica azioni che l’esecutore deve compiere del tipo descritto in precedenza …… Z := X + 1 Z := X + 1 …… Informatica di Base -- R.Gaeta 73 Specifica delle condizioni logiche • Alcuni passi di un algoritmo si devono eseguire se sono verificate condizioni logiche su valori di variabili • In genere, questi salti dell’algoritmo sono sottoposti ad una condizione logica (risposta vero o falso); • Si parla di blocchi decisionali Informatica di Base -- R.Gaeta 74 Specifica delle condizioni logiche ……… azioni azioni vero condizione logica if (condizione logica) then falso azioni caso vero azioni caso falso azioni seguenti comuni azioni caso vero else azioni caso falso end if azioni seguenti comuni ……… Informatica di Base -- R.Gaeta 75 Specifica delle condizioni logiche azioni ……… azioni vero azioni caso vero condizione logica if (condizione logica) then azioni caso vero end if falso azioni seguenti comuni ……… azioni seguenti comuni Informatica di Base -- R.Gaeta 76 Condizioni logiche Annidate: esempio ……… azioni azioni if (condizione logica 1) then vero condizione logica 1 if (condizione logica 2) then falso azioni vero 2 else vero condizione falso logica 2 condizione logica 3 azioni falso 2 vero falso azioni vero 2 azioni falso 2 end if else azioni vero 3 if (condizione logica 3) then azioni vero 3 end if end if azioni seguenti comuni azioni seguenti comuni ……… Informatica di Base -- R.Gaeta 77 Flusso di esecuzione • I singoli diagrammi devono essere uniti tramite i connettori (linee e frecce in un flow chart); • L’esecuzione dei passi deve essere fatta sequenzialmente, ovvero seguendo i connettori, partendo dall’inizio dell’algoritmo fino a raggiungere la sua fine • Quando si scrive l’algoritmo bisogna fare molta attenzione alla direzione del flusso di esecuzione Informatica di Base -- R.Gaeta 78 Strutture di controllo: iterazione …… azioni azioni while (condizione logica) azioni da ripetere azioni da ripetere vero condizione logica end while azioni seguenti …… falso azioni seguenti Informatica di Base -- R.Gaeta 79 Strutture di controllo: iterazioni annidate azioni …… azioni while (condizione logica esterna) azioni iterazione interna da ripetere while (condizione logica interna) azioni iterazione interna da ripetere azioni iterazione esterna da ripetere vero end while condizione logica interna falso vero azioni iterazione esterna da ripetere end while azioni seguenti condizione logica esterna falso …… azioni seguenti Informatica di Base -- R.Gaeta 80 Sviluppo di programmi • FASE 1: Dare un nome al problema partendo dall’analisi del problema • FASE 2: Scrivere la specifica funzionale • FASE 3: Scrittura dell’algoritmo – FASE 3.1: Introduzione delle variabili (contenitori di dati) necessarie e delle relative operazioni elementari – FASE 3.2: Specifica di un diagramma di flusso ( o di uno pseudo codice) che descrive in modo preciso e non ambiguo la sequenza di operazioni da eseguire • FASE 4: Traduzione del diagramma di flusso ( o dello pseudo codice) in un programma in un linguaggio di programmazione Informatica di Base -- R.Gaeta 81 Esempio di algoritmo • Scrivere l’algoritmo che esegue la somma di due numeri start start read X read X read Y read Y Z := X + Y write Z Z := X + Y end write Z end Informatica di Base -- R.Gaeta 82 Esempio: massimo tra due numeri Dati due numeri, dire qual è il massimo tra i due. start start read X read X read Y read Y vero X>Y max := X if (X > Y) then max := X falso max := Y else max := Y write max end end if write max end Informatica di Base -- R.Gaeta 83 Esempio di algoritmo: calcolo radici start start read a,b,c read a,b,c delta := b*b-4*a*c if (delta < 0) then delta:=b*b-4*a*c vero write “nessuna radice” falso delta < 0 else r1 := (-b+sqrt(delta))/2*a r1 := (-b + sqrt(delta))/2*a write "nessuna radice" r2 := (-b-sqrt(delta))/2*a r2 := (-b - sqrt(delta))/2*a write r1,r2 write r1,r2 vero delta = 0 write "radici coincidenti" if (delta = 0) then write “radici coincidenti” falso else write "radici distinte" write “radici distinte” end if end if end end Informatica di Base -- R.Gaeta 84 Esercizio: massimo di una sequenza • Si supponga di fornire in input ad un programma un numero indefinito di interi positivi. L’inserimento verrà terminato dall’utente quando questi inserirà uno zero (0). Il programma deve restituire il valore massimo tra quelli introdotti. Disegnare il diagramma di flusso di tale programma. Informatica di Base -- R.Gaeta 85 Strutture di controllo: iterazione …… azioni azioni while (condizione logica) azioni da ripetere azioni da ripetere vero condizione logica end while azioni seguenti …… falso azioni seguenti Informatica di Base -- R.Gaeta 86 Strutture di controllo: iterazioni annidate azioni …… azioni while (condizione logica esterna) azioni iterazione interna da ripetere while (condizione logica interna) azioni iterazione interna da ripetere azioni iterazione esterna da ripetere vero end while condizione logica interna falso vero azioni iterazione esterna da ripetere end while azioni seguenti condizione logica esterna falso …… azioni seguenti Informatica di Base -- R.Gaeta 87 Esercizio: massimo di una sequenza start start max := -1 max := -1 read numero read numero falso numero >0 while (numero > 0) if (numero > max) then write max vero max := numero end vero end if numero > max read numero falso end while max := numero write max read numero end Informatica di Base -- R.Gaeta 88 Esercizio: massimo di una sequenza start start max := -1 max := -1 read numero read numero while (numero <> 0) falso numero <> 0 if (numero < 0) then write max write “solo positivi!!” vero falso numero < 0 numero > max vero else end if (numero > max) then write "solo positivi!!" max := numero end if vero end if falso max := numero read numero end while read numero write max end Informatica di Base -- R.Gaeta 89 Esercizio: cosa fa questo algoritmo? start start P := 0 P := 0 read A,B read A,B falso A <> 0 while (A <> 0) write P if (A è dispari) then vero P := P + B end vero A è dispari end if falso A := A / 2 P := P + B B := B * 2 end while A := A / 2 write P B := B * 2 end Informatica di Base -- R.Gaeta 90 Esercizio: cosa fa questo algoritmo? P 0 3 9 21 A 7 3 1 0 B 3 6 12 24 Informatica di Base -- R.Gaeta 91 Esercizio: cosa fa questo algoritmo? P 0 0 0 12 36 A 12 6 3 1 0 B 3 6 12 24 48 Informatica di Base -- R.Gaeta 92 Esercizio: dispari-pari Dato un numero, verificare se è pari o dispari e stampare il relativo messaggio start start read N while (N > 1) read N N := N – 2 N := N - 2 vero end while N>1 falso vero N=0 write "pari" if (N = 0) then write “pari” falso write "dispari" else write “dispari” end if end end Informatica di Base -- R.Gaeta 93 Esercizio: dispari-pari (controllo input) Dato un numero stampare se è pari o dispari start start read N N<0 vero N := -N falso N := N - 2 vero N>1 falso vero N=0 write "pari" falso write "dispari" read N if (N < 0) then N := -N end if while (N > 1) N := N – 2 end while if (N = 0) then write “pari” else write “dispari” end if end end Informatica di Base -- R.Gaeta 94 Esercizio: minimo di una sequenza di K numeri • Si supponga di fornire in input ad un programma un numero K e K interi positivi. Il programma deve restituire il valore minimo tra quelli introdotti. Informatica di Base -- R.Gaeta 95 Esercizio: minimo di una sequenza di K numeri start start read K K read numero read numero min := numero min := numero inseriti := 1 while (inseriti < K) inseriti := 1 inseriti < K falso read numero write min if (numero < min) then vero read numero vero min := numero min := numero end end if numero < min inseriti := inseriti + 1 end while falso write min inseriti := inseriti + 1 end Informatica di Base -- R.Gaeta 96 Esercizio: minimo di una sequenza di K numeri (controllo input) start start K K <= 0 vero write "K deve essere positivo!" falso read numero min := numero inseriti := 1 inseriti < K falso write min vero read numero vero min := numero end numero < min falso inseriti := inseriti + 1 end read K if ( K <= 0) then write “K deve essere positivo!” else read numero min := numero inseriti := 1 while (inseriti < K) read numero if (numero < min) then min := numero end if inseriti := inseriti + 1 end while write min end if Informatica di Base -- R.Gaeta 97 Esercizio: elevamento a potenza Data la base e l’esponente calcolare l’elevamento a potenza start start potenza:= 1 potenza := 1 read B,E read B,E while (E > 0) falso E>0 potenza := potenza * B write potenza E := E - 1 vero potenza:= potenza * B end while end write potenza end E := E -1 Informatica di Base -- R.Gaeta 98 Esercizio: elevamento a potenza (controllo input) Data la base e l’esponente calcolare l’elevamento a potenza start start read B,E read B,E E >= 0 vero if (E >= 0) then potenza := 1 falso write"esponente negativo!" while (E > 0) potenza := potenza * B potenza := 1 E := E - 1 falso E>0 end while write potenza write potenza vero potenza:= potenza * B else end write “esponente negativo!” end if E := E -1 end Informatica di Base -- R.Gaeta 99 Esercizio: fattoriale Dato un numero calcolare il suo fattoriale start start fattoriale:= 1 fattoriale := 1 read N read N while (N > 0) falso N>0 fattoriale := fattoriale * N write fattoriale N := N - 1 vero fattoriale:= fattoriale * N N:= N -1 end while end write fattoriale end Informatica di Base -- R.Gaeta 100 Esercizio: fattoriale (controllo input) Dato un numero calcolare il suo fattoriale start start read N read N N >= 0 vero if (N >= 0) then fattoriale := 1 falso write"numero negativo!" while (N > 0) fattoriale := fattoriale * N fattoriale:= 1 N := N - 1 falso N>0 end while write fattoriale write fattoriale vero fattoriale:= fattoriale * N else end write “numero negativo!” end if N := N -1 end Informatica di Base -- R.Gaeta 101 Esercizio: numero primo • Dato un numero N scrivere un algoritmo che verifichi se N è un numero primo e stampi un relativo messaggio • Il numero N è un numero primo se è divisibile solo per 1 e per N • Quindi, per verificare se un numero N è primo è sufficiente provare a dividerlo per tutti gli interi minori di esso – Se almeno uno di questi interi è un divisore di n allora n non è primo – Altrimenti n è primo Informatica di Base -- R.Gaeta 102 Esercizio: numero primo start start N divisore := 2 primo := vero vero vero primo := falso falso divisore < N vero N divisibe per divisore falso primo = vero write "numero primo" divisore := divisore + 1 falso write "numero nonprimo" end read N divisore := 2 primo := vero while (divisore < N) if (N divisibile per divisore) then primo := falso end if divisore := divisore + 1 end while if (primo = vero) then write “numero primo” else write “numero non primo” end if end Informatica di Base -- R.Gaeta 103 Esercizio: numero primo – ottimizzazione I start start N divisore := 2 primo := vero vero vero primo := falso divisore < N and primo = vero vero N divisibe per divisore falso falso primo = vero write "numero primo" divisore := divisore + 1 falso write "numero nonprimo" end read N divisore := 2 primo := vero while (divisore < N and primo = vero) if (N è divisibile per divisore) then primo := falso end if divisore := divisore + 1 end while if (primo = vero) then write “numero primo” else write “numero non primo” end if end Informatica di Base -- R.Gaeta 104 Esercizio: numero primo – ottimizzazione II start start N divisore := 2 primo := vero vero vero primo := falso falso divisore < N vero N divisibe per divisore falso primo = vero write "numero primo" write "numero nonprimo" divisore := N divisore := divisore + 1 falso end read N divisore := 2 primo := vero while (divisore < N) if (N è divisibile per divisore) then primo := falso divisore := N end if divisore := divisore + 1 end while if (primo = vero) then write “numero primo” else write “numero non primo” end if end Informatica di Base -- R.Gaeta 105 Esercizi • Produrre un algoritmo che controlla la correttezza dell’input • Produrre un algoritmo più efficiente di quello di base (più efficiente vuol dire che compie meno operazioni) Informatica di Base -- R.Gaeta 106 Esercizio: divisibilità Dati un dividendo ed un divisore scrivere un algoritmo che verifichi la divisibilità start start read DD,DS read DD,DS while (DD >= DS) DD := DD – DS vero DD := DD - DS DD >= DS end while if (DD = 0) then falso vero DD = 0 write "divisibile" write “divisibile” falso write "non divisibile" else write “non divisibile” end if end end Informatica di Base -- R.Gaeta 107 Esercizi • Produrre un algoritmo che sia corretto per ogni tipologia di dati in ingresso • Come risolvereste il problema del pari o dispari adesso? Informatica di Base -- R.Gaeta 108 Esercizio: triangoli • Scrivere un algoritmo che, date le coordinate di tre punti corrispondenti ai vertici di un triangolo, riconosca se si tratta di un triangolo degenere o no, e nel caso di triangolo non degenere calcoli il suo perimetro A C B Informatica di Base -- R.Gaeta 109 Esercizio: triangoli – soluzione preliminare start leggi coordinate dei vertici A,B,C del triangolo vero triangolo degenere falso calcola la lunghezza dei lati write "triangolo degenere" calcola il perimetro del triangolo write perimetro end Informatica di Base -- R.Gaeta 110 Esercizio: triangoli - raffinamento start leggi coordinate dei vertici A,B,C del triangolo vero (A coincide con B) OR (B coincide con C) OR (C coincide con A) OR (A,B,C sono allineati) falso LAB := distanza(A,B) LBC := distanza(B,C) LCA := distanza(C,A) write "triangolo degenere" perimetro:=LAB+LBC+LCA write perimetro end Informatica di Base -- R.Gaeta 111 Esercizio: triangoli – raffinamento ulteriore start read AX,AY,BX,BY,CX,CY (AX=BX AND AY=BY) OR (BX=CX AND BY=CY) OR (CX=AX AND CY=AY) OR (A,B,C sono allineati) vero LAB := sqrt((AX-BX)*(AX-BX)+(AY-BY)*(AY-BY)) LBC := sqrt((BX-CX)*(BX-CX)+(BY-CY)*(BY-CY)) LCA := sqrt((CX-AX)*(CX-AX)+(CY-AY)*(CY-AY)) falso perimetro:=LAB+LBC+LCA write "triangolo degenere" write perimetro end Informatica di Base -- R.Gaeta 112 Esercizio: triangoli • Se i tre vertici sono allineati allora otteniamo due triangoli rettangoli i cui cateti sono nella stessa proporzione C A B (AY-BY):(AX-BX)=(AY-CY):(AX-CX) Informatica di Base -- R.Gaeta 113 Esercizi: triangoli • In una proporzione il prodotto dei medi è uguale al prodotto degli estremi per cui i tre vertici sono allineati se è vera la condizione logica (AX-BX)*(AY-CY)=(AY-BY)*(AX-CX) Informatica di Base -- R.Gaeta 114 Esercizi: triangoli - soluzione start read AX,AY,BX,BY,CX,CY vero (AX=BX AND AY=BY) OR (BX=CX AND BY=CY) OR (CX=AX AND CY=AY) OR (AX-BX)*(AY-CY)=(AY-BY)*(AX-CX) falso LAB := sqrt((AX-BX)*(AX-BX)+(AY-BY)*(AY-BY)) LBC := sqrt((BX-CX)*(BX-CX)+(BY-CY)*(BY-CY)) LCA := sqrt((CX-AX)*(CX-AX)+(CY-AY)*(CY-AY)) perimetro:=LAB+LBC+LCA write "triangolo degenere" write perimetro end Informatica di Base -- R.Gaeta 115 Individuazione di sottoproblemi • Quando il problema è complesso conviene partire con una individuazione di sottoproblemi • Scriviamo un algoritmo contenente azioni o condizioni complesse per l’esecutore che dettaglieremo e raffineremo in passaggi successivi per ottenere un algoritmo direttamente eseguibile • Ognuno dei sottoproblemi potrà essere risolto da un algoritmo a parte che potremo riutilizzare, quando sarà necessario, nella soluzione di ulteriori problemi complessi. Informatica di Base -- R.Gaeta 116 Individuazione di sottoproblemi: vantaggi • I dettagli delle diverse soluzioni sono descritti negli algoritmi dei sottoproblemi • In generale, uno stesso sottoproblema deve essere risolto più volte nella soluzione di un problema principale • Dagli algoritmi derivano programmi, quindi si possono raccogliere librerie di software da riutilizzare in nuovi programmi Informatica di Base -- R.Gaeta 117 Esercizio: frazioni • Scrivere un algoritmo che verifichi se una frazione è apparente o propria • Sapreste risolverlo senza un’analisi del problema? • Vi ricordate la “FASE 1: Dare un nome al problema partendo dall’analisi del problema” e la “FASE 2: Scrivere la specifica funzionale”? – apparenti: numeratore multiplo di denominatore – proprie: numeratore minore di denominatore Informatica di Base -- R.Gaeta 118 Esercizio: MCD • Scrivere un algoritmo che calcoli il massimo comune divisore di due numeri • Sapreste risolverlo senza un’analisi del problema? • Vi ricordate la “FASE 1: Dare un nome al problema partendo dall’analisi del problema” e la “FASE 2: Scrivere la specifica funzionale”? – Il massimo comune divisore di due numeri è il più grande numero, minore o uguale del più piccolo dei due, che divide entrambi Informatica di Base -- R.Gaeta 119 Esercizio: anno bisestile • Scrivere un algoritmo che verifichi se un anno è bisestile producendo un messaggio • Sapreste risolverlo senza un’analisi del problema? • Vi ricordate la “FASE 1: Dare un nome al problema partendo dall’analisi del problema” e la “FASE 2: Scrivere la specifica funzionale”? – Un anno è bisestile (ha 366 giorni) se è divisibile per quattro (come il 1980) e non è divisibile per 100 (ad es. il 1900 non è bisestile). Fanno eccezione gli anni divisibili per 400, che sono bisestili (ad es. il 2000 è bisestile). – Questa regola non si applica prima del 1582, anno di introduzione del calendario gregoriano. Informatica di Base -- R.Gaeta 120 Esercizio: busta paga • Scrivete un algoritmo che calcoli l’importo della busta paga settimanale di un lavoratore sapendo il numero di ore che ha lavorato durante una settimana e la retribuzione oraria • L’algoritmo deve segnalare l’opportunità di far recuperare al lavoratore delle ore di lavoro se non è stato rispettato l’accordo sindacale che prevede un minimo di 35 ore settimanali • L’algoritmo deve altresì tenere in conto le ore di straordinario che sono, come da contratto, retribuite il doppio di quelle normali Informatica di Base -- R.Gaeta 121 Esercizio: poligoni • Scrivere un algoritmo che, date le coordinate di quattro punti corrispondenti ai vertici di un poligono irregolare, riconosca se si tratta di un quadrato o di un rettangolo e nel caso calcoli la sua area Informatica di Base -- R.Gaeta 122 Problema: calcolare il massimo tra K numeri • Scrivere un algoritmo che fornisca in input ad un programma un numero K e K interi positivi. L’algoritmo deve restituire il valore massimo tra quelli introdotti e stampare in ordine inverso i numeri inseriti. • Sembra un problema già visto: – Si supponga di fornire in input ad un programma un numero K e K interi positivi. Il programma deve restituire il valore minimo tra quelli introdotti. • ma non lo è!! Infatti dobbiamo memorizzare tutti i valori inseriti per stampare il primo inserito per ultimo • Ma quante variabili usiamo? Informatica di Base -- R.Gaeta 123 Gli array • Nelle situazioni in cui si devono memorizzare un INSIEME di dati allori si può usare la struttura di dati chiamata vettore o array • Un array (vettore) è costituito da una sequenza di elementi consecutivi nella memoria di un calcolatore • Un array si può vedere come una generalizzazione del concetto di variabile Informatica di Base -- R.Gaeta 124 Gli array • Ad ogni istante un array individua un insieme di valori • Ogni singolo valore nell’array è individuato dall’identificatore (nome) dell’array e da un indice che ne individua la posizione nella sequenza degli elementi nell’array stesso • Un array è caratterizzato da una dimensione che esprime il numero di elementi che contiene • L’operazione di assegnazione permette di modificare il valore di un determinato elemento della sequenza come per una qualsiasi variabile • In genere gli elementi di un array sono tutti dello stesso tipo (stringhe, interi, caratteri, ecc.) ma in alcuni linguaggi di programmazione sono permessi array di elementi di tipo diverso, es. JavaScript, ma non è una scelta consigliabile Informatica di Base -- R.Gaeta 125 Gli array in Javascript • Gli array (o vettori) contengono un insieme di dati rappresentati da un singolo nome di variabile • Un array contiene un insieme di elementi • Ogni elemento è identificato da un indice (il primo ha indice zero) 0 elem ent o Informatica di Base -- R.Gaeta 126 Gli array in Javascript • Un array è creato mediante la seguente dichiarazione: var nome_array = new Array (numero_di_elementi) • Si fa riferimento ad un elemento, ad esempio, nei seguenti modi: – nome_array[0] = “Pippo”; – nome_array[y] = 27*sqrt(k/2); – window.prompt(nome_array[k*3]); Informatica di Base -- R.Gaeta 127 Problema: calcolare il massimo tra K numeri • Ipotizziamo di aver già letto i numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 Informatica di Base -- R.Gaeta 128 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 2 MAX Informatica di Base -- R.Gaeta 129 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 5 MAX Informatica di Base -- R.Gaeta 130 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 5 MAX Informatica di Base -- R.Gaeta 131 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 5 MAX Informatica di Base -- R.Gaeta 132 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 6 MAX Informatica di Base -- R.Gaeta 133 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 8 MAX Informatica di Base -- R.Gaeta 134 Problema: calcolare il massimo tra K numeri ListaNumeri 2 5 4 1 6 8 5 3 7 3 0 1 2 3 4 5 6 7 8 9 8 MAX Informatica di Base -- R.Gaeta 135 Problema: soluzione preliminare e raffinamenti start read K start leggi i K numeri leggi i K numeri i := 0 max := ListaNumeri[0] falso i<K calcola max write max scrivi in ordine inverso end leggi i K numeri vero read ListaNumeri[i] i := i + 1 end Informatica di Base -- R.Gaeta 136 Problema: soluzione preliminare e raffinamenti start start calcola max read K i := 1 leggi i K numeri falso i<K end calcola max vero max := ListaNumeri[0] vero calcola max write max ListaNumeri[i] > max max := ListaNumer[i] falso scrivi in ordine inverso i := i + 1 end Informatica di Base -- R.Gaeta 137 Problema: soluzione preliminare e raffinamenti start read K leggi i K numeri max := ListaNumeri[0] calcola max write max scrivi in ordine inverso start scrivi in ordine inverso i := K - 1 i >= 0 falso end scrivi in ordine inverso vero write ListaNumeri[i] i := i - 1 end Informatica di Base -- R.Gaeta 138 Esercizio • Tradurre il precedente algoritmo e tutti i successivi in pseudo-codice • Scrivere il codice Javascript che traduca l’algoritmo Informatica di Base -- R.Gaeta 139 Esempio • Assegnare a tutte le posizioni di un vettore un numero X. Assumere che la dimensione del vettore sia uguale ad N e che la prima posizione del vettore sia uguale a 0 Informatica di Base -- R.Gaeta 140 Esempio start read X,N i := 0 i<N falso end vero vettore[i] := X i := i + 1 Informatica di Base -- R.Gaeta 141 Codice Javascript <html> <head> <title>Esercizio sugli array</title> </head> <body> <script> <!-- Inizio script JavaScript var N,X,i; X = window.prompt("Inserisci il numero X"); X = X * 1; N = window.prompt("Inserisci la lunghezza dell'array"); N = N * 1; var vettore = new Array(N); i = 0; while (i < N) Inserito per mostrare { vettore[i] = X; il contenuto dell’array i = i + 1; } i = 0; while (i < N) { window.alert("vettore[" + i + "]=" + vettore[i]); i = i + 1; } // Fine script --> </script> </body> </html> Informatica di Base -- R.Gaeta 142 Esempio • Assegnare alle posizioni di indice pari di un vettore il valore 10 e alle posizioni dispari il valore 20. Assumere che la dimensione del vettore sia uguale ad N e che la prima posizione del vettore sia uguale a 0 Informatica di Base -- R.Gaeta 143 Esempio start read N i := 0 i<N falso end vero falso i è dispari vettore[i] := 10 vero vettore[i] := 20 i := i + 1 Informatica di Base -- R.Gaeta 144 Codice Javascript <html> <head> <title>Esercizio sugli array</title> </head> <body> <script> <!-- Inizio script JavaScript var N; var i; N = window.prompt("Inserisci la lunghezza dell'array"); N = N * 1; var vettore = new Array(N); i = 0; while (i < N) { if(i%2==0) { vettore[i] = 10; Inserito per mostrare } else il contenuto dell’array { vettore[i] = 20; } i = i + 1; } i = 0; while (i < N) { window.alert("vettore[" + i + "]=" + vettore[i]); i = i + 1; } // Fine script --> </script> </body> </html> Informatica di Base -- R.Gaeta 145 Problema: ricerca di un elemento • Ricerca di un numero all'interno di un vettore. Assumere che la dimensione del vettore sia uguale ad N e che la prima posizione del vettore sia uguale a 0. • Esempio: Se N=4 e il contenuto del vettore è – vettore[0]=7 – vettore[1]=10 – vettore[2]=555 – vettore[3]=14 • se proviamo a cercare il numero 555 il risultato deve essere il seguente: “il numero 555 è alla posizione 2 del vettore” • se proviamo a cercare il numero 90 il risultato deve essere il seguente: “il numero 90 non è presente nel vettore” Informatica di Base -- R.Gaeta 146 Problema: ricerca di un elemento start read N,X i := 0 presente := false i<N falso presente=false vero vero vero vettore[i]=X write "X è in posizione i" falso write "X non presente" falso end presente := true i := i + 1 Informatica di Base -- R.Gaeta 147 Codice Javascript: prima parte <html> <head> <title>Esercizio sugli array</title> </head> <body> <script> <!-- Inizio script JavaScript var N,X,i,presente; Non presente nell’algoritmo ma necessario N = window.prompt("Inserisci la lunghezza dell'array"); N = N * 1; var vettore = new Array(N); i = 0; while (i < N) { vettore[i] = window.prompt("Inserisci vettore[" + i + "]"); vettore[i] *= 1; //è la stessa cosa di: vettore[i]=vettore[i]*1; i = i + 1; } X = window.prompt("Inserisci il numero da ricercare"); X = X * 1; ……… ……… ……… Informatica di Base -- R.Gaeta 148 Codice Javascript: seconda parte ……… ……… ……… i = 0; presente = false; while (i < N) { if(vettore[i]==X) { window.alert("Il numero " + X + " è presente in posizione " + i); presente = true; } i = i + 1; } if(presente==false) { window.alert("Il numero " + X + " non è presente"); } // Fine script --> </script> </body> </html> Informatica di Base -- R.Gaeta 149 Problema: conteggio occorrenze • Conteggio delle occorrenze di un numero all'interno di un vettore. Assumere che la dimensione del vettore sia uguale ad N e che la prima posizione del vettore sia uguale a 0. • Esempio: Se N=4 e il contenuto del vettore è – vettore[0]=555 – vettore[1]=10 – vettore[2]=555 – vettore[3]=14 • se proviamo a contare quante volte il numero 555 compare nel vettore allora il risultato deve essere il seguente: “il numero 555 compare 2 volte” • se proviamo a cercare il numero 90 il risultato deve essere il seguente: “il numero 90 compare 0 volte” Informatica di Base -- R.Gaeta 150 Problema: conteggio occorrenze start read N,X i := 0 occorrenze := 0 i<N falso write occorrenze vero vero vettore[i]=X occorrenze := occorrenze + 1 end falso i := i + 1 Informatica di Base -- R.Gaeta 151 Codice Javascript: prima parte <html> <head> <title>conteggio occorrenze in array</title> </head> <body> <script> <!-- Inizio script JavaScript var N; var X; Non var i; var occorrenze; presente nell’algoritmo ma necessario N = window.prompt("Inserisci la lunghezza dell'array"); N = N * 1; var vettore = new Array(N); i = 0; while (i < N) { vettore[i] = window.prompt("Inserisci vettore[" + i + "]"); vettore[i] *= 1; i = i + 1; } X = window.prompt("Inserisci il numero da ricercare"); X = X * 1; ……… ……… Informatica di Base -- R.Gaeta 152 Codice Javascript: seconda parte ……… ……… i = 0; occorrenze = 0; while (i < N) { if(vettore[i]==X) { occorrenze = occorrenze + 1; } i = i + 1; } window.alert("Il numero " + X + " compare " + occorrenze + " volte nell'array"); // Fine script --> </script> </body> </html> Informatica di Base -- R.Gaeta 153 Problema: verifica ordinamento • Scrivere un algoritmo ed un relativo programma in Javscript che calcoli il valore di una variabile booleana che deve essere true se l’array è ordinato in maniera crescente e false altrimenti e stampi il relativo messaggio. Assumere che la dimensione del vettore sia uguale ad N e che la prima posizione del vettore sia uguale a 0. • Esempio: Se N=4 e il contenuto del vettore è – vettore[0]=555, vettore[1]=10, vettore[2]=555, vettore[3]=14 allora la variabile deve valere false • Esempio: Se N=4 e il contenuto del vettore è – vettore[0]=12, vettore[1]=17, vettore[2]=555, vettore[3]=1312 allora la variabile deve valere true Informatica di Base -- R.Gaeta 154 Problema: verifica ordinamento start read N i := 0 ordinato:= true i < N -1 falso vero ordinato=true vero vero vettore[i]>vettore[i+1] ordinato := false falso falso write "array ordinato" write "array ordinato" end i := i + 1 Informatica di Base -- R.Gaeta 155 Codice Javascript: prima parte <html> <head> <title>verifica ordinamento array</title> </head> <body> <script> <!-- Inizio script JavaScript var N; var i; var ordinato; N = window.prompt("Inserisci la lunghezza dell'array"); N = N * 1; var vettore = new Array(N); i = 0; while (i < N) { vettore[i] = window.prompt("Inserisci vettore[" + i + "]"); vettore[i] *= 1; i = i + 1; } ……… ……… Informatica di Base -- R.Gaeta 156 Codice Javascript: prima parte ……… ……… i = 0; ordinato = true; while (i < N) { if(vettore[i]>vettore[i+1]) { ordinato = false; } i = i + 1; } if(ordinato==true) { window.alert("array ordinato"); } else { window.alert("array non ordinato"); } // Fine script --> </script> </body> </html> Informatica di Base -- R.Gaeta 157 Individuazione di sottoproblemi • Quando il problema è complesso conviene partire con una individuazione di sottoproblemi • Scriviamo un algoritmo contenente azioni o condizioni complesse per l’esecutore che dettaglieremo e raffineremo in passaggi successivi per ottenere un algoritmo direttamente eseguibile • Ognuno dei sottoproblemi potrà essere risolto da un algoritmo a parte che potremo riutilizzare, quando sarà necessario, nella soluzione di ulteriori problemi complessi. Informatica di Base -- R.Gaeta 158 Individuazione di sottoproblemi: vantaggi • I dettagli delle diverse soluzioni sono descritti negli algoritmi dei sottoproblemi • In generale, uno stesso sottoproblema deve essere risolto più volte nella soluzione di un problema principale o in problemi diversi • Dagli algoritmi derivano programmi, quindi si possono raccogliere librerie di software da riutilizzare in nuovi programmi Informatica di Base -- R.Gaeta 159 Esempio: ripetizione di codice • Se in un algoritmo fosse prevista la lettura di due numeri positivi in ingresso, allora la parte di codice Javascript che traduce questa parte dell’algoritmo potrebbe essere Informatica di Base -- R.Gaeta 160 Esempio: ripetizione di codice <SCRIPT> <!-- Inizio script JavaScript var a0, b0, r; a0 = window.prompt("Inserisci il primo numero"); while (isNaN(a0) || a0 <= 0 || a0 == null || ((a0 - parseInt(a0)) != 0)) { window.alert("Il valore " + a0 + " non va bene,\n" + "inserire un numero intero positivo."); a0 = window.prompt("Inserisci il primo numero"); } a0 = a0 * 1; b0 = window.prompt("Inserisci il secondo numero"); while (isNaN(b0) || b0 <= 0 || b0 == null || ((b0 - parseInt(b0)) != 0)) { window.alert("Il valore " + b0 + " non va bene,\n" + "inserire un numero intero positivo."); b0 = window.prompt("Inserisci il primo numero"); } b0 = b0 * 1; var a = a0, b = b0; […] // Fine script --> </SCRIPT> Informatica di Base -- R.Gaeta 161 Esempio: ripetizione di codice • Desideriamo controllare che l’input inserito sia effettivamente un numero intero positivo • Se non è un intero positivo il numero inserito si segnala l’errore e si richiede una nuova immissione • Si noti parseInt(.), isNaN(.) e alert(.) Informatica di Base -- R.Gaeta 162 Esempio: ripetizione di codice • Il precedente esempio contiene due blocchi di istruzioni simili per la richiesta e il controllo dell’input, una per ogni valore richiesto all’utente • I due blocchi di istruzioni differiscono per: – la variabile su cui è memorizzato il valore in input (a0 e b0) – il messaggio che viene visualizzato nella finestra “prompt” (“Inserisci il primo/secondo numero”) • Se l’algoritmo prevedesse l’inserimento di 12 numeri da memorizzare in altrettante variabili avremmo scritto per 12 volte lo stesso codice!!! • Ci piacerebbe poter disporre di una nuova istruzione del tipo • promptNumero(messaggio) • La nuova istruzione dovrebbe essere come prompt ma con il controllo che il valore immesso sia un intero positivo Informatica di Base -- R.Gaeta 163 Esempio: ripetizione del codice • Se dovessimo scrivere un algoritmo che presi tredici numeri determini se sono tutti e tredici dispari o meno allora questo stralcio di codice dovrebbe essere scritto 13 volte per 13 variabili diverse (con un array risparmieremmo un po’) var N1, N1_dispari; N1 = window.prompt("Inserisci il numero"); N1 = N1 * 1; while (N1 > 1) { N1 = N1 - 2; } if (N1==0) { N1_dispari = true; } else { N1_dispari = true; } Informatica di Base -- R.Gaeta 164 Esempio: ripetizione del codice • Ci piacerebbe poter disporre di una nuova istruzione del tipo • NumeroDispari(numero) • La nuova istruzione dovrebbe dire true se il numero è dispari e false altrimenti così potremmo scrivere var N1, N1_dispari; N1 = window.prompt("Inserisci il numero"); N1 = N1 * 1; N1_dispari = NumeroDispari(N1); Informatica di Base -- R.Gaeta 165 Individuazione di sottoproblemi: vantaggi • Per risolvere il problema del calcolo del MCD bisogna risolvere il sottoproblema della divisibilità • Per risolvere il problema del pari o dispari bisogna risolvere il sottoproblema della divisibilità • Per risolvere il problema del numero primo bisogna risolvere il sottoproblema della divisibilità • La suddivisione in sottoproblemi serve a risolvere un sottoproblema con un algoritmo, codificarlo in un linguaggio di programmazione, riusare il codice scritto per la risoluzione di altri problemi (pensate al problema di calcolare la radice quadrata di un numero) Informatica di Base -- R.Gaeta 166 Le funzioni: definizione • In altre parole: si vorrebbe definire una funzione , cioè una parte di codice utilizzabile in più parti di uno stesso programma • In JavaScript questo è possibile farlo utilizzando la parola chiave function : nome della funzione function nome_della_funzione ( arg1, arg2, …, argn) { “definizione della funzione” } parentesi graffe! parametri “formali” della funzione, usati nella definizione della funzione Informatica di Base -- R.Gaeta 167 Le funzioni: richiamo • La definizione di una funzione è una sequenza di istruzioni, un blocco di istruzioni • Le istruzioni contenute in una funzione non vengono eseguite quando definite ma solo al momento del richiamo della funzione: • nome_della_funzione(val1, val2, …, valn) parametri attuali della funzione • Quando l’interprete incontra un richiamo di una funzione passa ad eseguire il codice contenuto nella definizione della funzione, dopo aver sostituito i parametri formali con quelli attuali Informatica di Base -- R.Gaeta 168 Ambito di validità delle variabili • Variabili locali: i parametri formali e le dichiarazioni di variabili interne ad una funzione • Variabili globali: le dichiarazioni di variabili esterne alle funzioni, a livello più alto • La variabili locali sono visibili solo all'interno della funzione in cui sono dichiarate ma mai all'interno di altre funzioni o a livello principale • Le dichiarazioni locali nascondono quelle principali con lo stesso identificatore Informatica di Base -- R.Gaeta 169 Le funzioni: restituire un risultato • All’interno di una funzione si può usare l’istruzione return per restituire dei valori, di solito il risultato prodotto dalla funzione stessa – return <espressione>; : restituirà il valore computato dall’espressione – return ; : restituirà undefined • In entrambi i casi si esce dalla funzione e l’interprete JavaScript passa ad eseguire l’istruzione che segue il richiamo della funzione Informatica di Base -- R.Gaeta 170 Esempio <SCRIPT> <!-- Inizio script JavaScript function promptNumero(messaggio) { var numero = window.prompt(messaggio); while (isNaN(numero) || numero <= 0 || numero == null || ((numero - parseInt(numero)) != 0)) { alert("Il valore " + numero + " non va bene,\n" + "inserire un numero intero positivo."); numero = prompt(messaggio); } return numero * 1; } var a0, b0, r; a0 = promptNumero("Inserisci il primo numero"); b0 = promptNumero("Inserisci il secondo numero"); var a = a0, b = b0; […] // Fine script --> </SCRIPT> --> Informatica di Base -- R.Gaeta 171 Esempio • La funzione promptNumero(.) richiede un numero intero in input, verifica che il valore immesso lo sia • Il valore restituito è il numero intero positivo inserito dall’utente, dopo averlo convertito in numero(!) • Il parametro attuale è il messaggio da visualizzare nella richiesta Informatica di Base -- R.Gaeta 172 Individuazione di sottoproblemi: esempio • Scrivere un algoritmo che determina se un numero è perfetto. • Un numero si dice perfetto quando è uguale alla somma di tutti i suoi divisori escluso se stesso. • Ad esempio, il numero 28, divisibile per 1, 2, 4, 7, 14 è un numero perfetto (28 = 1 + 2 + 4 + 7 + 14). • Per scrivere questo algoritmo dovremmo scrivere un algoritmo per la divisibilità ed il relativo codice Javascript Informatica di Base -- R.Gaeta 173 Esempio: numero perfetto start N divisore := 1 somma := 0 vero vero divisore < N N divisibe per divisore falso vero somma = N falso falso somma := somma+divisore write "numero perfetto" divisore := divisore + 1 write "numero non perfetto" end Informatica di Base -- R.Gaeta 174 Codice Javascript <html> <head> <title>Esercizio sui numeri perfetti</title> </head> <body> <script> <!-- Inizio script JavaScript function isDividable(dividendo,divisore) { if(dividendo%divisore==0) return true; else return false; } function promptNumero(messaggio) { var numero = window.prompt(messaggio); while (isNaN(numero) || numero <= 0 || numero == null || ((numero - parseInt(numero)) != 0)) { window.alert("Il valore " + numero + " non va bene,\n" + "inserire un numero intero positivo."); numero = window.prompt(messaggio); } return numero * 1; } Informatica di Base -- R.Gaeta 175 Codice Javascript var N; var divisore; var somma; N = promptNumero("Inserisci il numero"); divisore = 1; somma = 0; while (divisore < N) { if(isDividable(N,divisore)==true) somma = somma + divisore; divisore = divisore + 1; } if(somma==N) window.alert("Il numero " + N + " è perfetto"); else window.alert("Il numero " + N + " non è perfetto"); // Fine script --> </script> </body> </html> Informatica di Base -- R.Gaeta 176 Cosa è un programma per il processore? <html> <head> <title>Esempio</title> </head> <body> <script> <!-- Inizio script JavaScript var A,B,X; ……… ……… ……… if(A==B) X = 1; else X = 2; // Fine script --> </script> </body> </html> A: indirizzo in RAM 1000 B: indirizzo in RAM 1002 X: indirizzo in RAM 1004 4726 ……. 4730 MOV R1,1000 4734 MOV R2,1002 4738 MOV R3,1004 4342 JNE R1,R2,4354 4346 MOV R3,#1 4350 JMP 4358 4354 MOV R3,#2 4358 …….. Informatica di Base -- R.Gaeta 177