Maly pruvodce Basicem na ZX spectru http://www.fi.muni.cz/usr/jkucera/pv109/2004/xnovotn3speccy.htm
PS: Na tom emulatoru se neda poradne pracovat, dokud nedam oknu fuse rezim porad na popredi a pod to si nehodim http://www.nvg.ntnu.no/sinclair/computers/zxspectrum/gallery/images/speckeys_jpg.jpg
--- C
if (podminka)
telo bloku
else if (podminka)
telo bloku
else
telo bloku
--- ZX spectrum
10 INPUT a
20 PRINT „Zadane cislo je ";
30 if a < 10 THEN PRINT "mensi jak“;
40 if a = 10 THEN PRINT „presne“;
50 if a > 10 THEN PRINT „vesti jak“;
60 PRINT " deset.„
…
10 INPUT a
20 PRINT "Zadane cislo je ";“mensi jak" AND a < 10;„presne“ AND a=10;„vesti jak“ AND a>10;" deset.„: REM prvne vyraz a pak retezec mi to nevzalo
--- C
for (v1;v2;v3) příkaz
--- ZX spectrum
10 FOR a = 2 TO 5 STEP 0.5
20 PRINT a,;
30 NEXT a: PRINT
--- C
double v1;
while (v2) {
příkaz
v3;
}
--- ZX spectrum
10 LET a=2
20 IF a>5 THEN GO TO 40
30 PRINT a,;: LET a=a+.5: GO TO 20
…
10 LET a=2: IF a>5 THEN GOTO 30
20 PRINT a,;: LET a=a+.5: IF a<=5 THEN GO TO 20
…
10 LET a=2: GO TO 30
20 PRINT a,;: LET a=a+.5
30 IF a<=5 THEN GO TO 20
--- C
v1;
do {
příkaz
v3;
} while (v2)
--- ZX spectrum
10 LET a=2
20 PRINT a,;: LET a=a+.5: IF a<=5 THEN GO TO 20
--- C
switch (n) {
case 0: // následující kód se provede, je-li n nulové
…
case 1: // následující kód se provede je-li n==1
// a také je-li n nulové, protože jsme nepoužili break
…
break;
case 2: // následující kód se provede jen je-li n==2
…
}
--- ZX spectrum
10 LET break=60: INPUT a
20 IF a>2 OR a<0 THEN GO TO 50
30 GO TO 40+a
40 PRINT "<0..0.5)“: GO TO break
41 PRINT „<0.5..1.5)“: GO TO break
42 PRINT „<1.5..2>“: GO TO break
50 PRINT „jinak“
…
10 LET break=60: INPUT a
20 IF a<>INT a OR a>2 OR a<0 THEN GO TO 50
30 GO TO 40+a
40 PRINT „urcite jen nula“
41 PRINT „nula nebo jedna“: GO TO break
42 PRINT „dva“: GO TO break
50 PRINT „jinak“
--- ZX spectrum
10 LET top=15: DIM z(top): DIM p(top): REM Zasobnik pomocnych promenych a parametru rekurzivni Fce
20 INPUT „Zadej faktorial: ";p(top): GO SUB 100: PRINT z(top): STOP
100 REM Simulace "rekurzivni Fce“
110 PRINT top;„: p – ";p(top);“, z – „;z(top)
120 IF p(top)=0 THEN LET z(top)=1: RETURN
130 REM Snizeni vrcholu zasobniku, nacteni parametru, zavolani Fce, obnoveni vrcholu
140 IF top=1 THEN PRINT "Preteceni zasobniku!“: STOP
150 LET top=top-1: LET p(top)=top(top-1)-1: GO SUB 100: LET top=top+1
160 LET z(top)=p(top)*z(top-1)
170 RETURN
…
10 LET top=15: DIM p(top): REM Zasobnik parametru rekurzivni Fce
20 INPUT „Zadej faktorial: ";p(top): GO SUB 100: PRINT rekurze: STOP
100 REM Simulace "rekurzivni Fce“
110 PRINT top;„: p – ";p(top)
120 IF p(top)=0 THEN LET rekurze=1: RETURN
130 REM Snizeni vrcholu zasobniku, nacteni parametru, zavolani Fce, obnoveni vrcholu
140 IF top=1 THEN PRINT "Preteceni zasobniku!“: STOP
150 LET top=top-1: LET p(top)=top(top-1)-1: GO SUB 100: LET top=top+1
160 LET rekurze=p(top)*rekurze
170 RETURN
ZX umel vytvaret vlastni prikazy? Tak na tohle si uz vubec nepamatuji…
http://scratchpad.wikia.com/wiki/DEF_FN
Snad jedine matne… ze to stejne nefungovalo.. protoze ta fce MIN je tam zapsana spatne.
10 DEF FN Q(x,y)=x-(x-y)*(x>y)
15 INPUT „Zadej cislo:“;a,„a druhy:“;b
20 PRINT „Mensi z ";a;“ a „;b;“ je:";FN Q(a,b)
Jo s tim se daly delat kouzla, ale asi by spouste lidem vstavaly vlasy hruzou kdyby videli v goto goniometrickou fci .)
Byl jsem hrozne prekvapeny kdyz jsem se prvne docetl ze GO TO je spatny. A pri uceni PASCALU jsem se divil co na tom vsichni maji, vzdyt to vsechno mohu udelat i v BASICU. A chvilku to trvalo nez jsem zjistil ze programy se nepisi pro hrani. A proto prehlednost/citelnost/rychlost vyvoje/udrzby je dulezita a dostal do krve while, do-loop kde goto maskuji pomoci continue a break. Jediny rozdil oproti goto je, ze je hned videt kam program pokracuje.
Ale obcas mi stejne jeste goto chybi… bylo to takovy svobodny. .) Nejaky break(3) co by vyskocil ze tri smycek, nebo nedavno jsem psal nejaky brain pro deskovou hru a v jednom okamziku zjistim ze cas vyprsel a potrebuji opustit rekurzivni fci z libovolneho zanoreni. Neprisel jsem na to, jak to bez hrani se zasobnikem udelat, tak jsem musel vracet konstantu „cas_vyprsel“ a hned jsem udelal chybu, kdyz se mi ta konstanta ulozila jako platna hodnota pozice do hashe .), protoze jsem v casti s hashem taky volal rekurzivne fci pro killer variantu a zapomnel vlozit po obdrzeni vysledku kontrolu jestli jen nemam opustit fci.
jj, ze zacatku jsem mel podobne pocity. Prvni program v Placalu, co nam ucitel napsal na tabuli, pocital obvod kruznice a jak je u Pascalu zvykem, bylo to minimalne na 10 radku (samanske tance typu: program x(input, output), var, begin, end s teckou atd.) a ja si porad rikal, co na tom vsichni vidi kdyz se da jednoduse napsat:
10 ? "Zadej r:" 20 INPUT A 30 ? "Obvod="; A*2*3.1415
Samozrejme ze s prichodem slozitejsich datovych struktur a algoritmu se vyhoda strukturovanych jazyku nakonec ukazala :-)
<hereze>
Jeste k tomu clanku „GOTO considered harmful“ od Dijkstry. Trosku me pripadne, ze nekteri autori a autority ten clanek snad vubec necetli (nebo nepochopili) a vyvozuji zavery pouze z titulku toho clanku :-)
Protoze ono GOTO samo o sobe spatne neni, je to proste prikaz, pomoci nehoz se daji vytvaret klasicke strukturovane prikazy (ktere Dijstra samozrejme prosazuje), tj. WHILE a REPEAT-UNTIL.
Problem GOTO je v tom, ze s nim clovek (krome „cisteho“ pouziti) muze prasit, ale to muze i v nekterych jinych „cistych“ jazycich – treba menit hodnotu ridici promene smycky FOR (nekdy to pravda nejde, zalezi na jazyku), pouzivat longjmp() atd.
GOTO navic neni nejvetsi problem BASICu, tim je (IMHO) existence pouze globalnich promennych a jejich automaticka inicializace. Pokud by toto bylo vyreseno (napriklad zmenou prikazu GOSUB/RETURN s novym prikazem pro zacatek podprogramu), byl by i klasicky BASIC s cislovanymi radky a GOTO pouzitelny i pro psani vetsich aplikaci.
</hereze>