Algoritmus Muhammad Ibn Músza Al-Hvárizmi csillagász, matematikus, ie. I. századi perzsa tudós nevéből származik, akinek egyik könyvét latinra fordították, és a nevét pontatlanul Algorithmus-nak írták. Algoritmus fogalma Műveletek tartalmát és sorrendjét meghatározó egyértelmű utasításrendszer, amely a megfelelő kiinduló adatokból a kívánt eredményre vezet.
Az algoritmus megadása során különböző műveleteket végezhetünk az adatokon, az adatok segítségével. A műveleteket (tevékenységeket) az alábbi módon csoportosíthatjuk: A tevékenységek csoportosítása Elemi műveletek Azok a tevékenységek, amelyek nem igényelnek magyarázatot, azonnal végrehajthatók. Ezen műveleteket a végrehajtó (a számítógép) ismeri, és azokat végre tudja hajtani. Összetett műveletek Azok a tevékenységek, amelyek elemi tevékenységekből épülnek föl, tartalmukat mindig megkell magyarázni, maguk is egyszerűbb algoritmusokból épülnek föl. Ezen tevékenységeket a végrehajtó (a számítógép) nem ismeri, azok további magyarázatra várnak, ki kell bontani őket.
Tevékenységszerkezetek (több művelet végrehajtása során a műveletek során a végrehajtás sorrendjét az alábbi módokon lehet szervezni) 1. Szekvencia a szekvenciát alkotó utasítások a megadás (leírás) sorrendjében végrehajtandók utasítás 1 utasítás 2
2. Elágazás két (vagy több) műveletcsoport közül legfeljebb csak az egyiket kell végrehajtani. A döntés mindig valamilyen logikai feltételtől függenek, és annak ismeretében egyértelmű a döntés. 2/1: Egyszerű elágazás (egy utasításblokkból áll) az utasításblokk a feltételtől függően vagy végrehajtásra kerül, vagy nem. HA sötét_van AKKOR kapcsold fel a villanyt HVÉGE
2/2: Összetett elágazás 2/2/a: két utasításblokkból álló összetett elágazás A két utasításblokk közül a feltételtől függően pontosan az egyik utasításblokk hajtódik végre. HA meleg_van AKKOR nyisd_ki_az_ablakot KÜLÖNBEN kapcsold_le_a_kazánt HVÉGE
2/2/b: több utasításblokkból álló összetett elágazás A több utasításblokk közül legfeljebb az egyik kerül végrehajtásra - elképzelhető, hogy egyik feltétel sem teljesül. Ekkor - ha van KÜLÖNBEN ág, akkor az hajtódik végre - ha nincs KÜLÖNBEN ág, akkor egyik blokk sem hajtódik végre - ha több feltétel is teljesül, akkor sorrendben csak az első hajtódik végre ELÁGAZÁS KEZD HA kapható_túró AKKOR süss_túrós_sütit HA kapható_mák AKKOR süss_mákos_sütit HA kapható_dió AKKOR süss_diós_sütit KÜLÖNBEN süss_almás_sütit ELÁGAZÁS VÉGE
3. Ciklus egy feltételtől függően egy adott utasításblokk többszöri ismételt végrehajtását jelenti. Az utasításblokkot ciklusmagnak nevezzük. A feltételt ciklus vezérlő feltételnek. Pozitív vezérlés elve: a ciklusmagot akkor kell végrehajtani, ha a vezérlő feltétel igaz. Negatív vezérlés elve: a ciklusmagot akkor kell végrehajtani, ha a vezérlő feltétel hamis. Elöltesztelő ciklusok: a feltétel előbb értékelődik ki, majd megfelelő esetben végrehajtásra kerül a ciklusmag előbb tesztel, aztán ciklusmag. Hátultesztelő ciklusok: a ciklusmag végrehajtódik, majd kiértékelődik a ciklus vezérlő feltétel, és megfelelő esetben újra végrehajtásra kerül a ciklusmag.
3/1: logikai ciklusok 3/1/a: logikai elöltesztelő pozitív vezérlésű ciklusok működése: 1. HA a ciklus_vezérlő_feltétel igaz AKKOR 2. ciklusmag_utasításainak_végrehajtása 3. ugorj újra az 1. sorra 4. KÜLÖNBEN ciklus vége 3/1/b: logikai elöltesztelő negatív vezérlésű ciklusok működése: 1. HA a ciklus_vezérlő_feltétel hamis AKKOR 2. ciklusmag_utasításainak_végrehajtása 3. ugorj újra az 1. sorra 4. KÜLÖNBEN ciklus vége
3/1/c: logikai hátultesztelő pozitív vezérlésű ciklusok működése: 1. ciklusmag_utasításainak_végrehajtása 2. HA a ciklus_vezérlő_feltétel igaz AKKOR ugorj újra az 1. sorra 3. KÜLÖNBEN ciklus vége 3/1/d: logikai hátultesztelő negatív vezérlésű ciklusok működése: 1. ciklusmag_utasításainak_végrehajtása 2. HA a ciklus_vezérlő_feltétel hamis AKKOR ugorj újra az 1. sorra 3. KÜLÖNBEN ciklus vége
3/2 fix ismétlésszámú 3/2/a: fix ismétlésszámú ciklus ISMÉTELD n-szer ciklusmag utasításai IVÉGE - a ciklusmag utasításai a fejrészben megadott számszor hajtódnak végre
3/2/b: számlálós ciklus ISMÉTELD cv:=kezdőérték -től végérték -ig ciklusmag utasításai IVÉGE végrehajtása: 1. lépés: ciklus változó (cv, amely egy egész típusú változó) felveszi a kezdőértéket 2. lépés: HA a ciklusváltozó értéke kisebb, vagy egyenlő, mint a végérték AKKOR 3. lépés: ciklusmag utasításainak végrehajtása 4. lépés: ciklusváltozó értékének automatikus növelése 1-el 5. lépés. ugorj újra a 2. Lépésre 6. lépés: KÜLÖNBEN ciklus vége - a ciklusváltozó értéke a ciklus belsejében hozzáférhető (olvasható), de meg nem változtatható (nem írható) a ciklusváltozó értéke a 4. lépésben automatikusan változik. Általában 1-el nő, de ha ettől eltérő viselkedést várunk a ciklustól (pl. 1-el csökkenjen), azt a ciklus megadásakor jelezni kell. - a számlálós ciklusok esetén (elvileg) a végtelen ciklusba esés kizárt
Strukturált programozás: olyan algoritmusok készítése, amely csak a fenti három tevékenységszerkezet tartalmaz (szekvencia, szelekció, iteráció). Matematikusok bizonyították, hogy minden algoritmus elkészíthető csak ezen három szerkezet segítségével.
Algoritmusleíró eszközök 1.Folyamatábra Szabályok:. Minden folyamatábra pontosan egy START szimbólumot tartalmaz.. Minden folyamatábra legalább egy STOP szimbólumot tartalmaz.. Minden folyamatábra-szimbólumba pontosan egy irányított él vezet be, kivéve a START szimbólumot, melybe nem vezet be él.. Minden folyamatábraszimbólumból pontosan annyi irányított él vezet ki, amennyit a mellékelt ábrán jelöltünk (vagyis mindegyikből pontosan egy vezet ki, kivéve az elágazás szimbólumot, melyből kettő, és kivéve a STOP szimbólumot, melyből egy sem).. Minden folyamatábraszimbólumba vezet irányított élsorozat a START szimbólumból.. Minden folyamatábra szimbólumból vezet irányított élsorozat legalább egy STOP szimbólumba.
A folyamatábrával nem csak strukturált algoritmusok írhatók le. Ahhoz, hogy ellenkezője ne történhessen, az alábbiakra kell ügyelni: - azon feltételes elágazások, melyek nem ciklust jelölnek, a Nem és az Igen ágak egy pontban kell hogy találkozzanak - Nem vezethet be irányított él a ciklusok magjába, sem feltételes elágazások ágainak belsejébe. 2. Struktogramm Dobozolós módszer. Csak strukturált algoritmusok írhatók le segítségével. Hátránya, hogy előre jól kell dönteni a kiinduló téglalap méretéről. Az algoritmus bővítése során ugyanis könnyen előfordulhat, hogy kicsi lesz valamelyik téglalap.
3. Leíró nyelv Mondatszerű leíró eszköz, mely nem teljesen szabványosított, de könnyen elsajátítható. Csak strukturált algoritmusok írhatók le vele. Bővebben az algoritmusokról: http://vizypeti.googlepages.com/bme2 oldalon Algoritmusok és Adatstrukturak.pdf
A másodfokú egyenlet megoldásának algoritmusát az itt látható blokk diagram mutatja.
Visual Basic program készítésének menete A program indítása
A New Project ablakban a Standard EXE kijelölést elfogadjuk és megnyomjuk a Megnyitás gombot.. Hatására megjelenik a szerkesztői alakban a Form1 objektum.
A projekthez adjunk egy modult a Project / Add Module menüpont kiválasztásával, majd az Add Module ablakban a Module kijelölést elfogadva megnyomjuk a Megnyitás gombot.
A Formot kitöröljük a projektből a következő módon: 1. Kijelöljük a Form1-et 2. A Project/Remove Form1 menüpontot válasszuk ki és a Form1 törlődik a projectből.
Visual Basic változónév A változónév betűvel (angol ábécé betűi) kezdődik, tartalmazhat számokat, aláhúzás jeleket, és további betűket, a hossza maximum 255 karakter. A Visual Basic nem különbözteti meg egymástól a kis- és a nagybetűket. Például: Osszeg, Atlag, Max_index, db A Visual Basic nyelvben a hosszú utasítást vesszőnél új sorba folytathatjuk szóköz aláhúzás és újsor alkalmazásával. Lásd az alábbi deklarációs utasítást! Program sorának folytatása új sorban : Option Explicit Dim Osszeg As Integer, Atlag As Double, _ Max_index As Integer
Változók típusai Típus változó tartalma Integer -Egész szám Single -Egyszeres pontos, lebegőpontos szám Double -Dupla pontos, lebegőpontos szám String -Sztring: karakter, karaktersorozat Boolean -Logikai érték (True - igaz, False hamis)
(Tizedes pont vagy vessző operációs rendszerbeli beállítástól függ.) szám: 12, -3,56, 1,4E-2, 3,5E4 szöveg: "alma logikai érték: True, False Numerikus változó: egész, vagy valós számot tartalmaz. Az E után hatványkitevőt adhatunk meg. Szöveges változó: "" jelek között karaktersorozat
Értékadás változónév = konstans vagy kifejezés
Numerikus adatok átalakítása szöveggé: A CStr függvény használatával. Dim adat As Integer, szoveg As String Adat = 2 Szoveg = Cstr(Adat)
Karaktersorozat összefűzése Karaktersorozatokat a + vagy az & jellel fűzhetjük össze. MsgBox eredmény megjelenítésére alkalmas: Formája: MsgBox "szöveg", vbokonly," fejléc szövege"
Változó értékének beolvasása A változónak InputBox függvénnyel is adhatunk értéket változó = InputBox("belső szöveg", "ablak fejléce", "kezdő érték") A kezdő értékadás nem kötelező: változó = InputBox("belső szöveg", "ablak fejléce", "") vagy változó = InputBox("belső szöveg", "ablak fejléce")
Az InputBox sztring típusú adatot ad vissza, az adatot a bal oldali változónak megfelelően kell átalakítani: Dim ValosAdat As Double ValosAdat= CDbl(InputBox("V: ","Adat","3,5")) Dim EgeszAadat As Integer EgeszAdat = CInt(InputBox("E: ", "Adat", "2"))
Konstans deklarálása Const Név1 = érték1, Név2 = érték2 Const Pi = 3.141592654 Const G=9,81
Operátorok A műveletek képzéséhez az alábbi operátorokat használhatjuk: Példa: Eredmény: Összeadás: Kivonás: Szorzás: Osztás: Egészek osztása: + 2.6 + 3 5.6 8-13 -5 * 3*2 6 / 15/2 7.5 \ 15\2 7 Maradék képzés (modulus) Mod 16 Mod 2 0 Hatványozás: ^ 2^3 8
Műveletek sorrendje A Visual Basic precedencia-szabálya: elsődleges az ellentett képzés: hatványozás: ^ szorzás, osztás: *, / egészek osztása: \ modulus: Mod összeadás, kivonás: +, sztringek összeadása: & Ha el akarunk térni a precedenciától, akkor zárójelet kell alkalmazunk.
Függvények Fontosabb matematikai függvények: Abs(x) x abszolút értéke Atn(x) x arkusz tangense Cos(x) radiánban megadott szög koszinusza Sin(x) radiánban megadott szög szinusza Exp(x) ex értéke (e = 2.72 ) Fix(x) a tizedes jegyek elhagyásával kapott egész Egész szám Int(x) az x egész része, amely nem nagyobb az x-nél Log(x) ln x (természetes alapú logaritmus) Sgn(x) előjel függvény Sgn(x) =1, ha x>0, -1, ha x<0, 0, ha az x = 0 Sqr(x) x gyöke Tan(x) radiánban megadott szög tangense
Az Option Explicit utasítással kötelezővé tesszük a változók deklarációját a programban.
Véletlenszám előállítása A Randomize új kezdőértékre állítja be a véletlen szám generátort. Az Rnd () függvény egy véletlen számot állít elő 0 és kisebb mint 1 tartományban. Veletlenszam = Rnd() A véletlen szám valós szám, de a feladatokban láthatunk módszert egész véletlen szám generálására. Max és Min közötti véletlen szám: V = Int((Max Min +1)* Rnd()) + Min 1-90 közötti egész véletlen szám generálása: Lotto = Int(90 * Rnd()) +1
Ötször futtatva
Mintafeladat Olvassunk be egy valós számot, számítsuk ki a köbét és a köbgyökét:
Szelekciók A szelekció válogatást jelent, a feltétel teljesülése esetén hajtjuk végre a kiválasztott utasításcsoportot. Egyszerű feltétel A legegyszerűbb esetben két mennyiség összehasonlítását jelenti Relációs operátorok < kisebb, > nagyobb <= kisebb, vagy egyenlő >= nagyobb, vagy egyenlő = egyenlő, <> nem egyenlő
Az egyágú szelekció: ha (If) a feltétel teljesül, akkor a Then utáni utasításokat hajtja végre. If feltétel then Utasítások End If
Ha a értéke nagyobb mint b, akkor az ered legyen a két adat összege:
Kétirányú szelekció: Ha a feltétel teljesül, akkor a Then utáni Utasítások1 különben az Else utáni Utasítások2 hajtja végre. If feltétel then Utasítások1 Else Utasítások2 End If
Ha a értéke nagyobb mint b, akkor az ered legyen a két adat összege, különben a két adat szorzata:
Többirányú szelekció: Láncolt If If feltétel then Utasítások1 Else If feltétel2 Then Utasítások2 Else Utasításokn End If
A beolvasott egész adatról eldönti, hogy pozitív, negatív vagy zérus:
Többirányú szelekció: Select Case utasítás jobban áttekinthető. A kifejezéslista elemeit vesszővel választjuk el. Amelyik kifejezéslistánál teljesül a tesztkifejezés azon Case utasítás utáni utasítások lesznek végrehajtva, Ha a kifejezéslisták közül egyik sem teljesül és van Case else ág, akkor azok az utasítások lesznek végrehajtva.
A program futásainak eredménye:
Logikai műveleti jelek: Tagadás: Not Not Logikai kifejezés logikai kifejezés értékét ellenkezőre változtatja Logikai ÉS: And Logikai kifejezés 1 And Logikai kifejezés 2 Az And logikai ÉS akkor lesz igaz (True), ha mind a két logikai kifejezés igaz, különben bármelyik logikai kifejezés hamis, hamis lesz (False) az eredmény. Logikai VAGY: OR Logikai kifejezés 1 Or Logikai kifejezés 2 Az Or logikai VAGY, akkor lesz igaz (True), ha bármelyik logikai kifejezés igaz, csak akkor hamis (False), ha mindkét logikai kifejezés hamis.
Összetett feltételek Egy logikai értéket előállító kifejezés eléggé bonyolult lehet. Szerepelhetnek benne aritmetikai kifejezések, relációs operátorok és logikai műveletek. A relációkat logikai műveleti jellel is összekacsolhatjuk: (reláció1) logikai műveleti jel (reláció 2) Pl.: (A < 3) OR (B >12)
IsNumeric függvény igaz értéket ad vissza, ha a paraméterében lévő változó számértéket tartalmaz, különben hamis értéket: If IsNumeric(változó) Then számot tartalmaz Else nem számot tartalmaz End If Egy aposztróf használata: megjegyzés a programban
FELADAT Olvassunk be egy pontszámot, ellenőrizzük, hogy numerikus-e, valamint a pontszám beleesik-e a megadott határok (0-100) közé. Adjunk hibajelzést, ha nem numerikus, vagy ha nincs az Ponthatárok Jegy 0-50 1 51-65 2 66-75 3 76 85 4 86 100 5 intervallumban. A pontszám alapján jelenítsük meg a jegyet szövegesen.
Option Explicit Sub Main() Dim pontszam As Integer, s As String s = InputBox("Pontszam", "Pontszam beolvasasa", "") If IsNumeric(s) Then pontszam = CInt(s) If pontszam >= 0 And pontszam <= 100 Then If pontszam >= 0 And pontszam <= 50 Then MsgBox "elégtelen", vbokonly, "Osztályzat" ElseIf pontszam >= 51 And pontszam <= 65 Then MsgBox "elégséges", vbokonly, "Osztályzat" ElseIf pontszam >= 66 And pontszam <= 75 Then MsgBox "közepes", vbokonly, "Osztályzat" ElseIf pontszam >= 76 And pontszam <= 85 Then MsgBox "jó", vbokonly, "Osztályzat" ElseIf pontszam >= 86 And pontszam <= 100 Then MsgBox "jeles", vbokonly, "Osztályzat" End If Else MsgBox "Hibás adat!", vbokonly, "Hibajelzés" End If Else MsgBox "Nem numerikus adat!", vbokonly, "Hibajelzés" End If End Sub