Newsgroup: it.comp.appl.access
Titolo: Esempi di cicli e cicli nidificati, una bellissima Befana

Ciao a tutti e buon anno.
Ho acquistato vari manuali sulla programmazione di access, ma mi areno
sempre su questi benedetti cicli (For, Do, Do until, ecc) non riesco
proprio a capire a fondo la logica e la sintassi per le varianti che
possono assumere (es. Do while, ecc). Potreste farmi gentilmente
qualche esempio e spiegarmene il contenuto e magari spiegarmi la
logica dei cicli nidificati (spesso nei thread leggo ciclo interni,
ciclo esterno) sarebbe un bellissimo regalo per la Befana. Grazie
P.s.. credo ancora alla Befana


Tutto nasce da un'esigenza.......
Molto spesso, quando scriviamo del codice, vogliamo poter eseguire uno
stesso blocco di codice un certo numero di volte. In questi casi si
possono utilizzare le istruzioni di loop (ciclo).
In Visual Basic .Net abbiamo le seguenti sette istruzioni di ciclo:
While
Do While..Loop
Do Until...Loop
Do..Loop While
Do.. Loop Until
For..Next
For Each..Next
Esiste infine una serie di comandi Exit che consentono di uscire dai
cicli.
Exit While
Exit Do
Exit For
While
Consente di eseguire un’azione finché una condizione è vera
Sintassi
While (condizione)
  azioni
End While
Esempio
L’esempio in basso consente di trovare la più piccola potenza di 3
maggiore di 100, il ciclo while permette di effettuare il prodotto per
3 finchè il risultato non supera 100.
Module modPotenza
  Sub Main()
     Dim prodotto As Integer = 3
     While ( prodotto <= 100 )
        Console.writeLine("Prodotto: " & prodotto)
        Prodotto = prodotto*3
     End While
     Console.Writeline("La più piccola potenza di 3 maggiore di 100 è:
" & prodotto)
  End Sub
End Module
Do While..Loop
Funziona come il while, la sintassi è la seguente:
Do While (condizione)
  Azioni
Loop
Do Until...Loop
Le azioni del ciclo vengono eseguite finché la condizione resta falsa.
Rivediamo l’esempio
Module modPotenza
  Sub Main()
    Dim prodotto As Integer = 3
    Do Until ( prodotto > 100 )
      Console.writeLine("Prodotto: " & prodotto)
      Prodotto = prodotto*3
    Loop
    Console.Writeline("La più piccola potenza di 3 maggiore di 100 è:
" & prodotto)
  End Sub
End Module
Do..Loop While
La condizione viene verificata a fine ciclo, per cui siamo sicuri che
il ciclo sarà eseguito almeno una volta.
Module modDoWhile
  Sub Main()
     Dim contatore As Integer = 1
     Do
        Console.writeLine("Contatore: " & contatore)
        contatore += 1
     Loop While contatore <= 5
  End Sub
End Module
Do.. Loop Until
La condizione è verificata a fine ciclo, e le azioni del ciclo vengono
eseguite finché la condizione resta falsa.
Module modDoUntil
  Sub Main()
     Dim contatore As Integer = 1
     Do
        Console.writeLine("Contatore: " & contatore)
        contatore += 1
     Loop Until contatore <= 5
  End Sub
End Module
For..Next
Gestisce un’iterazione controllata da contatore. Usato quando
conosciamo a priori il numero di iterazioni che andremo ad eseguire
Sintassi
For contatore = valoreIniziale To valoreFinale [Step incremento]
  Azioni
Next
Esempio
Module modContare
  Sub Main()
     Dim i As Integer
     For i = 1 To 30 Step 3
        Console.WriteLine("i = " & i)
     Next
  End Sub
End Module
La parola chiave Step, può essere un intero (positivo o negativo) e
rappresenta il valore di incremento della variabile di controllo del
ciclo. Se omessa vale 1.
1 e 30 sono il valore iniziale e finale, e possono anche essere delle
espressioni.
For Each.. Next
Possiamo utilizzare la struttura For Each.. Next per iterare i valor
di una collection
La sintassi è la seguente
For Each variabile In Oggetto
  'istruzioni
Next
Vediamo un esempio in cui stampiamo l’elemento più grande di un array
Module modArray
  Sub Main()
    Dim massimo As Integer = 0
    Dim valore As Integer
    Dim myArray As Integer() = New Integer() {2, 4, 5, 6, 43, 432, 3,
94, 2}
    For Each valore In myArray
      If valore > massimo Then
      massimo = valore
    End If
    Next
    Console.WriteLine("Il valore più grande è: " & massimo)
  End Sub
End Module
Exit
I comandi
Exit While
Exit Do
Exit For
Provocano l’uscita immediata dai rispettivi cicli.
Esempio
Module modTestExit
  Sub Main()
    Dim output As String = ""
    Dim contatore As Integer
    For contatore = 1 To 10
      If contatore = 5 Then
        Exit For
      End If
    Next
    Console.WriteLine("Uscito da for: contatore = " & contatore)
    Do Until contatore > 10
      If contatore = 8 Then
        Exit Do
        Contatore += 1
    Loop
    Console.WriteLine("Uscito da do: contatore = " & contatore)
  End Sub
End Module
Controllare l'uscita da un ciclo
Abbiamo due modi per controllare l’uscita de dei cicli:
mediante contatore
tramite un valore detto "sentinella"
Un contatore è una variabile che viene incrementate ad ogni iterazione
e che quando raggiunge un determinato valore provoca l’uscita dal
ciclo.
Un valore sentinella è una variabile, che serve da controllo per la
terminazione del ciclo. Viene utilizzata quando non si conosce a
priori il numero di iterazione che si dovranno effettuare.
Vediamo due esempi: nel primo calcoliamo la media di 5 numeri
inseriti, e controlliamo l’iterazione mediante un contatore; nel
secondo invece calcoliamo la media di un numero variabile di valori,
che verranno inseriti finché non si digita -1 per uscire.
Con Contatore
Module calcolaMedia
  Sub Main()
    Dim Totale As Integer = 0
    Dim contatore As Integer = 1
    Do While (contatore <= 5)
      Console.Write("Numero: ")
      Numero = Console.ReadLine()
      Totale += numero
    Loop
    Console.WriteLine("La media è: " & Totale/5)
  End Sub
End Module
Con valore sentinella
Module calcolaMedia
  Sub Main()
    Dim Totale As Integer = 0
    Dim contatore As Integer = 0
    Dim media As Integer
    Console.Write("Digita -1 per uscire")
    Totale = numero
    Do While (numero <> -1)
      Console.Write("Numero: ")
      Numero = Console.ReadLine()
      Totale += numero
      contatore += 1
    Loop
    If (contatore <> 1) Then
      Console.WriteLine("La media è: " & Totale / (contatore - 1) )
    Else
      Console.WriteLine("Non hai inserito nessun valore")
    End If
  End Sub
End Module
Ciao Ulderico


Ulderico, è veramente un bellissimo regalo per la Befana.
Meglio di un manuale.
Grazie della disponibilità e della cortesia.
Cercherò di mettere in pratica qaunto da te esposto.