Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Selezione multipla

Precedente
SUPERIORE
Successiva

Decidere quale sequenza di istruzioni eseguire tra tante sequenze alternative

Diagramma di flusso

Dopo aver eseguito l'istruzione 0 decide se eseguire le istruzioni 11 e 12 (se E = E1) oppure le istruzioni 21 e 22 (se E = E2), oppure 31 e 32 (altrimenti) e poi continua eseguendo l'istruzione 4.

Piuttosto che usare un selettore a tre uscite possiamo trasformare il diagramma di flusso nel successivo

dove cambia l'interpretazione ma non il comportamento dell'algoritmo: dopo aver eseguito l'istruzione 0 decide se eseguire le istruzioni 11 e 12 (se E = E1) oppure continuare, quindi decide se eseguire le istruzioni 21 e 22 (se E = E2) oppure 31 e 32 e poi continua eseguendo l'istruzione 4.

MAC

Traduciamo in MACL

       I0  ...... '
       LDA E      '
       SUB E1     '
       JEQ ISTR1  ' Se(E = E1): PC <-- ISTR1
       LDA E      '
       SUB E2     '
       JEQ ISTR2  ' Se(E = E2): PC <-- ISTR2
       JMP ISTR3  ' Altrimenti: PC <-- ISTR3
ISTR1  I11 ...... '
       I12 ...... '
       JMP ISTR4  '
ISTR2  I21 ...... '
       I22 ...... '
       JMP ISTR4  '
ISTR3  I31 ...... '
       I32 ...... '
ISTR4  I4  ...... '

oppure

       I0  ...... '
       LDA E      '
       SUB E1     '
       JEQ ISTR1  ' Se(E = E1): PC <-- ISTR1
       LDA E      '
       SUB E2     '
       JEQ ISTR2  ' Se(E = E2): PC <-- ISTR2
       I31 ...... '
       I32 ...... '
       JMP ISTR4  '
ISTR1  I11 ...... '
       I12 ...... '
       JMP ISTR4  '
ISTR2  I21 ...... '
       I22 ...... '
ISTR4  I4  ...... '

Linguaggi di alto livello

VBasic TPascal 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;
}

Tra l'ultimo Else If e l'Else finale possono essere inseriti ulteriori blocchi di tipo Else If. L'ultimo blocco Else è facoltativo (quindi si può prevedere che nessun blocco venga eseguito).

Alcuni preferiscono tradurre in linguaggio di alto livello seguendo fedelmente lo schema del secondo diagramma di flusso

BasicPascalC...
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
   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;
   }

Osserviamo che la versione VB ha una sintassi diversa mentre le altre sono identiche tranne che per l'allineamento.

Se le espressioni E, E1, E2, ... sono di tipo semplice si può tradurre il tutto in una forma più immediata che corrisponde logicamente al primo diagramma di flusso

BasicPascalC...
Select Case E
   Case E1:   Istr11
              Istr12
   Case E2:   Istr21
              Istr22
   ...
   Case Else: Istr31
              Istr32
End Select
Case E Of
   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;
}

(con grandi differenze tra i linguaggi nella sintassi e potenzialità d'uso...)

Selezione multipla - ApPuNtIdIuNiNfOrMaTiCo

Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Precedente
SUPERIORE
Successiva