Portál AbcLinuxu, 10. května 2025 05:55

Dotaz: implementace cyklu For pomocí While v C

2.6.2013 09:23 Maruška
implementace cyklu For pomocí While v C
Přečteno: 770×
Odpovědět | Admin
Ahojte, jak by se implementoval cyklus for pomoci cyklu while v C? Slo by to treba nejak pomoci konstrukce do-while anebo i jinak? Diky!

M.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Vojtěch Trefný)
2.6.2013 09:43 JMP | skóre: 30
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
vzhledem k podivnosti požadavku to vypadá na školní zadání

zkuste to vyřešit sama

[hint] zkouněte, jak funguje cyklus for, potom omrkněte cyklus while a nakonec zjistěte jak inkrementovat... :-) [/hint]
2.6.2013 18:06 Maruška
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
něco udělanýho mám, ale je to taková neefektivní slátanina :-/
2.6.2013 18:11 potato
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
for a while cyklus existují jako dvě různé konstrukce z nějakého důvodu. Pokud je něco elegantní vyjádřit jednou, pomocí druhé to může být škaredé. Kde je přesně problém?
Řešení 2× (DarkKnightCZ, Vojtěch Trefný)
2.6.2013 11:35 Radovan Garabik
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
#include <stdio.h>

#define do(x) for(x) {
#define while }

void main(void) {
    unsigned short i;
    do (i=0; i<10; i++)
        printf("%i\n", i);
    while;
}


2.6.2013 15:01 mankind_boost
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Luxusní :-D
2.6.2013 18:05 Maruška
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
není mi jasné to "define" Je i jiný způsob prosím?
2.6.2013 18:16 potato
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Pravděpodobně existuje i nějaký zvrácenější způsob, ale zrovna mě žádný nenapadá.
2.6.2013 19:06 w4rr10r
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Já bych tam nějak zamotal zásobník.
3.6.2013 10:53 ...
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
no protoze jde vyhradne jen o ten cyklus, tak by to mohlo i forkovat :-D
Bystroushaak avatar 2.6.2013 19:52 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Pořád by to ještě mohla být rekurzivní funkce, kde v každém volání while proběhne právě jednou :D
3.6.2013 09:28 kuka
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Jen pro poradek - toto v zadnem pripade neni spravne reseni, protoze se tam "konstrukce do-while" jazyka C vubec nepouziva. Je to jen vtip, mozna dobry, vyuzivajici nepresnou formulaci puvodniho dotazu.
2.6.2013 19:51 fabulator
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle je kus stareho kodu z Fortranu 66 nebo Basicu prepsany do C:
int main()
{
  int i = 1;
  int n = 7;
 label_start:
  i = i + 1;
  if( i > n ) goto label_end;
  /* do work */
  goto label_start;
 label_end:
  return 0;
}
Na vysvetlenou. Nekonecny cyklus (simulujici do-while) je mezi label_start a goto label_start. Podminka na ukonceni pak je if se skokem mimo smycku.

Ano. Presne takhle se ve starych jazycich kodovaly tyhle veci. Dneska uz maji oba zminene konstrukce analogicke obou tymum cyklu a je skoda, ze si jich nevazite.
2.6.2013 20:17 Maruška
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Děkuju všem za pomoc, už vím. Dííky :)
3.6.2013 09:43 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C

S ohledem na odpovědi mám trochu obavu, co vlastně víte. Takže pro pořádek:

  for (INIT; COND; ITER) {
    BODY;
  }

lze (za předpokladu, že v těle nepoužijete continue) ekvivalentně přepsat jako

  INIT;
  while (COND) {
    BODY;
    ITER;
  }

Pomocí do-while je to horší, protože ten vždy proběhne aspoň jednou. Takže by bylo potřeba použít nějaký špinavý trik typu

  INIT;
  do {
    if (!(COND))
      break;
    BODY;
    ITER;
  while (true);

a samozřejmě ani tady to nebude fungovat správně, pokud v těle použijete continue.

Podstatná otázka samozřejmě je, k čemu je to dobré.

David Watzke avatar 3.6.2013 10:35 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Ještě pro úplnost bych dodal, že INIT v případě for cyklu zaniká tam kde for cyklus končí, zatímco u toho while cyklu zaniká až když končí blok, ve kterém je jeho INIT obsažen.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
3.6.2013 11:07 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Pravda, na to to, že v inicializaci může být i deklarace, jsem úplně zapomněl; přitom to s oblibou využívám a vadilo mi, že to v C před C99 nešlo…
3.6.2013 11:44 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Zajímavější dříve bylo, že některé compiler-y, fungovali takto:
zápis v pořádku:
for(int i=1;…){
}
ale fungoval jako:
int i;
for(i=1;…){
}
což měnilo platný scope pro 'i'.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
5.6.2013 15:36 Sten
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
+1

Ten druhý přepis by měl být
{
  INIT;
    while (COND) {
      BODY;
      ITER;
    }
  }
3.6.2013 15:07 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Spíše to bude z Basicu. FORTRAN měl pouze a jedině pěticiferné numerické labely. cyklus s DO
C     EKVIVALENT V FORTRAN 77 DO
      INTEGER I
      INTEGER N
      N=7
      DO 10 I=1,N
C    DO WORK
10    CONTINUE
      STOP
      END
totéž pomocí IF
C     EKVIVALENT V FORTRAN 77 IF
      INTEGER I
      INTEGER N
10    IF (N=I) 40,30,20
20    I=I+1
C    DO WORK
30    GOTO 50
40    PRINT 'CHYBA I JE VETSI NEZ N'
50    STOP
      END
3.6.2013 15:12 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Fuj, napsal jsem to špatně, druhá možnost je správně
C     EKVIVALENT V FORTRAN 77 IF
      INTEGER I
      INTEGER N
10    IF (N-I) 40,30,20
20    I=I+1
C    DO WORK
30    GOTO 50
40    PRINT 'CHYBA I JE VETSI NEZ N'
50    STOP
      END
jak už 20 let píšu do if podmínku, tak ty prsty to napsaly automaticky, přitom tohle FORTRANí IF je na číslo.
3.6.2013 21:13 fabulator
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
V C neni numericky label, prikaz continue a taktez aritmeticke if. Jinak by tam asi melo byt spis goto na 10.
5.6.2013 15:03 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
jo to by mělo.
5.6.2013 09:46 dword
Rozbalit Rozbalit vše Re: implementace cyklu For pomocí While v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
#define LIMIT 100

int i;

//--- FOR LOOP -----------
for(i = 0; i < LIMIT; i++)
  f(i);

//--- WHILE LOOP -----------
i = 0;
while(i < LIMIT)
{
  f(i);
  i++;
}

//--- DO-WHILE LOOP -----------
i = 0;
if(i < LIMIT)
{
  do
  {
    f(i);
  } while(++i < LIMIT);
}

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.