Pavle, diky za zajimavy clanek, jako vzdy. :)
Trochu jsi me zaskocil s tim idexovanim poli v BASICu. Je to - pravda - uz hodne dlouho, ale mlhave si pamatuji (protoze z BASICu jsem prechazel rovnou na C a pozdeji na C++), ze jsem byl trochu prekvapeny tim, ze v C se pole idexuje 0 - (n -1) a od toho se odviji pocet pruchodu cyklem for.
Mam totiz takovy dojem, v pripade FOR-NEXT, neslo o pocatecni a hranicni hodnotu, kdy se cyklus zastvy - jako v C, ale o pocatecni hodnotu a pocet pruchodu cyklem. K tomuto cyklu jeste existovala direktiva STEP ktera pak zvysovala citace v cyklu, ale neovlivnila tim nijak, kolikrat byl cyklus proveden. Mam dokokonce dojem, ze nektere interpretery ani totiz neznaly cyklis WHILE. Nebo jsem honeznal/nepouzaval - jak pisu, uz je to moc davno a ja to davam z hlavy, takze se muzu plest....
6. 12. 2022, 13:04 editováno autorem komentáře
Díky!
S těmi smyčkami v BASICu je to tak, že se zadává startovní hodnota (ta je jasná) a potom limit, který se nikdy nepřekročí, ale může se ho dosáhnout (narozdíl od range v Pythonu apod., což lidi mate).
Takže třeba FOR I=0 TO 5:PRINT I:NEXT I vypíše hodnoty od 0 do 5 včetně.
Pokud tam dám krok FOR I=0 TO 5 STEP 2:PRINT I:NEXT I, tak se vypíše 0, 2,4
a pro init=1: FOR I=1 TO 5 STEP 2.... se vypíše 1, 3, 5
Limit se fakt nikdy nepřekročí, takže
FOR I=1 TO 5 STEP 0.7... udělá 1, 1.7, 2.4, 3.1, 3.8 a 4.5, dál ne.
Vcelku hodně logické řešení v porovnání s dneškem :-)
PS: teď otestováno v Atari BASICu, jistota je kulomet
Diky ze doplneni a osvezeni pameti.
Kazdopadne, rikam si, ze by mozna bylo vhodnejsi ten cyklus FOR-NEXT-STEP delat spis pres do..while v C a ne se snazit jej za kazdou cenu napasovat na ceckovsky for. Myslim, ze by se tak snadneji kontroloval a prizpusobit konvencim v BASICu a treba u poli by autor nemusel myslet na to, ze musi o jednicku znizit limitu. Znamenalo by to take mene zasahu (uprav) v BASICovem kodu. Zas na druhou stranu by to mozna vedlo ke zmatkum, pri naslednem porovnavani obou verzi kodu...
Tak nějak to bylo. U jazyka C se podmínka ukončení cyklu FOR vyhodnocuje před každým průchodem.
U některých BASICů se zase podmínka ukončení cyklu vyhodnocuje až v momentě provedení příkazu NEXT. Každý takový cyklus tak proběhne minimálně jedenkrát, což nemusí být zrovna příjemné. Jedním z takových BASICů byl zrovna Atari BASIC. Ten také neznal cyklus WHILE. Nic co by se nedalo nahradit pomocí IF a GOTO.