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.