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

Cyklus s pevným počtem opakování (for)

Popis

Cyklus for používáme všude tam kde předem známe počet opakování příkazu. U těchto cyklů používáme proměnnou pro řízení počtu opakování, jejíž hodnotu lze výhodně využít i uvnitř těla cyklu.

Vývojový diagram

vyvojovy diagram prikazu for
Podle řídící proměnné proveď n-krát příkaz P1.

Přirozený jazyk

N-krát opakuj provádění příkazu.

JSA

  • Realizace pomocí instrukcí podmíněného skoku:
    • přeskočení cyklu - skok za tělo cyklu pří nulovém počtu opakování (JECXZ )
    • opakování - skok na začátek cyklu (LOOP )


AT&T - for cyklus[ gcc_for.cpp ]
/*  - pocitani vyskytu znaku 'a' v retezci
 *  - pro jiny znak nutne zmenit konstantu v asm ("cmpb $97, %%al;");
 */

#include <stdio.h>  /* printf() */
#include <string.h> /* strlen() */

int main(int argc, char *argv[]) {
    int sum = 0;
    char *str ="aaacba"; 
    int delka = strlen(str); /* pocet znaku v retezci */
    
    asm (
          "  movl $0, %%ebx ; "   /* ebx = 0  */
          "  movl %2, %%ecx ; "   /* ecx = delka  */   
          "  jecxz ENDFOR ;   "   /* konec cyklu pri (ecx==0) */          
          "  push %%ds;       "   /* ulozeni obsahu (ds) na zasobnik  */          
          "  ldsl %1, %%esi ; "   /* nacteni retezce do (ds:esi) */
          "  pop %%ds;        "   /* obnoveni obsahu (ds) ze zasobniku  */
          "FOR:  ;            "
          "  lodsb ;          "   /* (al) = str[i]  */
          "  cmpb $97, %%al ; "   /* porovnani znaku $97=='a' s (al)*/
          "  jnz SKIP ;       "         
          "  incl %%ebx ;     "   /* zvyseni poctu vyskytu o 1 (al==97) */
          "SKIP:  ;           "
          "  loop FOR ;       "
          "ENDFOR:  ;         "          
          "  movl %%ebx, %0 ; "   /*  sum = ebx  */
          
          :"=r" (sum)             /*  vystup do sum  */
          :"m" (str), "r"(delka)  /*  vstup str,delka */
          :"%ebx","%eax", "%esi", "%ecx"   /*  pouzite registry */
        ); 
             
        
    printf("vyskyt (a) v (%s) : %d", str, sum);
    
  return 0;
}

Pascal

for identifikátor := počáteční_hodnota to koncová_hodnota do
for identifikátor := počáteční_hodnota downto koncová_hodnota do
  • Počáteční a koncová hodnota jsou výrazy ordinálního typu, stejného jako typ řídící proměnné (identifikátor).
  • Je zakázáno měnit hodnotu řídící proměnné uvnitř těla cyklu.
  • Po skončení cyklu není hodnota řídící proměnné definována.
  • Zápis to inkrementuje řídící proměnnou po každém provedení příkazu (první příkaz za do) o jedničku (+1).
  • Zápis downto dekrementuje řídící proměnnou po každém provedení příkazu (první příkaz za do) o jedničku (-1).


součet číslic v řetězci[ for.pas ]
{ prikaz for - soucet cislic retezce }
var
     i   : integer; {ridici promenna for}
     sum : integer; {vysledny soucet}
     s   : string;

begin
    s := '1250';
    sum := 0;

    {ord(s[0]) vraci delku retezce}
    for i:= 1 to ord(s[0]) do
       sum := sum + ord(s[i]) - 48;

    writeln('soucet cislic retezce je : ',sum);
end.

C/C++

for (výraz1; výraz2; výraz3) příkaz
  • výraz1 je vyhodnocen jednou, při vstupu do smyčky.
  • iterace:
    1. výraz2 je vyhodnocen na začátku každé iterace cyklu
    2. příkaz bude proveden pokud byl výraz2 vyhodnocen jako nenulový, jinak je smyčka ukončena.
    3. výraz3 je vyhodnocen po provedení příkazu (na konci iterace).
  • 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.


for[ for.cpp ]
// prikaz for

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

int main (int argc, char *argv[]) {
    for(int i=1; i<=5; i++) {
        if(i==3)
            continue; //preskoceni hodnoty 3 
        printf(" index %d\n", i); 
    }   
}

Java

for (výraz1; výraz2; výraz3) příkaz
  • Hodnotou výrazu2 musí být typ boolean (nebo Boolean): výsledek relačních operátorů nebo datový typ boolean.
  • výraz1 je vyhodnocen jednou, při vstupu do smyčky.
  • iterace:
    1. výraz2 je vyhodnocen na začátku každé iterace cyklu
    2. příkaz bude proveden pokud byl výraz2 vyhodnocen jako true, jinak je smyčka ukončena.
    3. výraz3 je vyhodnocen po provedení příkazu (na konci iterace).
  • 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 for[ testfor.java ]
/*
 * testfor.java
 */

package statements;

public class testfor {
    public testfor() {
    }
    
    public static void main(String[] args) {
        // inicializovana promenna typu pole 3 celych cisel
        int pole[] = { 1, 7, 9 };
        
        System.out.print("Vypis prvku pole: "); 
        
        // atribut (pole.length) obsahuje pocet prvku v poli
        for (int i=0; i<pole.length; i++)
            System.out.print(pole[i]+", "); 
    }            
}

JavaScript

for (výraz1; výraz2; výraz3) příkaz
  • výraz1 je vyhodnocen jednou, při vstupu do smyčky.
  • iterace:
    1. výraz2 je vyhodnocen na začátku každé iterace cyklu
    2. příkaz bude proveden pokud byl výraz2 vyhodnocen jako nenulový, jinak je smyčka ukončena.
    3. výraz3 je vyhodnocen po provedení příkazu (na konci iterace).
  • 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.


for[ for.html ]
<html>            
  <head>
    <title>Cyklus for</title>
  </head>
  
  <body>
    <script type="text/javascript">
      pole = new Array( 1, 7, 9 ); // pole 3 celych cisel     

      document.write("vypis prvku pole: "); 
      
      for(i=0; i<pole.length; i++) {     
         document.write(pole[i]+", "); 
      } 
    </script>
  </body>
</html>

Matlab

  for identifikátor = počáteční_hodnota:inkrement:koncová_hodnota
       posloupnost_příkazů
  end
  • Uvedení inkrementu (navýšení řídící proměnné po každé iteraci) je volitelné s výchozí hodnotou 1.
  • Řídící proměnnou může být také pole (vektor) kdy iterace probíhají po jednotlivých sloupcích.
  • 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).


for[ mfor.m ]
%prikaz for 
disp('inkrement 2:');
for k = 1:2:10
     disp(sprintf(' index %d',k));
end

disp('vychozi inkrement 1:');
for k = 1:5
     if k == 3
         continue; %preskoceni hodnoty 3
     end;     
     disp(sprintf(' index %d',k));
end

PHP

for (výraz1; výraz2; výraz3) příkaz
for (výraz1; výraz2; výraz3): p1; p2; ... pN; endfor;
  • výraz1 je vyhodnocen jednou, při vstupu do smyčky.
  • iterace:
    1. výraz2 je vyhodnocen na začátku každé iterace cyklu
    2. příkaz bude proveden pokud byl výraz2 vyhodnocen jako TRUE, jinak je smyčka ukončena.
    3. výraz3 je vyhodnocen po provedení příkazu (na konci iterace).
  • 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.


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

      echo "inkrement 1:<br/>"; 
      for ($i=1; $i<=5; $i++) {
        if ($i==3)
            continue; //preskoceni hodnoty 3
        echo " i $i <br/>"; 
      }
    ?>
  </body>
</html>

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