Vlákno názorů k článku Programovací jazyk BASIC na osmibitových mikropočítačích (2) od _dworkin - Maly pruvodce Basicem na ZX spectru http://www.fi.muni.cz/usr/jkucera/pv109/2004/xnovotn3speccy.htm PS: Na...

  • Článek je starý, nové názory již nelze přidávat.
  • 17. 6. 2010 15:37

    _dworkin (neregistrovaný)

    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)*re­kurze
    170 RETURN

  • 17. 6. 2010 15:49

    _dworkin (neregistrovaný)

    140 IF top=1 THEN PRINT "Podteceni zasobniku!“: STOP
    150 LET top=top-1: LET p(top)=p(top-1)-1: GO SUB 100: LET top=top+1

  • 17. 6. 2010 16:43

    _dworkin (neregistrovaný)

    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)

  • 17. 6. 2010 18:54

    Pavel Tišnovský
    Zlatý podporovatel

    Jak se divam, taky jsi pouzival „pocitane GOTO“, to byla docela dobra ficurka :-) (stejne jako pocitane GOSUB).

  • 17. 6. 2010 22:25

    _dworkin (neregistrovaný)

    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/ci­telnost/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.

  • 17. 6. 2010 22:36

    _dworkin (neregistrovaný)

    Asi by se to dalo prirovnat jako stavet z cihel nebo panelu. Stejne se vetsinou bude delat normalni stena tak proc to komplikovat. Velikost oken a dveri bude taky vetsinou standardni. A proc to rovnou neudelat z pripravenych unibunek?

  • 18. 6. 2010 12:09

    Pavel Tišnovský
    Zlatý podporovatel

    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 :-)

  • 18. 6. 2010 12:11

    Pavel Tišnovský
    Zlatý podporovatel

    jeste s tou rekurzi – v BASICech (tech klasickych) se moc nedala pouzit (ne ze by nesla, ale zasobnik pro GOSUB/RETURN byval maly a promenne globalni), takze tam se problem vyresil hned pri navrhu algoritmu :-)

  • 18. 6. 2010 12:30

    Pavel Tišnovský
    Zlatý podporovatel

    <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>

  • 18. 6. 2010 14:52

    _r3450n_ (neregistrovaný)

    To jo. GOTO byla funkce za vsechny drobne, hlavne IF…GOTO :) Zjednodusovalo to tolik veci, ale kdyz pak editoval ten program nekdo jinej jako ten co ho psal, tak byl z toho pekne v prdeli :D