HIK Elektronikus Felsőoktatási Tankönyv- és Szakkönyvtár
A Kempelen Farkas Felsőoktatási Digitális Tankönyvtár/vagy más megjelenítő által közvetített digitális tartalmat a felhasználó a szerzői jogról szóló 1999. évi LXXVI. tv. 33. paragrafus (4) bekezdésében meghatározott oktatási, illetve tudományos kutatási célra használhatja fel. A felhasználó a digitális tartalmat képernyőn megjelenítheti, letöltheti, arról elektronikus adathordozóra vagy papíralapon másolatot készíthet, adatrögzítő rendszerében tárolhatja. A Kempelen Farkas Felsőoktatási Digitális Tankönyvtár/vagy más megjelenítő weblapján található digitális tartalmak üzletszerû felhasználása tilos, valamint kizárt a digitális tartalom módosítása és átdolgozása, illetve az ilyen módon keletkezett származékos anyag további felhasználása.

8.4.3. Feladatok dinamikus tömbre

Kérjünk be számokat a nulla végjelig

ArrayList dtm = new ArrayList();

int i = 0, elem;

do

{

elem = Int32.Parse(Console.ReadLine());

if (elem != 0) dtm.Add(elem);

}

while (elem != 0);

Deklarálunk egy dtm nevű ArrayList objektumot, és példányosítsuk is. Az adatbekéréskor a ReadLine() függvény által visszaadott karakterláncot konvertáljuk Int32 típussá, és a konverzió eredményét tároljuk az elem nevű változóba. Amennyiben ez nem nulla értékű, hozzáadjuk az ArrayListánkhoz az add metódus meghívásával. Az adatbekérést mindaddig folytatjuk, míg nullát nem írunk be.

A 0 beírása után az ellenőrzés miatt vissza írattuk az ArrayList tartalmát az alábbi függvény meghívásával:

static void Kiir(ArrayList al)

{

foreach (int a in al)

{

Console.Write("{0} ",a);

}

Console.WriteLine();

}

Feladat:

Adott a síkon koordinátáival néhány pont. Határozzuk meg azt a minimális sugarú kört, mely magába foglalja az összes pontot. adjuk meg a középpontját és a sugarát!

A feladat első felét nézzük most. Hogyan kezeljük a pontokat, és adatait.

class TPont

{

public double x, y;

}

Ezzel létrehoztunk egy TPont osztályt, mely a síkbeli pont két koordinátáját, mint adatmezőt tartalmazza. Ezen az osztályon fog alapulni a feladat megoldása.

Hozzunk létre egy kört leíró osztályt is. Ehhez a kör középpontjának koordinátáira és a sugarának hosszára lesz szükségünk. Használjuk fel a már meglévő TPont osztályt.

class TKor

{

public TPont kozeppont = new TPont();

public double sugar;

}

A feladatunk megkeresni azt a két pontot, melyek távolsága a legnagyobb, és az általuk meghatározott szakasz, mint átmérő fölé rajzolt kört adatait meghatározni. Ehhez használjuk a következő osztályt, ahol egy végpontjainak koordinátáival adott szakasz fölé rajzolt kör adatait tudjuk meghatározni.

class TSzakasz_kore : TKor

{

public TPont Kezd = new TPont();

public TPont Veg = new TPont();

public void szakasz_fole_kor()

{

kozeppont.x = (Veg.x + Kezd.x)/2;

kozeppont.y = (Veg.y + Kezd.y)/2;

System.Console.WriteLine("{0} {1}",kozeppont.x,kozeppont.y);

sugar = System.Math.Sqrt((Veg.x-Kezd.x)*(Veg.x-Kezd.x)+

(Veg.y-Kezd.y)*(Veg.y-Kezd.y))/2;

}

}

A kozeppont változó a TKor osztályan lett deklarálva, az öröklés miatt ez az osztály is látja, és a public láthatósága miatt használhatja is.

Ezek után minden eszközünk megvan ahhoz, hogy megoldjuk a feladatot. Tekintsük az alábbi deklarációt, mely lehetővé teszi tetszőleges számú pont felvételt a síkon. Itt használjuk ki a dinamikus ArrayList adta lehetőségeket.

public long pontok_szama = 0;

public System.Collections.ArrayList pontok =

new System.Collections.ArrayList();

A pontok nevű ArrayListbe fogjuk tárolni a pontok adatait. Ezeket feltölthetjük billentyűzetről:

public void pontok_beo()

{

int i = 1;

while (i<=pontok_szama)

{

TPont pont = new TPont();

System.Console.Write("Kérem az {0}. pont X koordinátáját ... ", i);

pont.x = System.Convert.ToDouble(System.Console.ReadLine());

System.Console.Write("Kérem az {0}. pont Y koordinátáját ... ", i);

pont.y = System.Convert.ToDouble(System.Console.ReadLine());

pontok.Add(pont);

i++;

}

System.Console.WriteLine("Koordináták beolvasva...");

}

Keressük meg a maximális távolságra lévő pontokat a ponthalmazból. Ehhez lehet ezt az egyszerű metódust használni:

private void max_tav_pontok()

{

double maxtav = 0, tav;

foreach (TPont pont1 in pontok)

{

foreach (TPont pont2 in pontok)

{

tav = System.Math.Sqrt((pont2.x-pont1.x)*(pont2.x-pont1.x)+

(pont2.y-pont1.y)*(pont2.y-pont1.y));

if (maxtav < tav)

{

maxtav = tav;

Kezd.x = pont1.x;

Kezd.y = pont1.y;

Veg.x = pont2.x;

Veg.y = pont2.y;

}

}

}

}

Ha a fenti metódusokat egy olyan osztályban hozzuk létre, melyet a TSzakasz_kore osztályból származtattunk, akkor a megoldást mindössze két metódus meghívása szolgáltatja:

public void kor_megadasa()

{

max_tav_pontok();

szakasz_fole_kor();

}

Ekkor a Main függvény tartalma a következő lehet:

System.Console.WriteLine("\n\n Sok pont esete: ");

TSik_pontokat_foglalo_kor sk = new TSik_pontokat_foglalo_kor();

System.Console.WriteLine(" --- Kérem a pontok számát: --- ");

int p_count = System.Convert.ToInt32(System.Console.ReadLine());

sk.pontok_szama = p_count;

sk.pontok_beo();

sk.kor_megadasa();

System.Console.WriteLine("A kör középpontja O( {0} , {1} )és

sugara: R = {2}",

sk.kozeppont.x, sk.kozeppont.y,sk.sugar);

Ezzel a feladatot megoldottuk.