ECDL - Modulo 1 Fondamenti

Angela Gay 25 gennaio 2010

Indice
1 Gli algoritmi 1.1 Definire il termine algoritmo . . . . . . . . . . . . . . . . . . . . . 1.2 Descrivere in forma algoritmica la procedura risolutiva di semplici problemi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Rappresentare algoritmi mediante diagrammi . . . . . . . . . . . 2 Rappresentazione dei dati 2.1 Effettuare correlazioni fra i sistemi di numerazione decimale e binario, convertire dei dati numeri dall’uno all’altro sistema. . . . 2.2 Rappresentare i caratteri in forma binaria. Definire le nozioni di bit e di byte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 ASCII standard ed esteso . . . . . . . . . . . . . . . . . . 2.2.2 UNICODE . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Descrivere le caratteristiche di una immagine digitale. . . . . . . 3 Linguaggi 3.1 Cenni di logica . . . . . . . . . . . . . 3.1.1 Congiunzione (AND) . . . . . . 3.1.2 Disgiunzione (OR) . . . . . . . 3.1.3 Negazione (NOT) . . . . . . . . 3.2 Linguaggi naturali e linguaggi formali 3.2.1 Fasi di creazione del software . 3.3 Pseudolinguaggio . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 4 7 7 8 8 9 9 10 10 11 11 11 12 15 16 21

1

1 GLI ALGORITMI

2

1

Gli algoritmi

Il termine algoritmo deriva dal nome del matematico persiano Abu Ja’far Mohammed ibn Mâsâ al- Khowârizmî, vissuto nel IX secolo d.C., che si ritiene essere uno dei primi autori ad aver fatto riferimento esplicitamente a questo concetto, nel libro Al-giabr wa’l mu kabala (Libro sulla ricomposizione e sulla riduzione), dal quale tra l’altro prende anche le origini la parola algebra. Per spiegare cosa è un algoritmo, partiamo da un esempio. Esempio 1 Supponiamo di voler istruire un ’esecutore’ (macchina o persona) che sa fare moltiplicazioni e divisioni, affinché possa calcolare l’area di un triangolo del quale vengono fornite la misura della base b e dell’altezza h. Le istruzioni che dobbiamo dare all’esecutore, per renderlo capace di calcolare l’area del triangolo, potrebbero essere le seguenti: INIZIO 1. acquisisci b e h; 2. moltiplica b per h; 3. dividi il prodotto per 2; 4. comunica il risultato ottenuto. FINE Questo sequenza di istruzioni costituisce un algoritmo.

1.1

Definire il termine algoritmo

Siamo ora in grado di dare una definizione intuitiva (cioè, non rigorosa) di: Algoritmo Per algoritmo si intende una successione finita di passi contenenti le istruzioni che specificano le operazioni da compiere per risolvere una classe di problemi. L’algoritmo dunque deve godere delle seguenti proprietà: 1. finitezza, cioè costituito da un numero finito di passi, o istruzioni; 2. univocità, non deve essere ambiguo; 3. realizzabilità le istruzioni devono essere eseguibili materialmente. Nella maggior parte dei testi scolastici, viene data una quarta proprietà degli algoritmi: 4. un algoritmo, per essere tale, deve terminare in un numero finito di passi.

1 GLI ALGORITMI

3

Da notare la differenza tra la proprietà 1 (il numero di istruzioni deve essere finito) e la proprietà 4 (l’algoritmo deve terminare). Come vedremo presto, un algoritmo può prevedere le ripetizione (iterazione) di un gruppo di istruzioni più volte. Ecco perché un algoritmo, pur costituito da un numero finito di istruzioni, potrebbe non terminare: un certo gruppo di istruzioni potrebbe essere eseguito indefinitamente, portando alla non terminazione dell’algoritmo stesso. La quarta non dovrebbe essere considerata una proprietà caratteristica degli algoritmi. Le motivazioni di ciò esulano dagli scopi e di questo testo, e possono essere affrontate solo in corsi di matematica superiore. Qui possiamo solo affermare che tale motivazione è analoga a quella che induce, in matematica, ad ampliare gli insiemi numerici (da N a Z, a Q, a R... a C) affinché essi risultino chiusi rispetto a determinate operazioni (Cf. [3, pag. 5] per maggiori dettagli).

1.2

Descrivere in forma algoritmica la procedura risolutiva di semplici problemi.

Il nostro primo algoritmo è molto semplice. È costituito da alcune istruzioni che vanno eseguite in sequenza. Non sempre sarà così. A volte sarà necessario eseguire alcune istruzioni, oppure altre, a seconda del verificarsi o meno di una determinata condizione. Parleremo in questo caso di struttura di selezione (si seleziona quale istruzione, o gruppo di istruzioni eseguire, in base al verificarsi della condizione). Proviamo a descrivere i passi necessari per stabilire se un numero a è divisibile per un altro numero b. Il nostro algoritmo potrebbe essere il seguente: INIZIO 1. acquisisci a e b; 2. esegui la divisione a : b e indica con r il resto di tale divisione; 3. se r = 0 • allora comunica che a è divisibile per b • altrimenti comunica che a non è divisibile per b FINE Questo è il nostro secondo algoritmo.

1 GLI ALGORITMI

4

1.3

Rappresentare algoritmi mediante diagrammi

Per rappresentare gli algoritmi, a volte si usano dei diagrammi, detti diagrammi a blocchi (o anche diagrammi di flusso o flow chart). Ne vediamo ora qualche esempio, partendo proprio dall’algoritmo per il calcolo dell’area del triangolo. Algoritmo per il calcolo dell’area di un triangolo

Significato dei principali blocchi

Inizio e fine

input e output

operazioni di calcolo

test

1 GLI ALGORITMI

5

Determinare se un numero a è divisibile per un numero b

Algoritmo di Euclide per il calcolo del MCD Le due strutture di controllo viste fino ad ora (sequenza e selezione) non bastano ancora per permetterci di scrivere algoritmi non banali. Abbiamo bisogno anche di poter ripetere più volte uno stesso gruppo di istruzioni. Parleremo allora di una terza struttura di controllo, l’iterazione. Un esempio di algoritmo che utilizza l’iterazione è l’algoritmo di Euclide per il calcolo del MCD fra due numeri a e b naturali positivi.

1 GLI ALGORITMI

6

INIZIO

acquisisci a e b

r <- resto(a:b)

SI r=0? NO

comunica: b è il risultato

a <- b b <- r r<-resto(a:b) FINE

Lo studente è inviatato a provare l’algoritmo di Euclide, assegnando ad a e b valori naturali positivi, e compilando tabelle sull’esempio di quelle riporate di seguito (cerchiato in rosso il risultato prodotto dall’algoritmo). prima prova: a = 15; b = 3 a b r valori iniziali 15 3 ○ 0 seconda prova: a = 5; b = 20 a b r valori iniziali prima iterazione 5 20 20 5 ○ 5 0

terza prova: a = 12; b = 20 a b valori iniziali prima iterazione seconda iterazione terza iterazione 12 20 12 8 20 12 8 4 ○

r 12 8 4 0

prova tu: a = 25; b = 7 a b valori iniziali prima iterazione seconda iterazione terza iterazione 25 7

r

2 RAPPRESENTAZIONE DEI DATI

7

Prova anche con le seguenti coppie di valori: (a = 12, b = 105); (a = 42, b = 45).

2

Rappresentazione dei dati

Vedremo ora come le informazioni (programmi, dati) sono rappresentati all’interno di un elaboratore elettronico.

2.1

Effettuare correlazioni fra i sistemi di numerazione decimale e binario, convertire dei dati numeri dall’uno all’altro sistema.

I computer utilizzano un alfabeto composto da due soli simboli: le cifre 0 e 1. Tutte le informazioni memorizzate all’interno di un elaboratore elettronico sono codificate esclusivamente mediante questi due simboli. Da qui deriva il termine di sistema binario. Allo stesso modo il sistema decimale che tutti conosciamo si chiama così poiché vengono utilizzate dieci simboli o cifre (da 0 a 9). Dalla matematica sappiamo che il sistema di numerazione decimale è posizionale. Questo significa che le cifre di un numero assumono un valore diverso a seconda della posizione in cui si trovano. Ogni numero in base 10 può essere scritto in forma polinomiale: Esempio 2 763 = 3 · 100 + 6 · 101 + 7 · 102 187 = 7 · 100 + 8 · 101 + 1 · 102 Anche il sistema di numerazione binario (in base 2) è posizionale: Esempio 3 (10110)2 = 0 · 20 + 1 · 21 + 1 · 22 + 0 · 23 + 1 · 24 = 22 La scrittura polinomiale di un numero in binario ci dà l’algoritmo per la conversione di un numero da base 2 a base 10. Esempio 4 (11011)2 = 1 · 20 + 1 · 21 + 0 · 22 + 1 · 23 + 1 · 24 = (27)10 Per la conversione inversa (da base 10 a base 2) si utilizza, invece, il metodo delle divisioni successive per la base (nel nostro caso, quindi per 2) Si divide il numero decimale per 2, e si fa lo stesso per il quoziente ottenuto, fino a quando il quoziente stesso vale zero. I resti ottenuti dalla sequenza delle divisioni, presi dall’ultimo al primo, costituiscono la rappresentazione del numero in base 2.

27 1

2 13 2 1 6 0 2 3 1

2 1 1

2 0

2 RAPPRESENTAZIONE DEI DATI

8

2.2

Rappresentare i caratteri in forma binaria. Definire le nozioni di bit e di byte.

In informatica la singola cifra binaria, di valore 0 o 1, viene chiamata bit (binary digit). Il bit rappresenta l’unità di misura fondamentale in un computer ma raramente viene utilizzato da solo. In genere si utilizza una serie di otto cifre binarie (otto bit) che viene chiamata byte. Con un byte è possibile rappresentare un massimo di 256(28). Il byte rappresenta generalmente un carattere (lettera, numero o simbolo che sia). Ma come è possibile rappresentare un testo usando solo degli 0 e degli 1? Lo strumento per risolvere il problema c’è, e si chiama codifica binaria dei caratteri. Vediamo meglio di cosa si tratta. Quando scriviamo un testo, non facciamo altro che mettere uno dietro l’altro una serie di simboli, normalmente chiamati caratteri. In ogni lingua vi sono diversi caratteri: le lettere dell’alfabeto, i segni di interpunzione e infine le cifre. Ovviamente lo 0 e l’1 da soli non basterebbero a rappresentare tutti i simboli necessari per scrivere. Ma associando ad ogni carattere una sequenza di cifre binarie, ecco che le possibilità di rappresentare caratteri aumenta. La sequenza di bit accennata è appunto il Byte prima descritto. Potremmo allora, per esempio, fare una tabella di associazioni di questo tipo: 00000001 00000010 00000011 00000100 ..... corrisponde corrisponde corrisponde corrisponde ..... ad a a a a b c d ....

e così via. Bene, per lavorare su dei testi tutti i computer ricorrono a una tabella di associazioni di questo tipo, che viene chiamata tavola dei caratteri. La tavola più usata è basata proprio su otto cifre binarie, otto bit. Le possibili combinazioni di ’0’ e ’1’ nelle otto cellette a nostra disposizione come già detto sono 256. Con un solo Byte potremo allora rappresentare fino a 256 caratteri diversi. 2.2.1 ASCII standard ed esteso

Ovviamente, per evitare una vera e propria babele, è necessario accordarci ed utilizzare la stessa tabella dei caratteri, i, per evitare che una testo scritto sul mio computer di casa si trasformi in una sequenza di segni indecifrabili sul computer a scuola. Tale problema fu risolto da Robert W. Bemer, nel 1965, che ideò e propose uno schema di codifica internazionale dei caratteri in informatica, ovvero il processo o il criterio in base al quale lettere, cifre, simboli grafici e codici di controllo vengono tradotti in combinazioni numeriche binarie leggibili da un computer (il concetto della tavola dei caratteri prima espresso). Tale codifica fu chiamata ASCII (American Standard Code for Information Interchange) ovvero Codice Standard Americano per lo Scambio di Informazioni e comprende un set di 256 combinazioni, divise in due sottogruppi di 128 ciascuno, detti rispettivamente standard ed esteso. Il set ASCII standard usa 7 bit per codice e

2 RAPPRESENTAZIONE DEI DATI

9

può rappresentare 128 caratteri, numerati da 0 a 127; l’ASCII esteso usa anche l’ottavo bit e può rappresentare ulteriori 128 caratteri, numerati da 128 a 255. Nel set ASCII standard, i primi 32 codici sono assegnati a caratteri di controllo della comunicazione o della stampante e vengono usati nella trasmissione dati tra computer o tra computer e stampante. I restanti 96 codici sono assegnati ai segni d’interpunzione, alle cifre da 0 a 9 e alle lettere dell’alfabeto latino, maiuscole e minuscole. I codici del set ASCII esteso, dal 128 al 255, consentono di utilizzare l’ottavo bit di ogni carattere per identificare ulteriori 128 caratteri speciali, come le lettere accentate o i caratteri grafici e anche per permettere alle diverse entità linguistiche di inserire le proprie particolarità. Mentre il set ASCII standard (i primi 7 bit) è universale sia per il software sia per l’hardware dei computer, i caratteri dell’ASCII esteso non costituiscono uno standard universalmente riconosciuto e quindi possono essere interpretati correttamente solo da programmi, computer e stampanti progettati specificatamente per quel set. Le attribuzioni dei primi 128 valori sono stabilite da un codice valido per tutti i computer, mentre i successivi 128 sono lasciati alla definizione del singolo sistema operativo. 2.2.2 UNICODE

La codifca ASCII (anche quella, peraltro non standard, ad 8 bit) attualmente non è sufficiente a rappresentare tutti i caratteri di tutte le lingue del mondo. L’ottavo bit, introdotto proprio per rappresentare un maggior numero di caratteri, non costituisce, come già detto, uno standard, e lingue differenti associano lo stesso codice a caratteri differenti. Per risolvere questi problemi, è stata ideata una nuova codifica: la codifica unicode, che rappresenta ogni carattere come un numero di 2 byte (quindi 16 bit). In questo modo è possibile rappresentere fino a 216 = 65536 caratteri differenti. Ogni gruppo di 2 byte rappresenta un unico carattere usato in almeno uno dei linguaggi del mondo. Caratteri che sono usati in molteplici linguaggi hanno lo stesso codice numerico. C’è esattamente 1 numero per carattere ed esattamente un carattere per numero. I dati unicode non sono quindi mai ambigui.

2.3

Descrivere le caratteristiche di una immagine digitale.

Un’immagine, come ogni altra informazione, è rappresentata all’interno di un calcolatore com una sequenza di bit. Per fare questo l’immagine viene decomposta in punti (pixel). Il pixel (picture element) è la più piccola unità che un computer può visualizzare su un montor; un insieme di pixel organizzati in una griglia sullo schermo forma tutto ciò che è visualizzato sullo schermo: caratteri, grafici, immagini. Digitalizzare un’immagine significa quidi trasformala in un reticolo di pixel. Ciascun pixel porta con sé una quantità prefissata di informazioni, che dipende dal numero di bit associati ad ogni pixel. Se per esempio ad ogni pixel è associato un solo bit, ogni pixel può assumere due soli colori differenti (bianco/nero); se

3 LINGUAGGI

10

un pixel ha associati 4 bit sulla scala dei grigi, si possono visualizzare 16 (24 ) tipi di grigio; con 8 bit si possono visualizzare 256 (28 ) colori differenti. I file che contengono immagini tendono a diventare molto grandi; esistono pertanto vari formati di compressione per limitarne le dimensioni. I principali formati dei file di immagine sono: • BMP (bitmap): formato che definisce la posizione e il colore di ciascun pixel. • TIFF (Tag Image File Format) è un formato comune nello scambio di immagini bitmap tra programmi diversi; per esempio i file acquisiti con lo scanner sono spesso in questo formato. • GIF (Graphic Interchange Format) è il formato compresso, molto usato per le immagini grafiche in internet. Esistono anche le GIF animate, costituite da brevi sequenze di immagini GIF. • JPEG (Joint Photographic Experts Group), formato basato su algoritmi di compressione che devono conciliare l’esigenza di un’alta qualità dell’immagine con la minima dimensione del file, molto usato nel web soprattutto per le foto. • PNG (Portable Network Graphics) altro formato di compressione di immagini, destinato a sostituire il GIF in quanto presenta miglioramenti ed un grado di compressione maggiore. • Infine esistono formati di grafica vettoriale: in questi casi il file non contiene l’immagine, ma le istruzioni per ricostruirla. Un notevole vantaggio sta nel fatto che è possibile modificare le dimensioni dell’immagine senza perderne le qualità, come invece accade con gli altri formati. Tra i formati di grafica vettoriale menzioniamo: – SVG è un formato aperto, le cui specifiche sono cioè pubbliche. – WMF (Windows Meta File); formato di grafica vettoriale proprietario.

3
3.1

Linguaggi
Cenni di logica

In Informatica capita spesso di dover ricorrere ai principi della logica degli enunciati, detta anche algebra booleana dal nome del matematico inglese George Boole. Gli oggetti della logica sono gli enunciati. Definizione 1 Si chiama enunciato una proposizione che può essere soltanto vera o falsa.

3 LINGUAGGI

11

Alcuni enunciati possono essere composti, ossia formati a sottoenunciati collegati tra loro da connettivi logici. Il valore di verità di un enunciato composto è completamente definito dai valori di verità dei suoi sottoenunciati e dal connettivo logico che li unisce. I connettivi fondamentali sono AND, OR, NOT. 3.1.1 Congiunzione (AND)

Due enunciati p e q possono essere collegati dal connettivo “e” (∧, AND), in modo da formare un enunciato composto, che risulta vero solo quando sono veri entrambi i sottoenunciati p e q, come risulta dalla seguente tavola di verità: p F F V V 3.1.2 Disgiunzione (OR) q F V F V p AND q F F F V

Due enunciati p e q possono essere collegati dal connettivo “o” (∨, OR), in modo da formare un enunciato composto, che risulta vero quando è vero almeno uno dei due sottoenunciati p e q, come risulta dalla seguente tavola di verità: p F F V V 3.1.3 Negazione (NOT) q F V F V p OR q F V V V

Dato un enunciato p è possibile formare un altro enunciato che si indica con NOT p, detto negazione di p, che risulta vero se p e falso, e falso se p è vero: p F V NOT p V F

3 LINGUAGGI

12

3.2

Linguaggi naturali e linguaggi formali

La comunicazione (tra uomo e uomo, tra uomo e macchina) avviene attraverso formalismi che prendono il nome di linguaggi. Possiamo fare una prima classificazione dei linguaggi analizzando la figura seguente:
Linguaggi

Naturali

Artificiali (formali)

ad alto livello

a basso livello

I linguaggi naturali (italiano, inglese, francese, cinese...) sono quelli che gli uomini utilizzano per comunicare tra di loro. Sono dotati di notevole ricchezza espressiva, possono però dare adito ad ambiguità, imprecisioni o difficoltà di interpretazioni. Come esempio portiamo una riedizione della classica frase: La professoressa Gay dice Giovanni non capisce niente. Tale frase ha due significati molto diversi, a seconda dell’intonazione di voce, delle pause o della punteggiatura che si usa. Infatti La professoressa Gay - dice Giovanni - non capisce niente è molto differente, in quanto a significato, a La professoressa Gay dice: “Giovanni non capisce niente”. I linguaggi artificiali (o formali, o simbolici) invece sono stati creati dall’uomo secondo regole ben definite prive di eccezioni ed ambiguità e sono dedicati a scopi precisi e circoscritti. Per la comunicazione tra uomo e macchina si usano linguaggi formali detti linguaggi di programmazione. Tra questi possiamo distinguere i linguaggi ad alto livello, o linguaggi procedurali, (Pascal, C++, Java, VisualBasic...) e i linguaggi a basso livello (linguaggio macchina e linguaggio assembler). Il linguaggio macchina è l’unico ad essere compreso da un computer. In esso operazioni e dati sono espressi in binario, sono dunque sequenza di bit. Le operazioni sono molto semplici (somma, moltiplicazione, confronto di operandi...). Risulta evidente la difficoltà a programmare utilizzando un tale strumento. Il linguaggio assembler costituisce un passo avanti (verso l’uomo). Le stesse semplici istruzioni del linguaggio macchina sono indicate da codici mnemmonici, anziché da sequenze di bit (ad esempio addl per somma, mull o imull per moltiplica, cmpl per compara...); anche gli operandi sono espressi in modo simbolico. Il linguaggio assembler, pur nella sua vicinanza al linguaggio macchina, non è direttamente comprensibile dall’elaboratore, e deve pertanto essere tradotto in linguaggio macchina da uno specifico programma detto assemblatore. I linguaggi ad alto livello invece sono più vicini al linguaggio naturale, dal quale

3 LINGUAGGI

13

(in genere dall’inglese) prendono in ’prestito’ alcune parole. Le istruzioni sono più complesse, ed ognuna di esse può richiedere l’esecuzione di un numero abbastanza elevato di istruzioni macchina. I linguaggi ad alto livello sono più semplici da utilizzare per noi, però non sono direttamente comprensibili dall’elaboratore. È necessaria pertanto una fase di traduzione del programma, svolta da particolari sw (compilatori o interpreti). Per capire meglio la differenza fra linguaggi ad alto livello e a basso livello, riportiamo di seguito il listato di un semplice programma (quello del calcolo dell’area di un triangolo) nel linguaggio c++, in linguaggio assembler, e (una parte del)lo stesso programma in linguaggio macchina.

listato del programma in C++ #include <iostream> using namespace std; int main() { int b,h; float area; cout << "Inserisci base e altezza " ; cin >> b >> h; area=b*h/2; cout <<"l’area è " << area << endl; }

3 LINGUAGGI

14

listato del programma in Assembler

main: .LFB957: .cfi_startproc .cfi_personality 0x3,__gxx_personality_v0 pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 subq $16, %rsp movl $.LC0, %esi movl $_ZSt4cout, %edi call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc leaq -4(%rbp), %rax movq %rax, %rsi movl $_ZSt3cin, %edi call _ZNSirsERi movl -4(%rbp), %eax imull -8(%rbp), %eax movl %eax, %edx shrl $31, %edx leal (%rdx,%rax), %eax sarl %eax cvtsi2ss %eax, %xmm0 movss %xmm0, -12(%rbp) movl $.LC1, %esi movl $_ZSt4cout, %edi call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc movss -12(%rbp), %xmm0 movq %rax, %rdi call _ZNSolsEf movl $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi movq %rax, %rdi call _ZNSolsEPFRSoS_E movl $0, %eax leave ret .cfi_endproc Risulta evidente come sia maggiormante comprensibile il programma scritto in linguaggio ad alto livello (nel nostro caso C++) rispetto al programma in linguaggio Assembler.

3 LINGUAGGI

15

Per completezza riportiamo anche una parte dello stesso programma in linguaggio macchina:

3.2.1

Fasi di creazione del software

Le fasi necessarie per la creazione di un programma sono le seguenti: • Analisi del problema • progettazione dell’algoritmo • traduzione dell’algoritmo in un linguaggio procedurale: si ottiene il programma (o codice) sorgente • traduzione del sorgente attraverso il compilatore: si ottiene il programma oggetto • collegamento (link) del programma oggetto con le librerie: si ottiene il programma eseguibile.

3 LINGUAGGI

16

Il compilatore è in grado di rilevare gli errori formali (lessicali e sintattici) del programma, ma non gli errori logici (bug) dovuti ad un algoritmo errato, che possono essere scoperti solo con l’esecuzione del programma; così dobbiamo aggiungere ai passaggi elencati il seguente: • test del programma

3.3

Pseudolinguaggio

Per rappresentare gli algoritmi, oltre ai diagrammi a blocchi che abbiamo già visto, (e che, oltre all’innegabile vantaggio di rappresentare in forma grafica l’algoritmo, hanno anche grosse pecche) esistono altri formalismi, detti pseudolinguaggi. Sono linguaggi che, grazie soprattutto ad una sintassi non particolarmente rigida, costituiscono una via di mezzo tra il linguaggio naturale e i linguaggi di programmazione. Gli pseudo-linguaggi hanno delle parole chiave; noi possiamo assumere di utilizzare le seguenti: • INIZIO(<nome algoritmo>), FINE(<nome algoritmo>) per delimitare l’algoritmo • ACQUISISCI e COMUNICA per le operazioni di ingresso ed uscita • <-, per effettuare calcoli e assegnare valori alle variabili • SE... ALLORA... ALTRIMENTI... FINESE per la struttura di selezione • MENTRE... FINEMENTRE per la struttura iterativa (ciclo) • RIPETI .... FINCHÈ per un’altra forma della struttura iterativa.

3 LINGUAGGI

17

Di seguito vengono affiancate le strutture di controllo dello pseudo-linguaggio ora introdotto, con i corrispettivi diagrammi a blocchi, a cui lo studente è già abituato:

Sequenza di istruzioni
<istruzione 1>

<istruzione 1> <istruzione 2> : <istruzione n>

<istruzione 2>

:

<istruzione n>

Struttura alternativa

SE <cond> ALLORA <istruzione : <istruzione ALTRIMENTI <istruzione : <istruzione FINESE

F <cond>

V

v1>
<istruzione f1> <istruzione v1>

vn>
: :

f1>
<istruzione fn> <istruzione vn>

fm>

3 LINGUAGGI

18

La struttura alternativa può anche avere la seguente forma: Struttura alternativa

F <cond>

SE <cond> ALLORA <istruzione v1> : <istruzione vn> FINESE

V <istruzione v1> : :

<istruzione vn>

Struttura iterativa MENTRE

F

MENTRE <cond> <istruzione 1> : <istruzione n> FINEMENTRE

<cond>

V <istruzione 1>

:

<istruzione n>

3 LINGUAGGI

19

Struttura iterativa RIPETI

<istruzione 1>

RIPETI <istruzione 1> : <istruzione n> FINCHÈ <cond>

:

<istruzione n>

V <cond>

F

Lo studente è invitato a descrivere le differenze tra le due strutture iterative (MENTRE e RIPETI). Possiamo ora cimentarci nella traduzione dei tre algoritmi precedentemente visti nel nostro pseudo-linguaggio. L’algoritmo del calcolo dell’area di un triangolo diventa: INIZIO (Area Triangolo) ACQUISISCI b, h a <- (b * h) /2 COMUNICA a FINE (Area Triangolo) L’algoritmo che stabilisce se un numero a è divisibile per un numero b sarà: INIZIO(Divisibile) ACQUISISCI a,b r <- resto(a,b); SE r = 0 ALLORA COMUNICA "a è divisibile per b" ALTRIMENTI COMUNICA "a non è divisibile per b" FINESE FINE(Divisibile) Da notare il rientro (indentazione) che favorisce la comprensione della struttura logica dell’algoritmo.

3 LINGUAGGI

20

Vediamo infine l’algoritmo di Euclide per il calcolo del Massimo Comun Divisore fra due numeri: INIZIO(Massimo Comun Divisore) ACQUISISCI a,b r <- resto(a,b); MENTRE r <> 0 a <- b b <- r r <- resto (a,b) FINEMENTRE COMUNICA "il risultato è " b FINE(Massimo Comun Divisore) Il simbolo ’<>’ è usato in informatica al posto di ’=’.

RIFERIMENTI BIBLIOGRAFICI

21

Riferimenti bibliografici
[1] Mariella Grisà, Fabiana Guerra. ECDL Open Source. McGraw-Hill, 2008. [2] A. Lorenzi, M. Govoni. Manuale Atlas per la patente europea del computer. Atlas, 2009. [3] Aiello, Albano, Attardi, Montanari. Teoria della computabilità, logica, teoria dei linguaggi formali. ETS 1979. [4] Pino Tropeano. ECDL - Appunti Modulo 1 Release 2009. ——————————–