JavaScript: una funzione, istruzione if,  window.alert, operatore AND, +=, ==

       data di oggi:

Ricordiamo che lo scopo che ci siamo fissati in queste lezioni è quello di costruire la seguente pagina: esercizi (finale)

Attualmente la nostra pagina è ancora incompleta e si trova nella seguente situazione:Esercizi sui colori (ora)

Cioè la nostra pagina a prima vista sembra che un primo quiz funzioni; ma in realtà, poiché ancora il nostro programma è agli inizi, funziona ben poco.

Oggi entriamo in una parte ancora più difficile di JavaScript, ma se ci hai seguiti fin qui stai tranquillo che diventerai un bravo programmatore.

Le funzioni (function)

In JavaScript le funzioni sono la parte più bella, in quanto ci consentono di ottenere dei risultati sorprendenti.

Oggi mettiamo su una funzione che ci permette di valutare la risposta data ad un quiz assegnandoli il punteggio voluto.

Questa è la parte centrale del programma.

Vediamo come scrivere una funzione. La funzione, istruzione function, serve a mettere su un insieme di istruzioni che devono essere usate diverse volte nel programma.

Nel nostro caso, essendo i quiz dieci, non ha senso ripetere la scrittura di tutta una serie di istruzioni per valutare il singolo quiz, ma mettiamo su una funzione, cioè un insieme di istruzioni in grado di valutare tutti e dieci i quiz, qualunque sia il quiz oggetto di valutazione.

Vediamo prima le parti fondamentali da scrivere, cioè la sintassi, ovvero le parole chiave che non possiamo modificare.

Scriviamo:

function verifica (valore1,valore2) {

 

}

Vediamo il significato.

codice significato
function E' la parola chiave che indica l'inizio di una funzione. Va scritta così e non si può modificare.
verifica ( ) E' il nome che noi abbiamo dato alla funzione; è un nome scelto da noi, lo possiamo modificare; serve per ricordarci che questa funzione verifica il quiz.

Deve essere seguita da due parentesi tonde.

verifica (valore1,valore2) E' importante che ci siano due parentesi tonde. All'interno delle parenti possiamo metterci niente; ma le parentesi tonde le dobbiamo aprire e chiudere. Nel nostro caso abbiamo messo due variabili; potevamo metterne una sola, oppure più di due.

Le due variabili le abbiamo chiamate una valore1 e l'altra valore2, nomi scelti da noi. Queste variabili hanno valore solo nella funzione che stiamo usando; una volta finita la funzione le variabili non possono essere utilizzate.

{ Parentesi graffa aperta, si fa tenendo premuto con la sinistra il tasto "Alt" e contemporaneamente con la destra sul tastierino numerico si scrive il seguente numero: 123 e poi si lascia il tasto "Alt"

La parente di apertura { non va seguita dal punto e virgola, ma si preme "Invio" e si va all'altro rigo.

Dopo la parentesi { vanno scritte tutte le istruzioni della funzione.

} E' la parentesi graffa che indica la fine della funzione. E' obbligatoria. Si fa tenendo premuto con la sinistra il tasto "Alt" e contemporaneamente con la destra sul tastierino numerico si scrive il seguente numero: 125 e poi si lascia il tasto "Alt".

Dopo la parentesi graffa } va premuto "Invio" e non va messo il punto e virgola.

Abbiamo detto che la funzione la scriviamo in questo modo:

function verifica (valore1,valore2) {

 

}

I due numeri che vengono memorizzati l'uno nella variabile valore1 e l'altro nella variabile valore2, per noi hanno un significato particolare.

Valore1

Valore1 per noi rappresenta il numero del quiz che l'allievo sta risolvendo in un certo momento. Essendo i quiz dieci, al primo quiz diamo il numero 1, al secondo il 2, e così via, all'ultimo diamo 10.

Esempio

Valore1=3

Vuol dire che l'alunno sta svolgendo il quiz n° 3.

Il quiz n° 3 ha come risposta corretta il valore posto in esatto[3].

Contemporaneamente se flag[3] =0 vuol dire che l'allievo ancora non lo ha risolto il quiz n° 3, se invece flag[3] =1 vuol dire che il quiz è stato risolto.

Valore2

Nella variabile di nome valore2 memorizziamo la risposta che l'alunno ha dato al nostro quiz.

Però non è conserviamo la risposta, ma mettiamo il numero 1 se l'alunno ha dato come risposta esatta la prima; mettiamo il numero 2, se l'alunno ha dato come risposta esatta la seconda, mettiamo il numero 3, se l'alunno ha dato come risposta esatta la terza. 

Riepiloghiamo le variabili di un generico quiz e precisamente il quiz n° 1.

variabile significato
esatto[1] = "2" indica che la risposta esatta del primo quiz è la seconda, cioè il colore rosso.
flag[1] =0 Indica che l'alunno non ha svolto il primo quiz
valore1=1 indica che ora l'alunno ha svolto il quiz n° 1 e che la nostra funzione deve verificare se la risposta è esatta
valore2=1 indica che l'alunno ha ritenuto esatta la prima risposta, cioè il colore giallo; naturalmente ha sbagliato e bisogna dargli zero punti
valore2=2 indica che l'alunno ha ritenuto esatta la seconda risposta, cioè il colore rosso; naturalmente ha risposto in modo corretto e bisogna dargli  punti 1
valore2=3 indica che l'alunno ha ritenuto esatta la terza risposta, cioè il colore verde; naturalmente ha sbagliato e bisogna dargli zero punti

Chiamata di una funzione e uscita da una funzione (return).

La funzione una volta scritta con i suoi comandi non viene eseguita ma resta solo memorizzata.

Quando noi decidiamo che la funzione debba essere eseguita occorre dare il comando di eseguirla.

Nel nostro caso quando l'alunno ha fatto un click su pulsante di opzione di uno dei quiz, occorre far partire immediatamente la nostra funzione di nome verifica() e far eseguire la valutazione e l'assegnazione del punteggio.

Una cosa importante nello scrivere la funzione è proprio l'uscita dalla funzione stessa.

Questa è una cosa importante, che può provocare seri danni all'utente, cioè il nostro alunno che usa il computer.

Quando si scrive una funzione occorre stare attenti ad uscire fuori della funzione altrimenti se il computer resta all'interno della stessa funzione senza uscirne il computer si blocca e fa sempre la stessa cosa senza possibilità per l'alunno di uscire fuori. I comandi della tastiera possono rimanere bloccati e l'unico modo di uscirne è premere contemporaneamente i tre tasti "Ctrl" +"Alt"+"Canc"

e terminare la applicazione con Windows.

La stessa precauzione va presa anche nei cicli for che abbiamo visto la volta scorsa.

Un modo corretto di uscire dalla funzione è questo, cioè inserire la apposita istruzione di uscita, cioè return.

Se non mettiamo un certo numero di istruzioni return all'interno della funzione, il programma perde il controllo.

L'istruzione return indica al programma di uscire dalla funzione e di tornare nel punto esatto da cui era partita la chiamata.

Detto questo entriamo nel vivo della nostra funzione che deve verificare la correttezza della risposta data dal nostro alunno.

L'istruzione di confronto (If )

Una istruzione molto potente per fare dei confronti o dei controlli è proprio la istruzione if.

Vediamo ora la seguente istruzione if:

if (valore1==1) flag[1]= 1;

La istruzione if si divide in due parti: una parte esegue un confronto tra due o più dati e una seconda parte esegue le cose da fare.

In pratica è come dire se avviene questo devi fare questa cosa; se invece avviene un'altra cosa devi fare questa altra. E' una decisione che si deve prendere in base a come sono andate le cose.

Nel nostro caso vogliamo mettere il valore 1 dentro la variabile flag quando l'alunno ha risolto il quiz n° 1.

Come facciamo?

Appunto scriviamo:

if (valore1==1) flag[1]= 1;

E' un modo diverso di dire la stessa cosa ma in JavaScript.

istruzione significato
if if vuol dire: se
(valore1==1) se il numero contenuto nella variabile valore1 è proprio uguale ad 1.

Il doppio == ripetuto vuol dire proprio uguale oppure esattamente uguale.

Ma per noi il fatto che valore1 sia uguale ad 1 vuol dire che l'alunno sta risolvendo il primo quiz.

Quindi il significato logico diventa: Se l'alunno sta risolvendo il primo quiz....

flag[1]= 1 devi mettere ad 1 il flag n° 1.

Questa è la cosa che deve fare, cioè mettere il numero 1 nella variabile flag[1].

ma per noi flag[1] è proprio la variabile che indica se il quiz n° uno sia stato o meno risolto.

Se lo poniamo ad 1 vuol dire che il quiz è stato risolto.

In conclusione la istruzione:

if (valore1==1) flag[1]= 1;

vuol dire: Se l'alunno ha premuto uno qualunque dei tre pulsanti di opzione relativi al primo quiz e quindi il valore di valore1 è proprio uguale ad 1, allora devi mettere anche il valore 1 nel flag[1].

Questa forma va bene quando la istruzione che bisogna eseguire nel caso che la situazione sia vera sia una sola.

Quando, invece, le istruzioni sono molte, e quindi vanno poste su più righi, bisogna utilizzare le parentesi graffe e racchiuderle.

Esempio

if (valore1==1) {

                        flag[1]= 1;

                        punteggio +=1;

                        }

In questo modo, nella ipotesi che valore1 sia proprio uguale ad uno, le istruzioni da eseguire sono due:

1) - flag[1] viene posto ad 1;

2) - la variabile punteggio viene incrementata di una unità, questo nel caso il nostro alunno abbia risposto bene.

A questo proposito notiamo che l'operatore += incrementa la variabile di una unità.

La variabile punteggio è quella che noi abbiamo scelto per dare il voto espresso in decimi al nostro alunno. Ogni quiz che egli svolge correttamente dà diritto ad incrementare di uno il contatore del punteggio, che ha proprio nome punteggio.

In questo modo le istruzioni da eseguire sono due ma possono essere anche molto di più.

A questo punto penso che siamo in grado di scrivere la nostra funzione completa.

Facciamo però prima un ragionamento.

Se il nostro alunno preme un pulsante di opzione di uno dei dieci quiz, le combinazioni sono due.

1) - Può darsi che sia la prima volta che risolve il quiz con quel numero.

In tal caso occorre sia confrontare la sua risposta con la variabile esatto[i] dove i è un contatore che tiene conto del quiz che sta svolgendo, e inoltre occorre incrementarli il punteggio aumentando di 1 la variabile punteggio.

2) - Può darsi che non sia la prima volta che risolve lo stesso quiz, sia perché abbia sbagliato o sia perché ha voluto provare di nuovo; in tal caso la valutazione la si può ripetere, però non ha diritto ad alcun punto, quindi la variabile punteggio non va incrementata.

Comunicazione del voto (window.alert)

Per comunicare immediatamente il risultato del quiz possiamo utilizzare una funzione detta window.alert().

Tale funzione non occorre che la scriviamo noi, in quanto è compresa già in Internet Explorer, noi possiamo solo dire di eseguirla quando vogliamo noi.

Window.alert() è una funzione che dà un messaggio del tipo:

Con questa funzione si blocca il programma, finché non si preme "OK".

Le parentesi sono obbligatorie. tutto quello che scriviamo nelle parente compare nella finestra di dialogo che si apre.

Vediamo come funziona.

Se all'interno delle parentesi scrivessi in questo modo:

window.alert(punteggio);

nella finestra mi apparirebbe solo il valore contenuto nella variabile che io ho chiamato punteggio.

Quindi il nostro alunno vedrebbe un numero ma non capirebbe niente.

Per cui occorre scrivere una frase completa che spieghi il numero. Se invece scrivo:

window.alert("ESATTO! - "  +"Punti: "+ punteggio +" su 10")

La frase che vede è più completa.

In pratica quello che scrivo tra virgolette sono le parole esatte così come le vedrà il nostro allievo. Quello che si trova fuori delle virgolette rappresenta una variabile, nel nostro caso punteggio, e windows scrive non punteggio, bensì il valore contenuto in punteggio, cioè il voto.

L'operatore AND (&&)

Anche in JavaScript esistono gli operatori logici, OR, AND, NOT.

Oggi vediamo l'operatore AND.

AND sappiamo che verifica la verità o la coesistenza di due o più condizioni. Il simbolo il JavaScript è doppio &&.

Esempio

if ((valore1 == i) && (flag[i] == 0))  flag[i]=1;

La istruzione if di sopra è vera quando si verificano due condizioni contemporaneamente, cioè quelle poste tra le parentesi; e cioè:

Se (valore1==i) cioè il numero contenuto nel contatore i è proprio uguale al numero contenuto in valore1, ed inoltre anche il numero contenuto in flag[i] è proprio uguale a zero, solo allora, devi mettere flag[i] a 1, in quanto vuol dire che l'alunno ha risolto proprio quel quiz, o in maniera errata o corretta, ma lo ha risolto.

Le parentesi esterne sono obbligatorie e sono quelle della if. Quelle interne, pure obbligatorie sono quelle di ogni condizione che deve essere vera.

Osservazione

Possimo ora notare la diffrenza tra un uguale = semplice e un uguale doppio ==.

Il semple uguale = una operazione di assegnazione.

Se scrivo:

valore1=1

vuol dire che obbligo a mettere il numero 1 in valore 1, cioè è una operazione di assegnazione.

Se invece scrivo:

valore1==1

vuol dire che faccio un confronto con la if e vedo se il numero contenuto in valore1 è proprio uguale ad 1; quindi è una operazione di confronto, non di assegnazione.

Detto questo possiamo passare a scrivere per intero la nostra funzione, che può essere questa:

// qui inizia la funzione di verifica
function verifica(valore1,valore2){
for(var i = 1; i<11; i++){
		// questo if che segue vale se è la prima volta
		if ((valore1 == i) && (flag[i] == 0)){
					flag[i] = 1;
					if (valore2 == esatto[i]) {
							punteggio += 1;
							window.alert("ESATTO! - "  +"Punti: "+ punteggio +" su 10")
							return;
							}
					window.alert("ERRATO! - RIPROVA! - " + "Punti: "+ punteggio +" su 10");
					return;
                 				}
             		// questo if che segue vale se è la volta successiva
		if ((valore1 == i) && (flag[i] = 1)) {
				                 if (valore2 == esatto[i]) {
				                 		window.alert("ESATTO! - "  +"Punti: "+ punteggio +" su 10")
				                 		return;
							}
					window.alert("ERRATO! - RIPROVA! - " + "Punti: "+ punteggio +" su 10");
					return;
					}
      			// la graffa che segue chiude il ciclo for
			}
// la graffa che segue chiude la funzione
}

 

La funzione è abbastanza complessa, in quanto contiene diverse istruzione if e in più mostra una istruzione che ancora non abbiamo fatto e cioè window.alert().

Comunque ora riepiloghiamo e spighiamo meglio.

istruzione significato

function verifica(valore1,valore2){
inizia la nostra funzione. La funzione ha nome: verifica. Essa accetta in ingresso due valori: valore1 indica il quiz che stiamo valutando, valore2 indica la risposta data dal nostro alunno.

La parentesi graffa { indica l'inizio delle istruzioni della nostra funzione

for (var i = 1; i<11; i++) { Inizia un ciclo di istruzioni che va ripetuto dieci volte. La variabile i mi indica il quiz che sto esaminando.

if ((valore1 == i) && (flag[i] == 0)){
Questa istruzione if diventa vera la prima volta che l'alunno risolve un certo quiz. Essa analizza due valori contemporaneamente. Dapprima vede se il valore di valore1 è uguale ad i. In tal modo, poiché i incrementa da 1 a dieci, quando i è uguale a valore1, vuol dire che è proprio quello il quiz da esaminare. Poi controlliamo che flag[i] cioè proprio il flag dello stesso quiz sia a zero. In tal modo siamo sicuri che è la prima volta che risolve il quiz.

Se tutto questo è vero, esegue le istruzioni che seguono, altrimenti salta alla if successiva, in quanto vuol dire che è la seconda volta che esegue il quiz.

flag[i] = 1;
Mette solo il flag di quel quiz al valore uno; in tal modo la prossima volta che viene eseguita la funzione questo primo if viene saltato e viene eseguito l'if valido per la seconda volta che prova a risolvere il quiz.
if (valore2 == esatto[i]) {
Ora va a controllare che la risposta data dall'alunno, cioè valore2, sia proprio uguale a esatto[i], dove esatto contiene proprio il numero della risposta esatta.

Se questo è vero, cioè il nostro alunno ha risposto esattamente, gli dobbiamo dare il punteggio.

punteggio += 1;
Infatti gli diamo un punto, in quanto ha risposto bene, e la variabile punteggio aumenta di 1.
window.alert("ESATTO! - "  +"Punti: "+ punteggio +" su 10")
Ora comunichiamo al nostro alunno che ha risposto bene. E gli mostriamo il punteggio attuale.
return;
Usciamo dalla funzione con return;
}
E' finito l'if precedente
window.alert("ERRATO! - RIPROVA! - " + "Punti: "+ punteggio +" su 10"); Se il programma arriva qui vuol dire che non è uscito dalla funzione con l'if precedente, quindi vuol dire che valore2 è diverso da esatto[i] e quindi l'alunno ha sbagliato, e glielo diciamo.Il punteggio non è stato incrementato.

return;
Usciamo dalla funzione e ritorniamo al punto di chiamata.
} E' finito il primo if valido se l'alunno è la prima volta che risolve il quiz
if ((valore1 == i) && (flag[i] = 1)) {
                 
Ora inizia il secondo if valido quando l'alunno prova per la seconda volta lo stesso quiz. Questo secondo if è uguale al primo, solo che questa volta l'incremento del punteggio non vi è, in quanto è la seconda volta che l'alunno risolve il quiz.Quindi se flag[i] è uguale a 1 vuol dire che è la seconda volta o la terza.
if (valore2 == esatto[i]) {
                
Controlliamo se la risposta è esatta.
window.alert("ESATTO! - "  +"Punti: "+ punteggio +" su 10")
                
Gli diciamo che è esatta, ma non incrementiamo il punteggio.
return;
Usciamo dalla funzione e ritorniamo.
}
Finisce l'if di sopra.
window.alert("ERRATO! - RIPROVA! - " + "Punti: "+ punteggio +" su 10");
Se non è uscita prima vuol dire che la risposta è errata; glielo diciamo.
return;
Usciamo.
} Finisce il secondo if.
} Chiudiamo prima il ciclo for.
} Poi chiudiamo la funzione, senza punto e virgola

Hai potuto notare che il punto e virgola a volte lo mettiamo e a volte no.

E' meglio metterlo sempre.

Solo alla fine delle funzioni è meglio mettere la parentesi graffa senza punto e virgola.

A questo punto la nostra funzione per la verifica del punteggio è completa.

Dobbiamo solo mettere dei comandi per utilizzarla quando serve.

Attenzione

In questa funzione abbiamo utilizzato una nuova variabile di nome punteggio.

Punteggio è una variabile esterna alla funzione che ci può servire per altri scopi.

Per cui occorre che la dichiariamo al di fuori della funzione, all'inizio del nostro programma. Quindi scriviamo:

var punteggio=0;

cioè dichiariamo una variabile di nome punteggio e la poniamo uguale a zero.

Anche per oggi basta. Il nostro programma di valutazione è ancora incompleto, quindi non può funzionare completamente, ma buona parte del lavoro lo abbiamo già fatto.

Anche se la pagina viene caricata ed eseguita, non vediamo alcun effetto sulla pagina che resta questa: Esercizi sui colori (ora)

Indice del corso  Indice Scuola Elettrica - generico


Scuola Elettrica



 

Altre applicazioni


Mappa per tipo di scuola

 

Indice di tutte le pagine del sito


Guida per navigare


Richiesta informazioni


Scuola Elettrica