Portál AbcLinuxu, 24. dubna 2024 23:26


Dotaz: Ukončení cyklů

17.2.2014 21:16 Jakubysko
Ukončení cyklů
Přečteno: 251×
Odpovědět | Admin
Ahoj, jak vyskočit ze dvou cyklů? Potřebuji vyskočit z toho vnořeného. Díky while true do while true do break break done done
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.2.2014 21:33 Carth_Onasi
Rozbalit Rozbalit vše Re: Ukončení cyklů
Odpovědět | | Sbalit | Link | Blokovat | Admin

První věc - jak to souvisí s Unixem nebo Linuxem?

Druhá věc - má to být ... do break done break done

Třetí věc - while true je cesta do pekel

Čtvrtá věc - dělá se to tak, že nadefinuješ proměnu (např. konec = false), pak ve vnitřním cyklu pro ukončení nastavíš konec na true a ve vnějším cyklu to testuješ - to jsou základní programovací techniky.
18.2.2014 08:25 potato
Rozbalit Rozbalit vše Re: Ukončení cyklů
while true je cesta do pekel
Cykly s podmínkou ukončení uprostřed nepřestanou být užitečné jen proto, že se ti nelíbí. A v jazycích, které nemají cykly s podmínkou na konci (shell, Python, ...), je while-true často nejelegantnější/nejpraktičtější způsob, jak cyklus realizovat.
18.2.2014 15:24 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Ukončení cyklů
Třetí věc - while true je cesta do pekel

To řekl kdo? Nejčastěji to slýchám od lidí, kteří nikdy neprogramovali. Opak je pravdou — cyklus, který testuje podmínku někde uprostřed, je leckdy elegantnější a efektivnější než zoufalá snaha vyjádřit totéž ve formě cyklů s podmínkou a krokem v těsném sousedství. Nestandardní typy cyklů začnou být dvojnásob užitečné ve chvíli, kdy cyklus závisí na dvou různých ukončovacích podmínkách, které mohou nastat nezávisle na sobě.

Čtvrtá věc - dělá se to tak, že nadefinuješ proměnu (např. konec = false), pak ve vnitřním cyklu pro ukončení nastavíš konec na true a ve vnějším cyklu to testuješ - to jsou základní programovací techniky.

Co je tohle za hovadinu? Prasárny tohoto typu vedou k tvorbě kódu, který je neefektivní (což nemusí nutně vadit, ale cosi to vypovídá o programátorských kvalitách autora) a velmi nepřehledný (což vadí po všech stránkách).

Tazatel se ptal, jak vyskočit ze dvou vnořených cyklů — předpokládám, že v shellu, když se ptá na linuxové poradně. Odpověď je jednoduchá: bash i dash (a možná i jiné shelly) mají příkaz break s číselným parametrem. Číselný parametr má implicitně hodnotu 1, tedy break bez parametru vyskočí z nejbližšího cyklu nebo selectu. Hodnota 0 znamená, že se nikam nevyskakuje a vrátí se 0 (úspěch). Hodnota větší než 1 vyskakuje z vnořených cyklů.

Odpověď na původní otázku by asi byla break 2. (A vůbec není nutné vymýšlet fantasmagorie o tom, jak by se údajně mělo či nemělo programovat.)

LangPa avatar 17.2.2014 23:21 LangPa | skóre: 12 | blog: LangPavel | Hradec Králové
Rozbalit Rozbalit vše Re: Ukončení cyklů
Odpovědět | | Sbalit | Link | Blokovat | Admin
1) goto je taky cesta do pekel ale funguje.

2) jaký jazyk? Některé umožňují, tuším, napsat break 2
17.2.2014 23:34 cronin | skóre: 49
Rozbalit Rozbalit vše Re: Ukončení cyklů
... iné umožňujú pomenovať slučku návestím, aby bolo následne z vnútorného cyklu brejknúť ten vonkajší.

Inak povedané: ak chce opytujúci sa lepšiu odpoveď, mal by lepšie sformulovať otázku.
18.2.2014 11:16 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Ukončení cyklů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přijde na to v jakém jazyku.
První a druhý příklad lze realizovat ve většině (včetně bash-e).
Třetí příklad je nepěkný a někde jsem četl, že je ospravedlnitelný pokud je těch cyklů roj (pokud by to mělo být jediné goto v kódu, tak bych ho neospravedlnil :)).
/* gcc -W -pedantic loop.c -o loop */
#include <stdlib.h>
#include <stdio.h>

int main( int arc, char **argv ) {
  int breakit;
  int doit;

  /*an example */
  printf("\nExample 1:\n");
  breakit = 0;
  while(1){
    printf("1st loop\n");
    while(1){
      printf("2nd loop\n");
      if(1==1){
        printf("Cond. to break all loops, break 2nd loop\n");
        breakit=1;
        break;
      }
    }
    if(breakit==1){
      printf("Break 1st loop\n");
      break;
    }
  }

  /*an better example */
  printf("\nExample 2:\n");
  doit = 1;
  while(doit){
    printf("1st loop\n");
    while(doit){
      printf("2nd loop\n");
      if(1==1){
        printf("Cond. to break all loops, break 2nd loop\n");
        doit=0;
        break;
      }
    }
  }

  /*Do not recomended */
  printf("\nExample 3:\n");
  while(1){
    printf("1st loop\n");
    while(1){
      printf("2nd loop\n");
      if(1==1){
        printf("Cond. to break all loops, goto (to) loopsend: \n");
        goto loopsend;
      }
    }
  }
  loopsend:

  return 0;
}

Některé jazyk jako třeba Java může mít něco takovéhoto (netestováno.)
 class JavaLoop{
    public static void main(String[] args){
      System.out.print("\nExample 1:\n");
      topouter:
      while(true){
        System.out.print("1st loop\n");
        while(true){
          System.out.print("2nd loop\n");
          if(1==1){
            System.out.print("Cond. to break all loops, break with label\n");
            break topouter;
          }
        }
      }
      return 0;
    }
  }
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.