Programozási alapismeretek Tananyag: Problémamegoldási stratégiák, az informatikai problémamegoldás alapjai. A problémák megoldásához szükséges informatikai eszközök és módszerek. Programkészítési elvek. Algoritmikus struktúrák és adattípusok. Konstans, változó, típus fogalma. Elemi algoritmusok típusfeladatokra. Összegzés, eldöntés, keresés, számlálás, maximum-kiválasztás, kiválogatás, rendezések. A C++ programozási nyelv alapvető elemei. A Code::Blocks programfejlesztői környezet, szerkesztés, fordítás, futtatás. A programkészítés, mint termék előállítási folyamat. Alapvető tesztelési, hibakeresési módszerek. Vizsgajegyek: 1) csoport ZH: algoritmizálás (specifikáció, algoritmus) 2) csoport ZH: kódolás (specifikáció, algoritmus, kód, számítógép mellett) 3) évfolyam ZH: komplex feladat megoldása számítógép mellett 4) beadandó feladat 5) gyakorlati röpdolgozatok 10 darab Bevezető A programkészítés folyamata: 1. Specifikálás (miből? mit?) specifikáció 2. Tervezés (mivel? hogyan?) adat + algoritmusleírás 3. Kódolás (a gép hogyan?) kód (reprezentáció + implementáció) 4. Tesztelés (hibás-e?) hibalista (diagnózis) 5. Hibakeresés (hol a hiba?) hibahely, ok 6. Hibajavítás (hogyan jó?) helyes program 7. Minőségvizsgálat, hatékonyság (jobbítható-e? hogyan?) jó program 8. Dokumentálás (hogyan működik? használható?) használható program 9. Használat, karbantartás (még mindig jó?) évelő (időálló) program A specifikáció fogalma: Célja: a feladat formális megoldása Összetevői: 1. Bemenő adatok (azonosító, értékhalmaz [mértékegység]) 2. Ismeretek a bemenetről (előfeltétel) 3. Eredmények (azonosító, értékhalmaz) 4. Az eredményt meghatározó állítás (utófeltétel) 5. A használt fogalmak definíció 6. A megoldással szembeni követelmények 7. Korlátozó tényezők Tulajdonságai: 1. Egyértelmű, pontos, teljes 2. Rövid, tömör; formalizált 3. Szemléletes, érthető (fogalmak) Specifikációs eszközök: 1. Szöveges leírás 2. Matematikai megadás Az algoritmus fogalma: Fogalma:Lépések sorozata, amellyel egy feladat kiindulásától a megoldásig jutunk. Összeállítási módjai: Szekvencia (egymás utáni végrehajtás) Elágazás (választás kettő vagy több tevékenységből) Ciklus (ismétlés adott darabszámszor vagy adott feltételtől függően) Alprogram (egy összetett tevékenység, egyedi néven absztrakció)
Példa: a 3 szám lehet-e egy derékszögű háromszög 3 oldala? Specifikáció: Bemenet: x,y,z R (valós számok halmaza) Kimenet: lehet L (logikai értékek halmaza) Előfeltétel: x>0 és y>0 és z>0 Utófeltétel: lehet=(x 2 +y 2 =z 2 ) Itt rögzítettük az átfogót a z-re lehet=((x 2 +y 2 =z 2 ) vagy (x 2 +z 2 =y 2 ) vagy (y 2 +z 2 =x 2 )) Itt nincs rögzítve semmi Algoritmus: A programunk 4 fő részből áll: az adatok deklarálása az adatok beolvasása az eredmény kiszámítása az eredmény kiírása Be: x,y,z [x>0 és y>0 és z>0] lehet:=(x 2 +y 2 =z 2 ) Ki: lehet A deklarációt, az elemi utasításokat egy-egy dobozba írjuk. Később a be- és kimenetet nem algoritmizáljuk! Példa: Addjuk meg a másodfokú egyenlet egy megoldását! Az egyenlet: ax 2 +bx+c=0 Kérdések: Mitől függ a megoldás? bemenet Mi a megoldás? kimenet Mit jelent: megoldásnak lenni? utófeltétel Mindig/Mikor van megoldás? előfeltétel Biztos egy megoldás van? kimenet/utófeltétel Specifikáció: Bemenet: a,b,c R Kimenet: x R, van L Előfeltétel: a 0 Utófeltétel 1 : ax 2 +bx+c=0 Utófeltétel 2 : Utófeltétel 3 : van=(b 2 4ac 0) és van Algoritmus: Program MasodfokuEgyenlet: Változó a,b,c,x:valós van:logikai d:valós Be: a,b,c [a 0] d:=b 2 4ac van:=d 0 Ha van akkor Program Vége.
Algoritmusleíró nyelvek: Szöveges leírás Mondatokkal leírás Mondatszerű elemekkel pszeudokód Rajzos leírás Folyamatábra Struktogram Szekvencia: Utasítás1 Utasítás2 Utasítás3 Elágazás: Struktogram I Igaz-ág utasításai Feltétel Hamis-ág utasításai H Feltétel1 Feltétel2 egyébként Utasítások1 Utasítások2 UtasításokN Ciklusok: Bennmaradás feltétele ciklusmag utasításai ciklusmag utasításai Bennmaradás feltétele cv=tól ig ciklusmag utasításai Fejlesztői környezet (Kódolás) Keretrendszer (IDE): Code::Blocks (Letöltés: www.codeblocks.org, verzió 13.12) Struktogram szerkesztő program: structorizer (Letöltés: http://structorizer.fisch.lu) Alacsony szintű programozási nyelv: Assembly Magas szintű programozási nyelvek: C, C#, C++, Java, Pascal, VB, PHP Script programozási nyelvek: JS, Python, PHP, SH, PS Egyéb programozási nyelvek: SQL, Logo Gyakorlat oktató: Név: Menyhárt László Órakezdés: kedd 08:15 09:45 Email: menyhart@elte.hu (Üzenet küldési forma: [ProgAlap5] 09.17-ei házi) Weboldal: http://progalap.elte.hu Projekt létrehozása: projekt létrehozása (Windows-ra) sablon kiválasztása (Console application) projektnév megadása projekt szülőkönyvtár megadása fordítóválasztás projekt létrehozásának befejezése a kód beírása Build > Build: fordítás Build > Run: a fordított program futtatása
Code::Blocks programfejlesztés fájlfelépítése: Adatokkal kapcsolatos fogalmak Konstans az az adat, amely a műveletvégzés során nem változtathatja meg értékét, mindvégig ugyanabban az állapotban marad. Változó az ilyen adatféleségnek lényegéhez tartozik a változékonyság, más szóval: vonatkozhatnak rá olyan műveletek is, amelyek új értékkel látják el. Tudományosabban fogalmazva: nem egyelemű az állapothalmaza. Értékadás az az utasítás, amely révén a pillanatnyi állapotból egy új (a meghatározottba) állapotba kerül át a változó. (Nyilvánvaló, hogy konstans adatra nem vonatkozhat értékadás, a kezdőértéket meghatározón kívül.) Típus olyan megállapodás (absztrakt kategória), amely adatok egy lehetséges körét jelöli ki az által, hogy rögzíti azok állapothalmazát és az elvégezhető műveletek készletét. Azonosító Az a jelsorozat, amellyel hivatkozhatunk a tartalmára, amely által módosíthatjuk tartalmát. Kezdőérték A születéskor hozzárendelt érték. Konstansoknál nyilvánvaló, hogy deklarációban kapja; változóknál akár deklarációban, akár futáskor szerez értéket magának. A típus Összetettség(strukturáltság) szempontjából beszélhetünk strukturálatlan (vagy skalár, elemi) típusról, ha (az adott szinten) szerkezetet nem tulajdonítunk neki; vagy strukturált (más szóval: összetett) típusról, ha (elemibb) összetevőkre bontjuk. Elemi típusok egész típus Értékhalmaz: 2 31 + 2 31 1 (Min Egész Max Egész, ez 4 byte) Műveletek: +,,, /, Div (egészosztás), Mod (osztási maradék), (unáris mínusz), ^ (pozitív egészkitevős hatványozás) Relációk: =, <,,,, > Ábrázolás: kettes komplemens kódú Változatai: méret és előjel szerint sokféle valós típus Értékhalmaz:???...??? (Min Valós Max Valós nem definiáltak, vagy implementációfüggőek) Műveletek: +,,, /, ^, (unáris mínusz) Relációk: =, <,,,, > Ábrázolás: lebegőpontos ábrázolás (pontosabb lenne, ha e típus racionálisnak neveznénk, mert csak racionális számot képes ábrázolni) logikai típus Értékhalmaz: Hamis Igaz (Min Logikai Max Logikai: Hamis, illetve Igaz) Műveletek: nem, és, vagy (a szokásos logikai műveletek) Relációk: =, <,,,, > (általában = és használjuk) Ábrázolás: 0B = Hamis, 1B = Igaz (esetleg: 1B = Igaz) ahol xb = x érték bináris egészként ábrázolva
karakter típus Értékhalmaz: 0 255 kódú jelek ASCII (Min Karakter Max Karakter: a 0, illetve a 255 kódú karakter) Műveletek: karakter-specifikus nincs (esetleg a Kód:Karakter Egész függvény, és inverze a Kód:Egész Karakter függvény, amelyek a belső ábrázolással hozza kapcsolatba) Relációk: =, <,,,, >(a belső ábrázolásuk alapján nem ABC-sorrend!) Adminisztráció Célszerűen a programok forrása tartalmazzák: 1. a szerző adatait, 2. a feladat szövegét és 3. a feladat specifikációját; valamint 4. használható algoritmusmagyarázatokat; 5. a fejlesztés esetleg még hátralévő teendőit. Kis szívesség a Code::Blocks-tól: A szerző adatai (1.) a sablonba (a template-be) fixen beépíthetők. Programszerkezet main függvény intmain() { lokális adatdeklarációk a függvénytörzs végrehajtható utasításai returnfvérték; } Alaptípusok int egész long egész float valós double valós char karakter string szöveg bool logikai C++ alapok Első program #include<iostream>//kiírás és beolvasás függvény ebben található #include <cstdlib>//ez az exithez kell //könyvtárfájlokat (header-fájlok) az #include <rendszeré> és #include "saját" tudjuk a programba építeni using namespacestd;//így adhatom meg a névteret (csomagot); beolvasás és kiírás szempontjából a nyelvek kétfélék lehetnek: //a nyelv eleve tartalmaz ilyen parancsokat; a nyelv eljáráskönyvtára tartalmaz beolvasó és kiíró függvényeket intmain() { stringnev;//a string egy tetszőleges hosszúságú karaktersorozat constunsigned shortjokor = 18;//konstans deklarálása unsigned shortkor;//ez egy egész típus deklarálása cout<<"udvozollek!"<< endl;//így írok ki egy sort a konzol képernyőre cout<<"hogy hivnak? : "; cin>>nev;//beolvasás cout<<"szia "<<nev<<"!"<< endl;//sorvégi törés 2 lehetősége: endl, "\n" cout<<"hany eves vagy? : "; cin>>kor; if (kor<jokor) {//ez egy reláció (logikai kifejezés), továbbiak: ==,!=, <=, >=, > cout<<"tul fiatal vagy!"<< endl; exit(1); //ezzel kilépek a programból (hibaértékkel) } else { cout<<"ok"<< endl; } return0;//ha végigfut a program és elér a főfüggvény végéig,akkor hiba nélkül kilép }
Hibák fajtái: Fordítás során kiírt hibák javítása o Hibaüzenet értelmezése o A hiba okának kiderítése o A hiba keletkezési helyének keresése o A hiba kijavítása Futtatás során fellépő hibák javítása o Tesztelés o A hiba keletkezési helyének keresése o A hiba kijavítása Hibakeresés, hibajavítás A kétirányú elágazás használata Feladat: Egy ember vércsoportját (Rh negatív vagy pozitív) egy génpár határozza meg. Mindkét gén lehet "+" vagy "-" típusú. A "++" és a "+-" típusúak az "Rh pozitívok", a "--" típusúak pedig "Rh negatívok". Írjunk programot, amely megadja egy ember vércsoportját a génpárja ismeretében!" Specifikáció: Bemenet: x, y K (K - karakterek halmaza) Kimenet: v S (S - karakter-sorozatok halmaza) Előfeltétel: x, y {"+"," "} Utófeltétel: (x="+" vagy y="+") akkorv="rh+" és (x=" " és y=" ") akkorv="rh " Algoritmus: I x="+" vagy y="+" H v:= "Rh+" v:= "Rh " Kétirányú elágazások egymásba ágyazása Feladat: Egy ember vércsoportját (A, B, AB vagy 0) egy génpár határozza meg. Mindkét gén lehet a, b vagy 0 típusú. A vércsoport meghatározása: A={aa,a0,0a}; B={bb,b0,0b}; AB={ab,ba}; 0={00}. Írjunk programot, amely megadja egy ember vércsoportját a génpárja ismeretében! Specifikáció: Bemenet: x, y K (K - karakterek halmaza) Kimenet: v S (S - karakter-sorozatok halmaza) Előfeltétel: x, y {"a","b","0"} Utófeltétel: (x="a" és y "b" vagy x "b" és y="a") akkor v="a" vagy (x="b" és y "a" vagy x "a" és y="b") akkor v="b" vagy (x="a" és y="b" vagy x="b" és y="a") akkor v="ab" vagy (x="0" és y="0") akkor v="0" Algoritmus: kétirányú elágazások egymásba ágyazásával I x="a" és y "b" vagy x "b" és y="a" H v:="a" I x="b" és y "a" vagy x "a" és y="b" H v:="b" Algoritmus: sokirányú elágazással x="a" és y "b" vagy x "b" és y="a" I x="a" és y="b" vagy x="b" és y="a" H v:="ab" x="b" és y "a" vagy x "a" és y="b" v:="0" x="a" és y="b" vagy x="b" és y="a" x="0" és y="0" v:="a" v:="b" v:="ab" v:="0"
Algoritmus: segédváltozók bevezetésével (lokális változók deklarálása) vana:= x="a" vagy y="a" vanb:= x="b" vagy y="b" I vana H I vanb H I vanb H v:="ab" v:="a" v:="b" v:="0" kétirányú: if (Feltétel) { Utasítás I } else { Utasítás H } sokirányú (egymásba ágyazott kétirányúk): if (Feltétel 1 ) { Utasítás 1 } elseif (Feltétel 2 ) { Utasítás 2 } elseif ( ) { } elseif (Feltétel N ) { Utasítás N } else { Utasítás } sokirányú (speciális): switch (kifejezés) { case érték 1 : Utasítás 1 ; break; case érték N : Utasítás N ; break; default: Utasítás; break; } Elágazások használata (C++) Vércsoport (A,B,AB,0) feladat kódolása
A konzol input kódolása az előfeltétel alapján Előfeltétel: Helyes(x) ahol a Helyes(x) egy x-től függő logikai kifejezést rövidít most Ugyanez egyszerűbben: Szintaktikus és szemantikus ellenőrzés Értelemszerűen csak bizonyos típusú változóba történő olvasásnál alkalmazható (pl. valamely szám típusúba)
Ugyanez egyszerűbben: Ciklusok használata (for ciklus)
Tömbök használata
Tovább 3. előadás