8/1
Programozási alapismeretek (VBScript)
Programozási alapismeretek (VBScript) A programozási nyelveknek két alapvető típusa van. Az egyikbe tartoznak azok, amelyeknek forráskódját egy fejlesztőkörnyezetben beírjuk, majd futtatható programra lefordítva (EXE) a program elindítható lesz. A másik típusba azok tartoznak, amelyeknél erre nincs szükség, mert a forráskódban megírt program azonnal futtatható, és az eredményt azonnal megtekinthetjük. A VBScript nyelv egy Visual BASIC alapokon nyugvó leírónyelv (angolul: script), amelyet a Microsoft fejlesztett ki. Előnye, hogy más nyelvekkel szemben lényegesen egyszerűbb, kevesebb benne a szintaktikai megkötöttség, és az általános BASIC programozásban jártas felhasználók nagyon gyorsan át tudnak térni erre a programozásra. Hátránya, hogy a lehetőségek korlátozottabbak, mint az olyan programoknál, ahol kész, futtatható programot állítunk elő, valamint a weblapokon futó programjaink csak a Microsoft Internet Explorerben futnak, bár a felhasználók 95%-a ezt a webböngészőt használja.
4. Váltsunk át az Intézőre, és dupla kattintással indítsuk el a VBS-programunkat. Ha a fájl ikonja látszódik a Jegyzettömb ablaka mellett, akkor elég arra kattintani kettőt. 5. Nézzük meg az eredményt, és vonjuk le a következtetéseket, és a látottak alapján gondoljuk ki, hogy mit kellene módosítanunk a programunkon. 6. Ha hibaüzenet jelenik meg, akkor az tartalmazza a hiba jellegét, és a hibás sor és oszlop számát. Ebben az esetben keressük meg a forráskódban a hibás sort, és ellenőrizzük a beírást. Valószínűleg kifelejtettünk valamit, egy vesszőt, egy idézőjelet vagy más fontos karaktert.
A programok felépítése Minden program fő felépítése azonos, és a következő három részből áll. (1) Adatbevitel, (2) Adatfeldolgozás, (3) Eredménykiírás. Az adatok bevitele megvalósulhat egyrészt az adatbeviteli eszközök segítségével, tehát a billentyűzettel és az egérrel, de olvashatunk adatokat helyi vagy internetes fájlból is. Különböző utasítások és függvények állnak a rendelkezésünkre, hogy a felhasználótól érkező információkat a programban is felhasználható formában át tudjuk venni. A feldolgozás alatt azt kell érteni, hogy a kapott adatokból valamilyen más jellegű információt akarunk kinyerni, és az ehhez szükséges lépéseket valósítjuk meg. A kapott adatokat az eredménykiírás programrészben adjuk át a felhasználónak. Az eredmény az esetek többségében szöveges vagy képi adat, amit a rendelkezésünkre álló utasításokkal megjelenítünk a képernyőn, de az eredmény lehet egy új fájl, egy hang vagy bármilyen más formátumú fájl is.
A programok elkészítése A továbbiakban a VBScript programok beírásához a Windows Jegyzettömb programját fogjuk használni. A beírt forráskódot mentsük el a megadott néven, de arra ügyeljünk, hogy a név utáni kiterjesztést is pontosan írjuk be. Ez a „ . v b s ”. Az így elmentett fájlok ikonja e bekezdés elején látható formát veszi fel. Az ilyen fájlokra a jobb egérgombbal kattintva a helyi menü tartalmazza például a Szerkesztés menüpontot, amit kiválasztva a Jegyzettömb programban szerkeszthetjük tovább a programot. Célszerű a Jegyzettömböt és az Intéző ablakát nyitva hagyni, mert így gyorsabban tudjuk a programunkat kipróbálni. A tesztelési módszer a következő. 1. Indítsuk el a Jegyzettömböt, majd mentsük el az üres fájlt a megadott néven. 2. Írjuk be a megadott programot, utasítást, vagy végezzük el a szükséges módosításokat a forráskódban. 3. Mentsük el a fájlt a Fájl / Mentés paranccsal. Móricz Attila, 2007. március.
1. ábra. A hibaüzenet megjelenési Windows Me-ben 7. Ha a programunk jó volt, akkor lépjünk vissza a forráskódra, módosítsunk rajta a lehetőségek szerint, majd újra mentsük el a változásokat, és újra próbáljuk ki a programot. Ezeket a lépéseket ismételjük egymás után, így rövid idő alatt nagyon sok tapasztalatra tehetünk szert.
Az első programunk futtatása Az első programunk nagyon egyszerű lesz, mert csak egy utasítást fog tartalmazni, ami viszont azonnal egy látványos eredménnyel kápráztat el bennünket. Igazából az tudja értékelni az eredményt, aki már próbált karakteres képernyőn futó programozási nyelven programozni, például QBASIC vagy PASCAL nyelven. Ott a karakteres képernyőre tudunk kiírni, és nem nevezhető valami szépnek az eredmény. Itt egy utasítással egy windowsos párbeszédablakot jelenítünk meg, ami további szolgáltatásokat is kínál. prog-01.vbs: Üzenetablak megjelenítése. MsgBox “Üzenet”, 64, “Attila”
A program neve a „prog-01.vbs” legyen, és a szövegfájl a fenti egyetlen sort tartalmazza. Ügyeljünk arra, hogy a szóközök, az idézőjelek és a vesszők a helyükre kerüljenek, különben szintaktikai hibát kapunk. Ha jól írtuk be és elmentettük a fájlt, akkor indítsuk el az Intézőből, és a fenti ábrán látható eredményt kapjuk. Ha ezt sikerült elérnünk, akkor módosítsuk az üzenetet, írjunk hosszabb szöveget, és fejlécbe kerülő szöveget is módosítsuk tetszőlegesen. A számot az első próbálkozások alkalmával ne módosítsuk, annak speciális jelentése van. Nyúl, Általános Iskola, Informatika
8/2
Programozási alapismeretek (VBScript) Ezzel az utasítással a felhasználónak tudunk üzenetet küldeni a program futása közben, illetve az eredmények kiírására is jól alkalmazható. Az ablakban megjelenő kis grafika képe négy ikon közül választható ki, és a gombok kollekciója szintén meghatározható az előző programban látott 64-es kód helyére írt másik számmal. A számkód értelmezése: Ikonkód + Gombkód Ikonkódok: 16, 32, 48, 64 =16
=32
=48
=64
Gombkódok: 0..5 0 1 2 3 4 5
= = = = = =
OK OK, Mégse Kilépés, Ismét, Tovább Igen, Nem, Mégse Igen, Nem Ismét, Mégse
Példák: prog-02.vbs: A számkódok tesztelése
A változó neve csak angol betűt, számjegyet és néhány egyedi karaktert tartalmazhat, például aláhúzásjelet. A VBScriptben nincs különbség a kis- és nagybetűk között, ezért erre külön ügyeljünk. Az alábbi változónevek helyesek: Fejlec, Uzenet, uzenet2, kod_01. Az „uzenet”, az „Uzenet” és az „UZENET” nevek ugyanarra a változóra mutatnak. A változónevet mindig betűvel kell kezdeni, és nem tartalmazhat magyar ékezetes betűket, lásd a fenti definíciót is! A változóba az egyenlőségjel operátorral helyezünk értéket. Például: kod = 32 vagy Uzenet = “Dolgozz!” Fontos! Az előző értékadás azt jelenti, hogy a kod nevű változóba tároljuk el az egyenlőségjel jobb oldalán álló kifejezés értékét. Ez most csak egy számadat, de lehetne egy bonyolult képlet is. A változókba eltárolt értékeket a nevükre való hivatkozással olvashatjuk ki, illetve használhatjuk fel egy művelet során. Feladat: Írjuk át az előző programban szereplő konkrét egyéni adatokat változókba, és azok tartalmát jelenítsük meg az MsgBox utasítással. prog-03.vbs: Üzenetablak megjelenítése.
MsgBox "Törlöm a Windowst, oké?", 16, "Windows 98"
Uzenet = “Tanultál mára valamit?” Fejlec = “Iskolai programozás” PirosIkszIkon = 16 KerdesIkon = 32 IgenNem = 4 Kod = KerdesIkon + IgenNem prog-02.vbs: ... vagy barátságosabb változatban
MsgBox Uzenet, Kod, Fejlec
MsgBox "Jó progamozni?", 32+4, "Attila"
Az üzenetek beírásakor arra ügyeljünk, hogy egy sorba kerüljön az egész utasítássor, tehát ne nyomjuk meg az [Enter] billentyűt. Ha nagyon hosszú üzenetet akarunk megjeleníteni, akkor annak módját a változók alkalmazásánál fogjuk megismerni, addig írjunk mindent egy sorba.
Változók alkalmazása a programban A programunk csak egy feladat végrehajtására lenne alkalmas, ha minden értéket konkrétan beírnánk, mint ahogyan az előző egysoros programban is tettük. Sokkal hasznosabb lehet a programunk, ha az adatokat a program indulásakor bekérjük a felhasználótól, és azokkal dolgozunk, azokat jelenítjük meg a kiírásnál. Erre az időre az adatokat változókban fogjuk tárolni, amelyek a memória elnevezett területei. A változó típusa lehet szöveges vagy numerikus, vagyis tárolhatunk benne szöveges adatot vagy számot. A szöveges adat kiírható, karakterekből áll, míg a numerikus adattal számolhatunk, megszorozhatjuk egy másikkal. A szöveges adatot mindig idézőjelek közé kell tenni, míg a numerikus értékeket soha nem szabad. Móricz Attila, 2007. március.
Az „Uzenet” és a „Fejlec” nevű változók szöveges típusúak, mert idézőjelek közé írt karakterláncokat tárolnak. A következő három változóban számokat tároltunk el, amelyek közül az egyiket most nem használtuk fel, de ez nem zárja ki annak a lehetőségét, hogy a változóba egy értéket eltároljunk. Két numerikus változó tartalmát adjuk össze, amikor létrehozzuk a „Kod” nevű változót. Ez a sor példát mutat arra, hogyan olvashatjuk ki egy-egy változó tartalmát, és használhatjuk fel a saját számításunkhoz. A felhasználás másik módja az „MsgBox” sorában látható, ahol a változók tartalmát átadjuk az utasításnak, hogy azok alapján jelenítse meg a párbeszédablakot. Ilyenkor kiértékeli a kifejezéseket, amelyet a jelen esetben egy-egy változónév jelenít meg. Itt kiolvassa azok tartalmát, és a kapott adatokkal megjeleníti a párbeszédablakot. A „Kod” helyett a „KerdesIkon + IgenNem” kifejezést is megadhatnánk (de idézőjelek nélkül!), és akkor a program végrehajtásakor végezné el a kifejezés kiértékelését, vagyis elvégezné az összeadást. Ebből következően tetszőlegesen megadhatjuk a kifejezést, változóval, változók és állandó értékek összeadásával, ahogy nekünk tetszik. Nyúl, Általános Iskola, Informatika
8/3
Programozási alapismeretek (VBScript)
Adatbevitel a billentyűzetről Az előző programot fogjuk továbbvezetni, amikor az egyik változónak nem a programban adunk értéket, hanem a felhasználótól kérjük azt be. Ez már jobban fog hasonlítani egy igazi programhoz, hiszen minden futtatása alkalmával más és más eredményt nyújthat. Írjuk át a prog-03.vbs programot, úgy, hogy az„Uzenet” helyett az alábbi sorokat helyezzük el. Kerdes = “Írd be az üzenet szövegét!” Uzenet = InputBox(Kerdes)
A „Kerdes” változóba elhelyezzük a kiírandó kérdést, mert így sokkal szebb, áttekinthetőbb programot kapunk, ráadásul később könnyebb lesz módosítani a tartalmát. E változó tartalmát pedig átadjuk az „InputBox()” függvénynek, ami megjelenít egy párbeszédablakot szövegmezővel, ahol a felhasználó azt ír be, amit akar. A „Kerdes”-re azért van szükség, mert azt az üzenetet jelenítjük meg a párbeszédablakban a felhasználónak, és ő ebből fogja tudni, hogy mi a teendője, mit kell beírnia. A program futtatásakor a fenti ablak megjelenik, és a felhasználó a szövegmezőbe beírhat bármit. Ha az OK vagy a Mégse gombok egyikére kattint, akkor történik meg a kapott adat átadása az „Uzenet” változóba. Az OK esetén a szövegmezőbe beírt szöveget adja át a függvény, és az kerül be az „Uzenet” változóba. Az előző példánál maradva, a „Szia” szöveg beírása után az kerül átadásra az „Uzenet” változóba, és az teljesen egyenértékű azzal, mintha a programba beírtuk volna az Uzenet = “Szia” sort. Függvénynek nevezzük az olyan utasításokat, amelyek értéket adnak vissza. A függvény is kaphat bemenő paramétereket, amelyek meghatározzák a működését, de nem kötelező kapniuk. Az „InputBox()” függvénynek egy paramétert kötelező adni, amiben leírjuk, hogy milyen adatot kell a felhasználónak beírnia az ablakba. Megadhatjuk továbbá az ablak fejlécét, és egy olyan alapértelmezett karakterláncot, ami megjelenik a szövegmezőben az ablak megjelenésekor. A felhasználó eldöntheti, hogy azt elfogadja, átszerkeszti, vagy teljesen kitörli és átírja. Például: Kerdes = "Írd be az üzenet szövegét!" Fejlec = "Iskolai programozás" Uzenet = "Tanultál mára valamit?" Uzenet = Inputbox(Kerdes, Fejlec, Uzenet)
Az eredmény ugyanaz lesz, mint az előző oldalon, ha a felhasználó nem módosít az alapértelmezett üzeneten. A megjelenő adatbeviteli párbeszédablaknak lesz rendes fejlécszövege, olvashatjuk benne a kérdést, és válaszol is helyettünk a program, nekünk csak az [Enter]-t kell megnyomnunk. A program egyik érdekessége az, hogy az „Uzenet” változó egymás után kétszer kap értéket, de vajon mi lesz a program tartalma mire a „MsgBox” utasításhoz ér? Az első értékadás után lesz tartalma a változónak, amit felhasználunk az „InputBox” függvényben, megjelenítjük a tartalmát. Ez a függvény viszont mindenképpen ad vissza eredményt, és az kerül be az „Uzenet” változóba. Ha a szövegmezőbe számokat írunk, akkor azok numerikus értékként kerülnek átadásra, és így például a kódszámot is bekérhetjük egy újabb függvénnyel. Ezen függvény segítségével megoldható, hogy tetszőleges kérdésünkre választ kapjunk a felhasználótól, és az adatokat feldolgozzuk. Az „MsgBox” utasítással az eredményeket meg tudjuk jeleníteni, így már csak a feldolgozásra kell egy példát keresnünk, és tetszőleges adatfeldolgozó (számolós) programot írhatunk.
Műveletek a szöveges változókkal Ha hosszabb szöveget akarunk megjeleníteni az üzenetnél, akkor gondban vagyunk, mert a többsoros beírás hibához vezethet, másrészt pedig nem lesz a programunk átlátható. A probléma egyszerűen megoldható, mert a számokhoz hasonlóan a szöveges változók is „összeadhatók”, de ott nem numerikus összeadás történik, hanem a két karakterlánc egymás mögé illesztése. Például: a = “Írd ” : b = “be az” c = “ üzenet szövegét!” Kerdes = a + b + c Uzenet = InputBox(Kerdes)
Az „a” változó tartalmához hozzáírjuk a „b” változó tartalmát, majd a végén a „c”-ét, és az így kiértékelt kifejezés eredményét elhelyezzük a „Kerdes” változóban. Az eredménye ugyanaz lesz, mint az előzőekben, amikor egy karakterláncként adtuk meg a szöveget. Az összefűzéshez használható még az „&” jel is a „+” helyett. Szöveges változókkal más egyszerű művelet nem végezhető, ezekhez függvényeket kell alkalmaznunk, amelyekről majd később lesz szó.
Műveletek a numerikus változókkal A számítógép egyik legfontosabb feladata a számolás, így e téren lényegesen nagyobb lehetőségek állnak előttünk. Az összeadásra már láttunk példát, de ugyanígy elvégezhető az összes alapművelet és sok magasabb rendű művelet is. Alapműveletek: „+ - * /” (összeadás, kivonás, szorzás, osztás). Továbbá: hatványozás (^), osztás egészrésze (\), osztás maradéka (Mod kulcsszó). Alkalmazásukra lássunk egy példát. Az eredményeket a megjelenésből kiolvashatjuk. MsgBox 8^3, 8*8, 28 Mod 3
A 83 = 512; 8*8=64 (Infó-ikon és csak OK gomb); 28 Mod 3: 28/3 = 9 és a maradék 1.
Móricz Attila, 2007. március.
Nyúl, Általános Iskola, Informatika
8/4
Programozási alapismeretek (VBScript) A műveletek végrehajtására lássunk egy számítási feladatot, amelyet teljes egészében a program fog kiszámítani. Az adatbeviteli ablakban megadott értékek felhasználásával a program kiszámítja a henger tárfogatát és felszínét. prog-04.vbs: Számítási feladat megoldása ' ---- Adatbevitel, értékadás ---K1 = "Írd be a henger sugarát!" K2 = "Írd be a henger magasságát!" Fejlec = "Iskolai programozás" Kod = vbInformation + vbOKOnly Pi = 3.14159265358979
akkor újra be kell kérni a hibás adatokat. Erre a célra azonban más jobb vezérlési szerkezetek is a rendelkezésünkre állnak, így most más példát választunk. Feladat: Bővítsük ki az előző programot egy kezdeti kérdéssel, és ha arra „Nem” választ ad a felhasználó, akkor ne fusson le a program. Végrehajtás: Nyissuk meg, és mentsük el a prog-04.vbs fájlt, prog-05.vbs néven, majd az első sor elé és az utolsó sor mögé értelemszerűen írjuk be a megfelelő részleteket. prog-05.vbs: Indítási kérdés feldolgozással
r = Inputbox(K1, Fejlec) M = Inputbox(K2, Fejlec)
Fejlec = "Iskolai programozás" Kod = vbQuestion + vbYesNo Uzenet = "A henger számítása indulhat?"
' ---- Számítás, adatfeldogozás ---A = 2*r*r*Pi + 2*r*Pi*M V = r*r*Pi*M
MehetE = MsgBox(Uzenet, Kod, Fejlec) If MehetE=6 Then
‘ … a prog-04.vbs teljes egészében ' ---- Eredménykiírások ---U1 = "r=" & r & " m=" & M & vbCrLf U2 = "Felszín: A=" & A & vbCrLf U3 = "Térfogat: V=" & V Uzenet = U1 + U2 + U3
End If
MsgBox Uzenet, Kod, Fejlec
Feltételes elágazások (If Then Else) Az előző programunk szépen lefut egy alkalommal, de csak arra képes, hogy az utasításokat az elejétől a vége felé haladva végrehajtsa. A feltételes elágazás egy olyan vezérlési szerkezet, amelyben egy megadott feltétel igaz vagy hamis eredményétől függően tudjuk a programunkat elágaztatni két vagy több különböző irányba. Egyik felhasználási területe az adatok bevitele utáni adatellenőrzés, ahol a feltétellel megvizsgáljuk az adatok helyességét, és ha azok hibás értéket mutatnak, Móricz Attila, 2007. március.
Az első három sorban előkészítjük a szokásos módon az üzenetablak (MsgBox) megjelenítését, de a meghívása már különbözni fog az eddigiektől. Eddig utasításként használtuk, üzeneteket jelenítettünk meg, de nem foglalkoztunk azzal, hogy a felhasználó mit válaszol rá. Most függvényként hívjuk meg, mert ebben az esetben erre is van lehetőségünk, így a függvény visszatérési értékét átvehetjük egy változóba, és kiértékelhetjük egy másik utasítással. A MsgBox függvény az Igen/Nem gombok esetén a 6 vagy 7 értékkel tér vissza, és mi ezt tudjuk ellenőrizni. Minden gombnak megvan a maga kódja, így pontosan tudhatjuk, hogy mit válaszolt a kérdésünkre. OK (1), Mégse (2), Kilépés (3), Ismét (4), Tovább (5), Igen (6), Nem (7). Az MsgBox() függvény visszatérési értékét a MehetE változóba helyezzük el, így annak értéke 6 vagy 7 lesz. Az If utasítást követő feltételben azt fogalmazzuk meg, hogy a MehetE egyenlő-e 6-tal. Ha igen, akkor a Then utáni utasítások végrehajtódnak, de ha nem, akkor a végrehajtás az End If vagy az Else utasítás után folytatódik. Ha a Then utáni ág végrehajtódik, akkor is ráfut a program az End If utasításra, és utána folytatódik a program. Az „If, Then, Else, End If” utasítás feltételes elágazást biztosít a programban, ahol a megadott feltétel teljesülésétől függően fognak az egyes programágak végrehajtódni. Ha a feltétel hamis, akkor a Then utáni ágat teljesen átlépi, és az Else (különben) ágon folytatódik a végrehajtás. Mivel ezt az utasítást nem kötelező megadni, ennek hiányában az End If utáni utasításon folytatódik a program végrehajtása. Az End If megadása sem kötelező, ha a Then utáni utasítás a Then sorában van, és csak egysoros. Ezt a formát az egyszerűbb értékadásoknál szoktuk alkalmazni. Nyúl, Általános Iskola, Informatika
8/5
Programozási alapismeretek (VBScript) Az előző programokban szerepelt még egy-két újdonság, ami magyarázatra szorul. Amikor egy sort aposztróf jellel (’) kezdünk, akkor az a sor nem kerül végrehajtásra függetlenül attól, hogy mi a tartalma. Általában megjegyzéseket írunk az ilyen sorokba, amelyek nekünk szólnak, hogy később is értsük, mit, miért írtunk úgy a programba, ahogyan tettük. A megjegyzést a Rem utasítással is helyettesíthetjük, de az aposztróf rövidebb. A sorban lévő vonalak, csillagok, kötőjelek csupán a figyelemfelkeltést szolgálják, nincs szerepük. A másik érdekességgel az üzenetablak kódjának előkészítésénél találkoztunk, ahol a kódok megadásánál olyan változóneveket használtunk, amelyeket nem hoztunk létre előtte. A vbQuestion, vbYesNo és a többi vb-kezdetű változó nem változó, hanem konstans, azaz állandó, mégpedig olyan állandók, amelyeket a rendszer biztosít nekünk. A kód megadásánál írhatnánk 32+4-et is, de erről nem tudjuk, hogy mi a jelentése, míg a vbQuestion, vbYesNo sokkal egyértelműbb, ha egy kicsit tudunk angolul. A question = kérdés, a yes = Igen, No = nem, tehát a párbeszédablakban egy kérdést jelző ikon, az Igen és a Nem gombok lesznek láthatók. Ezt a 32+4-ből nem lehetne kideríteni a programot olvasva. A szöveges változóknál alkalmaztunk még egy szintaktikai fogást, ahol két utasítást egymás mögé írtunk be egy sorba. Ezt csak akkor tehetjük meg, ha a két utasítás közé kettőspontot (:) teszünk. Szintén hasznos, de nem mindig kötelező a szóközök alkalmazása, ami a programot áttekinthetőbbé teszi, ezért soha ne fukarkodjunk velük. E kis kitérő után térjünk vissza a feltételes elágazások értelmezéséhez. Feladat: Hozzunk létre egy új prog-00.vbs fájlt. Először írjuk be az első feltételt, teszteljük le több értékkel, és miután megértettük a működését, utána töröljük ki, és írjuk be a következő változatot. prog-00.vbs: Feltételes elágazások tesztelése ‘ 1. teszt: c=5 : If c=5 Then MsgBox c ‘ 2. teszt: c=5 If c=5 Then v=”Igen 5” Else v=”Nem 5” MsgBox v,,”A válaszom” ‘ 3. teszt: If true Then v=”Igen” Else v=”Nem” MsgBox v,,”A válaszom” ‘ 4. teszt: If false Then v=”Igen” Else v=”Nem” MsgBox v,,”A válaszom” ‘ 5. teszt: c=5 If c=5 Then valasz = ”Igen 5 a ‘c’ értéke.” MsgBox valasz,,”A válaszom” Else valasz = ”Nem 5 a ‘c’ értéke.” End If MsgBox valasz,,”A válaszom”
Móricz Attila, 2007. március.
‘ 6. teszt: If c=c Then MsgBox c, , c=c 1. teszt értelmezése: A c változó megkapja az 5 értéket, majd a kettőspont után következő If utasításban megvizsgáljuk, hogy a c=5? Ha igen, akkor a Then-ágon fog a végrehajtás folytatódni, tehát megjelenik egy üzenetablak benne a c értékével. 2. teszt értelmezése: A program kiegészül az Else-ággal, így az igaz és a hamis feltétel esetén is kap a v változó értéket. Mivel a Then és az Else után is csak egy-egy utasítás van és egy sorba kerültek, ezért nem kell használni az End If utasítást. A MsgBox eredménye mindenképpen megjelenik, ahol a Kod értékét kihagytuk, de ezt a vesszővel jeleztük a rendszernek. 3-4. teszt értelmezése: A True és a False beépített kulcsszavak, jelentésük igaz és hamis, így az If utáni feltétel eredménye előbb igaz, utána hamis, tehát a feltétel nem is feltétel ebben az esetben, mert mi kényszerítjük a végrehajtást a megadott irányba. A cél persze a True és a False kulcsszavak értelmezése volt. 5. teszt értelmezése: Az esetek többségében az egyes végrehajtási ágak nem egy-egy utasításból állnak, így azok nem férnek ki a Then után. Ebben az esetben nem szabad egyetlen utasítást sem írni a Then után, hanem azok kerüljenek a következő sorba. Ez a példa arra is felhívja a figyelmet, ha egy utasítás, mint például itt az MsgBox nem jó helyre kerül, akkor kétszer is megjelenik. 6. teszt értelmezése: A feltétel számunkra egyértelmű, és az értéke igaz, tehát a Then-ág végrehajtódik, megjelenik az üzenetablak, de a c=c vajon mit jelent ott, ahol az ablak fejlécszövege adható meg? A program végrehajtásakor a rendszer kiértékeli a c=c kifejezést, ami szemmel láthatóan egy logikai kifejezés, így az eredménye True vagy False lesz. Miután ezt megkaptuk, a rendszer az eredményt szöveggé alakítja, és az lesz az ablak fejléce, tehát az előző angol szavak egyike. Ezt a példát a legjobban egy értékadás értelmezése tudja bemutatni. Értelmezzük az alábbi logikai kifejezéseket, és találjuk ki, hogy mi lesz az egyes változók értéke. OkosE = OkosE = OkosE : MsgBox OkosE OkosE = OkosE + OkosE : MsgBox OkosE OkosE = OkosE > OkosE : MsgBox OkosE Mindegyik sor kiértékelésekor az alapdefiníciót vegyük elő. A bal oldalon álló változó értéke legyen az egyenlőségjel jobb oldalán álló kifejezés értéke. A jobb oldalon álló kifejezés az első esetben egy logikai kifejezés, tehát az OkosE=OkosE? Igen, tehát az eredmény igaz, vagyis True. A megjelenő üzenet „True”. A második esetben az OkosE változót előbb numerikus értékre alakítja (konvertálja) a rendszer, ami igaz esetén = -1. Így ennek az összeadásnak az eredménye -2. A harmadik sorban megvizsgáljuk, vajon az OkosE > OkosE? Persze, hogy nem, tehát a logikai kifejezés eredménye hamis, vagyis False, így a „False” szöveg fog megjelenni.
Nyúl, Általános Iskola, Informatika
8/6
Programozási alapismeretek (VBScript) Az előzőekben leírtakat alaposan olvassuk át, szánjunk időt a megértésükre, mert a programozásban a jeleknek, azok elhelyezési módjának nagy jelentősége van. Kis különbségek is egészen más jelentést eredményeznek, de a fenti példák ezeket jól megvilágítják.
Ciklusok alkalmazása (Do Loop While) Továbbra is az első számítási programunkat fogjuk bővítgetni, amelyet már egyszer le tudunk futtatni, illetve ha véletlenül indítottuk el, akkor kiléphetünk belőle az If utasításnak köszönhetően. Most azt fogjuk megvalósítani, hogy ha a programot többször szeretnénk lefuttatni, akkor ne kelljen mindig külön elindítani, hanem addig fusson újra meg újra a hurokban (angolul: loop), amíg (angolul: while) mi azt úgy akarjuk. Feladat: Bővítsük ki az első programunkat egy lezáró kérdéssel, és ha arra „Igen” választ ad a felhasználó, akkor fusson le a program újra. Végrehajtás: Nyissuk meg, és mentsük el a prog-04.vbs fájlt, prog-06.vbs néven, majd az első sor elé és az utolsó sor mögé értelemszerűen írjuk be a megfelelő részleteket. prog-06.vbs: Újraindítási kérdés feldolgozással do
‘ … a prog-04.vbs teljes egészében Kod = vbQuestion + vbYesNo Uzenet = "Újra akarsz számolni?" MehetE = MsgBox(Uzenet, Kod, Fejlec) Loop While MehetE=6
A Do utasítás egy ciklus elejét jelenti, ahová az újbóli végrehajtás során vissza kell térni. A Loop a hurok végét jelzi, amelyet most követ egy feltétel. A While és az utáni feltétel azt jelenti, hogy amennyiben a feltétel igaz, úgy a ciklus újra végrehajtásra kerül. Addig fut (do) a hurokban (loop) a program, amíg (while) a MehetE=6. Ha a kérdésnél az Igen gombra kattintunk, akkor a MehetE=6, így újra ugrik a végrehajtás a Do utasítás mögé. A program akkor is helyes marad, ha az utolsó sort kicseréljük az alábbira. Loop Until MehetE=7 A While (amíg) kulcsszó hatására addig fut a ciklus, amíg a megadott feltétel igaz, tehát egy belépési feltételt határozunk meg. Az Until (eddig, -ig) kulcsszó esetén kilépési feltételt adunk meg, mert a ciklus a feltétel teljesüléséig fut, és tovább nem. Tehát itt ha a feltétel igaz, akkor kilép a ciklusból. A példánkban ez azt jelenti, ha a Nem gombot nyomtuk meg, akkor a feltétel igaz, vagyis kilép a ciklusból. Móricz Attila, 2007. március.
Ha azt akarjuk, hogy a programunk az elején is kérdezzen és a végén is, akkor a prog-05.vbs fájl létrehozásának lépéseinél ne a prog-04.vbs fájlt illesszük be, hanem az imént készült prog-06.vbs fájl, és inkább prog-07.vbs fájl néven mentsük el.
Ciklusok alkalmazása (For To Step Next) Az előző ciklusfajtában egy megadott programrész addig ismétlődik, amíg a szabott feltételek azt lehetővé teszik, és a feltételek eredményeit mi kívülről tudjuk befolyásolni. A hagyományos számlálós ciklusok esetében ezt előre megszabjuk, mert pontosan tudjuk, hogy hányszor kell a ciklusnak lefutnia. Az alábbi példában egyszerű díszítősorokat készítünk, amelyek bemutatják a ciklus működését. prog-08.vbs: Számlálós ciklus alkalmazása For i=1 To 5 a = a + "@" b = b + a + vbCrLf Next MsgBox b A For utasítást követi a ciklusváltozó és a kezdőérték (i=1) megadása, majd a To kulcsszó után írjuk be a végértéket, ameddig a ciklusnak futnia kell. Ezután következhetnek a ciklusmagban azok az utasítások, amelyeket valahányszor végre akarunk hajtani. Amikor a ciklus egyszer lefut és eléri a Next utasítást, akkor a rendszer módosítja a ciklusváltozó értékét (itt növeli eggyel), és összehasonlítja a végértékkel. Ha túllépett a megadott értéken, akkor a Next utáni utasítással folytatja a végrehajtást. Ha még nem, akkor visszatér a For utáni sorra, és újra végrehajtja a ciklust. A mi esetünkben a ciklus ötször fut le. A ciklusmagban két egyszerű szöveges összefűzés történik. Az „a” változó először üres, így az egyenlőségjel jobb oldalán álló kifejezés eredménye egy darab „@” jel lesz. A „b” változó értéke az előző értéke plusz az „a” értéke plusz egy soremelés karakter lesz (vbCrLf = soremelés konstans). A ciklus lefutása után az MsgBox kiírja a „b” változó értékét, ami egy többsoros karakterlánc lesz. Feladat: Számoljuk ki, hogy mennyi lesz 1’000 Ft bankbetét értéke, 8%-os évi kamat mellett 36 hónap után. Végrehajtás: Indítsuk el a Jegyzettömb programot, és mentsük el prog-09.vbs fájlnéven a dokumentumot, majd írjuk be az alábbi programot. prog-09.vbs: Számlálós ciklus alkalmazása Penz=1000 : kamat=0.08 : ido=36 For i=1 To ido Penz = Penz * (1+kamat/12) Next MsgBox Int(Penz) & " Ft" ‘ Az eredmény 1270 Ft. A ciklus előtt értéket adunk a változóknak, majd elindítjuk a ciklust az ido változóban megadott értékig, vagyis itt 36szor fog lefutni (36 hónapra számolunk). A ciklusmagban egy Nyúl, Általános Iskola, Informatika
8/7
Programozási alapismeretek (VBScript) értékadó kifejezés található, ahol a Penz változó aktuális értékét megszorozzuk az „(1+kamat/12)”-vel. A kamat éves, ezért az egy hónapra eső értéke ennek 12-ed része, és ezt az 1-hez adva és a Penz változóval megszorozva megadja a pénzünk kamatos kamatának értékét. Ezt az eredményt betesszük a Penz változóba, így a következő futásnál már ezzel az értékkel fogunk számolni.
Saját függvények és szubrutinok írása A VBScript MsgBox utasítása vagy függvénye azt mutatja, hogy megadott értékékek átadása esetén az utasítás valamit végrehajt, illetve a függvény a futása végén egy értéket viszszaad, amit feldolgozhatunk. A VBScriptben nagyon sok utasítás és függvény található, amelyek lerövidítik a programjainkat, hiszen az adott feladatra nem nekünk kell programot írni, mert arra már valaki más megírta azt. Első lépésben a saját prog-04.vbs programunkat fogjuk átalakítani. A módszer előnye, hogy a programunk sokkal átláthatóbb lesz, és a későbbiek során egyszerűen fel tudunk majd építeni bonyolultabb programokat is. Feladat: Használjunk saját függvényeket a számítási részben. Végrehajtás: Nyissuk meg, és mentsük el a prog-04.vbs fájlt, prog-10.vbs néven, majd írjuk a legvégére az alábbi két függvényt.
• Ha a függvényünk átvesz értéket, akkor ahhoz adjunk meg változót, amiben átvesszük az értéket. • A paramétereket vesszővel válasszuk el. • Az érték visszaadására a függvény nevét használjuk, mint egy változót, és elhelyezzük benne a visszatérési értéket. • A függvény meghívása a nevével történik a fent látható módon. Pontosan annyi paramétert adjunk át neki, amennyit az elvár, különben hibaüzenetet kapunk. Saját szubrutin írása már összetettebb feladat, mert beszélnünk kell a változók láthatóságáról. Vegyük például az előző függvényeket. Hiába definiáljuk az első függvényben a Pi változót, az End Function utasításhoz érve az elveszti értékét. Ha a főprogramban hozzuk létre, akkor viszont minden alprogramban (függvényben, szubrutinban) látható lesz az értéke. Feladat: Építsük fel a számítási programunkat teljes egészében egyéni szubrutinokból. Végrehajtás: Nyissuk meg, és mentsük el a prog-10.vbs fájlt, prog-11.vbs néven, majd az alábbiak szerint bővítsük ki a programot. Az átdolgozás során alkalmazzuk a vágólap-kezelési ismereteinket! prog-11.vbs: Szubrutinok alkalmazása a programban Dim r, M, A, V, K1, K2, Fejlec, Kod, Pi
prog-10.vbs: Számítási feladat megoldása
2/1
‘ … a prog-04.vbs teljes egészében Function HengerTerfogat(r, M) Pi = 3.14159265358979 V = r*r*Pi*M HengerTerfogat = V End Function
Sub AdatBevitel() K1 = "Írd be a henger sugarát!" K2 = "Írd be a henger magasságát!" Fejlec = "Iskolai programozás" Kod = vbInformation + vbOKOnly Pi = 3.14159265358979
Function HengerFelszin(r, M) Pi = 3.14159265358979 A = 2*r*r*Pi + 2*r*Pi*M HengerFelszin = A End Function
r = Inputbox(K1, Fejlec) M = Inputbox(K2, Fejlec) End Sub
Folytatás: Cseréljük ki a számítási programrészben a két számítási sort (A=…; V=…) az alábbiakra. prog-10.vbs: Javítandó sorok új változata
2/2
' ---- Számítás, adatfeldogozás ---A = HengerFelszin(r, M) V = HengerTerfogat(r, M) Mentsük el a programot, és próbáljuk ki újra. Nem változik meg benne semmi, ugyanúgy fog lefutni. Ez egyrészt igazolja azt, hogy jól végeztük el a feladatot, másrészt azt, hogy így is jó a programunk. A saját néven elnevezett függvényünk működik, adatot vesz át, számol, és eredményt ad vissza. A saját függvény írásakor a következő szintaktikai szabályokat kell betartani. • A függvényünk a Function utasítással kezdődik és az End Function utasítással zárul. • A Function után megadott egyedi név ne tartalmazzon magyar ékezetes betűt, szóközt és általánosan a változókra érvényes szabályokat tartsuk be itt is. Móricz Attila, 2007. március.
AdatBevitel() Szamitas() EredmenyKiiras()
Sub A V End
Szamitas() = HengerFelszin(r, M) = HengerTerfogat(r, M) Sub
Sub EredmenyKiiras() U1 = "r=" & r & " m=" & M & vbCrLf U2 = "Felszín: A=" & A & vbCrLf U3 = "Térfogat: V=" & V Uzenet = U1 + U2 + U3 MsgBox Uzenet, Kod, Fejlec End Sub Function HengerTerfogat(r, M) HengerTerfogat = r*r*Pi*M End Function Function HengerFelszin(r, M) HengerFelszin = 2*r*r*Pi + 2*r*Pi*M End Function
A fenti programlistához most úgy jutottunk el, hogy folyamatosan bővítettük az ismereteinket, de ezután már ennek szellemében kell minden programunkat elkészítenünk. Az Nyúl, Általános Iskola, Informatika
8/8
Programozási alapismeretek (VBScript) első sorban definiáljuk azon változóinkat, amelyeket a programban úgy fogunk használni, hogy az minden alprogramban látható legyen. A programok alapvető felépítésénél azt mondtuk, hogy egy program három fő részből áll, így a mi három saját szubrutinunk is ezt a nevet kapja. A szubrutin egy olyan programrész, amelyben elkülönített módon hajtunk végre utasításokat, mert azokra a programban valószínűleg több alkalommal is szükség lehet. A szubrutin is vehet át értékeket, de soha nem ad vissza közvetlen módon. A mi példánkban nem vesz át értéket közvetlenül, de a globális változókon keresztül igen. Hiszen használja a Dim sorban megadott változókat, azok értékét beállítja vagy kiolvassa, tehát közvetett módon vesz ét értéket, és ad is vissza, ráadásul nem is egyet. A programunk a végrehajtás során a megadott szubrutinokat meghívja, majd a végrehajtás véget ér. Ha úgy vesszük, akkor a programunk csak 4 utasításból áll. A módszer előnye, hogy a programunk szép, átlátható, egyszerűen megérthető, hiszen magyar nyelvű „utasításokat” alkalmazunk benne, amelyek azt teszik, amire a nevük utal. Az AdatBevitel() szubrutinban bekérjük az adatokat, illetve az ehhez szükséges változók értékét megadjuk, és ezzel a szubrutin elvégezte a feladatát. A Szamitas()-ban a felszín és a térfogat kiszámítása történik meg, mert itt arra van szükség. A végén az EredmenyKiiras() szubrutinban pedig előállítjuk a kiíráshoz szükséges karakterláncokat, és azokat megjelenítjük egy üzenetablakban, amellyel megvalósul az eredménykiírás. A leírásból is kitűnik, hogy a program annyira egyszerű, hogy szinte nem is lehet mást tenni, mint ugyanazon szavakkal megmagyarázni, hogy az egyes szubrutinok mit tesznek, mert mindegyik csak azt teszi, ami a dolga.
Beépített függvények alkalmazása A programjaink készítése során nagyon sokszor előfordul, hogy olyan függvényre lenne szükségünk, amely egyszerűen megoldja az adatok kezelésével kapcsolatos problémáinkat, és így arra nekünk nem kell programot írnunk. A felszínt és a térfogatot nem számolja ki nekünk a VBScript, de ha már négyzetgyököt akarunk vonni egy számból, akkor elég csak az Sqr() függvényt használni. Például: MsgBox Sqr(16) ⇒ 4 Számos matematikai függvény áll a rendelkezésünkre a különféle számításokhoz, de a szöveges változóink kezelését is sok hasznos beépített függvény segíti. Mindezek ismertetésére itt nem kerül sor, mert az iskolai számítógépen megtalálható az a súgófájlt, amely tartalmazza a VBScript nyelv összes beépített függvényét és a nyelv teljes leírását. Ebből a súgófájlból a tanulás során a szükséges függvények kiolvas-
Móricz Attila, 2007. március.
hatók, és a programunkban kipróbálva az eredmények sok esetben önmagukért beszélnek. A gyakorláshoz lássunk pár példát, hogyan kell használni a súgót. Első lépésben indítsuk el a VBScript Language Reference súgófájlt, majd a bal oldalon a linkek közül válasszuk ki először a Functions (függvények) linket. Az angol nevű függvények jelentése minimális angol (esetleg német) tudással kitalálható, mert a függvények nevei ugyanúgy beszédes nevűek, mint ahogyan mi is elneveztük a szubrutinjainkat. Válasszunk egy függvényt találomra a lista elejéről, például az Asc() függvényt, és kattintsunk a nevére, hiszen az is egy hiperhivatkozás. Ekkor megjelenik az adott utasítás vagy függvény részletes leírása, amelyet a lap alján szinte minden esetben néhány példa zár. Nézzünk meg többet is! Indítsuk el a Jegyzettömb programot, mentsük el a fájlt például teszt-01.vbs néven, majd az előző példában látott módon próbáljuk ki a súgóban olvasható példákat. Használjuk a függvények eredményeinek kiírásához az MsgBox utasítást, ami egy üzenetablakban jeleníti meg az adott példa eredményét. A tesztek eredményei szinte mindig annyira önmagukét beszélnek, hogy nyelvtudás nélkül is megértjük, hogy az egyes függvények mire szolgálnak. Ha pedig vesszük a fáradságot, és megnézzük egy szótárban a függvény nevének jelentését, akkor még egyszerűbb lesz az ismerkedés. Dim A, M A = “Helló Világ” M = Right(A, 6) MsgBox M ⇒ “ Világ” (szóközt is!)
Vessük össze a programot a súgóban olvasottal. Annyi változtatást végeztem rajta, hogy a változóneveket egyedileg választottam meg, és az eredmények kiírásához a Right() függvény eredményét az MsgBox utasítással azonnal megjelenítettem, és nem tettem bele egy változóba. Igazából így is jó lett volna a példa: MsgBox Right(“Helló Világ”, 6)
Ez a változat azért is jobb, mert így csak a Right() helyére kell egy másikat írni, és azonnal kipróbálhatjuk a következő függvényt, amit a súgóból kiválasztunk. Kattintsunk a lap tetején a See also (lásd még) linkre, és azokat a további függvényeket hívhatjuk elő, amelyek logikailag kapcsolódnak a most látott függvényhez. A Right() a karakterlánc jobb oldaláról lemásolt pár karaktert, és azt adta vissza eredményül. A Left() a bal oldalról fog kimásolni, míg a Mid() a karakterlánc középső részéről teszi ugyanezt. Ugye érthető miért? (⇒ Angol szótár!)
Nyúl, Általános Iskola, Informatika