Le fasi della programmazione
Specifica
La definizione del problema prevede la descrizione dello stato iniziale (dati iniziali, input) del problema e dello stato finale atteso (risultato, output).
Algoritmo
Consiste nell’individuazione di un procedimento risolutivo che consenta di ottenere i risultati attesi. Prevede tre passi:
- Individuare una soluzione;
- Dimostrare che la soluzione trovata sia corretta;
- Scegliere tra più soluzioni corrette quella ottimale.
Codifica
Consiste nel tradurre l’algoritmo in un linguaggio di programmazione noto all’esecutore. Se il linguaggio di descrizione è uguale al linguaggio di programmazione allora la codifica è superflua. Si ottiene come risultato un programma eseguibile al calcolatore.
- Programma: algoritmo;
- Dati in ingresso (input): informazioni iniziali;
- Dati ausiliari: informazioni utilizzate dall’algoritmo;
- Dati in uscita (output): informazioni finali.
Esecuzione
Consiste nella messa a punto del programma. Due possibilità:
- Compilazione: il programma viene tradotto in un linguaggio macchina ed eseguito;
- Interpretazione: il programma viene eseguito da un emulatore che ne calcola il risultato.
Javascript
È un linguaggio di script: linguaggio di programmazione che permette di scrivere “script” (programmi scritti per un particolare ambiente).
- Permette di esprimere tutte le funzioni calcolabili;
- Deve essere eseguito all’interno di un browser;
- Rende dinamiche le pagine web;
- È interpretato;
- Non è tipato.
Stringhe
Sequenze di caratteri con cui si scrivono programmi.
Variabili
Introducono nomi simbolici a cui sono associati dei valori. I valori possono cambiare durante l’esecuzione della funzione. È costituita da:
- Var: keyword (parola riservata);
- Identificatore: nome della variabile (sequenza di lettere, cifre, caratteri speciali);
- Espressione: valore associato;
- Localizzazione di memoria (dove il valore è memorizzato);
- Tipo: insieme dei valori che la variabile può assumere (non in Javascript: non è un linguaggio tipato).
Se una variabile viene dichiarata ma non inizializzata (es. var x;) il suo valore è undefined.
Costanti
Nomi simbolici a cui è associato un valore che rimane invariato durante l’esecuzione. Si usano le lettere maiuscole per distinguere le costanti dalle variabili.
Programma
Sequenza di istruzioni. Ogni istruzione viene eseguita successivamente alla precedente e fa riferimento allo stato corrente del calcolatore. Ogni istruzione può modificare lo stato.
Assegnamento
Sintassi: identificatore = espressione
Semantica: consiste nell’assegnare ad una variabile un valore che sarà effettivo a partire dallo stato successivo. Comporta dunque una modifica dello stato. All’interno di un’espressione, la variabile è legata al valore che le è stato associato in quel momento (nello stato corrente).
Espressione
Costrutto sintattico che restituisce un valore.
Istruzioni condizionali
Istruzione if-else
Sintassi:
if (espressione)
istruzione1;
else
istruzione2;
Dove:
- Espressione: è un’espressione booleana;
- Istruzione 1: rappresenta il ramo then (un’unica istruzione);
- Istruzione 2: rappresenta il ramo else (un’unica istruzione).
Semantica:
- Viene prima valutata l’espressione.
- Se l’espressione è vera viene eseguita l’istruzione 1; se l’espressione è falsa viene eseguita l’istruzione 2.
Istruzione if
Sintassi:
if (espressione)
istruzione;
Semantica:
- Viene prima valutata l’espressione.
- Se l’espressione è vera viene eseguita l’istruzione, altrimenti non si fa nulla.
Ambiguità sintattica
L’else fa riferimento all’if più vicino. Affinché si riferisca ad un if precedente, occorre inserire gli if intermedi in un blocco {}.
Istruzione switch
Sintassi:
switch (espressione) {
case espressione-1:
istruzione-1;
break;
...
case espressione-n:
istruzione-n;
break;
default:
istruzione-default;
}
Semantica:
- Viene prima valutata l’espressione, ottenendo un valore X.
- Vengono valutate in sequenza le espressioni dei case: se il valore ottenuto dall’espressione case è uguale ad X allora vengono eseguite le sue istruzioni.
- Se non esiste alcuna espressione il cui valore è uguale ad X, allora vengono eseguite le istruzioni di default.
Se manca il “break” ed è stata trovata un’espressione il cui valore è uguale ad X, verranno eseguite tutte le istruzioni anche quelle delle espressioni a seguire. Perciò quando si omette il break diventa rilevante l’ordine dei case. Se viene usato “return” al posto del break: termina l’esecuzione della funzione switch, non sono del costrutto case!
Istruzioni iterative
Sono costrutti che permettono di ripetere determinate istruzioni più volte.
- Iterazione determinata: un numero fissato di volte. [FOR]
- Iterazione indeterminata: un numero non fissato di volte, finché la condizione rimarrà vera. [WHILE]
Istruzione while
Sintassi:
while (espressione)
istruzione;
Dove:
- Espressione: è la guardia del ciclo;
- Istruzione: è il corpo del ciclo (può essere un blocco {}).
Semantica:
- Viene prima valutata l’espressione;
- Se l’espressione è vera, si esegue l’istruzione e si torna ad eseguire il while;
- Se l’espressione è falsa, si termina l’esecuzione del while. Dunque se l’espressione è falsa fin dall’inizio, il corpo del while non verrà mai eseguito!
Istruzione do-while
Sintassi:
do
istruzione;
while (espressione);
Semantica:
- Il corpo viene prima dell’espressione, dunque l’istruzione si esegue sempre almeno una volta!
- Se l’espressione è vera, si esegue una seconda volta l’istruzione e il ciclo ricomincia; altrimenti si termina.
Istruzione for
Sintassi:
for (istruzione-1; espressione; istruzione-2)
istruzione-3;
Dove:
- Istruzione 1: inizializza la variabile di controllo;
- Espressione: verifica quando deve terminare il ciclo;
- Istruzione 2: incrementa la variabile di controllo alla fine del corpo del ciclo (aggiornamento della variabile);
- Istruzione 3: è il corpo del ciclo.
Semantica: L’istruzione for precedente equivale a:
istruzione-1;
while (espressione) {
istruzione-3;
istruzione-2;
}
Istruzione for-in
Per gli array non associativi. È un’abbreviazione del for.
Sintassi: Equivale a:
for (ide in nomeArray)
istruzione;
for (ide = 0; ide < nomeArray.length; i++)
istruzione;
Array
Permettono di definire dati strutturati. Sono composti da elementi (omogenei nei linguaggi tipati; disomogenei in Javascript). Ogni elemento si identifica all’interno dell’array grazie ad un numero d’ordine, detto “indice” dell’elemento.
Il numero di elementi dell’array è detto “lunghezza” (o dimensione) dell’array. In Javascript, gli array sono dinamici: il numero degli elementi è variabile.
Sintassi - dichiarazione di variabile array
- Dichiarazione di un array vuoto:
var nomeArray = [];oppurevar nomeArray = new Array();nei linguaggi ad oggetti. - Dichiarazione della variabile e inizializzazione degli elementi con il valore undefined.
var nomeArray = new Array(n);dove con “n” indico il numero finito degli elementi. Es.var vet = new Array(8);in cui la variabile vet è dichiarata e inizializzata ad un array di 8 elementi undefined. - Dichiarazione di variabile e inizializzazione degli elementi:
var nomeArray = [n1, n2, n3, …, nk];come ad esempiovar vet = [2, 4, 5, -6, -3, 0];oppurevar nomeArray = new Array(n1, n2, n3, …, nk);equivalente al precedente, es.var vet = new Array(2, 4, 5, -6, -3, 0);In entrambi i casi viene dichiarata la variabile array e inizializzata con i valori interi (2, 4, 5, -6, -3, 0).
Ogni elemento dell’array è denotabile usando il nome dell’array (vettore) e l’indice ad esso associato. Gli array sono indicizzati a partire da 0, quindi gli indici di un array di 6 elementi varieranno nell’intervallo, detto “range”, [0,5].
nomeArray[i]; indica l’elemento dell’array di indice “i”.
Modifica di un array
Si utilizza il comando di assegnamento, ponendo a sinistra l’espressione che denota l’elemento di un array. Es. var i = 2; vet[i + 1] = readnum(); Assegna al 4° elemento (che ha indice 3) il valore letto dall’input.
L’espressione che compare all’interno delle parentesi [] può essere una qualunque espressione purché calcoli un intero >= a zero.
Lo stato con gli array
Lo stato viene esteso perché è necessario avere due tipi di memoria:
- L’ambiente che rappresenta le variabili come insiemi di coppie;
- Lo heap in cui sono memorizzati i dati strutturati (gli array e gli oggetti).
Le variabili che assumono come valore un array occupano nell’ambiente un “indirizzo di memoria”, detto reference (indicato graficamente con una freccia o con ref), che individua l’area dello heap in cui è memorizzato l’array. Quest’area di memoria sarà costituita da tante locuzioni di memoria quanti sono i dati strutturati.
L’operatore di uguaglianza opera sui reference: due variabili array sono uguali se condividono la stessa area di memoria vet1 = vet2; in tal caso, modificandone uno si modifica anche l’altro. Gli operatori di confronto non sono definiti su array, tuttavia confrontare due array non genera errore ma calcola sempre false.
Procedure
Sono funzioni che non calcolano un valore, ma producono modifiche allo stato.
La differenza tra procedure e funzioni:
- Le procedure sono un’astrazione delle istruzioni.
- Le funzioni sono un’astrazione degli operatori.
In generale, non contengono un’istruzione “return” (e se la contengono sarà del tipo “return;” che non comporta il calcolo di nessun valore ma solo la cessione del controllo al chiamante).
Semantica:
- È analoga a quella della chiamata di funzione, ma una chiamata di procedura è un’istruzione.
- Il passaggio dei parametri avviene per valore (come nel caso delle funzioni).
- Il controllo viene restituito al chiamante al termine dell’esecuzione del corpo della procedura (o con return).
Javascript non distingue tra funzioni e procedure!
Array dinamici
Il numero degli elementi dell’array può cambiare durante l’esecuzione del programma, dunque cambia anche la lunghezza. Per questo motivo la dimensione (lunghezza) di un array è una proprietà predefinita dell’array.
Sintassi: nomeArray.length
Manipolazione delle stringhe
Le stringhe sono array di caratteri, dunque gli operatori degli array possono essere usati anche sulle stringhe. Tuttavia, le stringhe NON sono modificabili: ogni tentativo di modifica viene ignorato, ma non dà alcun errore!
La sintassi per selezionare un elemento di un array può essere usata anche con le stringhe, come anche il calcolo.
-
Laboratori svolti per esame di Fondamenti teorici e Programmazione
-
Tutti gli esercizi di Fondamenti teorici e programmazione
-
Riassunto esame Informatica, prof. Carnevali, libro consigliato Fondamenti di Programmazione, Vicario: teoria
-
Riassunto esame Informatica, prof. Carnevali, libro consigliato Fondamenti di programmazione, Vicario: programmazio…