CBASIC 2.07

1982 Digital Research Inc


Tartalom
1. Bevezetés
2. Programszerkezet
3. Nyelvi elemek
3.1. Konstansok
3.2. Szövegfüzérek
3.3. Azonosítok
3.4. Összetett adattípusok
3.5. Operátorok
3.6. Címkék
4. Alapvető I/O műveletek
4.1. A PRINT utasítás
4.2. Beviteli művelet
5. Ciklusszervező utasítások
5.1. A FOR-NEXT ciklus
5.2. WHILE-WEND ciklus
6. Feltételes utasítás
6.1. IF-THEN-ELSE
6.2. ON GOTO / ON GOSUB

7. Függvények
7.1. Függvénydefiníció
7.2. A függvények hívása
8. Adatállományok kezelése
8.1. File megnyitása
8.2. File-műveletek
9. Utasítások és függvények
9.1. Utasítások
9.2. Beépített függvények és változók
10. Fordítási direktívák és opciók
10.1. Fordítási direktívák
10.2. Fordítási opciók
10.3. Futtatás nyomkövetéssel
11. Hibakódok
11.1. A fordítás során előforduló hibák
11.2. Futásidejű figyelmeztető üzenetek
11.3. Futásidejű hibaüzenetek


1. Bevezetés

A Digital Researc BASIC implementációja legalább olyan kuriózum a BASIC nyelvjárások között, mint az IS-BASIC. Előnye, hogy CP/M alatt futtatható, így - a Turbo Pascal-hoz hasonlóan - gépfüggetlen, igaz ez egyben behatárolja képességeit is. Ettől függetlenül izgalmas, magas szintű programozási nyelvet ismerhetünk, néhány meglepő képességgel. A CBASIC logikája némileg eltér a hagyományos interpreteres BASIC nyelvjárásokétól, de így is könnyen tanulható némi IS-BASIC alapismeretek birtokában. A CBASIC rendszer nem hagyományos interpreteres BASIC implementáció. A PASCAL-hoz hasonlóan a tetszőleges szövegszerkesztő programmal megszerkesztett forráskódot először egy ún. közbenső file-ba fordíthatjuk. Ez a file nem indítható .com állomány, ezért futtatásához szükséges a CBASIC futtató környezete is. Ez a megoldás természetesen kényelmetlenebb, mint az interpreter-es BASIC, viszont cserébe a programfutás elvileg gyorsabb, gyakorlatilag néha lassabb, mint az interpreter-es IS-BASIC.
Rögtön az elején meg kell említeni hátrányként, hogy a CBASIC még nem támogatja teljes körűen a strukturált programozást, de ez a korabeli BASIC nyelvjárásokra nem is volt jellemző, csak az IS-BASIC kényeztette el az Enterprise tulajdonosokat.

Az elkészített forrásnyelvi program a CBAS programmal fordítható le. A legegyszerűbb esetben paraméterként mindössze a forrásnyelvi program nevét kell megadni kiterjesztés nélkül, automatikusan .BAS kiterjesztést feltételez a rendszer. A fordítás menetét - ha másként nem rendelkezünk - nyomon követhetjük a képernyőn és a esetleges hibák helyét is megjelöli a rendszer, valamint a hiba jellegéről egy két karakteres kódot kapunk (hibaüzenet helyett). A lefordított program csak hibátlan forrásnyelvi fordítás eredményekét jön létre, erről a fordítás végén megjelenő NO ERRORS DETECTED üzenet tájékoztat.
A lefordított program .INT kiterjesztéssel jön létre a lemezen. Ez nem indítható állomány, futtatásához egy valós idejű interpreter szükséges. Ez az eszköz a CRUN. A CRUN programmal kell futtatni a lefordított programokat, melynek paraméterként a futtatandó program nevét kell átadni, valamint egy esetleges további, szövegfüzér típusú paraméter is megadható a programnak. A program futása a STOP megnyomásával megszakítható, de csak akkor, amikor a program adatbevitelre vár. Ilyen esetben a rendszer először rákérdez, valóban meg kívánjuk szakítani a program futását.

A CBASIC rendszer használatát, a nyelv néhány tulajdonságát (és korlátait) egy példaprogrammal célszerű bemutatni, amely a megadott szám törzstényezőit adja meg hatványkitevős alakban:

REM Torzstenyezokre bontas
PRINT CHR$(12)
PRINT "Torzstenyezokre bontas"
1 PRINT
INPUT "Szam: ";SZAM
PRINT "Torzstenyezoi: ";
ELOZO=2:ELSO%=1:OSZTO=2:HATV=0:TORZST$=""
WHILE SZAM<>1
  OSZTO=2
  WHILE INT(SZAM/OSZTO)<>SZAM/OSZTO
    OSZTO=OSZTO+1
  WEND
  IF ELSO% THEN \
    ELOZO=OSZTO:ELSO%=0:TORZST$=TORZST$+STR$(OSZTO)
  IF ELOZO=OSZTO THEN \
    HATV=HATV+1 \
  ELSE \
    GOSUB 2
  SZAM=SZAM/OSZTO
  IF SZAM=1 AND ELOZO=OSZTO AND HATV>1 THEN \
    TORZST$=TORZST$+"^"+STR$(HATV)
  ELOZO=OSZTO
WEND
PRINT TORZST$
GOTO 1
2 IF HATV>1 THEN \
    TORZST$=TORZST$+"^"+STR$(HATV)+" * "+STR$(OSZTO):HATV=1 \
  ELSE \
    TORZST$=TORZST$+" * "+STR$(OSZTO)
  RETURN
END

A programot szöveges állományba kell menteni, esetünkben a TORZST.BAS névvel. Ezután a programot a

CBAS TORZST

paranccsal fordíthatjuk le. Hibátlan fordítás esetén a program TORZST.INT néven létrejön a lemezen. Ezt az alábbi paranccsal futtathatjuk:

CRUN TORZST

2. Programszerkezet

A CBASIC program programsorokból áll, a programsorok nem sorszámozottak. Egy sorban kettősponttal elválasztva több utasítást is írhatunk. kivéve a DIM, IF, DATA, END utasításokat. Az olvashatóság érdekében pedig azt is megengedett, hogy egy utasítássort több sorba írjunk, az egyes sorokat \ karakterrel elválasztva. Az alábbi két programrészlet azonos eredményt ad:

INPUT "Kerek egy szamot:";N
IF N=3 THEN PRINT "ez harmas" ELSE PRINT "ez nem harmas"
END

ugyanez tagova:

INPUT "Kerek egy szamot:";N
IF N=3 THEN \
     PRINT "ez harmas" \
ELSE \
     PRINT "ez nem harmas"
END

Az utasítássorokban az elválasztó szóközök száma nincs korlátozva a kulszavak, kifejezések, operátorok közé tetszőleges számú szóköz tehető (de legalább egy szóköz szükséges). Így az olvashatóságot szem előtt tartva megtehetjük, azt amit az IS-BASIC automatikusan megtesz helyettünk: a logikailag összetartozó blokkok sorait beljebb kezdjük (amint az a fenti példában is látható). A forrásnyelvi listában az utasításokat, függvényeket és azonosítókat kis- és nagybetűvel is írhatjuk, a fordító azokat nem különbözteti meg, csak a szövegkonstansokban. Angol gépeken természetesen a # karakter helyett a font karakter (£) használandó, ott, ahol a szintaktika szükségessé teszi.
A program felépítésére a BASIC nyelvek általánosságban nem tartalmaznak túl sok megkötést, ez igaz a CBASIC-re is. Az END kulcsszó azonban nem hagyható el és mindig a program utolsó sorában kell állnia.

3. Nyelvi elemek

3.1. Konstansok
A CBASIC - szemben az IS-BASIC-kel - kétféle számtípust ismer: egész számokat vagy valós számokat használhatunk. Adatot többféle függvény segítségével konvertálhatunk, de ha ez szükséges a CBASIC is automatikusan megteszi bizonyos esetekben (ami viszont lassítja a programfutást).

Az integer (egész) típusú konstansokat 2 byte-on tárolja a rendszer, így a -32768, +32767 zárt intervallumba kell tartozniuk. Csak egész szám lehet, tizedespontot nem tartalmazhat. Ha az előjelet elhagyjuk, a szám pozitív lesz. Túlcsordulás ellenőrzés nincs (ahogy a Pascalban sincs), erre nekünk kell figyelnünk. Az integer típusú értékek hexadecimális és bináris alakban is megadhatók. A hexadecimális alakot a szám végén álló H betűvel, a bináris alakot a B betűvel kell jelölnünk. Pélák:

A%=-99
B%=111110100000000B
C%=7D00H

Amennyiben hexadecimális alakot használunk, a szám nem kezdődhet az A..F karakterekkel Ezeknél az értékeknél 0 karakterrel kell kezdenünk a megadást. Pl. az FFH kifejezés nem helyes, helyette a 0FFH használandó!

A valós típusú értékek (tizedesekkel leírható számok) egymás utáni összetevői a következők lehetnek: előjel, egészrész, tizedespont, törtrész, kis vagy nagy E betű, kitevő. Az egészrész és törtrész decimális számjegyek sorozata. Ha az előjelet elhagyjuk, a szám pozitív lesz. Az egészrész vagy a törtrész (a tizedesponttal együtt) és a kitevő (az E betűvel együtt) elhagyható. A valós számok 8 byte-on tárolódnak BCD formában, 12 számjegy pontossággal. A legkisebb ábrázolható szám 9.99999999999E-64, a legnagyobb 9.99999999999E62. Természetesen a valós számokkal végzett műveletek lassabbak, ezért ahol lehet, célszerű egész típusú változókat használni. Ha egy kifejezés az ábrázolható tartományon kívül eső értéket venne fel futás idejű figyelmeztetést kapunk (WARNING OF), de a program futása nem szakad meg.
Valós számokat tizedes tört és hatványkitevős alakban egyaránt megadhatunk (a számok megadásakor nem tizedesvesszőt, hanem tizedespontot kell használni). Ha aritmetikai műveletben egész számot kívánunk valós számként ábrázolni, a tizedesrész nem hagyható el, függetlenül attól, hogy az nulla. Példák:

A=1.993
B=4E12
C=1.77E-9
D=.2
E=1.0

3.2. Szövegfüzérek
A karakterlánc típusú kifejezések (szövegkonstansok) karaktersorozatokat képviselnek, melyek tetszőleges ACII karakterekből állhatnak. A szövegfüzér tartalmazhat nem megjeleníthető karaktereket is (pl. a CHR függvény használatával fűzhetünk hozzá ilyen kraktereket). A karakterlánc maximális hossza 255 karakter. A karakterlánc tetszőleges karaktert (betűk, számok, írásjelek) tartalmazhatnak, melyet idézőjelek határolnak. Ha idézőjelet kívánunk használni a karakterláncban azt egy plusz idézőjellel kell jelölni:

PRINT "Most idezet kovetkezik: ""idezet"". Idezet vege."

Ha egy karakterlánc nem tartalmaz egy karaktert sem, akkor üres string-ről beszélünk.

3.3. Azonosítok
A BASIC programban az általuk létrehozott elemeknek (változóknak, függvényeknek) nevet kell adni, amivel hivatkozhatunk rájuk. Az azonosítók (változónevek) maximum 255 karakter hosszúságúak lehetnek (de gyakorlatilag csak ahány karakter elfér egy sorban), de a fordító csak az első 31 karaktere alapján különbözteti meg ezeket, ez alapján minden azonosítónak egyedinek kelllennie. Az azonosító első karaktere betű kell legyen, a többi lehet betű szám és . (pont) karakter. Az azonosító utolsó karaktere a változó típusát jelzi:

Az azonos nevű, de különböző típusú azonosítók használata megengedett, pl. a Y% és az Y két különböző változót jelöl. A változóknak nem kell kezdőértéket adni, a szám típusú változók a 0 értéket veszik fel az első hivatkozásnál, a string változók üres karaktersorozatot. Ez a korai BASIC nyelvjárásokra volt jellemző, azonban a hibakeresést nagyon megnehezíti. Példák helyes változónevekel:

POS%
Day.of.deposit%
NAME$
A1

3.4. Összetett adattípusok
Azokat az adattípusokat, melyek egy vagy több elemi adatelemből egy megadott szabály szerint épülnek fel, strukturált (összetett) adattípusnak nevezzük. A BASIC nyelvekben egyféle összetett adattípus közül "választhattunk", ez a tömb (a file BASIC-ben nem tekinthető adattípusnak). A tömb sok egyforma elemből (kompononesből) épül fel, ahol az elemek száma előre rögzített. CBASIC-ben a tömbök állhatnak egész, valós és string típusú adatelemekből is. A tömb egyes elemeit ugyanúgy használhatjuk, mintha azok egyedi változók lennének.
A tömb egy elemére annak indexére hivatkozhatunk, mely megadja, hogy a tömb hányadik elemével akarjuk a kívánt műveletet elvégezni. Sok adathalmaz elemeit azonban nem sorosan látjuk, az elem helye nem írható le egyszerűen egyetlen monoton növekvő indexel (ilyen adathalmaz pl. a sakktábla). Ilyen esetben az egyes elemek tömbben elfoglalt helyét többszintű egymásba ágyazott indexeléssel határolhatjuk be. A tömb elemeinek indexelése alapján kétféle típusú tömb létezik:

A tömb azonosítójára ugyanazok a szabályok vonatkoznak, mint amit az előző pontban megismertünk. Az azonosító után azonban zárójelben meg kall adnunk a tömb kívánt elemének indexét is. Többdimenziós tömbök esetén az indexeket vesszővel elválasztva kell megadni. A felsorolt indexek számának minden esetben meg kell egyezni a tömbdefinícióban (ld. DIM utasítás) megadott indexek számával.
Többdimenziós tömbök esetén könnyen előfordulhat, hogy annak mérete túl nagy, és nem fér bele a memóriába. Ajánlatos még a kódolás előtt megbecsülni a szükséges adatszerkezetek méretét, hiszen méretprobléma esetén az esetleges átstrukturálást könnyebb a feladat algoritmizálása előtt elvégezni. Például "csak" egy háromdimenziós egész típusú, 50x25x10 elemű tömb mérete 50x25x10x2 = 25000 byte!

3.5. Operátorok
A kifejezések operátorok és operandusok sorozatából állnak. Operátoroknak nevezzük a különféle műveleti jeleket, amelyek összekapcsolják a kifejezésben szereplő operandusokat. Az operandusok alatt változókat, konstansokat, függvényértéket értünk, de bármelyik operandus lehet egy újabb kifejezés. Egy kifejezés kiértékelése (kiszámítása) a benne szereplő összes művelet elvégzését jelenti. A CBASIC által ismert operátorok és azok műveleti sorrendje semmiféle meglepetést nem tartogat:

prioritás
Operátor
Meghatározás
1
( )
zárójel
2
^
hatványozás
Aritmetikai operátorok:
3
*, /
szorzás, osztás
4
+, -
összeadás, kivonás
Relációs operátorok:
5
<
kisebb
 
<=
kisebb vagy egyenlő
 
>
nagyobb
 
>=
nagyobb vagy egyenlő
 
=
egyenlő
 
<>
nem egyenlő
Logikai operátorok:
6
NOT
komplementálás, invertálás
7
AND
logikai ÉS
8
OR
logikai VAGY
9
XOR
logikai KIZÁRÓ VAGY

A kifejezések kiértékelésénél a következő három elsőbbségi szabályt veszi figyelembe a fordítóprogram:

Minden operátorhoz tartozik egy szabály arra vonatkozólag, hogy milyen típusú operandus állhat annak bal- illetve jobboldalán (még ha ez a szabályrendszer sokkal kevésbé szigorú, mint a Pascal-ban). A művelet - operandusaitól függően - produkál egy eredményt, aminek szintén van típusa.
Az aritmetikai operátorok integer és valós típusú számokon hajthatók vége. Ha a művelet bármely argumentuma valós típusú, az eredmény is az lesz. Ez egyfelől nagyon kényelmes, másrészt viszont figyelemmel kell lennünk rá, ha pl. egy osztás mindkét argumentuma egész típusú, az eredmény is egész típusú lesz, függetlenül attól, hogy az osztásnak van-e maradéka. Ilyenkor megoldás lehet ha egyik vagy mindkét argumentumot valós típusként adjuk meg, függetlenül attól, hogy egész típusként is ábrázolható.

22/7 = 3
22.0/7.0 = 3.14285714286

Ha a két argumentum eltérő típusú, a művelet végrehajtása több időt vesz igénybe és a fordító által generált kód is nagyobb lesz, mint két azonos típusú argumentum esetén. Természetesen a művelet végrehajtása akkor a leggyorsabb, ha mindkét argumentum egész típusú szám.
Logikai műveletek (AND, NOT, OR, XOR) egész típusú kifejezéseken értelmezhető és az eredményt is így adják. BASIC-ban logikai típus nem létezik, az összehasonlító műveletek egész típusú eredményt adnak - megállapodás szerint - a 0 jelenti a hamis, -1 (vagy bármilyen nullától különböző érték) az igaz értéket. Ha operandusnak valós típust adunk meg, az a művelet elvégzése előtt konvertálásra kerül.
A relációs operátorok különféle egymásssal kompatibilis típusú kifejezések összehasonlítására szolgálnak. Az összehasonlító műveletek szám és string típusú változókon is értelmezhetők. Az egész és valós típusú kifejezések egymással kompatibilisek, azaz összehasonlíthatóak. Típuskeveredés azonban a szövegfüzéreken végzett műveletek esetén nem megengedett, valamennyi operandusnak string típusúnak kell lennie!
Példák a logikai műveletekre:

12 AND 3 = 0
NOT -1 = 0
12 OR 3 = 15
12.4 XOR 3.2 = 15
1100B AND 0101B = 4
NOT 3H = -4
0CH OR 5H = 13
12.4 XOR 3.7 = 8

Szövegfüzéreken végzett összehasonlító műveletek esetében az összehasonlítás a karakterek ASCII kódja alapján történik. A művelet a két karakterfüzérben a megfelelő helyen álló karakterek páronkénti összevetésével történik. A vizsgálat akkor fejeződik be, ha az éppen összehasonlított karakterpár különböző karakterekből áll, vagy ha az egyig sztring végére értünk. Az első esetben az a string a "kisebb", amelyik a párból a kisebb kódú karaktert tartalmazza, a második esetben a rövidebb string a "kisebb". Ha nincs eltérő két karakterpár a két stringben és a hosszuk is azonos, akkor a két string "egyenlő".
A stringekre a relációs műveleteken túlmenően az összefűzés (jele: +) műveletet is alkalmazhatjuk. Az összefűzés csak string típusú kifejezésen értelmezhető, a művelet eredményeként keletkező stringbe az operandusok egymás után bemásolódnak. Hibát okoz, ha az eredmény 255 karakternél hosszabb string lenne.

3.6. Címkék
A CBASIC - mint már említettük - nem támogatja teljes körűen a strukturált programozást, így a GOTO, GOSUB utasítások alkalmazása egy összetettebb algoritmusban szinte elkerülhetetlen. Ugyanakkor programsorok nem sorszámozottak. A CBASIC program tetszőleges programsorát címkével láthatjuk el. A címkéket a feltétel nélküli vezérlésátadást megvalósító GOTO, GOSUB, valamint az ON GOTO, ON GOSUB utasításokban használhatjuk hivatkozásként. Fordításkor azon címkéket, melyekre egyetlen hivatkozás sincs a programban, a fordító csillaggal jelöli meg. Ez nem okoz hibát, csak jelzés, hogy a címke felesleges, törölhető a programból.
A címkék számjegyekből és a tizedespontból állhatnak. maximum 31 karakter hosszúak lehetnek. A címkék - bár számjegyekből állnak - nem számok, így nem szükséges, hogy növekvő sorrendben helyezkedjenek el a programban. Ugyanezen okból a 100 és a 100.0 két különböző címkét jelöl.

4. Alapvető I/O műveletek

Minden program egyik legalapvetőbb része a felhasználóval való kapcsolattartás. Ennek az a legnyilvánvalóbb módja, ha a program adatokat kér a felhasználótól, majd megjeleníti a futási eredményeket. Alaphelyzetben a bemeneti (input) adatok a billentyűzetről érkeznek, míg a program kimeneti (output) eredményei a képernyőn jelennek meg (ez azonban megváltoztatható, így írhatunk nyomtatóra vagy file-ba is). Minden BASIC nyelvjárásban az adatmegjelenítést a PRINT, az adatbevitelt az INPUT utasítások segítségével végezzük.

4.1. A PRINT utasítás
A PRINT utasítás kiírja a kimeneti terminálra (alapesetben a képernyőre) a megadott kifejezést. A kifejezés tetszőleges numerikus (egész vagy valós), szöveges kifejezés lehet (változónevek, aritmetikai kifejezések, szövegfüzér, függvényhívás). A szövegfüzéreket idézőjelek között kell megadni. Egyetlen PRINT utasítással akár több kifejezést is kiírathatunk, ha a kifejezések közé vessző vagy pontosvessző elválasztó karaktert teszünk. Pl.:

PRINT NAME$
PRINT "TODAY'S DATE IS: ";MONTH$;" ";DAY%;", ";YEAR%

A PRINT a kurzor által mutatott pozíciótól kezdi a kiírást, az utolsó kiírandó kifejezés után a következő sor elejére állítja a kurzort. A pontosvessző és vessző elválasztó karakterrel ezt változtathatjuk meg:

A fentieknek megfelelően az üres PRINT utasítás a következő sor elejére állítja a kurzort, a PRINT; pedig nem csinál semmit.
Ha a valós számok maradék nélkül ábrázolhatóak 12 számjegyen, tizedes tört formájában kerülnek kiíratásra, ellenkező esetben lebegőpontos alakban. Ha a kiírandó kifejezés(ek) hosszabbak, mint a képernyő szélessége (80 karakter) elvileg a következő sor elején folytatódik a kiírás. Gyakorlatilag egy üres sor kimarad (mert egy sort emel a PRINT utasítás, és egy sort az ISDOS). Ezen úgy segíthetünk, ha rövidebbre állítjuk a sorok hosszát azaz (azaz a jobb oldali margót beljebb állítjuk). Ezt úgy tehetjük meg, ha egy POKE utasítással a decimális 272-es (110H) memóriacímre elhelyezzük a kívánt oszlopszélesség értékét (pl. 79-et), majd kiadjuk a CONSOLE utasítást. Ezt a lehetőséget a kiírás formázására is felhasználhatjuk, ugyanis a sorhosszúságot bármikor megváltoztathatjuk, képernyőtörlés nélkül is.
A PRINT utasítással vezérlőkódokat is írhatunk a képernyőre, így pótolhatunk olyan hardvare-függő alapvető utasításokat, melyek a platformfüggetlen CBASIC-ből hiányoznak. Pl:

Formázott kivitel
A PRINT USING karakterrel a kiírandó kifejezések megjelenési formáját is meghatározhatjuk. Segítségével rugalmasan kialakíthatjuk a képernyőn vagy a nyomtatón az adatok megjelenési formáját. Nagy segítséget nyújt számadatok táblázatos formában történő megjelenítéséhez. Az utasítás általános alakja:

PRINT USING formátumleíró-string;kifejezés

A formátumleíró string-ben a következő karaktereket használhatjuk:

! betű karakter
& tetszőleges hosszúságú string
/ fix hosszúságú karakterlánc mezőhatároló
£ számjegy (a bezető nullákat elhagyva)
** csillag karakter beszúrása (numerikus kifejezésben)
$$ $ karakter beszúrása (numerikus kifejezésben)
. decimális pont (numerikus kifejezésben)
- bevezető vagy elválaszójel (numerikus kifejezésben)
^ exponenciális jel (numerikus kifejezésben)
, vessző (helyiérték) karakter (numerikus kifejezésben)
\ escape karakter

A PRINT USING utasítást legtöbbször a lebegőpontos számok kiírásának formázására használjuk. PRINT utasítást használva ugyanis egy végtelen tizedes tört például elrontja a megtervezett kivitel formátumát, és az áttekinthető táblázatos kivitel sem oldható meg. A kettőskereszt (illetve angol nyelvű gépeken a font (£) jellel adhatjuk meg a megjeleníteni kívánt számjegyek számát. Mindenegyes font karakter egy számjegyzet helyettesít. Ha a szám a megjelenítendő számjegyek számánál rövidebb, a kiírás jobbra igazítva történik meg. A formátumleíró stringben a pont karakterrel megadhatjuk a tizedespont helyét és az utána kiírandó tizedesek számát, így "kordában tartva" a végtelen törteket:
Néhány példa a megjelenítésre:

PRINT USING"£££,£££.££";123456.987
eredmény: 123,456.98

PRINT USING"£££,£££.££";1234.9
eredmény: 1,234,90 (jobbra igazítva)

A tizedesrészből levágja a "nem kívánt" karaktereket, de ha az egész rész hosszabb, abból nem (így elrontja a megjelenítést). Ha a szám egész része "kilóg" a számára meghatározott helyből, egy % jelölés is kerül elé.
Egyetlen PRINT USING utasítással egy táblázat egész sorának formátumát is definiálhatjuk, ha az egyes adatmezők formátumdefiníciói közé tetszőleges számú szóközt helyezünk.

X=12345.568:Y=-123.45:Z=22.0/7.0
M%=55
FORM$="£,£££.££   £,£££.££   £,£££.££   £££"
PRINT USING FORM$;X,Y,Z,M%

4.2. Beviteli művelet
Az adatok beolvasására a BASIC nyelvekben az INPUT utasítás szolgál. Alapértelmezett esetben az INPUT a billentyűzetről várja a felhasználó által megadott adatokat. A CBASIC-ben ennek általános formája:

INPUT szövegfözér; változólista

A megadott szövegfüzér informális jelleggel kiírásra kerül, majd ugyanabban a sorban kell beadnunk a kért adatot. A szövegfüzér akár el is maradhat, ilyenkor egy kérdőjel jelzi, hogy a program adatbevitelre vár.
A változólista egy, vagy több változót (vesszővel elválasztva a felsorolást) jelenthet. Ha több változó értékét kérjük be egyetlen INPUT utasítással, a felhasználónak ugyanúgy, vesszővel elválasztva kell a kívánt adatokat megadni. Ha bevitelkor nem megfelelő számú adatot ad meg a felhasználó (akár kevesebbet, akár többet), a program IMPROPER INPUT - REENTER figyelmeztetés kíséretében újra a helyes adatbevitelre vár. Ettől függetlenül nem javasolt egy INPUT utasítással több változó értékét bekérni.

Az INPUT másik formája a LINE INPUT, mellyel csak karaktersorozatba lehet beolvasni, és egy teljes sort egyetlen karakterláncba olvas be. Egy LINE INPUT-tal csak egy változót lehet beolvasni. Ennek alakja:

INPUT szövegfüzér;LINE változó$

5. Ciklusszervező utasítások

A CBASIC-ban kétféle ciklust használhatunk: FOR-NEXT ciklusokat és elöltesztelős WHILE ciklus. Hátultesztelős ciklus nem használhatunk, ezt csat GOTO-val lehet megvalósítani.

5.1. A FOR-NEXT ciklus
A FOR a BASIC nyelvjárásokban megvalósított legáltalánosabb ciklusszervező utasítás (sok korabeli BASIC-változatban nincs is más lehetőség ciklusszervezésre). Akkor használjuk, ha előre tudjuk, hogy a ciklust hányszor kell végrehajtani. A FOR ciklus növekményes ciklusnak is nevezik, mert a ciklusmag egy ciklusváltozó egymás utáni értékeire hajtódik végre egy kezdőértéktől egy végértékig. A FOR ciklus szerkezete:

FOR utasítás
   utasítások (ciklusmag)
NEXT

A FOR utasítás a FOR kulcsszóból, az azt követő ciklusváltozó azonosítójából, az értékadás-szimbólumból ( = ), a ciklusváltozó kezdeti értékét meghatározó kifejezésből, a TO kulcsszóból, a ciklusváltozó végértékét meghatározó kifejezésből, valamint a STEP kulcsszóból és a lépésközt meghatározó kifejezésből áll. Ha a kívánt lépésköz egy, a STEP és az azt követő kifejezés el is maradhat:

FOR ciklusváltozó=kifejezés1 TO kifejezés2 STEP kifejezés3
FOR ciklusváltozó=kifejezés1 TO kifejezés2

Valamennyi kifejezés valós vagy egész típusú lehet, de azonos típusúnak kell lennie mindhárom értéknek és a ciklusváltozónak (ellenkező esetben hibával megszakad a programfutás!). A lépésköz negatív is lehet, ebben az esetben a kifejezés2 értékének kisebbnek kell lennie, mint a kifejezés1 értéke. A CBASIC nem tiltja, hogy a ciklusmagban a ciklusváltozónak nyíltan értéket adjunk, de ez egyáltalán nem javasolt, kiszámíthatatlan programfutást és végtelen ciklust eredményezhet. A FOR utasításban szereplő kifejezések - a BASIC nyelvjárások és PASCAL nyelvekkel ellentétben - minden alkalommal kiértékelődnek, amikor újra a FOR utasításra kerül a vezérlés! Ezért a cikluson belül nem szabad a ciklus kezdő-, végértékét valamint a lépésközt meghatározó kifejezések értékén módosítani!
A ciklusmagot a NEXT utasítás határolja. A NEXT kulcsszót a ciklusváltozó azonosítója követi, de a változó azonosítója el is hagyható.

NEXT I%
NEXT

Amikor a programfutás a NEXT utasításra ér, a ciklusváltozó pillanatnyi értékétől függ, mi történik:

Példa:

REM Szorzotabla
FOR I%=1 TO 10
  FOR J%=1 TO 10
    PRINT USING " £££";I%*J%;
  NEXT
  PRINT
NEXT
END

A ciklusok egymásba ágyazhatóak, de a fordítottan ágyazott ciklusok használata nem megengedett (azaz először a legutolsó FOR ciklust kell lezárni). A CBASIC-ben megengedett, hogy egy NEXT utasítás egyszerre több ciklust is lezárjon. Ebben az esetben a NEXT kulcsszó után a ciklusokhoz tartozó ciklusváltozókat vesszővel elválasztva kell felsorolni:

DIM X(10,20)
FOR I%=1 TO 10
  FOR J%=1 TO 20
    X(I%,J%)=I%+J%
NEXT J%,I%
END

5.2. WHILE-WEND ciklus
WHILE...WEND ciklust akkor alkalmazhatunk, ha nem ismert előre, hányszor kell a ciklust végrehajtani, az ismétlések száma egy bizonyos feltételtől függ. Szerkezete:

WHILE kifejezés
   utasítások (ciklusmag)
WEND

Amikor a programfutás a WHILE utasításhoz ér, kiértékelődik az azt követő kifejezés:

A WHILE utasítást követő kifejezés nem lehet valós típus. Ha mégis az, konvertálásra kerül, ez a kerekítés miatt helytelen programvégrehajtást eredményezhet. Abban az esetben, ha a feltétel értéke már a ciklusba belépéskor hamis, a ciklusmag egyszer sem hajtódik végre. Ha a belépési feltétel igaz értéke hibás ciklusszervezés miatt sosem változik hamisra, végtelen ciklust kapunk. A WHILE utasítással így szükség esetén végtelen ciklust is kialakíthatunk. Ehhez csak annyit kell tennünk, ha olyan kilépési feltételt választunk, ami soha nem változik hamisra pl: WHILE 0=0
A WHILE ciklusok maximum 12 szint mélységig ágyazhatóak egymásba.

Példa:

REM primszamok
N%=1753
DIM T%(N%)
POKE 272,78:CONSOLE:PRINT CHR$(12)
FOR I%=1 TO N%
  T%(I%)=1
NEXT
I%=2
WHILE I%<=INT%(SQR(N%))
  J%=2*I%
  WHILE J%<=N%
    T%(J%)=0:J%=J%+I%
  WEND
  I%=I%+1
  WHILE T%(I%)=0
    I%=I%+1
  WEND
WEND
FOR I%=2 TO N%
  IF T%(I%) THEN PRINT USING " #####";I%;
NEXT
END

6. Feltételes utasítás
Csak a legegyszerűbb programok esetében képzelhető el, hogy a programfutás során a programsorok és utasítások sorban egymás után (szekvenciálisan) hajtódnak végre a legelső sortól az utolsóig. A programozás igazi előnye abban áll, hogy a teendőket adott helyzettől függően (a program által használt változók és kifejezések pillanatnyi értékétől függően) végezhetjük el. Ez azt jelenti, hogy a programot előre felkészítjük a lehetséges esetekre, majd programfutáskor az aktuális állapottól függően, a program különböző ágaira adódik a vezérlés.

6.1. IF-THEN-ELSE
A CBASIC-ben a program futásának elágaztatására az IF-THEN-ELSE feltételes utasítást használhatjuk. Az IF utasítás általános formája:

IF feltétel, THEN utasítások1 ELSE utasítások1

Az IF után álló feltétel egy logikai kifejezés, melynek értékétől függ, hogy melyik utasítás hajtódik végre. Ha a feltétel értéke igaz, akkor a then utáni utasítások (utasítások1), ha pedig hamis, akkor az ELSE utáni utasítások (utasítások2) kerül végrehajtásra.
A THEN és az ELSE után is több utasítás állhat, de csak egyetlen sorban írhatóak az utasítások és az IF utasításokat nem lehet egymásba ágyazni! Ez súlyos megkötés, ezért oly gyakoriak a korai BASIC nyelvekben a THEN után álló GOSUB vagy GOTO szerkezet.

Egyágú szelekciót tesz lehetővé az IF utasítás rövid alakja. Ebben hiányzik az ELSE-ág:

IF feltétel, THEN utasítások

Ennél az utasításnál, ha a feltétel nem teljesül, a vezérlés egyszerűen átadódik az IF utasítást követő utasításra.
Példa az IF utasítás használatára:

REM Osztok
PRINT "Osszes oszto keresese"
INPUT "Szam: ";SZAM
PRINT "Osztok: ";
N%=0
FOR OSZTO=2 TO INT(SZAM/2)
  DV=SZAM/OSZTO
  IF INT(DV)=DV THEN N%=N%+1:PRINT OSZTO;
NEXT
IF N%=0 THEN PRINT "Prim szam!" ELSE PRINT:PRINT "Osszesen ";N%;"db oszto."
END

A programsorok tagolását az IF-THEN szerkezeteknél különösen célszerű használni a program áttekinthetősége érdekében. Az előbbi program END előtti programsorát célszerű így írni:

IF N%=0 THEN \
  PRINT "Prim szam!" \
ELSE \
  PRINT :\
  PRINT "Osszesen ";N%;"db oszto."

6.2. ON GOTO / ON GOSUB
A CBASIC nem ismeri a többágú IF szelekciót sem az értékfüggő CASE szelekciót. Ezt korkátozott keretek között helyettesítheti a hagyományos BASIC-ben oly gyakran használatos ON kulcsszó, mely a GOTO vagy GOSUB utasításokkal együtt használatos az alábbi két formában:

ON kifejezés GOTO címke-lista
ON kifejezés GOSUB címke-lista

Ahol a kifejezés egész típusú numerikus kifejezést jelent. Ha a kifejezés valós típus, konvertálásra kerül. A címke-lista tetszőleges számú címke felsorolásából áll, ahol az egyes címkéket vessző választja el egymástól.
Az ON kulcsszó először kiszámítja a kifejezés értékét. Ha a kifejezés értéke N akkor a sorszámlistából az N-edik sorszámot véve ott folytatja a programot (a számlálás 1-től kezdődik). Ha a listában nincs N-edik elem, vagy a kifejezés string típusú, hibajelzéssel leáll a programfutás. Pl.:

ON I% GOTO 10,20,30
ON J%-1 GO SUB 12.10, 12.20, 12.30, 12.40

7. Függvények

A strukturált programozás egyik fontos eszköze az alprogramok megjelenése a magas szintű programozási nyelvekben. Az alprogram olyan névvel ellátott utasításblokk, amelyet valamilyen konkrét feladat elvégzésére készítettünk. Az alprogramot a program különböző helyeiről a neve segítségével aktivizálhatjuk (hívhatjuk). Az alprogram a hívás során végrehajtja a benne rögzített feladatot, majd visszaadja a vezérlést a hívó programnak. Az alprogramban megvalósított művelet ismételt elvégzéséhez elegendő az alprogramot újra meghívni.
Az alprogramok használatának előnye, hogy a tevékenységet leíró programrészlet csak egy példányban szerepel a programban, így programunk áttekinthetőbb lesz. Ugyancsak egyszerűbbé válik a programrészlet módosítása. Programunkat egyetlen blokkból álló sok utasítást tartalmazó programszerkezet helyett modulárisan építhetjük fel, kisebb feladatokat ellátó alprogramokra bontva.
Az magas szintű programozási nyelvekben az alprogramokat eljárások vagy függvények formájában állíthatjuk elő. A CBASIC lehetőségei e téren azonban korlátozottak: az eljárásokat nem támogatja, de függvényeket használhatunk. A függvény olyan alprogram, amely egyetlen értéked ad vissza eredményként.
A függvénydefiníció a BASIC program tetszőleges helyén állhat. A CBASIC a függvénydefiníció két formáját különbözteti meg: a hagyományos BASIC nyelvekből ismert egysoros függvénydefiníciót, és a többsoros függvénydefiníciót.

7.1. Függvénydefiníció
A függvénydefiníciót mindkét esetben a DEF kulcsszóval kezdjük. Az egysoros függvénydefiníció általános formája:

DEF FNfüggvénynév(paraméterlista)=kifejezés

Egysoros függvényeket jellemzően valamilyen matematikai számítás elvégzésére használjuk (másra nagyon nem is lehet), pl. az alábbi példa a CBASIC függvényei közül hiányzó modulóosztást (azaz az x és y osztásának egész maradéka) végzi el:

DEF FN.MOD(X,Y)=X-((INT(X/Y))*Y)

A példából is látható hogy az FN előtagot és a függvénynevet egyben kell írni, ez különbözteti meg a függvényt a változó azonosítótól. Az olvashatóság végett célszerű ezért ponttal kezdődő függvényneveket használni, mint a fenti példában.

A többsoros függvénydefiníció általános fomája:

DEF FNfüggvénynév(paraméterlista)
   utasítások
FEND

A FEND szintaktikailag lezárja a függvénydefiníciót, minden esetben a függvénydefiníció utolsó sora után kell állnia. A függvénydefiníció törzsének további követelményeknek kell megfelelnie:

A többsoros függvényre a faktoriális számítással mutatunk példát, ez egyben bemutatja, hogy a FOR utasítás másképp működik, mint a többi BASIC nyelvjárásban (A közbenső F változót kell használnunk, hogy a FOR-sorban ne rontsuk el a ciklus végértékét adó kifejezést):

DEF FN.FACT(X)
  F=X
  FOR Y=2 TO X-1
    F=F*Y
  NEXT
  IF F=0 THEN X=1
  FN.FACT=F
  RETURN
FEND

A függvények nevei
A függvénynevekre ugyanazok a formai megkötések érvényesek, mint a változó azonosítókra. Tetszőleges hosszúak lehetnek, de csak az első 31 karakter alapján különbözteti meg ezeket a rendszer (ebben a 31 karakterben már az FN jelölés is beleszámít). A név utáni azonosító karakter utal a majdan visszaadandó függvényérték típusára:

A függvény paraméterei
A függvénydefiníció fejlécében szereplő paramétereket formális paramétereknek nevezzük. Ezek határozzák meg, hogy az eljárás hívásakor hány és milyen típusú hívási paramétert kell megadnunk. A függvény törzsében a formális paraméterekre, mint helyi (lokális) változókra hivatkozhatunk. A CBASIC-ben minden más változó globális változó globális változó (hatásköre a teljes programra kiterjed), beleértve a függvény törzsében definiált változókat is! Ezért - bár a fordító lefordítja a rekurzív függvényhívást - a rekurzív algoritmus nem működik.
A függvény fejlécében a paraméterlista akár el is hagyható (a zárójelekkel együtt), ha a függvénynek nem akarunk egy paramétert sem átadni. Ezeket paraméter nélküli eljárásnak hívjuk, ezek általában mindig ugyanazt az értéket adják. Ha a paraméter nélküli eljárást mégis kívülről kívánjuk vezérelni, akkor globális változókat használhatunk az alprogram vezérlésére.

7.2. A függvények hívása
A függvényhívás csak olyan kifejezésben szerepelhet, melynek típusa kompatibilis a függvény (az általa visszaadott érték) típusával. (Az viszont itt is igaz, valós típusú kifejezést típuskeveredés esetén egésszé konvertál a rendszer.) Függvényt meghívni a nevének megadásával és a a fügvénydefiníció fejlécében előírt típusú és számu paraméter átasásával lehet. Pl:

B=FN.MOD(INT(X/Y),2)
PRINT FN.FACT(48)
C=FN.A(FN.B(X))
IF FN.CHECK%(A,B) THEN PRINT "Ok!"

Az alábbi függvény szövegfüzér formában bináris alakban adja vissza a paraméterként megadott éréket. Ha a paraméterként megadott szám 255-nél nagyobb, üres stringet ad vissza eredményül.

DEF FN.BIN$(X%)
  IF X%<256 THEN \
    B$="":B%=128 :\
    FOR N%=0 TO 7 :\
      BN%=INT(X%/B%):B$=B$+STR$(BN%) :\
      X%=X%+B%*(BN%=1):B%=B%/2 :\
    NEXT :\
    FN.BIN$=B$ \
  ELSE \
    FN.BIN$=""
  RETURN
FEND

Végezetül következzen egy összetettebb példa a függvényhívások használatára, mely kiszámítja két szám legnagyobb közös osztóját és legkisebb közös többszörösét:

REM Legnagyobb kozos oszto
DEF FN.MOD(X,Y)=X-((INT(X/Y))*Y)
DEF FN.LNKO(A,B)
  WHILE B>0
    T=B:B=FN.MOD(A,B):A=T
  WEND
  FN.LNKO=A
  RETURN
FEND
DEF FN.LKKT(A,B)=(A*B)/FN.LNKO(A,B)
DEF FN.CHECK%(X,Y)
  FN.CHECK%=1
  IF X<1 OR Y<1 OR INT(X)<>X OR INT(Y)<>Y THEN FN.CHECK%=0
  RETURN
FEND
PRINT CHR$(12)
WHILE 0=0
  INPUT "A= ";ST$
  A=VAL(ST$)
  INPUT "B= ";ST$
  B=VAL(ST$)
  IF FN.CHECK%(A,B) THEN \
    PRINT "Legnagyobb kozos oszto: ";FN.LNKO(A,B):\
    PRINT "Legkisebb kozos tobbszoros: ";FN.LKKT(A,B) \
  ELSE \
    PRINT "Pozitiv egesz szamkkat kerek!"
  PRINT
WEND
END

8. Adatállományok kezelése

A lemezen tárolt állományok a számítógép lemezegységein tárolt adathalmazokat jelölnek. A CBASIC a lemezen tárolt állományokat szerkezetük illetve a benne tárolt elérése alapján szekvenciális vagy relatív hozzáférésű file-ként kezeli. Mindkét esetben az adatok rekordokba (sorokba) szerveződnek, melyek végét soremelés/kocsivissza (13 és 10-es ASCII kódú) karaktersorozat zárja. A file végét pedig file-vége jel (EOF) jelöli.

Az adatállományok tartalmának eléréséhez az alkalmazott programozási nyelvtől függetlenül három főbb lépésre oszthatjuk:

  1. Az állomány megnyitása.
  2. Az állomány tartalmának feldolgozása fájlműveletek (olvasás, írás, relatív file esetén pozicionálás, stb.) felhasználásával.
  3. A szükséges műveletek elvégzése után az állomány lezárása.

8.1. File megnyitása
File megnyitására, attól függően, hogy új file-t kívánunk létrehozni, vagy már meglévőt megnyitni, három utasítás használható:

Bármely utasítással is nyitunk meg file-t, egy azonosítószámot kell hozzárendelni. Egyszerre maximum 20 file lehet megnyitva, az egyes nyitott állományokhoz 1-től 20-ig terjedő azonosítószámot rendelhetünk hozzá. Az összes file-művelet végzésére használható utasításban hivatkoznunk kell erre az azonosítószámra.

A CREATE utasítással legegyszerűbb alakja:

CREATE állománynév AS azonosítószám

mellyel szekvenciális file-okat nyithatunk meg. Ha relatív hozzáférésű állományt kívánunk megnyitni, meg kell adnunk a rekord hosszát is:

CREATE állománynév AS azonosítószám RECL rekordméret

Ha a file-azonosítószám nem 1 és 20 közé eső kifejezés, a program hibával leáll.
Példák:

CREATE "NEW.TXT" AS 19
CREATE "B:"+NAME$+"."+LEFT$(STR$(CURRENT.WORK%),3) AS CURRENT.WORK%

A file-műveletekhez használni kívánt puffer méretét is beállíthatjuk a BUFF és a RECS paraméterekkel. A BUFF paraméterrel a használni kívánt pufferméretet adja meg lemezszektorok számában. A RECS pedig a lemezszektorok méretét byte-ban. Mindkét opciót egyszerre használni kell, ha élni kívánunk ezzel a beállítási lehetőséggel.
Az OPEN ugyanezekkel a paraméterekkel használható:

OPEN "PHONE.DTA" AS 1 RECL 80
OPEN FILE.NAME$ AS FILE.NO% BUFF 26 RECS 128

A FILE utasításnál a file-azonosítószámot nem lehet megadni, automatikusan a következő szabad azonosítószámot kapja a megnyitott file. Ha már 20 file nyitva van, az újabb FILE utasítás hibát okoz. A BUFF és a RECS paraméterek sem használhatóak. A RECL paramétert sem kell használni, a relatív hozzáférésű file-ok megnyitása esetén a rekord hosszát zárójelben kell megadni:

FILE NAME$
FILE "USERS.DAT" (REC.LENG%)

A FILE utasítással egyszerre több file is megnyitható, ilyenkor a megnyitandó file-okat vesszővel elválasztva kell felsorolni.

FILE "1.DTA" (40), "2.DTA" (80)

8.2. File-műveletek
A file-műveletek alatt a megnyitott állományokon elvégezhető műveleteket értjük, ez általánosságban a file-ból való olvasást, vagy file-ba való írást jelentjük. A szekvenciális és relatív hozzáférésű file-okon ugyanazok az utasítások használhatóak eltérés a paraméterezésükben van.
Amikor egy állományból olvasni szeretnénk, tudnunk kell, hogy az állomány milyen típusú komponensekből áll. Az elemeket ugyanolyan típusú változóba kell beolvasni, mint amilyenből azt annak idején kiírtuk (kivéve az egész - valós típusú automatikus konverzió esetét). A lemezen lévő byte-sorozatnak nincsen típusa, azt a program "húzza rá" az adatokra.
File-ból való olvasásra a READ utasítás használható, kibővítve annak hagyományos BASIC-beli funkcióját. Szekvenciális file-ok esetében a rekordok csak sorban egymás után (a legelsőtől a legutolsóig) érhetőek el, így ebben az esetben nem használhatunk rekord-sorszámra történő hivatkozást. Az aktuális rekord következő mezőjét az alábbi utasítással olvashatjuk:

READ £file-sorszám; változó

A változónak a beolvasandó adattal azonos típusúnak kell, de valós típusú és egész típusú adat között itt is megtörténik az automatikus konverzió. Ha beolvastuk az aktuális rekord utolsó mezőjét, a következő rekord első mezője lesz az aktuális (amit a következő READ utasítás olvasni fog).
Egyszerre az aktuális rekord több mezőjét is beolvashatjuk:

READ £file-sorszám; változó1, változó2

Relatív hozzáférésű file esetében közvetlenül elérhetjük a kívánt sorszámú rekordot (a file első rekordjának a sorszáma nem 0, hanem 1):

READ £file-sorszám, rekord-sorszám; változó

READ £file-sorszám, rekord-sorszám; változó1, változó2

Ha elértük a file végét és újabb olvasási kísérletet végzünk, hibával leáll a program. A READ utasítás lehetőséget nyújt arra is, hogy egy rekord összes mezőjét egyszerre beolvassuk egyetlen string-típusú változóba. Ennek elsősorban szekvenciális (szöveges) file esetében van értelme:

READ £file-sorszám; LINE változó$

A változó csak szöveges változó lehet! A művelet elvégezhető relatív hozzáférésű file-okon is:

READ £file-sorszám, rekord-szám; LINE változó

Ha egy szekvenciális file végéhez akarunk újabb rekordokat hozzáfűzni, akkor is használnunk kell a READ utasítás, hogy a file végéig eljussunk. Ilyenkor gyorsabb a READ LINE szerkezetet használni az egyes rekordok közötti lépkedésre. A file-vége jel vizsgálatára az IF END utasítás szolgál (ld. később).
Példa a READ utasítás használatára:

OPEN "A:FILE.1" AS 1
READ #1;A$,B%
CLOSE 1
PRINT A$
PRINT B%
END

A megnyitott file aktuális rekordjába a PRINT utasítással írhatunk. A READ utasításhoz hasonlóan itt is a file azonosítószámára hivatkozhatunk a megnyitott file-ra. A szintaktika ugyanaz, mint a READ utasításnál:

PRINT £file-sorszám; változó

PRINT £file-sorszám, rekord-sorszám; változó

PRINT £file-sorszám, rekord-sorszám; változó1, változó2

Ezenkívül a PRINT USING utasítással is írhatunk file-ba.

PRINT USING formátumleíró-string; £file-sorszám; változó1, változó2

Példa a PRINT utasítás használatára:

CREATE "FILE.1" AS 1
A$="FIELD.ONE"
B%=22222
CLOSE 1
PRINT £1;A$,B%
END

Megnyitott file-t a DELETE paranccsal törölhetünk, a file-sorszámra történő hivatkozással. Egyszerre több file-t is törölhetünk, ha a DELETE utasítás után vesszővel elválasztva több azonosítószámot sorolunk fel. A file-azonosító szám elé itt nem kell fontjelet tenni. Pl.:

DELETE 1
DELETE FILE1%, FILE2%

A szükséges file-műveletek után a file-t le kell zárni. Ennek elmulasztása adatvesztéssel járhat! Ha a STOP billentyűvel megszakítjuk a programfutást, a megnyitott állományokat automatikusan bezárja a rendszer. A file lezárására a CLOSE utasítás szolgál, ahol szintén, vesszővel elválasztva több file-azonosító sorszámot is felsorolhatunk.

CLOSE FILE.NO%
CLOSE 1,2,3

A felszabaduló file-azonosítószámok újra használhatóak lesznek további file-nyitási művelethez.

Az IF END szerkezettel megvizsgálhatjuk, hogy elértük elértük-e a file végét. Ha nem ismerjük a megnyitott file hosszát, különösen fontos, hogy olvasási kísérlet előtt ellenőrizzük, van-e még további beolvasandó rekord (ellenkező esetben hibával leáll a program). Az utasítás általános formája:

IF END £file-sorszám THEN címke

Az utasítás megvizsgálja, hogy a file-végén állunk-e, ha igen, a programvégrehajtás a THEN után megadott címkével azonosított programsorral folytatódik.

9. Utasítások és függvények
Az alábbiakban felsorolásszerűen ismertetjük a CBASIC utasításait és függvényeit.

9.1. Utasítások

CALL

CALL <numerikus kif.>
A megadott memóriacímen kezdődő gépi kódú rutint hívja meg. A paraméterként megadott kifejezés valós típusú, mely automatikusan kerekítésre kerül.

CHAIN

CHAIN filenév
Átadja a vezérlést egy másik programnak. Elérési útvonalat is megadhatunk, de a kiterjesztést nem kell. A kiterjesztés minden esetben .INT kell legyen. Pl.:

CHAIN "B:PAYROLL"
CHAIN FILENAME$

CLOSE

CLOSE file-sorszám
Lezárja a korábban adott sorszámmal megnyitott file-t. Egyszerre több file-t is lezárhatunk, ha azoknak a számát veszővel elválasztva soroljuk fel. A kifejezésnek egész típusúnak kell lennie, de ha valós típusú konvertálásra kerül. Pl:

CLOSE 1
CLOSE OLDFILE%, NEWFILE%

COMMON

A COMMON utasítás után felsorolt változók a főprogram és valamennyi CHAIN utasítással hívott alprogram közös változói lesznek, azaz paraméterként átadja az egyes alprogramoknak. A COMMON utasításnak azonosformában szerepelnie kell mind a főprogram, mind az egyes alprogramok elején. Csak REM utasítással kezdődő sorok előzhetik meg. A COMMON utasítás után tetszőleges számú és típusú változót sorolhatunk fel, vesszővel elválasztva. Tömbváltozót is átadhatunk az alprogramoknak, ilyen esetben a COMMON utasításban a tömbváltozó tetszőleges indexére hivatkozhatunk, kivéve a legutolsó elemére! A COMMON utasítás nem helyettesíti a DIM utasítást, a főprogramban az alprogramok meghívása előtt deklarálni kell a tömbváltozót.
Példa :

REM Első program
COMMON A(1),X%
DIM A(10)
PRINT "Elso program":PRINT
X%=5
FOR I%=1 TO 10
  A(I%)=I%
NEXT
CHAIN "SECOND"
END

REM Második program
COMMON A(1),X%
PRINT "Masodik program"
PRINT X%
PRINT
FOR I%=1 TO 10
  PRINT A(I%)
NEXT
END

CONSOLE

Visszaállítja a képernyőt (CON: logikai egység) alapértelmezett kimeneti eszköznek, ha korábban kiadtuk az LPRINTER utasítást.
Bár a CONSOLE utasításnál - szemben az LPRINT utasítással - nem működik a WIDTH paraméter, az utasítás mégis alkalmas arra, hogy a programfutás közben bármikor megváltoztassuk a képernyő jobb margóját, így megszabva, hány karakter széles sorokban történjen a kijelzés. Ehhez annyit kell tennünk, hogy a CONSOLE utasítás kiadása előtt, egy POKE utasítással a decimális 272-es (110H) memóriacímre elhelyezzük a kívánt oszlopszélesség értékét, mely alapértelmezés szerint 80 karakter. Pl.:

POKE 272,79:CONSOLE

CREATE

File létrehozására használatos utasítás. A CREATE utasítás új állományt hoz létre, vagy a már meglévő állományt újraírja, így annak korábbi teljes tartalma elvész. Általános alakja szekvenciális file esetén:

CREATE állománynév AS azonosítószám

Relatív hozzáférésű file-ok esetében a rekordméretet is meg kell adni:

CREATE állománynév AS azonosítószám RECL rekordméret

A file-műveletekhez használni kívánt is puffer méretét is beállíthatjuk a BUFF és a RECS paraméterekkel. A BUFF paraméterrel a használni kívánt pufferméretét adja meg lemezszektorok számában. A RECS pedig a lemezszektorok méretét byte-ban. Mindkét opciót egyszerre kell használni.

DATA

A READ utasítással olvasható adatok tárolására szolgál (ld.: READ). A tetszőleges típusú tárolandó adatokat a DATA kulcsszó után veszővel elválasztva sorolhatjuk fel. A különböző típusú adatok tetszőleges sorrendben állhatnak a felsorolásban, beolvasáskor (READ) kell arról gondoskodni, hogy a sorban egymás után következő adatok megfelelő típusú változóba kerüljenek beolvasásra. A DATA utasítás más utasítással nem állhat egy sorban és a \ elválasztó karakterrel sem tördelhető több sorba. A karakterfüzér típusú adatokat nem kötelező idézőjelekkel határolni, csak akkor, ha karakterfüzér tartalmaz vesző karaktert. Pl:

DATA 332.33, 43.0089E5, "ALGORITHM"
DATA ONE, TWO, THREE, 4, 5, 6

DEF

Függvénydefiníciót bevezető utasítás. Alakja kétféle lehet, attól függően, hogy egysoros vagy többsoros függvényt kívánunk definiálni:

DEF FNfüggvénynév(paraméterlista)=kifejezés

DEF FNfüggvénynév(paraméterlista)
   utasítások
FEND

A paraméterlista elemei határozzák meg, hogy a függvény hívásakor hány és milyen típusú hívási paramétert kell megadnunk. Ha a függvénynek nincsenek paraméterei, a paraméterlista a zárójelekkel együtt elhagyható.

DELETE

DELETE file-sorszám
A DELETE parancs a megadott file-sorszámmal megnyitott file)okat) törli. Egyszerre több file-t is törölhetünk, ha a DELETE utasítás után vesszővel elválasztva több azonosítószámot sorolunk fel.

DIM

Tömb típusú változót definiál. Az utasítás általános alakja:

DIM azonosító (indexhatár-lista)

Egy, kettő, vagy három dimenziós tömböket használhatunk, melyek lehetnek akár egész, valós, vagy string típusúak. Az indexhatár-lista ennek megfelelően egy, kettő, vagy három elemet tartalmazhat, vesszővel elválasztva. A tömb alsó indexhatárát nem adhatjuk meg, az minden esetben 0. A karakterláncok hossza sem nem adható meg, az minden esetben maximum 255 karakter. A numerikus típusú tömb-változók elemei deklarálás után a 0 kezdőértéket veszik fel, a string típusúak üres stringet. Egy DIM utasítással több tömbváltozót is deklarálhatunk, azokat vesszővel elválasztva kell felsorolni. Pl:

DIM A(10)
DIM B%(2,5,10)
DIM X(A%(I%),M%,N%),Y(MAX%)

END

A program végét jelöli a fordítónak. Az END utasítás a program utolsó sorában kell, hogy álljon. Más utasítással nem lehet egy sorba írni!

FEND

A többsoros függvénydefiníciót szintaktikailag lezáró utasítás. Minden esetben a függvénydefiníció utolsó sora után kell állnia.

FILE

File megnyitására vagy létrehozására használatos utasítás. Általános alakja:

FILE állománynév

A megnyitott file automatikusan a következő szabad azonosítószámot kapja. A BUFF és a RECS paraméterek itt nem használhatóak. A RECL paramétert sem kell használni, a relatív hozzáférésű file-ok megnyitása esetén a rekord hosszát zárójelben kell megadni. A FILE utasítással egyszerre több file is megnyitható, ilyenkor a megnyitandó file-okat vesszővel elválasztva kell felsorolni.

FOR

Ciklusszervező utasítás. Általános alakja:

FOR ciklusváltozó=kifejezés1 TO kifejezés2 STEP kifejezés3

A kifejezés1 a ciklusváltozó kezdeti értékét adja meg, a kifejezés2 a ciklusváltozó végértékét adja meg. A kifejezés3 a ciklus lépésköz, amivel a ciklusváltozó értéke növekszik a ciklusmag lefutása után. Valamennyi kifejezés valós vagy egész típusú lehet, de azonos típusúnak kell lennie mindhárom értéknek és a ciklusváltozónak (ellenkező esetben hibával megszakad a programfutás!). A lépésköz negatív is lehet, ebben az esetben a kifejezés2 értékének kisebbnek kell lennie, mint a kifejezés1 értéke. Ha a kívánt lépésköz egy, a STEP és az azt követő kifejezés el is maradhat. A FOR utasításban szereplő kifejezések - a BASIC nyelvjárások és PASCAL nyelvekkel ellentétben - minden alkalommal kiértékelődnek, amikor újra a FOR utasításra kerül a vezérlés!
A ciklusmagot a NEXT utasítás zárja.

GOSUB

Feltétel nélküli vezérlésátadás a címkével azonosított szubrutinnak. Sok BASIC változatban - eljárások híján - a GOSUB az egyetlen módja, a szubrutinok szervezésére, így sajnos a CBASIC-ben is szinte szükségszerű a használata. Az utasítás formája kétféle lehet:

GOSUB címke
GO SUB címke

A címkeazonosítónak létező címkére kell mutatnia. Az utasítás hatására a programvégrehajtás a címkével azonosított szubrutin végrehajtásával folytatódik. A szubrutinból a RETURN utasítással térhetünk vissza, ilyenkor a programvégrehajtást a GOSUB-ot követő utasítással folytatódik.
Megengedett, hogy egy szubrutin meghívja önmagát (rekurzió). A rekurzió maximális mélysége 20 szint lehet.

GOTO

Feltétel nélküli vezérlésátadás. Az utasítás formája kétféle lehet:

GOTO címke
GO TO címke

A címkeazonosítónak létező címkére kell mutatnia. Az utasítás hatására a programvégrehajtás annál a sornál folytatódik, amelyet a címke kijelöl.

IF

Feltételes utasítás, Egy vagy kétágú szelekciót tesz lehetővé. Általános alakjai:

IF feltétel, THEN utasítások1 ELSE utasítások1
IF feltétel, THEN utasítások

Az IF után álló feltétel egy logikai kifejezés, melynek értékétől függ, hogy melyik utasítás hajtódik végre. Ha a feltétel értéke igaz, akkor a then utáni utasítások (utasítások1), ha pedig hamis, akkor az else utáni utasítások (utasítások2) kerül végrehajtásra. Ha hiányzik az ELSE ág és a feltétel nem teljesül, a vezérlés egyszerűen átadódik az IF utasítást követő utasításra.
A THEN és az ELSE után is több utasítás állhat, de csak egyetlen sorban írhatóak az utasítások és az IF utasítások nem ágyazható egymásba.

IF END

Az IF END szerkezettel megvizsgálhatjuk, hogy elértük elértük-e a file végét. Az utasítás általános formája:

IF END £file-sorszám THEN címke

Az utasítás megvizsgálja, hogy a file-végén állunk-e, ha igen, a programvégrehajtás a THEN után megadott címkével azonosított programsorral folytatódik.

INITIALIZE

A program futása közbeni lemezcserét teszi lehetővé. Az utasítást lemezcsere után (pl. miután a program felszólította rá a felhasználót), kell kiadni. Az utasítás kiadása pillanatában nem lehet nyitott file, mert különben adatvesztést okozhat.

INPUT

Adatokat olvas be a konzolról a megadott változókba. Általános formája:

INPUT szövegfözér; változólista

A megadott szövegfüzér informális jelleggel kiírásra kerül, majd ugyanabban a sorban kell beadnunk a kért adatot. A szövegfüzér akár el is maradhat, ilyenkor egy kérdőjel jelzi, hogy a program adatbevitelre vár.
A változólista egy, vagy több változót (vesszővel elválasztva a felsorolást) jelenthet. Ha több változó értékét kérjük be egyetlen INPUT utasítással, a felhasználónak ugyanúgy, vesszővel elválasztva kell a kívánt adatokat megadni. A változók tetszőleges típusúak lehetnek, ha nem a megfelelő típusú értéket adja a felhasználó, az automatikusan konvertálásra kerül.
Az INPUT másik formája a LINE INPUT, mellyel csak karaktersorozatba lehet beolvasni, és egy teljes sort egyetlen karakterláncba olvas be. Egy LINE INPUT-tal csak egy változót lehet beolvasni. Ennek alakja: INPUT szövegfüzér;LINE változó-azonosító
Példák:

INPUT "What file, please?";FILE.NAME$
INPUT "Enter address: ";LINE ADDR$

LET

Értékadó utasítás, mely a LET kulcsszóból, a változónévből, az értékadás szimbólumból (egyenlőségjel) és egy kifejezésből áll. A LET kulcsszó elhagyható. Az értékadó utasítás végrehajtása során először kiértékelődik az értékadási szimbólum jobb oldalán álló kifejezés, és annak értékét megkapja az azonosítónevével meghatározott változó.
Egy függvénydefiníción belül szerepelnie kell legalább egy értékadó utasításnak, melyben a változót azonosító karaktersorozat a függvény azonosítója. Ez az értékadás a függvény értékét adja meg (vagyis azt az adatot, amely hozzáférhetővé válik a függvényhívás helyén.
Értékadáskor a kifejezés típusának a változó típusával azonosnak kell lennie, de a valós és egész típusú számok között a típuskeveredés megengedett, ilyenkor, a kifejezés értéke konvertálásra kerül a változó típusára. Logikai értékadásnak nevezzük, ha az értékadó szimbólum bal oldalán egész típusú változó áll, a jobb oldalon pedig logikai kifejezés. Ilyenkor a logikai kifejezés igaz értéke esetén a változó értéke -1 lesz, hamis értéke esetén nulla. Pl.:

LET A=B+C
INDEX%=INDEX%+1
date$=month$+" "+day$+", "+year$
X(3,POINTER%)=7.32*Y+X(2,3)

LPRINTER

Az összes PRINT utasítással végrehajtott kimeneti műveletet a nyomtatóra (az LST: logikai egységre) irányítja. A kulcsszó után használható a WIDTH, mellyel az egy sorba nyomtatandó karakterek számát állíthatjuk be a nyomtató paramétereinek függvényében 0 és 132 között. Ha nullát adunk meg, a sor végi automatikus kocsivisszafutás / soremelés nem történik meg, annak a programnak kell gondoskodnia. A WIDTH után álló kifejezés egész típusú, ha valós típust adtunk meg, automatikusan konvertálásra kerül. Pl:

LPRINTER
LPRINTER WIDTH 80

NEXT

A FOR ciklust lezáró utasítás. Formája kétféle lehet:

NEXT
NEXT ciklusváltozó

A NEXT után több ciklusváltozót felsorolva (veszővel elválasztva) egyszerre több FOR ciklus végét is jelölheti egyetlen NEXT utasítás. Ilyenkor először mindig a legutoljára indított ciklust kell lezárni, a fordítottan ágyazott ciklusok nem megengedettek.

ON

ON kulcsszó a GOTO vagy GOSUB utasításokkal együtt használatos az alábbi két formában:

ON kifejezés GOTO címke-lista
ON kifejezés GOSUB címke-lista

Ahol a kifejezés egész típusú numerikus kifejezést jelent. Ha a kifejezés valós típus, konvertálásra kerül. A címke-lista tetszőleges számú címke felsorolásából áll, ahol az egyes címkéket vessző választja el egymástól.
Az ON kulcsszó először kiszámítja a kifejezés értékét. Ha a kifejezés értéke N akkor a sorszámlistából az N-edik sorszámot véve ott folytatja a programot (a számlálás 1-től kezdődik). Ha a listában nincs N-edik elem, vagy a kifejezés string típusú, hibajelzéssel leáll a programfutás.

OPEN

File megnyitására használatos utasítás. Általános alakja szekvenciális file esetén:

OPEN állománynév AS azonosítószám

Relatív hozzáférésű file-ok esetében a rekordméretet is meg kell adni:

OPEN állománynév AS azonosítószám RECL rekordméret

A file-műveletekhez használni kívánt is puffer méretét is beállíthatjuk a BUFF és a RECS paraméterekkel. A BUFF paraméterrel a használni kívánt pufferméretét adja meg lemezszektorok számában. A RECS pedig a lemezszektorok méretét byte-ban. Mindkét opciót egyszerre kell használni.

OUT

OUT n,m
A processzor n számú portjára kiküldi m ért éket. Mindkét kifejezésnek egész típusúnak kell lennie és a 0-255 értéktartományba kell esnie. Az utasítás elfogad ennél nagyobb értékeket is, mert csak a kifejezések alsó byte-ját veszi figyelembe. Ha valamelyik kifejezés valós típusú, konvertálásra kerül. Pl.:

OUT 191,14

POKE

POKE cím,érték
A megadott értéket helyezi el a kijelölt tárcímre. A cím valós típusú kifejezés, az érték egész típusú. Ha az érték mégis valós, konvertálásra kerül. Ha a memóriacímen tárolni kívánt érték 255-nél nagyobb, nem okoz hibát, mert a kifejezés alsó byte-ja kerül csak értelmezésre.

PRINT

A PRINT utasítás kiírja a kimeneti terminálra (alapesetben a képernyőre) a megadott numerikus vagy string típusú kifejezést. A PRINT a kurzor által mutatott pozíciótól kezdi a kiírást, az utolsó kiírandó kifejezés után a következő sor elejére állítja a kurzort. A kifejezések után írt pontosvessző hatására azonban a kurzor az aktuális pozíciójában marad, míg a vessző hatására a kurzor az aktuális sor következő tabulátor pozíciójába ugrik.
A PRINT utasítás a hagyományos BASIC értelmezése mellett file-műveletek elvégzésére is alkalmas, ha a PRINT utasítás után egy megnyitott file azonosítószámára hivatkozhatunk a következő formákban:

PRINT £file-sorszám; változó-lista
PRINT £file-sorszám, rekord-sorszám; változó-lista

PRINT USING

PRINT USING formátumleíró-string;kifejezés
A megadott kifejezés vagy kifejezéseket a formátumleíró-string szerinti formátumban írja ki a kimeneti konzolra.

RANDOMIZE

A véletlenszám-generátor kiindulóértékét inicializálja, enélkül ugyanis az egyes lefuttatások alkalmával mindig ugyanazokat a számokat állítaná elő. Elegendő egyszer kiadni, használatát meg kell előznie legalább egy INPUT utasításnak, hogy hatást fejtsen ki. (Az utasítások többségének végrehajtási ideje ugyanis konstans, az INPUT utasításé viszont nem.)

READ

READ változólista
A DATA utasítással tárolt adatokat olvassuk be a megadott változóba. Egy READ utasítással egyszerre több változó értékét is beolvashatjuk, ha a változókat vesszővel elválasztva felsoroljuk. Ha egész típusú változóba akarunk valós típusú értéket beolvasni, az automatikusan konvertálásra kerül.
A READ utasítás - kibővítve annak hagyományos funkcióját - file-ból való olvasásra is szolgál. Ilyenkor a READ utasítás után egy megnyitott file azonosítószámára kell hivatkoznunk, illetve relatív hozzáférésű file esetén az olvasni kívánt rekord-sorszámára is hivatkozni kell:

READ Lfile-sorszám; változó1, változó2
READ Lfile-sorszám, rekord-sorszám; változó

A READ utasítás lehetőséget nyújt arra is, hogy egy rekord összes mezőjét egyszerre beolvassuk egyetlen string-típusú változóba.

READ Lfile-sorszám; LINE változó$

REM

A REM kulcsszótól kezdődően a sor végéig terjedő karaktereket a fordító figyelmen ívül hagyja. A REM kulcsszó után legalább egy szóköznek kell állnia, a sor többi részében tetszőleges megjegyzést helyezhetünk el.

RESTORE

A következő READ utasítás által olvasandó DATA adatsort választja ki. A DATA sor a címkéjével azonosítható, így csak olyan DATA sort választhatunk ki, ami címkéve rendelkezik. Alakja:

RESTORE címke

RETURN

A GOSUB-bal vagy ON GOSUB-bal hívott szubrutinokból, valamint a többsoros függvényekből való visszatérésre szolgál. Ha GOSUB vagy GOSUB nélkül áll a RETURN, vagy függvénydefiníción kívül használjuk, hibaüzenettel leáll a program.

SAVEMEM

Lefoglalja a megadott számú byte-ot a memóriában és betölti oda a file-névvel azonosított gépikódú szubrutint. Alakja:

SAVEMEM konstans, filenév

A konstans a lefoglalandó memóriaterület byte-okban. Ha kevesebb, mint 128 byte-ot adunk meg, az utasítás lefoglalja a területet, de nem tölti be a rutint. Ha file-név helyett üres stringet adunk meg, az utasítás csak lefoglalja a memóriaterületet. A betöltött szubrutint a CALL utasítással hívhatjuk meg. Egy CBASIC programban csak egyszer szerepelhet az utasítás!

STOP

Befejezi a program futását. Az összes nyitott file lezárásra kerül, a nyomtatópuffert kiüríti, a vezérlés visszakerül az operációs rendszerhez. A STOP utasítás program tetszőlegese helyén elhelyezhető, akár több helyen is (az END csak a program legutolsó sorában állhat).

WEND

A WHILE ciklust lezáró utasítás.

WHILE

Ciklusszervező utasítás. Általános alakja:

WHILE kifejezés

Ha a kifejezés értéke hamis, befejeződik a ciklus végrehajtása (ezért a feltételtől függően, lehet, hogy egyszer sem fut le a ciklusmag), ellenkező eseten a ciklusmag lefutása után a ciklus végét jelző WEND kulcsszóról újra WHILE utasításra kerül a vezérlés és az azt követő kifejezés kiértékelése következik.
A WHILE utasítást követő kifejezés nem lehet valós típus. Ha mégis az, konvertálásra kerül, ez a kerekítés miatt helytelen programvégrehajtást eredményezhet.

9.2. Beépített függvények és változók

ABS

Visszaadja x abszolút értékét. Ha x=0, akkor a föggvény a 0 értéket adja. A függvény valós típusú értéket ad vissza, ha x integer típusú, végrehajtás előtt konvertálásra kerül. P.l:

POSX=ABS(X)

ASC

A függvény paramétereként megadott string típusú kifejezés ASCII kódját adja vissza integer típusú értékben. Ha a string kifejezés több karakterből áll, akkor annak első karakterének ASCII kódját adja meg. Pl.:

X%=ASC("ABC")

utasítás hatására x-be 65 (azaz a nagy A betű ASCII kódja) kerül.

ATN

A valós típusú paraméter arkusz tangensét adja vissza radiánban. Az atn a tangens inverzfüggvénye, ami azt jelenti, hogy a=tan(atn(a)) fennáll minden olyan a értékre, amely a atan() értelmezési tartományába esik. Pl.:

PRINT ATN(3.14/2)

CHR$

A megadott egész típusú numerikus kifejezésnek megfelelő ASCII kódú karaktert adja. Ha a numerikus kifejezés valós típusú, konvertálásra kerül. Pl.:

CHAR$=CHR(65)

COMMAND$

A CBASIC lehetővé teszi, hogy amikor elindítjuk a programunkat, átadjunk annak egy string típusú paramétert. A COMMAND$ függvény visszaadja ezt a paramétert (természetesen string típusként). A programnak átadott paraméter tartalmazhat szóközöket, de visszaadott string elejéről a szóközöket eltávolítja a rendszer, a kisbetűket pedig nagybetűkké alakítja. Ha a program indításakor nem adunk meg paramétert a programnak, a COMMAND$ üres stringet ad vissza.
A következő példaprogram kilistázza a megadott nevű file-t:

REM List
IF COMMAND$="" THEN PRINT "Filename is missing!":STOP
PRINT "Listing ";COMMAND$;"...":PRINT
OPEN COMMAND$ AS 1
1 READ #1;LINE A$
PRINT A$
IF END #1 THEN 2
GOTO 1
2 CLOSE 1
END

A programot a

CRUN LIST filenév

paranccsal kell elindítani. Ha a programot pl. a CRUN LIST a:proba.txt paranccsal indítjuk, a COMMAND$ függvény értéke: A:PROBA.TXT

CONCHAR%

Beolvas egy billentyűt a billentyűzetről. Ha nincs lenyomott billentyű, várakozik. Az eredmény a billentyűhöz tartozó ASCII kód, egész típusú változóban. A lenyomott karakter képe a képernyőn is megjelenik (a kurzor marad az aktuális sorban). Pl.:

1 I%=CONCHAR%
PRINT " = CHR";I%
IF I%<>27 THEN GOTO 1
END

CONSTAT%

A kimeneti konzol állapotát kérdezi. A függvény egész típusú értéket ad: ha a konzol készen áll, a -1 (igaz) logikai értéket adja vissza, ha nem áll készen, a 0 (hamis) értéket kapjuk. A függvény használatának jelentősége akkor van, ha nyomtatót állítottunk be kimeneti eszköznek.

COS

A radiánban megadott valós típusú kifejezés koszinuszát adja meg. Ha a paraméterként megadott kifejezés egész típusú, konvertálásra kerül. Pl.:

IF COS(ANGLE)=0.0 THEN VERTICAL%=TRUE%

EXP

Az "e" az x-edik hatványon függvény. Az "e" (=2.71828...) a természetes logaritmus bázisa. A paraméter valós típusú, ha a paraméterként megadott kifejezés egész típusú, konvertálásra kerül. Pl.:

Y=A*EXP(BX%)

FLOAT

Egész típusú értéket valós típusba konvertál. Pl.:

Y=FLOAT(I%)

FRE

Megadja a még rendelkezésre álló szabad tárterületet, valós típusú értékben. A FRE függvénynek nincs paramétere. A BASIC programjaink és az adatok számára kb. 39 kbyte marad szabadon. Pl.:

X=FRE

INP

A processzor paraméterként megadott számú portjáról olvas be egy byte-ot. A kifejezésnek egész típusúnak kell lennie és a 0-255 értéktartományba kell esnie. Az utasítás elfogad ennél nagyobb értékeket is, mert csak a kifejezések alsó byte-ját veszi figyelembe. Ha a kifejezés valós típusú, konvertálásra kerül. Pl:

Y%=INP(P%)

INT

A paraméterként megadott valós típusú kifejezés egész részét adja, a tizedespont utáni rész törli. Nem kerekít tehát, az INT(3.1) és az INT(3.9) függbényhívás is 3-at ad eredményül. Ha a paraméterként megadott kifejezés egész típusú, konvertálásra kerül. Pl.:

IF (X/2)-INT(X/2)=0 THEN PRINT "paros szam" ELSE PRINT "paratlan szam"

INT%

Valós típusú értéket konvertál egész típusúba. Ha paraméterként megadott kifejezés egész típusú, konvertálásra kerül, bár ekkor értelemszerűen értelmetlen a függvény alkalmazása. Pl.:

y%=INT%(x)

LEFT$

Az első paraméterben megadott string típusú kifejezés, megadott számú első n karakterét adja vissza. A második paraméter egész típusú kifejezés, ha mégis valós, akkor konvertálásra kerül. Ha ezen kifejezés értéke 0, üres stringet kapunk, ha negatív, futás idejű hibát okoz. Pl.:

ST$=("Enterprise",5)

utasítás hatására ST$ változóba az "Enter" szövefüzér kerül.

LEN

A megadott szövegfüzérben lévő karakterek számát adja meg (a szóközöket is beleszámítva) egész típusú értékben. Ha a string üres string, a függvény a 0 értéket adja vissza. Pl:

I%=LEN(A$)

utasítás hatására, ha A$ az "Enterprise" szövegfüzért tartalmmazza, I% változó értéke 10 lesz.

LOG

Természetes, azaz "e" alapú logaritmus. A függvény paramétere és a visszaadott érték valós típusú. Ha a paraméter egész típus, konvertálásra kerül. Pl:

y=LOG(x)

MATCH

Egy szövegrészlet első előfordulását keresi meg egy másik szövegfüzérben. (Funkciója hasonló az IS-BASIC POS függvényéhez, de annál valamivel sokrétűbb. Formája:

J%=MATCH(A$,B$,I%)

Ahol A$ ás B$ szövegfüzér típusú kifejezés, I% és a függvény visszaadot eredménye egész típus.
A függvény a B$ szövegfüzérben keresi meg A$ szövegrészlet első előfordulását. A keresés az A% szövegfüzér I%-ik karakterétől kezdődik. I% egész típusú kifejezés, ha valós típusú kifejezést adunk meg, konvertálásra kerül. Ha I% nulla, vagy negatív, az hibát okoz. Ha B$ üres string, vagy ha a keresés eredménytelen (B% nem tartalmazza a keresett szövegrészletet), akkor a visszaadott érték 0.
A$-ban nem csak konkrét szövegrészletet adhatunk meg, hanem más helyettesítő karaktereket is:

Példák:

függvény erednény
MATCH("is","Now is the",1)
5
MATCH("££","October 8, 1976",1)
12
MATCH("\£","123£45",1)
4
MATCH("ABCD","ABC",1)
0
MATCH("!","1.77E-9",1)
5
MID$

Egy szövegfüzér megadott részletét adja. A függvény általános formája:

B$=MID$(A$,I%,J%)

A függvény A$ szövegfüzér I%-ik karakterétől ad vissza J% számú karaktert. I% és J% egész típusú adat, ha valós típust adunk meg, konvertálásra kerül. Ha I% nagyobb, mint az A$-ban lévő karakterek száma, eredményképpen üres stringet kapunk.

Példák:

függvény erednény
MID$("ABCDEFGHIJKL",5,3)
"EFG"

DIGIT$ = MID$(OBJECT$,POS%,1)

PEEK

A megadott Z80-as memóriacímen lévő értéket adja. A függvény paramétere valós típus, mely automatikusan kerekítésre kerül. Az eredmény egész típusú.

MEMORY%=PEEK(100)

POS

Megadja, hogy a kurzor a képernyő (vagy a nyomtató) hányadik oszlopában áll. Pl. a

PRINT "123456";POS

utasítás hatására a POS függvény 7-et ad vissza.

RENAME

A függvény állományok átnevezésére szolgál. Általános alakja:

RENAME(kifejezés1,kifejezés2)

Mindkét kifejezés szöveges típusú, és érvényes file-nevet kell definiálniuk. Az első paraméter a file új neve, a második az átnevezni kívánt file. A függvény a művelet eredményét egész típusú értékkel jelenti: -1 érték jelenti a sikeres műveletet, 0 a sikertelent. A függvény függvény mivoltát kérdőjelezi meg, hogy ha az átnevezni kívánt file nem létezik, hibajelzéssel leáll a program. Az átnevezni kívánt állomány nem lehet megnyitva, ha mégis nyitott állományt kívánunk átnevezni, automatikusan lezárásra kerül. Pl.:

I%=RENAME(NEWFILE$,OLDILE$)
PRINT RENAME("DEMO.BAS",DEMO.BAK")

RIGHT$

Egy szövegfüzér jobb oldali végéről megadott számú karaktert ad vissza. A hívás formája:

B$=RIGHT$(A$,I%)

Ahol A$ szövegfüzér, I% egész típusú kifejezés. Ha I% valós kifejezés, konvertálásra kerül. Ha I% negatív, hibával leáll a program, ha I% értéke 0, üres stringet kapunk eredményül. Egyéb esetben B$-ba A$ utolsó I% számú karaktere kerül. Ha I% értéke nagyobb, mint az A$-ban tárolt karakterek száma, az egész stringet kapjuk eredményül. Pl a

PRINT RIGHT("feketetea",3)

utasítás a "tea" szót írja ki.

RND

Nulla és egy közötti (ál)véletlenszámot állít elő, de az 1-et nem éri el soha. Az eredmény természetesen valós típus. Pl:

X=RND

KOCKA=INT%(RND*6)+1

SADD

A függvény megadja egy string típusú változó memóriában elfoglalt kezdőcímét. A visszaadott integer típusú érték a szövegfüzér hosszbyte-jára mutat. Ha a kifejezés üres string, a visszaadott érték nulla. Pl:

I%=SADD(NAME$)

SGN

A paraméterként megadott valós típusú kifejezés előjelétől függő értéket ad vissza. (Ha egész típusú kifejezést adunk meg, az konvertálásra kerül.) Ha a paraméter negatív, akkor a függvény értéke -1, ha pozitív, akkor +1 lesz. Ha pedig a paraméter értéke nulla, akkor a függvény értéke is nulla. Az eredmény egész típusú. Pl:

I%=SGN(A)

SIN

A radiánban megadott valós típusú kifejezés szinuszát adja meg. Ha a paraméterként megadott kifejezés egész típusú, konvertálásra kerül. Az eredmény szintén valós típusú. Pl.:

FACTOR(Z)=SIN(A-B/C)

SIZE

Elvileg a megadott file méretét adná meg, gyakorlatilag nem működik.

SQR

Négyzetgyök függvény. A megadott valós típusú kifejezés négyzetgyökét adja. Ha a paraméter egész típusú, konvertálásra kerül. Az eredmény szintén valós típusú. Ha a paraméter negatív, a program futása közben figyelmeztető üzenetet kapunk, és a függvény a paraméter abszolút értékének négyzetgyökét adja vissza.

Y=SQR(X)

STR$

A paraméterként megadott valós vagy egész típusú számot karaktersorozattá alakítja, és ha szükséges a "-' előjelet is elé teszi.

A$=STR$(X)

TAB

PRINT TAB(kifejezés)
A TAB csak a PRINT utasításban használható. A kimeneti konzolon (jellemzően a képernyőn használjuk) a numerikus kifejezés értékének oszlopába állítja a kurzort. A TAB szám típusú kifejezést vár, ha valós típust adunk meg, kerekítésre kerül. Ha a kifejezés értéke kisebb, vagy egyenlő, mint a kurzor pillanatnyi pozíciója, a kurzor először a következő sor elejére áll. Ha a kifejezés értéke nagyobb, mint az aktuális kimeneti eszközön értelmezhető sorszélesség, hibajelzést kapunk.

TAN

A radiánban megadott valós típusú kifejezés tangensét adja meg. Ha a paraméterként megadott kifejezés egész típusú, konvertálásra kerül. Pl.:

Y=TAN(X)

UCASE$

Tetszőleges karakterekből álló szövegfüzérben az összes kisbetűt nagybetűre cseréli. Pl a

PRINT UCASE$("Enterprise")

utasítás az "ENTERPRISE" szövegfüzért írja ki.

VAL

Egy karaktersorozatot alakít át valós típusú számmá. A STR$ függvény ellentettje. A átalakítást a karaktersorozat első nem szám karakteréig végzi. Pl.:

X=VAL(A$)

VARPTR

A megadott változó memóriabeli címét adja vissza egész típusú értékként. Pl.:

I%=VARPTR(A)

 

10. Fordítási direktívák és opciók
A fordítás menetét a forrásnyelvi programban elhelyezett direktívákkal és a fordításkor megadható opciókkal is vezérelhetjük. Az interpreteres BASIC változatokkal szemben a CBASIC hátrányban van a hibakeresés terén. A legtöbb opció éppen ezért a hibakeresést hivatott segíteni.

10.1. Fordítási direktívák
A fordítási direktívák nem részei a CBASIC nyelvnek, azok a fordítót illetve a fordítás menetét vezérlik. A fordítási direktívákat bárhol elhelyezhetjük a programban, de csak sor elején. A fordító onnan ismeri fel a neki szóló direktívákat, hogy egy % jellel kezdődnek:

10.2. Fordítási opciók
A fordítás menetét nem csak a forrásprogramban elhelyezett direktívákkal vezérelhetjük. A fordítóprogramnak parancssori paramétereket is átadhatunk. Az opciókat a fordítandó tárgyprogram neve után kell megadni:

CBAS filenév $opció-betűjele

A használható opciók:

B Kikapcsolja a forrásprogram fordítás közbeni listázását. Csak az esetleges hibaüzenetek jelennek meg és a fordítás eredménye.
C A fordító csak szintaktikai ellenőrzést jajt végre, lefordított program nem jön létre.
D
A BASIC más BASIC nyelvjárásokhoz hasonlóan nem különbözteti meg a kisbetűket és nagybetűket. A fordító minden azonosítót és kulcsszót nagybetűsít. A D opció bekapcsolt állapota mellett a nagybetűsítés elmarad, a kis és nagybetűket megkülönbözteti a rendszer. Így a "sum" és a "SUM" azonosító két különböző változót fog jelölni, a kulcsszavakat pedig nagybetűvel kell írni a forrásprogramban. A kapcsoló használata maximálisan ellenjavalt.
E
A kapcsoló a hibakeresésben nyújt segítséget. Az E opcióval lefordított programot hibakereső TRACE módban is futtathatjuk. Ilyenkor programfutás közben kijelzi a rendszer, hányadik sort hajtja éppen végre, és az esetleges futásidejű hiba bekövetkeztekor is kijelzi, hányadik sorban következett be a hiba. Az opciót csak hibakeresés közben van értelme használni, mert az így lefordított program mérete nagyobb lesz, a végrehajtása pedig lassabb.
F A fordítás menetét és eredményét nyomtatóra küldi.
G
A fordítás menetét és eredményét lemezre menti egy .lst kiterjesztésű szöveges állományba (a file neve azonos a forrásnyelvi program nevével). A file-ba ugyanazok az információk kerülnek, mint amik a szokásos fordításkor a képernyőn is megjelennek, azaz a program listája is (akkor is, ha használjuk a B opciót is).

A $-jel után akár több opciót is felsorolhatunk. Pl.:

CBAS LNKO $BG

10.3. Futtatás nyomkövetéssel
A nyomkövetés a hibakeresést hivatott segíteni. Az E opcióval lefordított programot nyomkövetéses módban is elindíthatjuk, ha a programot a következő formában futtatjuk:

CBAS filenév TRACE sor1,sor2

Bekapcsolt nyomkövetés esetén az éppen végrehajtott utasítássor sorszáma is kijelzésre kerül (AT LINE ... üzenettel), a program üzenetei mellett. A nyomkövetés a sor1-dik sortól kezdődik és a sor2-ik sornál befejeződik (de a program fut tovább). A nyomkövetés befejező sorszáma el is hagyható, ilyenkor a program befejezéséig bekapcsolva marad a nyomkövetés. Ha a sor1 kezdősorszám is hiányzik, a nyomkövetés az egész program futása alatt bekapcsolva marad. A nyomkövetés csak olyan programok esetében működik, melyek az E fordítási opcióval lettek lefordítva!

11. Hibakódok

A fordító és a valós idejű interpreter nem ad hibaüzeneteket, mindössze egy két karakterből álló hibakóddal közli a hiba okát.

11.1. A fordítás során előforduló hibák
Az alábbi hibák közül bármelyik is előfordul a fordítás során, a művelet eredménytelen marad.

BF  
BN Érvénytelen numerikus érték.
CF A fordító COMMON utasítás vár a láncolt program leső sorában.
CI Érvénytelen file-név az %INCLUDE direktívában.
CS A COMMON utasításnak a program első sorában kell lennie.
CV
Érvénytelen változó-lista a COMMON utasításban.
DL Kétszer vagy többször használt címke. DL kódú hibát okoz az is, ha nem definiált függvényt hívunk, vagy hibásan indexelt tömbváltozóra hivatkozás.
DP A használni kívánt változó azonosító már definiált tömbváltozó azonosítója. Ezt az üzenete kapjuk, ha egy tömbváltozó azonosítója után nincs indexhivatkozás, vagy az indexek száma nem megfelelő.
FA Az értékadó utasítás bal oldalán függvényhívás szerepel.
FD Már használt függvénynevet akarunk lefoglalni egy újabb DEF utasításban.
FE A FOR utasításban szereplő kifejezések eltérő típusúak.
FI A FOR utasítás ciklusváltója nem lehet tömb eleme.
FN A függvényhívás nem a megfelelő számú paramétart tartalmaz.
FP A függvényhívás paramétere nem megfelelő típusú.
FU A hívott függvény nem definiált.
IE  
IF  
IP Az INPUT utasításban szereplő string elejéről vagy végéről hiányzik a határoló idézőjel.
IS Nem definiált tömbváltozóra próbáltunk hivatkozni.
IT Ismeretlen direktíva, vagy a direktívában megadott paraméterek nem megfelelőek.
IU  
MC Egy változóazonosítót többször definiáltunk a COMMON utasításban.
MF String típusú kifejezést használtunk ott, ahol a program numerikus kifejezést vár.
MM Nem megengedett típuskeveredés. A kifejezésben szám és string típusú kifejezések is szerepelnek.
MS Numerikus kifejezést használtunk ott, ahol a program string típusú kifejezést vár. (A szám és a szöveges változótípusok között nincs automatikus konverzió.)
ND A FEND utasításhoz nem tartozik DEF függvénydefiníció.
NI A NEXT utasítás után nem megfelelő ciklusváltozó áll.
NU A NEXT utasításhoz nem tartozik FOR ciklus.
OF A többsoros függvénydefinícióban, azon kívülre kíséreltünk meg vezérlésátadást.
OO Több, mint 40 ON GOTO / ON GOSUB utasítás szerepel a programban.
PM A többsoros függvénydefinícióban újabb DEF utasítás szerepel. A függvények nem ágyazhatóak egymásba.
RF  
SD A programban többször akarjuk használni a SAVEMEM utasítást.
SE A feldolgozás alatt álló sor szintaktikai hibát tartalmaz.
SF A SAVEME utasítás második paraméterének - ez a betöltendő file neve - numerikus kifejezést adtunk meg.
SN A tömbváltozóra történő hivatkozás nem a megfelelő számú tömbindexet tartalmazza.
SO A kifejezés túl bonyolult. Megoldás lehet, ha a kifejezés részelemeit több utasítássorban számíjuk ki.
TO A változók tárolására szolgáló memóriaterület megtelt. A program túl nagy, vagy túl sok változót használunk (jellemzően többdimenziós tömbök definiálásakor fordul elő).
UL Nem létező címkére hivatkoztunk (GOTO vagy GOSUB utasításban).
US  
VO A kifejezésben szereplő változónevek túl hosszúak.
WE A WHILE utasítást követő kifejezés nem szám típusú.
WN Több mint 12 WHILE ciklust ágyaztunk egymásba.
WU A WEND utasításhoz nem tartozik WHILE ciklus.

11.2. Futásidejű figyelmeztető üzenetek
A figyelmeztető üzenetek a futás közben bevárt nem várt eseményekre figyelmeztetnek (WARNING hibakód üzenetet lapunk), de a program futását nem szakítják meg. A műveletek illetve a programfutás eredményeit viszont befolyásolják.

DZ
Nullával való osztás történet. Az osztás "eredménye" az adott típuson ábrázolható legnagyobb szám lesz, azaz valós típus esetén 9.99999999999E^62, egész típus esetén 32767.
FL
A READ LINE utasítás 255 karakternél hosszabb sort olvasott be. A művelet paramétereként megadott szöveges változóba az első 255 karakter kerül, a többit figyelmen kívül hagyja.
LN
A LOG (természetes, azaz "e" alapú logaritmus) függvény paramétereként nullát, vagy negatív értéket adtunk meg. A művelet azt az értéket fogja visszaadni, amit megadtunk paraméterként.
NE  
OF
A valós típusú művelet eredménye nagyobb, mint a CBASIC-ben ábrázolható legnagyobb valós típusú szám. A művelet eredménye a legnagyobb ábrázolható szám lesz.
SQ
Az SQR (négyzetgyök) függvény paramétereként negatív értéket adtunk meg. A műveletet a paraméter abszolút értékén hajtja végre a rendszer.

11.3. Futásidejű hibaüzenetek
A futás közben bekövetkezett hibák hatására a program futtatása félbeszakad. A megnyitott file-okat automatikusan lezárja a rendszer.

AC Az ASC függvényhívás paramétere üres string.
AE  
BN Az OPEN vagy CREATE utasításban a BUFF paraméter értéke nagyobb, mint a maximálisan használható 52.
CC A láncolt program nagyobb, mint a programkód számára felhasználható terület mérete. (Használjuk a %CHAIN direktívát.)
CD  
CE  
CF A láncolt program több valós típusú állandót használ, mint ami elfér az erre a célra fenntartott memóriaterületen. (Használjuk a %CHAIN direktívát.)
CP A láncolt program több változót használ, mint ami elfér az erre a célra fenntartott memóriaterületen. (Használjuk a %CHAIN direktívát.)
CS  
CU A CLOSE utasítás paramétereként megadott file-azonosítóhoz nem tartozik nyitott file.
DF Az OPEN vagy CREATE parancs olyan file-azonosítót akar használni, amihez tartozik megnyitott file.
DU A DELETE utasítás paramétereként megadott file-azonosítóhoz nem tartozik nyitott file.
DW A lemezmeghajtóban lévő lemezen nincs elegendő hely a file-írási művelet elvégzéséhez és nincs IF END utasítás a megnyitott file-hoz.
EF Olvasási műveletet kíséreltünk meg olyan file-ra, melynek elértük a végét és nincs IF END utasítás sem a megnyitott file-hoz.
ER  
FR Megnyitott állományt kíséreltünk meg átnevezni.
FU Olyan állományon akartunk file-művelet végezni, ami nincs megnyitva.
IF Érvénytelen file-név.
IR Relatív hozzáférésű file olvasása vagy írása közben nulla értéket adtunk meg rekord-sorszámnak.
IV  
IX Többsoros függvénydefinícióban elértük a FEND utasítást RETURN utasítás nélkül.
ME A file létrehozása vagy a file végéhez írás művelet eredménytelen. (Betelt a lemez, vagy a főkönyvtárban nincs több file-nak hely.)
MP A MATCH függvény harmadik paraméterének értéke nulla vagy negatív.
NC  
NF A megadott file-azonosítószám egynél kisebb, vagy nullánál nagyobb és / vagy már van 20 megnyitott file.
NM Betelt a memória.
NN  
OD
READ utasítást próbálunk végrehajtani úgy, hogy a programban nincsenek DATA sorok, vagy már az utolsó DATA sort is végigolvastuk. (Ilyen esetben a RETORE utasítás használandó.)
OE  
OI
Az ON ... GOTO vagy ON ... GOSUB utasításokban a kifejezés értéke egynél kisebb, vagy nagyobb, mint a sorszámlistában szereplő ugrási lehetőségek száma.
OM
A program futása során betelt a változók és pufferek számára fenntartott dinamikus memória. Munkaterületet szabadíthatunk fel, ha korlátozzuk az egyszerre nyitva tartott állományok számát, a már nem használt szöveges változóknak üres stringet adunk értékül (már használt változót megszüntetni a program futása alatt nem lehet), vagy ha többdimenziós tömböket az algoritmus átszervezésével kisebbre definiáljuk.
QE Idézőjelet próbáltunk írni file-ba. File-ba idézőjelet csak PRINT USING utasítással lehet.
RB  
RE A file-vége elérése után file olvasási kísérlet történt.
RF  
RG A RETURN utasítás GOSUB nélkül áll.
RU Relatív olvasást vagy írás kíséreltünk meg egy szekvenciális file-ban.
SB Tartományon kívüli tömbindex.
SL A szövegfüzérek összefűzése művelet eredménye 255 karakternél hosszabb.
SO A SAVEMEM utasításban paraméterként megadott file nem található.
SS A MID$ függvény második paramétere nulla vagy negatív szám, vagy a LEFT$, RIGHT$, MID$ függvény utolsó paramétereként negatív értéket adtunk meg.
TL A TAB függvény paramétereként egynél kisebb értéket adtunk meg.
UN A PRINT USING utasításban üres formátumleíró-stringet próbáltunk használni, vagy a formátumleíró string utolsó karaktere escape karakter.
WR Kísérlet történt arra, hogy egy szekvenciális fie-ba írjunk, mielőtt elértük volna a file-vége jelet.

Vissza