Programmazione 1: Introduzione alla Programmazione Michele Nappi, Ph.D Dipartimento di Matematica e Informatica Università degli Studi di Salerno mnappi@unisa.it www.dmi.unisa.it/people/nappi it/people/nappi 089-963334
Algoritmi e Programmi Problema Algoritmo Programma Definizione del problema Dati iniziali (input) Dati intermedi (se necessari) Dati finali (output) algoritmo deriva dalla nisba al-khuwarizmi del matematico Muhammad ibn Musa del 9 sec. Definizione di un insieme di passi logici che trasformano i dati iniziali in dati finali Il risultato è un algoritmo, un insieme finito di istruzioni che, se eseguite ordinatamente, sono in grado di risolvere il problema di partenza. 9/22/2010 Michele Nappi 2
Algoritmi e Programmi Proprietà dell algoritmo Non Ambiguità (delle istruzioni) Eseguibilità (delle istruzioni) i i) Finitezza (deve terminare) 9/22/2010 Michele Nappi 3
Algoritmo del Caffé Dati Iniziali: Acqua, Caffé, Fornello,Gas,, Macchinetta Procedura: 1. Riempire la caldaia della Macchinetta con l Acqua; 2. Riempire il filtro della Macchinetta con il Caffé; 3. Montare i dispositivi della Macchinetta del Caffé; 4. Posizionare la Macchinetta sul Fornello e accendere il Gas; 5. Attendere l ebollizione dell Acqua; 6. Spegnere il Gas quando il Caffè è disponibile in forma liquida nella Macchinetta 9/22/2010 Michele Nappi 4
Esempio (1) [(1.5+2.5)x[(-4)x(-2)]]:2 1. Tipi di Dati Reali: 1.5, 2.5 2. Tipi di Dati Relativi: (-)4, (-)2 3. Tipi di Dati Relativi: (+)2 Sviluppo: [4x8]:2 Tipi di dati Relativi: 4,8,2 Sviluppo: 32:2 Tipi di dati Relativi: 32,2 Sviluppo: 16 Tipi di dati Relativi:16 9/22/2010 Michele Nappi 5
[(1.5+2.5)x[(-4)x(-2)]]:2 1. Memorizza i Dati Reali: 1.5, 2.5 2. Memorizza i Dati Relativi: -4, -2 3. Memorizza il Dato Relativo: (+)2 Esempio (1.2) Somma 1.5 con 2.5 e memorizza il risultato in un Dato Reale Moltiplica -4 e -2 e memorizza il risultato in un Dato Relativo [4x8]:2 Moltiplica 4 e 8 e memorizza il risultato in un Dato Relativo 32:2 Dividi 32 per due e memorizza il risultato in un Dato Relativo 16 9/22/2010 Michele Nappi 6
Esempio (2) Problema Un college ha una lista di risultati di test (1 = promosso, 2 = bocciato) per 10 studenti. Scrivere un programma che analizza i risultati. Se più di 8 studenti sono stati promossi, visualizzare Aumentare le tasse Nota che Il programma deve elaborare 10 risultati di test Sarà usato un ciclo controllato da contatore Due contatori possono essere usati Uno per il numeno di promossi, uno per il numero di bocciati Ogni risultato di test è un numero (1 o 2) Se il numero non è un 1, assumiamo che è un 2 9/22/2010 Michele Nappi 7
Esempio (2) Descrizione ad alto livello Analizzare i risultati ti dell esame e decidere se debbano essere aumentate le tasse scolastiche Primo raffinamento Inizializzare le variabili Prendere in input 10 valutazioni della prova e contare le promozioni e le bocciature Visualizzare un sommario dei risultati dell esame e decidere se le tasse scolastiche debbano essere aumentate Secondo raffinamento: Inizializzare i le variabili Inizializzare le promozioni a zero Inizializzare le bocciature a zero Inizializzare gli studenti a uno 9/22/2010 Michele Nappi 8
Esempio (2) Terzo raffinamento : Prendere in input 10 valutazioni della prova e contare le promozioni e le bocciature Finchè il contatore degli studenti è inferiore o uguale a dieci prendere in input il prossimo risultato d esame Se lo studente è stato promosso Aggiungere uno ai promossi altrimenti Aggiungere g uno ai bocciati Aggiungere uno al contatore degli studenti Quarto raffinamento : Visualizzare un sommario dei risultati dell esame e decidere se le tasse scolastiche debbano essere aumentate Visualizzare il numero delle promozioni Visualizzare il numero delle bocciature Se più di otto studenti sono stati promossi Visualizzare il messaggio aumentare le tasse 9/22/2010 Michele Nappi 9
Esempio (3) Il Fattoriale di n: n!=n*(n-1)*(n-2)*..*3*2*1 Prendere in input il numero n e considerare una variabile fact inizializzata i i ad 1 Se n=0 or n=1 allora il risultato è fact Finchè n non risulta uguale ad 1effettuare le seguenti operazioni: Moltiplicare n e fact e memorizzare il risultato in fact (fact=n*fact) Decrementare n di un unità (n=n-1) Quando n risulta uguale ad 1 il risultato è fact 9/22/2010 Michele Nappi 10
Algoritmi e Programmi L'algoritmo dovrà essere specificato in un linguaggio che l'elaboratore è in grado di interpretare in modo corretto e contenere istruzioni che possono essere eseguite dal computer stesso. Un programma può quindi essere definito come un insieme di istruzioni espresse in un linguaggio formale (sintassi e semantica) chiamato linguaggio di programmazione. I computer però non sono in grado di capire nemmeno il linguaggio programmazione in quanto il microprocessore sa elaborare solo in linguaggio binario: ecco pertanto che i programmi dovranno essere ulteriormente tradotti da appositi applicazioni i i quali interpreti ti o compilatori. i 9/22/2010 Michele Nappi 11
Algoritmi e Programmi 9/22/2010 Michele Nappi 12
Algoritmi e Programmi 9/22/2010 Michele Nappi 13
Algoritmi e Programmi 9/22/2010 Michele Nappi 14
Algoritmi e Programmi 9/22/2010 Michele Nappi 15
Sintassi e Semantica di un LP Sintassi Specifica come costruire un programma nel linguaggio di programmazione Grammatiche context-free (notazione BNF Backus Naur Form) Semantica Specifica il significato del linguaggio 9/22/2010 Michele Nappi 16
Sintassi e Semantica di un LP Esempio: Sintassi: data =CC / CC / CCCC C è un abbreviazione per cifra Semantica: 01/02/2003 In Italia 1 Febbraio 2003 Negli USA 2 Gennaio 2003 9/22/2010 Michele Nappi 17
Linguaggi di Programmazione Ad oggi (2008) esistono circa 2500 Linguaggi gg di Programmazione (LP) più o meno noti e diffusi I LP sono normalmente classificati in tre grandi famiglie basate sul concetto di istruzione, i linguaggi imperativi, quelli funzionali e quelli logici; 9/22/2010 Michele Nappi 18
Linguaggi di Programmazione Nei linguaggi imperativi l'istruzione è un comando esplicito, che opera su una o più variabili oppure sullo stato interno della macchina, e le istruzioni vengono eseguite in un ordine prestabilito. Scrivere un programma in un linguaggio imperativo significa essenzialmente occuparsi di cosa la macchina deve fare per ottenere il risultato che si vuole, e il programmatore è impegnato nel mettere a punto gli algoritmi necessari a manipolare i dati. Esempio: Ada C Modula-2 Oberon Pascal 9/22/2010 Michele Nappi 19
Linguaggi di Programmazione I linguaggi funzionali sono basati sul concetto matematico di funzione. In un linguaggio funzionale puro l'assegnazione esplicita risulta addirittura completamente assente (si utilizza soltanto il passaggio dei parametri). In tale modello rivestono particolare importanza la ricorsione, e, come struttura dati, la lista (sequenza ordinata di elementi). Esempio: Lisp Logo Scheme Standard ML Caml OCaml 9/22/2010 Michele Nappi 20
Linguaggi di Programmazione Nei linguaggi logici l'istruzione è una clausola che descrive una relazione fra i dati: programmare in un linguaggio logico significa descrivere l'insieme delle relazioni i esistenti ti fra i dati e il risultato t voluto, e il programmatore è impegnato nello stabilire in che modo i dati devono evolvere durante il calcolo. Non c'è un ordine prestabilito di esecuzione delle varie clausole, ma è compito dell'interprete trovare l'ordine lordine giusto. Esempio: Mercury Prolog 9/22/2010 Michele Nappi 21
Paradigmi di Programmazione Paradigma funzionale Programma = (insieme di) funzioni Funzione: dati Scheme, Lisp, ML risultato Paradigma imperativo Programma = sequenza di istruzioni Pascal, C, Java 9/22/2010 Michele Nappi 22
Linguaggi di Programmazione Tre tipi i di linguaggi i di programmazione 1. Linguaggi Macchina Stringhe di numeri che danno istruzioni i i specifiche della macchina Esempio : +1300042774 +1400593419 +1200274027 2. Linguaggi Assembly Abbreviazioni che rappresentano operazioni di calcolo elementari (tradotte via assemblatori) Esempio: LOAD BASEPAY» ADD OVERPAY STORE GROSSPAY 9/22/2010 Michele Nappi 23
Linguaggi di Programmazione 3.Linguaggi ad alto livello Simili all Inglese e usano notazioni matematiche (tradotti via compilatori) Esempio: grosspay = basepay + overtimepay; 9/22/2010 Michele Nappi 24
Linguaggi di Programmazione 9/22/2010 Michele Nappi 25
Algoritmi e Programmi: Interpreti ti e Compilatori i L interprete è un programma che traduce, istruzione per istruzione, il programma sorgente. Ogni istruzione è sottomessa alla CPU appena è stata tradotta. Anche se una se istruzione è contenuta 10 volte in un programma verrà tradotta ogni volta che si presenterà al traduttore. Il compilatore, invece, traduce tutto il programma in una sola volta e poi lo sottomette alla CPU. Se una stessa istruzione compare 10 volte, viene tradotta solo la prima volta e poi memorizzata in maniera tale che possa essere ripresa dal compilatore e inserita nelle restanti nove righe di programma 9/22/2010 Michele Nappi 26
Algoritmi e Programmi E' possibile così riassumere le diverse fasi che portano dall'analisianalisi del problema all'ottenimento di una soluzione: 1. Analisi 2. Formalizzazione 3. Programmazione 4. Traduzione 5. Esecuzione 6. Verifica 9/22/2010 Michele Nappi 27
Analisi Algoritmi e Programmi Viene analizzato il problema in tutti i suoi aspetti e si cercano i fattori sui quali fare leva per risolverlo. Il risultato è una soluzione informale Formalizzazione La soluzione trovata nel passo precedente è riformulata in maniera da utilizzare una sintassi e una semantica corrette, per produrre un algoritmo di risoluzione (Le relazioni tra costrutti dei linguaggio ed azioni sono o univocamente definite). Il linguaggio utilizzato sarà di tipo formale, ma necessiterà di ulteriori passi per essere reso utilizzabile dalla macchina Programmazione Il risultato di questa fase è un programma di alto livello che utilizza un linguaggio di programmazione costituito da segni matematici e parole chiave e non da una successione indecifrabile di 0 e 1. Questa fase però non produce ancora un programma che possa essere compreso dalla macchina: si necessita della fase seguente 9/22/2010 Michele Nappi 28
Algoritmi e Programmi Traduzione In questa fase il programma di alto livello viene tradotto da appositi software in linguaggio macchina Esecuzione Il programma viene sottoposto al microprocessore che lo esegue e fornisce la soluzione al problema Verifica Tramite un test pratico di funzionamento ed un analisi teorica del programma dovrebbe si verifica che il software realizzato corrisponda alle sue aspettative e svolga le funzioni per cui è stato elaborato 9/22/2010 Michele Nappi 29
Algoritmi e Programmi A questo punto è necessaria la formazione degli utenti, per impartire loro le istruzioni che occorrono per servirsi dei nuovo software: essa può avvenire secondo diverse modalità. Nella fase di implementazione, infine, tutti gli utenti interessati possono servirsi dei programma elaborato (versione beta del programma). Gli aggiornamenti successivi sono detti "versioni", o release, e sono identificati ifi i da un numero progressivo. 9/22/2010 Michele Nappi 30
Il Software Software di Base (Sistema Operativo) Software Applicativo (Office Automation) Software di Sviluppo (Ambiente di Programmazione) 9/22/2010 Michele Nappi 31
Il Software Il software di base: racchiude in sé sia il software di sistema, necessario a far funzionare l'elaboratore, sia quello utilizzato dagli sviluppatosi di programmi per facilitare il loro lavoro; Il software applicativo: comprende invece tutti quei programmi utilizzati dagli utenti per gestire,,per esempio, la posta, la contabilità di casa, per redigere una lettera, creare una presentazione, telefonare via Internet, ecc., oppure applicativi creati ad hoc per risolvere un determinato problema. 9/22/2010 Michele Nappi 32
Il Software Hardware Sistema Operativo Software di Base 9/22/2010 Michele Nappi 33
Il Sistema Operativo Interpretare ed eseguire comandi elementari e tradurre i comandi degli applicativi in operazioni della macchina Organizzare g la struttura della memoria di massa Ripartire le risorse del sistema tra gli utenti. (Multiuser Multitasking) 9/22/2010 Michele Nappi 34
Ambiente di Programmazione Editor Compilatore Linker Debugger Per Scrivere fisicamente il programma Permette di interrompere l esecuzione del programma dopo ogni istruzione per correggere eventuali errori (bug) Traduce i programmi in codice oggetto, eseguibile dal calcolatore Collega diversi moduli di un programma, e le cosiddette librerie, i producendo d il vero e proprio eseguibile 9/22/2010 Michele Nappi 35
Ambiente di Programmazione Fasi di Programmi C: 1. Editing 2. Preprocessing 3. Compilazione 4. Linking 5. Caricamento 6. Esecuzione 9/22/2010 Michele Nappi 36