Bevezetés – a QBASIC programozási nyelv
A Microsoft által
kifejlesztett Quick Basic
programozási nyelv (QBasic)
átmenetet képez az egyszerű BASIC és a magas szintű, strukturált programnyelvek
között. INTERPRETER típusú nyelv.
A
QBasic nem elsősorban adatfeldolgozás céljából kifejlesztett
programnyelv.
A
forrásnyelvi QBasic program kiterjesztése .BAS Ez csak a fejlesztő rendszeréből
futtatható.
Lehetséges .EXE tárgyprogrammá fordítani, ha
rendelkezünk a teljes, fejlesztői környezettel.
1. A QBasic programozási nyelv
elemei
1.1. Program utasítások,
parancsok
A programok utasítások
sorozatából állnak. Ezen utasítások végrehajtása lehet soros ( lásd pl. a BATCH
programok) vagy az utasítások által vezérelt sorrendű (feltételek alapján
"elugrik" egy adott program részlethez).
A program utasításai, a
PARANCS -ok általában angol nyelven értelmezhető rövid szavak, amelyeket a
parancs körülményeit meghatározó PARAMÉTER -ek követnek. A Parancsokban továbbá
különböző írásjelek is találhatók, amelyek a parancs szakaszolását,
sorrendiségét szabályozzák.
A parancs általános
szerkezete:
A parancsok szintaktikai
elemei:
PARANCS -
parancs szó (szavak), utasítás - a program írása közben ha helyesen adtuk meg és
a
programsor egyéb
eleme is hibátlan, akkor a fordító program automatikusan átváltja
NAGY betűre
paraméter / ek
/ - a
parancs paraméterei, bármilyen program elem lehet (azonosító, adat, jel,
változó, stb.)
[ ]
- a szögletes zárójelen
belüli parancs elemek nem kötelezőek, csak megadhatók;
| - függőleges vonal: a felsorolt parancs elemek közül egy elem kötelező, de csak az egyik szerepelhet,
Példák
parancsokra: (
ismeretükre szükség lesz !)
Paraméter
nélküli parancsok:
CLS
- a képernyő tartalmát törli, utána a kurzor a bal felső sarokban
áll
REM
- ezzel az utasítással kezdődő program sor nem hajtódik végre a futás
során
PRINT
- egy üres sort kiíró, (másképp egy sort lefelé léptető)
utasítás
RANDOMIZE
TIMER - ha szükséges, az véletlen szám
generáló utasítást (RND) előzi meg
END
- a programot záró utasítás
Paraméteres
parancsok:
PRINT paraméter1,
paraméter2, … - a paraméter tetszőleges darab
szám illetve szöveg lehet
SLEEP mp - az 'mp' paraméterben megadott másodpercig
felfüggeszti a program futását
BEEP mp, Hz - 'mp' másodpercig, 'Hz' hangmagasságú hangot generál a
hangszórón
TAB (n) - 'n'
darab helyközzel jobbra lépteti a kurzort illetve a kiíratás helyét n = 1 -
255
SPC (n)
- 'n' darab helyköz karaktert (Spc) ír ki n = 0 - 32767
1.2. A programban használt adatok
megjelenési formái
1.21.
Változók
A változók, a memóriában
tárolt névvel és típus
azonosítóval rendelkező
adatok, amelyeknek tartalma a program futása során veszi fel konkrét értékét,
(gyakran többször is változik az értéke).
A
változó konkrét tartalma a Qbasic -ben numerikus érték vagy karakter sorozat lehet.
A változók a program futása
során, az értékadó utasítások,
vagy beviteli, INPUT utasítások által kapják meg, illetve
változtatják meg értéküket.
A QBasic a változó nevében nem engedélyez
ékezetes betűket, csak az angol
ABC betűit.
(Az
értékadó és INPUT utasítással
később részletesen foglalkozunk.)
* Megjegyzés: a változó neveket meg lehet adni csupa
NAGY BETŰVEL és vEGyesEn is de a program
szerkesztése közben ez erősen zavaró lehet. Ha egy változó többször is szerepel a
programban (értéket kap majd később ki is íratjuk) akkor a fordító
program úgyis azonos
(csupa NAGY vagy csupa kis betű) formára konvertálja.
pl. Szam = 1 : PRINT Szam
- a fordító elfogadja
AdAt = 23 : k = Szam + adat - a
fordító előbb átalakítja az értékadást is : adat = 23 –ra
és ezután futtatja a
programot
pl. A következő program részlet
változóinak ( a , N,
nev$ ) tartalma és
változásai:
a = 6
- az a nevű változó tartalma, most 6
N = a * a
- az N nevű változó tartalma, most 36
nev$ = "Lajos"
- a nev$ nevű változó tartalma, most Lajos
a = 33
- az a
nevű változó tartalma ettől az utasítástól a program számára 33
PRINT a,
N, nev$ - A kiírás: 33 36 Lajos lesz, vagyis a változók
aktuális értékei
N = N / 2
- A korábban 36 értékű N új értéke 18 lesz ettől a program sortól
kezdődően. ( rekurzív értékadás, lásd később )
A változók típusai: ( a QBasic nyelvben ! )
INTEGER : EGÉSZ SZÁM 2 byte hosszon
tárolt, a tizedest kerekíti
és úgy számol vele !!!
- 32768 és + 32767 számtartományba esik
( -216
és 216-1
)
Jelölése:
%
pl. a%, D%, szam%
pl. a% = 154, b% = -67, DE ! c% = 43.2 kiírva: 43
és D = c%
* 1 PRINT D à
43
x% =
43.7 kiírva: 44
és D = c%
* 1 PRINT D à
44
LONG : EGÉSZ
SZÁM
4 byte hosszon tárolt, a tizedest
kerekíti és úgy számol vele
!!!
-
2147483648 és + 2147483647 ) számtartományba esik ( -232 és
232-1 )
Jelölése: &
pl. b&, X&, valtozo&
DE !
Kerekítés itt is.
pl. x& = 2 733 300 vagyis 32767 –nél nagyobb egész
szám
SINGLE :
EGYSZERES PONTOSSÁGÚ 4 byte hosszon
tárolt, tizedes értéket is tartalmazó,
7 számjegy
hosszú szám
Jelölése:
!
pl. c!, H!, adat!
A
számtartomány igen kicsi és igen nagy , pozitív és negatív számokra terjed ki,
pontosan nem mondható meg, hogy ez mekkora. Azokat a számokat, amelyeket nem tud már
7 számjegyen pontosan ábrázolni,
(a
9 999 999 –nél nagyobb, a
.000 000 1-nél illetve -9
999 999 és -.000 000 1 –nél kisebb számokat), a szám normál alakjában
fogja kiírni.
( 9 999
999 +1 kiírása: 1E+07 azaz 1 * 107 vagy -.000000032 kiírása: -3.2E-8 azaz -3,2 * 10-8 )
pl. d! =
1234.567; f ! =
1.234567; g! = 1.234567E+12,
Ne csodálkozz !
x! =
9999999
y! =
5
v! =
10
z! = x! +
y! -
kiírása: 1E+07
a szám pontos értéke viszont:
10 000 004
csak a 7 értékes
jegy kiíratási korlát miatt a legkisebb helyiértékű 4 –est nem tudja kiírni, de ha kell
számol vele
w! = x! +
v!
- kiírása: 1.000001E+07 a szám pontos értéke: 10 000 010 amelyből a
7 számjegy kiírható,
tehát megjeleníti a pontos értéket
DOUBLE : KÉTSZERES
PONTOSSÁGÚ 8 byte hosszon
tárolt, tizedes értéket is
tartalmazó,
15 számjegy hosszú
szám
Jelölése: # pl. d#; F#; szam#
A számtartományról itt sincs
sok értelme beszélni, jóval nagyobb illetve kisebb lehet, mint a Single típusnál. A Single típusnál szereplő
megállapítások ennél is érvényesek, az eltérés annyi, hogy a 15 darab számjegy
dupla pontosságot eredményez a számítások során és ennyi számjegyet tud
kiíratni.
pl.
k# = 234567.89012345; maxi#
= 1.23456789012345E+300
Fontos ! A numerikus változók
típusát nem kötelező jelölni
(szintaktikailag nem hibás), viszont ha
nem deklaráljuk (írjuk elő) a szám típusát, az alapértelmezésben SINGLE típusú lesz.
STRING :
KARAKTER LÁNC maximum 32768 karaktert tartalmazhat egy
változó
Jelölése: $ pl. s$; V$; masik$
Karakter alatt az összes
betűt, számot és egyéb, megjeleníthető ASCII karaktert értjük. Az " (idézőjel) karakter megjelenítését
kerüljük, mert az külön "trükközést" igényel, mivel az " " pár egy vezérlő karakter a programban.
A String típusú változó értékadása során a jobb oldali karakter sorozatot
kötelező idézőjelek közé tenni.
pl. k$ = "név" , Kiiras$ = "ADATBÁZIS" , v1$ = "Első változó"
A QBasic –ben nem önálló
adattípusok: (más programozási nyelvben azonban
léteznek)
Dátum: a QBasic –ben csak lekérdezni
lehet a rendszerdátumot, illetve egy STRING típusú változóban
szabályos dátum formátumú
adat adható meg, amely az új rendszer dátum lesz !
Dátum lekérdezés
parancsa: PRINT DATE$
eredményül 05-23-2001 formátumot
kapjuk
Figyelem ! Megadható „hh-nn-éé” formában is de ekkor az évszázad 19éé
lesz.
A –
(kötőjel) jel helyett használható a
/ jel
is.
Ha dátum formájú változót akarunk használni a QBasic programban, akkor inkább egy STRING értékadással kell azt definiálni.
Logikai
érték: ( tartalma csak IGAZ vagy HAMIS lehet )
A logikai
műveletek léteznek a Qbasic –ben és ott értelmezettek a logikai értéket ( -1 és
0 ) képviselő változók, de külön "logikai típusú" változót a Qbasic nem
ismer.
Célszerű egy INTEGER vagy esetleg
egy STRING típusú változóként
definiálni, amelybe a program csak kétféle értéket vagy karaktert enged beírni.
Erre rákérdezve lehet majd a logikai (kétértékű) állapot tartalmát
megismerni.
Jegyezzük jól meg, hogy a QBasic –ben az IGAZ : -1 a HAMIS : 0 számjegyként jelenik meg.
1.22. Állandók
/ konstans / :
Olyan numerikus vagy karakteres érték,
amelynek nincs név azonosítója, hanem egyszerűen csak egy
numerikus vagy
szöveges ADAT.
Az értékadás jobb
oldalán szerepelhet csak, mint a változó pillanatnyi értéke, vagy mint egy
számítás tényezője (hozzáadandó, szorozni kell vele, stb.) illetve mint egy
felirat (kiírandó szöveg a képernyőn).
Szerepelhet még feltétel
vizsgálatokban mint amihez hasonlítani kell egy változó értékét, ekkor
tetszőleges, hogy melyik oldalon áll.
Fontos, hogy beírásakor az
érték megfeleljen a numerikus illetve karakteres
típusoknak.
pl. k =
15 b$ = "Floppy"
- a 15 és a "Floppy" konstansok
kkerulet = 2 * R * 3.14
- a 2 és a 3.14 konstansok
AB$ = c$ + "méter"
- a "méter" konstans
IF x < 8 THEN PRINT "Kisebb" - a 8 és
a "Kisebb"
konstansok
A QBasic –ben definiálhatunk a teljes programra érvényes konstans értéket, amelyet nem kell mindig beírni, hanem a nevével hivatkozhatunk rá. Az előnye az, hogy újból nem kaphat az adott nevű és típusú változó új értéket: A fordítóprogram figyelmeztet az újbóli értékadásra és nem lehet végrehajtani..
pl. Sokszor kell a Pi 6 tizedes pontosságú értékét (3,141593 ) használnunk a számítások
során.
Ebben az esetben a program elején egy utasítással konstansként
definiáljuk és később már csak a
nevét kell beírni a megfelelő helyre egy képletben.
CONST pi =
3.141593
. . .
kterulet = R ^ 2 *
pi
kkerulet = 2 * R *
pi
pi = 3.14
- a fordítóprogram ezt az értékadást a CONST után
letiltja!
1.23.
Kifejezések
A kifejezések,
konstansokból, változókból, függvényekből és ezeket összekötő műveleti
jelekből álló
(értéket kiszámító aritmetikai képletek vagy string
műveletek).
Kifejezések csak az értékadó
utasítás bal oldalán állhatnak. Feltétel vizsgálatban is szerepelhetnek
kifejezések, ekkor nincs jelentősége, hogy jobb vagy bal oldalon
állnak-e.
pl.
X = (
a + b ) * 2 - sin(x) / d ^ 5
- az egyenlőségjeltől jobbra egy kifejezés
van
A$ = X$ + "füle"
- ha X$ = "kutya", az A$ értéke "kutyafüle" lesz
Műveleti jelek
: ( ) [ zárójel ]; + [ összeadás ]; - [ kivonás ];
* [ szorzás ]; / [ osztás ];
\ [ egész osztás ]; ^ [ hatványozás ]
A műveletek végrehajtásának
sorrendje ( prioritás
): (a matematikai szabályok
szerinti)
1.
Zárójeleken belüli művelet(ek)
2. A
hatványozás (alap ^ kitevő) egy értéknek számít
3. A
szorzás, osztás
4. Az
összeadás, kivonás
Több, azonos szintű (prioritású) műveletet balról à jobbra hajt végre a program
!
pl. i :=
A * ( B + C ) ;
k := ( D – F ) / ( K + I + Z
) ;
f := E ^ 2 - D / Y *
( N - K );
1.
1.
2. 2.
1.
2.
3.
3.
4.
Figyelem ! Az Egész-osztás művelete mindig INTEGER
(egész) számot eredményez, függetlenül attól, hogy milyen típusú változó
kiszámításánál alkalmaztuk. Az osztást egész különös módon
hajtja végre,
amit az alkalmazása során figyelembe kell venni.
Ha két egész számot osztunk el, akkor egyszerűen levágja az esetleges tizedes jegyeket és eredményül a "csonka" számot kapjuk.
11 \ 4 =
2
( a pontos eredmény
2,75 lenne
)
Ha valamelyik vagy mindkét
szám tizedes jegyet is tartalmaz, akkor előbb kerekít egész számmá, majd ezután
végzi el az egész osztást a fenti szabály szerint.
11.6 \ 4 = 3
11.4 \ 4 = 2
11.6 \ 4.6 = 2
( 12 : 4 = 3 )
( 11 : 4 = 2,75 )
( 12 : 5 = 2, 4 )
1.24. Értékadó
utasítások
Az
értékadó utasítás a program futása során, egy névvel és típussal rendelkező
változónak ad egy meghatározott értéket.
Az értékadó utasítás
szintaktikája:
VÁLTOZÓNEV [ típus ] =
konstans | kifejezés
A
BAL oldal –on egyetlen változó név áll, a JOBB oldal –on konstans vagy kifejezés szerepelhet.
Sohasem fordítva
!
pl. h = 10; a& = X / 2; szam! = a * ( y - 3 ); b$ = "szöveg" ;
s$ =
d$ + " " + c$ ;
Figyelem ! az
L = adat1 = adat2 egy logikai értékadás, amikor az L
nevű változó értéke attól függően
lesz IGAZ (-1) vagy HAMIS (0), hogy az adat1 = adat2 egyenlőségi reláció fennáll vagy
sem.
Ebben az
esetben tehát az első = jel az
értékadás a második pedig a reláció kifejezése.
Figyelem ! Feltétel vizsgálat (az IF után) is lehet
értékadás "formájú" felírás de ez ott minden esetben
egyenlőségi relációt jelent.
pl. IF h = 10 OR
szam! = a * ( y – 3) THEN … nem értékadást, hanem
a jobb és a bal oldali
egyenlőség
igazságtartalmának vizsgálatát
jelenti, amely hatására majd végre kell hajtani
valamit.
1.25. Speciális változó, a
TÖMB
A TÖMB, több, azonos típusú adat közös,
szabályozott szerkezetű tárolását teszi lehetővé.
(Részletes ismertetést lásd
a "Programozás Elmélet" című tankönyvben.)
Egy
tömb minden eleme tehát AZONOS
TÍPUSÚ, amit megadtunk a tömb
definiáló utasításában.
A tömb "üres"
eleme
numerikus típusnál alapértelmezetten 0, karakteres típusnál 0 hosszúságú string.
Példák
tömbre:
- az A ( i ) tömb adattartalma, ha i = 4 és a típusa INTEGER
1323
41
452
9435
- a NEV$ ( k, l ) tömb tartalma, ha k = 5, l = 2 és
a típusa STRING
Kiss
Lajos
Nagy
Ödön
Kovács
Balázs
Magyar
Ilona
Horváth
Rózsa
1.26. TÖMB definiálásának
szintaktikája
A
tömböket használatuk előtt, mindig definiálni kell, amire azért van szükség,
mert a fordító előre helyet foglal számára a memóriában. A dimenzionálással
határozzuk meg, hogy hány dimenziós és dimenziónként hány elemű lesz a tömb.
A tömb definíciót tehát célszerű a program elején rögtön
megtenni.
A QBasic maximum 60 dimenziós tömböt enged
meg.
Van
még egy abszolút méret határ is, mert az
összes elemszám nem lehet több mint
16384 azaz 214
.
A tömb dimenzionálás
szintaktikája:
DIM változónév [ ( dimenzió méret |
kezdőérték TO végérték [ , ... ] ) [ AS típus ] ]
DIM
a tömb definiálás parancsszava
változónév az a név amivel a
programban hivatkozni lehet a tömbre
( )
-ben a Dimenziószám és a
Dimenzió méret kerül leírásra
A Dimenziószám mindig annyi,
ahány vesszővel elválasztott Dimenzió méret van a zárójelek között.
A
Dimenzió méret -et két módon adhatjuk meg: (
N ); ( N, M ) vagy ( 1 TO N ); ( 1 TO N, 1 to M
)
AS parancs, a tömb típusának megadását vezeti
be
típus csak valamelyik létező adat
típus lehet, amelynek nevét kötelező kiírni. Ha nem adjuk meg
az alapértelmezés itt is
SINGLE
Figyelem
! A dimenziószám és méret megadása a
QBasic –ben kellő odafigyelést igényel.
Ha nem adunk meg (mert
megtehetjük) Dimenzió adatot (Számot illetve Méretet), vagyis csak egy
DIM xtomb a dimenzionáló utasítás, akkor 1 dimenziós, 11 dimenzió méretű xtomb
nevű single típusú tömböt használhatunk. A következő program részlet tehát
működőképes.
(lásd. P_126 _1
prg.)
DIM XTOMB
FOR i = 0
TO 10
XTOMB = RND
: PRINT XTOMB
NEXT
A dimenzió méretet kétféle
módon is meg lehet adni, azonban a két megadás eltérő elemszámot eredményez.
Ha YTOMB ( 10 ) a dimenzionáló utasítás, akkor 11 elemű (0 –tól 10 –ig hivatkozható) tömbünk lesz.
Ha ZTOMB ( 1 TO 10 ) formában
dimenzionálunk, akkor pontosan 10
elemű 1-től 10-ig hivatkozású tömböt használhatunk.
Ugyanígy egy XYTOMB ( 2, 4 ) tömb 3 sort és 5 oszlopot fog tartalmazni.
(lásd.
P_126 _2 prg.)
pl. DIM s ( 19 )
- 1
Dimenziós, 20 elemű, SINGLE típusú tömb
DIM szam ( 5, 8 ) AS INTEGER - 2 Dim, 6 sor, 9
oszlop ( 6x9 ) méretű, INTEGER típ.
tömb
DIM K$
( 2, 6, 3 ) AS STRING - 3 Dim. ( 3 x 7 x 3 ) méretű, 63 elemű karakteres tömb
DIM adat ( 1 TO
100 ) AS INTEGER - 1 Dimenziós,
pontosan 100 elemű INTEGER tömb
DIM nev$ ( 1 TO
12 ) AS STRING
- 1
Dimenziós, pontosan 12 elemű karakteres
tömb
DIM m (3 TO 5, 1
TO 8, 6 TO 7 ) AS DOUBLE - 3 D. (3
x 8 x 2) 48 elemű, DOUBLE típusú tömb
a = 5: b =
10
DIM tomb ( 1 TO a, 1 TO b ) - 2 Dim. (5
x 10) 50 elemű, SINGLE típusú
tömb
Hivatkozás
egy tömb konkrét elemére: Ha fel akarjuk tölteni a létrehozott
(dimenzionált) tömbünket vagy a tömbben tárolt adatokat fel akarjuk használni,
minden egyes elemét meg kell tudni
"címezni". A "címzést" nevezzük a tömb
elemére történő hivatkozásnak. A hivatkozás a névvel és utána zárójelben a
Dimenzión belül, az elem sorszám megadásával történik.
pl.
az előbb dimenzionált tömbök néhány konkrét eleme:
nev$ ( 3
)
- a nev$ nevű tömb 3. eleme
m ( 4, 2,
7 )
- az m nevű tömb 2. sor, 2. oszlop, 2. lapon levő eleme !
K$ ( 1,
3, 3 )
- a K$ nevű tömb 1. sor, 3. oszlop, 3. lapon levő
eleme
szam ( 2,
8 )
- a szam nevű
tömb 2. sor, 8. oszlop
eleme
2.
Adatkezelés
Adatokkal
végzett műveletek - bevitel,
átalakítás, tárolás, adat kiírás - végrehajtására, a programozási nyelvek
saját utasításkészlettel rendelkeznek. Ezt nevezzük
adatkezelésnek.
2.1. Egyszerű Input / Output utasítások
Input
utasítások: a feldolgozások alapadatainak bevitelére
szolgáló parancsok. ( melyik perifériáról,
hogyan, milyen
formában )
Output
utasítások:
a feldolgozás eredményeinek eltárolására, formázott képernyős
megjelenítésére,
nyomtatására szolgálnak.
2.1.1. Adatbevitel
billentyűzetről
Az adatbevitel általános
szintaktikája:
Ennek
hatására a program futása megszakad és a billentyűzetről adat bevitelére
vár.
Az
adatbevitelnél, egy konkrét érték
(szám vagy szöveg) beírása helyett
Enter leütésre az eltárolt adat, numerikus esetén 0, sztring esetén 0 hosszú karakter
"sorozat" lesz.
A változó
és a beírt adat típusa csak azonos lehet ! Ha nem egyezik a típus, akkor REDO FROM START hibaüzenetet kapunk és a program addig
vár a jó adatra, amíg meg nem kapja.
INPUT az
adatbevitel parancsszava
;
az INPUT utáni pontosvessző hatására az újabb adatbevitel ugyanabban
a sorban lehetséges
vagy a következő PRINT ebben
a sorban folytatódik.
" szöveg
" az adatbevitel helyét jelző
villogó kurzor előtt szöveget is kiírathatunk a képernyőn. Ha a
bevitelt távolabb akarjuk a
"szöveg ….." -től. akkor annak végét space -ekkel kell
feltölteni.
A "szöveg" –et követő pontosvessző esetén az inputra váró
sorban, a villogó kurzor előtt
egy ? is megjelenik, vessző esetén viszont nem jelenik meg
semmi.
változónév az input során beírt adatot
a program ezzel a névvel tárolja el
[ típus
]
mint más esetben itt is, ha nem kap konkrét típust, az input SINGLE
típusú lesz
-
1 darab numerikus adat bevitele:
à Megjelenés a beviteli
képernyőn:
a
félkövér a képernyőn megjelenő
Parancs a programban:
kiírás a dőlt betűk pedig a billentyű
-
zeten
beírt adatok
pl. INPUT a
à ? 23.8
INPUT "Bevitel:" , ADAT#
à Bevitel: ? 34.6
INPUT "Mennyi: " ;
n1!
à Mennyi: 100
-
1 darab karaktersorozat
(sztring) bevitele:
pl. INPUT B$
à ? Bodri
INPUT "Neved :
" ; b$
à Neved : Ica
INPUT ; nev$
à ? Laci Mi a neved ? ? Peti
INPUT "Mi a neved ?", a$
à
A nev$ előtt levő ; miatt a következő
input nem a következő üres sorban kerül beírásra, hanem folytatódik ugyanabban a
sorban. (Ez nem azonos a következő utasítással)
-
több adat bevitele egy
sorban:
INPUT [ ; ] [ "szöveg" ; | , ]
változónév [ típus ] [ , további változónevek [ típus
]]
Lényege,
hogy több adatot lehet bekérni egyetlen INPUT utasítással. Alkalmazása azonban
szigorú szabályokhoz kötött.
A
változók lehetnek vegyes típusúak, numerikus és sztring.
A
bevitelkor be kell tartani a (típus miatti) sorrendet és vesszővel kell
elválasztani az egyes változókat. Minden adatot kötelezően be kell írni. Az adat
lehet üres is de a ',' vessző nem
hiányozhat ilyenkor sem.
Hiba
jelzés: REDO FROM
START
pl. INPUT
"Adatok: ", a, b%, c$
à Adatok : 3.67, 55, alma
A sorrend a beíráskor csakis
single, integer, string adat lehet.
megfelel a beviteli szabálynak még:
Adatok : , , alma
Adatok : 3.67, , alma
Adatok : , 55 ,
Adatok : ,
,
enter
2.1.2. Adatkiírás
képernyőre
A PRINT parancs szó helyett használható
a ? beírása.
A kiíratás általános
szintaktikája:
[ ; | , további konstans |
változónév [ típus ] | kifejezés
]
[ ; | , ] <Enter>
PRINT
a képernyőre írás parancsszava
,
vessző a PRINT után :
már az első kiírás is tabulálva lesz
( !! 2 db , 2 -szeres TAB )
"szöveg" a
kiíratott adatok előtt tetszőleges szöveg kiíratható
konstans
a PRINT után írt konstans változatlanul kiírásra
kerül
változónév a változó
aktuális értéke kerül kiírásra
kifejezés
a
kifejezés által képviselt (a képletből kiszámított) érték kerül
kiírásra
; pontosvessző
az adatok közt: a soron
következő PRINT -elt adatot folyamatosan – (számot 1
üres hely kihagyásával,
szöveget egybeírva)
- írja tovább a megkezdett
sorban
, vessző az adatok
közt: a következő PRINT -elt
adatot, tabuláltan írja ki
ugyanabban a sorban.
; pontosvessző az utasítás
végén : a következő PRINT
utasítás adatainak kiírását ott fogja folytatni,
ahol az előző PRINT abbahagyta, mégpedig folyamatosan
, vessző az utasítás
végén: a következő PRINT
utasítás adatainak tabulált kiírását ott folytatja,
ahol az előző PRINT
abbahagyta
<Enter> az utasítás végén : új sorba írja a következő PRINT
-et;
Figyelem ! A ", " és " ; " használata
tehát a sor végén, sorfolytonos kiíratást jelent (a programban bárhol
elhelyezkedő) következő
PRINT utasítással.
Megjegyzés: a
kiírató tabulálás 14 karakter széles, nem változtatható.
(Állítani csak a Szerkesztő képernyő TAB szélességét lehet !
)
Üres sor
kiírása
: (soremelés)
PRINT
pl. PRINT : PRINT :
PRINT
- eredménye: 3 üres sor után
folytatódik majd a kiíratás
Az elválasztó " : " ( kettőspont ) azt eredményezi, mintha új programsort írnánk.
Adatok kiírása :
-
szám
konstans (ok) kiíratása:
A PRINT parancs után szereplő szám
kiíratása változatlan tartalommal és formában.
[ ; | , ] [ további
szám konstansok ] [ ; | , ] <Enter>
pl. PRINT 145.3, 35
- eredménye: 145.3
35
PRINT 34; 288.47
- eredménye:
34 288.47
PRINT 65 : PRINT 82.5
- eredménye:
65
82.5
PRINT 52
;
PRINT 89.234
- eredménye: 52 89.234
-
szöveg
konstans ( ok ) kiíratása:
A PRINT parancs után szereplő
karaktersorozat(ok) kiíratása változatlan tartalommal és
formában.
[ + | ; | , ] [ "további
szöveg konstansok" ] [ ; | ,
] <Enter>
Csak sztring kiíratáskor, a " ; " és a " + " jel azonos, folyamatos
kiíratást eredményez. A "
+ " jelet úgy is értelmezhetjük, hogy a
sztringeket össze is lehet adni.
pl. PRINT "Pisti"
- eredménye:
Pisti
PRINT "Macska" ;
"farok" - eredménye:
Macskafarok
PRINT "Macska" +
"farok" -
eredménye:
Macskafarok
PRINT "Kutya", "füle"
- eredménye:
Kutya
füle
PRINT "Buda"
;
PRINT "pest"
- eredménye:
Budapest
-
változó kiíratása:
A PRINT parancs után szereplő változó(k)
aktuális értékének kiíratása.
[ ; | , ] [ további változónevek ] [ ; | , ] <Enter>
pl. a = 10: b = 2: x$ = "A oldal:" : y$ = "B oldal:" ( ezek értékadó utasítások ! )
PRINT x$,
a,
PRINT y$, b
eredménye:
A oldal:
10 B oldal:
2
-
kifejezés kiíratása:
A kifejezésben meghatározott matematikai művelet eredményét írja ki.
[ ; | , ] [ további
kifejezések ] [ ; | , ] <Enter>
pl. a = 10: b = 2
PRINT ”Terület =”; a * b,
( Figyelem ! A sor végén vessző van. )
PRINT "Kerület =" ; 2 * (a +
b)
eredménye: Terület = 20
Kerület =
24
-
vegyes
kiíratás:
A fenti négy adat fajta természetesen vegyesen és tetszőleges sorrendben is kiíratható egyetlen PRINT utasítással.
2.1.3. Adat kiírás nyomtatóra
A PRINT utasítással azonos
szintaktikájú parancs. ( lásd fent
)
Parancsszava:
LPRINT [ paraméterek
]
2.2. Különleges Input / Output
utasítások
2.2.1. Karakteres inputok
- egy karakter beolvasása
billentyűzetről:
változónév$ =
INKEY$
Ilyenkor a bevitt karakter
nem jelenik meg a képernyőn.
A megfelelő karakter leütésére vár a program, ha megkapta
továbbfut.
pl. várakozás a
program folytatására, bármilyen billentyű leütése után a program
továbbfut
var: a$ = INKEY$ :
IF a$ = ” ” GOTO
var
várakozás a program folytatására, majd a bevitt karakter alapján ugrás a
program egy
meghatározott pontjára
var: a$ = INKEY$ :
IF a$ = ” ” GOTO
var
IF
a$ = " I " GOTO címke1
- megadott számú karakter (sztring) bevitele
billentyűzetről:
Ebben az
esetben nem jelenik meg a képernyőn sem az INPUT –nál megszokott " ? " sem a beírt
karaktersorozat.
Annyi
történik csak, hogy a zárójelben megadott hosszúságú karakterlánc (sztring)
beírása után a program folytatódik a következő utasítással. Amíg nem töltjük ki
a teljes hosszat, (akár szóköz karakterrel vagy <Enter>
leütésekkel), addig várakozik a program.
Az
utasítás eredményeképpen a karakteres változó aktuális tartalma a bevitt
karaktersorozat lesz.
Akkor
használjuk, ha a bevitt karakterek számát valami miatt korlátozni kell. ( pl. max. hosszú 10 lehet
)
változónév$ = INPUT$ ( hossz )
pl. adat$ = INPUT$ ( 15 ) -
maximum 15 karakter hosszú sztring beolvasása
billentyűzetről
2.2.2. Formázott adatbevitel és kiírás a
képernyőre
-
pozícionált I
/ O a
képernyőn:
(az INPUT vagy OUTPUT utasításra van hatással)
[ sor
] A kiíratást sorának
sorszáma. Értéke 1 és 25 közötti pozitív szám lehet.
Megadása nem
kötelező. Ha
elhagyjuk, akkor a kiíratás a következő sorban a megadott oszloptól történik.
Ezt nevezzük
Relatív pozícionálásnak.
Ha mindkét
paramétert ( sor, oszlop ) megadjuk, akkor
Abszolút pozícionálásról beszélünk.
A 25 -ös sor
érték megadása azt eredményezi, hogy a következő kiírató utasítás hatására
a
képernyő 1. sorába írt
adatok "felfelé kicsúsznak" a képernyőről.
, A két paramétert elválasztó
vessző, beírása akkor is kötelező, ha csak az oszlopot adjuk meg
oszlop A kiíratás kezdetének oszlop
száma (amelyik oszlopban az első karakter kiírásra kerül )
Értéke 1 és 80 közötti pozitív szám lehet. Megadása
kötelező.
Megadásakor mindig figyelembe kell venni, hogy az oszlop paraméter értéke plusz a kiírandó adatok hossza együtt maximum 80 karakter lehet, mert ellenkező esetben a teljes kiíratás átcsú- szik a következő sor elejére.
pl.
LOCATE 12, 20
- a 12. sor, 20. oszlopától ír (
abszolút pozíció megadás )
LOCATE , 15
- a következő (azaz a 13. sor),
15. oszlopától ír (relatív
pozíció megadás)
LOCATE 5,
71 : PRINT
"1234567890"
(még éppen elfér az 5. sor végén
DE ha 72 –t
adunk meg az egész
átkerül a 6. sor elejére)
Ahhoz,
hogy az adatbevitel vagy kiírás a képernyő egy meghatározott sor - oszlop
pozícióján kezdődjön, az INPUT illetve a PRINT előtt ki kell adni a LOCATE [x] ,
y parancsot. A következő I / O utasításra viszont már nincs
hatással, pozícionálás nélkül (vagyis újabb LOCATE [x] , y parancs nélkül) az a következő sor 1.
pozíciójától íródik ki.
Ha
pozícionálni akarjuk a következő I
/ O utasítást is, újra ki kell adni a parancsot. ( ami abszolút vagy relatív pozícionálás
is lehet )
- színek
alkalmazása: (
karakteres üzemmódban )
Beállítható
a betű és a mögötte lévő háttér színe.
16 szín használható, 0 - 15 kódokkal. ( próbáld ki
)
Karakter
villogás: karakterszín +
16
A szín
beállításnak, mindig a PRINT előtt kell lennie és mindaddig érvényes, amíg meg
nem változtatjuk.
Ha
színeket használunk, a program végén célszerű visszaállítani az alapértelmezés
szerinti fekete háttér, fehér betű kiíratást, azaz COLOR 7, 0 parancsot kell
kiadni.
COLOR karakterszín [ , háttérszín ]
pl.
COLOR
15 , 4 : PRINT "szöveg" - eredmény: intenzív fehér színű betűk, piros
alapon
COLOR 4 : PRINT "szöveg"
- eredmény: piros betűk az alapszínű
háttéren
A 16
alapszín:
Kód |
Szín – magyar |
Szín - angol |
0 |
fekete |
black |
1 |
kék |
blue |
2 |
zöld |
green |
3 |
cián |
cyan |
4 |
piros |
red |
5 |
bíborvörös |
magenta |
6 |
barna |
brown |
7 |
fehér |
white |
8 |
szürke |
gray |
9 |
világos
kék |
light
blue |
10 |
világos
zöld |
light
green |
11 |
világos
cián |
light
cyan |
12 |
világos
piros |
light
red |
13 |
világos
bíbor |
light
magenta |
14 |
sárga |
yellow |
15 |
intenzív
fehér |
high intensity
white |
Megjegyzés: a COLOR alkalmazása a grafikus
képernyőn, összefügg a képernyő felbontását meghatározó SCREEN
utasítás tartalmával. (Lásd a
grafikus képernyő kezelést.)
- formázott kiíratás képernyőre:
PRINT [ , ] [ "szöveg" ; | , ] USING forma-karakterek ; konstans | változónév |
kifejezés
[ ; további konstansok |
változónevek | kifejezések ] [ ; ] Enter
Figyelem ! A forma-karakterek utáni, a
további adat felsorolást elválasztó és a záró pontosvessző
kötelező, nem lehet vessző !
Az utasítással kötelező legalább egy adatot kiíratni !
forma-karakterek:
a kiírás formátumát meghatározó karakterek
#
: számjegyek helyének meghatározása
.
: tizedespont helyének meghatározása
+
: az előjel kiíratása
!
: a string első karakterének kiírása
\ \
: a string első 2 +
n darab karakterének
megjelenítése
a \ \ jelek között
n darab helyköz karakter (space) helyezhető el
További formázó karaktereket lásd a QBasic HELP -ben.
pl. szam
= -123.45 : ertek = 1234.567 : betu$ = "ABCDEFG" : a = -12
PRINT USING " + ###.## " ; szam
- eredmény: -
123.45
PRINT USING "
###.## " ; ertek
- ( hiba jelzés) %
1234.57
PRINT USING " ####.###### " ; ertek
- eredmény:
1234.56798
PRINT USING " ! " ; betu$
- eredmény:
A
PRINT USING " \ \ " ;
betu$
- eredmény:
ABCD
PRINT "A:" , USING "+##.#" ;
a
- eredmény: A:
-12
Ha több az értékes tizedes jegyek száma a
megadottnál, akkor kerekít, ha viszont kevesebb, akkor kipótolja számokkal. Ha
az egészek száma több, azért kiírja de hiba jelzést ad: % jelet tesz az
elejére.
A
formátum megadása után több adatot is ki lehet íratni. Az így kiírt adatok
azonos formátumúak lesznek. Az adatok közötti elválasztó karakter csak "
; " lehet (a fordító
automatikusan átváltoztatja a " , " vesszőt) A megfelelő tagolásról a formátum
megadásával kell gondoskodni, mert a " ; " miatt folyamatos kiíratás történik.
pl. PRINT
USING " ####.## " ; 123.56; 1234;
123.45 -
eredménye: 123.451234.00
123.45
PRINT USING " #######.## " ;
123.56; 1234; 123.45
- eredménye: 123.45 1234.00 123.45
3. Adat beolvasás READ - DATA utasítás
párral
DATA utasításban tároljuk
azokat beolvasandó adatokat, amelyeket egy vagy több READ -del majd be akarunk
olvastatni.
DATA adat 1, adat 2, . . . , adat
Z
.
.
READ adatnévA, adatnévB, . .
. , adatnévM
.
READ adatnévN, adatnévP, . .
. , adatnévZ
Ahhoz, hogy a program futása során adatokat tudjunk beolvasni a READ utasítással, a program tetszőleges helyén (sorában) el kell tárolni ezeket az adatokat, a DATA utasítás utáni felsorolással. A DATA utasítás több adatot is tárolhat, mint amit beolvasunk, ugyanakkor a beolvasandó adatok több DATA utasítással is eltárolhatók. A DATA adatait több READ utasítással is beolvastathatjuk, ugyanakkor több DATA utasítás folyamatos beolvasása is lehetséges egyetlen READ –del.
A beolvasás történhet egy vagy több READ utasítással is, de a beolvasás szigorúan sorrendben történik, vagyis egy következő READ onnan folytatja a beolvasást, ahol az előző abbahagyta.
A beolvasás sorrendje azért is fontos, mert az eltárolt majd beolvasott adat csak azonos típusú lehet. Eltárolt adatot kihagyni a beolvasás során úgy lehet, hogy beolvassuk, de nem használjuk fel.
pl.
DATA
„Kovács”, 1998, „május”, 17, 180,
„F”, 11, „D”, 6
READ nev$, ev, honap$,
nap, kor, magas,
nem$
READ evfolyam$, osztaly$, sorszam
PRINT sorszam, nev$, evfolyam$, osztaly$ -
eredmény: 6 Kovács 11 D
PRINT ev, honap$, nap
- eredmény:
1998 május 17
PRINT kor, magas, nem$
- eredmény:
17 180
F
DATA 1, 2, 3, 4
DATA 5, 6, 7, 8
READ a, b, c :
PRINT a, b, c
- eredmény:
1
2
3
READ x, y, z :
PRINT x, y, z
- eredmény:
4
5
6
READ p, r : PRINT p, r
- eredmény:
7
8
Mód
van az adatok újbóli - elölről kezdődő - beolvasására is, ha a READ után kiadtunk egy RESTORE parancsot.
DATA "Első", "Második"
READ a$, b$ : PRINT a$, b$
- eredmény: Első
Második
.
RESTORE
READ x$, y$ : PRINT x$, y$
- eredmény:
Első
Második
4. Logikai érték
jellemzők
A logikai
érték: False (hamis) és
True (igaz) lehet.
A QBasic logikai
értékei: 0 à False illetve -1 à True
Logikai
konstans
valójában nem is létezik önállóan a QBasic nyelvben, csak egy 0 vagy -1 értékű numerikus érték képviseli a hamis
vagy az igaz logikai értéket.
Ez a két numerikus érték alkalmazható logikai (BOOLE) függvényekben konstansként.
pl. M = -1 (igaz)
M AND -1 OR 0 ( olvasd: M logikai értéke ÉS igaz VAGY hamis )
A logikai
változó, olyan
(típus jelzés nélküli, tehát gyakorlatilag single típusú) változó,
amelynek
az értéke 0 vagy –1.
A
valóságban ez 0 vagy -1 értékű
szám, amit az is bizonyít, hogy matematikai műveletek is végrehajthatók vele DE
ha relációban vagy logikai függvényben használjuk, akkor igaz vagy hamis logikai értékként
funkcionál.
pl.
A = -1 : B =
0
i = A * 12
eredménye: -12 vagyis az
i értéke
-12
DE: C = A OR
B
eredménye:
igaz, vagyis a
C értéke -1 (igaz)
D = 0 OR
B OR A < 3.5 eredménye: igaz, mert A < 3,5 reláció igaz
ugyanakkor ! PRINT A * C
eredménye: +1 kiírás lesz, mert (-1 * -1) –et íratunk
ki
BOOLE függvények: NOT - a negációs függvény, amely megfordítja
a logikai értéket
AND - az ÉS
kapcsolat függvénye
OR - a VAGY kapcsolat
függvénye
Léteznek még az XOR; EQV; IMP logikai függvények, amelyeket a
QBasic nem alkalmazza.
A logikai függvények
feldolgozásának sorrendje:
Először a NOT függvény hajtódik végre, majd az OR illetve az AND, amelyek azonos szinten vannak. Ha mindkettő szerepel egy kifejezésben, akkor a Balról à Jobbra szabály érvényesül itt is, mint például a matematikában a szorzás, osztás esetén. A zárójelezés azonban elsődlegesen meghatározza a végrehajtási sorrendet (mint a matematikában).
Műveleti sorrend
tehát:
1. a NOT
2. az AND à OR
pl.
A =
-1 (igaz); B = 0
(hamis); C = -1 (igaz)
X =
A AND B ; Y = A AND C ; Z = A AND B
OR C ; K = X OR NOT B
X tehát hamis ;
Y tehát igaz ;
Z tehát igaz ;
K tehát
igaz
Figyelem ! A változó nevek adásakor célszerű
betartani azt a szabályt, hogy ha egy változót logikai
változóként akarunk használni, akkor NAGY betűvel ,ha pedig single típusú
számként,
akkor kis betűvel
írjuk.
BOOLE függvény táblázatok, a QBasic jelöléssel:
A
à NOT A
A OR B = C
A AND B = C
A |
Ø
A |
|
A |
B |
C |
|
A |
B |
C |
-1 |
0 |
|
0 |
0 |
0 |
|
0 |
0 |
0 |
0 |
-1 |
|
0 |
-1 |
-1 |
|
0 |
-1 |
0 |
|
|
|
-1 |
0 |
-1 |
|
-1 |
0 |
0 |
|
|
|
-1 |
-1 |
-1 |
|
-1 |
-1 |
-1 |
A
reláció,
relációjellel összekapcsolt numerikus vagy string konstansok és/vagy változók, amelyek
értékétől és a reláció jellegétől függően
IGAZ vagy HAMIS logikai értéket képvisel.
Másképpen: a relációjel két oldalán elhelyezkedő
numerikus vagy string értékek viszonya, amely vagy megfelel az alkalmazott
relációjelnek vagy nem.
Relációjelek a QBasic
programnyelvben:
= ; > ; > = ; < ; < = ; <>
pl. a =
10 : b = -6 : a$ = "magas" : b$ = "hosszú"
3.14 > 10
reláció értéke: HAMIS
a <> b
reláció értéke: IGAZ
b <= 1
reláció értéke: IGAZ
a$ = b$
reláció értéke: HAMIS
a$ <> b$
reláció értéke:
IGAZ
A
sztring értékek relációja természetesen a karakterek növekvő sorrendbe rendezett
ASCII kód értékeire értelmezett. Egyszerűbb esetekben csak az egyenlőség
(azonos) vagy nem-egyenlőség (nem azonos) relációk
használatosak.
pl. x$ =
"aa" : y$ = "ab"
(az ASCII kódok: "aa" à 097 097; "ab" à 097 098 )
x$ = y$
reláció éréke:
HAMIS
x$ < y$
reláció éréke:
IGAZ
x$ <> y$
reláció éréke:
IGAZ
x$ > y$
reláció értéke:
HAMIS
A logikai
kifejezés RELÁCIÓK valamint logikai konstansok és/vagy logikai változók, BOOLE függvények által összekapcsolt
sorozata.
pl. x =
10 : Y = 0 : z = -3 : V = -1
A = x < 15 OR z + 5 < -10 AND V
A értéke: IGAZ
H = Y OR A
AND NOT x <= z
H értéke: IGAZ
5. Program
elágazások
Ha
feltétel(ek) alapján a programnak eltérő feladatot kell végrehajtania, akkor ezt
az úgynevezett program elágazás segítségével tehetjük meg.
Megjegyzés: az elágazások részletes, elméleti
tárgyalása a "Programozási
Alapismeretek" tankönyvben
lehet tanulmányozni.
Itt a QBasic gyakorlatát lehet elsajátítani.
Az egyes programágak kezdőpontjait, CÍMKE jelöli. A címke egy név a végén kettősponttal. Az elágazásnál ezekre a címkékre kell hivatkozni, a nevükkel.
5.1. A címke alkalmazásának
szintaktikája:
- amikor egy utasítás sorban szerepel,
mint folytatási pont kijelölés, csak a nevét adjuk meg
pl. GOTO cimke3
- jelentése: lépjen át a
cimke3 címkéjű programsorra
- annak a programsornak a jelzése, ahol
folytatni kell a programot. Ebben az esetben kötelező a " : "
kiírása
pl. cimke3 : PRINT adat -
jelentése: ez az a sor, ahol folytatni kell a programot
A címke
alkothat önmagában egy "üres" program sort, de következhet utána mindjárt a
program ág első utasítása is (mint az előző példában).
5.2. A QBasic -ben alkalmazható elágazás
típusok
-
egyirányú elágazás: abban az esetben alkalmazzuk, ha a feltétel
teljesülésekor végre kell hajtani valamilyen műveletet (vagy művelet sort),
egyébként pedig nem, azaz folytatódhat a program a következő
utasítással.
Algoritmusa:
Feltétel vizsgálat:
Ha a
feltétel teljesül, ugrás a
C1: címkére, és a program folytatása
onnan
Ha a
feltétel nem teljesül, folytatás a következő
utasításon
pl.
C1: címke
BE: adat
billentyűzetről
HA adat < 0
AKKOR ugrás C1 címkére
PRINT
adat
A
billentyűzeten beírt adat
nevű változó negatív értéke esetén
ismételt adatbekérés történik, egyébként pedig az adat értékét
kiíratjuk.
Nem
csak ugró (GOTO) utasítás lehet a
"teljesül" ágon, hanem valamilyen utasítás is, amit végre kell hajtani, majd
folytatni a programot.
pl.
BE: adat
billentyűzetről
HA adat < 0
AKKOR adat := adat * (-1)
PRINT adat
A
billentyűzeten beírt adat
nevű változó negatív értéke esetén, beszorozzuk az adat -ot (-1) –gyel és kiíratjuk az értékét.
Vegyük észre ! Minden esetben az
adat pozitív előjelű értéke kerül kiírásra, mert ha nem kisebb nullánál,
akkor kikerüli a program a (-1) -gyel való szorzást és folytatja a
következő, kiíró utasítással a programot.
- kétirányú elágazás: a vizsgálati feltétel teljesülése illetve nem teljesülése esetén, más-más tevékenységet kell elvégezni, majd folytatni a program futását. A program ágak utolsó utasításainak kell gondoskodni a továbbfolytatásról.
Algoritmusa:
Feltétel vizsgálat:
Ha a
feltétel teljesül, ugrás a
C1: címkére, és az ott szereplő
program utasítások végrehajtása
Ha a
feltétel nem teljesül, ugrás
a C2: címkére, és az ott
szereplő program utasítások
végrehajtása
pl. …. a programban elértünk a telefon
kérdéshez
BE: "Van mobilod ?" ,
valasz$
HA valasz$ = "VAN" AKKOR ugrás a C1: címkére HA valasz$ <> "VAN"
AKKOR ugrás az C2: címkére
C1: címke
BE: "Írd be a
telefonszámodat:", tsz$
BE: "Írd be a
nevedet is:", nev$
KI:
"Köszönöm"
Ugrás a
C3: címkére
C2: címke
KI: "Az alábbi
kereskedőknél szerezhetsz be mobil telefont:"
KI: A kereskedők
listája.
C3: címke
KI: "Kérem a
további adataidat !"
BE:
"Lakhelyed:", lh$
és a program folytatódik tovább ….
Az
algoritmus egy adatfelvételi program részlete, amelyben attól függően, hogy
van-e a személynek mobil telefonja vagy nincs, két program ágon kell
végighaladnia, majd egy közös ponton továbbfolytatni az
adatfelvételt.
A C1 ágat lezáró C3 címkére
ugrató utasítás a C2 címkét követő felesleges utasításokat ugorja
át.
A C2 ág végén ilyen nem kell, mert innen
úgyis tovább folytatódik a program.
A nem teljesülő ágat nevezzük "egyébként" ágnak is, mert az algoritmust így is fel lehet írni:
Feltétel vizsgálat:
Ha a
feltétel teljesül, ugrás a
C1: címkére, és az ott szereplő
program utasítások végrehajtása
Egyébként, ugrás a C2: címkére, és az ott szereplő program utasítások végrehajtása
Az előző példában szereplő
elágazó utasítás eszerint így szól:
BE:
"Van mobilod ?" ,
valasz$
HA valasz$ = "VAN" AKKOR ugrás a C1: címkére EGYÉBKÉNT ugrás az C2:
címkére
-
több, lehetséges elágazási pontra ugrás: különböző feltételek
teljesülése esetén más-más feladatot
kell elvégezni, illetve ha egyik sem teljesül szintén mást.
A vizsgálatok N számú sorozata zajlik. Plusz szolgáltatása, hogy lekezeli azt a lehetőséget is, amikor egyik feltétel sem teljesül.
Emlékeztetőül az
algoritmusa:
HA az 1. feltététel teljesül, AKKOR hajtsa végre az utasítás1–t (és folytatódik a program)
HA a 2. feltététel teljesül, AKKOR hajtsa végre az utasítás2–t (és folytatódik a
program)
.
.
HA az N. feltététel teljesül, AKKOR hajtsa végre az utasításN–t (és folytatódik a
program)
HA egyik feltététel sem
teljesül, hajtsa végre az EGYÉBKÉNT ág utasítás –át (és folytatódik a
program)
Az utasítás1, utasítás2, … ,
utasításN értelmezhető
egy-egy ugrási címnek is, ahova a program átugrik és az ott szereplő
utasításokat hajtja végre.
HA az 1. feltététel teljesül, AKKOR ugrás a C1:
címkére
HA a 2. feltététel teljesül, AKKOR ugrás a C1: címkére
.
.
HA az N. feltététel teljesül, AKKOR ugrás a C1:
címkére
HA egyik feltététel sem
teljesül, az EGYÉBKÉNT ágon ugrás a CN:
címkére
5.3. A QBasic program elágaztató
utasításai
-
közvetlen ugrás címkére:
Az ugrás nincs feltételhez kötve, a program a címkenévvel jelzett
soron folytatódik
pl.
GOTO K1
- a program a K1:
címkéjű soron folytatódik
- egyszeres IF
elágazás:
A
logikai kifejezés IGAZ értéke esetén végrehajtja a THEN után
szereplő utasítás(oka)t,
HAMIS értéke esetén átlépi
az(oka)t és a soron következő utasítást hajtja végre
pl.
IF a < b THEN c = b – a : PRINT c
c = a - b
PRINT
c
-
kettős IF elágazás: I / H feltételtől függő
végrehajtás
IF logikai kifejezés THEN utasítás(ok) ELSE utasítás(ok)
A
logikai kifejezés IGAZ
értéke esetén végrehajtja a THEN után szereplő utasítás(oka)t,
majd a
soron következő utasítást hajtja
HAMIS értéke esetén
végrehajtja az ELSE után szereplő utasítás(oka)t, majd a
soron következő utasítást hajtja
pl.
IF a < b THEN c = b – a : d = c ^ 2 ELSE c = a – b : d = SQR ( c
)
PRINT c,
d
IF a < b THEN PRINT a
ELSE GOTO cimke4
Megjegyzés: A program elágazás mint látható, nem
mindig ugró utasítással valósul meg.
A THEN utasítást közvetlenül követhetik a
végrehajtandó utasítások is.
Az IF utasításban alapértelmezés az, hogy
az ELSE ág automatikusan, a
következő program soron folytatja a
végrehajtást.
-
többszörös IF elágazás: láncolt feltételek alapján történő
elágazás
Ebben az
esetben több sorosan (egymás után)
vizsgálandó logikai kifejezés van, és mindegyik feltételhez tartozik
egy-egy végrehajtandó utasítás.
Csak az az egyetlen utasítás kerül végrehajtásra, amely a vizsgálat
sorrendjében először IGAZ –nak
bizonyuló feltételhez kapcsolódik. A hátralévő feltételek vizsgálata nélkül
folytatódik a program (még akkor is, ha a sorban következő feltételek
valamelyike szintén igaz lenne).
Fontos
jellemzője ennek az összetett feltétel rendszernek, hogy ha egyik feltételt sem
teljesíti a vizsgált adat, akkor lennie kell egy EGYÉBKÉNT ágnak is,
amelynek utasítását végre kell hajtani.
[ ELSEIF logikai
kifejezés3 THEN
utasítás3 ]
.
.
[ ELSEIF logikai kifejezésN THEN
utasításN ]
ELSE
utasításH
END IF
Fontos !
Szintaktikai szabály, hogy a
THEN utáni utasítások mindig
új program sorban szerepelnek !
Az ELSE -t
követő utasítás folyamatosan írható.
pl. INPUT
"max 100 lehet: ", a
IF a <= 20 THEN
PRINT a, "Húsznál kisebb"
ELSEIF
a < 40 THEN
PRINT a, "Harminckilenc és huszonegy közé esik"
ELSEIF
a >= 40 AND a <= 80 THEN
PRINT a, "Negyven és
nyolcvan közé esik"
ELSE PRINT a, "Nyolcvanegynél
nagyobb"
END IF
- konkrét értéktől függő
elágazás: egy változó előre ismert értékeitől függő elágazás (a
CASE
utasítás)
SELECT CASE vizsgálandó változó
neve
CASE hasonlító kifejezés
1.
végrehajtandó utasítás(ok)
CASE hasonlító kifejezés
2.
végrehajtandó utasítás(ok)
.
.
CASE hasonlító kifejezés
N.
végrehajtandó utasítás(ok)
CASE ELSE
különben végrehajtandó utasítás(ok)
END
SELECT
A hasonlító kifejezés lehet:
konstans vagy matematikai képlet pl. 3;
x/y
IS relációjel konstans vagy matematikai képlet
pl. IS < 2; IS >= a * b
értéktől TO értékig
pl. 5 TO
7
pl.
a félévi számítástechnikai osztályzat véleményezése
Előbb IF - THEN szerkezettel: ( egyszerű IF - THEN sorozat )
INPUT ”Hányasod volt
Számtekből ? ”,
jegy
IF jegy < 1
THEN PRINT ”Rossz input”
IF jegy =
1 THEN PRINT ”Megbuktál ! ?”
IF jegy >= 2
AND jegy <= 4
THEN PRINT ”Számtekből neked már minden jegy jó
?”
IF jegy =
5 THEN PRINT ”Te kis zseni !”
IF jegy > 5
THEN PRINT ”Érdekes osztályzat
!”
Majd CASE
utasítással:
INPUT ”Hányasod volt
Számtekből ? ”,
jegy
SELECT CASE jegy
CASE IS < 1
PRINT ”Rossz
input”
CASE 1
PRINT ”Megbuktál !
?”
CASE 2 TO 4
PRINT ”Számtekből neked már
minden jegy jó ?”
CASE
5
PRINT ”Te kis zseni
!”
CASE ELSE
PRINT ”Érdekes osztályzat
!”
END SELECT
6.
Ciklusok
6.1. A QBasicben alkalmazható
ciklusok
Azonos feladat vagy feladat sor többszöri végrehajtása céljából alkalmazott program elem.
Az,
hogy hányszor kell végrehajtani a feladatot függhet feltételtől vagy előre
megadott számtól.
A
feltétel kielégítésének vizsgálata lehetséges a ciklus elején és
végén.
A
ciklusokban is a címkéket használjuk az ismétlés kezdőpontjának
meghatározására.
A ciklus
felépítése: - előkészítés
-
feltétel vizsgálat
-
ciklusmag
- elöl tesztelő ciklus: a
feltétel vizsgálat a ciklusba belépéskor történik és csak akkor hajtódik végre a
feladat,
ha a feltétel még nincs kielégítve.
A ciklus mag esetleg egyszer sem hajtódik végre
!
Algoritmusa:
Előkészítő
(általában értékadó) utasítások
C1:
Feltétel vizsgálat
Ha IGAZ, a ciklusmag
utasításai végrehajtódnak és visszaugrik a C1: -re
Ha HAMIS, ugrás a ciklus
utáni első program sorra
pl.
a = 1
ujra: INPUT
b
IF b <> 0 THEN a = a * b : PRINT a, b : GOTO ujra
- a ciklusmag
PRINT a, ”Vége”
Amíg az input értéke nem
nulla (FALS), az a értékét újra számoljuk és ki is íratjuk a két számot.
Amint a billentyűzeten nullát írunk be (TRUE) a folyamat leáll és kiíratjuk az
a értékét és a Vége
feliratot.
- hátul tesztelő ciklus: a
feltétel vizsgálat a ciklus végén történik.
A ciklusmag itt is csak akkor hajtódik végre ha
feltétel nem teljesül. Mire a
vizsgálat megtörténik azonban már egyszer futott a ciklusmag, tehát:
Algoritmusa:
Előkészítő
(általában értékadó) utasítások
C1:
A ciklus mag utasításainak végrehajtása
Feltétel vizsgálat
Ha IGAZ, visszaugrik a C1:
-re
Ha HAMIS, ugrás a ciklus utáni első program sorra
pl.
a = 0
ujra: INPUT
b
a = a + b: PRINT
”Eredmény:”, a
- a ciklusmag
IF a < 1000 THEN GOTO ujra
PRINT a,
”Vége”
-
meghatározott számszor végrehajtott ciklus: konstans vagy számított érték lehet
A végrehajtás száma
lehet előre konstansként megadott, vagy maga a ciklus számítja ki. Lehet elöl-
vagy hátul tesztelő is, attól függően, hogy a végrehajtás számának ellenőrzése a
ciklus elején vagy végén történik.
pl.
Számított, hátul tesztelő ciklus:
k = 0 : s = 0
ujra:
s = s + k
k = k +
1
IF k < 10 THEN GOTO ujra
PRINT ”Eredmény:”, s,
k
6.2. A QBasic programnyelv által definiált
ciklusok:
Az eddig
megismert ciklusokat a programozó szervezte.
A
programnyelvek rendelkeznek ciklus szervező utasításokkal, amelyeket
tulajdonképpen csak paraméterezni kell.
-
a FOR
- NEXT ciklus:
. . . a ciklusmag utasításai . . .
NEXT
A FOR – NEXT ciklus 3 numerikus értéket
tartalmaz: a ciklus KEZDŐ- és VÉGÉRTÉK –ét valamint
nem kötelezően a LÉPÉSKÖZ –t
A Kezdőértéket a QBasic Értékadó utasítás formájában
kéri.
pl. i = 1
A három numerikus érték nem
csak konstans (egy konkrét számérték) lehet, hanem olyan változó is, amely a
program futása során már korábban, értéket kapott. Ezek a CIKLUS VÁLTOZÓK. Ezen túlmenően a
Ciklus változók lehetnek még
Kifejezések is.
Tehát a Ciklus változók de a
Ciklus mag utasításai is
igényelhetik az előzetes értékadást, amit használni kell a számítások
során.
A Lépésközt nem kötelező megadni.
Ilyenkor az alapértelmezése
1, azaz egyesével nő a Kezdő érték.
A számlálásos ciklus
bármelyik, vagy mindegyik numerikus eleme lehet tizedes is, sőt
negatív érték is.
Azt a változót, amely a
ciklus során a Kezdőértéktől, a Lépésközzel módosított értékeket felveszi, a
Végértékig, SZÁMLÁLÓ –nak
nevezzük.
Fontos ! Ha
a Kezdőérték < Végérték, akkor a Lépésköz csak Pozitív szám lehet.
Ha a
Kezdőérték > Végérték, akkor a Lépésköz csak Negatív szám
lehet.
Ha a
Kezdőérték = Végérték, akkor a ciklus egyszer
lefut (mert hátultesztelő ciklus)
pl. FOR i
= 1 TO 20
PRINT ”Valami:”, i
.
------ ez a ciklusmag
Számítás, kiírás, stb.
NEXT
pl. FOR k
= 100 TO -100 STEP - 5
PRINT ”Érték:”, k
.
------- ez a ciklusmag
További utasítások
NEXT
-
a DO
WHILE
ciklus:
Az
„utasítások” mindaddig végrehajtódnak, amíg a feltétel IGAZ.
Elöl tesztelő változat:
DO WHILE feltétel
utasítások
LOOP
pl. i = 0
DO WHILE i < 10
PRINT i
i = i + 1
LOOP
REM Az i értéke 9 lesz.
Hátul tesztelő változat:
DO
utasítások
LOOP WHILE feltétel
pl. i =
0
DO
PRINT i
i = i +1
LOOP WHILE i < 10
REM Az i értéke 9
lesz.
Létezik
egy hasonló szerkezetű, DO
UNTIL ciklus is, ami
addig hajtja végre az utasításokat, amíg a feltétel HAMIS, vagyis igazzá nem
válik.
Elöl tesztelő változat:
DO UNTIL feltétel
utasítások
LOOP
Hátul tesztelő változat:
DO
utasítások
LOOP
UNTIL
feltétel
7. Állomány kezelés a
QBasic -ben
A program által előállított és/vagy felhasznált adatokat állományokban tároljuk.
A
QBasic állomány kezelése elég nehézkes, mert nem elsősorban adatfeldolgozásra
készült.
A
QBasic az adatállományokat . DAT kiterjesztéssel
kezeli.
Az
adatállomány több, tetszőleges típusú adat sorozata, de lehet egyetlen adat
is.
A QBasic adatállománya
SZEKVENCIÁLIS ( azaz
soros elérésű ).
Az
adatállományba felvitt adatsort
az EOF ( End Of File ) jel zárja. Ez jelzi a program számára,
hogy az állomány sértetlen. Az EOF
jelnek az adatok kiolvasásakor van jelentősége.
Magasabb verziószámú QBasic ismeri a véletlen elérésű (
random ) állományt is.
7.1. Új állomány
létrehozása
OPEN ”fájlnév.dat” FOR OUTPUT AS
#fájlszám
”fájlnév” : a megnyitandó fájl (file)
neve.dat pl.
DOKU.DAT
#fájlszám : a
megnyitandó fájl hányadikként lesz megnyitva ebben a programban ( max. 255 )
pl.
OPEN ”doku.dat” FOR OUTPUT AS
#4
Megj.: Ezzel
az utasítással egy még nem létező állományt nyitunk meg, azaz új állomány
létrehozása történik.
Az így megnyitott állomány a program bezárása után is létezik, csak nincs
benne adat, úgynevezett
„üres állomány” jön létre.
Figyelem
!
Ha OUTPUT -ra nyitunk meg egy már létező
állományt, akkor annak tartalma
TÖRLŐDIK
!
7.2. Már létező állomány megnyitása,
utánírás céljából
OPEN ”fájlnév.dat” FOR APPEND AS
# fájlszám
”fájlnév” : a megnyitandó fájl (file) neve.dat
pl.
DOKU.DAT
#fájlszám : a
megnyitandó fájl hányadikként lesz megnyitva ebben a programban ( max. 255 )
pl.
OPEN ”doku.dat” FOR APPEND AS
#8
7.3. Az állomány feltöltése
adatokkal
A
program futása során, már korábban megnyitott állományba lehet csak adatokat
felvinni !
Üres
állományba az adat feltöltés
történhet a megnyitása után azonnal, vagy bármikor ha bezárását követően
ismételten megnyitjuk az OUTPUT utasítással.
Az
adatokat tartalmazó állományt nem feltöltjük, hanem tovább
bővítjük, így
annak megnyitása
(az utáníró)
APPEND utasítás kiadása után lehetséges.
Az adat felvitele a bővített PRINT utasítással történik, amelyben meghatározzuk, hogy melyik, korábban megnyitott állományba történik a felvitel, hányadik a sorban és milyen típusú.
PRINT #fájlszám, [ konstans | változó | kifejezés ] [ , |
; további konstansok vagy változók
]
#fájlszám: a megnyitott állomány száma a
programban
konstans: a parancs után beírt numerikus
vagy string konstansok
változó: a programban definiált
változó
kifejezés: a megadott kifejezés
értéke
Elválasztó
jelek: , - tabulálással ír az
állományba
;
- a következő pozíción ír
az állományba
A
" , " vagy " ; " -vel lezárt PRINT utasítás
itt is a sorfolytonos adatfelvitelt jelent.
A PRINT
utasítással egyetlen adatsor
(rekord) jön létre. Több adatsor
(több rekord) létrehozásához, több
PRINT utasítást kell alkalmazni, azaz minden újabb PRINT egy új rekordot jelent.
A PRINT
utáni adatsort, függetlenül a kiírás módjától (tabulált vagy folytonos),
stringnek (karaktersorozatnak) tekinti a program. Ennek beolvasásakor kell
gondoskodni a karaktersorozat megfelelő tagolásáról. Ez alól az egyértelműen
numerikus adatok lehetnek kivételek, de ezek is beolvastathatók stringként
!
A
felviendő adatok a PRINT utasításban tetszőleges típusúak és sorrendűek
lehetnek, de hozzáférni is csak ebben a sorrendben lehet.
Egyetlen
adatsor: adat1, adat2, adat3, …
, adatN
EOF
Több adatsor:
adat11, adat12, … , adat1M
adat21,
adat22, … , adat2N
. . .
adatK1,
adatK2, … ,
adatKP EOF
( M <> N
<> P )
pl. OPEN "minta.dat" FOR OUTPUT AS
#14
PRINT 12; "Pista";
- figyelje a pontosvesszőt a végén
PRINT 3; 9; "adat"
- itt nincs vessző a sor végén
PRINT 88, "másik", 6
- itt vessző az elválasztó, tehát tabulált
CLOSE
#14
A "minta.dat" állomány tartalma ezek
után:
1. rekord:
12 Pista 3 9 adat
2. rekord:
88
másik
6
pl. OPEN
„proba.dat” FOR OUTPUT AS
#6
FOR i = 1 TO
12
PRINT i ,
- figyelje a vesszőt a végén !
NEXT
CLOSE
#6
A "proba.dat" állomány tartalma:
Egyetlen rekord, a számot tabuláltan: 1 2
3 4
5 6 7 8 9 10 11
12
Ha
a PRINT i
után nem lenne a vessző, akkor 12 darab egyetlen számot tartalmazó rekord
jönne létre.
7.4. Adat kiolvasás az
állományból
Adatot
kinyerni egy állományból csak a szükséges adatokat tartalmazó állomány,
olvasásra történő megnyitása után lehet ! Ez azonban még csak az állományhoz
való hozzáférést biztosítja. A tényleges kiolvasást külön INPUT utasítással kell
kezdeményezni.
Állomány megnyitása: (
adatkiolvasás - input céljából )
OPEN ”fájlnév.dat” FOR INPUT AS
#fájlszám
”fájlnév”
: a
megnyitandó fájl (file) neve.kit
pl. DOKU.DAT
#fájlszám : a
megnyitandó fájl hányadikként lesz megnyitva ebben a programban ( max. 255 )
pl. OPEN ”doku.dat” FOR INPUT AS
#12
Az adatok kiolvasása
lehet:
-
SZEKVENCIÁLIS kiolvasás: (soros
kiolvasás)
pl. OPEN ”nevek.dat” FOR INPUT AS #2
FOR i = 1 TO
10
INPUT #2, veznev$, utonev$
PRINT veznev$, utonev$
NEXT
10
x 2 adat kiolvasása és kiírása a nevek.dat állományból, amelyben az
adatok a következő sorrendben vannak:
NEVEK.DAT {KISS, BÉLA, FA, NÁNDOR, ERŐS, EGON, . . . }
Az adatok kiolvasása,
függetlenül attól, hogy egyetlen folytonos rekordban vagy több rekordban
tároltuk el, csakis sorosan (más
néven szekvenciálisan)
lehetséges.
Az INPUT utasításban a változók
felsorolásakor tisztában kell lenni a tárolt adatok típusával is, mert csak a
típus jelzéssel együtt lehet hivatkozni az adatra a kiolvasáskor. Stringet csak
stringként lehet kiolvasni, a numerikus adat viszont kiolvasható stringként,
illetve kiolvasáskor kapja meg a típusát is (pl a& long
lesz).
Csakis annyi adatot lehet
kiolvasni, ahányat eltároltunk előzőleg. Ha többet próbálunk kiolvasni,
INPUT PAST END OF FILE hiba üzenettel leáll a
program.
Ha ismeretlen az adatok
száma az
állományban, akkor egy különleges DO WHILE ciklussal olvasunk:
DO WHILE NOT EOF ( n
)
input
a$
LOOP
Az utasítás jelentése a
következő:
olvasson mindaddig egy stringet a #n sorszámú, megnyitott állományból,
mindaddig, amíg az olvasáskor nem EOF –fal találkozik.
-
meghatározott számú
karakter (sztring) kiolvasása:
Ha
az állomány egyetlen STRING sorozat, akkor annak „felszabdalásával” rész
karakter sorozatok is beolvashatók.
változó$ = INPUT$ ( hossz,
#fájlszám )
pl. a$ = INPUT ( 4, #23 ) - 4 hosszú sztring beolvasása a 23
-iknak megnyitott állományból
OPEN ”adatsor.dat” FOR INPUT AS #4
FOR k = 1 TO 7
a$ = INPUT$ ( 9, #4)
PRINT a$
NEXT
7
-szer olvas 9 darab karaktert a negyediknek megnyitott állományból, amely a
következő:
ADATSOR.DAT {HÉTFŐ----KEDD-----SZERDA---CSÜTÖRTÖKPÉNTEK---SZOMBAT—VASÁRNAP-}
Az
adat kiolvasás lehetőségeit a P_74.prg elemzése segít megismerni
!
7.5. A megnyitott
állomány(ok)
bezárása
A
megnyitott állomány(oka)t BE IS
KELL ZÁRNI a programban !
Parancsa:
CLOSE #fájlszám - a # sorszámú
állományt
vagy
CLOSE
- az összes nyitott
állományt
vagy
a programot
befejező END automatikusan
bezár minden állományt.
7.6. Állomány nevek
listázása a tároló helyéről
FILES ” [ drive:\ ] [ útvonal \ ] fájlnév.kit
”
pl. FILES
” a: \ munka \ program.bas ”
FILES ” *. dat ”
7.7. Állomány törlése a
tároló helyéről
KILL ” [ drive:\ ] [ útvonal \ ] fájlnév.kit
”
pl. KILL
” c: \ munka \ program.bas ”
KILL ” nevsor?? . dat ”
8.
Alprogramok
Az alprogramok, a
főprogramtól függetlenül megírt, abban felhasznált önálló, kisebb programok.
Akkor alkalmazzuk, ha a
főprogram különböző pontjain azonos műveletsort kell elvégezni. Ilyenkor
egyszer kell csak megírni és ha szükséges egyszerűen meghívjuk az
alprogramot, majd ha végzett visszaadja a vezérlést a
főprogramnak.
Az alprogramok elkészítése 3
lépésből áll:
1.
Az alprogram
megírása
2.
Az alprogram DEKLARÁLÁSA,
ami a program elején egy jelzés a program számára, hogy van egy ilyen NÉVEN
alprogram a teljes programban.
3.
Az alprogram meghívása
illetve meghívásai (az alprogram futtatása) a főprogram megfelelő
pontján.
Az
alprogramokat a főprogram után – a főprogramot záró END utasítást követően – kell
beszerkeszteni.
Az alprogramok
kétfélék:
SZUBRUTINOK és
FÜGGVÉNYEK
8.1.
Szubrutinok
Szerkezete:
SUB
szubrurtin-azonosító [ ( param1, param2, … ) ]
a szubrutin utasításai
END
SUB
Deklarálása:
DECLARE SUB szubrutin-azonosító [ ( param1, param2,
… , ) ]
Hívása:
CALL szubrutin -azonosító [ ( param1, param2,
… ) ]
vagy
szubrutin -azonosító [ ( param1, param2, … ) ]
vagy
GOSUB szubrutin -azonosító [ ( param1, param2, … ) ]
Paraméter lista csak akkor van,
ha a szubrutin paraméterekkel dolgozik.
Alkalmazása - először is a
főprogram elején deklarálni kell -
DECLARE SUB utasítással
- megírjuk a szubrutint és a főprogram végére szerkesztjük (a program záró END után)
- a főprogramban, ahol kell meghívjuk névvel vagy név nélkül vagy
GOSUB utasítással átugrunk rá
pl.
DECLARE SUB szamolas (paraméterek) - a "szamolas"
szubrutin deklarálása
DECLARE SUB nev
(paraméterek)
- a "nev" szubrutin deklarálása
a FŐPROGRAM utasításai . .
.
CALL szamolas (paraméterek)
- a "szamolas" nevű
szubrutin meghívása,
lefutása után a
vezérlés automatikusan vissza-
kerül a
Főprogram következő utasítására
a FŐPROGRAM további utasításai
. . .
szamolas (paraméterek)
- a "szamolas" nevű
szubrutin meghívása,
lefutása után a
vezérlés automatikusan vissza-
kerül a
Főprogram következő utasítására
a FŐPROGRAM további utasításai
. . .
IF ... THEN GOSUB nev ELSE ...
- feltételes GOSUB ugrás a "nev" nevű
szubrutinra
lefutása után a vezérlés
automatikusan vissza-
kerül a Főprogram következő
utasítására
a FŐPROGRAM további
utasításai . .
.
END
- a Főprogram vége
SUB szamolas ( paraméterek)
alprogram utasítások
END
SUB
8.2.
Függvények
Fontos
! A függvény használata hasonlít a
szubrutinhoz. A tartalmi eltérés azonban lényeges !
A függvényre való
hivatkozás (a deklarálás, a
meghívás és a létrehozó utasítás 1. sorában)
paraméterrel együtt szerepel. Ez a „függvény” független változója.
A függvény hívásakor
mindig egy értékadó utasítás jobb oldalán szerepel a
függvény-azonosító ( bemenő érték )
Eredményül mindig
visszaad egy (de csakis egy) értéket a főprogramnak.
Szerkezete: FUNCTION függvény-azonosító ( bemenő érték1.
bemenő érték2, …
)
a függvény
utasításai
END FUNCTION
Deklarálása: DECLARE FUNCTION függvény-azonosító ( bemenő
érték1. bemenő érték2, … )
Hívása:
változó-név = függvény-azonosító
( bemenő érték1. bemenő érték2, … )
Alkalmazása: - először is a főprogram
elején deklarálni kell
- megírjuk a függvényt és a főprogram végére
szerkesztjük
- a főprogramban, ahol kell meghívjuk
pl. két szám közül a
nagyobbikat kiválasztó függvény
DECLARE FUNCTION Max (x ,y)
INPUT
a
INPUT
b
m = Max (a, b)
: REM a függvény
meghívása
PRINT ”A nagyobb:”, m
. .
END
FUNCTION Max (x, y)
IF x >= y THEN Max = x ELSE Max = y
END
FUNCTION
Lehetséges egyszerűbb
esetben az összevont függvény megadás: - az előző példa
összevontan
DEF FNMax (x, y)
IF x >= y THEN FNMax = x ELSE FNMax = y
END
DEF
INPUT
a
INPUT
b
m = FNMax (a, b)
: REM a függvény
meghívása
PRINT ”A nagyobb:”, m
9. QBasic függvények (amelyeket használunk)
Általános
szerkezete:
FÜGGVÉNYNÉV ( argumentum [ további argumentumok ]
)
9.1. Matematikai
függvények:
9.1.1. Abszolút érték
függvény:
ABS ( numerikus konstans | változó |
kifejezés )
pl. PRINT ABS ( -34.25 )
à 34.25
9.1.2. Négyzetgyökvonás
függvénye:
SQR ( numerikus konstans |
változó | kifejezés )
pl. PRINT SQR ( 25 )
à 5
9.1.3. Véletlen szám
generátor függvény:
RND [ ( argumentum ) ]
Az RND – argumentum
nélkül 0 és 1 közé eső számot
generál.
pl. PRINT RND
à 0.
567
Az RND ( argumentum ) 0 és
az argumentum közé eső számot generál.
pl. PRINT RND ( 100 )
à
56.7
A feladatnak megfelelően manipulálhatjuk az
erdményt:
pl. PRINT INT ( RND * 50 ) + 1 à 1 és
50 közé eső egész számot állít
elő.
(
Lásd magyarázatul az INT függvényt a 2.1. pontban. )
Célszerű
előtte alkalmazni a
RANDOMIZE TIMER
utasítást azért, hogy ne ugyanazon a kezdő értéken induljon a véletlen
szám generálás.
9.1.4. Előjel
függvény: (signum )
SGN ( numerikus konstans | változó | kifejezés
)
Egy szám
előjelét adja vissza, ha a szám negatív
-1, ha pozitív 0 formában, amit majd megfelelően
felhasználhatunk a programban, például egy feltétel
vizsgálatnál.
pl. PRINT SGN ( -12 )
à
-1
PRINT SGN ( 87 )
à 0
9.1.5.
Szögfüggvények:
- cosinus számítás
COS ( szög érték radiánban )
- sinus számítás
SIN ( szög érték
radiánban )
- tangens számítás
TAN ( szög érték radiánban )
pl. pi = 3.14 :
PRINT COS ( 2 * pi )
à 1
PRINT TAN ( 3.14 )
à 0
9.2. Numerikus típus
konverziós és kerekítő függvények: számok
átalakítása
9.2.1.
Konvertálás INTEGER
típusra:
INT
( numerikus konstans | változó | kifejezés )
Az
argumentumot a kisebb egész számmá alakítja. Nem kerekítés Mindig a számegyenesen tőle balra eső
egész számot adja vissza.
pl. PRINT INT ( 35. 7 )
à
35
PRINT INT ( 35. 2 )
à 35
PRINT INT ( - 89.3
à - 90 !
9.2.2. Kerekítés INTEGER típusra:
CINT ( numerikus konstans |
változó | kifejezés )
A
kerekítés szabályának megfelelően alakít át egész számmá. A negatív számot előbb
kerekíti majd előjelet ad hozzá. Értéke - 32768 és 32767 közötti lehet
!
pl. PRINT INT ( 35. 7 )
à
36
PRINT INT ( 35. 2 )
à 35
PRINT INT ( - 89.3
à - 89 !
PRINT INT ( - 89.8
à - 90 !
9.2.3.
Konvertálás és egyben
kerekítés is LONG típusra:
CLNG ( numerikus konstans |
változó | kifejezés )
Az
argumentumot dupla hoszú egész számmá alakítja, a kerekítés szabálya
szerint.
Értéke
- 2147483648 és 2147483647 közötti lehet !
9.2.4. Konvertálás SINGLE típusra:
CSNG ( numerikus konstans |
változó | kifejezés )
Az
argumentum egyszeres pontosságú,
tizedes értékét adja vissza.
9.2.5. Konvertálás DOUBLE típusra:
CDBL ( numerikus konstans |
változó | kifejezés )
Az argumentum
duplapontosságú, tizedes értékét adja vissza.
9.2.6. Tizedes szám
csonkítás, levágja a tizedeseket: FIX ( numerikus konstans | változó |
kifejezés )
pl. PRINT
FIX ( 2.5 )
à
2
PRINT FIX ( - 15.7 )
à - 15
9.3. Karakter
függvények:
9.3.1. Betűváltó
függvények:
- csupa kisbetűre vált
LCASE$ ( karakter sorozat )
- csupa nagybetűre vált
UCASE$ ( karakter sorozat )
pl.
PRINT LCASE$ ( ”AlMa” )
à alma
PRINT UCASE$ ( ”Kiss Matild”
)
à KISS MATILD
9.3.2. Karakter hossz
függvények:
A
karakteres kifejezés n darabszámú
karakterét adja vissza.
- balról számítva.
LEFT$ ( karakter
sorozat,
n )
- jobbról számítva
RIGHT$ ( karakter sorozat, n
)
pl. PRINT
LEFT$ ( ”abcdefghijk”, 4 )
à
abcd
PRINT RIGHT$ ( ”abcdefghijk”, 6 )
à
fghijk
A
karakteres kifejezés n
darabszámú karakterét adja vissza a k.
kezdő karaktertől.
MID$
( karakter
sorozat,
k [ , n ] )
pl. PRINT
MID ( ”kismikike”, 4, 4 )
à
miki
A
karaktersorozat karakter darabszámát adja vissza.
LEN$
( karakter
sorozat
)
pl.
PRINT LEN ( ”sok a
szöveg”)
à
12
9.3.3.
Karakter – ASCII kód átalakító
függvények:
-
Karaktersorozat első
karakterének ASCII számkódját adja vissza. ASC
( karakter
sorozat
)
pl.
PRINT ASC (”ABC”)
à
65
-
ASCII kódot ( 0 – 255 ) átalakítja karakterré.
CHR$
( ASCII - kód )
pl. PRINT
CHR$ ( 65 )
à A
9.3.4. Tabuláló (üres karakter beszúró)
függvény: TAB ( numerikus konstans | változó |
kifejezés )
a
numerikus értéke
1 -
255 közé kell, hogy essen
Az
aktuális sorban, a kiinduló pozícióról az
n –ik pozícióra állítja a következő kiíratás kezdő pozícióját. Ha az
aktuális sorban már az n –ik pozíción túl van a kiinduló pozíció,
akkor a következő sor n –ik
pozíciójára tabulál.
9.3.5. Meghatározott számú szóköz
kiíratása: SPC ( numerikus konstans | változó |
kifejezés
)
a numerikus érték 1
- 32767255 eshet
A kiírató
utasításban n darab space
kiíratása.
pl. a =
30
PRINT „Mákos”; SPC ( a / 2 ); „tészta”
à Mákos
tészta
9.3.6. Szóköz karaktersorozat kiíratása vagy
definiálása:
[ változó$ = ] SPACE$ ( numerikus konstans | változó |
kifejezés )
a numerikus érték
1 -
32767255
eshet
- Karakteres üres karakter sorozat definiálása (megadása) még a kiíratás
előtt
pl. a$ = SPACE$ ( a / 2 + x
)
PRINT „Macska”; a$;
„füle”
à Macska
füle
- Karakteres üres karakter sorozat megadása a kiíratás
közben:
pl. PRINT „Macska”; SPACE$ ( a / 2 + x );
„füle”
à Macska
füle
9.4. Numerikus ßà
karakteres átalakítás függvényei:
9.4.1.
Numerikusból, karakteres konvertálás:
STR$ ( numerikus konstans | változó |
kifejezés )
pl. x =
43.8 : y$ = STR$ ( x ) : PRINT y$
à 43.8 ( ez már szöveg !
)
9.4.2. Karakter sorozatból, numerikussá
konvertálás:
VAL
( karakter sorozat )
Természetesen
csak számokat tartalmazó karaktersorozat konvertálható.
Ha a
karaktersorozat számokkal kezdődik és betűk is vannak benne, akkor csak az első
betűig
alakítja át.
Ha a
teljes karaktersorozat betű illetve már a legelső karakter is betű, akkor numerikus nullát ad
vissza.
Ha számok
között üres karakterek vannak, akkor a számokat összevonva írja
ki.
pl. a$ =
”555.5” : PRINT VAL ( a$)
à
555.5
b$ =”123alsó56vb” : PRINT VAL (b$ )
à
123
c$ =”xyvz” : PRINT : VAL ( c$ )
à 0
d$ =”123
45sdf78” : PRINT VAL ( d$)
à 12345