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 redakti

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 redakti

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):

#!/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ŭ redakti