Algoritmi e linguaggi - Dipartimento di Informatica

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