Selezione multipla
Decidere quale eseguire tra tante sequenze alternative di istruzioni (per esempio tre)Dopo aver eseguito istruzione 0 decide quale blocco eseguire in funzione del valore assunto dall'espressione E.
Se E = E1 esegue
istruzione 11
istruzione 12
altrimenti se E = E2 esegueistruzione 12
istruzione 21
istruzione 22
altrimenti esegueistruzione 22
istruzione 31
istruzione 32
e poi continua eseguendo istruzione 4.istruzione 32
Non è necessario introdurre un costrutto di controllo a tre uscite perché il diagramma di flusso si può trasformare nel successivodove cambia l'interpretazione ma non il comportamento dell'algoritmo.
Dopo aver eseguito istruzione 0 decide se eseguire
istruzione 11
istruzione 12
oppure continua e quindi decide se eseguireistruzione 12
istruzione 21
istruzione 21
oppureistruzione 21
istruzione 31
istruzione 32
e quindi continua eseguendo istruzione 4.istruzione 32
| Basic | Pascal | C |
|---|---|---|
|
If E = E1 Then
Istr11 Istr12 Else If E = E2 Then Istr21 Istr22 Else Istr31 Istr32 End If End If |
If E = E1 Then
Begin Istr11; Istr12; End Else begin If E = E2 Then Begin Istr21; Istr22; End Else Begin Istr31; Istr32; End End; |
if(E == E1)
{ istr11; istr12; } else { if(E == E2) { istr21; istr22; } else { istr31; istr32; } } |
Note
- In linguaggio C: ==...
- Il valore assunto dell'unica espressione E decide quale blocco verrà eseguito
- Un solo blocco sarà eseguito in esclusiva.
Si può semplificare il codice, e rimanere più aderenti al primo diagramma di flusso, cambiando l'indentazione delle istruzioni ed eliminando le etichette di blocco superflue
| Basic | Pascal | C |
|---|---|---|
|
If E = E1 Then
Istr11 Istr12 Else If E = E2 Then Istr21 Istr22 Else Istr31 Istr32 End If |
If E = E1 Then
Begin Istr11; Istr12; End Else If E = E2 Then Begin Istr21; Istr22; End Else Begin Istr31; Istr32; End |
if(E == E1)
{ istr11; istr12; } else if(E == E2) { istr21; istr22; } else { istr31; istr32; } |
Nota
- Prima dell'Else finale possono essere inseriti ulteriori blocchi di tipo Else If (con E3, E4, ...).
- L'ultimo blocco Else è facoltativo (quindi si può prevedere che nessuna sequenza di istruzioni venga eseguita).
- La versione Basic ha una sintassi diversa, ma notevolmente semplificata...
Se le espressioni E, E1, E2, ... sono di tipo semplice si può utilizzare una struttura di controllo che permette un'interpretazione ancora più fedele al primo diagramma di flusso
| Basic | Pascal | C |
|---|---|---|
|
Select Case E
Case E1: Istr11 Istr12 Case E2: Istr21 Istr22 Case Else: Istr31 Istr32 End Select |
Case(E)
E1: Begin Istr11; Istr12; End; E2: Begin Istr21; Istr22; End; Else Begin Istr31; Istr32; End; End; |
switch(E)
{ case E1: istr11; istr12; break; case E2: istr21; istr22; break; default: istr31; istr32; break; } |
Note
- la struttura dell'istruzione è abbastanza simile ma...
- ci sono notevoli differenze tra i vari linguaggi nei valori ammessi per i casi.
Se più casi richiedono lo stesso trattamento
| Basic | Pascal | C |
|---|---|---|
|
Select Case E
Case E11 To E1n: Istr11 Istr12 Case E2, E3: Istr21 Istr22 Case Else: Istr31 Istr32 End Select |
Case(E)
E11..E1n: Begin Istr11; Istr12; End; E2,E3: Begin Istr21; Istr22; End; Else Begin Istr31; Istr32; End; End; |
switch(E)
{ case E11: case E12: ... case E1n: istr11; istr12; break; case E2: istr21; istr22; break; default: istr31; istr32; break; } |