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

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

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 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 alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

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

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

117. AA Megoldó Alfréd AA 117.

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

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.

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

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

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

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 C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

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

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

Szoftvertechnológia alapjai Java előadások

Maximum kiválasztás tömbben

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

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

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

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

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ási nyelvek Java

Pénzügyi algoritmusok

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

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

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

Programozási nyelvek Java

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ás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

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

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

128. AA Megoldó Alfréd AA 128.

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.

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

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

Konkurens TCP Szerver

BME MOGI Gépészeti informatika 4.

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

Programozási nyelvek JAVA EA+GY 1. gyakolat

Pénzügyi algoritmusok

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

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

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

Informatika terméktervezőknek

C++ Standard Template Library (STL)

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

Objektumorientált programozás C# nyelven III.

Alprogramok, paraméterátadás

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

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

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

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

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

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

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

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

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

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

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

Java és web programozás

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

Á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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -3-

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. -4- Egyszerű feltételek 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.) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -5- Egyszerű példa #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. -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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -7- 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. -8- Visual Studio include dir C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -9-

Visual Studio lib 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ó C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -11- 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. -12-

További ellenőrzések 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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -13- További lehetőségek 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. -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. C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -19- 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. -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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -21-

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. -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) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -23- 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. -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) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -25- 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. -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- Átlók tárolása sor - oszlop = állandó 1 2 3 4 5 6 7 8 1 234 5 6 7 8 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; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -31- 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. -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 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"; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -35- int main() { Tabla t; Főprogram 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. -36-

Eredmények 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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -37- Eredmények /2 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. -38- Okos királynő 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; C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -39-

Okos királynő metódusai: 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. -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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -41- 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. -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 C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -43- 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. -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 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- Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -50- Egér algoritmusa 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-

Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -52- Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -53- Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -54-

Megtalálja-e az egér a sajtot C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -55- Megtalálja-e az egér a sajtot 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 Labirint Cella Obj n, m, poi Lép, Print szomszéd, nyom, Set.., Get.. irány Néz,Lépj,Lép 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 jel, erő Lép Fal jel, erő Lép C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -59- Obj metódusai 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. -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())); C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -63-

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. -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) C++ programozási nyelv BME-IIT Sz.I. 2011.05.03. -65- 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. -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-