Tesztelési követelmények. Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok.

Hasonló dokumentumok
Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok. Tesztelési követelmények.

Nyolc királynő probléma. Programozás alapjai II. (12. ea) C++ visszalépéses (backtrack) algoritmusok táblás játékok. Probálgatás

Programozás alapjai II. (12. ea) C++ visszalépéses (backtrack) algoritmusok táblás játékok

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

Programozás alapjai 2. Hibakeresés, tesztelés

Programozás alapjai 2. Hibakeresés, tesztelés. Hibakeresés módszerei. Nyomkövető kiírások. madártávlatból

Programozás II gyakorlat. 6. Polimorfizmus

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

117. AA Megoldó Alfréd AA 117.

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Nyolc királynő probléma. Programozás alapjai II. (13. ea) C++ visszalépéses (backtrack) algoritmusok táblás játékok, összefoglalás.

Programozás alapjai II. (7. ea) C++

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

1. Alapok. Programozás II

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

3. Osztályok II. Programozás II

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Felhasználó által definiált adattípus

Pénzügyi algoritmusok

Programozás C++ -ban

500. AA Megoldó Alfréd AA 500.

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Algoritmusok és adatszerkezetek II.

Programozás II. ATM példa Dr. Iványi Péter

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Bevezetés a programozásba 2

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás II. 2. Dr. Iványi Péter

Szoftvertechnológia alapjai Java előadások

Programozás alapjai C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

Maximum kiválasztás tömbben

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

PROGRAMOZÁS tantárgy. Gregorics Tibor egyetemi docens ELTE Informatikai Kar

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Cekla. Készítette Doxygen Tue Sep :13:44

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

ISA szimulátor objektum-orientált modell (C++)

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Szoftvertechnolo gia gyakorlat

Programozás alapjai II. (4. ea) C++

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

C#, OOP. Osztályok tervezése C#-ban

A C# programozási nyelv alapjai

Rekurzió. Programozás alapjai C nyelv 9. gyakorlat. Rekurzív algoritmus. Rekurzív algoritmus fajtái. Példa: n! (2) Példa: n!

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Pénzügyi algoritmusok

A legalacsonyabb szintű tesztelés. A programot felépítő egységek tesztelése Unit: egy rendszer legkisebb önálló egységként tesztlehető része.

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Programozási nyelvek Java

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Programozás II gyakorlat. 8. Operátor túlterhelés

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

500. CC Megoldó Alfréd CC 500.

128. AA Megoldó Alfréd AA 128.

Programozási nyelvek Java

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Konkurens TCP Szerver

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Pénzügyi algoritmusok

BME MOGI Gépészeti informatika 4.

Access adatbázis elérése OLE DB-n keresztül

Számítógép és programozás 2

Mintavételes szabályozás mikrovezérlő segítségével

Informatika terméktervezőknek

C++ Standard Template Library (STL)

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás Minta programterv a 2. házi feladathoz 1.

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Objektumorientált programozás C# nyelven III.

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

29. Visszalépéses keresés 1.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

A C# PROGRAMOZÁSI NYELV

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

C# osztályok. Krizsán Zoltán

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Programozási nyelvek JAVA EA+GY 1. gyakolat

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Java és web programozás

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Java és web programozás

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

Bevezetés, a C++ osztályok. Pere László

Átírás:

Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -1- Tesztelési követelmények Legyen független, és megismételhető Legyen áttekinthető és tükrözze a tesztelt kód struktúráját. Legyen hordozható és újrafelhasználható. Segítsen a teszt írójának a problémára koncentrálni. Legyen gyors és automatizálható. Gyakran a tárolóba (svn) való betétel feltétele az ún. unit teszt sikeressége. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -2- Google Test Kis méretű, forráskódban elérhető http://code.google.com/p/googletest/ Platformfüggetlen (WinX, MAC, LINUX) Assertion alapú success, nonfatal, fatal Teszt program: teszt esetek tesztek Assertion Hasonlító függvényeket hívnak Hiba esetén kiírják a hiba helyét, kódját ASSERT_* fatális hiba a program megáll EXPECT_* nem fatális hiba tovább fut ASSERT_EQ(2*2, 4) << "2*2 hiba"; for (int i = 0; i < 10; i++) { EXPECT_LT(i-1, 2*i) << "i nem kisebb mint 2*i i=" << i; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -3- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -4- Egyszerű feltételek Egyszerű példa Utasítás ASSERT_EQ(expected, actual) ASSERT_NE(val1, val2) ASSERT_LT(val1, val2) ASSERT_LE(val1, val2) ASSERT_GT(val1, val2) ASSERT_GE(val1, val2) ASSERT_STREQ(exp_str, act_str) ASSERT_STRNE(str1, str2); ASSERT_STRCASEEQ(exp, act); ASSERT_STRCASENE(str1, str2) Teljesülnie kell expected == actual val1!= val2 val1 < val2 val1 <= val2 val1 > val2 val1 >= val2 a két C string azonos a két C string nem azonos a két C string azonos (kis/nagy betű az.) a két C string nem azonos (kis/nagy b.) #include <gtest/gtest.h> #include <vector> std::vector<int> v1(3, 1), v2(3, 2); TEST(VektorTeszt, MeretVizsgalata) { ASSERT_EQ(v1.size(), v2.size()) << "A méret is számít!"; TEST(VektorTeszt, ElemekVizsgalata) { for (unsigned int i = 0; i < v1.size(); i++) EXPECT_EQ(v1[i], v2[i]) ; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -5- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -6-

Egyszerű példa eredménye [==========] Running 2 tests from 1 test case. [----------] 2 tests from VektorTeszt [ RUN ] VektorTeszt.MeretVizsgalata [ OK ] VektorTeszt.MeretVizsgalata (0 ms) [ RUN ] VektorTeszt.ElemekVizsgalata.\main.cpp(12): error: Value of: v2[i] Actual: 2 Expected: v1[i] Which is: 1... [ FAILED ] VektorTeszt.ElemekVizsgalata (0 ms) [----------] 2 tests from VektorTeszt (0 ms total) [==========] 2 tests from 1 test case ran. (0 ms total) [ PASSED ] 1 test. [ FAILED ] 1 test, listed below: [ FAILED ] VektorTeszt.ElemekVizsgalata Install, használat 1. Telepítés forrásból http://code.google.com/p/googletest/ 1. letöltés, fordítás 2. include és lib elhelyezése (GTEST_ROOT) 2. Lefordított változat svn-ből: 1. https://svn.iit.bme.hu/proga2/gtest_root (GTEST_ROOT) 3. include és lib keresési út beállítása (GTEST_ROOT)/include (GTEST_ROOT)/lib re C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -7- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -8- Visual Studio include dir Visual Studio lib C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -9- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -10- Bonyolultabb tesztek (fixtures) Tesztek kölcsönhatásának kiküszöbölése Setup/TearDown Önálló, azonos tartalmú adatok, adatszerkezetek létrehozása Fixtures: Teszt osztályból kell származtatni. Minden teszt eset előtt létrejön Utána pedig megszűnik Setup() TearDown() TEST helyett TEST_F makró Bonyolultabb tesztek /2 class VektorTeszt : public ::testing::test { protected: std::vector<int> v1, v2; void setup() { v1.push_back(1); v2 = v1; void TearDown() { ; TEST_F(VektorTeszt, ElemekVizsgalata) { for (unsigned int i = 0; i < v1.size(); i++) EXPECT_EQ(v1[i], v2[i]); C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -11- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -12-

További ellenőrzések További lehetőségek Utasítás ASSERT_THROW(statement, excep_type) ASSERT_ANY_THROW(statement) ASSERT_NO_THROW(statement) ASSERT_PRED_FORMAT1(pred, val1) ASSERT_PRED_FORMAT2(pred, val1, val2) ASSERT_FLOAT_EQ(expected, actual) ASSERT_DOUBLE_EQ(expected, actual) ASSERT_NEAR(val1, val2, abs_error) SUCCEED() FAIL(); ADD_FAILURE() ADD_FAILURE_AT("file_path", line_number); Teljesülnie kell adott típust dobnia kell bármit kell dobnia nem dobhat pred(val1) == true pred(val1, val2) == true expected ~= actual expected ~= actual abs(val1-val2) <= abs_error siker végzetes; nem végzetes nem végzetes Testreszabási lehetőség. PrintTo() xml output véletlen szekvencia parancssorból, vagy környezeti változóból paraméterezhető http://code.google.com/p/googletest/wiki/advancedguide C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -13- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -14- Nyolc királynő probléma Helyezzünk el nyolc királynőt úgy egy sakktáblán, hogy azok ne üssék egymást! Egy megoldást keresünk nem keressük az összes lehetséges elhelyezést. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -15- Probálgatás Egy oszlopban csak egy királynő lehet, ezért oszloponként próbálgatunk. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -16- Visszalépés (back track) A 24. lépésben visszalépünk, és levesszük a korábban már elhelyezett királynőt. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -17- Visszalépés és újból próba A 36. lépésben ismét vissza kell lépni. A 60. lépés ismét kudarcba fullad. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -18-

Visszalépés és újból próba Egy lehetséges megoldást a 876. lépésben kapunk. Hogyan modellezhető Okos tábla, buta királynő A sakktábla ismeri a szabályokat és nyilvántartja a királynők helyzetét. A királynő lényegében nem csinál semmit. Okos királynő, buta tábla A királynő ismeri a szabályokat és nyilvántartja a saját pozícióját. A sakktábla nem tud semmit. Okoskodó tábla, okos királynő C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -19- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -20- Okos tábla metódusai: Szabad adott pozícióra lehet-e lépni Lefoglal adott pozíciót lefoglalja Felszabadít adott pozíciót felszabadítja Rajzol kirajzolja a pillanatnyi állást Probal elhelyezi a királynőket Metódus spec. - Szabad bool Szabad(int sor, int oszlop); megvizsgálja, hogy az adott helyre lehet-e királynőt tenni. bemenet: sor sor (1..8) oszlop oszlop (1..8) kimenet: true a pozíció szabad false ütésben van a királynő C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -21- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -22- Metódus spec. - Lefoglal void Lefoglal(int sor, int oszlop); Lefoglalja az adott pozíciót. bemenet: sor sor (1..8) oszlop oszlop (1..8) Metódus spec. - Felszabadit void Felszabadit(int sor, int oszlop); Felszabadítja az adott pozíciót. bemenet: sor sor (1..8) oszlop oszlop (1..8) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -23- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -24-

Metódus spec. - Rajzol void Rajzol(int sor, int oszlop); Kirajzolja a táblát. Az aktuális sor, oszlop pozícióba jelet tesz bemenet: sor sor (1..8) oszlop oszlop (1..8) Metódus spec. - Probal bool Probal(int oszlop); A paraméterként kapott oszlopba és az azt követő oszlopokba megpróbálja elhelyezni a királynőket bemenet: oszlop sorszáma (1..8) kimenet: true - ha sikrült a 8. oszlopba is. false - ha nem sikerült C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -25- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -26- Implementáció - Probal bool Probal(int oszlop) { int siker = 0, sor = 1; do { if (Szabad(sor, oszlop)) { Lefoglal(sor, oszlop) if (oszlop < 8) siker = Probal(oszlop+1); else siker = 1; if (!siker) Felszabadit(sor, oszlop); sor++; while (!siker && sor <= 8); return(siker); következő oszlopba nem sikerült, visszalép C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -27- Adatszerkezet (mit kell tárolni) Adott sorban van-e királynő 8 sor: vektor 1..8 indexszel Adott átlóban van-e királynő főátlóval párhuzamos átlók jellemzője, hogy a sor-oszlop = álladó (-7..7-ig 15 db átló) mellékátlóval párhuzamos átlók jellemzője, hogy a sor+oszlop = álladó (2..16-ig 15 db átló) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -28- sor - oszlop = állandó 1 2 3 4 5 6 7 8 1 234 5 6 7 8 Átlók tárolása sor + oszlop = állandó C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -29- Tabla osztály megvalósítása class Tabla { bool sor[8]; bool f_atlo[15]; bool m_atlo[15]; int tab[8]; int probalkozas; // sorok foglaltsága // főátlók (s-o) // mellékátlók (s+o) // kiíráshoz kell // kiíráshoz kell bool& Sor(int i) { return sor[i-1]; bool& Fo(int s, int o) { return f_atlo[s-o+7]; bool& Mellek(int s, int o) { return m_atlo[s+o-2]; int& Tab(int s) { return tab[s-1]; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -30-

Tabla osztály megvalósítása /2 bool Szabad(int s, int o) { return Sor(s) && Fo(s, o) && Mellek(s, o); void Lefoglal(int s, int o) { Sor(s) = Fo(s, o) = Mellek(s, o) = false; Tab(s) = o; void Felszabadit(int s, int o) { Sor(s) = Fo(s, o) = Mellek(s, o) = true; Tab(s) = 0; Tabla osztály megvalósítása /3 public: Tabla(); bool Probal(int oszlop); void Rajzol(int sor, int oszlop); ; Tabla::Tabla() { probalkozas = 0; for (int i = 0; i < 15; i++) { f_atlo[i] = m_atlo[i] = true; if (i < 8) { sor[i] = true; tab[i] = 0; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -31- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -32- Tabla osztály megvalósítása /4 bool Tabla::Probal(int oszlop) { int sor = 1; bool siker = false; do { Rajzol(sor, oszlop); if (Szabad(sor, oszlop)) { Lefoglal(sor, oszlop); if (oszlop < 8) siker = Probal(oszlop+1); else siker = true; if (!siker) Felszabadit(sor, oszlop); sor++; while (!siker && sor <= 8); return siker; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -33- Működés megfigyelése A minden próbálkozást számolunk: kell egy számláló: probalkozas Minden próbálkozást kirajzolunk: * a már elhelyezett királynők helyére a próba helyére kell tárolni a táblát: tabla változó C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -34- Implementáció - kiir Főprogram void Tabla::Rajzol(int sor, int oszlop) { cout.width(3); cout << ++probalkozas << ".\n"; for (int i = 1; i <= 8; i++) { cout.width(5); cout << 9-i << ' '; for (int j = 1; j <= 8; j++) { if (i == sor && j == oszlop) cout << " "; else if (Tab(i) == j) cout << "* "; else cout << " "; cout << endl; cout << " A B C D E F G H\n\n"; int main() { Tabla t; if (t.probal(1)) { t.rajzol(8, 0); cout << "Siker"; else cout << "Baj van"; // végleges áll. kirajzolása C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -35- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -36-

Eredmények Eredmények /2 60. 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 A B C D E F G H 638. 8 * 7 6 5 4 3 2 1 A B C D E F G H 876. 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 * A B C D E F G H C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -37- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -38- Okos királynő Okos királynő metódusai: Kiralyno *babu = NULL; for (int i = 1; i <= 8; i++) { babu = new Kiralyno(i, babu); babu->helyezkedj(); bool Kiralyno::Helyezkedj() { while (szomszed!= NULL && szomszed->utesben(sor, oszlop)) if (!Lep()) return false; return true; Utesben Ellenőrzi, hogy az adott pozíció ütésben áll-e. Lep Előre lép az adott oszlopban, ha nem tud, akkor az oszlop elejére áll és a tőle balra levőt lépteti. Helyezkedj Jó helyet keres magának. Kiír kiírja a pozícióját. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -39- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -40- Metódus spec. - Utesben bool Utesben(int sor, int oszlop); megvizsgálja, hogy az adott pozíció ütésben álle a saját pozíciójával, ha nem, akkor azonos paraméterekkel meghívja a szomszéd Utesben() tagfüggvényét. bemenet: sor sor (1..8) oszlop oszlop (1..8) kimenet: true a pozíció ütésben áll false nincs ütési helyzet Metódus spec. - Lep void Lep(); Előre lép az adott oszlopban, ha nem tud, akkor az oszlop elejére áll és meghívja a tőle balra levőt királynő Lep() tagfüggvényét. bemenet: - kimenet: true tudott lépni false nem tudott lépni C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -41- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -42-

Metódus spec. - Helyezkedj void Helyezkedj(); Megvizsgála a saját pozícióját, hogy megfelelőe. Ha ütésben áll, akkor meghívja Lep() tagfüggvényét. Ha tudott lépni, akkor ismét megvizsgálja a saját pozícióját. bemenet: - kimenet: true tudott megfelelő helyet találni magának false nem tudott megfelelő helyet találni Metódus spec. - Kiir void Kiir(); Kiírja a saját és a szomszédok pozícióját. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -43- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -44- Kiralyno osztály megvalósítása class Kiralyno { int sor; // sor 1-8 int oszlop; // oszlop 1-8 Kiralyno *szomszed; // szomszéd pointere public: Kiralyno(int o, Kiralyno *sz): szomszed(sz), oszlop(o) { sor = 1; bool Utesben(int s, int o); bool Lep(); bool Helyezkedj(); void Kiir(); ; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -45- Kiralyno osztály megvalósítása/2 bool Kiralyno::Utesben(int s, int o) { int d = oszlop - o; // oszlop differencia if (sor == s sor + d == s sor - d == s) return true; else if (szomszed!= NULL) // ha van szomszéd return szomszed->utesben(s, o); // akkor azzal is else return false; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -46- Kiralyno osztály megvalósítása/3 bool Kiralyno::Lep() { if (sor < 8) { sor++; return true; // tudott lépni if (szomszed!= NULL) { // nem tud, van szomsz. if (!szomszed->lep()) return false; if (!szomszed->helyezkedj()) return false; else { return false; sor = 1; return true; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -47- Kiralyno osztály megvalósítása/4 bool Kiralyno::Helyezkedj() { while (szomszed!= NULL && szomszed->utesben(sor, oszlop)) if (!Lep()) return false; return true; void Kiralyno::Kiir() { if (szomszed!= NULL) szomszed->kiir(); cout << (char)(oszlop-1+'a') << 9-sor << endl; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -48-

Főprogram Megtalálja-e az egér a sajtot int main() { Kiralyno *babu = NULL; for (int i = 1; i <= 8; i++) { babu = new Kiralyno(i, babu); babu->helyezkedj(); babu->kiir(); C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -49- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -50- Egér algoritmusa Megtalálja-e az egér a sajtot Minden cellából először jobbra, majd le, ezután balra és végül fel irányokba indul. Minden cellában otthagyja a nyomát, azaz azt, hogy onnan merre indult legutoljára. Csak olyan cellába lép be, ahol nincs "nyom". Ha már nem tud hova lépni, visszalép. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -51- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -52- Megtalálja-e az egér a sajtot Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -53- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -54-

Megtalálja-e az egér a sajtot Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -55- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -56- Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -57- Hogyan modellezhető Résztvevők, kapcsolatok, tevékenységek labirintus cellákból épül fel a celláknak szomszédai vannak tárolja a rajta álló valamit és annak nyomát megkéri a rajta álló valamit, hogy lépjen kirajzolja az állást egér irány néz lép fal hasonlít az egérhez, de nem lép C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -58- Statikus modell Obj metódusai Labirint Cella Obj n, m, poi Lép, Print szomszéd, nyom, Set.., Get.. Az attribútumok megadása nem teljes, csak vázlatos! A teljes program ill. dokumentáció letölthető a tárgy honlapjáról Eger irány Néz,Lépj,Lép jel, erő Lép Fal jel, erő Lép class Obj { protected: int ir; // ebbe az irányba tart most public: Obj() :ir(-1) {; // kezdő irány Obj *Nez(int i, Cella &c, bool b = false); void Lepj(int i, Cella &c, bool b = false); virtual char Jele() = 0; // jel lekérdzése virtual int Ereje() = 0; // erő lekérdezése virtual void Lep(Cella &c); // léptet virtual void operator()(obj*) {; // ha "megették" ; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -59- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -60-

Eger objektum class Eger :public Obj { const int ero; const char jel; public: Eger(char j = 'e', int e = 10) :ero(e), jel(j) { char Jele() { return(jel); // jele int Ereje() { return(ero); // ereje void operator()(obj *p) { // meghívódik, ha megették cout << "Jaj szegeny " << Jele(); cout << " megetvett a(z):"; cout << p->jele() << " jelu\n"; ; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -61- Cella objektum /1 class Cella { int x, y; // geometriai koordináták Cella *sz[4]; // szomszédok, ha NULL, akkor nincs Obj *p; // cella tartalma. URES, ha nincs Lista<Labnyom> ny; // lábnyomok listája public: enum irany { J, L, B, F ; // nehéz szépen elérni.. Cella() { SetPos(0, 0); void SetPos(int i, int j); void SetSz(int n, Cella *cp) { sz[n] = cp; // szomszéd Cella *GetSz(int n) { return(sz[n]);... C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -62- Cella objektum /2... void SetObj(Obj *a) { p = a; // objektum beírása Obj *GetObj() { return(p); // objektum lekérdezése void SetNyom(int n); // lábnyom beírása int GetNyom(const Obj *a); // lábnyom lekérdezése void DelNyom() {ny.torol(labnyom(getobj())); Főprogram (részlet) Labirint lab(4,5); // 4 * 5 os labirintus Eger e1, e2; // 2 egér; jele: e lab.setobj(2, 3, e1); // egerek elhelyezése lab.setobj(1, 4, e2); try { char ch; lab.print(); // kiírjuk a labirintust while (cin >> noskipws >> ch, ch!= 'e') { lab.lep(); lab.print(); // léptetés catch (exception& e) { cout << e.what() << endl; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -63- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -64- Labirintus léptetés Végig kell járni a cellákat meghívni az ott "lakó" objektum léptetését Figyelni kell. hogy nehogy duplán léptessünk. (bejárási sorrend elé lépett) Obj::lep() /1 if (c.getnyom(this) < 0) // ha nem volt nyoma, indul c.setnyom(f+1); // így nem tud visszalépni if (++ir <= F) { // ha van még bejáratlan irány if (Obj *p = Nez(ir, c)) { // ha van szomszéd if (Ereje() > p->ereje()) { // ha Ő az erősebb (*p)(this); // meghívjuk a függv. operátorát Lepj(ir, c); // rálépünk (eltapossuk) ir = -1; // most léptünk be: kezdő irány else { C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -65- C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -66-

Obj::Lep() /2 // nincs már bejáratlan irány if ((ir = c.getnyom(this)) > F) { // kezdő nem lép vissza. throw std::logic_error("kezdo pozicioba jutott"); else { // visszalépés if (Obj *p = Nez(ir, c, true)) { // lehet, h. van ott valaki if (Ereje() > p->ereje()) { // Ő az erősebb (*p)(this); // meghívjuk a függv. operátorát Lepj(ir, c, true); // visszalépünk és eltapossuk ir ^= 2; // erre ment be (trükk: a szemben levő irányok csak a 2-es bitben különböznek) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -67-