“Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Che cosa è un computer? E’ una macchina1 superveloce nel fare i calcoli ma non è intelligente, cioè essa deve essere informata su cosa deve fare quando riceve certi dati di input, attraverso i programmi. Che significa programmare un computer? Programmare un computer significa descrivere un procedimento capace di far fare ad una macchina una serie ordinata di azioni in modo che il risultato finale sia il lavoro da svolgere. Chi è il programmatore? Chi è l’utente? L’uomo che programma un computer. E’ utente qualsiasi persona che usa il computer anche se non è in grado di programmarlo.2 Es. quale è la serie ordinata di azioni che deve svolgere il barista per preparare un caffè? La serie ordinata di azioni da svolgere è a grandi linee la seguente: 1. Accettare le monete dal cliente in modo che siano in quantità sufficienti 2. Inserire la polvere del caffè nella macchina 3. Erogare il caffè nella tazzina 4. Aggiungere il cucchiaino alla tazzina Analogamente quali azioni deve compiere la macchina del caffè del corridoio? Le stesse (in più essa effettua anche l’azione di aggiungere lo zucchero) in modo automatico, cioè senza l’intervento dell’uomo, in modo che il risultato finale, l’erogazione del caffè sia il risultato da svolgere ovvero il lavoro che dovrebbe svolgere l’uomo se non avesse la macchina del caffè. Ad es. se il programmatore volesse programmare la macchina del caffè una volta trovata la soluzione dovrebbe comunicarla alla macchina. In quale linguaggio dovrebbe parlare il programmatore con il computer? Il programmatore dovrebbe parlare: - in linguaggio macchina (linguaggio binario) o - nel suo linguaggio3 e usare un traduttore. Ad esempio se noi dovessimo comunicare con una persona che parla solo l’inglese o parliamo l’inglese o parliamo l’italiano e cerchiamo una persona che faccia da traduttore. Negli anni ’50 i primi programmatori comunicavano con la macchina in linguaggio macchina basato sul sistema binario costruito dalle sole due cifre 0 e 1 perciò detto anche linguaggio binario. Tale linguaggio riflette la logica dei componenti interni della macchina e quindi la sua sintassi è strettamente legata alle caratteristiche del computer per il quale è stato definito. Intorno alla seconda metà degli anni ’50 l’uomo ha iniziato a definire diverse linguaggi di programmazione cosiddetti ad alto livello, perché più vicini alle modalità umane di comunicazione come ad es.: il ForTran (Formula Translation) nato nel 1954 per scopi scientifici, il COBOL (Common Business Oriented Language) nato nel 1960 per scopi commerciali, il BASIC (Beginner’s All Purpose Symbolic Instruction Code) nato nel 1965 per avere un linguaggio che 1 In questa dispensa sono usati come sinonimi i termini di: macchina, calcolatore e computer. Nota al prof.: la differenza che c’è tra utente e programmatore è la stessa che c’è tra l’utente e il costruttore di case. 3 In realtà, come vedremo, il linguaggio usato dal programmatore sarà non il suo linguaggio naturale ma un linguaggio tecnico costituito da parole aventi un solo significato e da regole molto precise in modo che esso sia privo di sinonimi, ambiguità, eccezioni (perché si discostano dalle regole generali), allegorie, metafore, ecc. Per tutti questi motivi che un linguaggio tecnico è detto anche artificiale. 2 1 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone fosse molto semplice da imparare e da usare da parte del programmatore, il PASCAL nato nel 1971 ad opera di N. Wirth progettato come linguaggio per l’insegnamento della programmazione strutturata, l’ADA nel 1980 in onore di Lady Augusta Ada Byron che assistente di Charles Babbage è ritenuta essere la prima programmatrice della storia, il C, il Java, Il Visual Basic, ecc. Inoltre, il programmatore ha iniziato a definire dei particolari programmi detti compilatori o interpreti che traducessero un programma scritto in un linguaggio di programmazione ad alto livello in un programma scritto in linguaggio macchina (a basso livello o binario). I passi da compiere per realizzare un programma Dato un problema, i cinque passi che devono essere effettuati dal programmatore per arrivare ad avere un programma eseguibile dalla macchina sono: 1. capire il problema e individuarne la soluzione. 2. progettare la soluzione e comunicarla alla macchina. 3. creare il programma eseguibile. 4. provare il programma eseguibile sugli errori di logica (testing o collaudo) 5. documentare il programma sorgente (documentazione interna ed esterna) Vediamo i passi suddetti un po’ più nel dettaglio: 1. Capire il problema e individuarne la soluzione Dato un problema, capirlo significa individuare nel testo del problema quali sono i dati a disposizione cosiddetti dati di input e quali sono i risultati che ci si attende dal programma cosiddetti dati di output e individuarne la soluzione significa trovare una “formula o strategia risolutiva” che permetta alla macchina di trasformare i dati di input in risultati da fornire in output come mostra la figura seguente: Dati di Input Macchina Dati di Output Esempio: capire e individuare la soluzione nel problema seguente: Calcolare l’area a di un triangolo sapendo la base b e l’altezza h Per capire il problema, come suddetto, bisogna innanzitutto individuare nel testo quali sono i dati di input e i dati di output. Ebbene essi sono: - b e h sono dati di input - a è un dato di output La soluzione4, invece, ci viene fornita dalla geometria che dice che l’area a = (b * h) / 2 . A partire dalla soluzione possiamo ricavare la serie ordinata di azioni principali da comunicare alla macchina per programmarla. 2. Progettare la soluzione e comunicarla alla macchina Trovata la soluzione di un problema, progettarla significa descriverla con una serie ordinata di azioni principali. I metodi più usati per progettare la soluzione sono: il metodo del diagramma a blocchi e la pseudocodifica. Esempio Ad es. a partire dalla soluzione del calcolo dell’area di un rettangolo la serie ordinata di azioni è la seguente: 4 La soluzione è semplicemente l’idea logica trovata per risolvere il problema, in tal caso la formula. 2 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 1. leggere la base b; 2. leggere l’altezza h; 3. calcolare l’area a = (b * h) / 2; 4. scrivere l’area a Da questo es. si deduce come ad es. l’azione 3 non può essere eseguita prima delle azioni 1 e 2. Questo sottolinea il fatto che le azioni da seguire deve essere ordinate. Successivamente per comunicare alla macchina la soluzione, la serie ordinata di azioni deve essere, tradotta in un linguaggio di programmazione ad alto livello e salvata in un file detto programma sorgente. I programmi sorgenti essendo dei file hanno solitamente un’estensione scelta in base al linguaggio di programmazione ad alto livello usato come: .pas nel linguaggio Pascal, .bas nel linguaggio Basic, .c nel linguaggio C, .cbl nel linguaggio Cobol, ,java nel linguaggio java, ecc. 3. Creare il programma eseguibile Per trasformare un programma sorgente in un programma direttamente eseguibile dalla macchina bisogna usare un programma traduttore. Di programmi traduttori ne esistono di due tipi: compilatore e interprete. Con il compilatore il programma sorgente, per essere trasformato in un programma direttamente eseguibile dalla macchina, deve passare la fase di compilazione e la fase di link come mostra la figura seguente: Programma sorgente Fase di Compilazione Programma oggetto Fase di Link Programma eseguibile Nella fase di compilazione il programma sorgente se non presenta errori sintattici e lessicali5 viene tradotto in un programma in linguaggio macchina e salvato in un file, detto programma oggetto avente l’estensione .obj Nella fase di link il programma oggetto, mediante un programma detto linker6, viene unito ad alcune librerie dell’ambiente del linguaggio di programmazione scelto e salvato in un altro file, detto programma eseguibile avente l’estensione .exe Con l’interprete il programma sorgente viene tradotto immediatamente in programma eseguibile, nel senso che l’interprete traduce ed esegue, un’istruzione alla volta, tutte le istruzioni del programma sorgente. La traduzione si interrompe solo in presenza di errori sintattici o lessicali nell’istruzione corrente.7 4. Provare il programma eseguibile sugli errori di logica (testing o collaudo) Creato il programma eseguibile, per poter dire che esso è veramente funzionante è necessario verificare che esso fornisca l’output corretto a fronte dei dati forniti in input. Tale attività è cosiddetta di testing o di collaudo. Per essere sicuri che il programma eseguibile funzioni perfettamente vanno effettuate molte prove verificando tutti i casi possibili di errore. Esempio: Riprendendo il programma che calcoli l’area di un triangolo, se vengono forniti in input i valori b=5 e h=4 ci si aspetta che il programma eseguibile fornisca in output l’area a = 10. Se, invece, il 5 Es. di errori sintattici e lessicali possono essere rispettivamente la mancanza di un punto e virgola e l’uso della parola “leggi” al posto della parola “read” se read è la parola usata dal lessico del linguaggio di programmazione usato. 6 Il linker oltre a collegare il programma oggetto con le librerie, permette di unire anche più programmi oggetto in un unico programma. 7 Nota al prof.: in questa occasione non ha senso parlare delle differenze tra compilatore e interprete visto che l’argomento di studio non è “I linguaggi di programmazione” ma i passi da compiere per realizzare un programma. Es. di linguaggi interpretati sono: VisualBasic, Lisp, Prolog, Jav, ecc. 3 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone risultato è 20 vuol dire che il programma non funziona bene e quindi esiste qualche errore di logica ( ad es. non è stata effettuata la divisione per 2 del prodotto b * h). Gli errori di logica o errori semantici vengono detti “bachi” (in inglese bug) che significa pulce per indicare la fastidiosità e la difficoltà di individuazione e di eliminazione. Per aiutare il programmatore ad eliminare tali errori esistono dei programmi detti debugger, il cui compito è quello di far eseguire il programma eseguibile passo dopo passo in modo che il programmatore possa visualizzare lo stato corrente dei dati del programma e quindi verificare la corretta esecuzione di una istruzione alla volta del programma. 5. Documentare il programma sorgente (documentazione interna ed esterna) I programmi sorgenti realizzati devono essere opportunamente documentati, in modo che chiunque debba modificarli in seguito possa sapere quale è la logica del programma. La documentazione di un programma sorgente può essere di due tipi: esterna e interna. La documentazione esterna è quella che fornisce le funzionalità del programma realizzato.8 La documentazione interna è quella interna al programma sorgente sottoforma di commento. I commenti sono istruzioni che non vengono tradotte in linguaggio macchina dal programma traduttore (compilatore o interprete) perchè servono solo al programmatore per ricordargli come ha risolto le parti più difficili del programma. Definizione di algoritmo9. Un algoritmo è una sequenza ordinata di azioni o istruzioni che permettono di risolvere tutti i problemi di una certa classe nel modo più efficiente possibile.10 Le istruzioni, inoltre, devono soddisfare ai seguenti requisiti: 1. elementari, cioè non ulteriormente scomponibili 2. in numero finito, nel senso che l’algoritmo deve avere un punto di inizio e un punto di fine 3. non ambigue, cioè che non lasciano dubbi di interpretazione al computer che dovrà eseguirla 4. deterministiche, in modo da garantire che i risultati ottenuti siano sempre gli stessi a prescindere dalla macchina che le esegue. Ad esempio: l’istruzione “moltiplica 3 per 4 produce sempre il medesimo risultato, anche se è eseguita su calcolatrici diverse. Che significa dire che l’algoritmo deve risolvere tutti i problemi di una certa classe? Significa che esso deve essere generale, cioè si deve occupare della risoluzione della più ampia famiglia di problemi, ovvero due o più problemi appartenenti alla stessa famiglia devono poter essere risolti con lo stesso tipo di algoritmo. Ad es. l’algoritmo che risolve il problema del calcolo dell’area di un rettangolo è generale se permette risolvere anche il problema del calcolo dell’area di un quadrato. Che significa dire che l’algoritmo deve essere il più efficiente possibile? Significa dire che esso deve risolvere il problema con il numero minimo di istruzioni. Per uno stesso problema ci possono essere più algoritmi. Un algoritmo si dice che è più efficiente o più efficace di un altro quando permette di risolvere il problema con un numero di istruzioni minore rispetto all’altro. Esempio Consideriamo i due seguenti problemi: 8 Nei programmi la documentazione esterna è ad es. la guida in linea. Nota al prof.: un algoritmo rispetto al concetto di soluzione di un problema più generico usato prima ha in più il fatto di soddisfare ai quattro requisiti: finitezza, deterministico, non ambiguità ed elementare su definiti. 10 Un algoritmo deve essere generale cioè si deve occupare della risoluzione di famiglie di problemi 9 4 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Problema 1 Trovare l’algoritmo che calcoli l’area di un rettangolo conoscendo la base b e l’altezza h. Quindi l’area a = b * h Problema 2 Trovare l’algoritmo che calcoli l’area di un quadrato conoscendo il lato l. Quindi l’area a = l * l ovvero posto b = l e h = l anche l’area di un quadrato è a = b * h Questo significa che l’algoritmo che calcola l’area di un rettangolo deve essere formulato in modo che possa essere applicato anche al calcolo dell’area di un quadrato ovvero deve essere generale. Alcuni esempi di algoritmi 1. Trovare l’algoritmo che permetta di risolvere il problema della sostituzione della ruota forata di un’automobile L’algoritmo da usare per risolvere tale problema è a grandi linee il seguente: 1. solleva l’auto con il crick 2. svita i bulloni della ruota 3. togli la ruota forata 4. metti la ruota 5. avvita i bulloni 6. abbassa l’automobile Osservazioni: le istruzioni di tale algoritmo verificano tutte le proprietà di un algoritmo? - L’istruzione 1 “solleva l’auto con il crick”, non elementare infatti può essere sostituita con la sequenza delle tre istruzioni elementari seguenti: “prendi il crick”, “inserisci il crick sotto l’automobile” e “solleva l’automobile”. - Anche l’istruzione 2 “svita i bulloni della ruota”, non elementare infatti può essere sostituita con la sequenza delle quattro istruzioni elementari seguenti: “svita il 1° bullone”, “svita il 2° bullone”, “svita il 3° bullone”, “svita il 4° bullone”, ecc 11 - L’istruzione 4 “metti la ruota” è ambigua poiché non specifica quale ruota bisogna inserire sotto l’automobile, la ruota forata appena tolta o la ruota di scorta. Tale istruzione 4, quindi, deve essere sostituita con l’istruzione ”metti la ruota di scorta” - Anche l’istruzione 5 “avvita i bullono” può essere ulteriormente scomposta. - La proprietà di finitezza è garantita. - La proprietà di essere deterministico è garantito dal fatto che le istruzioni se sono eseguite da persone diverse permettono di cambiare la ruota forata allo stesso modo. 2° Trovare l’algoritmo che permetta di risolvere il problema della preparazione di una torta al cioccolato I dati di input del problema, ovvero gli ingredienti sono: - ¼ di litro di latte, 300gr di farina, 3 uova, 200 gr di zucchero, 160 gr di burro, 20 gr di lievito. Il dato di output è la torta pronta Quale è l’algoritmo da usare per risolvere tale problema? La ricetta che è a grandi linee la seguente: 1. Mescolare in sequenza farina, zucchero, uova e cacao fino ad ottenere un impasto omogeneo.12 11 Infatti, ci sono automobili le cui ruote hanno più di quattro bulloni. 5 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 2. Aggiungere 150 gr di burro fuso e il lievito sciolto nel latte e mescolare fino ad amalgamare il tutto. 3. mettere il composto in una teglia imburrata (10 gr di burro). 4. far cuocere in forno per 40 min. alla temperatura di 160 gradi. Il diagramma a blocchi o di flusso o flowchart Per progettare13 un algoritmo negli esempi di algoritmi precedenti abbiamo usato il linguaggio naturale umano poco formale e rigoroso in quanto si trattava di risolvere problemi molto semplici. Quando i problemi da risolvere sono più complessi uno strumento a noi utile per riuscire a progettare l’algoritmo in modo più formale e rigoroso è il metodo del diagramma a blocchi. Esso consiste nel descrivere la sequenza ordinata di azioni di un algoritmo in modo grafico attraverso l’uso di simboli detti blocchi, collegati tra loro da frecce orientate che indicano il flusso delle azioni. I blocchi principali14 sono quattro e di forma geometrica diversa: ovale, parallelogramma, rettangolo e rombo. Ciascun blocco ha un proprio significato. All’interno di ogni blocco è presente un breve testo sintetico non ambiguo. I blocchi sono: blocco di inizio o di fine, blocco di lettura o di scrittura, blocco di elaborazione e blocco di decisione o di condizione. Ma vediamoli più nel dettaglio: 1. Blocco di inizio e di fine. Esso, rappresentato graficamente con un’ovale, si usa per indicare il punto di partenza e quello di terminazione dell’algoritmo. Dal blocco “inizio” parte una sola freccia che raggiunge la prima azione dell’algoritmo e verso “inizio” non arriva alcuna freccia. Invece, verso il blocco “fine” arrivano una o più frecce (in questa fig. solo una), ma da esso non ne parte nessuna come mostra la fig.: 2. Blocco di lettura o scrittura. Esso, rappresentato graficamente con un parallelogramma, si usa per indicare un’operazione di immissione di dati (detta operazione di lettura o di input) o un’operazione di emissione di dati (detta anche operazione di scrittura o di output). Verso il blocco, in genere, ci sono una o più frecce di entrata (in questa fig. solo una) e dal blocco c’è una sola freccia di uscita, come mostra la fig.: 3. Blocco di elaborazione. Esso, rappresentato graficamente con un rettangolo, si usa per indicare un’azione di calcolo. Verso il blocco, in genere, ci sono una o più frecce di entrata (in questa fig. solo una) e dal blocco c’è una sola freccia di uscita, come mostra la fig.: 12 Nota al prof.: ora che gli alunni hanno capito, con il 1° es. di algoritmo come si procede, in tale 2° es. puoi andare più spedito facendo solo osservare che ciascuna delle quattro istruzioni non è elementare e quindi si può scomporre ulteriormente 13 Nota al Prof.: progettare sta per descrivere. Uso questo per conformità rispetto a quanto detto precedentemente nei passi da compiere per realizzare un programma 14 Più avanti si introdurrà un nuovo blocco, l’esagono, per la struttura a iterazione prestabilita. 6 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 4. Blocco di decisione o di condizione. Esso, rappresentato graficamente con un rombo, si usa per indicare un’operazione di confronto tra due dati, per stabilire se la condizione in esso inserita è vera o è falsa. Verso il blocco c’è una sola freccia di entrata e dal blocco ci sono solo due frecce di uscita in corrispondenza delle quali si trovano indicazioni del tipo si/no, vero/falso o V/F come mostra la fig.: I quattro concetti base per la descrizione degli algoritmi 1) La variabile In tutti i linguaggi di programmazione il programmatore ha necessità di memorizzare temporaneamente alcuni valori durante l’esecuzione di un programma. Una variabile è fisicamente una celletta della RAM15 in cui è possibile memorizzare temporaneamente dei dati. Essa è individuata da: - un nome scelto a piacere (“battezzato”) dal programmatore composto da lettere e numeri ma che deve sempre iniziare per lettera, es: alfa, a1, cont, ecc. - un tipo di dati che stabilisce l’insieme dei possibili valori che essa può assumere. - un valore suscettibile a cambiamenti a seconda che si verificano o meno condizioni, eventi, ecc. da qui il nome variabile. Possiamo immaginare intuitivamente una variabile come una celletta, inizialmente vuota, contraddistinta da un nome in grado di contenere dei valori, come mostra la fig.: N nome celletta Dalla figura si evince che il nome N della variabile individua il “contenitore” mentre il valore della variabile individua il suo contenuto in un certo istante, quindi una variabile esiste indipendentemente dal suo contenuto. Una variabile deve essere dichiarata prima di poter essere usata, e nel momento della dichiarazione viene definito anche il suo tipo. Una variabile potrà contenere solo valori appartenenti al tipo di cui è stata dichiarata, se si tenta di assegnare ad una variabile un valore di un tipo diverso si commette un errore. Esempi d’uso - Se il programmatore deve conservare temporaneamente un numero intero letto dall’utente definirà ad es. una variabile intera N. Essa è una variabile perché? Essa è individuata da: un nome (N), un tipo che è il tipo intero che rappresenta l’insieme dei valori possibili che la variabile può assumere e da un valore ovvero il valore che la variabile assumerà in un certo istante - Se il programmatore tra tutti i numeri interi letti dall’utente dovrà calcolarne la media aritmetica definirà ad es. una variabile reale Media. Essa è una variabile perché? Essa è individuata da: un nome (MEDIA), un tipo che è il tipo reale che rappresenta l’insieme dei valori possibili che la variabile può assumere e da un valore ovvero il valore che la variabile assumerà in un certo istante. 15 Nota al prof.: disegnare lo schema del modello di Von Neumann individuando la CPU, la RAM, le unità di Input e Output ed infine le cellette che rappresentano in RAM le variabili 7 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone - Se il programmatore tra tutte le lettere minuscole dell’alfabeto lette dall’utente dovrà ricordarne l’ultima inserita definirà ad es. una variabile CARATERE. Essa è una variabile perché? Essa è individuata da: un nome (CARATTERE), un tipo che è il tipo carattere che rappresenta l’insieme dei valori possibili16 che la variabile può assumere e da un valore ovvero il valore che la variabile assumerà in un certo istante. I vantaggi dell’uso delle variabili 1) E’ comodo usare il nome di una variabile al posto del suo valore difficile da ricordare. Pensiamo alla SIM del nostro cellulare. Essa contiene una memoria permanente in cui noi salviamo i nostri contatti. Tale memoria può essere immaginata come una sequenza di celle di memoria del tipo: Mario Paolo Mario2 Paolo2 Mario3 ……… 0331 123456 347 1234567 329 1234567 dove ciascuna cella è identificata da un nome che è il nome del contatto e da un valore il numero di telefono, che può anche modificare nel tempo se il nostro amico cambia numero. Per ricondurci al primo vantaggio, noi usiamo i nomi dei contatti al posto del loro valore perché sono più semplici da ricordare. 2) Usare il nome di una variabile al posto del suo valore per eseguirvi sopra delle operazioni nel senso che se ad es. le variabili A e B contengono i valori 2 e -3,14 ha senso fare le seguenti quattro operazioni: A + B; A - B; A / B; A*B L’assegnazione Essa serve ad attribuire un valore ad una variabile. La sintassi è la seguente: nome Esempi -N1 - N M +1 - N 3,14 - N 5,5 Espressione compatibile riceve (si legge la variabile intera N riceve il valore 1); (si legge la variabile intera N riceve il valore della variabile intera M+1) (si legge la variabile intera N non può ricevere il valore reale 3,14); (si legge la variabile intera N non può ricevere il valore reale 5,5) 3) L’input L’istruzione di input rappresenta un secondo modo per attribuire un valore ad una variabile. A differenza dell’assegnazione però tale valore non viene specificato dal programmatore durante la descrizione dell’algoritmo ma viene acquisito durante l’esecuzione dell’algoritmo stesso attraverso un dispositivo di input come ad es. la tastiera. Nei diagrammi a blocchi indicheremo l’input con la sintassi: leggi (nome variabile) ad es. leggi(N) 16 I valori possibile di una variabile di tipo carattere sono i 26 caratteri dell’alfabeto minuscoli e maiuscoli, le cifre ‘0’, ‘1’,…,’9’ e i segni di punteggiatura. 8 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 4) L’output L’output ha come effetto quello di presentare su un dispositivo di output come ad es. il monitor del PC il valore di una variabile o di un calcolo.17 Nei diagrammi a blocchi indicheremo l’output con la sintassi: scrivi (nome variabile) ad es. scrivi (N) Esempi di algoritmi descritti con il metodo del diagramma a blocchi Problema1: Scrivere un algoritmo che dato un numero intero A letto dall’utente, calcoli e scriva in output il suo quadrato B18 e il suo doppio C. 19 Capiamo il problema:20 - I dati di ingresso sono: A - I dati di uscita sono: B e C - Le variabili sono: A B C Quindi, come mostra la figura a sinistra, dopo aver individuato i dati di ingresso e di uscita affinché il computer possa fornire i dati di uscita a noi non resta di comunicare al computer l’algoritmo che è: Quindi sul valore contenuto nella variabile A, letto in input è possibile fare comodamente l’operazione di somma e di prodotto21 Problema2: Scrivere un algoritmo che calcoli l’area di un triangolo conoscendo la base e l’altezza e poi la scriva in output22 17 Non ha senso effettuare un calcolo e poi non portarlo in uscita. E’ come dire non ha senso programmare la macchina del caffé a preparare il caffé se richiesto dall’utente e poi a non erogarlo nella tazzina. 18 Nelle classi degli istituti professionali conviene fermarsi, come primo es di algoritmo, al calcolo del quadrato B e conviene far notare agli alunni che per calcolare il doppio di un numero A possiamo seguire due strade alternative ed equivalenti: A + A o 2*A. 19 Nota al prof.: dire agli alunni di ricordare ora sia tutti i blocchi elencati e sia la sintassi dei quattro concetti fondamentali studiati. Inoltre per i primi algoritmi elencare a sinistra i dati di ingresso, di uscita e le variabili usate ed a destra disegnare la figura del conputer che riceve i dati di input e che grazie all’algoritmo fornisce i risultati voluti. 20 Nota al prof.: far notare agli allievi che si parte sempre da qui: d’altra parte abbiamo detto in precedenza che il primo passo per risolvere un problema è capire il problema. 21 Ciò sottolinea il secondo vantaggio dell’uso delle variabili poc’anzi elencato 22 Basta sfruttare la soluzione trovata in precedenza attraverso l’uso del linguaggio naturale umano e cosi riassunto: 1. leggere la base; 2. leggere l’altezza; 3. calcolare l’area = (base * altezza ) / 2; 4. scrivere l’area. 9 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Capiamo il problema: I dati di ingresso sono: base e altezza I dati di uscita sono: area Le variabili sono: base altezza area Problema3: Scrivere un algoritmo che letti due numeri x e y, calcoli e scriva in output la loro somma SOM. Capiamo il problema: I dati di ingresso sono: x e y I dati di uscita sono: SOM Le variabili sono: x y SOM Problema4: Scrivere un algoritmo che dati tre numeri interi A, B e C letti in input, calcoli la media aritmetica e la stampi in output ovvero graficamente: Capiamo il problema: I dati di ingresso sono: A, B e C I dati di uscita sono: M Le variabili sono: A B C M Tale algoritmo prevede, quindi, per comodità l’introduzione di un’altra variabile M che conterrà il risultato. La programmazione strutturata Per progettare un algoritmo, oltre agli strumenti finora studiati, si possono utilizzare alcuni schemi logici elementari, detti strutture. Esse, che permettono di costruire qualsiasi algoritmo23 dai più semplici come quelli visti finora ai più complessi, si possono classificare in tre tipologie: 23 Nota al prof.: conferma di quanto detto è fornito dal teorema di Bohm-Jacopini che afferma che qualsiasi algoritmo può essere definito usando esclusivamente le strutture di sequenza, di selezione e di iterazione. 10 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 1. struttura di sequenza o sequenziale 2. struttura di selezione o condizionale o alternativa 3. struttura di ripetizione o iterativa Quando nello studio della programmazione dei computer si fa uso sistematico di queste strutture allora la programmazione strutturata. La struttura sequenza In un algoritmo si parla di struttura di sequenza quando le azioni descritte sono eseguite una di seguito all’altra, secondo l’ordine con cui sono state definite, come mostra la figura: Come esempio di quanto detto consideriamo il seguente problema: Problema5 Trovare l’algoritmo che permetta di calcolare lo sconto del 20% sul prezzo di un articolo letto in input. Problema6: Trovare un algoritmo che permetta di effettuare lo scambio dei valori di due variabili intere x e y lette in input e di scrivere a video i nuovi valori assunti da esse. X Y Capiamo il problema: Cerchiamo di visualizzare il problema prima di risolverlo. Esempio1: Fissato il vincolo che in una mano ci può stare solo 1 penna alla volta, se ho una penna rossa nella mano sinistra e una penna nera nella mano destra per scambiarle come faccio? Uso un tavolo di appoggio per scambiarle, quindi seguo il percorso seguente: - sposto la penna rossa dalla mano sinistra sul tavolo; - nella mano sinistra rimasta vuota sposto la penna nera - nella mano destra rimasta vuota sposto la penna rossa prendendola dal tavolo. 11 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Esempio2: Supponiamo che X = 5 e che Y = 10 come faccio a scambiarne i valori? 1) se faccio X Y; Y X ottengo che X = Y = 10 e quindi non raggiungo il risultato voluto. 2) se faccio Y X; X Y ottengo che X = Y = 5 e quindi non raggiungo il risultato voluto. quindi, per effettuare lo scambio devo usare un appoggio anche qui. Tale appoggio si chiama variabile di appoggio e noi per comodità la chiameremo TEMP24 che dovendo contenere un valore di X e/o Y sarà anch’essa di tipo intero. Quale è la sequenza di azioni che ci permettono di risolvere il problema?25 1. Leggo x; 2. Leggo y; 3. Sposto il valore di x in temp; 4. Sposto il valore di y in x; 5. Sposto il valore di temp in y ; 6. Scrivo x; 7. Scrivo y I dati di ingresso sono: X e Y I dati di uscita sono: X e Y Le variabili sono: X, Y e TEMP X Y TEMP Problema7 26 Scrivere un algoritmo che accetti in input quattro variabili A, B, C e D di tipo intero, ruoti il loro valore di uno step in senso orario e scriva in output il loro valore modificato.27 Capiamo il problema: 24 La definiamo TEMP perché il suo valore è temporaneo e perché è una variabile ne di input e ne di output. Nota al prof.: In tal caso essendo il problema da risolvere abbastanza articolato e essendo che gli allievi, a questo punto della trattazione, ancora non sono padroni dei simboli del diagramma a blocchi conviene separare la difficoltà del disegno del diagramma a blocchi dalla difficoltà della logica. Quindi, in tale esercizio è giusto puntare l’attenzione prima sulla logica trovando la soluzione del problema come descrizione informale delle azioni ordinate da eseguire. 26 Nota al prof.: poiché tale problema usa di nuovo la variabile temp già spiegata, anziché spiegarlo alla lavagna cosicché tutti copiano, conviene organizzare gli allievi per gruppi di lavoro, chiedere a ciascun gruppo di produrre l’algoritmo su unico foglio bianco, assegnare un tempo max dopo il quale dovranno presentarlo al restante della classe. 27 Nota al prof.: al gruppo che risolve subito il problema, puoi assegnare il calcolo dell’analogo algoritmo che anziché ruotare di uno step in senso orario, ruota di due step in senso orario. Esso si può risolvere in due modi: applicando lo stesso algoritmo della rotazione di uno step due volte di seguito (modo più lungo) o osservando la fig. denominata ‘prima’ notare che basta scambiare il valore della variabile A con C e il valore della variabile B con D (modo più breve) 25 12 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone prima rotazione di uno step in senso orario dopo I dati di ingresso sono: A, B, C, e D I dati di uscita sono: A, B, C e D Le variabili sono: A, B, C , D e TEMP A B C D TEMP Per capire bene l’algoritmo fare il test con e poi senza l’uso della variabile TEMP La struttura di selezione La struttura di selezione permette di impostare nell’algoritmo percorsi o “rami” diversi in base a condizioni che possono essere o meno verificate. Un es, tratto dalla vita di tutti i giorni, potrebbe essere: “se l’evento atmosferico pioverà si verificherà allora prenderò l’autobus altrimenti se esso non si verificherà farò una passeggiata”. La struttura di selezione, nel metodo del diagramma a blocchi, si rappresenta cosi: Essa è detta, più precisamente, struttura di selezione a due vie in quanto presenta solo i due percorsi vero e falso detti anche ‘allora’ e ‘altrimenti’, V e F, Si e NO, 1 e 0, Acceso e Spento, ecc. Casi particolari della struttura di selezione 1) Si parla di struttura di selezione ad una via, quando il percorso ‘falso’ non è presente. Essa, nel metodo del diagramma a blocchi, si rappresenta cosi: 2) Si parla di struttura di selezione a più vie, quando oltre ai percorsi ‘vero’ e ‘falso’ ce ne sono altri. Essa, nel metodo del diagramma a blocchi, si rappresenta cosi: 13 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 3) Si parla di struttura di selezione annidata, quando in almeno uno dei due percorsi ‘vero’ o ‘falso’ è presente un qualsiasi altro tipo di struttura di selezione. Un es. di struttura di selezione annidata, nel metodo del diagramma a blocchi, si rappresenta così: All’interno di una s. di selezione ad una via c’è una s. di selezione a due vie 4) Si parla di struttura di selezione in cascata, quando dopo la chiusura di una struttura di selezione ci sono ‘in cascata’ altre strutture di selezione ad una via, a due vie, a più vie o annidate. Esempi con la struttura di selezione (a due vie) Problema8: Descrivere un algoritmo che calcoli la media di 3 voti A, B e C di informatica letti in input. Se la media è maggiore o uguale di 6 stampare a video il messaggio “hai la sufficienza in informatica” Esso è solo lievemente diverso dal problema4 su visto e perciò lo lascio come esercizio. Problema9: Descrivere un algoritmo che permetta di calcolare e di scrivere in output il maggiore tra due numeri interi N1 e N2 letti dall’utente. Capiamo il problema: I dati di ingresso sono: N1 e N2 I dato di uscita è il maggiore. Le variabili sono: N1 e N2 e MAX N2 N1 MAX Problema10: Descrivere un algoritmo che permetta di calcolare e di scrivere in output il minore tra due numeri interi N1 e N2 letti dall’utente. 14 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Esso è solo lievemente diverso dal problema9 su visto e perciò lo lascio come esercizio. Problema11 Letti in input due numeri interi N1e N2, scriverlo in output i due numeri ordinati in ordine crescente (cioè dal più piccolo al più grande) La logica proposizionale di Boole28 Le operazioni che un computer esegue non sono unicamente di tipo aritmetico. Nella CPU del computer sappiamo che c’è l’ALU, una unità che permette di eseguire operazioni sia aritmetiche: somma, differenza, divisione e prodotto che operazioni logiche: congiunzione, disgiunzione e negazione. In programmazione le operazioni logiche sono applicate alle cosiddette proposizioni Una proposizione p è una frase composta per lo meno da soggetto e predicato che può assumere solo due stati possibili: vero o falso. Esempi di proposizioni e non 1. ‘Londra è la capitale d’Italia’ è una proposizione in quanto ha valore decisamente falso. 2 ‘4 è un numero pari’ una proposizione in quanto ha valore decisamente vero 3. ‘Oggi splende il sole’ è una proposizione in quanto in quanto ha valore vero se il effettivamente splende e il valore falso in caso contrario. 4. ‘Prendimi il libro!’ Oppure ‘Che ora sono?’ non sono proposizioni in quanto non è possibile stabilire i rispettivi valori (vero o falso) di verità. Le proposizioni per i quali si può immediatamente affermare se sono veri o falsi prendono il nome di proposizioni semplici o atomici. Una combinazione di proposizioni legati da particolari operatori logici detti connettivi o operatori logici prende il nome di proposizione composta. Esempi di proposizioni composti 1. ‘Io ascolto un cd e mangio un panino’ è un enunciato composto in quanto è formato dalle proposizioni semplici: ‘io ascolto un cd’ e ‘ mangio un panino’ legati dall’operatore logico ‘e’. 2. ‘Stasera studierò o andrò al cinema’ è un enunciato composto in quanto è formato dai proposizioni semplici: ‘ Stasera studierò’ e ‘Andrò al cinema’ legati dall’operatore logico ‘o’. Il valori di verità: vero o falso dei due es. di proposizioni composte precedenti sarà definito dalla valutazione delle proposizioni semplici e dall’operatore logico che li congiunge. 28 Gorge Boole (1815-1864) è stato un matematico e logico inglese che ha posto le basi per la moderna logica matematica utilizzata oggi anche nel dialogo con il computer (Minerva, vol. 1, pag. 103) 15 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Gli operatori logici che useremo sono: - AND (che significa congiunzione) - OR (che significa disgiunzione) - NOT (che significa negazione) Per ognuno di tali operatori esiste una tabella detta tavola della verità Tavola di verità dell’operatore logico AND Siano p e q due proposizioni semplici, il valore di verità di p AND q è dato dalla seguente tabella: p falso falso vero vero Q falso vero falso vero p AND q falso falso falso vero La tabella mostra che solo se entrambe le proposizioni semplici p e q sono vere, la proposizione composta p AND q è vera.29 Ad es. solo se le proposizioni p = ‘io ascolto un cd’ e q = ‘mangio un panino’ sono vere, la proposizione composta p AND q = ‘io ascolto un cd’ e ‘mangio un panino’ è vera. Tavola di verità dell’operatore logico OR Siano p e q due proposizioni semplici, il valore di verità di p OR q è dato dalla seguente tabella: p falso falso vero vero Q falso vero falso vero p OR q falso vero vero vero La tabella mostra che solo se entrambe le proposizioni semplici p e q sono false, la proposizione composta p OR q è falsa.30 Ad es. solo se le proposizioni p = ‘io ascolto un cd’ e q = ‘mangio un panino’ sono false, la proposizione composta p OR q = ‘io ascolto un cd’ o ‘mangio un panino’ è falsa. Tavola di verità dell’operatore logico NOT Sia p una proposizione semplice, il valore di verità di NOT p è dato dalla seguente tabella: p falso vero NOT p vero falso Ad es. data la proposizione p = ‘Io faccio sport’, la proposizione negata è NOT p = ‘ Io non faccio sport’ Gli operatori logici: AND, OR e NOT si useranno nelle condizioni composte presenti nelle strutture di selezione e nei cicli a condizione iniziale e a condizione finale (vedi in seguito). Tre esempi con la struttura di selezione in cascata Problema12: Trovare un algoritmo che permetta di calcolare e di scrivere in output il maggiore 29 30 Questa osservazione serve a ricordarsi per esclusione gli altri tre casi della colonna p AND q. Questa osservazione serve a ricordarsi per esclusione gli altri tre casi della colonna p AND q. 16 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone di tre numeri interi N1, N2 e N2 letti dall’utente.31 Capiamo il problema: - Che significa dire che ad es. N1 è il maggiore? Significa dire che N1>N2 e che N1>N3 - Quali sono i casi possibili? Supponendo che i numeri letti N1, N2 e N3 siano rispettivamente 1, 2 e 3 i casi possibili sono? N1 1) caso: 3 2) caso: 1 3) caso: 1 N2 2 3 2 N3 1 il maggiore è N1 vuol dire che N1 > N2 e che N1 > N3 2 il maggiore è N2 vuol dire che N2 > N1 e che N2 > N3 3 il maggiore è N3 vuol dire che N3 > N1 e che N3 > N2 - Visto che per ognuno dei tre casi analizzati dobbiamo considerare due condizioni semplici ovvero una condizione composta sicuramente capiamo che nei rombi che confideremo ci saranno degli operatori logici AND. Per tale problema ci sono diversi algoritmi. Il 1° Algoritmo del Problema 12 è: Osservazione: Tale algoritmo in tutti e tre i casi per determinare il maggiore Max effettua 6 confronti. Ci sono algoritmi migliori? 2° Algoritmo del Problema12 31 Nota al prof.: agli studenti professionali, se non fai per semplicità il paragrafo sulla logica preposizionale di Boole, prima di scrivere alla lavagna l’algoritmo detta la seguente regola: “quando in un rombo ci sono due condizioni semplici collegate dalla congiunzione ‘e’, la condizione totale composta è vera solo se entrambe le condizioni semplici sono vere. In tutti gli altri casi la condizione totale composta è falsa”. Tale regola si applicherà nell’algoritmo seguente scrivendo, altresì, all’interno dei rombi la congiunzione ‘e’ ed non AND come mostra l’algoritmo. 17 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Osservazione: Tale algoritmo in tutti e tre i casi per determinare il maggiore Max effettua 2 confronti. La variabile conteggio Una variabile conteggio è un contatore che viene inizializzato al valore zero32 e poi viene incrementato di una unità ogni qual volta si verifica una certa condizione. Problema13: Trovare un algoritmo che permetta di calcolare quanti numeri positivi sono presenti tra tre numeri interi N1, N2 e N3 letti dall’utente. Scrivere in output la quantità dei numeri positivi calcolata.33 Osservazione Un esempio, quindi, di variabile conteggio è Cont, che dopo essere stata inizializzata a zero conta tra i numeri letti dall’utente quanti sono quelli positivi. 32 Nota al Prof.: per far capire il perché la variabile conteggio viene inizializzata a zero, dire che essa è simile al contatore del contachilometri dell’automobile o al contasecondi del cronometro di un orologio: tutti partono da zero. In seguito, però, ci saranno anche variabili a conteggio che saranno inizializzata ad un valore diverso come ad es. la variabile indice ciclo (ad 1, a 2) ecc. 33 I casi significativi di test sono dei tre numeri: tutti e tre positivi, tutti e tre negativi, alcuni positivi e alcuni negativi. 18 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Problema14: Trovare un algoritmo che calcoli la somma di tre numeri interi negativi N1, N2 e N3 letti dall’utente. Scrivere in output la somma calcolata. Problema15: Trovare un algoritmo che permetta di calcolare quanti numeri pari34 sono presenti tra tre numeri interi A, B e C letti dall’utente. Scrivere in output la quantità dei numeri pari calcolata. Capiamo il problema: 1) Osservazione Analizzando le divisioni seguenti: fig.1 1 2 3 2 4 2 6 2 1 0 1 1 0 2 0 3 si nota che i numeri pari 4 e 6 se divisi per due forniscono resto pari a 0, mentre i numeri dispari 1 e 3 se divisi per due forniscono resto pari a 0. Questa è una regola generale valida per qualunque intero n. Pertanto, possiamo asserire che, grazie alla 1) osservazione, il problema del calcolo dei numeri pari è stato ricondotto al problema del calcolo del resto e alla verifica che tale resto è = 0. 2) Osservazione Per conoscere il resto dobbiamo trovare una formula. Ebbene, la formula cercata si ricava guardando una delle divisioni precedenti. Ad es. guardando la divisione di fig. 1 ricaviamo che il resto 1 = 1 – 2*0. Questa è regola generale valida per qualunque intero n. Pertanto, possiamo asserire che in generale: (1) il resto = numero – 2* quoziente ove quoziente = | numero / 2 | ( parte intera del quoziente)35 34 Nota al Prof.: conviene presentare agli allievi il calcolo dei numeri pari come mostrato nell’algoritmo ovvero usando le variabili Q e poi R e non usando direttamente la funzione MOD del TurboPascal e del VisualBasic . Tale funzione sarà introdotta più avanti quando si dovrà codificare l’algoritmo in programma: basterà sostituire alla coppia di istruzioni relative al calcolo del quoziente e del resto per il numero A, B e C rispettivamente l’istruzione R A MOD 2, R B MOD 2 e R C MOD 2. 35 Nota al Prof.: Per giustificare ai ragazzi l’uso del simbolo | | simile al simbolo del valore assoluto usato in matematica dire:” in matematica il simbolo | | rappresenta la parte positiva di un n.ro; in informatica rappresenta la sua parte intera. 19 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Calcolando a mente le divisioni precedenti abbiamo visto che il quoziente è sempre un numero intero. Calcolando, invece, con la calcolatrice le stesse divisioni, ci accorgiamo che se il numero è pari il quoziente continua ad essere un numero intero mentre se il numero è dispari il quoziente è un numero frazionario, cioè un numero con parte intera e parte decimale. Poiché a noi nella formula (1) per il calcolo del resto ci interessa solo la parte intera del quoziente in tal caso tronchiamo la parte decimale del quoziente ovvero ci prendiamo solo la sua parte intera. Trovata la formula che ci permette di calcolare il resto abbiamo trovata la soluzione al nostro problema, quindi, l’algoritmo è: Algoritmi per casa - Trovare un algoritmo che permetta di calcolare la somma dei soli numeri positivi in una sequenza di tre numeri. Scrivere in output la somma calcolata. - Trovare un algoritmo che permetta di calcolare la somma dei soli dispari negativi in una sequenza di tre numeri. Scrivere in output la somma calcolata. - Trovare un algoritmo che permetta di calcolare quanti sono i pari e quanti sono i positivi in una sequenza di tre numeri. Scrivere in output il numero dei pari e il numero dei positivi trovati. Tre esempi con la struttura di selezione innestata 3° Algoritmo Problema12 20 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Osservazione: Tale algoritmo in tutti e tre i casi per determinare il maggiore Max effettua 2 confronti. La sua complessità computazionale è la stessa dell’algoritmo 2 del problema12 su visto. 2. Poiché dopo la chiusura della prima struttura di selezione ci sono altre strutture di selezione tale algoritmo è un es. d’uso di struttura di selezione annidata. Problema16 Trovare un algoritmo che risolvi il problema del calcolo delle radici x1 e x2 di un’equazione di 2° grado ax2+bx+c = 0 con a diverso da zero (altrimenti l’equazione diventa di primo grado). Capiamo il problema: − b ± delta 2a Dalla matematica sappiamo che per calcolare le radici di un’equazione di 2° grado bisogna studiare il segno del discriminante delta36 e analizzare tutti e tre i casi: < 0, = 0 e > 0 I dati di ingresso sono: a, b e c; I dati di uscita sono x1 e x2; delta = b2 - 4ac e x1,2 = Problema17 Letta una temperatura, si vuole classificarla scrivendo in output un messaggio secondo il seguente schema: 36 Se delta < 0 non si hanno radici reali (ma due radici complesse e coniugate); se delta = 0 si hanno due radici reali e coincidenti, se delta > 0 si hanno due radici reali e distinte. 21 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone L’algoritmo è: Notare l’assenza dopo ogni istruzione eccetto l’ultima che chiude il costrutto If - Then - Else Due es. di struttura di selezione a più vie Problema18 Trovare un algoritmo che legga una sequenza di caratteri minuscoli chiusa dal carattere ‘ * ’ , conti e scriva a video quante vocali ‘a’, quante vocali ‘e’, quante vocali ‘i’, quante vocali ‘o’ e quante vocali ‘u’ sono presenti nella sequenza letta. Le variabili da usare sono: car: contenente il carattere corrente letto di tipo carattere ca, ce, ci, co e cu: le cinque variabili contatore di vocali di tipo intero. I concetti di codice, codifica e decodifica Gli elaboratori operano al loro interno su dati binari ovvero scritti usando l’alfabeto {0,1}. L’utente opera su dati alfanumerici ovvero scritti usando l’alfabeto { 033112345, mamma, lunedì, ‘0’, ‘1’, …’9’, %, $, +, - , , , ecc }. Affinché ci sia una continua “conversazione” tra gli elaboratori ed l’utente è necessaria che ci sia una associazione tra l’insieme dei dati binari e l’insieme dei dati alfanumerici e viceversa come mostra la figura: Insieme dei dati binari Insieme dei dati alfanumerici 22 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Il codice è l’associazione tra l’insieme dei dati binari interni e l’insieme dei dati alfanumerici esterni e viceversa. La codifica è la traduzione dall’alfabeto esterno alfanumerico nell’alfabeto interno binario La decodifica è la traduzione dall’alfabeto interno binario all’alfabeto esterno alfanumerico Il codice ASCII Uno dei codici più diffusi e usati dagli elaboratori è il codice ASCII acronimo di American Standard Code for Information Interchange che significa codice americano standard usato per lo scambio di informazioni tra il computer e il mondo esterno. Esso è un codice alfanumerico a 7 bit37. Ciò significa che permette di codificare (rappresentare in binario) 27 = 128 simboli alfanumerici diversi con combinazioni binarie. I 128 = 32+16+80 simboli alfanumerici sono così suddivisi: - i primi 32 simboli sono “caratteri di controllo” non stampabili come ad es. il comando per andare a capo, il comando “pr” scendere o salire di una linea o di una pagina, il comando per dare uno spazio, ecc. - i successivi 16 simboli sono i segni di interpunzione seguenti: !, “, ‘, ( , ), la virgola, il punto e lo spazio, i simboli speciali: #, %, $, &, e i simboli delle 4 operazioni: + , - , *, /. - i successivi 80 simboli sono i simboli alfanumerici seguenti: numerali (0,1,…,9), le 26 lettere minuscole e le 26 lettere maiuscole dell’alfabeto, oltre ad altri caratteri: ?, <, >, =, [, ], ~, {, }, ecc. I suddetti 80 simboli alfanumerici, oltre ad essere codificati nel codice ASCII in binario, sono codificati anche in decimale nel modo seguente:38 - i numeri (0,1,…,9) sono tradotti in decimale con i numeri che vanno da 48 (0) a 57 (9); - le 26 lettere maiuscole (A..Z) sono tradotti in decimale con i numeri che vanno da 65 (A) a 90 (Z); - le 26 lettere minuscole (a..z) sono tradotti in decimale con i numeri che vanno da 97 (a) a 122 (z)39 Sapendo che tra i numeri sia in binario che in decimale è possibile stabilire una relazione d’ordine, cioè stabilire chi è più piccolo e chi è più grande, grazie ai simboli: <, ≤, > e ≥ possiamo affermare che è possibile stabilire una relazione d’ordine anche tra gli 80 simboli alfanumerici. Per tal motivo possiamo dire che ad es. - la condizione a < b fornisce a come minore - la condizione a < A fornisce A come minore - 9 < a fornisce 9 come minore La tabella ASCII I 7 bit del codice ASCII sono suddivisi logicamente in 7 campi rispettivamente di 3 e 4 bit . 37 Oltre al codice ASCII a 7 bit esiste un codice ASCII a 8 bit detto esteso. Esso coincide con il codice ASCII a 7 bit a patto di forzare l’ottavo bit a zero 38 Nell’editor Blocco note di Windows è possibile inserire un carattere non presente nella tastiera attraverso la pressione contemporanea dei tasti Alt + il numero decimale corrispondente al carattere. Ad es. per inserire nell’editor Blocco note la parentesi graffa aperta “{“ basta digitare Alt + 123 39 Ciò può essere confermato dal computer usando la combinazione dei tasti Alt + numero decimale 23 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone ove i primi tre bit rappresentano categorie di caratteri, mentre gli ultimi quattro servono a rispettare l’ordinamento dei caratteri all’interno di ogni categoria. Infatti, per ricavare la sequenza binaria corrispondente a ciascun carattere alfanumerico, la tabella 40 ASCII seguente si dovrà leggere cosi: - individuare il carattere alfanumerico di cui si vuole determinare la sequenza binaria ASCII - annotare prima i 3 bit sulla riga che invidiano la categoria e poi il nibble (semibyte) sulla colonna. Tabella ASCII: rappresenta le corrispondenze tra sequenze binarie e simboli alfanumerici Esempio 1: da carattere alfanumerico codice ASCII (CODIFICA) Supponiamo che l’utente inserisca, tramite tastiera la parola ‘computer’. Come essi saranno codificati in ASCII, all’interno del computer? Sapendo che: 110 0011 - 110 1111 - 111 1101 - 111 0000 – 111 0101 - 111 0100 – 110 0101 – 111 0010 c o m p u t e r la parola computer è codificata in ASCII così: 11000111101111111110111100001110101111010011001011110010 40 Si usa una tabella per rappresentare il codice ASCII perché la tabella permette di rappresentare graficamente le corrispondenze tra le sequenze binarie dell’alfabeto interno con i simboli dell’alfabeto alfanumerico esterno. 24 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Esempio 2: da codice ASCII carattere alfanumerico (DECODIFICA) Supponiamo che il computer voglia comunicare all’utente la sequenza binaria interna ASCII: 1000011100000110011101000101 Per quanto detto il computer, effettua la decodifica e trasmette all’utente quale parola? Soluzione Basta seguire i seguenti passi: - raggruppiamo i bit della sequenza a gruppi di 7, essendo il codice ASCII a 7 bit - tramite la tabella ASCII associamo a ciascun gruppo di 7 bit il corrispondente carattere 100 0011 – 100 0001 – 100 1110 – 100 0101 C A N E Quindi, quello che otteniamo è la soluzione che è ‘CANE’ La struttura di ripetizione o iterativa o ciclo Essa, in generale, consente di ripetere l’esecuzione di una porzione di algoritmo più volte, finché è verificata una certa condizione. Essa può essere di tre tipi: - a iterazione prestabilita o ciclo a contatore - a iterazione a controllo di testa o ciclo a condizione iniziale. - a iterazione a controllori coda o ciclo a condizione finale. La struttura a iterazione prestabilita Essa, nel metodo del diagramma a blocchi, si rappresenta cosi: Essa utilizza: 1) un nuovo blocco, l’esagono, che al suo interno contiene: una variabile a conteggio I inizializzata ad 1; un valore finale, VF, scelto dal programmatore, che stabilisce a priori il numero massimo di iterazioni; e la condizione 1≤ I ≤ VF 2) un blocco istruzioni che rappresenta la porzione di algoritmo da iterare. 3) un piccolo rombo che sottintende l’incremento di una unità della variabile conteggio I ad ogni iterazione ovvero l’istruzione I I +1 La ripetizione del blocco istruzioni avviene finché la variabile conteggio I assume un valore <= al valore finale VF prestabilito, mentre si arresta quando la variabile conteggio I assume un valore > del valore finale VF prestabilito. 25 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Quando si usa tale struttura?41 Abbiamo visto l’algoritmo che risolve il problema di lettura e somma di due numeri x e y. Per risolvere tale problema ci siamo limitati a considerare le variabili x, y e som (per la somma) e due istruzioni di lettura per x e per y. Se, invece, il nostro problema avesse chiesto di fare la somma di 100 numeri quante variabili e quante istruzioni avremmo dovuto usare ? La risposta è 101 ovvero le variabili: N1, …., N100 e la variabile somma SOM e 100 istruzioni di lettura.42 Osservazione Questo tipo di struttura si usa quando nell’algoritmo ci sono istruzioni che si ripetono un numero di volte prestabilito. Per capire meglio quanto abbiamo detto analizziamo più nel dettaglio il problema suddetto. Problema19 Trovare l’algoritmo che calcoli la somma di 100 variabili N1,…N100 lette in input e fornisca la loro somma SOM in output.43 Capiamo il problema: Potremmo leggere la prima variabile N1 e poi sommarla alla variabile somma SOM, leggere la seconda variabile N2 e poi sommarla alla variabile somma SOM,……leggere la 100° variabile N100 e poi sommarla alla variabile somma SOM. Tale soluzione fa prevedere un algoritmo lunghissimo. Come possiamo ovviare a questo problema? 44 Quello che si osserva è che: In tale soluzione si ripetono 100 volte la coppia di istruzioni: lettura della variabile Ni e somma del valore della variabile Ni al valore della variabile somma SOM. Allora possiamo usare una struttura a iterazione prestabilita per la coppia di istruzioni suddette, come mostra la figura: porzione di algoritmo da iterare Facendo il test si osserva che: 41 Nota al Prof.: non dettarlo agli allievi Nota al Prof.: in realtà dovremmo usare anche 100 istruzioni di somma parziale che però nel caso della somma di x e y non abbiamo usato e per tal motivo in tal caso per evitare confusioni è meglio non dire. 43 Nota al Prof.: tale algoritmo si può complicare ricercando non più la somma delle 100 variabili ma la media di esse e successivamente generalizzarlo al calcolo della media di M variabili lette in input. 44 Nota al Prof.: per far rendere conto gli allievi che effettivamente tale soluzione è lunghissima conviene disegnare alla lavagna a sx l’algoritmo senza ciclo (fermandosi alla lettura e alla somma parziale delle prime due variabili n1 e n2, scrivendo i puntini, e poi scrivendo la lettura e la somma parziale della variabile n100) e a dx l’algoritmo con il ciclo 42 26 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone - L’uso di tale struttura, inoltre, come si vede dalla figura, ci permette di usare lo stesso nome N, in luogo del nome Ni, per tutte e 100 le variabili da usare. In tal caso ciò è possibile poiché il nuovo valore di N va a modificare il vecchio valore di N solo dopo che il vecchio valore di N è stato sommato alla variabile somma SOM. - E’ giusto azzerare la somma SOM all’inizio dell’algoritmo poiché fatto un primo test, al secondo test si rischierebbe di assegnare alla variabile SOM un valore non nullo. Problema20 Trovare l’algoritmo che permette di calcolare il maggiore tra 10 numeri interi letti in input e di scriverlo in output45 Capiamo il problema: Tale problema è semplicemente la generalizzazione dello stesso problema visto precedentemente al caso di tre numeri interi. Poiché tale problema è stato risolto con due tipi di algoritmi diversi: uno peggiore e l’altro migliore, in tal caso si richiede di generalizzare al caso di dieci numeri interi l’algoritmo migliore. La caratteristica principale dell’algoritmo migliore consiste nell’inizializzare la variabile maggiore al primo numero letto. Ebbene, la stessa strategia si noterà nell’algoritmo che segue: porzione di algoritmo da iterare Osservazioni: - Il primo numero N viene letto fuori dal ciclo per permettere l’inizializzazione della variabile MAX - Notare che il contatore I del ciclo, per chiarezza, viene fatto variare tra 2 e 10. Infatti, si sarebbe potuto scrivere:” I da 1 a 9” ottenendo lo stesso risultato, ovvero la ripetizione di 9 volte della porzione di algoritmo disegnata in figura. - Analogamente è possibile l’algoritmo che calcola il minore tra 10 numeri letti in input - La variabile MAX non posso inizializzarla a 0 poiché se l’utente dovesse inserire come numeri interi tutti i numeri negativi da -10 a -1 calcolerebbe come maggiore di essi il numero 0 non inserito proprio dall’utente. Problema21 45 Nota al Prof.: successivamente questo algoritmo si può complicare ricercando oltre al maggiore anche il minore e successivamente generalizzarlo alla ricerca del maggiore e minore in una sequenza di M numeri interi letti in input. 27 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Trovare l’algoritmo che scriva in output i primi 10 numeri pari. Successivamente generalizzare l’algoritmo al caso di N numeri pari. Capiamo il problema: I primi 20 numeri interi sono: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 I primi 10 numeri interi pari: 2 4 6 8 10 12 14 16 18 20 Quindi, in generale, i primi n numeri interi pari si trovano tra i primi 2n numeri interi Soluzioni 1° soluzione: basta dividere tutti i numeri letti per 2 ricavando il resto e poi controllando che il resto sia = 0. Essa è l’idea già usata in precedenza nel problema15 e qui applicabile sia al caso di 10 numeri che al caso di N numeri (vedi figura). 2° soluzione: basta osservare che i numeri pari sono tutti quelli multipli di 2 e cioè 2=2*1, 4=2*2,…ecc. Come per la 1° soluzione essa è qui applicabile sia al caso di 10 numeri che al caso di N numeri (vedi figura). 1° algoritmo 2° algoritmo Facendo il test si osserva che: In questo algoritmo il numero di iterazioni non è noto al momento della scrittura dell’algoritmo ma si può comunque usare la struttura a iterazione prestabilita in quanto il valore di N viene stabilito al momento dell’esecuzione del programma associato all’algoritmo. Esercizi per casa sul ciclo a iterazione prestabilita - Trovare l’algoritmo che tra i soli pari di una sequenza di 10 numeri calcoli il maggiore - Trovare l’algoritmo che tra i soli pari e positivi di una sequenza di 10 numeri calcoli il minore. - Trovare l’algoritmo che di una sequenza di 10 numeri, calcoli il maggiore e il minore. - Trovare l’algoritmo che calcoli la media di 10 numeri letti in input. - Trovare l’algoritmo che scriva in output i primi 10 numeri successivi ad un numero N letto. - Trovare l’algoritmo che calcoli la somma dei primi N numeri dispari e verifichi che essa è uguale al quadrato di N (Ad es. se N=3, la somma è 1+3+5 = 32 = 9). La struttura a iterazione a controllo di testa 28 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Essa è una generalizzazione della struttura di iterazione prestabilita. Essa, nel metodo del diagramma a blocchi, si rappresenta cosi: Essa permette di iterare una porzione di algoritmo finché è vera una certa condizione stabilita non a priori. Essa si dice a controllo di testa poiché la condizione è posta all’inizio ovvero prima della porzione di algoritmo da iterare. Ciò comporta che se la condizione risulta subito falsa la porzione di algoritmo da ripetere non viene eseguita nemmeno una volta.46 Quando si usa tale struttura a iterazione a controllo di testa? Essa si usa quando non si sa a priori quante volte si deve iterare la porzione di algoritmo rappresentato in fig. dal blocco denominato istruzioni. Ad es. consideriamo il seguente: Problema22 Trovare un algoritmo che calcoli la somma di tutti i numeri interi inseriti dall’utente fino a quando l’utente non inserisca il valore 0. Scrivere in output la somma calcolata. Capiamo il problema: L’algoritmo da trovare è simile a quello visto precedentemente che usa la struttura di iterazione prestabilita con l’unica eccezione che qui il numero di volte che il ciclo si deve ripetere è determinato dal numero di interi che l’utente vorrà inserire, prima di inserire il numero 0 che determina la fine del ciclo. Ad es. se l’utente inserisse 10, 25, 100, 1000 interi a sua scelta e poi inserisse il valore 0 allora rispettivamente il ciclo si ripeterebbe 10, 25, 100, 1000 volte prima di terminare. Terminato il ciclo l’algoritmo non deve più richiedere la lettura di altri numeri in input ma deve provvedere ad effettuare la somma di tutti i numeri precedenti l’inserimento del numero 0. L’algoritmo è il seguente: 1° Test: L’utente inserisce subito il valore N=0 ed esce subito dal ciclo scrivendo il valore Som=0 Giusto 2° Test: L’utente inserisce tre numeri: 1, 2 e 3 e poi il valore 0 La variabile SOM=6 Giusto. 3° Test: L’utente inserisce cinque numeri: 1, 2, 3, -6 e –1 e poi il valore 0. La variabile SOM= -1 Giusto La struttura a iterazione a condizione finale Essa, nel metodo del diagramma a blocchi, si rappresenta cosi: 46 Se un ciclo ha una condizione di uscita che non si può mai verificare prende il nome di “ciclo infinito”, ed è un tipico errore di programmazione 29 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Essa permette di iterare una porzione di algoritmo fintantoché è falsa una certa condizione stabilita non a priori. Essa si dice a controllo di coda poiché la condizione è posta alla fine ovvero dopo la porzione di algoritmo da iterare. Ciò comporta che la porzione di algoritmo da iterare viene eseguita almeno una volta. Quando si usa tale struttura a iterazione a condizione finale? Essa si usa quando non si sa a priori quante volte si deve iterare la porzione di algoritmo rappresentato in fig. dal blocco denominato istruzioni. Quindi, essa si usa negli stessi casi in cui si usa la struttura a condizione iniziale. Per rendercene conto risolviamo il problema21 precedente stavolta sfruttando la struttura a iterazione a condizione finale. Deduzione La struttura a iterazione a condizione iniziale è, forse, equivalente alla struttura a iterazione a condizione finale ovvero un qualsiasi algoritmo che usa la struttura a iterazione a condizione iniziale si può trasformare in un algoritmo che usa la struttura a iterazione a condizione finale e viceversa? La risposta è si. La dimostrazione è rappresentata nella figura seguente: Per evitare che il ciclo a condizione finale a destra possa effettuare il ciclo almeno una volta è aggiunto una struttura di selezione a due vie. Inoltre, la condizione del ciclo a condizione iniziale deve essere negata prima di portarla nel ciclo a condizione finale. 30 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Poiché il ciclo a condizione finale effettua le istruzioni almeno una volta, affinché esse vengano eseguite anche dal ciclo a condizione iniziale sono aggiunte sopra la condizione del ciclo. Per renderci conto di quanto detto, trasformiamo l’algoritmo del problema 21 che usa un ciclo a condizione iniziale in un algoritmo che usa un ciclo a condizione finale (1° caso) e poi faremo i viceversa (2° caso) 1°caso: dal ciclo a condizione iniziale al ciclo a condizione finale 2° caso: : dal ciclo a condizione finale al ciclo a condizione iniziale 31 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone Problema23 Trovare un algoritmo che permette di leggere una sequenza di numeri interi e di arrestarsi quando sono stati inseriti 5 numeri pari. Scrivere in output la somma dei 5 numeri pari. Capiamo il problema Se l’utente inserisce i numeri interi: 1 3 5 2 4 6 7 8 9 10 12 allora adesso l’utente ha inserito 5 numeri interi pari allora devo fermarmi 1 1 - 2 - 4 6 8 10 allora adesso l’utente ha inserito 5 numeri interi pari allora devo fermarmi Quindi non possiamo prevedere dopo quanti numeri interi inseriti il numero dei pari è cinque. Pertanto non possiamo utilizzare una struttura a iterazione prestabilita. L’unica alternativa è la struttura a iterazione a condizione iniziale. Ebbene quale sarà la condizione iniziale? Poiché devo fermami a leggere numeri quando il numero dei pari è cinque basterà conteggiare tutti i numeri pari inseriti dall’utente con una variabile a conteggio cosicché quando essa sarà = 5 si potrà uscire dal ciclo. Inoltre, il problema richiede di scrivere in output la somma dei cinque numeri interi pari inseriti. Pertanto man mano che l’utente inserirà un numero pari, dovremo sommarlo ad una variabile somma inizializzata a zero fuori dal ciclo. Alla fine del ciclo la variabile somma conterrà la somma cercata. Le variabili usate sono: - CONTP: è una variabile contatore che conta quanti sono i numeri pari inseriti dall’utente.47 - SOM: è una variabile di tipo intero che contiene la somma dei numeri interi pari inseriti. - NUM: è il numero intero letto dall’utente - Q: è la parte intera del quoziente ottenuto dividendo per 2 il numero NUM inserito - R: è il resto della divisione per 2 di NUM L’algoritmo è: 47 Inizializzando CONTP a zero quando CONTP varrà 4 avrà già contato 5 numeri pari. Quindi è per questo motivo che quando CONTP vale 5 che bisogna uscire dal ciclo. N.B. Al posto di usare tale condizione si potrebbe inserire la condizione equivalente seguente: CONTP < 5. 32 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone 48 Problema24 Trovare un algoritmo che determini quanti sono pari e quanti sono dispari in una sequenza di numeri interi positivi terminata da -1 letta in input. Capiamo il problema: Finché l’utente non inserisce il numero -1, bisogna contare il numero degli interi pari e degli interi dispari inseriti attraverso l’uso di due variabili conteggio. Le variabili usate sono: CONTP: è una variabile contatore che conta quanti sono i numeri pari inseriti dall’utente. CONTD: è una variabile contatore che conta quanti sono i numeri dispari inseriti dall’utente. NUM: è la variabile numero intero che volta per volta conterrà i numeri letti dall’utente R: è la variabile resto della divisione del numero NUM con 2. L’algoritmo è: Problema25 Trovare un algoritmo che letta una sequenza di 1 e 0 chiusa da -1, determini il maggiore numero di 0 presenti nella sequenza e lo scriva in output. Capiamo il problema: Se ad es. la sequenza fosse: (*) 1 1 0 0 1 0 0 0 0 1 1 1 0 0 0 -1 notiamo prima due zeri consecutivi, poi quattro zeri consecutivi e poi infine tre zeri consecutivi, quindi il maggiore numeri di zeri nella sequenza è 4. Per calcolare che il maggiore è 4 quindi bisogna: - trovare tutte le sottosequenze di zero presenti nella sequenza inserita e calcolare di quanti zero 48 Nota al Prof.: il seguente problema24 e il problema25 seguente possono essere dati come traccia alla esercitazione di gruppo da far svolgere o in classe o in laboratorio. Tutte e due sfruttano il ciclo a condizione iniziale. 33 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone esse sono fatte - calcolare la sottosequenza di zero maggiore tra tutte le sottosequenze di zero. In tal caso basta sfruttare l’algoritmo del maggiore applicato alle sottosequenze di zero. Le variabili usate sono: BIT: numero corrente binario da leggere; CONTZ: contatore di zeri consecutivi in una sottosequenza; MAXZ: massimo numero di zeri consecutivi da calcolare. Esercizi per casa sulle strutture a iterazione con controllo in testa e in coda - Trovare un algoritmo che permette di leggere una sequenza di numeri interi e di arrestarsi quando sono stati inseriti n numeri dispari. Scrivere in output la somma degli n numeri dispari. (Esso è una generalizzazione del problema24 al caso di n numeri interi ed usa la struttura ad iterazione a condizione iniziale). - Trovare un algoritmo che determini il maggiore in una sequenza di interi positivi terminata da -1 letta in input (La struttura a iterazione è quella a condizione finale). Elementi di un linguaggio e ambiente di programmazione Turbo Pascal49 Un linguaggio si basa sui seguenti elementi: alfabeto, lessico, sintassi, semantica e parole utente. - L’alfabeto è l’ insieme dei simboli ammessi nel linguaggio. Ad esempio nel linguaggio Turbo Pascal, l’alfabeto è costituito da: tutte le lettere da A-Z maiuscole, le lettere a-z minuscole e i caratteri speciali. - Sintassi è l’ insieme delle regole per formare frasi corrette. Ad esempio nel linguaggio Turbo Pascal frasi non sintatticamente corrette generano errori sintattici. Tali errori vengono rilevati al momento della traduzione e sono segnalati dal compilatore, che indica anche il punto in cui si sono verificati e devono essere corretti dal programmatore, intervenendo sulla lista di istruzioni del programma per poi rieseguire il processo di compilazione. Essi consistono in una errata scrittura di un’istruzione rispetto alla sintassi prevista, come ad es. il mancato punto e virgola alla fine di una linea di codice.50 49 50 Per capire pensa al linguaggio naturale usato da noi. In Italiano quando mettere le virgole, che verbi usare, formare frasi brevi, ecc. 34 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone - Lessico è l’ insieme delle parole del linguaggio. Ad esempio nel linguaggio Turbo Pascal alcune sue parole che si possono usare sono: BEGIN e END, REPEAT e UNTIL, IF THEN ELSE, ecc. L’uso di parole non corrette generano errori lessicali. Come per gli errori sintattici essi vengono rilevati al momento della traduzione e sono segnalati dal compilatore, che indica anche il punto in cui si sono verificati e devono essere corretti dal programmatore, intervenendo sulla lista di istruzioni del programma per poi rieseguire il processo di compilazione. - Semantica è il significato delle frasi. Gli errori di semantica o logici vengono rilevati al momento della esecuzione (run-time) del programma. Sono errori di logica commessi a livello di analisi del problema e riguardano il procedimento risolutivo realizzato. In particolare, sono errori di interpretazione dell’ istruzione al momento della sua esecuzione. Gli errori logici si possono manifestare in tre casi principali: - il programma si blocca perché l’errore ha causato un blocco della CPU a causa di un’operazione non permessa (ad esempio una divisione per 0); - Il programma va in loop infinito perchè la CPU continua ad eseguire senza fine un certo blocco di istruzioni. - Il programmatore deve bloccare dall’esterno l’esecuzione del programma. Il programma termina correttamente ma non dà i risultati previsti. - Parole utente sono le parole che non fanno parte del linguaggio, ma sono di uso comune per l’uomo. Ad esempio nel linguaggio Turbo Pascal noi possiamo scegliere il nome da dare al nome del programma e alle variabili. 51 Ambiente di sviluppo del Turbo Pascal Sebbene tutti i sistemi operativi dispongano di un proprio programma editor, quando si sviluppa un programma in un dato linguaggio, il fornitore del linguaggio52 mette a disposizione del programmatore un ambiente IDE (Integrated Development Environment), Ambiente di sviluppo integrato), che comprende gli strumenti di base per la programmazione. Essi sono: - editor per scrivere e modificare il testo sorgente di un programma. - compiler per tradurre il programma sorgente in programma oggetto. - linker per collegare il programma oggetto ai moduli dell’ambiente (librerie) necessarie per realizzare il programma eseguibile (.exe) - debugger per il rilevamento degli errori di esecuzione, facendo eseguire il programma eseguibile passo dopo passo ossia istruzione per istruzione per esaminarne il funzionamento (menù Run Trace Into o F7) e in contemporanea valutando il contenuto corrente delle variabili usate nel programma (menù Debugger Evaluate Modify o Ctrl+F4). Avviando il programma Turbo.exe si apre la prima finestra dell’ambiente Turbo Pascal. Essa è composta da tre parti: 51 52 In italiano usare i termini msg per messaggio, xkè per perché, ecc. Nel caso dell’ambiente Turbo Pascal, la Borland 35 “Le basi della Programmazione” - IPSIA “Parma” - Anno scolastico 2005 / 2006 - Prof. M. Simone la barra dei menù in alto; la finestra editor al centro e la barra dei comandi di scelta rapida in basso. La prime cose da fare sono: - nella cartella informatica c’è una cartella denominata tpascal. In essa, creare una cartella contenente il nome del vostro gruppo del tipo gr1,gr2,gr3, ecc e all’interno della cartella del gruppo, creare una sottocartella denominata con un nome che ricorda l’esercitazione corrente da svolgere. - cliccato sul link Turbo Pascal 7.0 selezionare menù File Change dir…. perché dovrete informare l’ambiente TPascal dove avrete intenzione di salvare i file: .pas, .bak e .exe della vostra esercitazione corrente, settando il percorso assoluto da noi scelto: ad es. D:\informatica\tpascal\gr1\cartella_nome_esercitazione - aperto un nuovo file dal menù File dovete da subito provvedere a salvarlo, ovvero a salvarlo permanentemente in memoria di massa. Spesso, purtroppo, la finestra editor si chiude da sé, cancellando tutto il codice sino a quel punto scritto e non salvato. Quindi è buona norma salvare di tanto in tanto il file .pas che si creando premendo comodamente sul tasto di scelta rapida F2. - usare i menù Compile per compilare il file sorgente .pas trasformandolo (se non ci sono errori) in file oggetto e poi il menù Run per linkare il file oggetto alle librerie e per generare il file .exe. - per qualsiasi problema, prima di chiamare l’insegnante, consultare la guida in linea selezionando dal menù Help, l’opzione Index Ok e poi scrivendo la parola da cercare. Struttura di un programma in Turbo Pascal program media_tra_due_numeri; var n1, n2, somma: integer; media: real; Nome del programma Dichiarazione delle variabili begin (* lettura dei dati di input *) writeln(' dammi il ', i, ') numero'); readln(n1); writeln(' dammi il ', i, ') numero'); readln(n2); somma:=(n1+n2); media:=(somma/2); Corpo del Programma (* stampa dei dati di output *) writeln(‘la media è’, media); readln; end. 36