BME MOGI Gépészeti informatika 7. 1. feladat Írjon Windows Forms alkalmazást egy kör és egy pont kölcsönös helyzetének vizsgálatára! A feladat megoldásához hozza létre a következő osztályokat! Pont osztály: mezők - a pont x és y koordinátái, melyek valós számok, konstruktorok o két egész paraméterrel rendelkező konstruktor, az paraméterek annak az intervallumnak a határai, melyből generált valós értékekkel a konstruktor inicializálja a mezőket, o két valós paraméterrel rendelkező konstruktor, melyekkel a mezőket inicializáljuk; a paraméterek alapértelmezett értéke 0. o egy Pont típusú paraméterrel rendelkező (ún. másoló) konstruktor, melynek mezőivel az x, y mezők inicializálódnak. elérési metódusok get és set metódusok mindkét mezőre. Kör osztály, mely a Pont osztályból származik: tulajdonság R a kör sugara, valós, konstruktorok o három valós paraméterrel rendelkező konstruktor, mellyel az osztály mezői inicializálásra kerülnek; a paraméterek alapértelmezett értéke rendre 0, 0, és 10, o két egész paraméterrel rendelkező konstruktor, az paraméterek annak az intervallumnak a határai, melyből generált valós értékekkel a konstruktor inicializálja a mezőket, o egy Kör típusú paraméterrel rendelkező (másoló) konstruktor, melynek mezőivel az osztály mezői és tulajdonsága inicializálódnak. metódusok o TávolságAKözépponttól - a kör középpontja és egy argumentumként megadott Pont típusú pont közötti távolságot határozza meg, a visszaadott érték valós, o ÍvenE paramétere egy Pont típusú pont, az igaz logikai értéket adja vissza, ha a pont a köríven van, különben a hamis logikai értéket, o BelsőE paramétere egy Pont típusú pont, az igaz logikai értéket adja vissza, ha a pont a kör belsejében van, különben a hamis logikai értéket. Írjon metódust az argumentumként megadott Pont típusú pont és Kör típusú kör helyzetének meghatározására! A metódus ne adjon vissza értéket, hanem a megfelelő választógomb értékét állítsa be! Új pont vagy kör létrehozásakor azok mezőinek és tulajdonságainak értékeit TextBox vezérlőkben jelenítse meg! Az űrlap betöltésekor generáljon egy pontot és egy kört és vizsgálja meg helyzetüket! Parancsgombok segítségével valósítsa meg a következő funkciókat: új pont létrehozása és helyzetének vizsgálata az utoljára létrehozott körrel, új kör létrehozása és helyzetének vizsgálata az utoljára létrehozott ponttal, egy pont és egy kör adatainak beolvasása TextBox vezérlőkből és helyzetüknek vizsgálata. 1
Megoldási mód: Windows Forms alkalmazás Oktatási cél: osztályok kezelésének bemutatása Az elkészítendő form: A Form1 osztályba írandó programkód: Pont pont; Kör kör; // Az Új kör gomb megnyomásának eseménykezelője private void button1_click(object sender, EventArgs e) kör = new Kör(-10, 10); textbox1.text = kör.getx().tostring("f2"); textbox2.text = kör.gety().tostring("f2"); textbox3.text = kör.r.tostring("f2"); HelyzetVizsgál(pont,kör); // Az Új pont gomb megnyomásának eseménykezelője private void button2_click(object sender, EventArgs e) pont = new Pont(-10, 10); textbox4.text = pont.getx().tostring("f2"); textbox5.text = pont.gety().tostring("f2"); HelyzetVizsgál(pont, kör); // A Beolvas gomb megnyomásának eseménykezelője private void button3_click(object sender, EventArgs e) pont = new Pont(); pont.setx(convert.todouble(textbox4.text)); 2
pont.sety(convert.todouble(textbox5.text)); kör = new Kör(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text)); HelyzetVizsgál(pont, kör); // A p pont és az o kör egymáshoz viszonyított helyzetének vizsgálata private void HelyzetVizsgál(Pont p, Kör o) if (o.ívene(p)) radiobutton2.checked = true; else if (o.belsőe(p)) radiobutton1.checked = true; else radiobutton3.checked = true; // A form betöltésekor hívódó eseménykezelő private void Form1_Load(object sender, EventArgs e) radiobutton1.checked = true; kör = new Kör(-10, 10); textbox1.text = kör.getx().tostring("f2"); textbox2.text = kör.gety().tostring("f2"); textbox3.text = kör.r.tostring("f2"); pont = new Pont(-10, 10); textbox4.text = pont.getx().tostring("f2"); textbox5.text = pont.gety().tostring("f2"); HelyzetVizsgál(pont,kör); // A Pont osztály definíciója public class Pont private double x, y; // adatmezők // konstruktorok: public Pont(double x_ = 0, double y_ = 0) x = x_; y = y_; public Pont(Pont p) x = p.x; y = p.y; public Pont(int alsó, int felső) Random rnd = new Random(); x = rnd.nextdouble() * (felső - alsó) + alsó; y = rnd.nextdouble() * (felső - alsó) + alsó; 3
// elérési metódusok: public double GetX() return x; public void SetX(double érték) x = érték; public double GetY() return y; public void SetY(double érték) y = érték; // A Kör osztály definíciója származtatással public class Kör : Pont // konstruktorok: public Kör(double x_ = 0, double y_ = 0, double r_ = 10) : base(x_, y_) R = r_; public Kör(Kör k) : base(k) R = k.r; public Kör(int alsó, int felső) : base(new Pont(alsó, felső)) Random rnd = new Random(); R = Math.Abs(rnd.NextDouble() * (felső - alsó) / 2); public double R get; set; //tulajdonság // metódusok: public double TávolságAKözépponttól(Pont p) return Math.Sqrt(Math.Pow(this.GetX() - p.getx(), 2) + Math.Pow(this.GetY() - p.gety(), 2)); public bool ÍvenE(Pont p) return Math.Abs(TávolságAKözépponttól(p) - R) < 0.001; public bool BelsőE(Pont p) 4
bool vissza = false; if (!ÍvenE(p)) vissza = TávolságAKözépponttól(p) < R; return vissza; 2. feladat Bővítse az 1. feladatot úgy, hogy az alkalmas legyen egy céltábla létrehozására, valamint arra lövések leadására és a lövések értékelésére! A feladat megoldásához hozza létre a következő Céltábla osztályt! Céltábla osztály: mező Kör típusú kör, konstruktor o három valós paraméterrel rendelkező konstruktor, mellyel az osztály mezői inicializálásra kerülnek; az argumentumok alapértelmezett értéke rendre 0, 0, és 30. metódus o Pontoz argumentuma egy Pont típusú pont, mely egy lövés találati helyét jelzi. A visszaadott érték nulla, ha a lövés nem találta el a céltáblát, különben egy 1 és 10 közötti érték. Parancsgombok segítségével valósítsa meg a következő funkciókat: új céltábla létrehozása, középpontja a (0;0) pont, sugara 30 egység; az 1. feladatban létrehozott parancsgombok letiltása, lövés generálása, azaz új pont létrehozása, helyzetének vizsgálata a céltáblán és pontozás. Megoldási mód: Windows Forms alkalmazás Oktatási cél: osztálykezelés gyakoroltatása 5
Az elkészítendő form: A Form1 osztályba írandó programkód: Céltábla céltábla; // A Céltábla gomb megnyomásának eseménykezelője private void button4_click(object sender, EventArgs e) céltábla = new Céltábla(0, 0, 30); textbox1.text = "0"; textbox2.text = "0"; textbox3.text = "30"; button1.enabled = false; button2.enabled = false; button3.enabled = false; // A Lövés gomb megnyomásának eseménykezelője private void button5_click(object sender, EventArgs e) pont = new Pont(-40, 40); textbox4.text = pont.getx().tostring("f2"); textbox5.text = pont.gety().tostring("f2"); HelyzetVizsgál(pont, céltábla.k); textbox6.text = céltábla.pontoz(pont).tostring(); // A Kör osztály definíciója public class Céltábla internal Kör k; // elérése erre az osztályra korlátozódik // paraméteres konstruktor 6
public Céltábla(double x_ = 0, double y_ = 0, double r_ = 30) k = new Kör(x_, y_, r_); // pontozó metódus public int Pontoz(Pont p) int i; if (!k.belsőe(p)) // ha nem belső pont, kilépünk a metódusból return 0; else // a lövés helyének meghatározása for (i = 0; i < 10; i++) if (k.távolságaközépponttól(p) >= i * k.r / 10 && k.távolságaközépponttól(p) < (i + 1) * k.r / 10) break; return 10 - i; 7
Gyakorló feladatok - osztálykezelés 1. Készítsen konzolalkalmazást három síkbeli pont koordinátáinak beolvasására, az általuk páronként meghatározott szakaszok hosszának kiszámítására, annak vizsgálatára, hogy a szakaszokkal szerkeszthető-e háromszög, ha szerkeszthető, akkor a háromszög területének és kerületének kiszámítására, az egyik szakaszra, mint átmérőre illesztett kör középpontja koordinátáinak és sugarának kiszámítására, valamint a kör kerületének és területének meghatározására! A feladat megoldásához hozza létre a következő osztályokat! Pont osztály: konstansok o double origóx=0 o double origóy=0 mezők - a pont x és y koordinátái, o double x o double y konstruktorok o két valós paraméterrel rendelkező konstruktor, melyekkel a mezők inicializálásra kerülnek, alapértelmezett érték mindkét mezőnél a nulla, o egy Pont típusú paraméterrel rendelkező konstruktor, melynek mezőivel az x, y mezők inicializálásra kerülnek. elérési metódusok get és set metódusok mindkét mezőre. metódus o OrigóE paramétere nincs, az igaz logikai értéket adja vissza, ha a pont az origóba esik, különben a hamis logikai értéket. Szakasz osztály: mezők a szakasz végpontjai o Pont p1 o Pont p2 tulajdonság o double Hossz - csak olvasható, a szakasz hossza, konstruktor o két Pont típusú paraméterrel rendelkező konstruktor, melyekkel a mezők inicializálásra kerülnek. elérési metódusok get és set metódusok mindkét mezőre. metódus o Felező paramétere nincs, a visszaadott érték Pont típusú, mely a szakasz felezőpontja. Kör osztály: mező: o Pont o a kör középpontja tulajdonság R a kör sugara, valós, 8
konstruktor o egy Kör típusú és egy valós paraméterrel rendelkező konstruktor, melyekkel az osztály mezője és tulajdonsága inicializálásra kerülnek. elérési metódusok get és set metódusok a mezőhöz. metódusok o Terület paramétere nincs, visszaadott érték a kör területe valós számként, o Kerület paramétere nincs, visszaadott érték a kör kerülete valós számként. Háromszög osztály: mezők - a háromszög oldalai, o double a o double b o double c konstruktor o három valós paraméterrel rendelkező konstruktor, melyekkel a mezők inicializálásra kerülnek. elérési metódusok get és set metódusok mindhárom mezőhöz. metódus o HáromszögE paramétere nincs, az igaz logikai értéket adja vissza, ha a három oldallal szerkeszthető háromszög, különben a hamis logikai értéket, o Terület paramétere nincs, visszaadott érték a kör területe valós számként, ha szerkeszthető az oldalakkal háromszög, különben nulla, o Kerület paramétere nincs, visszaadott érték a háromszög kerülete valós számként, ha szerkeszthető az oldalakkal háromszög, különben nulla. A Main metódusban olvassa be három síkbeli pont koordinátáit, vizsgálja meg, hogy valamelyik pont az origóba esik-e, hozzon létre szakaszokat páronként a pontokkal, hozzon létre a szakaszokkal háromszöget, vizsgálja meg, hogy ezekkel a szakaszokkal szerkeszthető-e háromszög, ha nem, akkor olvassa be egy háromszög oldalainak hosszait, és hozzon létre velük háromszöget, a beolvasást addig ismételje, míg az oldalakkal szerkeszthető háromszög, számítsa ki, és írja ki a háromszög területét és kerületét, az egyik szakasznak határozza meg a felezőpontját, hozzon létre kört, melynek középpontja a felezőpont, sugara a szakasz hosszának fele, számítsa ki a kör területét és kerületét! 9