english version while1 - stránky o programování

Podmíněný příkaz (case)

Popis

Podmíněný příkaz case umožňuje vybrat k realizaci jeden nebo několik příkazů z více příkazů na základě výrazu ordinálního typu.

Každé návěští (konstanta) musí být unikátní, tj. nesmí se opakovat a to ani jako část jiného intervalu (Pascal).

Hodnota výrazu bývá nejčastěji ordinálního typu mimo logický typ boolean.

Vývojový diagram

Přirozený jazyk

Proveď některý z příkazů na základě porovnání s ordinální hodnotou.

JSA



AT&T - operace {+,-,*}[ gcc_switch.cpp ]
/*  - operace {+,-,*} dvou cisel (se znamenkem na 32-bitu)
 *  - pro 32-bit, C/C++
 */
#include <stdio.h> /* printf() */

int main(int argc, char *argv[]) {
    int a = 2;
    int b = 10;
    int result;  /* vysledek (a) {+,-,*} (b) */
    
    /* kod operace (op)
     *    + ... 0
     *    - ... 1
     *    * ... 2
     */
    int op = 2;  

    /* znaky operatoru pro zaverecny vypis vysledku */
    char str_op[] = {'+', '-', '*'};    
    
    /* kontrola hodnoty operatoru:
     *  (op) indexuje pole (str_op) a nesmi tak byt 
     *  mimo jeho meze <0, 2>
     */
    if(op<0 || op>2) {
        printf("CHYBA : Operator mimo rozsah pole.");
        return 0; /* predcasne ukonceni programu */
    }
    
    asm (
          "  movl %3, %%eax ; "  /*  eax = op   */
          "  cmp  $0, %%eax ; "  /*  porovnani registru eax s 0 (eax-0)*/
          "  jnz  SKIP_PLUS ; "  /*  skok na navesti SKIP_PLUS pri (eax!=0) */
        /* 0 : soucet */      
          "  movl %1, %%eax ; "   /*  eax = a */   
          "  movl %2, %%ebx ; "   /*  ebx = b */   
          "  addl %%ebx, %%eax ; "/*  eax = eax + ebx */             
          "  jmp  ENDSWITCH ; "   /*  skok na navesti ENDSWITCH */
          
          "SKIP_PLUS:  ; "          
          "  cmp  $1, %%eax ; "  /*  porovnani registru eax s 1 (eax-1)*/     
          "  jnz  SKIP_MINUS ; " /*  skok na navesti SKIP_MINUS pri (eax!=1) */
        /* 1 : rozdil */                
          "  movl %1, %%eax ; "   /*  eax = a */   
          "  movl %2, %%ebx ; "   /*  ebx = b */   
          "  subl %%ebx, %%eax ; "/*  eax = eax - ebx */   
          "  jmp  ENDSWITCH ; "   /*  skok na navesti ENDSWITCH */
          
          "SKIP_MINUS:  ; "          
        /* 2 : soucin */                
          "  movl %1, %%eax ; "    /*  eax = a */   
          "  movl %2, %%ebx ; "    /*  ebx = b */   
          "  imull %%ebx, %%eax ; "/*  eax = eax * ebx */   
          
          "ENDSWITCH:  ; "
          "  movl %%eax, %0 ; "   /*  result = eax  */  
          
          :"=r"(result)            /*  vystup do result  */
          :"r"(a), "r"(b), "r"(op) /*  vstup a, b, op */
          :"%eax","%ebx"           /*  pouzite registry */
        ); 
             
        
      printf("vysledek %d %c %d = %d", a, str_op[op], b, result);
    
  return 0;
}

Pascal

  case výraz of 
    k1       : p1; 
    k2..k4   : p2; 
    k5,k6,k7 : p3; 
    else p4;
  end;
  • Hodnotou výrazu musí být ordinální typ.
  • Místo konstanty k1 lze zapsat interval k2..k4 nebo výčet konstant oddělených čárkou k5,k6,k7.
  • Volitelná je alternativní část else, která bude vybrána, pokud se žádná z předchozích konstant neshoduje s hodnotou výrazu.
  • Příkazem může být i složený příkaz begin ... end;.


čtení kláves[ case.pas ]
{ prikaz case - cteni klaves }
var
    ch : char; {nactena klavesa}
begin
    write('stisknete znakovou klavesu a pote enter: ');

    readln(ch);
    case ch of
        ';' : writeln(' strednik ');
        '(', ')', '[', ']' : writeln(' zavorka ',ch);
        '0'..'9' : writeln(' cislice ',ch);
        'a'..'z' : writeln(' male pismeno ',ch);
        'A'..'Z' : writeln(' velke pismeno ',ch);
        else
            writeln(' jina klavesa ');
    end;
end.

C/C++

  switch (výraz) { 
    case k1 : p1;
    case k2 :
    case k3 : p2;
              p3;
              break; 
    default :
              p4;
  }
  • Po nalezení první shody mezi konstantou některého case a hodnotou výrazu začíná provádění příkazů za case. Provádění příkazů pokračuje i přes ostatní návěští case a končí až prvním příkazem break nebo return.
  • Volitelná je alternativní část default, která bude vybrána, pokud se žádná z předchozích konstant neshoduje s hodnotou výrazu.


switch[ switch.cpp ]
// prikaz switch

#include <stdio.h> //knihovna s funkci printf() 

int main (int argc, char *argv[]) {
    int a = 2;
    switch (a) {
        case 0: printf("nula"); break;
        case 1: 
        case 2: 
        case 3: 
            printf("1, 2 nebo 3"); 
          break;
        default:  
            printf("zaporne cislo nebo cislo vetsi nez 3"); 
    }   
}

Java

  switch (výraz) { 
    case k1 : p1;
    case k2 :
    case k3 : p2;
              p3;
              break; 
    default :
              p4;
  }
  • Typ výrazu musí být ordinální : char, byte, short, int, Character, Byte, Short, Integer nebo enum.
  • Po nalezení první shody mezi konstantou některého case a hodnotou výrazu začíná provádění příkazů za case. Provádění příkazů pokračuje i přes ostatní návěští case a končí až prvním příkazem break nebo return.
  • Volitelná je alternativní část default, která bude vybrána, pokud se žádná z předchozích konstant neshoduje s hodnotou výrazu.


switch[ testswitch.java ]
/*
 * testswitch.java
 */

package statements;

public class testswitch {
    public testswitch() {
    }
    
    public static void main(String[] args) {
      int a=2;
     
      switch (a) {
        case 0: System.out.println("nula"); break;
        case 1: 
        case 2: 
        case 3: 
            System.out.println("1, 2 nebo 3"); 
          break;
        default:  
            System.out.println("zaporne cislo nebo cislo vetsi nez 3"); 
      }              
    }        
}

JavaScript

  switch (výraz) { 
    case k1 : p1;
    case k2 :
    case k3 : p2;
              p3;
              break; 
    default :
              p4;
  }
  • Po nalezení první shody mezi konstantou některého case a hodnotou výrazu začíná provádění příkazů za case. Provádění příkazů pokračuje i přes ostatní návěští case a končí až prvním příkazem break nebo return.
  • Volitelná je alternativní část default, která bude vybrána, pokud se žádná z předchozích konstant neshoduje s hodnotou výrazu.


switch[ switch.html ]
<html>            
  <head>
    <title>Podmíněný příkaz switch</title>
  </head>
  
  <body>
    <script type="text/javascript">
      var a=2; 
      
      switch (a) {
        case 0: document.write("nula"); break;
        case 1: 
        case 2: 
        case 3: 
            document.write("1, 2 nebo 3"); 
          break;
        default:  
            document.write("zaporne cislo nebo cislo vetsi nez 3"); 
      }             
    </script>
  </body>
</html>

Matlab

  switch výraz  
      case k1
         příkazy
      case {k2, k3, k4}
         příkazy
      otherwise
         příkazy
  end
  • Typem výrazu musí být skalární typ nebo řetězec.
  • Posloupnost příkazů některého case může být vybrána při rovnosti s některou z více uvedených konstant {k2, k3, k4} (konstantní cell array).
  • Odlišně od jazyka C zde příkaz switch nepropadává až po první příkaz break. Každá posloupnost příkazů vybraného case končí následujícím case, otherwise nebo koncem příkazu end.
  • Volitelná je alternativní část otherwise, která bude vybrána, pokud se žádná z předchozích konstant neshoduje s hodnotou výrazu.


switch[ mswitch.m ]
%prikaz switch 
a = 1;

switch a
    case 0 
        disp('nula');
    case {1, 2, 3} 
        disp('1, 2 nebo 3');
    otherwise
        disp('zaporne cislo nebo cislo vetsi nez 3');
end

PHP

  switch (výraz) { 
    case k1 : p1;
    case k2 :
    case k3 : p2;
              p3;
              break; 
    default :
              p4;
  }
  • Typ výrazu musí být integer, float nebo string.
  • Po nalezení první shody mezi konstantou některého case a hodnotou výrazu začíná provádění příkazů za case. Provádění příkazů pokračuje i přes ostatní návěští case a končí až prvním příkazem break nebo return.
  • Volitelná je alternativní část default, která bude vybrána, pokud se žádná z předchozích konstant neshoduje s hodnotou výrazu.


switch[ switch.php ]
<html>            
  <head>
    <title>Podmíněný příkaz switch</title>
  </head>
  
  <body>
    <?php
      $a = 2;
      switch ($a) {
          case 0: echo "nula"; break;
          case 1: 
          case 2: 
          case 3: 
              echo "1, 2 nebo 3"; 
            break;
          default:  
              echo "zaporne cislo nebo cislo vetsi nez 3"; 
      }
    ?>
  </body>
</html>

Kontakt
Prohlášení o dostupnosti
Tisk stránky
Autor: Václav Bubník © 2005
vbubnik@post.cz
XHTML 1.0| CSS