Programozási alapismeretek 2. előadás
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.2/ Adatokkal kapcsolatos fogalmak Adatokkal kapcsolatos fogalmak A típus – általában A típus Elemi típusok – egész, valós, logikai, karakter Elemi típusok Kódolás – adminisztráció Kódolás Kódolás – C++ alapok Kódolás Hibakeresés – C++ alapok Hibakeresés Elágazások – C++ Elágazások Tartalom
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.3/ Adatokkal kapcsolatos fogalmak Konstans az az adat, amely a műveletvégzés során nem változtat(hat)ja meg értékét, mindvégig ugyanab- ban 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, ame- lyek új értékkel látják el. Tudományosabban fogalmazva nem egyelemű az állapothalmaza.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.4/ Adatokkal kapcsolatos fogalmak Értékadás az az utasítás, ami révén a pillanatnyi állapot- ból egy másikba (a meghatározottba) kerül át a változó. (Nyilvánvaló, hogy konstans adat- ra nem vonatkozhat értékadás, az egy, kez- dőé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 arzenálját.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.5/ Az adatjellemzők összefoglalása Azonosító Az a jelsorozat, amellyel hivatkozhatunk a tartal- mára, amely által módosíthatjuk tartalmát. Kezdőérték A születéskor hozzárendelt érték. Konstansoknál nyilvánvaló; változóknál dek- larációban kap-e, adható-e, vagy futáskor szerez értéket magának.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.6/ Az adatjellemzők összefoglalása Hozzáférési jog Adatokat módosítani, illetve értéküket lekérdez- ni, használni lehet; egy adat hozzáférés szem- pontjából háromféle lehet: lekérdezhető és módosítható; lekérdezhető és nem módosítható; nem lekérdezhető, de módosítható.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.7/ Az adatjellemzők összefoglalása Hatáskör A programszöveg azon tartománya, amelyben az adathoz hozzáférés megengedett. Élettartam A futási időnek az az intervalluma, amelyben az adat azonosítója végig ugyanazt az objektumot jelö- li. Megjegyzés: a fenti kissé talányos megfogalma- zás az alprogramok bevezetésével világossá válik. (Lokális vs. globális adatok.)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.8/ A típus Értéktípus (röviden: típus) Az adatoknak az a tulajdonsága, hogy értékei mely halmazból származnak és tevékenysé - geknek (függvények, operátorok, utasítások) mely „készlete, amely létrehozza, felépíti, lerom - bolja és részekre bontja” alkalmazható rá.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.9/ 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 tulaj- donítunk neki; vagy strukturált (más szóval: összetett) típusról, ha (elemibb) összetevőkre bontjuk.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.10/ A típus Műveletek, operátorok Értékadás = azonos típusúak közötti adat- mozgatás, másolatkészítés. Típusátviteli függvények = valamely típus érté- keit egy másik típus értékeire képezik le. A típusátviteli függvényeknek nevezetes faj - tái vannak, ezek: o konstrukciós, o szelekciós, illetve o speciális (de nélkülözhetetlen) egyéb függvé- nyek.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.11/ A típus Beolvasás = adott típusú érték bejuttatása a program számára (karakteres formáról belső ábrázolásra alakítása). Kiírás = adott típusú érték kijuttatása a fel- használó számára (belső ábrázolásról karak- teres formára váltása).
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.12/ A típus Azonosság = két, azonos típusú adat érték- egyezőségét vizsgáló logikai értékű operátor. Rendezések = rendezett típus esetén, két, azo- nos típusú adat sorrendjét vizsgáló logikai értékű operátorok. Számosság - függvény = megadja (ha megadha - tó), hogy mennyi az adott típus „számossá - ga”, azaz az értékhalmazát alkotó konstan - sok száma. A függvény egy típushoz nem pedig valamely adat- hoz tartozik.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.13/ A típus Min/Max-függvény = az értékhalmaz legkisebb, illetve legnagyobb eleme (feltéve, hogy ren - dezett típusról van szó. Transzformációs függvények = az adott típuson (esetleg direktszorzatán) értelmezett, az adott típusra képező függvények, operátorok. Ezek –értelemszerűen– típustól függően mások és mások lehetnek. A függvény egy típushoz nem pedig valamely adat- hoz tartozik.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.14/ Elemi típusok Egész típus Értékhalmaz: – (Min'Egész..Max'Egész) Műveletek: +, –, *, Div (egészosztás), ^ (pozitív egészkitevős hatványozás), Mod (osztási maradék), – (unáris mínusz) Relációk: =, Ábrázolás: kettes komplemens kódú Változatai: méret és előjel szerint sokfélék A beolvasáson, a kiíráson és értékadáson túliakkal foglalkozunk csak. 2-bájtos ábrázolást feltételezve.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.15/ Elemi típusok Valós típus Értékhalmaz: ????..???? (Min'Valós..Max'Valós nem definiáltak, vagy imple - mentá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ípust racionálisnak neveznénk, mert csak racionális számot képes ábrázolni)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.16/ Elemi típusok Logikai típus Értékhalmaz: Hamis..Igaz (Min'Logikai..Max'Logikai: Hamis, illetve Igaz) Műveletek: nem, és, vagy (a szokásos logi- kai műveletek) Relációk: =, Ábrázolás: 0 = Hamis, –1 = Igaz (esetleg: 1 = Igaz)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.17/ Elemi típusok Karakter típus Értékhalmaz: 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 Karakter: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!)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.18/ Célszerűen a forrás(ok) tartalmazzák 1. a szerző adatait, 2. a feladat szövegét és 3. a feladat specifikációját; valamint 4. használható algoritmus-magyarázatokat; 5. a fejlesztés még hátralévő teendőit. Kódolás (adminisztráció)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.19/ Az 1. a sablonba ( a template-be ) fixen be - építhető. 1. a szerző adatai (pl.): //Szlávi Péter #include #include … Kódolás (adminisztráció) Ezek a programomnak „csak” a megjegyzései lesznek. A fordító számára érdektelen információk.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.20/ A továbbiak elkezdhetők (pl.): //Szlávi Péter // … itt a szöveg … ////Specifikáció: //… itt a specifikáció … ////Teendők: //TODO a feladatszöveg kitöltése //TODO a specifikáció megalkotása //TODO … #include #include … Kódolás (adminisztráció) Ezek a programomnak „csak” a megjegyzései lesznek. A fordító számára érdektelen információk. A „teendők” („TO-DO”-k) elemei bárhova elhelyezhetők. Szintaxisa: //TODO a teendő szövege
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.21/ A sablon mentése: Kódolás (adminisztráció)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.22/ A sablon alapján egy új projekt létrehozása: … és a helye: Kódolás (adminisztráció) Ebből következik, h. csak az általam „mindig” használt gépen használható szolgáltatás.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.23/ A tennivalók „kikeresése”: Kódolás (adminisztráció) A kérdéses teendőre kattintva a kurzor a forráskód megfelelő sorának az elejére kerül.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.24/ Kódolás (C++ alapok) Programszerkezet – main függvény int main() { lokális adatdeklarációk … a függvénytörzs végrehajtható utasításai … return fvÉrt é k } Alaptípusok: int – egészfloat – valós double – valóschar – karakter string – szövegbool – logikai Deklaráció: típus adatazonosító, …
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.25/ Értékadás: változ ó = kifejezés ; //t í pusegyezés!!! Értékazonosság ( pl. logikai kifejezésben ): kifejezés == kifejezés /* típusegyezés */ Egyéb relációk ( pl. logikai kifejezésben ): kifejezés != kifejezés /* nem azonos? */ kifejezés <= kifejezés /* kisebb-egyenlő? */ kifejezés < kifejezés /* kisebb? */ … Logikai operátorok: kifejezés 1 && kifejezés 2 /* és */ kifejezés 1 || kifejezés 2 /* vagy */ megjegyzés megjegyzés Kódolás (C++ alapok) Figyelem! Nem: <<
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.26/ Kódolás (beolvasás és kiírás kérdése) Beolvasás és kiírás ( valamint fájlkezelés ) szempontjából a nyelvek kétfélék le- hetnek: A nyelv (eleve) tartalmaz beolvasó és kiíró utasításokat. (Pl. Pascal.) A nyelv szabványos eljáráskönyvtár- ban tartalmaz beolvasó és kiíró eljá- rásokat (függvényeket). (Pl. C és C++)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.27/ Konzol input: cin >> változ ó ; //változó konzol Konzol output: cout << kifejezés ; //konzol kifejezés-érték cout << … << '\n'; //konzol … +sorvég alternatív megoldás: cout << … << endl; //konzol … +sorvég Bementi adatfolyam Kimenti adatfolyam „Olvasd be” operátor „Tedd bele” operátor Kódolás (C++ alapok) Ezek leírása található a iostream fájlban.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.28/ String (=karakterlánc) konstans: " karakterlánc " Karakter konstans: ' karakter ' Könyvtárfájlok (header fájlok): o #include – a rendszeré o #include "…" – saját Névtér o using namespace … Kódolás (C++ alapok)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.29/ Hibakeresés – hibák Fordítás során kiírt hibák 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
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.30/ Hibakeresés (C++ alapok) Code::Blocks szerkezet és szintaktika…
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.31/ Hibakeresés (C++ alapok) A szintaktikus hiba javítása után…
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.32/ Hibakeresés (C++ alapok) A futás után… warning: character constant too long for its type
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.33/ Hibakeresés (C++ alapok) Nyomkövetés debugger nélkül – nyomkö- vetést támogató saját kiírások: Csak akkor fordul be a kódba, ha DEBUG definiált Feltételes fordítás
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.34/ Hibakeresés (C++ alapok) Nyomkövetés debugger nélkül – nyomkö- vetést támogató saját kiírások (folytatás) : Most a DEBUG nem definiált. Feltételes fordítás Most a DEBUG nem definiált.
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.35/ Feladatok elágazásra: vércsoport - 1 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 nega- tívok”. Írj programot, amely megadja egy ember vércsoportját a génpárja ismeretében!
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.36/ Feladatok elágazásra: vércsoport - 1 Specifikáció: Bemenet: x,y:Karakter Kimenet: v:Szöveg Előfeltétel: x,y {”+”, ”–”} Utófeltétel: (x=”+” vagy y=”+”) és v=”Rh+” vagy (x=”–” és y=”–”) és v=”Rh–” Algoritmus: x=”+” vagy y=”+” v:=”Rh+”v:=”Rh–” I N
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.37/ Feladatok elágazásra: vércsoport - 2 Feladat: Egy ember vércsoportját (A, B, AB vagy 0) egy gén- pár határozza meg. Mindkét gén lehet a, b vagy 0 típusú. A vércsoport meghatározása: A={aa, a0}; B={bb,b0}; AB={ab}; 0={00}. Írj programot, amely megadja egy ember vércsoportját a génpárja ismeretében!
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.38/ Feladatok elágazásra: vércsoport - 2 Specifikáció: Bemenet: x,y:Karakter Kimenet: v:Szöveg Előfeltétel: x,y {”a”, ”b”, ”0”} Utófeltétel: (x=”a” és y≠”b” vagy x≠”b” és y=”a”) és v=”A” vagy (x=”b” és y≠”a” vagy x≠”a” és y=”b”) és v=”B” vagy (x=”a” és y=”b” vagy x=”b” és y=”a”) és v=”AB” vagy x=”0” és y=”0” és v=”0”
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.39/ Algoritmus 1 : Kétirányú elágazások egymásba ágyazásával. Feladatok elágazásra: vércsoport - 2 x=”a” és y≠”b” vagy x≠”b” és y=”a” v:=”A”x=”b” és y≠”a” vagy x≠”a” és y=”b” v:=”B”x=”a” és y=”b” vagy x=”b” és y=”a” v:=”AB”v:=”0” I N I N I N
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.40/ Algoritmus 2 : Sokirányú elágazással. Feladatok elágazásra: vércsoport - 2 x=”a” és y≠”b” vagy x≠”b” és y=”a” x=”b” és y≠”a” vagy x≠”a” és y=”b” x=”a” és y=”b” vagy x=”b” és y=”a” x=”0” és y=”0” v:=”A”v:=”B”v:=”AB”v:=”0”
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.41/ Algoritmus 3 : Segédváltozók bevezetésével. Feladatok elágazásra: vércsoport - 2 vana:= x=”a” vagy y=”a” vanb:= x=”b” vagy y=”b” vana vanb v:=”AB”v:=”A”v:=”B”v:=”0” I N I N I N
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.42/ Kód: kétirányútöbbirányú elágazás (általános) if (Felt) { Ut I } else { Ut H } if (Felt 1 ) { Ut 1 } else if (…) { … } else if (Felt N ) { Ut N } else { Ut } elhagyható elhagyható Kódolási stílus- változatok (/) Kódolási stílus- változatok (ANSI/K&R) Kódolási stílus- változatok (ANSI/K&R) Kódolás (C++)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.43/ Kód: kétirányútöbbirányú elágazás (speciális) if (Felt) { Ut I } else { Ut H } elhagyható switch (kif) { case érték 1 : Ut 1 ; break; case … : … ; break; case érték N : Ut N ; break; default : Ut ; } elhagyható Kódolási stílus- változatok (K&R/ANSI) Kódolási stílus- változatok (K&R/ANSI) Kódolási stílus- változatok (K&R/ANSI) Kódolási stílus- változatok (K&R/ANSI) Kódolás (C++)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.44/ „Stílusbeállítás” Code::Blocks-ban Kódolás (C++)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.45/ Kód 1 : Ciklus (!), amelyből a kilépés az Ef. teljesülésekor. Ciklus (!), amelyből a kilépés az Ef. teljesülésekor. L. még korábban is!korábban Kódolás (C++) Figyeljünk föl egy tipikus kódolási hibára: a bemenet önhatalmú nagybetűssé tételére!
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.46/ Kódolás (C++) Kód 1 : Kód jegyzet- ként
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.47/ Kódolás (C++) Kód 3 :
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.48/ Kódolás (C++) Kód 3 : Kód jegyzet- ként
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.49/ Kódolás (C++) A konzol input kódolása az előfelté- tel alapján (skalár változóba) : Előfeltétel: Helyes(x) ahol a Helyes(x) egy x-től függő logikai kifeje- zést rövidít most do{ cout > x; cout > x; if (!Helyes(x)) { if (!Helyes(x)) { cout << "hibaüzenet" << endl; cout << "hibaüzenet" << endl; }; }; }while (!Helyes(x)); }while (!Helyes(x)); do{ cout > x; cout > x; if (!Helyes(x)) { if (!Helyes(x)) { cout << "hibaüzenet" << endl; cout << "hibaüzenet" << endl; }; }; }while (!Helyes(x)); }while (!Helyes(x));
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.50/ Kódolás (C++) Ugyanez egyszerűbben: cout << "kérdés"; cin >> x; if (!Helyes(x)) { cout << "\nhibaüzenet" << endl; exit(hibakód); } cout << "kérdés"; cin >> x; if (!Helyes(x)) { cout << "\nhibaüzenet" << endl; exit(hibakód); } cout << "kérdés"; cin >> x; if (!Helyes(x)) { cout << "\nhibaüzenet" << endl; exit(hibakód); } cout << "kérdés"; cin >> x; if (!Helyes(x)) { cout << "\nhibaüzenet" << endl; exit(hibakód); } Jó szokás a hibátlansághoz rendelni a 0 megállási kódot, s ettől eltérőt a különleges hibaesetekhez. '\n' = sorvégjel
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.51/ bool hiba; string tmp; … bool hiba; string tmp; … A beolvasáshoz szükséges lokális változók. Kódolás (C++) Szintaktikus (és szemantikus) ellenőrzéssel: Értelemszerűen csak bizonyos típusú változóba történő olvasásnál alkalmazható (pl. valamely szám típusúba).
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.52/ Szintaktikus (és szemantikus) ellenőrzéssel: Értelemszerűen csak bizonyos típusú változóba történő olvasásnál alkalmazható (pl. valamely szám típusúba). bool hiba; string tmp; … bool hiba; string tmp; … do{ cout > x; hiba=cin.fail(); if (hiba || !Helyes(x)) { cout > x; hiba=cin.fail(); if (hiba || !Helyes(x)) { cout << "hibaüzenet" << endl; cin.clear(); getline(cin,tmp,’\n’) }; }while (hiba || !Helyes(x)); cin -nek – mint objektumnak (bemeneti folyamnak) vannak metódusai/tagfüggvényei. Pl. a fail(). Az input-puffer törlése. Kell: #include Kell: #include '\n' = sorvégjel; olvasás sorvégjelig Kódolás (C++)
ELTE Szlávi - Zsakó: Programozási alapismeretek 2.53/ Pl. ha fájlból történik a beolvasás: Olvas(fájl,x) [Helyes(x)] cout > x; if (cin.fail() || !Helyes(x)) { cout > x; if (cin.fail() || !Helyes(x)) { cout << "hibaüzenet" << endl; exit(hibakód); }; Kódolás (C++) Ugyanez egyszerűbben:
Programozási alapismeretek 2. előadás vége