- presentazione del sito
- Registrazione
- Eventi, mostre, convegni ed iniziative segnalate dalle aziende
- Recensioni ed articoli
- Le Mailing Lists
- La rivista Pc Ciechi
- Wiki
- Chi siamo
- Donazioni
- Un progetto degno di nota: Wintalbra
- Come navigare in questo sito
- rss
- Bancomat Accessibili sul territorio nazionale
- Contattaci
- I sostenitori di SpazioAusili
Corso visual basics cript/Lezione 24-uscita dal ciclo do loop
Guido Ruggeri su winguidotecnica, 20\01\2010, h. 11.55.
E' arrivato il momento di riprendere il discorso sui cicli e
di risolvere il problema su cui ci eravamo impantanati,
cioè: come si esce?
Per i cicli del tipo Do - Loop, l'istruzione per uscire è:
Exit Do. Sono due parole distinte.
Exit Do provoca l'effetto di far uscire dal ciclo:
l'esecuzione del programma prosegue con l'istruzione che
viene dopo Loop.
Cioè, immaginiamo questo tipo di struttura:
Ed ora, un po' di pubblicità
:Istruzioni prima del ciclo.
Do
Istruzioni interne al ciclo.
Exit Do
Loop
Istruzioni dopo del ciclo.
Il programma inizia eseguendo le istruzioni prima del ciclo.
Quando il programma incontra la parola Do, inizia il ciclo,
cioè: ripete le istruzioni interne al ciclo, che sono
quelle comprese tra la parola Do e la parola Loop che chiude
il ciclo.
Quando, all'interno del ciclo, si incontra l'istruzione Exit
Do, si esce dal ciclo. Il programma prosegue eseguendo le
istruzioni dopo del ciclo.
Mettendola così, però, ci rendiamo conto del perché
non avevamo parlato prima dell'istruzione Exit Do.
Perché, ragionando sulla struttura che abbiamo appena
rappresentato, ci accorgiamo che qualcosa non va: il ciclo
non serve a niente, perché l'istruzione Exit Do ci fa
subito uscire fuori, alla prima esecuzione del ciclo.
Al Loop, cioè, non si arriverà mai, perché si salta
direttamente alle istruzioni dopo del ciclo.
Allora è inutile aver fatto il ciclo, se non serve a
niente. Tanto valeva fare semplicemente così:
Istruzioni prima del ciclo.
Istruzioni interne al ciclo.
Istruzioni dopo del ciclo.
Ma allora il ciclo ha senso solo se l'istruzione Exit Do è
inserita in un'istruzione condizionale. Così si esce dal
ciclo solo quando quella condizione diventa verificata.
Quindi la nostra struttura deve diventare così:
Istruzioni prima del ciclo.
Do
Istruzioni interne al ciclo.
If Condizione Then Exit Do
Loop
Istruzioni dopo del ciclo.
Ecco perché sarebbe stato inutile parlare dell'istruzione
Exit Do, finché non avessimo parlato delle istruzioni
condizionali.
In realtà è possibile uscire dal ciclo anche in un altro
modo, che consiste nello scrivere la condizione di uscita
direttamente nella stessa riga dell'istruzione Do oppure in
quella dell'istruzione Loop, introducendola con la parola
Until oppure con la parola While.
Ma per ora, per non mettere troppa carne al fuoco rischiando
di confondere le idee, quest'altro modo lasciamolo stare.
Tanto usare Exit Do è sufficiente per qualsiasi esigenza,
l'altro è solo un modo diverso di scrivere ma il concetto
non cambia.
E adesso torniamo ad una nostra vecchia conoscenza:
l'esercizio 4.
Quello in cui avevamo provato un ciclo, ma senza sapere come
uscirne fuori.
Era così:
Do
Cognome = InputBox("Cognome:")
Nome = InputBox("Nome:")
MsgBox "Nominativo: " & Nome & " " & Cognome
Loop
Allora, dobbiamo stabilire un criterio su cui condizionare
l'uscita dal ciclo.
Teniamo presente che stiamo usando InputBox per interagire
con l'utente.
Come avevo detto, InputBox è una di quelle funzioni
vecchio stampo, che non rispondono ad una logica di
programmazione ad oggetti.
Cioè: noi chiamiamo la funzione InputBox, e non sappiamo
più niente di quello che succede al suo interno. Se
l'utente se ne sta lì senza fare niente, se sta usando il
mouse, se sta scrivendo nel campo di editazione, se sta
premendo il pulsante "Annulla" che è dentro la finestra di
dialogo: di tutto questo non sappiamo niente.
Sappiamo solo che, a un certo punto, la chiamata alla
funzione si chiuderà, riprenderà l'esecuzione del nostro
programma, e ci ritroviamo con una stringa che ci è
arrivata dalla funzione.
Quando parleremo della programmazione ad oggetti, vedremo
che in quell'ambito si ragiona in modo diverso, perché si
ha sempre il controllo degli eventi che si verificano negli
oggetti.
Invece InputBox per noi è una scatola chiusa, che
chiamiamo e da cui, dopo un po', ci esce fuori una stringa.
Basta. Non c'è altro.
Quindi abbiamo dei limiti, la InputBox ci dà il vantaggio,
ottimo per noi principianti, di essere già pronta per
l'uso e semplice e immediata da usare, però non possiamo
farci tutto quello che vorremmo.
Allora, che decidiamo? Potremmo fare come nella rubrica di
WinGuido, quando si immettono i numeri di telefono.
Il programma ci chiede: Telefono primo. Lo scriviamo e
premiamo invio. Poi ci chiede: Telefono secondo. E così
via.
La cosa va avanti finché non premiamo Invio senza aver
scritto niente, oppure finché non premiamo Esc.
Vogliamo seguire un criterio simile?
E allora facciamolo.
Possiamo farlo solamente in un modo, cioè controllando la
stringa che ci esce fuori da InputBox. Se è vuota, vuol
dire: o che l'utente non ha scritto nulla e ha premuto Invio
o fatto click sul pulsante Ok, oppure che l'utente, anche se
ha scritto qualcosa, è uscito premendo Esc oppure facendo
click sul pulsante Annulla.
Quale di queste cose esattamente abbia fatto l'utente non lo
possiamo sapere, ma sappiamo che ci ritroviamo con una
stringa vuota.
E allora il gioco è fatto. Aggiungiamo una riga con: If
Cognome = "" Then Exit Do.
Il nostro programma diventa così:
Do
Cognome = InputBox("Cognome:")
If Cognome = "" Then Exit Do
Nome = InputBox("Nome:")
MsgBox "Nominativo: " & Nome & " " & Cognome
Loop
C'era però un'altra proposta che qualcuno di voi aveva
fatto, quando a dicembre avevo sottoposto alla vostra
attenzione l'esercizio 4.
Si era detto: si potrebbe fare in modo che dopo un certo
numero di nominativi, si esca. Ad esempio, dopo 5 o 10
nominativi.
E allora facciamolo.
Vi propongo di provare a riscrivere l'esercizio 4 in modo
che, dopo aver immesso 5 nominativi, si esca dal ciclo.
Fate lavorare la vostra fervida fantasia, io rimango in
attesa di vedere quello che farete.
Alessandro Ricotta.
> Certo, il programma funziona correttamente, senza creare
> l'arresto critico dell'interprete, a patto che l'utente
> immetta solo caratteri numerici nel pieno rispetto delle
> convenzioni del nostro paese o al massimo non immetta
> alcun valore. Per gestire casi anomali senza il blocco
> dell'interprete sarebbe necessario conoscere la maniera
> di valutare se, per esempio, l'utente ha immesso
> esclusivamente numeri senza spazi o quant'altro.
Risposta:
Guido Ruggeri.
Queste cose impareremo a farle dopo che avremo parlato della
manipolazione delle stringhe.
E allora potremo scatenarci nel realizzare criteri di
validazione dei valori scritti dall'utente.
Però, usando la InputBox, potremo soltanto fare dei
controlli a posteriori sulle stringhe restituite da quella
funzione. Non sarà possibile, ad esempio, fare in modo che
l'utente, già nel campo di editazione che è dentro la
finestra di dialogo, possa digitare soltanto numeri o
soltanto lettere.
Perché, per i motivi a cui ho accennato nella lezione
sull'uscita dai cicli Do - Loop, con quel campo non possiamo
avere nessuna interazione. Possiamo solo aspettare che
l'utente ci scriva dentro qualcosa.
Però, una volta che abbiamo ottenuto la stringa scritta
dall'utente, potremo fare su quella tutti i controlli
possibili, e rimandare l'utente nella finestra di dialogo se
i controlli non saranno tutti soddisfatti.
Giovanni Taverna.
h. 13.16; ecco fatto, anche se con un piccolo imbroglio... certo se ci fosse
un contatore automatico di do.... ma forse ci arriveremo.
Option explicit
dim cognome, nome, nscheda
'primo nominativo
Do
Cognome = InputBox("Cognome:")
If Cognome = "" Then Exit Do
Nome = InputBox("Nome:")
nscheda= csng( inputbox("numero progressivo"))
MsgBox "Nominativo: " & Nome & " " & Cognome
If nscheda= 5 Then exit do
Loop
Alessandro Ricotta.
seguendo le tue indicazioni, propongo sotto un esercizio
sull'inserimento di un massimo di 5 nominativi che alla fine verranno
visualizzati tutti quanti in una finestra, uno per ogni riga.
Qui utilizzo sia i blocchi If l'uno dentro l'altro che due blocchi
Do-Loop, anch'essi l'uno dentro l'altro.
Ecco il testo dell'esercizio:
Option Explicit
Const Massimo = 5
Const Vuota = ""
Dim Nome
Dim Cognome
Dim Nominativo
Dim Nominativo1
Dim Nominativo2
Dim Nominativo3
Dim Nominativo4
Dim Nominativo5
Dim Contatore
Do
Do
Cognome = InputBox("Cognome:")
If Cognome <> Vuota then
Nome = InputBox("Nome:")
If Nome <> Vuota then
Exit do
Else
MSGBox "Attenzione: inserire un valore per il nome"
End If
Else
MSGBox "Attenzione: inserire un valore per il cognome"
End If
Loop
Nominativo = Nome & " " & Cognome
Contatore = Contatore + 1
If Contatore = 1 then Nominativo1 = Nominativo
If Contatore = 2 then Nominativo2 = Nominativo
If Contatore = 3 then Nominativo3 = Nominativo
If Contatore = 4 then Nominativo4 = Nominativo
If Contatore = 5 then Nominativo5 = Nominativo
If Contatore = Massimo then Exit Do
Loop
MsgBox "Nominativi:" & VBCRLF & Nominativo1 & VBCRLF & Nominativo2 &
VBCRLF & Nominativo3 & VBCRLF & Nominativo4 & VBCRLF & Nominativo5
Ambro.
qui ho svolto l'esercizio assegnatoci da Guido che chiedeva come fare a far ripetere il programma per un numero determinato di volte, qui ho scelto 10. Ho inoltre fatto in modo che l'utente venga informato di quante esecuzioni rimangono ancora prima che il programma termini. Mi è piaciuto molto svolgere questo esercizio! Come al solito state attenti se copiate su blocco note.
Fatemi sapere consigli o migliorie.
Option Explicit ' Tutte le variabili dovranno essere dichiarate
dim Cognome, Nome, I, Esecuz
'I ci servirà come variabile per determinare l'uscita dal programma. Esecuz invece, per informare l'utente di quante esecuzioni rimangono prima che il programma termini.
Do
Cognome = InputBox ("Inserisci il tuo cognome:")
Nome= InputBox ("Inserisci il tuo nome:")
I = I + 1
'Ad ogni esecuzione la variabile I aumenterà di 1
Esecuz = 10 - I
'Calcolo quante esecuzioni rimangono.
Msgbox ("Allora ti chiami " & Nome & " " & Cognome)
Msgbox ("Rimangono " & Esecuz & " esecuzioni prima che il programma si chiuda.")
If I = 10 Then Exit Do
'Quando la variabile I arriverà a 10 allora il programma terminerà.
Loop
Alessandro Ricotta.
mi sono reso conto che, così come lo avevo presentato, l'esercizio da me
postato non aveva un senso logico.
Ho apportato quindi piccole correzioni.
Lo ripropongo chiedendo il tuo parere:
Option Explicit
Const Massimo = 5
Const Vuota = ""
Dim Nome
Dim Cognome
Dim Nominativo
Dim Nominativo1
Dim Nominativo2
Dim Nominativo3
Dim Nominativo4
Dim Nominativo5
Dim Contatore
Do
Do
Cognome = InputBox("Cognome:")
If Cognome <> Vuota then
Nome = InputBox("Nome:")
If Nome <> Vuota then
Exit do
Else
MSGBox "Attenzione: inserire un valore per il nome"
End If
Else
MSGBox "Attenzione: inserire un valore per il cognome"
End If
Loop
Nominativo = Nome & " " & Cognome
Contatore = Contatore + 1
If Contatore = 1 then Nominativo1 = Nominativo
If Contatore = 2 then Nominativo2 = Nominativo
If Contatore = 3 then Nominativo3 = Nominativo
If Contatore = 4 then Nominativo4 = Nominativo
If Contatore = 5 then Nominativo5 = Nominativo
If Contatore = Massimo then Exit Do
Loop
MsgBox "Lista nominativi inseriti" & VBCRLF & "primo: " & Nominativo1 &
VBCRLF & "secondo: " & Nominativo2 & VBCRLF & "terzo: " & Nominativo3 &
VBCRLF & "quarto: " & Nominativo4 & VBCRLF & "quinto: " & Nominativo5
Possiamo fare le cose un po' più semplici, inserendo i nominativi
inseriti, sempre separati dal ritorno a capo, in un unica variabile.
Ecco il testo:
Option Explicit
Const Massimo = 5
Const Vuota = ""
Dim Nome
Dim Cognome
Dim ListaNominativi
Dim Contatore
Do
Do
Cognome = InputBox("Cognome:")
If Cognome <> Vuota then
Nome = InputBox("Nome:")
If Nome <> Vuota then
Exit do
Else
MSGBox "Attenzione: inserire un valore per il nome"
End If
Else
MSGBox "Attenzione: inserire un valore per il cognome"
End If
Loop
ListaNominativi = ListaNominativi & Nome & " " & Cognome
Contatore = Contatore + 1
If Contatore < Massimo then
ListaNominativi = ListaNominativi & VBCRLF
Else
Exit Do
End If
Loop
MsgBox "Lista nominativi inseriti" & VBCRLF & ListaNominativi
Giovanni taverna.
h.18.00; Rifacendo l'esercizio 4 con le aggiunte della lezione ultima, ho
scoperto che il pulsante annulla ora funziona mentre prima no; è un caso o è
collegato in qualche modo a exit do?
Alessandro Pannocchi.
Sono tornato poco fa dal dentista e sono ancora un po' intontito dall'anestesia. Nonostante questo, vi sottopongo questa cosetta, che vuole essere un piccono compendio delle ultime cose fatte. si può fare di meglio, ma accettate la buona volontà.
Option Explicit
const spazio = " ", Vuota = ""
Dim risp
Dim giusta
Dim Sbaglio
Dim Controllo
Dim Interrotto
Dim Maius
Dim Frase
Do
Risp = InputBox("Cognome del primo cosmonauta: ")
if Risp = Vuota then
Interrotto = True
exit do
End If
giusta = "Gagarin"
Controllo = StrComp(risp, giusta) = 0
If Controllo Then
Exit Do
else
Maius = StrComp(risp, giusta, 1) = 0
End If
If Maius then
exit Do
else
Sbaglio = Sbaglio + 1
If Sbaglio <3 then
msgbox "Risposta errata. Riprova."
Else
Exit Do
End If
end If
Loop
If interrotto then
Frase = "Programma interrotto dall'utente."
ElseIf Controllo Then
Frase = "Bravo, hai risposto esattamente."
ElseIf Maius Then
Frase = "La risposta è esatta, ma attento alle maiuscole!"
ElseIf Sbaglio = 3 then
frase = "Sarà meglio che tu vada ad informarti."
End If
MsgBox frase
so che è un po' ingarbugliato, ma in questo momento non so fare di meglio. quando mi sarà passato, ci riprovo.
Guido Ruggeri.
Messaggio originale:
Da : "Giovanni Taverna"
21.16; scritto così non va, nel senso che no si ferma...
cosa sbaglio?
Risposta:
Ad ogni ciclo, Numero vale sempre 2.
Infatti risulta:
contatore = 1
numero= contatore+1
Perciò Numero è sempre uguale a 2 e non arriverà mai
ad essere uguale a 5.
La condizione If numero= 5 Then exit do non si
verificherà mai.
Guido Ruggeri.
Option explicit
dim cognome, nome, contatore, numero
'primo nominativo
Do
Cognome = InputBox("Cognome:")
If Cognome = "" Then Exit Do
Nome = InputBox("Nome:")
contatore = 1
numero= contatore+1
MsgBox "Nominativo: " & Nome & " " & Cognome
If numero= 5 Then exit do
Loop
Daniele Maccaglia.
contatore = 0
do
Cognome = Inputbox("Scrivi il tuo cognome")
if cognome = "" then exit do
nome = Inputbox ("Scrivi il tuo nome")
contatore = (contatore)+1
msgbox ("Il tuo nome e il tuo cognome sono rispettivamente"
& nome & " " & cognome)
if contatore =5 then exit do
loop
Antonio De Angelis.
si ma prima del Do quel contatore 0 che vuol dire? poi se
il limite dei cicli e 5 e normale che parte da 0 o non ci
ho capito ancora nulla?
Risposta:
Guido Ruggeri.
Quella è una saggia precauzione.
E' vero che in questo caso appare superfluo, perché siamo
all'inizio del programma, quindi contatore parte da 0, anzi,
più esattamente, parte da Empty.
Ma dobbiamo sempre pensare che queste poche righe di
programma potrebbero dover essere inserite in un programma
più complesso.
E in quel programma potrebbero già esserci lunghe serie di
altre istruzioni prima di arrivare al nostro ciclo.
E noi potremmo non sapere, o non ricordare, che nelle
istruzioni precedenti si fa già uso di una variabile che
si chiama contatore.
E quindi potremmo trovarci, senza saperlo, che, all'inizio
del nostro ciclo, partiamo già con la variabile contatore
che contiene un numero. Ad esempio; 4.
Se così fosse, e noi non provvedessimo ad annullarla, il
nostro ciclo sarebbe, con nostra sorpresa, eseguito una
volta sopra. Perché, alla conclusione del primo ciclo, ci
troveremmo già con contatore = 5, e questa è la
condizione che ci fa uscire dal ciclo.
Se poi iniziassimo con contatore che vale già 5 o un
qualsiasi altro numero superiore a 5, dal ciclo non
usciremmo mai, se non fosse che Daniele ha messo anche
un'altra via di uscita che entra in funzione quando l'utente
non immette nulla nel campo del cognome.
Insomma, partire inizializzando il contatore a 0 ci evita il
rischio di trovarci in situazioni in cui non abbiamo il
controllo sull'effettivo valore iniziale del contatore.
Infine un'osservazione per Daniele: fai un uso eccessivo di
parentesi anche quando non servono.
E' vero che non fanno alcun danno, per cui mettercele può
rispondere ad una logica del tipo: non essendo sicuro di
quando ci vogliono o no, nel dubbio ce le metto, così sto
tranquillo.
Tuttavia, è bene osservare che:
L'istruzione
contatore = contatore+1
si può scrivere senza parentesi;
anche l'argomento di MsgBox può essere scritto senza
parentesi, dato che stiamo usando quella routine come se
fosse una procedura, anziché una funzione.
Fai poi sempre attenzione, quando concateni delle stringhe,
che il risultato sia ortograficamente corretto. Per come hai
fatto tu, la parola rispettivamente e il nome risultano
attaccati, mancando uno spazio interposto.
Alessandro Pannocchi.
Svaniti i fumi dell'anestesia, ho razionalizzato la cosa di ieri sera, così:
Option Explicit
const spazio = " ", Vuota = ""
Dim risp
Dim giusta
Dim Sbaglio
Dim Binario
Dim Interrotto
Dim Testo
Dim Frase
Do
Risp = InputBox("Cognome del primo cosmonauta: ")
if Risp = Vuota then
Interrotto = True
exit do
End If
giusta = "Gagarin"
Testo = StrComp(risp, giusta, 1) = 0
Binario = StrComp(Risp, giusta) = 0
If Testo Then
Exit Do
else
Sbaglio = Sbaglio + 1
If Sbaglio <3 then
msgbox "Risposta errata. Riprova."
Else
Exit Do
End If
end If
Loop
If interrotto then
Frase = "Programma interrotto dall'utente."
ElseIf Binario Then
Frase = "Bravo, hai risposto esattamente."
ElseIf Testo Then
Frase = "La risposta è esatta, ma attento alle maiuscole!"
ElseIf Sbaglio = 3 then
frase = "Sarà meglio che tu vada ad informarti."
End If
MsgBox frase
E così è assai più semplice.
Giovanni Taverna
Scusa Alessandro, ma per me risulta assolutamente incomprensibile in alcune
sue parti: interrotto? binario?
Spero di riuscire a starvi dietro più avanti.
Alessandro Pannocchi.
Interrotto è solo una variabile di tipo booleano, che può essere impostata a vero o falso. Se io non immetto nessun carattere quando mi viene richiesta una risposta, voglio che questa condizione, cioè la variabile risp vuota provochi l'uscita dal ciclo e quindi dal programma. Allora dico che quando la variabile Risp è vuota vengano compiute le seguenti azioni:
sia impostata come vera la variabile Interrotto.
si esca dal ciclo e quindi si interrompa la serie di domande.
A questo punto si arriva alla parte finale del programma, dove si fa la statistica di quello che è successo. Ho posto come condizione che, quando la variabile Interrotto è vera, venga dato il messaggio "Programma interrotto dall'utente" e non si faccia neppure il conteggio delle risposte. in pratica questa variabile serve solo a far capire al finale del programma che non siamo arrivati lì per la via naturale ma in seguito ad una interruzione volontaria e prematura.
in quanto a Binario, io faccio due confronti: uno in modo testo e uno in modo binario, immettendo il risultato rispettivamente nelle variabili booleane Testo e Binario. cosa succede dopo?
Se il confronto in modo testo è vero, la risposta è comunque esatta, poi, se è vero anche quello in modo binario, allora vuol dire che la risposta è stata scritta in modo identico a quella da me impostata nella variabile giusta, cioè con le maiuscole al loro posto. Se invece il confronto Binario fallisce, la risposta è comunque buona, perchè quello in modo testo è vero, ma vuol dire che l'utente non ha usato la maiuscola e io glielo faccio presente. prova e vedrai.
Ad ogni modo sono a tua disposizione, perchè non ho fatto l'esercizio per farmi bello, ma perchè servisse da materiale per discussione e approfondimento. Prova anche la funzione in caso di errore, che dà tre possibilità di riprovare e poi dà lui la risposta.
Ambro.
Ciao, l'esercizio l'ho fatto io, ma funzionava anche nella mia versione.
Solo che io avevo distinto le due variabili, I per il conteggio ed esecuz per dire all'utente quante esecuzioni mancano.
Ricopio l'esercizio fatto da me con una piccola modifica. La modifica consiste nel fatto che ora, anche se l'utente non digita niente in cognome il programma uscirà lo stesso.
Option Explicit ' Tutte le variabili dovranno essere dichiarate
dim Cognome, Nome, I, Esecuz
'I ci servirà come variabile per determinare l'uscita dal programma. Esecuz invece, per informare l'utente di quante esecuzioni rimangono prima che il programma termini.
Do
Cognome = InputBox ("Inserisci il tuo cognome:")
If Cognome = "" Then Exit Do
'Se l'utente non digita niente in cognome il programma uscirà.
Nome= InputBox ("Inserisci il tuo nome:")
I = I + 1
'Ad ogni esecuzione la variabile I aumenterà di 1
Esecuz = 10 - I
'Calcolo quante esecuzioni rimangono.
Msgbox ("Allora ti chiami " & Nome & " " & Cognome)
Msgbox ("Rimangono " & Esecuz & " esecuzioni prima che il programma si chiuda.")
If I = 10 Then Exit Do
'Quando la variabile I arriverà a 10 allora il programma terminerà.
Loop
Alessandro Pannocchi.
Ecco qua un piccolo lavoro. Si tratta di un quiz di 10 domande, in cui si applicano i concetti appresi fino ad ora.
Option Explicit
const spaz = " ", Vuota = "", Max = 10
Dim Domanda
Dim risp
Dim giusta
Dim Sbaglio
Dim Richiesta
Dim Binario
Dim Interrotto
Dim Testo
Dim Frase
Dim Quiz
Dim Bene
Dim Accapo
Accapo = VbCr
MsgBox "Ora ti farò 10 domande di argomento vario e, alla fine, vedremo a quante avrai risposto esattamente." & Accapo & "Quando sei pronto, premi il tasto invio."
Quiz = 1
Do
' Domande e relative soluzioni.
If Quiz = 1 then
Domanda = "Qual è il cognome del primo cosmonauta ?"
Giusta = "Gagarin"
ElseIf Quiz = 2 Then
Domanda = "Chi ha scritto Il libro ""Le mie prigioni""?"
Giusta = "Pellico"
ElseIf Quiz = 3 Then
Domanda = "In che anno fu scoperta l'America?"
Giusta = "1492"
ElseIf Quiz = 4 Then
Domanda = "Chi bruciò le navi dei romani con degli specchi?"
Giusta = "Archimede"
ElseIf Quiz = 5 Then
Domanda = "Chi disse: ""Il dado è tratto""?"
Giusta = "Cesare"
ElseIf Quiz = 6 Then
Domanda = "Come si chiamava il primo presidente della Repubblica italiana?"
giusta = "De Nicola"
ElseIf Quiz = 7 Then
Domanda = "Come si chiama l'alfabeto composto di punti e linee?"
Giusta = "Morse"
ElseIf Quiz = 8 Then
Domanda = "Chi è l'autore della musica de ""Il Nabucco""?"
Giusta = "Verdi"
ElseIf Quiz = 9 Then
Domanda = "Con quale nome è meglio conosciuto vladimir Ulianov?"
Giusta = "Lenin"
ElseIf Quiz = 10 Then
Domanda = "Su quale città fu sganciata la prima bomba atomica?"
Giusta = "Hiroscima"
End If
Do
Richiesta = "Domanda numero " & Quiz & "." & Accapo & Domanda
Risp = InputBox(Richiesta)
if Risp = Vuota then
Interrotto = True
exit do
End If
Testo = StrComp(risp, giusta, 1) = 0
Binario = StrComp(Risp, giusta) = 0
If Testo Then
Bene = Bene + 1
Exit Do
else
Sbaglio = Sbaglio + 1
If Sbaglio <3 then
msgbox "Risposta errata. Riprova."
Else
Exit Do
End If
end If
Loop
If interrotto then
Exit Do
ElseIf Binario Then
Frase = "Bravo, hai risposto esattamente."
ElseIf Testo Then
Frase = "La risposta è esatta, ma attento alle maiuscole!"
ElseIf Sbaglio = 3 then
frase = "Sarà meglio che tu vada ad informarti." & Accapo & "La risposta giusta era: "& Giusta
Sbaglio = 0
End If
MsgBox frase
Quiz = Quiz + 1
If Quiz > Max Then Exit Do
Loop
' Statistiche
If Interrotto Then
Frase = "Programma interrotto dall'utente"
ElseIf Bene = Max Then
Frase = "sei un campione! Le hai azzeccate tutte!"
ElseIf Bene = 0 then
Frase = "Sei proprio un asino! Non ne hai azzeccata una! Vergogna!"
ElseIf Bene = 1 Then
Frase = "Hai risposto esattamente ad una sola domanda su " & Max & ". Vedi di istruirti!"
ElseIf Bene =< 5 Then
Frase = "Hai risposto esattamente a " & Bene & " domande su " & Max & "." & Accapo& "Non è ancora sufficiente!"
ElseIf Bene =< 8 Then
Frase = "Bene Bene. Hai risposto esattamente a " & Bene & " domande su " & Max
Else
Frase = "Hai risposto esattamente a " & Bene & " domande su " & Max & "." & Accapo & "Ancora un piccolo sforzo e sarai un campione!"
End If
MsgBox Frase
Il ciclo Do ... Loop esterno serve ad assegnare alle stesse variabili, Domanda e Giusta, valori diversi man mano che si passa alla domanda successiva, mentre quello interno è il programma di confronto vero e proprio. Come si vede, con questo sistema si utilizza una routine scritta una sola volta e ripetuta per 10 volte, semplificando notevolmente la struttura di un programma che, senza il Do ... Loop si sarebbe dovuto scrivere ben 10 volte per ottenere lo stesso effetto.
Se avrete avuto la pazienza di scorrerlo tutto, vi ringrazio per la vostra tenacia......
Mario Ricci.
Ciao a tuttti, sono Mario (ah già, Mario di MIrella).
Lo sapevo io! Ero quasi riuscito a mettermi in
paro qualche giorno fa, e stavo mettendo a punto
un esercizietto sul famoso esercizio 4,quando ho
dovuto assentarmi per un paio di giorni ed eccomi
qua, con un centinaio di messaggi da leggere e le
mie povere elucubrazioni già superate.
Ve le vorrei presentare lo stesso anche perchè
c'è un punto che mi piacerebbe capire meglio.
Allora: secondo me, molti (Antonio,. i vari
Alessandri ecc) hanno risposto giusto alla
domanda come si fa ad uscire dal loop senza fine
dell'esercizio 4. Ci sono almeno due modi: nel
primo basta definire una particolare stringa che
quando viene digitata, ad esempio come "Nome",
dirotta il codice verso l'uscita dal loop. Per
questo avevo scritto il programmino:
do
Cognome = InputBox("Cognome")
Nome = InputBox("Nome" &vbcr&"(inserire il Nome
""aaaa"" per fermare il programma)")
MsgBox "Nominativo: " & Nome & " " & Cognome
if Nome = "aaaa" Then
Exit do
End if
loop
Il secondo metodo consiste nel fissare a priori
il numero di cicli che si vogliono fare prima di
uscire. Bene,nel mettere su un esercizietto su
questa soluzione è venuta fuori la mia scarsa
confidenza con i concetti che il nostro
presidente/benefattore/imperatore ha cercato di
insegnarci. Per quanti tentativi facessi, non
riuscivo a far utilizzare in modo corretto al
codice il numero N di cicli che io immettevo con
un Inputbox. Alla fine (eh, ce n'è voluto) ho
intuito che il problema era legato al fatto che
quello che io immettevo non era un numero,ma una
stringa numerica. L'effetto perverso che ottenevo
è illustrato nel semplicissimo programmino che
segue, che ho intitolato "Sorpresa":
MsgBox "Nel codice è inserito il numero fisso i che vale 100"&VBcr&"Proseguire"
N=InputBox("Inserire un numero intero N iniziando con 1 oppure con 10")
i="100"
Msgbox "N= " &N &" i= " &i
if i Vuota then
Massimo = CInt(Massimo)
If Massimo > 0 then
Do
Contatore = Contatore + 1
Do
Cognome = InputBox("Cognome:")
If Cognome <> Vuota then Exit Do
MSGBox "Attenzione: inserire un valore per il cognome"
Loop
Do
Nome = InputBox("Nome:")
If Nome <> Vuota then Exit Do
MSGBox "Attenzione: inserire un valore per il nome"
Loop
ListaNominativi = ListaNominativi & Nome & " " & Cognome
If Contatore < Massimo then
ListaNominativi = ListaNominativi & VBCRLF
Else
Exit Do
End If
Loop
MsgBox "Lista nominativi inseriti" & VBCRLF & ListaNominativi
Else
MSGBox "Attenzione: non è stato inserito un numero maggiore di 0" &
VBCRLF & "Il programma è stato interrotto"
End If
Else
MSGBox "Errore: Nessun valore inserito"
End If
Anche qui ripeto quanto ho detto in precedenza.
Se, alla richiesta del numero di nominativi da inserire, si digita una
stringa numerica o, al massimo, non viene digitato nulla, il programma
non crea il blocco dell'interprete, altrimenti, se la funzione di
conversione CInt trova nella variabile "Massimo" un tipo di dati non
idoneo, il programma subisce un arresto critico.
Antonio De Angelis.
> ho provato a fare un esperimento ma non mi
> funge.evidentemente mi sto arenando di brutto. mi potete
> aiutare per capire come falro funzionare? e un programma
> basato su i colori.
>
Option Explicit
Dim Tentativi
Dim Contatore
Dim Colore, ColoreVero
Dim Comparazione
Contatore = 0
Tentativi = Cint(InputBox("Inserisci il numero di
tentativi da immettere"))
Do
Contatore = Contatore + 1
Colore = InputBox("Colore" & Contatore & ":" )
If Colore = "" Then Exit Do
ColoreVero = "Viola" & Contatore & ":"
If Contatore = Tentativi Then Exit Do
Comparazione = colore = colorevero
Loop
MsgBox "Il Colore: "& ColoreVero & "è Giusto. Bravo"
MsgBox "Il Colore: " & Colore & "è sbagliato! Ritenta."
r.
Guido Ruggeri.
Così non funzionerà mai, perché hai posto:
ColoreVero = "Viola" & Contatore & ":"
cioè alla stringa "Viola" hai concatenato il Contatore, e
poi un'altra stringa col segno dei due punti.
Quindi perché la comparazione ti risulti vera,
bisognerebbe che l'utente scriva, nella finestra di dialogo
aperta da InputBox, il colore esattamente così: Viola
seguito dal valore che il Contatore ha in quel momento e poi
dai due punti.
A parte questo, la comparazione, sia che risulti verificata
o no, non ti serve a niente perché, dopo che l'hai fatta,
non viene più utilizzata, e il ciclo continua in ogni
caso.
Manca cioè un'istruzione del tipo: se la comparazione è
vera, esci del ciclo.
Quando poi esci dal ciclo, appaiono due messaggi:
MsgBox "Il Colore: "& ColoreVero & "è Giusto. Bravo"
MsgBox "Il Colore: " & Colore & "è sbagliato! Ritenta."
Questi due messaggi non sono inseriti in istruzioni
condizionali, per cui appaiono comunque, uno dopo l'altro,
indipendentemente da ciò che l'utente ha immesso durante
il ciclo.
Quindi l'utente, qualunque cosa abbia scritto, si sentirà
in ogni caso dire che il colore Viola seguito da un numero
è giusto, mentre il colore ultimo che ha scritto è
sbagliato.
Guido Ruggeri
Risposta:
E' semplice.
basta mettere il messaggio dopo la riga
If Comparazione = True Then Exit Do
perché quella riga viene superata solo se il colore è
errato.
Così:
If Comparazione = True Then Exit Do
MsgBox "Il colore da te digitato è errato"
If Contatore = Tentativi Then Exit Do
Loop
Altre osservazioni.
Dopo l'uscita dal ciclo, è inutile ripetere il confronto
If Colore = ColoreVero Then
perché quel confronto l'avevi già fatto prima, con la
riga:
Comparazione = StrComp(Colore, ColoreVero, 1) = 0
e l'avevi fatto anche meglio, cioè in modo da non tenere
conto delle differenze tra lettere maiuscole e minuscole.
Dato che hai salvato il risultato del confronto nella
variabile Comparazione, tanto vale riutilizzarla.
Perciò, dopo il ciclo, conviene scrivere:
If Comparazione Then
MsgBox "Il Colore: "& ColoreVero & "è Giusto. Bravo"
Else
All'interno del ciclo, c'è l'istruzione:
ColoreVero = "viola"
il che significa che quell'istruzione viene ripetuta tutte
le volte, quando invece basterebbe una volta sola.
Perciò conviene quella riga metterla prima del ciclo.
Così:
ColoreVero = "viola"
Do
Si potrebbe anche definire come costante:
Const ColoreVero = "viola"
Insomma, bisogna sempre cercare di ottimizzare il programma
in modo da non ripetere inutilmente delle operazioni già
svolte.
Teniamo presente che per programmini così è irrilevante,
ma se stessimo lavorando a programmi dove si svolgono
ricerche in grandi database oppure collegamenti ad Internet,
cioè operazioni che possono richiedere anche parecchi
secondi o minuti, allora la differenza si sente.
Quindi è bene che ci prendiamo fin da ora l'abitudine di
ottimizzare il più possibile il codice che scriviamo.
Infine, osservazione ormai vecchia ma che evidentemente è
bene continuare a ripetere: quando si concatenano delle
stringhe, bisgona farlo in modo che la stringa risultante
risulti ortograficamente corretta.
Invece, in questa istruzione
MsgBox "Il Colore: "& ColoreVero & "è Giusto. Bravo"
ci sono due parole che vengono attaccate. Infatti risulta:
Il Colore: violaè Giusto. Bravo
Giovanni Taverna.
> H. 18.03; cCaro prof, se appena modifico qualcosa, salta
> tutto per aria; l'errore mi dice che il loop è senza '
,
> chissà cosa vuol dire? giovanni
Option explicit
Dim nominativi
Dim cognome, nome
Dim contatore
nominativi= Cint( inputbox( "numero nominativi da
inserire"))
contatore = 0
Do
contatore= contatore +1
cognome= inputbox(" Cognome numero " & contatore & ":")
If cognome = "" Then
msgbox " Il cognome è obbligatorio "
If cognome="" Then exit do
nome= inputbox("Nome numero " & contatore& ":" )
If nome="" Then exit Do
If contatore = nominativi Then exit do
Loop
Msgbox "Nominativo : "& nome &" " & cognome
r.
Se il programma lo hai scritto così come appare nel
messaggio, allora l'errore è nelle due righe:
If cognome = "" Then
msgbox " Il cognome è obbligatorio "
che andavano scritte in un'unica riga.
Così:
If cognome = "" Then MsgBox "Il cognome è obbligatorio"
Il messaggio di errore che ti appare è "Loop senza Do", e
adesso cerchiamo di capirlo.
Scrivendo:
If cognome = "" Then
e andando a capo, tu hai dato inizio, senzza volerlo, ad un
blocco If - End If.
L'interprete si apetta quindi di incontrare, più avanti,
un'istruzione End If che chiuda quel blocco. Ma
quell'istruzione non c'è.
Invece, qualche riga più avanti, l'interprete trova
l'istruzione Loop, a chiusura del ciclo che era stato
iniziato dall'istruzione Do che si trovava prima.
Ma il blocco If - End If non è ancora stato chiuso. Quindi
l'istruzione Loop si trova dentro il blocco.
L'interprete si aspetta quindi che quell'istruzione Loop
faccia riferimendo ad una precedente istruzione Do che sia
anch'essa interna al blocco.
Ma quell'istruzione non c'è.
Infatti, l'istruzione Do che sta prima, l'interprete non la
ritiene associabile a quel loop, perché Do sta prima del
blocco If - End If, mentre Loop ci sta dentro.
Ecco quindi il messaggio di errore: "Loop senza Do".
d.
> c'è in VBScript un'istruzione che faccia terminare il
> programma, come era end per il QB45 o per il VB 1.0? Per
> spiegarmi meglio, una cosa che, quando si vuole
> interrompere si possa fare : If Cognome = "" Then End
Risposta:
Guido Ruggeri.
No, l'istruzione End non è supportata da VBSctipt.
C'è un'altro sistema che permette di sostituirla, ma per
capirlo dovremmo aver parlato di programmazione ad oggetti.
Comunque facciamo un piccolo strappo alla regola. Dirò
come si deve fare, anche se non possiamo ancora ben capire
di cosa si tratta.
In fondo, anticipare qualche cosetta può anche essere un
modo per cominciare a prendere confidenza con la
programmazione a oggetti.
L'istruzione che permette di interropere l'esecuzione di un
programma è questa:
WScript.Quit
da notare che è un'istruzione fatta di due parole separate
da un punto, e questa è la sintassi tipica della
programmazione a oggetti.
Deve intendersi così: all'oggetto WScript applichiamo il
metodo Quit.
Basta, non diciamo altro. Per ora è sufficiente rispondere
ad Alessandro che, per fare quello che volevi, devi scrivere
così:
If Cognome = "" Then WScript.Quit
Alessandro Pannocchi.
> Option Explicit
> Const spaz = " ", Max = 6
> Dim Nominativi
> Dim Frase
> Dim Generalita1
> Dim Generalita2
> Dim Generalita3
> Dim Generalita4
> Dim Generalita5
> Dim Generalita6
> Dim Contatore
> Dim Interrotto
> Dim Cognome, Nome
>
> Nominativi = CInt(InputBox("Numero di nominativi da
> immettere, massimo 6:")) If Nominativi > 6 then Nominativi
> = 6 Contatore = 0
> Do
> Contatore = Contatore + 1
> Cognome = InputBox("Cognome " & Contatore & ":")
> If Cognome = "" Then
> Interrotto = true
> Exit Do
> End If
> Nome = InputBox("Nome " & Contatore & ":")
> If contatore = 1 then
> Generalita1 = Nome & Spaz & cognome
> ElseIf Contatore = 2 Then
> Generalita2 = Nome & Spaz & cognome
> ElseIf Contatore = 3 Then
> Generalita3 = Nome & Spaz & cognome
> elseIf Contatore = 4 Then
> Generalita4 = Nome & Spaz & cognome
> elseIf Contatore = 5 Then
> Generalita5 = Nome & Spaz & cognome
> ElseIf contatore = 6 then
> Generalita6 = Nome & Spaz & cognome
> End If
> If Contatore = Nominativi Then Exit Do
> Loop
>
> If Not interrotto Then
> MsgBox "Ecco i nominativi che hai inserito:"
> End If
> contatore = 0
> Do
> If Interrotto then Exit Do
> Contatore = Contatore + 1
> If Contatore = 1 then
> MsgBox "Nominativo 1: " & Generalita1
> ElseIf Contatore = 2 then
> MsgBox "Nominativo 2: " & Generalita2
> ElseIf Contatore = 3 then
> MsgBox "Nominativo 3: " & Generalita3
> ElseIf Contatore = 4 then
> MsgBox "Nominativo 4: " & Generalita4
> ElseIf Contatore = 5 then
> MsgBox "Nominativo 5: " & Generalita5
> ElseIf Contatore = 6 then
> MsgBox "Nominativo 6: " & Generalita6
> End If
> If Contatore = Nominativi Then exit do
> loop
>
> If interrotto Then
> Frase = "programma interrotto dall'utente."
> else
> Frase = "Programma terminato. Arrivederci!"
> end If
>
> MsgBox Frase
>
>
> Il programma è in grado di gestire fino ad un massimo di
6
> nominativi, per cui, se si immette un numero superiore, il
> programma non ne tiene conto e si ferma a 6, che, per
> dimostrazione, sono più che sufficienti. Sempre a
> disposizione. alessandro
__._,_.___
Preciso subito che non credo sia questo che guido voleva
Risposta:
Guido Ruggeri.
Comunque quello che ha fatto Alessando è da tenere ben da
conto.
La metodologia che ha seguito in effetti è già un
anticipo di ciò di cui voglio arrivare a parlare.
Cominciate allora a chiedervi: e se il massimo dei
nominativi non fosse 6, ma dovesse poter essere un numero
grande quanto si vuole? anche cento, mille, un milione?
Che facciamo? non possiamo certo metterci a definire un
milione di variabili e a gestire un milione di casi,
scrivendo un milione di istruzioni, una per ogni caso, come
ha fatto Alessandro.
Guido Ruggeri.
Antonio De Angelis.
d.> per evitare di far partire il ciclo nel caso in cui lancio
> il file e poi voglio uscire mi era venuta l'idea di
> inserire un istruzione condizionale sul contatore if
> contatore = "" Then ma non mi esce comunque. perche'?
Risposta:
Guido Ruggeri.
Semmai la condizione dovresti metterla su Tentativi, non su
Contatore.
Poco fa ho rivelato, pur senza spiegarne il significato,
qual è l'istruzione per interrompere l'esecuzione di un
programma.
Allora potresti usare quella, in questo modo:
Tentativi = InputBox("Inserisci il numero di tentativi da
immettere")
If Tentativi = "" Then WScript.Quit
Tentativi = CInt(Tentativi)
Option Explicit
Dim Tentativi
Dim Contatore
Dim Colore, ColoreVero
Dim Comparazione
Contatore = 0
Tentativi = Cint(InputBox("Inserisci il numero di
tentativi da immettere")) ColoreVero = "viola"
Do
Contatore = Contatore + 1
Colore = InputBox("Colore" & Contatore & ":")
If Colore = "" Then Exit Do
Comparazione = StrComp(Colore, ColoreVero, 1) = 0
If Comparazione = True Then Exit Do
If Contatore = Tentativi Then Exit Do
MsgBox "Il colore : " & colore & ", è errato! Riprova!"
Loop
If Comparazione Then
MsgBox "Il Colore: " & ColoreVero & ", è Giusto. Bravo"
Else
MsgBox "Il Colore : " & Colore & ", è errato. Il Colore
giusto è: " & ColoreVero
End If
Alessandro Ricotta.
> vi sottopongo un esercizio sul controllo della data.
> Si tratta di un programmino che controlla se l'anno
> immesso dall'utente è bisestile visualizzando alla fine
> un messaggio di notifica.
>
> 'Controlla se l'anno immesso dall'utente è bisestile
> Option Explicit 'Tutte le variabili devono essere
> dichiarate Dim Anno, Bisestile 'Dichiaro le variabili
> Anno = InputBox("Immettere l'anno:")
> If Anno <> "" Then 'Il programma continua solo se l'utente
> ha immesso un valore
> Anno = CInt(Anno) 'Trasformo la stringa restituita da
> InputBox in numero intero
> Bisestile = False 'Inizializzo a False la variabile
> Bisestile in modo che risulti sempre un valore booleano
> 'Eseguo dei calcoli sul valore "Anno" utilizzando la
> funzione CInt per ricavare il resto delle divisioni
> If (Anno / 100) - CInt(Anno / 100) Then 'se dalla
> divisione di "Anno" per 100 viene fuori un resto diverso
> da 0 If ((Anno / 4) - CInt(Anno / 4)) = 0 then Bisestile
=
> True 'E se sempre dalla divisione di "Anno" per 4 non
> ricavo alcun resto, allora imposto la variabile
> "Bisestile" a "True" 'In caso contrario tale variabile
> rimane impostata a False Elseif ((Anno / 400) - CInt(Anno
> / 400)) = 0 then Bisestile = 1 'oppure, se dalla
> divisione di "Anno" per 400 non viene fuori alcun resto,
> anche in questo caso imposto la variabile "Bisestile" a
> "True" End If
> 'Se non si verifica alcuno dei casi sopra esaminati, il
> valore di "Bisestile" rimane "False"
> If Bisestile then MSGBox "L'anno immesso è bisestile"
Else
> MSGBox "L'anno immesso non è bisestile"
> End If
r.
Guido Ruggeri.
__._,_.___
Di funzioni matematiche finora non abbiamo parlato, se non
delle quattro operazioni, perciò non sapevi che esistono
degli operatori che possono semplificarti i calcoli.
In questo caso conviene sfruttare l'operatore Mod.
Applicato tra una coppia di numeri, l'operatore Mod
restituisce il resto nella divisione del primo numero per il
secondo.
Cioè:
4 mod 3 restituisce 1
7 mod 5 restituisce 2
13 mod 4 restituisce 1
15 mod 5 restituisce 0
Allora l'operatore Mod può essere sfruttato per verificare
se il primo numero è divisibile per il secondo: in questo
caso, non c'è resto e Mod restituisce 0.
Quindi, nell'esercizio di Alessandro, per verificare se
l'anno è divisibile per 4 è sufficiente scrivere:
If Anno Mod 4 = 0 Then Bisestile = True
Alessandro Pannocchi.
Questa volta so che guido non me la perdona, ma, siccome ho dovuto far vedere a mio figlio come si fa un programmino per testare se un numero è numero primo, ve lo sottopongo. La ragione del previsto rimprovero è che in questo programma ho usato una funzione di cui non abbiamo ancora parlato, cioè quella che serve per estrarre la radice quadrata di un numero.
si tratta della funzione Sqr, che si usa così:
radice = Sqr(numero)
e la variabile Radice conterrà appunto questo valore.
In questo programma l'ho usata per determinare il numero massimo per cui deve essere diviso il numero in esame, prima di determinare con certezza se si tratta di numero primo. Infatti, se si divide un numero dato per tutti i numeri che vanno da 2 fino alla sua radice quadrata e non se ne trova nessuno che lo divide esattamente, si può affermare con certezza che questo numero è primo.
Nel programma ho sfruttato anche la funzione Mod, di cui guido ha parlato a proposito del calcolo degli anni bisestili. cioè quella che restituisce il valore del resto di una divisione.
Dato che c'ero, nel caso che il numero dato non sia primo, il programma lo scompone nei suoi fattori.
ecco il programma:
' Individuazione di numeri primi e, se non lo sono, scomposizione in fattori primi.
Option Explicit
dim Numero
Dim Num
Dim Primo
Dim Divisibile
dim x
Dim Fattori
Dim Accapo
Accapo = VbCr
Numero = InputBox("Numero da esaminare: ")
Num = Cint(Numero)
primo = True
X = 1
Do
X = x + 1
Divisibile = (num Mod x) = 0
If Divisibile then
Primo = False
Fattori = Fattori & x & " _ "
Num = Num \ x
x = 1
end if
If x => Sqr(Num) Then Exit Do
Loop
If Num > 1 then
Fattori = Fattori & num
End If
If Primo Then
MsgBox "il numero " & Numero & " è un numero primo. "
Else
MsgBox "il numero " & Numero & " non è un numero primo." & Accapo & "I suoi fattori primi sono: " & Fattori
end If
Giovanni Taverna.
Ti > chiedo una cortesia; sia con do - loop sia con i blocchi if mi trovo
> particolarmente fuori fase con gli incistamenti; con tutto comodo potrei
> chiederti uno schema di do loop incistato , il più semplice possibile? Per
> esempio, in esercizio 8, ho ottenuto che in caso di cognome = vuoto,
> invece
> di uscire si riproponesse la finestra con richiesta del cognome ed il
> contatore a segno; sarebbe possibile usare un do incistato, secondo te?
> sotto metto l'esercizio così comè ora.
>
> Option explicit
> Dim nominativi
> Dim cognome, nome
> Dim contatore
> nominativi= Cint( inputbox( "numero nominativi da inserire"))
> contatore = 0
> Do
> contatore= contatore +1
> cognome= inputbox(" Cognome numero " & contatore & ":")
> If cognome = "" Then
> msgbox " Il cognome è obbligatorio "
> If cognome="" Then
> contatore= 0
> contatore= contatore +1
> cognome= inputbox (" Cognome numero " & contatore & ":")
> end if
> nome= inputbox("Nome numero " & contatore& ":" )
> If nome="" Then msgbox " Il nome è obbligatorio"
> If nome="" Then exit Do
> If contatore = nominativi Then exit do
> end if
> Loop
> Msgbox "Nominativo : "& nome &" " & cognome
>
19.04: Grazie alla cortesia ed alla disponibilità di Alessandro
Pannocchi,sotto trovate un esercizio commentato riga per riga...
Ora i commenti, dopo ogni riga o gruppo di righe.
Option Explicit
Dim Nominativi
Dim Contatore
Dim Tentativi
Dim Cognome, Nome
Queste sono le dichiarazioni, e fin qui tutto bene.
Nominativi = CInt(InputBox("Numero di nominativi da immettere:"))
Contatore = 0
Do
Ciclo esterno, che chiameremo primo ciclo, che serve ad inserire più di un
cognome, a seconda del numero che si è digitato prima.
Contatore = Contatore + 1
Questo conta i nnominativi inseriti e lo sai.
Tentativi = 1
Questa variabile conta invece i tentativi di inserimento del cognome, o
meglio le volte che non è stato inserito nulla.
Do
Ciclo interno, o secondo ciclo, che serve a rendere possibile la ripetizione
della richiesta di cognome, in caso non abbiamo inserito nulla.
Cognome = InputBox("Cognome " & Contatore & ":")
If Cognome = "" Then
Istruzione condizionale esterna, o prima condizione, in cui si esamina il
caso che non si sia inserito nulla.
If tentativi = 3 then
condizione interna alla prima, o seconda condizione, che farà prendere al
programma due strade diverse a seconda del numero di tentativi che abbiamo
già fatto: Se sono 3, allora
MsgBox "Programma Interrotto"
WScript.Quit
Si dà un messaggio di avvertimento dell'interruzione del programma e poi si
termina, con l'istruzione che ci ha suggerito fresca fresca guido.
Else
Riferito alla seconda condizione, quindi nel caso che i tentativi siano meno
di tre.
MsgBox "Il cognome è obbligatorio"
Tentativi = Tentativi + 1Si aggiunge 1 al conteggio dei tentativi.
End If
riferito alla seconda condizione o condizione interna
Else
riferito alla prima condizione, cioè nel caso che la variabile Cognome non
sia vuota.
Exit Do
Si esce dal ciclo interno, così da poter inserire il nome.
End If
Riferito alla prima condizione.
Loop
Istruzione loop relativa al secondo Do, cioè al ciclo interno, quello della
richiesta di cognome obbligatorio.
Nome = InputBox("Nome " & Contatore & ":")
If Contatore = Nominativi Then Exit Do
Loop
Questo loop si riferisce al primo Do, cioè a quello già previsto da guido
per permettere la ripetizione del programma cioè l'inserimento di più
nominativi in sequenza, fino al raggiungimento del numero stabilito.
MsgBox "Nominativo: " & Nome & " " & Cognome
Tutto qui.
Ho inserito il contatore dei tentativi a vuoto per dare al programma una via
d'uscita, perchè altrimenti si sarebbe persa la possibilità di avere una
uscita anticipata, come aveva previsto anche guido. Se però si sfrutta il
caso della variabile vuota per chiedere l'immissione obbligatoria del
cognome, non la si può più sfruttare per l'uscita, e allora sono ricorso al
trucco dell'uscita dopo 3 giri a vuoto.
Se vuoi, come esercizio, puoi fare lo stesso con il campo nome, magari senza
il bisogno del contatore dei tentativi e dell'uscita dal programma.
come hai visto ti ho fatto due cicli Do ... loop nidificati uno dentro
l'altro e anche due If anche essi nidificati l'uno dentro l'altro.
Resto a tua disposizione e ti saluto cordialmente.
Guido Ruggeri.
Messaggio originale:
modificato ma nisba.
Risposta:
E ti credo.
Hai messo un'istruzione CInt nella prima assegnazione a Tentativi.
Come vuoi allora che ti esca da quella assegnazione una stringa vuota?
ecco l'esercizio:
Option Explicit
Dim Tentativi
Dim Contatore
Dim Colore, ColoreVero
Dim Comparazione
Contatore = 0
Tentativi = Cint(InputBox("Inserisci il numero di tentativi da immettere"))
If Tentativi = "" Then WScript.Quit
Tentativi = Cint(Tentativi)
ColoreVero = "viola"
Do
Contatore = Contatore + 1
Colore = InputBox("Colore" & Contatore & ":")
If Colore = "" Then Exit Do
Comparazione = StrComp(Colore, ColoreVero, 1) = 0
If Comparazione = True Then Exit Do
If Contatore = Tentativi Then Exit Do
MsgBox "Il colore : " & colore & ", è errato! Riprova!"
Loop
If Comparazione Then
MsgBox "Il Colore: " & ColoreVero & ", è Giusto. Bravo"
Else
MsgBox "Il Colore : " & Colore & ", è errato. Il Colore Giusto è: " & ColoreVero
End If
***
Media voti esami.
Riccardo Sisti.
ì> Così per esercitarmi, ho fatto al volo un esercizio
per il
> calcolo della media di voti. Eccolo.
> option explicit
> dim nome
> dim es_eseguiti
> dim voto_esame
> dim totale
> dim contatore
> dim media
> msgbox "benvenuti in mediavoti"
> dim cognome
> nome = inputbox( "inserisci il tuo nome: ")
> cognome = inputbox("inserisci il tuo cognome: ")
> msgbox "benvenuto " & nome & " " & cognome
> es_eseguiti = inputbox ("quanti esami hai eseguito fino
ad
> ora? ") contatore = cint(0)
>
> media = cint(0)
> voto_esame = cint(0)
> totale = cint(0)
> do
> if cint(contatore) = cint(es_eseguiti) then
> exit do
> else
> voto_esame = inputbox("inserisci voto esame: ")
> contatore = contatore + 1
> totale = totale + voto_esame
>
>
>
> end if
> loop
> media = totale / contatore
> msgbox " la tua media è: " & media
r.
Guido Ruggeri.
Certo, abbiamo detto che le funzioni di conversione a
numero, nel dubbio se metterle o no, conviene metterle per
non sbagliare.
Tuttavia, quando si tratta di inizializzare delle variabili
a zero, è uno dei casi in cui le funzioni di conversione
non servono.
Si tratta cioè della assegnazione del valore 0 a delle
variabili: 0 è indubbiamente già un numero, e quindi non
c'è bisogno di convertitlo.
Quindi è sufficiente scrivere così:
contatore = 0
media = 0
voto_esame = 0
totale = 0
semmai, una funzione di conversione ci sarebbe voluta
nell'assegnazione a voto_esame interna al ciclo, cioè
nella riga:
voto_esame = inputbox("inserisci voto esame: ")
Qui, effettivamente, dato che si tratta del valore
restituito da InputBox, cioè di una stringa, conviene
metterci la funzione per convertirlo a numero.
Così:
voto_esame = CInt(InputBox("inserisci voto esame: "))