Strutture condizionali

Le strutture condizionali, anche dette strutture di controllo “alternative”,  consentono di specificare che un dato blocco di istruzioni venga eseguito “(solo) se” vale una certa condizione. Le principali e più utilizzate strutture condizionali sono:

  • Struttura if-then e if-then-else
  • Struttura alternative case

Queste due strutture sono sostanzialmente molto simili. La struttura if-then (se-allora) può essere parafrasata con la frase “se vale la condizione C, allora esegui il blocco di istruzioni I“. Il controllo della condizione avviene, naturalmente, prima dell’esecuzione del blocco di istruzioni. La maggior parte dei linguaggi di programmazione ammette anche la struttura if-then-else che consiste in una catena di strutture if-then controllati in sequenza. Può essere parafrasata con la frase “se vale la condizione C esegui il blocco di istruzioni I1, altrimenti esegui il blocco di istruzioni I2“. Questa struttura può ulteriormente essere complicata aggiungendo, nel blocco else un ulteriore struttura if-then-else, permettendo quindi di controllare più condizioni in sequenza.

L’alternative case può essere visto come una catena di if-then-else con certe restrizioni. In sostanza si tratta di una struttura if-then dove il blocco di istruzioni eseguito si basa sul valore di una determinata variabile o espressione (che normalmente assume valore intero). Può essere parafrasata con la frase “valuta l’espressione N: se il suo valore è V1 esegui il blocco di istruzioni I1; altrimenti se il suo valore è V2 esegui il blocco di istruzioni I2; …” e così via con quante condizione sono necessarie.

Queste due strutture sono entrambe supportate in C# e VB.net. In entrambi i linguaggi seguono la stessa struttura, con le differenze sintattiche tipiche dei due linguaggi. Di seguito sono riportati gli esempi del codice con cui queste strutture sono scritte nei due linguaggi.

VB.net

La struttura if-then-else in VB.net è codificata come segue:

If condition [ Then ]

    [ statements ]

[ Else

    [ elsestatements ] ]

End If

Inoltre, in VB.net è molto semplice (e immediato) l’utilizzo di una struttura if-then-elseif-then che permette di annidiare più condizioni if insieme, interrompendo il loro controllo alla prima condizione vera trovata. Viene codificata con la seguente sintassi:

If condition [ Then ]

    [ statements ]

[ ElseIf elseifcondition [ Then ]

    [ elseifstatements ] ]

[ Else

    [ elsestatements ] ]

End If

Naturalmente è possibile concatenare più elseif insieme.

La struttura alternative case invece segue la seguente sintassi:

Select [ Case ] testexpression  

    [ Case expressionlist  

        [ statements ] ]

    [ Case expressionlist  

        [ statements ] ]   

    [ Case Else  

        [ elsestatements ] ]  

End Select

C#

La struttura if-then-else in C# è codificata come segue:

if (condition)
{
    [ statements ];
}
else
{
    [ statements ];
}

Anche in questo caso è possibile concatenare abbastanza agilmente più condizioni if-else, anche se C# non ha una struttura dedicata appositamente a questo.

if (condition)
{
    [ statements ];
}
else
{
    if (condition)
    {
        [ statements ];
    }
    else
    {
        [ statements ];
    }
}

L’alternative case invece viene codificato come segue:

switch (caseSwitch)
      {
          case 1:
              [ statements ];
              break;
          case 2:
              [ statements ];
              break;
          default:
              [ statements ];
              break;
      }

Strutture Do, While in VB.net e C#

In programmazione, esistono diversi tipi di strutture di controllo iterative che consentono di specificare che una data istruzione (o blocco di istruzioni) deve essere eseguita ripetutamente sotto delle condizioni che, se false, ne consentono l’uscita. Le principali strutture di controllo iterative sono:

  • Ciclo for
  • Ciclo while
  • Ciclo loop-until

Il ciclo while, in particolare, può presentarsi con due strutture diverse: do-while e while-do. Nonostante sembrino molto simili, queste due strutture hanno una differenza importantissima. Il primo, infatti, garantisce l’esecuzione di una iterazione poiché il controllo per la permanenza nella parte iterativa avviene solo dopo l’esecuzione del blocco di comandi. La seconda struttura, di contro, prima di eseguire iterativamente il blocco di comandi, controlla che siano rispettate le condizioni di continuazione del ciclo, implicando quindi che il blocco di comandi potrebbe non essere eseguito neanche una volta.

In generale, la struttura while-do è indicata quando la condizione di permanenza in un ciclo è una generica condizione booleana, indipendente dal numero di iterazioni eseguite. Le forme tradizionali di ciclo while possono essere parafrasate come “ripeti (il codice controllato) fintantoché resta vera la condizione C“. Questa condizione, come precedentemente detto, viene controllata prima di eseguire la prima iterazione del ciclo stesso; se essa risulta immediatamente falsa, le istruzioni nel ciclo non vengono eseguite.

In C# e VB.net i cicli while presentano codifiche diverse, ma i comandi rappresentano le stesse funzioni. Di seguito sono riportati i codici nei due linguaggi per i cicli while

VB.net

Il do-while in VB.net può essere codificato in due modi diversi, ma equivalenti.

Do { While | Until } condition  
    [ statements ]  
    [ Continue Do ]  
    [ statements ]  
    [ Exit Do ]  
    [ statements ]  
Loop  
' -or-  
Do  
    [ statements ]  
    [ Continue Do ]  
    [ statements ]  
    [ Exit Do ]  
    [ statements ]  
Loop { While | Until } condition

Alternativamente, è possibile utilizzare la struttura while-do:

While condition  
    [ statements ]  
    [ Continue While ]  
    [ statements ]  
    [ Exit While ]  
    [ statements ]  
End While 

C#

Anche in C# è possibile utilizzare sia la struttura do-while, sia la struttura while-do. La struttura do-while può essere scritta come segue:

do 
{
    [ statements];
} while (condition);

Mentre la struttura do-while presenta la seguente struttura:

while (condition) 
{
    [ statements];
}

Algoritmo di Knuth

Uno dei principali problemi che si riscontra nel calcolo degli indici da dati online, è il fatto che non si ha una conoscenza preliminare del numero di dati che verranno utilizzati. Un altro importante errore che potrebbe comportare un metodo “classico” è la Catastrophic Cancellation, ovvero la cancellazione di cifre significative. Questo comporta che per molti indici, fondamentali nelle analisi preliminari delle serie storiche (molto utilizzate nelle analisi finanziarie), quali ad esempio media e varianza, non è possibile utilizzare le classiche formule. Prendiamo in considerazione la media. La formula classica per calcolarla, infatti, richiede una conoscenza preliminare del numero di dati che si andrà ad analizzare:

\bar{x}_{n}=\frac{1}{n} \sum^{n}_{i = 1} x_{i}

In questi casi conviene usare degli algoritmi online. Con algoritmo online si intende un algoritmo, per la risoluzione di un problema, che deve fornire dei risultati pur non avendo a disposizione, inizialmente, alcuni dei dati in ingresso. L’algoritmo online più utilizzato è quello proposto dall’informatico statunitense Donald Knuth che, con semplici passaggi algebri, fornisce una differente fomulazione per il calcolo della media:

\bar{x}_{n} = \frac{1}{n} \sum^{n}_{i = 1} x_{i} = \frac{1}{n} \sum^{n-1}_{i = 1} x_{i} + \frac{x_{n}}{n} = \frac{n-1}{n} \cdot \frac{1}{n-1} \sum^{n-1}_{i = 1} x_{i} + \frac{x_{n}}{n} =
= \bar{x}_{n-1} + \frac{1}{n}(x_{n} - \bar{x}_{n-1})

Come è possibile notare, questo algoritmo permette il calcolo della media senza avere conoscenze preliminari sul numero di elementi da analizzare, ma andando ricorsivamente ad aggiornare la media ad ogni passaggio.

La sua implementazione in un linguaggio informatico è molto semplice. Di sotto è riportata la sua scrittura in VB.net.

        'Scelgo dei voti casuali, ma posso immettere quanti e quali voti voglio
        Dim Voti As Integer() = {1, 5, 9, 25}
        Dim Lista As New List(Of Integer)(Voti)
        Dim mean As Double = 0
        Dim count As Integer = 0

        For Each Voto As Integer In Lista
            count += 1
            mean = ((count - 1) * mean + Voto) / count
        Next
     

Reference type e value type

In Visual Basic vengono trattati solo due diversi types: i reference type e i value type. La principale (e fondamentale) differenza consiste nel fatto che i value type allocano una porzione di memoria direttamente riempita con il valore d’interesse, mentre i reference type contengono contengono un puntatore ad un oggetto (e quindi al relativo valore). Questa differenza è fondamentale, in quanto stravolge completamente il funzionamento dei due types. Ad esempio, infatti, quando si copia il valore di una variabile in una seconda è fondamentale conoscere il type della prima. Nel caso si trattasse di un value type, nella seconda variabile verrà copiato direttamente il valore contenuto nella prima e le due variabili lavoreranno indipendentemente. I reference type, invece, se copiati in una seconda variabile, creano una seconda copia del puntatore allo stesso oggetto. Questo implica che una modifica al valore di una delle due variabili comporta una variazione all’oggetto identificato dal puntatore e quindi qualsiasi variabile conterrà il puntatore a quell’oggetto vedrà il valore di quest’ultimo modificato.

Alcuni esempi di value type sono i seguenti:

  • Tutti i tipi di dati numerici
  • BooleanCharDate
  • Tutte le strutture, anche se i relativi membri sono reference type

Alcuni esempi di reference type sono i seguenti:

  • String
  • Tutte le matrici, anche se i relativi elementi sono value type
  • Tipi di classe, ad esempio Form
  • Delegati

Per quanto riguarda la definizione di questi due type in C# e VB.net, in entrambi i linguaggi, i reference type sono dichiarati attraverso l’istruzione Class, mentre i value type vengono dichiarati attraverso l’istruzione Structure. Di seguito sono riportati i codici di esempio per dichiarare i due type descritti finora nei due linguaggi:

VB.net

C#

Reference Type

Public Class Studente_C 
       Public Eta As Double
       Public Peso As Double
End Class
class Studente_C
{
      public double Eta;
      public double Peso;
}

Value Type

Public Structure Studente_S 
       Public Eta As Double
       Public Peso As Double
End Structure
struct Studente_S
{
      public double Eta;
      public double Peso;
}

Come si può notare, la sintassi è molto simile. L’unica differenza è sulla compattezza del codice, che però rimane una differenza che caratterizza i due codici nel complesso.