IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 7. ELŐADÁS - ABSZTRAKT ADATTÍPUS 2014 Bánsághi Anna 1 of 33
TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív paradigma Procedurális paradigma Generikus paradigma III. STRUKTÚRÁLT PROGRAMOZÁS Objektumorientált paradigma Moduláris paradigma 2014 Bánsághi Anna 2 of 33
III. OBJEKTUMORIENTÁLT PARADIGMA 1. Absztrakt adattípus Adatabsztrakció Konstruktorok Operátorok túlterhelése 2. Objektumok, osztályok 3. OOP tervezés 4. Öröklődés 5. Adatszerkezetek megvalósítása 2014 Bánsághi Anna 3 of 33
AZ ABSZTRAKCIÓ MÁSODIK SZINTJE a végrehajtás irányából utasításabsztrakció lényeges, hogy mit csinál az algoritmus lényegtelen, hogyan van implementálva az adatok irányából adatabsztrakció lényeges a való világ modellezése lényegtelen a reprezentáció, az implementáció objektumorientált paradigma absztrakt adattípusok 2014 Bánsághi Anna 4 of 33
1. ABSZTRAKT ADATTÍPUS 2014 Bánsághi Anna 5 of 33
ELEMI TÍPUSOK szerkezet nélküliek, logikailag felbonthatatlanok (int, char,...) ÖSSZETETT TÍPUSOK meglévő típusokból tevődnek össze típuskonstrukciók segítségével (rekord, tömb és unió) ABSZTRAKT ADATTÍPUSOK meglévő típusokból tevődnek össze típuskonstrukciókkal és új műveletek megvalósításával 2014 Bánsághi Anna 6 of 33
ABSZTRAKT ADATTÍPUS a típus definiálása két részből áll meg kell adni az értékhalmaz t, mely véges, mert a lefoglalható memória területe is véges meg kell adni a művelethalmaz t, az értékhalmazon értelmezett műveleteket, esetleg más értékhalmazokat is felhasználva int = ( Z, { + - * / ) bool = ( { true, false, { ) 2014 Bánsághi Anna 7 of 33
ŰRTELESZKÓP FELADAT Számoljuk meg, hány ismeretlen tárgy tartózkodik a Hubble űrteleszkóp 10 km-es környezetében VISSZAVEZETÉS VALAMELY ISMERT PROGRAMOZÁSI TÉTELRE azt sejtjük, hogy a Számlálás tétellel megoldható, hogyha az alábbi megfeleltetéseket alkalmazzuk: tulajdonság tömb[1..n] ~ ~ űrteleszkóp 10 km-es környezetébe esik ismeretlen tárgyak darab = 0 ciklus i = 1-től n-ig ha űrteleszkóp 10 km-es környezetébe esik( ismeretlen tárgyak[i] ) akkor darab += 1 elágazás vége ciklus vége 2014 Bánsághi Anna 8 of 33
PROBLÉMAFELVETÉS tovább már nem tudjuk finomítani a feladatot, hiszen egy programozási tételre vezettük vissza, amely nem bontható fel további részfeladatokra mégis baj van, mert nincsen olyan megvalósítása a Számlálás tételnek, amely ismeretlen tárgyak tömbjének elemeit vizsgálná aszerint, hogy azok beleesnek-e egy űrteleszkóp 10 km-es környezetébe induljunk el az adatok irányából 2014 Bánsághi Anna 9 of 33
A FELADAT ABSZTRAKCIÓJA űrteleszkóp 10 km-es környezete ismeretlen tárgy ~ ~ 10 km sugarú gömb térbeli pont Számoljuk meg, hány pont esik egy adott 10 km sugarú gömbbe AZ ALGORITMUS AKTUALIZÁLÁSA darab = 0 ciklus i = 1-től n-ig ha pontok[i] gömb akkor darab += 1 ciklus vége 2014 Bánsághi Anna 10 of 33
ABSZTRAKT TÍPUSOK Ha lennének Pont és Gömb típusaink, és a Gömb típuson lenne egy BennevanE egy pont a gömbben művelet, akkor kész lennénk Tegyük fel, hogy olyan programozási nyelvet használunk, amely biztosít nyelvi eszközt absztrakt adattípusok létrehozására, és fogjuk fel két kisebb programozási feladatként a Pont és a Gömb típusok létrehozását 2014 Bánsághi Anna 11 of 33
PONT TÍPUS SPECIFIKÁCIÓJA értékhalmaz térbeli pontok halmaza művelethalmaz - GÖMB TÍPUS SPECIFIKÁCIÓJA értékhalmaz gömbök halmaza művelethalmaz { BennevanE gondoljuk át, hogyan tudnánk elemi, összetett és absztrakt típusok segítségével megvalósítani a két típusspecifikációt 2014 Bánsághi Anna 12 of 33
PONT TÍPUS REPREZENTÁCIÓJA egy térbeli pont három koordinátával jellemezhető valamely 3 dimenziós koordinátarendszerben értékhalmaz művelethalmaz R R R = R 3 R 3, Pont = ( ) Pont p = ( p.x, p.y, p.z ) 2014 Bánsághi Anna 13 of 33
PONT TÍPUS MEGVALÓSÍTÁSA rekorddal, melynek három mezeje van struct Pont { // a pont rekordja // mezők: double x; // x koordináta double y; // y koordináta double z; // z koordináta public static void Main() { Pont pont; // pont típusú változó deklarálása // a pont mezőinek értékadása Console.Write( "x: " ); pont.x = double.parse( Console.ReadLine() ); Console.Write( "y: " ); pont.y = double.parse( Console.ReadLine() ); Console.Write( "z: " ); pont.z = double.parse( Console.ReadLine() ); Console.WriteLine( "A pont: ({0, {1, {2)", pont.x, pont.y, pont.z ); 2014 Bánsághi Anna 14 of 33
PONTOK DINAMIKUS LISTÁJA a listát dinamikusan hozzuk létre public static void Main() { var pontok = new List<Pont>(); // pontok listája konstruktorral létrehozva for( int i = 0; i < 3; ++i ) { // három elemű lista lesz Pont pont; // a ciklusra lokális változó Console.Write( "x: " ); pont.x = double.parse( Console.ReadLine() ); Console.Write( "y: " ); pont.y = double.parse( Console.ReadLine() ); Console.Write( "z: " ); pont.z = double.parse( Console.ReadLine() ); pontok.add( pont ); // a pont hozzáfűzése a listához foreach( Pont pont in pontok ) { Console.WriteLine( "A pont: ({0, {1, {2)", pont.x, pont.y, pont.z ); 2014 Bánsághi Anna 15 of 33
GÖMB TÍPUS REPREZENTÁCIÓJA egy gömb középpontjával és sugarával jellemezhető valamely 3 dimenziós koordinátarendszerben R értékhalmaz Pont művelethalmaz { BennevanE : Gömb Pont R Gömb = ( Pont, { BennevanE ) Gömb g = ( g.c, g.r ) L 2014 Bánsághi Anna 16 of 33
BENNEVAN-E EGY PONT EGY GÖMBBEN ezt a műveletet fogjuk fel egy újabb részfeladatként Számítsuk ki a gömb középpontjának és a pontnak a távolságát, és döntsük el, hogy ez a távolság kisebb-e, mint a gömb sugara A FELADAT ABSZTRAKCIÓJA Számítsuk ki két térbeli pont távolságát, és döntsük el, hogy ez a távolság kisebb-e, mint egy adott nemnegatív valós szám FINOMÍTOTT REPREZENTÁCIÓ BennevanE : R 3 R 3 R L 2014 Bánsághi Anna 17 of 33
AZ ABSZTRAKT FELADAT MEGOLDÁSA BennevanE : R 3 R 3 R L bemenet p, c : R 3 és r : R kimenet bennevan : L előfeltétel r 0 utófeltétel bennevan = SPECIFIKÁCIÓ (p. x c. x ) 2 + (p. y c. y ) 2 + (p. z c. z) 2 < r 2014 Bánsághi Anna 18 of 33
GÖMB TÍPUS MEGVALÓSÍTÁSA rekorddal, melynek két mezeje és egy metódusa van public struct Gomb { // mezők: public Pont c; public double r; // metódus: public bool BennevanE( Pont pont ) { double tavolsag = Math.Sqrt( Math.Pow(( pont.x - c.x ), 2 ) + Math.Pow(( pont.y - c.y ), 2 ) + Math.Pow(( pont.z - c.z ), 2 )); return tavolsag < r; 2014 Bánsághi Anna 19 of 33
Főprogram - gömb létrehozása public static void Main() { Gomb gomb; Pont kozeppont; kozeppont.x = 1; kozeppont.y = 4; kozeppont.z = 2; gomb.c = kozeppont; gomb.r = 12; Console.WriteLine( "Középpont: ({0, {1, {2)", gomb.c.x, gomb.c.y, gomb.c.z ); Console.WriteLine( "Sugár: {0", gomb.r ); 2014 Bánsághi Anna 20 of 33
Főprogram - pont létrehozása és vizsgálat Pont pont; Console.Write( "x: " ); pont.x = double.parse( Console.ReadLine() ); Console.Write( "y: " ); pont.y = double.parse( Console.ReadLine() ); Console.Write( "z: " ); pont.z = double.parse( Console.ReadLine() ); Console.WriteLine( "A pont: ({0, {1, {2)", pont.x, pont.y, pont.z ); Console.WriteLine( "A pont bennevan a gömbben: {0", gomb.bennevane( pont )); 2014 Bánsághi Anna 21 of 33
A Számlálás tételét most már alkalmazhatjuk pontokra és gömbökre is darab = 0 ciklus i = 1-től n-ig ha gömb.bennevane( pontok[i] ) akkor darab += 1 ciklus vége static int Szamlalas( List<Pont> pontok, Gomb gomb ) { int darab = 0; foreach( var pont in pontok ) { if( gomb.bennevane( pont )) { ++darab; return darab; 2014 Bánsághi Anna 22 of 33
2. KONSTRUKTOROK a rekordok mezőit egyesével inicializálni körülményes egyszerűsíthető, ha készítünk egy beállító metódust, amely a paraméterek alapján értéket ad a mezőknek nem kötelező az összes mezőt paraméteren keresztül beállítani, de mindegyiket inicializálni kell ezt a metódust is meg kell hívni egyszer van egy olyan speciális metódus, amely akkor hívódik meg, amikor létrehozunk egy változót a rekord típusból, ez a példány konstruktor 2014 Bánsághi Anna 23 of 33
PÉLDÁNY KONSTRUKTOR speciális metódus, melyet egy adott típusú érték (példány) létrehozására használunk hívásakor lefoglalódik a hely a memóriában a példány számára, és a mezők alapértelmezett értékeket kapnak a konstruktor neve megegyezik a típus nevével nincs visszatérési típusa, arra szolgál, hogy a rekord mezőit kezdőértékkel lássa el akkor is létezik egy paraméter nélküli változata, ha nem írjuk meg, nem végez inicializáló tevékenységet tetszőlegesen paraméterezhető és túlterhelhető (rekordok struct esetén nem definiálható felül a paraméter nélküli konstruktor) 2014 Bánsághi Anna 24 of 33
PONT TÍPUS KONSTRUKTOROKKAL R R R = R 3 értékhalmaz művelethalmaz { Pont : R Pont, Pont : R R Pont, Pont : Pont R R R Pont = ( R 3, { Pont ) 2014 Bánsághi Anna 25 of 33
BŐVÍTETT PONT TÍPUS public class Teglalap { // mezők: public double a; public double b; // konstruktorok: public Teglalap() { a = 10; b = 10; public Teglalap( double oldal1, double oldal2 ) { a = oldal1; b = oldal2; // metódusok: public double Kerulet() { return 2 * a + 2 * b; public double Terulet() { return a * b; 2014 Bánsághi Anna 26 of 33
GÖMB TÍPUS KONSTRUKTOROKKAL R R értékhalmaz Pont művelethalmaz { Gömb : Gömb, Gömb : Pont Gömb, Gömb : Pont Gömb, BennevanE : Gömb Pont R L Gömb = ( Pont R, { Gömb, BennevanE ) 2014 Bánsághi Anna 27 of 33
BŐVÍTETT GÖMB TÍPUS public struct Gomb { // mezők: public Pont c; public double r; // konstruktorok: public Gomb( Pont kozeppont ) { c = kozeppont; r = 10; public Gomb( double sugar ) { c = new Pont( 0, 0, 0 ); r = sugar; public Gomb( Pont kozeppont, double sugar ) { c = kozeppont; r = sugar; // metódus: public bool BennevanE( Pont pont ) {... 2014 Bánsághi Anna 28 of 33
PÉLDÁNYOSÍTÁS public static void Main() { // változó deklaráció, nem történik memóriafoglalás, "p0" még nem létezik, // nem lehet a pontra hivatkozni addig, amíg az összes mezeje értéket nem kap Pont p0; // objektum létrehozása az alapértelmezett konstruktorral, memóriafoglalással // "p1" létrejött, lehet a pontra és mezőire hivatkozni, bár a mezők a // fordítóprogram által adott értékekkkel lettek inicializálva var p1 = new Pont(); // objektum létrehozása a 2 paraméteres konstruktorral var p2 = new Pont( 3, 3 ); // objektum létrehozása a 3 paraméteres konstruktorral var p3 = new Pont( 1, 4, 2 ); // gömb létrehozása konstruktorral var gomb = new Gomb( 12 ); 2014 Bánsághi Anna 29 of 33
3. OPERÁTOROK TÚLTERHELÉSE lehetőségünk van arra, hogy a műveleteinket operátorokkal valósítsuk meg úgy használhatók, mint a beépített operátorok, de a működésüket mi határozzuk meg kötött a paraméterek száma éa a visszatérési érték megléte, de a típusok tetszőlegesek az unáris, a matematikai, a logikai és a relációs operátorok terhelhetők túl 2014 Bánsághi Anna 30 of 33
PONT TÍPUS == ÉS!= OPERÁTORAI R R R = R 3 értékhalmaz művelethalmaz { Pont : R Pont, Pont : R R Pont, Pont : R R R Pont, == : Pont Pont L,!= : Pont Pont L Pont = ( R 3, { Pont, ==,!= ) 2014 Bánsághi Anna 31 of 33
AZ OPERÁTOROK MEGVALÓSÍTÁSA public struct Pont { // mezők: public double x; public double y; public double z; // konstruktorok: public Pont( double p2 ) {... public Pont( double p1, double p2 ) {... public Pont( double p1, double p2, double p3 ) {... // operátorok: public static bool operator ==( Pont p1, Pont p2 ) { return ( p1.x == p2.x && p1.y == p2.y && p1.z == p2.z ); public static bool operator!=( Pont p1, Pont p2 ) { // itt már az imént definiált == operátort hívjuk meg a két ponton return! ( p1 == p2 ); 2014 Bánsághi Anna 32 of 33
FELADAT Ellenőrizzük, hogy ütközött-e valamely ismeretlen tárgy az űrteleszkóppal Használjuk az Eldöntés (létezik) programozási tételt public static void Main() {... bool utkozes = LetezikE( pontok, gomb );... static bool LetezikE( List<Pont> pontok, Gomb gomb ) { int i = 0; while( i < pontok.count && pontok[i]!= gomb.c ) { ++i; return ( i < pontok.count ); 2014 Bánsághi Anna 33 of 33