“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