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

Cyklus s počtem opakování 0 až n (while)

Popis

Cyklus while použijeme, pokud počet jeho opakování není předem znám, ale víme, že může proběhnout několikrát nebo ani jednou. Příkladem je zjištění délky řetězce zakončeného nulou.

Přepsáním cyklu for na while jde ušetřit řídící proměnnou.

Vývojový diagram

vyvojovy diagram prikazu while
Dokud platí podmínka alfa, prováděj příkaz P1.

Přirozený jazyk

Dokud platí podmínka, prováděj příkaz.

JSA

  • Realizace pomocí instrukcí skoku:
    • opakování - nepodmíněný skok na začátek cyklu
    • ukončení - podmíněný skok za tělo cyklu při nesplněné podmínce


AT&T - while cyklus[ gcc_while.cpp ]
/*  - pocitani delky retezce (str)
 */
#include <stdio.h>  /* printf() */

char *str ="aaacbab"; 

int main(int argc, char *argv[]) {
    int delka = 0;  /* pocet znaku v retezci */
    
    asm (
          "  movl $0, %%ecx ; "   /* ecx = 0  */   
          "  movl %1, %%esi ; "   /* nacteni retezce do indexregistru (esi) */
          "WHILE:  ;          "
          "  lodsb ;          "   /* (al) = str[i]  */
          "  cmpb $0, %%al ;  "   /* porovnani znaku $0=='\0' s (al)*/
          "  jz ENDWHILE ;    "         
          "  incl %%ecx ;     "   /* zvyseni poctu znaku o 1 (al!=0) */
          "  jmp WHILE ;      "
          "ENDWHILE:  ;       "          
          "  movl %%ecx, %0 ; "   /*  delka = ecx  */
          
          :"=r" (delka)           /*  vystup do delka  */
          :"m" (str)              /*  vstup str */
          :"%eax","%esi", "%ecx"  /*  pouzite registry */
        ); 
             
        
    printf("delka (%s) je (%d) znaku", str, delka);
    
  return 0;
}

Pascal

while výraz do příkaz
  • Hodnotou výrazu musí být typ boolean: výsledek relačních operátorů nebo datový typ boolean.
  • Vyhodnocení výrazu podle překladače (zkrácené/úplné).
  • Opakování (provádění příkazu p1) probíhá dokud je výraz vyhodnocen jako true.


násobení sčítáním[ while.pas ]
{ prikaz while - nasobeni scitanim (pro nasobitel b>=0) }
var
     a,b : integer;
     sum : integer; {vysledek a*b}

begin
    a := 2;
    b := 3;
    sum := 0; { inicializace vysledku }

    { (a) bude (b)-krat pricteno k vysledku }
    while b > 0 do
    begin
        sum := sum + a;
        b   := b - 1;
    end;

    writeln(' soucin a*b = ',sum);
end.

C/C++

while (výraz) příkaz
  • Opakování (provádění příkazu) probíhá dokud je výraz vyhodnocen jako nenulový.
  • Příkaz continue přeskočí všechny ostatní příkazy posloupnosti příkazů cyklu a pokračuje další iterací nejbližšího cyklu.
  • Příkaz break předčasně ukončí nejbližší cyklus.


while[ while.cpp ]
// prikaz while - zjisteni delky retezce

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

int main (int argc, char *argv[]) {
    //           123456789012 = 12 
    char *s   = "pocet znaku:";
    int delka = 0;
    
    while(s[delka]!='\0') {
        delka++;
    }    
    printf(" %s %d\n", s, delka);
    
//jiny zpusob (aritmetickym prefixovym operatorem ve vyrazu)   
    delka = 0;
    while(s[++delka]!='\0');  //pozor na strednik
    printf(" %s %d\n", s, delka);
    
//jiny zpusob (inkrementaci ukazatele)   
    char *ptr = s; //ukazatel (ptr) na prvni znak retezce (s)
    
    // cyklus presune ukazatel (ptr) na posledni znak
    while(*ptr!='\0') ptr++; 
    
    // odecteni ukazatele na prvni znak retezce (s) od
    // ukazatele na posledni znak (ptr)
    // ! velikost znaku je 1 B, s polem typu int je to obtiznejsi
    delka = ptr-s;
    
    printf(" %s %d\n", s, delka);    
}

Java

while (výraz) příkaz
  • Hodnotou výrazu musí být typ boolean (nebo Boolean): výsledek relačních operátorů nebo datový typ boolean.
  • Opakování (provádění příkazu) probíhá dokud je výraz vyhodnocen jako true.
  • Příkaz continue přeskočí všechny ostatní příkazy posloupnosti příkazů cyklu a pokračuje další iterací nejbližšího cyklu.
  • Příkaz break předčasně ukončí nejbližší cyklus.


cyklus while[ testwhile.java ]
/*
 * testwhile.java
 */
package statements;

public class testwhile {
    public testwhile() {
    }
    
    public static void main(String[] args) {
        int i=0;
        while(i<5) {
            i++;            
            if(i==3)
                continue; //preskoceni hodnoty 3 
            System.out.println(" index: "+i);             
        }
    }                
}

JavaScript

while (výraz) příkaz
  • Opakování (provádění příkazu) probíhá dokud je výraz vyhodnocen jako nenulový.
  • Příkaz continue přeskočí všechny ostatní příkazy posloupnosti příkazů cyklu a pokračuje další iterací nejbližšího cyklu.
  • Příkaz break předčasně ukončí nejbližší cyklus.


while[ while.html ]
<html>            
  <head>
    <title>Cyklus while</title>
  </head>
  
  <body>
    <script type="text/javascript">
      var i = 1;
      
      while(i <= 5) {
          document.write(" index: "+i+"<br/>");
          if(i==3)
              break; //ukonceni cyklu pri hodnote 3
          i++; 
      }
    </script>
  </body>
</html>

Matlab

  while výraz
       posloupnost_příkazů
  end
  • Opakování (provádění posloupnosti příkazů) probíhá dokud je výraz vyhodnocen jako true.
  • V případě, že je výrazem matice, opakování probíhá dokud jsou všechny její prvky rovny jedné.
  • Prázdné pole ve výrazu bude vyhodnoceno jako false a cyklus bude ukončen případně neproveden ani jednou.
  • Příkaz continue přeskočí všechny ostatní příkazy posloupnosti příkazů cyklu a pokračuje další iterací nejbližšího cyklu.
  • Příkaz break předčasně ukončí nejbližší cyklus (skočí za end).


while[ mwhile.m ]
%prikaz while 
disp('inkrement 2:');
k = 1;
while k <= 10
     disp(sprintf(' index %d',k));
     k = k+2;
end

disp('vychozi inkrement 1:');
k = 1;
while k <= 5
     disp(sprintf(' index %d',k));
     if k == 3
         break; %ukonceni dosazenim hodnoty 3
     end;
     k = k+1;
end

PHP

while (výraz) příkaz
while (výraz): p1; p2; ... pN; endwhile;
  • Opakování (provádění příkazu) probíhá dokud je výraz vyhodnocen jako TRUE.
  • Příkaz continue přeskočí všechny ostatní příkazy posloupnosti příkazů cyklu a pokračuje další iterací nejbližšího cyklu.
  • Příkaz break předčasně ukončí nejbližší cyklus.


while[ while.php ]
<html>            
  <head>
    <title>Cyklus while</title>
  </head>
  
  <body>
    <?php
      echo "inkrement 2:<br/>"; 
      $i=1;
      while ($i<=10) {
        echo " i $i <br/>"; 
        $i+=2;
      }

      echo "inkrement 1:<br/>"; 
      $i=1;
      while ($i<=5) {
        echo " i $i <br/>";       
        if ($i==3)
            break; //ukonceni pri hodnote 3
        $i++;
      }
    ?>
  </body>
</html>

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