Programozás és makrók Dr. Kallós Gábor 2008-2009. Programozás Bevezetés Eml.: hagyma-modell, programnyelvek, rendszerközeli szoftverek Problémamegoldás a számítógép segítségével Adott egy probléma Mit tud a gép? Milyen nyelven programozható A feladat mely részeit célszerű számítógéppel megoldani Célszerű-e esetleg átfogalmazni a problémát, hogy általánosabb megoldást kapjunk, ami később más esetekre is jó lesz Általában: elemzés és értelmezés (megoldás gép nélkül), adatszerkezet, algoritmuskészítés, kódolás, tesztelés, javítás/karbantartás (ld. még később is) Program utasítások sorozata, amelyet a gép végrehajt, és ezzel (jó esetben) a kiindulási adatokból előállítja a keresett megoldást Algoritmus a feladat megoldásának elméleti leírása, géptől független módon (algoritmus-leíró nyelv ill. szabvány, szöveges vagy rajzos formában) Adatszerkezet milyen adatokból kell kiindulni, milyen közbülső adatok, részeredmények kiszámítása szükséges 2 Programozás adattípusok Adatok, adattípusok Konstans Fix módon beírt adat Változó, jellemzői: Név (azonosító) Típus hogyan tárolja a gép az adatot a memóriában, milyen műveletek végezhetők vele Memóriaterület (itt található a változó értéke) Az adattípusok csoportosítása (leggyakrabban, kicsit leegyszerűsítve ) Egyszerű, valós, logikai, karakter (jel), sztring Összetett Tömb (sztring) Sorba vagy táblázatba rendezett azonos típusú, egyszerű adatok tárolására (az elrendezés jellegét a dimenzió adja meg), az adatok indexelhetők, hivatkozás: [index] Halmaz (általában csak egész ill. jel típusból) Műveletek Numerikus adatokra: +, -, *, /, ^ és még mod és div Sztringekre és jelekre: összefűzés Logikai adatokra: mint korábban Halmazokra: unió, metszet, különbség, eleme-e? Továbbá még: relációk (hasonlítások), függvények (pl. RANDOM, SQRT, INT, LEFT, RIGHT, LENGTH stb.) Kifejezések, kiértékelés: precedencia és balról-jobbra szabály 3 1
Programozás Az algoritmus elemei Alaptevékenységek Beolvasás, kiírás, értékadás (automatikus konverzióval) Vezérlőtevékenységek Szekvencia az eredeti (összetett) tevékenység egyszerűbb (akár: elemi) tevékenységek sorozatára bontható fel Szelekció (elágazás) egy logikai kifejezés értékétől függően kettő vagy néhány ág közül kiválasztjuk az aktuálisan végrehajtandót Iteráció (ciklus) a feladat megoldása egy tevékenység ismétlődő végrehajtását jelenti Leírás (pszeudokód, egyszerű lehetőség) be: i; ki: j ha log. kif. akkor tev.1. különben tev.2. elágazás vége ciklus amíg log. kif. ciklusmag ciklus vége Előltesztelős ciklus, bennmaradási feltétel, spec. eset: számlálós ciklus ciklus i=1-től n-ig ciklusmag ciklus vége ciklus ciklusmag amíg nem log. kif. ciklus vége Hátultesztelős ciklus, kilépési feltétel Minden struktúrának van eleje és vége! 4 Programozás példa algoritmusok 1. példa: a legnagyobb elem meghatározása Feladat: határozzuk meg, hogy a bekért pozitív számok közül (n db) melyik a legnagyobb! Ötlet: A 0 lesz kezdetben a legnagyobb (!). Ezután vesszük sorra a számokat, és aktuálisat hasonlítjuk az eddigi legnagyobbal. Ha találunk nagyobbat, akkor az lesz az új legnagyobb. Adatszerkezet Funkció Azonosító Típus Jelleg Elemek száma N Aktuális elem A Valós (Aktuális) maximum MAX Valós, output Ciklusváltozó, sorszám I Algoritmus 5 Példa algoritmusok 2. példa: elemek összege és átlaga Feladat: határozzuk meg bekért számok közül (n db) a pozitívak összegét és átlagát! Ötlet: kezdetben az összeg 0, és az aktuális részösszeghez mindig hozzáadjuk az éppen bekért elemet, ha az pozitív. A végén kiírjuk az összeget és az átlagot, ha volt pozitív elem. Ha nem volt pozitív elem a sorozatban, akkor nincs átlag. Adatszerkezet Funkció Azonosító Típus Jelleg Elemek száma N Aktuális elem A Valós Pozitív elemek száma DARAB Pozitív elemek összege OSSZEG Valós, output Pozitív elemek átlaga ATLAG Valós Output Ciklusváltozó, sorszám I 6 2
Példa algoritmusok 2. példa: elemek összege és átlaga Algoritmus 7 Példa algoritmusok 3. példa: faktoriális számítása Feladat: határozzuk meg, egy bekért nemnegatív egész szám (n) faktoriálisát! Negatív n számot a bekérésnél ne fogadjunk el! Ötlet: tudjuk, hogy n! = 1*2*3* (n-1)*n. A szorzat értéke kezdetben 1. Ezután vesszük sorra a számokat, és aktuálisat összeszorozzuk a részszorzattal. A szükséges jó n számot egy hátultesztelős ciklussal garantáljuk. Adatszerkezet Funkció Azonosító Típus Jelleg Elemek száma N (Aktuális) szorzat SZORZAT, output Ciklusváltozó, sorszám I Algoritmus 8 Példa algoritmusok 4. példa: lottószámok generálása Feladat: generáljunk lottószámokat! (Megj: már kihúzott számot nem lehet kihúzni újra.) Ötlet: véletlen számokat állítunk elő, ezekből képezzük a lottószámokat. Ha egy szám már szerepelt az eddig előállítottak között, akkor helyette újat generálunk mindaddig, amíg jó számot nem kapunk. Adatszerkezet Funkció Azonosító Típus Jelleg Lottószámok A Tömb (egész), output Éppen előállított szám SEGED Jó-e az éppen előállított szám JO Logikai Ciklusváltozó, sorszám I Ciklusváltozó (ellenőrzéshez) J 9 3
Példa algoritmusok 4. példa: lottószámok generálása Algoritmus 10 Példa algoritmusok 5. példa: kiválasztásos rendezés Feladat: rendezzünk egy tetszőleges adatokat tartalmazó n elemű tömböt! (A tömb elemeit most nem kell bekérnünk, és a rendezett tömböt nem kell kiíratnunk. Feltehetjük, hogy ezeket a tevékenységeket a program itt nem bemutatott része tartalmazza.) Megj: sokféle rendező eljárás ismeretes. A jó hatásfokú módszerek általában logikailag bonyolultabbak, és nehezebben érthetőek. Itt egy olyan megoldást mutatunk be, amely könnyen érthető, és a hatékonysága is elfogadható. Ötlet: megkeressük a sorozat legkisebb elemét, majd felcseréljük az első elemmel. A következő lépésben a második elemtől indulva újra megkeressük a mostani legkisebb elemet, és ezt felcseréljük a második elemmel, Adatszerkezet Funkció Azonosító Típus Jelleg Elemek száma N Sorozat elemei A Tömb (tetszőleges), output Aktuális minimum MIN Mint A elemei Az aktuális minimum sorszám INDEX Ciklusváltozó, rögzített sorszám I Ciklusváltozó (kiválasztáshoz) J 11 Példa algoritmusok 5. példa: kiválasztásos rendezés Algoritmus 12 4
Programozás 13 Programozás 14 Programozás Más algoritmus-leíró eszközök Jackson-féle ábra Szekvencia egymás mellé írással Szelekció karika, és utána egymás melletti feltételek Iteráció csillag, és alatta az ismétlődő tevékenység(sorozat) Folyamatábra Már elavult START Kiválasztás Rendezés kiválasztással I:=1, N 1 * Az I-edik a helyére Besorolás Be: N Előkészítés Minimum A[INDEX]:=A[I] A[I]:=MIN F:=1; I:=1 MIN:=A[I] INDEX:=I J:=I+1, N * Igaz I>=N Hasonlítás Ki: F Hamis I:=I+1 A[J] < MIN º END F:=F*I MIN:=A[J] INDEX:=J 15 5
Programozási nyelvek Programozási nyelvek A programozási nyelv olyan mesterséges nyelv, amelyet a számítógéppel történő kommunikáció megkönnyítésére terveztek A programozási nyelvek (megfelelő apparátus + szintaktikai és szemantikai szabályok) alkalmasak az algoritmusok gép számára érthető kódolására, megvalósítására Osztályozásuk (generációk) Első generáció gépi kód Második generáció assembly nyelvek, majd később finomodtak, ősi magasabb szintű nyelvek, emberközeli nyelvi elemek, cél a géptől való függetlenedés is K. Zuse már 1943-45-ben tervezett egy magasabb szintű nyelvet, de ez akkor nem terjedt el (Plankalkül) Az első sikeres megvalósítások: FORTRAN, LISP, COBOL, később az ALGOL Rövidítések: FORmula TRANslation, ALGOrithmic Language, LISt Processing Lényegében az összes mai nyelv ezen nyelvek valamilyen leszármazottja Harmadik generáció kifinomult magasszintű nyelvek Új, fontos filozófiák: strukturált programozás, objektum-orientált programozás A legtöbb ma használatos programnyelv ide sorolható, pl. Pascal, C, C++, C#, Delphi, Java 16 Programozási nyelvek Nyelvek osztályozása (folyt.) Negyedik generáció Új fejlesztések, fejlett kereskedelmi igények hatására Fejlett szoftver engineering technológiák alkalmazása, pl. komponensek beépítése, újrafelhasználhatóság ill. speciális alkalmazások Példák: SQL nyelvek, SPSS, MATLAB, Mathematica Ötödik generáció (még kifejletlen) Constraint (megszorítás) alapú programozás 17 Programozás Programfejlesztés A forrásnyelven írt program értelmezése, végrehajtása összetett tevékenység(sorozat) Fordítóprogram (Compiler) Értelmezi a forrásnyelven írt program utasításait, jelzi a szintaktikai hibákat A formailag hibátlan programokból elkészíti a gépi kódú utasításokat Ezzel a forrásprogramból ún. tárgyprogram keletkezik Interpreter Nem készít gépi kódú programot, hanem utasításonként értelmezi és hajtja végre a magasszintű nyelven leírt programot Ilyenkor a tesztelés egyszerűbb, de komoly hátrány, hogy nem keletkezik futtatható program Szerkesztőprogram (Linker) A lefordított tárgyprogram általában még nem futtatható, pl. azért, mert több részből állhat Végül a szerkesztőprogram teszi futtathatóvá a programot Általános munkafolyamatok: programírás, fordítás, szerkesztés A fejlesztői környezet is nagy változáson ment keresztül A modern, 3. generációs nyelvek kezdetben karakteres felületet használtak Most már az igényes grafikus környezet az általános 18 6
Ipari programfejlesztés Szoftvertechnológia Ipari méretű programfejlesztés (több ezer programsor és felette) esetén más módszereket kell alkalmazni, mint házi programkészítésnél Nem elég a korábbi elemzés-tervezés-algoritmuskészítés-programozás-tesztelés ciklus Az itt alkalmazandó módszerekkel a szoftvertechnológia (Software Engineering) tudományág foglalkozik A SE a teljes szoftverfejlesztési folyamatot magában foglalja, és érint kapcsolódó gazdasági területeket is, pl. projekt menedzsment Ez igen fontos terület, hiszen a profi szoftverkészítés nagyon nagy üzlet (a turizmus után a 2., megelőzi pl. az olaj- és autóipart is!) A SE nagyon fontos problémája a szoftvertermékek minősége, megbízhatósága Ilyen téren még bőven van tennivaló, 2005-ben egy tipikus hibaráta: 5-10 ezer soronként 1 hiba (hasonló hibaráta: napi 2 repülőgép katasztrófa, napi kb. 2000 elveszett postai levél USA) A szoftverfejlesztési folyamatban a menedzsment feladata a folyamat állandó felügyelete, értékelése (benne: adatgyűjtés), javítása + kapcsolódóan: a hatékonyság növelése, a költségek csökkentése, a dolgozók jó közérzetének a biztosítása Más mérnöki produktumokkal ellentétben a szoftver eléggé megfoghatatlan valami, ezért nem könnyű a folyamat megfelelő kezelése! 19 Ipari programfejlesztés A szoftverfejlesztés klasszikus fázisait mutatja be (visszacsatolásokkal) az ún. vízesés-modell (szemléletes: a víz visszafolyatása drága) Ez eléggé idealista megközelítés, a gyakorlatban inkább kevert, evolúciósiterációs fejlesztéseket szoktak alkalmazni Honnan tudjuk, hogy véget ért egy fázis? (A program még nincs kész) Elkészült az adott szinthez tartozó dokumentáció (ezekre van kotta ) Követelmények Specifikáció Tervezés Implementáció Validáció Fenntartás 20 Ipari programfejlesztés A SE nagyon fontos kérdése az emberekkel való bánásmód A hibák nagyobb részben egyszerű emberi mulasztásokból, félreértésekből erednek Tipikus pl. a követelmények rossz felmérése ill. a hibás specifikáció (akár egy egyszerű fogalom másként értelmezése miatt) Csapatszervezés Milyen a jó fejlesztőcsoport, hány tagja van (kb.) Projekt terv Nemcsak az elején van aktivitás, hanem a folyamat közben is A projekt menedzser szerepe meghatározó Menedzsment Tervezés, ütemezés (függőségek csökkentése, vészforgatókönyvek), kockázatok becslése és figyelése Minél később derül ki egy hiba, annál drágább a javítása Specifikáció (tdk: szoftver tervrajz ) Megfelelő formális eszközök állnak rendelkezésre a pontos leíráshoz Verifikáció és validáció Helyes-e a szoftver, ill. azt csinálja-e, amit elvártunk Fontos terület, az ellenőrzés már a folyamat korábbi fázisaiban is jelen van Átvételi teszt: a megrendelő jelenlétében végzendő Fenntartás A dolgozók betanítása, az esetlegesen felmerülő hibák javítása 21 7
Visual Basic általános bemutatás A Visual Basic (VB) a Microsoft cég által kifejlesztett programozási nyelv ill. fejlesztői környezet Az első verziója, a Visual Basic 1.0 1991-ben jelent meg Windows 3.0 platformra A nyelv gyorsan nagy népszerűségre tett szert, a fejlesztőknek kényelmes és hatékony eszközt adott a Windows alkalmazások vizuális tervezéséhez Könnyen tanulható volta miatt sokaknak a Visual Basic volt az első lépcső a programozás tanulásában A Visual Basic a korábban nagyon népszerű BASIC nyelven alapul, de modernebb, eseményvezérelt és korlátozott mértékben objektumorientált A Microsoft elsősorban a gyors fejlesztésre helyezte a hangsúlyt a tervezéskor (részben még a hatékonyság rovására is) A VB nagy vetélytársa a C++ Általánosan a C++ gyorsabb, és rugalmasabb struktúrákat biztosít, de konkrétan a Windows felület alatt a grafikus alkalmazások (GUI) fejlesztésére (sokkal) jobb a VB A C++-hoz (sőt a Pascalhoz) képest a VB nem támogatja a mutatókat, és nem kötelező benne a változók deklarálása, valamint nem kezeli nagyon szigorúan a típusokat Nem igazi OO nyelv, hiányzik a polimorfizmus és az öröklődés A hagyományos VB mellett 2002-ben megjelent a.net-es változat is A VB.NET a VB-nek egy teljesen újratervezett változata, az utolsó klasszikus VB verzió (VB 6.0) és a.net verziók között is már nagyon nehéz konvertálni a programokat A Visual Basic.NET már teljesen objektumorientált.net alapú nyelv, gyakorlatilag egyenértékű a.net nyelvek közül vezető szerepben lévő C#-pal (szi-sarp) 22 A Visual Basic nyelv BASIC-szerű nyelv, modernizálva Elsősorban Word és Excel környezetben nézzük Típusos deklaráció, de nem szigorú Az Option Explicit utasítással állítható be a szigorú deklaráció Fontosabb adattípusok Byte, Integer, Long, Boolean, String, Variant, (Részletesebben ld. Data Type Summary a Súgóban) Szubrutinok Ez az alapegység, Sub End Sub kulcsszavak között Szelekció If log.kif. Then ut1. Else ut2. End If Iterációk Léptetős: For i=1 To n ciklusmag Next Előltesztelős: Do While log.kif. ciklusmag Loop Hátultesztelős: Do log.kif. ciklusmag Loop While log.kif. // bennmaradási felt. A hátultesztelős ciklust az Until kulcsszóval is meg lehet adni 23 a Wordben (Excelben) Makrók engedélyezése Eszközök/Makró/Biztonság közepes szint Visual Basic Editor Váltás oda: Alt + F11 vagy /Visual Basic Editor A képernyő elemei Project ablak Dokumentumok, ahova makrókat készíthetünk/menthetünk Properties ablak Az objektumok tulajdonságai állíthatók itt be Szövegszerkesztő ablak Ide készíthetjük el a kódot, a szubrutinok futtathatók Egyes szintaktikai hibákat jelez a fordító a beírás után Immediate (futtatási) ablak Egyes futási eredmények megtekintésére Watch ablak Nyomkövetésre, hibakeresésre, mi nem nagyon fogjuk használni Kis eszköztár, fontosabb lehetőségek: Makró futtatása, szüneteltetése, leállítása, váltás (mindezt persze menüből is lehet, és gyorsbillentyűk is vannak, pl. F5 futtatás) Minden kulcsszóról infót kaphatunk az F1 lenyomására a Súgóban Ugyanitt tematikusan is kereshetünk 24 8
25 A Word objektummodellje A súgóból behívható Lényegében mindent meg csinálni programból, amit egyébként a Word tud 26 Formok használata Insert/UserForm Beszúrhatók az elemek a panelre (parancsgomb akciókat lehet kezdeményezni, rádiógomb, listadoboz, léptető lista, ) Properties ablak: leírás az elemről Egyes tulajdonságok módosíthatók Az elemhez tartozó kód dupla kattintásra előjön Ez alapból csak váz, a háttérben lévő eljárást persze meg kell írni Bal felső lista: választható elemek Jobb felső lista: választható események Váltás a szerkesztőmód és az objektum között: View/Code ill. Object (F7) 27 9
Formok használata (folyt.) 1. feladat: az első parancsgombra (CommandButton) kattintva írjuk ki az első bekezdés szövegét! 2. feladat: a 2. parancsgombra kattintva jelöljük ki a második szót! 28 Formok használata (folyt.) 3. feladat: rakjunk fel a formra 3 db rádiógombot, bekezdés, szó és karakter felirattal. Írjunk meg úgy egy nyomógomb mögötti eseménykezelőt, hogy a bejelölt egységeket számolja meg a szövegben! Ötlet: két szubrutint írunk, a második hívja az elsőt, amelyik a rádiógombokat kezeli 29 Egy összetett feladat (Ha nem tudjuk a makró kódját, akkor rögzíthetjük, és utána belenézhetünk, és kapunk ötleteket) Feladat: feladat-adatbázis alapján készítsünk véletlen zh feladatsort! (Minden feladat új bekezdésben van, és nincs üres bekezdés a dokumentumban.) Részfeladatok: Számoljuk meg a bekezdéseket (Generáljunk véletlen egész számot) (Írjuk ki az annyiadik bekezdést) Alakítsuk át az eddigi részeket úgy, hogy több feladatot is választhassunk (de amit már egyszer kiválasztottunk, azt újra nem lehet) Új üres dokumentumba rakjuk át a kiválasztott kérdéseket (Táblázatba szúrjuk be az átvitt kérdéseket) 30 10
31 A dokumentumok: 32 Az Excel objektummodellje A súgóból behívható 33 11