Salta al contenuto principale

Corso visual basic script/Variabili con indice-prima parte

Guido Ruggeri su winguidotecnica, 28\01\2010, h. 11.27.

Oggi parliamo di variabili con indice.
Un concetto a cui si era avvicinato Alessandro Pannocchi
quando in qualcuno dei suoi esercizi, ricordate? aveva
utilizzato diverse variabili, mettendo un numero nel loro
nome per distinguerle.
Ad esempio, potremmo definire così le variabili che ci
servono per l'esercizio 8:

Ed ora, un po' di pubblicità

:

Dim Cognome1, Nome1
Dim Cognome2, Nome2
Dim Cognome3, Nome3
eccetera, fino ad arrivare al numero che ci serve.

Il problema però è: fino a dove possiamo arrivare? Se il
nostro programma fosse destinato all'immissione di centinaia
o migliaia nominativi, non possiamo certo uscire fuori di
testa per gestire in questo modo migliaia di variabili.
Perché poi dovremmo, all'interno del ciclo, mettere
altrettante istruzioni condizionali per gestirle, appunto
come aveva fatto Alessandro.
Immaginiamo di metterci a scrivere qualcosa del genere,
all'interno del ciclo dell'esercizio 8:

If Contatore = 1 Then
Cognome1 = InputBox("Cognome " & Contatore & ":")
Nome1 = InputBox("Nome " & Contatore & ":")
ElseIf Contatore = 2 Then
Cognome2 = InputBox("Cognome " & Contatore & ":")
Nome2 = InputBox("Nome " & Contatore & ":")
ElseIf Contatore = 3 Then

e così via, finché, dopo aver scritto altre 1326
istruzioni analoghe, arriviamo a:

ElseIf Contatore = 1329 Then
Cognome1329 = InputBox("Cognome " & Contatore & ":")
Nome1329 = InputBox("Nome " & Contatore & ":")
ElseIf Contatore 1330 Then
Cognome1330 = InputBox("Cognome " & Contatore & ":")
Nome1330 = InputBox("Nome " & Contatore & ":")
ElseIf Contatore 1331 Then

dopo averne scritte altre 5472 ed essere arrivati a ElseIf
Contatore = 6803, ormai stanchi morti dallo scrivere e con
le dita doloranti, ci sta cominciando a venire il vago
sospetto che questa non sia la strada giusta, e che forse il
linguaggio potrebbe aver previsto qualcosa di più adatto.
E adesso scopriremo che un semplice paio di parentesi, una
aperta e una chiusa, ci risolvono il problema: tutto si
può ridurre ad una sola istruzione, che vale per tutti i
casi possibili.
Accidenti, direte voi, e non potevi dircelo prima, anziché
farci stare per ore ed ore a scrivere 6803 condizioni?
Si, certo che potevo dirvelo, ma, sapete com'è, le
esigenze della didattica impongono di seguire un certo filo
conduttore che...
No, dai, non ve la prendete così. Adesso chiariamo tutto e
vedrete che ne sarà valsa la pena.
Allora, finora abbiamo sempre parlato di variabili semplici,
ora cominciamo a parlare di variabili con indice.
Normalmente, questo tipo di variabile viene chiamato:
matrice, oppure: vettore. In inglese: array.
Io preferisco la parola matrice. Mah, sarà che vado matto
per i bucatini all'amatriciana.
Una variabile semplice, ormai, la conosciamo: contiene un
valore. Quel valore può cambiare durante l'esecuzione del
programma, ma è sempre unico.
La variabile Cognome, per capirci, può valere "Ruggeri",
poi, in un altro momento, può valere "De Angelis", ma
quando vale "Ruggeri" non può valere anche "De Angelis",
mentre quando vale "De Angelis" non può valere anche
"Ruggeri".
Le matrici invece sono variabili che possono contenere
contemporaneamente più valori.
Si, è proprio come ho detto: Se Cognome fosse stata
definita come matrice, anziché come variabile semplice,
allora potrebbe contenere il valore "Ruggeri", ma,
contemporaneamente, anche il valore "De Angelis".
Soprendente, vero? eppure è così. Una sola variabile per
tanti valori diversi.
Ogni valore è identificato da un indice. Così ci sarà
il valore di indice 1, quello di indice 2, e così via.
Allora, se decidiamo che la variabile Cognome è una
matrice, ecco che possiamo dire: l'elemento di indice 1 vale
"Ruggeri", mentre, nello stesso tempo, l'elemento di indice
2 vale "De Angelis".
Ma possiamo arrivare anche a decine, centinaia, migliaia di
elementi.
Come facciamo a dire al nostro interprete che una variabile
deve essere considerata una matrice, anziché una variabile
semplice?
Intanto già possiamo preavvertirlo nell'istruzione Dim,
quella che di solito mettiamo all'inizio del programma.
Quella che è facoltativa, ma che diventa obbligatoria se
mettiamo la notazione Option Explicit.
Ah, prima di andare avanti devo precisare che le matrici si
distinguono in matrici a dimensione fissa e matrici
dinamiche. Noi adesso stiamo parlando di matrici dinamiche,
quelle a dimensione fissa lasciamole da parte. E poi io non
le uso quasi mai.
Allora scriviamo così:

Dim Cognome()

aggiungendo al nome della variabile una parentesi tonda
aperta, seguita da una chiusa.
Questa è la convenzione per dire al nostro interprete:
guarda che in questo programma la variabile Cognome sarà
una matrice, e non una variabile semplice.
Più esattamente, sarà una matrice dinamica, dato che tra
le due parentesi non ci ho scritto niente.
Facciamo lo stesso con la matrice nome:

Dim Nome()

Ma il momento importante sarà quello in cui diremo
all'interprete: guarda che la matrice Cognome, come anche la
matrice Nome, deve poter contenere un certo numero di
elementi.
Fino ad allora, l'interprete sa che Cognome e Nome devono
essere delle matrici dinamiche, ma ancora non le potrebbe
usare, perché non gli abbiamo detto quanti elementi
vogliamo che ci stiano.
E qui ci serve un'istruzione simile a Dim, che è: ReDim.
ReDim ha qui il significato di dire all'interprete: voglio
che tu ridimensioni la mia matrice, in modo che possa
contenere il numero di elementi che adesso ti dico.
Sempre con riferimento all'esercizio 8, il numero di
elementi è dato dalla variabile Nominativi.
Perciò dovremo scrivere così:

Nominativi = CInt(InputBox("Numero di nominativi da
immettere:"))
ReDim Cognome(Nominativi)
ReDim Nome(Nominativi)

Da notare l'uso delle parentesi tonde negli argomenti delle
istruzioni ReDim.
E le parentesi ci serviranno ogni volta che vorremo fare
riferimento agli elementi che costituiscono la nostra
matrice.
Cosa ci va dentro le parentesi tonde? Ci va l'indice
dell'elemento a cui ci riferiamo.
Per esempio:

Cognome(3)

rappresenta l'elemento di indice 3 della nostra matrice.
Quindi noi possiamo riferirci a quell'elemento come se fosse
una variabile, e quindi usarlo in istruzioni di
assegnazione, di calcolo, di confronto, o come argomenti di
chiamate a routine.
Potremmo, ad esempio, porre:

Cognome(1) = "Ruggeri"
Cognome(2) = "De Angelis"
Cognome(3) = "Pannocchi"

e così via.

Allora ecco che il nostro esercizio 8 lo possiamo riscrivere
in questo modo:

Option Explicit
Dim Nominativi
Dim Contatore
Dim Cognome()
Dim Nome()
Nominativi = CInt(InputBox("Numero di nominativi da
immettere:"))
ReDim Cognome(Nominativi)
ReDim Nome(Nominativi)
Contatore = 0
Do
Contatore = Contatore + 1
If Contatore = 1 Then
Cognome(1) = InputBox("Cognome " & Contatore & ":")
Nome(1) = InputBox("Nome " & Contatore & ":")
ElseIf Contatore = 2 Then
Cognome(2) = InputBox("Cognome " & Contatore & ":")
Nome(3) = InputBox("Nome " & Contatore & ":")
ElseIf Contatore = 3 Then
Cognome(3) = InputBox("Cognome " & Contatore & ":")
Nome(3) = InputBox("Nome " & Contatore & ":")

e così via con tutte le istruzioni analoghe, fino al
numero massimo di nominativi previsto

End If
If Contatore = Nominativi Then Exit Do
Loop

Uhm, però ho come l'impressione che così non stiamo
risolvendo nulla.
Alla fin fine, ci stiamo infilando nella stessa situazione
di prima. Cioè che se dovessimo gestire decine, centinaia
o migliaia di nominativi, dovremmo scrivere altrettante
decine, centinaia o migliaia di istruzioni.
E allora, cos'è cambiato? Niente, direi. Stiamo come
prima.
Chi era che diceva che si poteva sistemare tutto con
un'unica istruzione che valeva per tutti i nominativi?
Ah, già, ero io che lo dicevo.
E allora, o stavo raccontando baggianate, oppure questo
nostro benedetto esercizio 8 lo dobbiamo sistemare in un
altro modo.
Insomma, come deve diventare questo esercizio 8? Provateci
un po' voi a dirlo, dato che io invece qui mi sto
incasinando sempre di più, anziché semplificare le cose.

Esercizio sul controllo della data modificato.
Alessandro Ricotta.
Cari amici,
vi ripropongo l'esercizio sul calcolo del giorno della settimana
modificato alla luce di quanto di nuovo abbiamo appreso grazie a Guido.
Noterete come tutti quei blocchi If su una riga siano stati sostituiti
da istruzioni di assegnazioni di 12 valori diversi a un'unica matrice
"Giorni()".
Ho provato a eseguire l'esercizio e pare funzionare come io desidero.
Naturalmente rimango in attesa di eventuali critiche.
Ecco l'esercizio commentato in tutte le sue parti:

'Esercizio per calcolare il giorno della settimana a partire da una data
immessa dall'utente
'Tutte le variabili vanno dichiarate
Option Explicit
'Dichiaro la costante Vuota come stringa che non contiene alcun
carattere che mi servirà nel caso l'utente non immetta alcun valore
Const Vuota = ""
'Dichiaro le variabili che dovranno contenere le informazioni immesse
dall'utente
Dim Data, Anno, Mese, Giorno, Giorni(), Bisestile, DataValida
'Notate come "Giorni" sia una matrice che dovrà contenere il numero di
giorni corrispondenti per ogni mese.
'Ridimensiono la matrice Giorni a 12
ReDim Giorni(12)
'Il programma, prima di calcolare il giorno della settimana, verifica
che l'utente abbia immesso una data valida, in caso contrario si
interrompe con un messaggio d'errore. A tale scopo verranno utilizzate
le variabili Bisestile e DataValida che verranno impostate a 0 o a 1 a
seconda se l'anno immesso è bisestile e se la data immessa risulta valida.
'Inizializzo a 0 le variabili DataValida e Bisestile.
Bisestile = 0
DataValida = 0
'Inizia la richiesta all'utente di immissione delle informazioni che
verranno memorizzate nelle variabili Anno, Mese e Giorno.
'Durante questo passaggio l'utente deve riempire tutti i campi, perchè
il programma controllerà che non siano stringhe vuote, altrimenti
l'esecuzione verrà interrotta.
'Se l'utente ha immesso le informazioni correttamente, le variabili
stringa verranno convertite in numeri interi con la funzione CInt.
Giorno = InputBox("Digitare il giorno:")
If Giorno = Vuota Then WScript.Quit
Giorno = CInt(Giorno)
Mese = InputBox("Inserire il mese:")
If Mese = Vuota Then WScript.Quit
Mese = CInt(Mese)
Anno = InputBox("Inserire l'anno:")
If Anno = Vuota Then WScript.Quit
Anno = CInt(Anno)
'La data immessa, valida o no (perchè il controllo verrà eseguito
successivamente) viene memorizzata in una stringa che servirà per la
visualizzazione del messaggio finale.
'Infatti, il contenuto della variabile Anno verrà modificato nel corso
del programma.
Data = Giorno & "-" & Mese & "-" & Anno
'Procedo con la convalida della data. Se tutto è OK la variabile
DataValida verrà impostata a 1.
'Per prima cosa verifico che l'utente nel campo dell'anno non abbia
inserito numeri negativi, altrimenti il programma visualizzerà un
messaggio d'errore, restando la variabile DataValida impostata a 0
'Inizio del primo blocco If
If Anno > 0 Then
'Si controlla se l'anno immesso è bisestile. In caso affermativo la
variabile Bisestile verrà impostata a 1.
'Ricordo che, secondo il calendario Gregoriano, il tempo è scandito in
cicli di 400 anni ciascuno.
'Per cui, per l'elaborazione della data, per semplificarci la vita,
consideriamo solo gli anni a partire dall'inizio dell'ultimo ciclo. Se
per esempio l'anno in questione è il 2010, dovremo considerare solo 10,
perchè l'ultimo ciclo inizia nel 2000.
'Effettuo la divisione modale di "Anno" per 400 mantenendo nella
variabile solo il resto della divisione.
Anno = Anno Mod 400
'Inizio del secondo blocco If all'interno del primo
'Se il resto della divisione di "Anno" per 100 è maggiore di 0
If (Anno Mod 100) Then
'Secondo blocco If, su una riga, all'interno del primo
'E se il resto della divisione di "Anno" per 4 è uguale a 0
'imposta la variabile Bisestile a 1
If (Anno Mod 4) = 0 then Bisestile = 1
'Oppure
'Se siamo all'inizio del ciclo, ovvero se l'inizio del secolo è
divisibile per 400 (se "Anno" è uguale a 0
'Seconda condizione del primo blocco If
ElseIf Anno = 0 then Bisestile = 1
'Anche in questo caso imposta la variabile Bisestile a 1
End If
'A questo punto viene utilizzata la matrice Giorni, i cui valori
verranno impostati diversamente a seconda del numero del mese.
Naturalmente al 28 del mese di febbraio viene sommato "Bisestile" che,
se è uno, da 29
Giorni(1) = 31
Giorni(2) = 28 + Bisestile
Giorni(3) = 31
Giorni(4) = 30
Giorni(5) = 31
Giorni(6) = 30
Giorni(7) = 31
Giorni(8) = 31
Giorni(9) = 30
Giorni(10) = 31
Giorni(11) = 30
Giorni(12) = 31
'Inizio di un altro blocco If all'interno del primo
'La variabile DataValida verrà impostata a 1 solo se
'il giorno immesso è minore o uguale a Giorni
If Giorno <= Giorni(Mese) Then
'E se il giorno immesso è maggiore o uguale a 1
'Istruzione If su una riga, all'interno della precedente
If Giorno >= 1 Then DataValida = 1
'Fine secondo blocco If all'interno del primo
End If
'Fine del primo blocco If
End If
'Inizio blocco If
'Se la variabile DataValida è impostata a 0 il programma si interrompe.
If DataValida = 0 Then
MSGBox "Attenzione: la data immessa non è valida"
WScript.Quit
'Fine blocco If
End If
'Adesso bisogna calcolare il giorno della settimana.
'Allora:
'Al contenuto della variabile Giorno immesso dall'utente bisogna sommare
prima di tutto il contenuto della variabile "Anno", l'anno dell'inizio
dell'ultimo ciclo.
'Al risultato ottenuto si somma il numero 1. Questo perchè l'anno 0 del
ciclo, contrariamente agli inizi degli altri secoli, è un anno bisestile.
'Al risultato precedente si dovrà aggiungere il numero di anni bisestili
dall'inizio del ciclo. Se per esempio l'anno è 2010, i bisestili saranno
2, il 2004 e il 2008.
'Per ottenere tale valore bisogna effettuare la divisione intera della
variabile "Anno" per 4, utilizzando la funzione Int che toglie la parte
decimale a un numero.
'Attenzione: abbiamo detto che solo gli inizi del secolo divisibili per
400 sono bisestili. Quindi, ai risultati precedenti si dovrà sottrare il
numero intero risultante dalla divisione di "Anno" per 100.
'Esempio: l'anno 2100, se dividiamo il resto della divisione per 400 per
4 e ci sommiamo 1 dovrebbe dare 26, ma siccoma l'anno b2100 non è
bisestile, bisogna sottrarre 1, perchè 100 diviso 100 è uguale a 1.
'Adesso, al risultato ottenuto, si somma un numero fisso che cambia in
base al mese. Per esempio, se il mese è gennaio, il numero sarà 6.
'Iniziano altre 12 istruzioni di assegnazione che sostituiscono i valori
precedentemente memorizzati nei 12 elementi della matrice Giorni, con i
numeri fissi sopra menzionati
Giorni(1) = 6
Giorni(2) = 2
Giorni(3) = 2
Giorni(4) = 5
Giorni(5) = 0
Giorni(6) = 3
Giorni(7) = 5
Giorni(8) = 1
Giorni(9) = 4
Giorni(10) = 6
Giorni(11) = 2
Giorni(12) = 4
Giorno = Anno + 1 + Int(Anno / 4) - Int(Anno / 100) + Giorni(Mese) + Giorno
'Inizio di due blocchi If, uno dentro l'altro
'Nel mandare in esecuzione il programma, quando scrivevo 1 1 2000,
01-01-2000, veniva fuori "Domenica" mentre sappiamo che quel giorno
cadeva di sabato.
'E allora, se l'anno è bisestile e se il mese è inferiore a marzo,
bisogna sottrarre alla variabile "Giorno" 1.
If Bisestile Then
If Mese < 3 Then Giorno = Giorno - 1
End If
'A questo punto faccio la divisione modale di "Giorno", perchè quello
che ci interessa per calcolare il giorno della settimana è il resto
della divisione per 7.
Giorno = Giorno Mod 7
'Viene fuori un risultato che va interpretato nel seguente modo:
'I giorni della settimana iniziano da sabato, che corrisponde al numero
0, l'1 sarà domenica, 2 sarà lunedì, e così via.
'Inizia quindi un blocco If con istruzioni ElseIf al suo interno che
valuta il contenuto della variabile Giorno e lo modifica sostituendolo
con il valore stringa del giorno della settimana corrispondente
If Giorno = 0 Then
Giorno = "Sabato"
Elseif Giorno = 1 Then Giorno = "Domenica"
Elseif Giorno = 2 Then Giorno = "Lunedì"
Elseif Giorno = 3 Then Giorno = "Martedì"
Elseif Giorno = 4 Then Giorno = "Mercoledì"
Elseif Giorno = 5 Then Giorno = "Giovedì"
Elseif Giorno = 6 Then Giorno = "Venerdì"
'Fine del blocco If
End If
'Finalmente viene visualizzato il risultato.
MSGBox "Il " & Data & " cade di " & Giorno

Guido Ruggeri.

Questo potrebbe essere uno di quei casi in cui possiamo fare
uso di matrici a dimensione fissa.
Non lo abbiamo detto, ma il concetto è ovvio. Sappiamo
già, a priori, che ci serve una matrice di 12 elementi,
uno per ogni mese dell'anno.
Sappiamo che saranno 12, e che non ci sarà nessuna ragione
per cui, durante l'esecuzione del programma, debbano
servircene di più o di meno.
Perciò possiamo, fin dall'inizio, cioè fin
dall'istruzione Dim, dichiarare che la matrice Giorni deve
avere 12 elementi.
Così:

Dim Giorni(12)

In questo modo, non ci serve più la successiva istruzione
ReDim Giorni(12).
Anzi, se ce la lasciamo, otteniamo un messaggio di errore:
"Questa matrice è fissa o temporaneamente bloccata".
Infatti, definendo la dimensione della matrice direttamente
nella dichiarazione con Dim, quella dimensione rimane fissa
per tutto il programma, e non potremo più cambiarla usando
l'istruzione ReDim.
Ma, per un caso come questo, andrebbe bene, perché
sappiamo già che ci servono 12 elementi e che 12
resteranno.

Alessandro Pannocchi.

sono tornato a casa ed ho visto un sacco di novità, mi fa piacere davvero che si vada avanti così bene
Ho modificato in fretta una delle versioni dell'esercizio 8 che avevo sperimentato e la invio, poi si passerà ai commenti.

' Immette dei nominativi in un vettore e poi li visualizza.
Option Explicit
Const spaz = " ",
Dim Nominativi
Dim Frase
Dim Generalita()
Dim Contatore
Dim C
Dim Cognome, Nome
Dim Tentativi

Tentativi = 0
Do
Nominativi = InputBox("Numero di nominativi da immettere:")
If Nominativi = "" Then
If Tentativi = 1 Then
MsgBox "Programma interrotto dall'utente."
WScript.Quit
Else
Msgbox "Si prega di inserire un numero o il programma verrà terminato."
Tentativi = Tentativi + 1
End If
Else
Exit Do
End If
loop

Nominativi = CInt(Nominativi)
ReDim Generalita(Nominativi)

Contatore = 0
Tentativi = 0
Do
C =Contatore
Contatore = Contatore + 1
Do
Cognome = InputBox("Cognome " & Contatore & ":")
If Cognome = "" Then
If tentativi = 1 Then
MsgBox "Programma interrotto dall'utente."
WScript.Quit
Else
MsgBox "Il cognome è obbligatorio. Inserirlo o il programma verrà terminato"
Tentativi = tentativi + 1
End If
Else
Tentativi = 0
Exit Do
End If
Loop

Do
Nome = InputBox("Nome " & Contatore & ":")
If Nome = "" Then
MsgBox "Il nome è obbligatorio."
Else
Exit Do
End If
Loop

Generalita(C) = Nome & Spaz & cognome
If Contatore = Nominativi Then Exit Do
Loop

MsgBox "Ecco i nominativi che hai inserito:"

contatore = 0
Do
C = Contatore
Contatore = Contatore + 1
MsgBox "Nominativo " & Contatore & ": " & Generalita(C)
If Contatore = Nominativi Then exit do
loop

Frase = "Programma terminato. Arrivederci!"

Ecco qua, questo lo avevo fatto anche per vedere come si poteva lavorare sui cicli e per questo avevo semplificato il gioco delle variabili, riunendo il nome e il cognome sotto una unica variabile chiamata Generalita, perchè le accentate non stanno nei nomi di variabile. così credo che sia anche più semplice capire la matrice, Perchè ce n'è una sola.
Magari approfitto per chiedere a guido una cosa: Se avessi scritto:Dim generalita(1000)
avrei dichhiarato una matrice statica, con l'indice minimo 0 e massimo 1000, cioè non avrei potuto inserire più di 1001 elementi.
Quanti invece mi permette di inserirne una matrice dinamica?
_Esercizio quiz
Alessandro Pannocchi.

Ripropongo di seguito l'esercizio che avevo inviato tempo fa, modificato con i cicli Do ... Loop e con le variabili con indice.
Questo perchè si possa notare la grande semplificazione che è stata raggiunta con l'introduzione di questi accorgimenti.
In pratica con una sola routine è stato possibile fare tutte le dieci domande invece che ripetere ogni volta le stesse istruzioni per 10 volte. non è ancora il concetto di routine vera e propria, ma certo ci stiamo avvicinando molto.
Ecco il testo dell'esercizio, senza interruzioni.

Option Explicit
const spaz = " ", Vuota = "", Max = 10
Dim Domanda()
Dim risp
Dim giusta()
Dim Sbaglio
Dim Richiesta
Dim Binario
Dim Testo
Dim Frase
Dim Quiz
Dim Bene
Dim Accapo
Accapo = VbCr

ReDim Domanda(Max)
ReDim giusta(Max)

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

' Domande e relative soluzioni.
Domanda(1) = "Qual è il cognome del primo cosmonauta ?"
Giusta(1) = "Gagarin"
Domanda(2) = "Chi ha scritto Il libro ""Le mie prigioni""?"
Giusta(2) = "Pellico"
Domanda(3) = "In che anno fu scoperta l'America?"
Giusta(3) = "1492"
Domanda(4) = "Chi bruciò le navi dei romani con degli specchi?"
Giusta(4) = "Archimede"
Domanda(5) = "Chi disse: ""Il dado è tratto""?"
Giusta(5) = "Cesare"
Domanda(6) = "Come si chiamava il primo presidente della Repubblica italiana?"
giusta(6) = "De Nicola"
Domanda(7) = "Come si chiama l'alfabeto composto di punti e linee?"
Giusta(7) = "Morse"
Domanda(8) = "Chi è l'autore della musica de ""Il Nabucco""?"
Giusta(8) = "Verdi"
Domanda(9) = "Con quale nome è meglio conosciuto vladimir Ilic Ulianov?"
Giusta(9) = "Lenin"
Domanda(10) = "Su quale città fu sganciata la prima bomba atomica?"
Giusta(10) = "Hiroscima"

Do

Do
Richiesta = "Domanda numero " & Quiz & "." & Accapo & Domanda(Quiz)
Risp = InputBox(Richiesta)
if Risp = Vuota then
MsgBox "Programma interrotto dall'utente."
WScript.Quit
End If
Testo = StrComp(risp, giusta(Quiz), 1) = 0
Binario = StrComp(Risp, giusta(Quiz)) = 0
If Testo Then
Bene = Bene + 1
Exit Do
else
Sbaglio = Sbaglio + 1
If Sbaglio <2 then
msgbox "Risposta errata. Riprova."
Else
Exit Do
End If
end If
Loop

If Binario Then
Frase = "Bravo, hai risposto esattamente."
ElseIf Testo Then
Frase = "La risposta è esatta, ma attento alle maiuscole!"
ElseIf Sbaglio = 2 then
frase = "Sarà meglio che tu vada ad informarti." & Accapo & "La risposta giusta era: "& Giusta(Quiz)
Sbaglio = 0
End If
MsgBox frase

Quiz = Quiz + 1
If Quiz > Max Then Exit Do
Loop

' Statistiche
If Bene = Max Then
Frase = "sei un campione! Le hai azzeccate tutte!"
ElseIf Bene = 0 Then
Frase = "Sei un vero asino! Non ne hai azzeccata una!"
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

Fine del listato sorgente.
Ora ecco di nuovo il testo, con qualche commento.

Option Explicit
const spaz = " ", Vuota = "", Max = 10
Dim Domanda()
Dim risp
Dim giusta()
Dim Sbaglio
Dim Richiesta
Dim Binario
Dim Testo
Dim Frase
Dim Quiz
Dim Bene
Dim Accapo
Accapo = VbCr

' questa è la solita dichiarazione delle costanti e delle variabili.

ReDim Domanda(Max)
ReDim giusta(Max)
' Si impostano le due matrici come dinamiche.

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
' Si imposta il contatore delle domande ad 1.
' Domande e relative soluzioni.
' che vengono immesse nelle due matrici.
Domanda(1) = "Qual è il cognome del primo cosmonauta ?"
Giusta(1) = "Gagarin"
Domanda(2) = "Chi ha scritto Il libro ""Le mie prigioni""?"
Giusta(2) = "Pellico"
Domanda(3) = "In che anno fu scoperta l'America?"
Giusta(3) = "1492"
Domanda(4) = "Chi bruciò le navi dei romani con degli specchi?"
Giusta(4) = "Archimede"
Domanda(5) = "Chi disse: ""Il dado è tratto""?"
Giusta(5) = "Cesare"
Domanda(6) = "Come si chiamava il primo presidente della Repubblica italiana?"
giusta(6) = "De Nicola"
Domanda(7) = "Come si chiama l'alfabeto composto di punti e linee?"
Giusta(7) = "Morse"
Domanda(8) = "Chi è l'autore della musica de ""Il Nabucco""?"
Giusta(8) = "Verdi"
Domanda(9) = "Con quale nome è meglio conosciuto vladimir Ilic Ulianov?"
Giusta(9) = "Lenin"
Domanda(10) = "Su quale città fu sganciata la prima bomba atomica?"
Giusta(10) = "Hiroscima"

Do
' Ciclo principale, che si ripete ad ogni quiz

Do
' Ciclo secondario, che rende possibile la ripetizione della domanda in caso di errore.

Richiesta = "Domanda numero " & Quiz & "." & Accapo & Domanda(Quiz)
Risp = InputBox(Richiesta)
' si assegna alla variabile Risp la stringa digitata in risposta alla domanda.

if Risp = Vuota then
MsgBox "Programma interrotto dall'utente."
WScript.Quit
End If
' Se non viene digitato nulla, si termina il programma dopo apposito messaggio.

Testo = StrComp(risp, giusta(Quiz), 1) = 0
' si fa il confronto fra la soluzione e la risposta, in modo testo.
Binario = StrComp(Risp, giusta(Quiz)) = 0
' si fa il medesimo confronto, ma in modo binario, cioè esatto, tenendo conto delle maiuscole e minuscole.

If Testo Then
Bene = Bene + 1
Exit Do
' se il confronto testuale è riuscito, vuol dire che la risposta è comunque esatta e si esce dal ciclo interno.
else
Sbaglio = Sbaglio + 1
' altrimenti si incrementa di uno la variabile Sbaglio.
If Sbaglio <2 then
' e, fino a che la variabile è minore di 2, si dà la possibilità di riprovare.
msgbox "Risposta errata. Riprova."
Else
Exit Do
' altrimenti si esce conunque dal ciclo interno.
End If
end If
Loop

' ora si traggono le conclusioni.
If Binario Then
Frase = "Bravo, hai risposto esattamente."
' se il confronto binario è riuscito, vuol dire che la risposta è non solo esatta, ma si sono rispettate pure le maiuscole.
ElseIf Testo Then
Frase = "La risposta è esatta, ma attento alle maiuscole!"
' se invece è riuscito solo il confronto testuale, la risposta è esatta, ma non sono state rispettate le maiuscole.
ElseIf Sbaglio = 2 then
frase = "Sarà meglio che tu vada ad informarti." & Accapo & "La risposta giusta era: "& Giusta(Quiz)
Sbaglio = 0
End If' Se si è sbagliato per due volte,, viene fatto notare e si fornisce la risposta giusta.
MsgBox frase

Quiz = Quiz + 1
If Quiz > Max Then Exit Do
' la domanda è esaurita e si passa alla prossima, aumentando di uno il contatore.
' se il contatore ha raggiunto il numero massimo di domande, si esce anche da questo ciclo.
Loop

' Statistiche
If Bene = Max Then
Frase = "sei un campione! Le hai azzeccate tutte!"
ElseIf Bene = 0 Then
Frase = "Sei un vero asino! Non ne hai azzeccata una!"
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
' qui si fanno le statistiche delle risposte giuste e sbagliate, e le istruzioni mi sembrano abbastanza chiare.

ho scelto questo esercizio, perchè credo sia un buon esempio per l'impiego delle variabili con indice, senza essere troppo complesso, ma sono a disposizione per i chiarimenti.
Esercizio sui numeri primi.

ho rimaneggiato il mio esercizio sui numeri primi, per due ragioni:
credo sia un buon impiego delle matrici dinamiche perchè il numero dei fattori non si conosce e si devono ridimensionare ogni volta che si aggiunge un nuovo fattore.
tramite una matrice statica ho cercato, seppure in modo rudimentale, di avere una lettura esatta della potenza, ovviamente buona per noi che usiamo la sintesi ma pessima per chi vede il programma con gli occhi.
Forse sapendo di più di quello che sappiamo ora, si potrebbe mandare a video una scrittura corretta e alla sintesi la lettura corretta, ma non ne sono sicuro e, comunque, sono cose al di là da venire, se mai ci arriveremo......
Per ora accontentiamoci.
ecco il listato, senza tanti commenti. Dico solo che ho provveduto alla trasformazione dei cardinali in ordinali solo per i primi 40 numeri, perchè è una gran fatica ....

' Individuazione di numeri primi e, se non lo sono, scomposizione in fattori primi.
' con do ... loop e recita delle potenze in ordinale.
Option Explicit
Const Spaz = " "
dim Numero
' numero da esaminare.
Dim Num
' numero risultato delle divisioni successive.
Dim Primo
' Variabile booleana che, impostata a vero, significa che il numero dato è primo.
Dim Divisibile
' Var. booleana che risulta vera se si trova un divisore del numero.
dim x
' variabile per i contatori.
Dim Fattori()
' Matrice che contiene l'elenco dei fattori primi trovati.
Dim Expo()
' matrice con l'esponente dei fattori di pari indice.
Dim Esponente
Dim LEsponente(100)
' matrice che contiene i corrispondenti ordinali per la recita delle potenze.
Dim Base
Dim Accapo
Dim Preced
' contiene il fattore trovato nel ciclo precedente.
Dim NumFatt
' indice delle matrici Fattori ed Expo
dim Elevazione
Dim Frase
Accapo = VbCr

Numero = InputBox("Numero da esaminare: ")
If Numero = "" Then WScript.Quit
Num = CLng(Numero)
primo = True

X = 1
NumFatt = 0
Preced = 0
Do

X = x + 1
Divisibile = (num Mod x) = 0
If Divisibile then
Primo = False
If x >< Preced Then
NumFatt = NumFatt + 1
ReDim Fattori(NumFatt)
Fattori(NumFatt) = X
ReDim Expo(NumFatt)
Esponente = 1
Expo(NumFatt) = Esponente
Else
Esponente = Esponente + 1
Expo(numFatt) = Esponente
End if
Num = Num \ x
Preced = x
x = 1
end if
If x => Sqr(Num) Then Exit Do
Loop

If Num > 1 then
NumFatt = NumFatt + 1
ReDim Fattori(NumFatt)
Fattori(NumFatt) = Num
ReDim Expo(NumFatt)
Expo(NumFatt) = 1
End If

LEsponente(2) = "seconda"
LEsponente(3) = "terza"
LEsponente(4) = "quarta"
LEsponente(5) = "quinta"
LEsponente(6) = "sesta"
LEsponente(7) = "settima"
LEsponente(8) = "ottava"
LEsponente(9) = "nona"
LEsponente(10) = "decima"
LEsponente(11) = "undicesima"
LEsponente(12) = "dodicesima"
LEsponente(13) = "tredicesima"
LEsponente(14) = "quattordicesima"
LEsponente(15) = "quindicesima"
LEsponente(16) = "sedicesima"
LEsponente(17) = "diciassettesima"
LEsponente(18) = "diciottesima"
LEsponente(19) = "diciannovesima"
LEsponente(20) = "ventesima"
LEsponente(21) = "ventunesima"
LEsponente(22) = "ventiduesima"
LEsponente(23) = "ventitreesima"
LEsponente(24) = "ventiquattresima"
LEsponente(25) = "venticinquesima"
LEsponente(26) = "ventiseiesima"
LEsponente(27) = "ventisettesima"
LEsponente(28) = "ventottesima"
LEsponente(29) = "ventinovesima"
LEsponente(30) = "trentesima"
LEsponente(31) = "trentunesima"
LEsponente(32) = "trentaduesima"
LEsponente(33) = "trentatreesima"
LEsponente(34) = "trentaquattresima"
LEsponente(35) = "trentacinquesima"
LEsponente(36) = "trentaseiesima"
LEsponente(37) = "trentasettesima"
LEsponente(38) = "trentottesima"
LEsponente(39) = "trentanovesima"
LEsponente(40) = "quarantesima"

If Primo Then
Frase = "il numero " & Numero & " è un numero primo. "
Else
Frase = "il numero " & Numero & " non è un numero primo." & Accapo & "I suoi fattori primi sono: " & Accapo
x = 1
Do
Base = Fattori(x)
Esponente = Expo(x)
If Esponente = 1 then
Elevazione = Base
Else
elevazione = base & " Alla " & LEsponente(esponente)
End if
Frase = Frase & elevazione & "." & Accapo
x = x + 1
If x > NumFatt Then exit do
loop
End If

MsgBox Frase

d.

ma se do la matrice ad
una variabile esempio colore() come faccio poi a definire
le singole voci abinate all'indice? cioe'
se come indice accade che
colore(1) = "verde"
Colore(2) = "Rosa"
Colore(3) = "giallo"
nella risultanza come faccio a capire o ottenere
1 verde, 2 rosa, 3 giallo?

Risposta:
Guido Ruggeri.
Prova un po' così:

ReDim Colore(3)
Colore(1) = "verde"
Colore(2) = "rosa"
Colore(3) = "giallo"
Contatore = 0
Do
Contatore = Contatore + 1
MsgBox Contatore & " " & Colore(Contatore)
If Contatore = 3 Then Exit do
Loop

Su, che la dritta te l'ho data proprio grossa, stavolta.
E adesso mi fai finalmente sapere come deve essere sistemato
l'esercizio 8? Io ci sto sbattendo la testa, ma non ci
arrivo!

d.

Domanda:
Matrice1 = Array(1,2,3,4,5) essendo di tipo variant
dovfei poterci mettere dentro valori numerici
Risposta:
Guido Rutteri.
Ogni elemento della matrice è a sua volta un variant.
Quindi puoi anche mischiare nella stessa matrice elementi di
numero ed elementi di stringa.
Ad esempio, così:
Matrice1 =
Array(1,"Guido",2,"Donato",3,"Ruggeri",4,"Taddei",5)
Domanda:
matrice2 = Array(6,7,8,9,10)
Matrice3 = matrice1 & matrice2 ' si potrò fare?
tale che matrice3 contenga i primi dieci numeri
e più precisamente
matrice3(0) contenga 1 e matrice3(9) contenga 10.
Risposta:
Guido Ruggeri.
Questo no. O almeno, non in questo modo.
Tieni presente che VBScript è un ibrido tra uno stile di
programmazione vecchio stampo e un linguaggio di
programmazione ad oggetti.
La gestione delle matrici è ancora dei tipo vecchio
stampo, e non risponde ad una logica di programmazione ad
oggetti.
Perciò le operazioni con le stringhe si possono fare, ma
sempre con una certa cautela e ricorrendo a sistemi che in
realtà risalgono a prima dell'introduzione della
programmazione a oggetti, e che perciò adesso possono
apparirci ingombranti e farraginosi.
Comunque, dopo che avremo parlato di programmazione ad
oggetti, potremo costruircelo noi stessi un oggetto per la
gestione delle stringhe, che risulti più agile dei sistemi
che il linguaggio ci mette a disposizione.
Quell'oggetto potrà prevedere un metodo Add che ci
permetterà anche di fare quello che tu dici.
Ma per adesso, prima di arrivare a tanto, mi accontenterei
che qualcuno mi dicesse come deve essere sistemato
l'esercizio 8.

Daniele Maccaglia.

Allora ho ripreso il famoso esercizio sull'immissione dei nomi, usando le variabili indicizzate il problema stava nella visualizzazionwe del resoconto. Be ho provato a inserire un do loop dentro a un altro e tutto va liscio! Incollo quì sotto l'esercizio svolto
option explicit
dim nominativi
dim contatore
dim cognome()
dim nome()
dim resoconto
nominativi = cint(inputbox("Scrivi il numero di nominativi che desideri registrare"))
redim cognome(nominativi)
redim nome(nominativi)
contatore = 0
do
if nominativi = 0 then
msgbox "Non è possibile impostare il numero di nominativi da registrare a 0. Il programma verrà chiuso"
exit do
end if
contatore = contatore + 1
cognome(contatore) = inputbox("Scrivi il cognome" & " " & contatore)
if cognome(contatore) = "" then exit do
nome(contatore) = inputbox("Scrivi il nome" & " " & contatore)
if nome(contatore) = "" then exit do
if contatore=nominativi then
msgbox "Tutti i" & " " & nominativi & " nominativi sono stati inseriti. Premendo il tasto invio o cliccando su uno dei tasti di questa finestra verrà visualizzato il resoconto"
resoconto = 0
do
resoconto = resoconto + 1
msgbox "Resoconto dei nomi registrati: cognome e nome " & resoconto & " " & cognome(resoconto) & " " & nome(resoconto)
if resoconto = nominativi then exit do
loop
exit do
end if
loop

Daniele Maccaglia.

> Allora ho ripreso il famoso esercizio sull'immissione dei
> nomi, usando le variabili indicizzate il problema stava
> nella visualizzazionwe del resoconto. Be ho provato a
> inserire un do loop dentro a un altro e tutto va liscio!
> Incollo quì sotto l'esercizio svolto option explicit
> dim nominativi
> dim contatore
> dim cognome()
> dim nome()
> dim resoconto
> nominativi = cint(inputbox("Scrivi il numero di
nominativi
> che desideri registrare")) redim cognome(nominativi)
> redim nome(nominativi)
> contatore = 0
> do
> if nominativi = 0 then
> msgbox "Non è possibile impostare il numero di
nominativi
> da registrare a 0. Il programma verrà chiuso" exit do
> end if
> contatore = contatore + 1
> cognome(contatore) = inputbox("Scrivi il cognome" & " "
&
> contatore) if cognome(contatore) = "" then exit do
> nome(contatore) = inputbox("Scrivi il nome" & " " &
> contatore) if nome(contatore) = "" then exit do
> if contatore=nominativi then
> msgbox "Tutti i" & " " & nominativi & " nominativi sono
> stati inseriti. Premendo il tasto invio o cliccando su uno
> dei tasti di questa finestra verrà visualizzato il
> resoconto" resoconto = 0
> do
> resoconto = resoconto + 1
> msgbox "Resoconto dei nomi registrati: cognome e nome " &
> resoconto & " " & cognome(resoconto) & " " &
> nome(resoconto) if resoconto = nominativi then exit do
> loop
> exit do
> end if
> loop
r.
Guido Ruggeri.

Adesso ci siamo davvero.
Usando delle variabili come indici delle matrici, ogni
istruzione ripetitiva, se inserita all'interno di un ciclo,
può essere scritta una volta sola.
Era qui che volevo arrivare.
Così possiamo fare un doppio ciclo: uno per immettere i
dati, un altro per visualizzarli dopo averli immessi.
Il tutto senza mai dover ripetere istruzioni uguali,
indipendentemente da quale sia il numero di nominativi che
vogliamo immettere.
Adesso però dobbiamo perfezionare ancora l'esercizio. Ma
prima bisognerà imparare qualche altra cosa.
Dovremo dire qualcosa di più sui cicli.
E forse è anche arrivato il momento di dire qualcosa in
più sulla procedura MsgBox, che abbiamo usato fin
dall'inizio ma non abbiamo ancora approfondito.
Mi fate sapere se siete pronti?

Alessandro Pannocchi.
Esercizio 8 con modifica.

Ecco una modifica all'esercizio 8:
una volta inseriti dei nominativi, si può cercare all'interno di essi sia per nome che per cognome e poi verranno visualizzati i nominativi trovati.
Preciso che:
1. La funzione StrComp non è la più adatta per fare una ricerca in un data base, ma per ora non ne conosciamo altre.
2. un data base ha un senso solo se memorizzato in un file, fatto che non costringe a reimmettere i dati ogni volta che si lancia il programma, ma per ora non sappiamo come scrivere dei dati in un file, per cui, come dimostrazione, può andare anche così.
ecco qua il programma.

Option Explicit
Const spaz = " "
Dim Nominativi
Dim Cognome(), Nome()
Dim Scelta
Dim C
Dim CampoCognome
Dim CampoNome
Dim Trovato
Dim risultati()
Dim Dato
Trovato = 0
Nominativi = CInt(InputBox("Numero di nominativi da immettere:"))
ReDim Cognome(nominativi)
ReDim Nome(Nominativi)
ReDim risultati(Nominativi)
C = 0
Do
C = C + 1

Do

Cognome(C) = InputBox("Cognome " & C & ":")
If Cognome(C) = "" Then
MsgBox "Il cognome è obbligatorio"
Else
Exit Do
End If
Loop

Do
Nome(C) = InputBox("Nome " & C & ":")
If Nome(C) = "" then
MsgBox "Il nome è obbligatorio"
Else
Exit Do
End If
Loop

If C = Nominativi Then Exit Do
Loop

Do
Scelta = InputBox("ora prova a cercare fra i nominativi immessi." & VbCr & "Premi C per cercare nel campo cognome, N per il campo nome e solo invio per terminare.")

If Scelta >< "" then
CampoCognome = StrComp(Scelta, "c", 1) = 0
If CampoCognome Then Exit Do

CampoNome = StrComp(Scelta, "n", 1) = 0
If CampoNome then Exit Do

MsgBox "Scelta non valida. riprova."
Else
MsgBox "Programma Interrotto dall'utente."
WScript.Quit
End If
Loop

If CampoCognome Then
Dato = InputBox("Immetti il cognome: ")
Else
Dato = InputBox("Immetti il nome: ")
end If

C = 0
Trovato = 0
Do
C = C + 1
If CampoCognome Then
If StrComp(Dato, Cognome(c), 1) = 0 Then
Trovato = trovato + 1
Risultati(Trovato) = Cognome(C) & Spaz & Nome(c)
End If
End If

If CampoNome Then
If StrComp(Dato, Nome(c), 1) = 0 Then
Trovato = trovato + 1
Risultati(Trovato) = Nome(C) & Spaz & Cognome(c)
End If
End If

If C = nominativi Then Exit Do
Loop

If Trovato > 0 Then
c = 0
MsgBox "Nominativi Trovati: " & Trovato
Do
C = C + 1
MsgBox "Nominativo " & c & " di " & Trovato & ": " & risultati(C)
If c = trovato Then Exit Do
Loop
Else
MsgBox "Non ho trovato alcun nominativo. "
End If

Saluti.
Alessandro.
MsgBox "programma terminato. Arrivederci!"

Salvatore Vero.

> Ho provato a fare l'eserciziio con le variabili con indice
> , ma non funziona. Nella riga 16, mi dice indice non
> incluso nell'intervallo. Ho provato a trovare l'errore, ma
> niente. Ora ve lo incollo.

Option explicit
Dim Nominativi, Contatore, Nome(), Cognome(), Visualizza
Redim Nome(Nominativi)
Redim Cognome(Nominativi)
Nominativi = CInt(InputBox("scrivi il numero dei nomi che
vuoi inserire"))
Nominativi = CInt(Nominativi)
If Nominativi = "" then
MsgBox "Non è stato scritto nulla, quindi il programma si
chiude" & Nominativi
WScript.quit
End If
Nominativi = 0
Contatore = 0
Do
Nominativi = Nominativi + 1
Contatore = Contatore + 1
Nome(Contatore) = InputBox("Scrivi il nome: ") & Contatore
Cognome(Contatore) = InputBox("Scrivi il cognome: ") &
Contatore
If Contatore = Nominativi then
MsgBox "Ora puoi visualizzare tranquillamente i nominativi
inseriti." & " " & Tentativi
Visualizza = 0
Do
Visualizza = Visualizza + 1
MsgBox "Ecco i nomi e cognomi. Controllali se sono scritti
bene, e vedi se ci sono tutti. " & Visualizza & " " &
Nome(Visualizza) & " " & Cognome(Visualizza)
If Visualizza = Nominativi then Exit Do
Loop
Exit Do
End If
Loop

r.
Guido Ruggeri.

Ovvio che vada in errore.
Infatti hai ridimensionato le matrici Nome e Cognome sul
valore della variabile Nominativi, prima ancora che quella
variabile fosse assegnata.
Perciò l'hai fatto quando qualla variabile vale ancora 0.
Insomma, hai impostato 0 come limite massimo per le matrici,
e logicamente quando tenti di assegnare un valore a
Nome(Contatore), con Contatore che vale 1, provochi un
errore, perché 1 è già superiore al limite massimo per
le matrici, che è 0.
Ma attenzione, non è il solo errore in questo esercizio.
Ce ne è anche un altro, che ne vanifica il significato.
Anche dopo che avrai messo le istruzioni di
ridimensionamento al posto giusto, cioè dopo
l'assegnazione del valore scelto dall'utente alla variabile
Nominativi, anziché prima, ti accorgerai che riuscirai a
immettere un solo nominativo.
Ci sono poi anche altri errori secondari.
C'è un'istruzione Nominativi = CInt(Nominativi),
superflua perché il valore della variabile Nominativi era
già stato convertito a numero intero nell'istruzione
precedente-
C'è poi una condizione If Nominativi = "" then che non
potrà verificarsi mai, perché la variabile Nominativi
è già stata convertita a numero.
Insomma, è un po' tutto da rivedere.

Vincenzo Gramuglia.

in ritardo ma grazie al suggerimento di
> giovanni o riscritto parte del'esercizio con l'aggiunta di
> una riga, provato e funziona. Ecco l'esercizio:

option explicit
dim nominativi
dim date
dim contatore
dim cognome, nome
dim giorno, mese, anno
nominativi = cint(inputbox("numero dei nominativi da
immettere:"))
contatore = 0
do
contatore = contatore+1
Cognome = InputBox("Cognome " & Contatore & ":")
if cognome = " " then exit do
nome = inputbox("nome" & contatore &":")
if contatore = nominativi then exit do
loop
msgbox "nominativi" & nome & " " &cognome
date = (inputbox("numero delle date da immettere:"))
contatore =0
do
contatore =+1
giorno = (inputbox("giorno & contatore:"))
if giorno = "" then exit do
mese = (inputbox("mese &contatore:"))
if mese = ""then exit do
anno = inputbox("anno"&contatore&":")
if anno = "" then exit do
if contatore = date then exit do
loop
msgbox "date" & giorno & mese & " " &anno

r.
Guido Ruggeri.

E' pieno zeppo di errori e non funziona affatto.
Basti dire che il secondo ciclo continua all'infinito, e si
puà uscire solamente non immettendo nessun valore.
Inoltre i messaggi di richiesta che appaiono all'utente sono
sbagliati.
Dici che l'hai provato e funziona, ma evidentemente non ti
sei accorto di niente.
Sapersi rendere conto di quando un programma funziona o no,
è fondamentale!