Elekta ordono

En programlingvoj, **elekta ordono** estas malsimpla ordono, ebliganta dum la rultempo elekti la pluiron de la stirfluo laŭ unu el pluraj ordonoj (nomataj *branĉoj, alternativoj*) depende je valoro de indica esprimo.

Origine la elekta ordono evoluis el la maŝinlingva tabelo da saltmarkoj, kaj salta ordono al kalkulita elemento de tia tabelo. En Algol-60 tia elekta ordono havis la formon de «komutilo» (angle *switch*):

  **switch** s := A, B, C, D;
  ...
  A: y := F(x); ...
  D: p(x, y); ...
  B: n := n+1; ...
  C: y := sin(x); ...
  ...
  **goto** s[n−5];
  ...

Laŭ la difino de *s*,
* s[1] estas la marko A;
* s[2] estas la marko B; ktp.
Se  en la lasta linio *n*=8, tiam `**goto** s[n−5]` rezultos en `**goto** C`.

## Okazelekta ordono de Paskalo 
Pli elegantan esprimilon por la sama ideo disponigas la **okazelekta ordono** de Paskalo (la programpeco ĉi-suba estas en esprantigita Paskala pseŭdokodo).

Estu difinitaj

     **TIPO** monato =
        (jan,feb,mar,apr,maj,jun,jul,aŭg,sep,okt,nov,dec); 
     **VAR**  longo, jaro: entjeraj;
           mon: monato;
tiam por determini la tagnombron *longo* en la monato *mon* uzeblas ĉi tia okazelekta ordono: 

   **okazo** mon **el** 
     jan, mar, maj, jul, aŭg, okt, dec: 
        longo := 31; 
     feb: 
        **se** (jaro **mod** 4 = 0) **kaj** (jaro **mod** 100 ≠ 0)
        **tiam** longo := 29 
        **alie** longo := 28; 
     apr, jun, sep, nov: 
        longo := 30 
   **fino**    { *de la okazelekta ordono* }

La tipo *monato* ekvivalentas al la 12 naturaj nombroj 0..11; la 3 branĉoj de ĉi tiu okazelekta ordono implicas 3 saltomarkojn, kiuj plenigos implican tabelon el 12 elementoj, indekseblan per la valoroj de *mon*. Anstataŭ elepensi nomojn por tiuj 3 saltomarkoj, la programisto *markas* la branĉojn per la indicvaloroj, kiuj respondu al apero de la branĉa marko en la saltmarka tabelo.

Ĉi tiaj indicaj aperoj forme kaj funkcie tre similas la saltomarkojn, tamen ili ja diferencas de ili. Oni povas distingigi ilin per la termino **okazmarkoj**.

Menciindas, ke (malsimile ol en C) la branĉoj de okazelekta ordono de Paskalo (kaj de Modula-2, kaj de Ada ktp) estas reciproke ekskludaj: fine de ĉiu branĉo okazas implica salto post la finon de la okazelekta ordono (en C oni trafalas al la tekste sekva branĉo, krom se oni ne forgesis rompi la elektan ordonon per **break;**).

## La tipo de la okazindico 
Evidente, en la Paskala okazelekta ordono, samkiel en la komutilo de Algolo la tipo de la indica esprimo (kaj de la okazmarkaj konstantoj) devas esti entjera aŭ ekvivalenta al entjera. Tio ebligas tre simple kaj tre altrendimente plenumi elekton de dezirata branco, sendepende je tio, inter kiom multe da branĉoj oni elektas.

Tio evidente diferencas disde la seoj, en kiuj la elekta *kondiĉo* estas bulea, kaj la laste listigitaj branĉoj en kaskada seo estas atingeblaj malpli rapide ol la unuaj.

Tamen en kaskada seo oni povas aranĝi la komparojn de valoroj de ia ajn tipo, ne nepre «numerebla» (entjera aŭ simila al la entjera). Tial en kelkaj lingvoj, ekz-e en Bash, oni povas uzi nenumereblajn okazmarkojn (ekz-e signoĉenojn):

```bash
#!/bin/bash
printf 'Kiun Linuksan distribuaĵon vi konas? '
read DISTR

case $DISTR in
     ubuntu)
          echo "Ho jes! Ĝi estas operaciumo bazita sur Debian."
          ;;
     centos|rhel)
          echo "Ha, mi ŝatas ĉi tiun servilan operaciumon!"
          ;;
     windows)
          echo "Amuze..."
          ;; 
     *)
          echo "Hmm, ŝajnas, ke ni neniam uzis ĉi tion."
          ;;
esac
```

Forme ĉi tia elekta ordono similas la Paskalan, sed reale ĝi funkcias kiel kaskada seo.

## Vidu ankaŭ 
* Seo

Kategorio: Programadaj konstruoj
Kategorio:Stirfluo