fel
le

Halak és pálinka

Az előzőeken (rekord, listák) kezelésén felül propertyk készítését kell gyakorolni.

  • védelmi szint, a fizikai mező és a property neve hasonló, névadási szokást kell bevezetni (pl. mező neve _ jellel kezdődik, vagy f betűvel - field)
  • írható olvasható property, az értékre vonatkozó szabállyal, pl "életkor csak 18..60 év"
  • nincs még konstruktor, így csak olvasható propertyt nem tudunk
  • string típusú property, min és max hosszra vonatkozó szabály, null érték kizárása
  • olyan (pl szám) property, ahol a következő érték az előző értékre alapszik, pl az életkor csak 1-el nőhet (változhat)
  • objektumok kezelése listában
  • egyszer inicializálható property, a set publikus, de csak egyetlen alkalommal működik, második set-re már hibát ad (mező értéke már beállításra került korábban). Amíg a mező még nem tartalmaz értéket, addig get-el nem kiolvasható (mező még nem került beállításra).

Ragadozó és növényevő halak

Egy halat (fish) jellemez, hogy a vízben milyen mélységben szeret úszni. Megadjuk ezen mélység-intervallum (tól-ig) felső határát (top) és mélységét (depth). Pl. ha top=30, depth=80, akkor a hal nem úszik 30 centinél közelebb a vízfelszínhez, és 1.1m (30cm+80cm=110cm) mélység alá sem úszik. Minden halnak van súlya, és tároljuk hogy ragadozó-e vagy növényevő.

  • weight: súlya, tört érték, 0.5 kilótól 40.0 kilóig valid, a hal súlya növekedhet és csökkenhet is, de egyszerre maximum az aktuális halsúly 10% -val
  • predator: ragadozó-e (vagy növényevő), bool, true/false, ha egyszer beállítottuk, nem módosítható
  • top: hány cm mélység fölé nem merészkedik, egész, 0cm-től 400cm-ig valid,
  • depth: hány cm a mozgási sávjának mélysége, egész, 10cm-től 400cm-ig valid
  • a halfaj (busa, keszeg, stb) string formában kerül tárolásra (most), a hal fajának neve nem lehet null, legalább 3 betű, maximum 30 betű hosszú lehet.

Készítsünk egy listába

  • 100 db halat,
  • 90% eséllyel növényevőt,
  • különböző random súllyal és úszási mélységekkel, halfajjal,
  • írassuk ki a 100 halból hány darab lett végül is a ragadozó, mennyi a növényevő,
  • mennyi a legnagyobb súlyú hal súlya,
  • illetve számoljuk meg hány hal képes 1.1m mélységben úszni.
  • válasszunk random 2 halat, ha az egyik növényevő, a másik ragadozó, és az ragadozó be tud úszni a növényevő sávjába, akkor 30% eséllyel megeszi azt. Ekkor a ragadozó hal súlya nőjön meg, és töröljük a listából a növényevőt (100 ismétlés).
  • a végén írassuk ki a 100 halból hány darab és hány kilónyi növényevő halat ettek meg a ragadozók.

HF: Pálinka kezelése

Egy pálinkáz jellemez:

  • alkoholfoka: egész szám (30-87)
  • gyümölcs: szilva, barack, dió, körte, stb, nem lehet null, minimum 3 betű, maximum 20 betű
  • mennyiség: egész szám, 0-50, deciliterben
  • készítés éve: egész szám, 2000 .. aktuális év (DateTime.Now.Year adja meg az aktuális évet))
  • ára: 50-1000 ft/deciliter

Készítsünk főprogramot:

  • pálinkák listáját készíti el, 20 db pálinka, random adatokkal,
  • meghatározza az össz pálinka mennyiséget (átszámolja literbe),
  • random választ egy pálinkt a listáról, és megisszuk a felét, a bevételt számoljuk, 50 ismétlés,
  • kiírjuk mennyi bevétel jött össze.


Hal osztály :

class Hal
{
        #region :: hal sulya ::
        protected double _suly=0;
        public double suly
        {
            get
            {
                if (_suly == 0) throw new Exception("még nincs beállítva");
                return _suly;
            }
            set
            {
                if (value < 0.5 || value > 40) throw new Exception("Nem jó a súly adat!");
                if (_suly == 0) _suly = value;
                else
                {
                    double arany = value * 100 / _suly;
                    if (0.9 <= arany && arany <= 1.1) _suly = value;
                    else throw new Exception("Ennyivel nem ugorhat meg a sulya!");
                }
            }
        }
        #endregion
        #region :: hal ragadozo-e ::
        protected bool _ragadozo;
        protected bool _ragadozo_beallitva = false;
        public bool ragadozo
        {
            get
            {
                if (_ragadozo_beallitva == false) throw new Exception("meg nincs beallitva");
                return _ragadozo;
            }
            set
            {
                if (_ragadozo_beallitva == true) throw new Exception("mar be van allitva");
                _ragadozo_beallitva = true;
                _ragadozo = value;
            }
        }
        #endregion
        #region :: hal uszasi magassag ::
        protected int _magas;
        public int magas
        {
            get
            {
                return _magas;
            }
            set
            {
                if (value < 0 || value > 400) throw new Exception("Nem jó a top adat!");
                else _magas = value;
            }
        }
        #endregion
        #region :: hal uszasi melysege ::
        protected int _melyseg;
        public int melyseg
        {
            get
            {
                return _melyseg;
            }
            set
            {
                if (value < 10 || value > 400) throw new Exception("Nem jó a depth adat!");
                else _melyseg = value;
            }
        }
        #endregion
        #region :: halfaj ::
        protected string _halfaj=null;
        public string halfaj
        {
            get
            {
                if (_halfaj == null) throw new Exception("meg nincs beallitva");
                return _halfaj;
            }
            set
            {
                if (value == null) throw new Exception("nem lehet null");
                if (value.Length < 3 || value.Length > 30) throw new Exception("nem jo halfaj nev");
                _halfaj = value;
            }
        }
        #endregion
}
 

Halas főprogram:

class Program
{
        static Random rnd = new Random();
        static void Main(string[] args)
        {
            string[] fajok = new string[] { "keszeg", "busa", "harcsa", "ponty", "sügér" };
            List<Hal> L = new List<Hal>();
            for (int i = 0; i < 100; i++)
            {
                Hal p = new Hal();
                p.suly = rnd.Next(15, 250) / 10.0;
                p.ragadozo = (rnd.Next(1, 100) > 90);
                p.magas = rnd.Next(0, 11) * 10;
                p.melyseg = rnd.Next(5, 21) * 10;
                p.halfaj = fajok[ rnd.Next(0, fajok.Length) ];
                L.Add(p);
            }
            // ---
            int ragadozo_db = 0;
            foreach (Hal p in L)
            {
                if (p.ragadozo) ragadozo_db++;
            }
            Console.WriteLine("ragadozok={0} db, novenyevok={1} db", ragadozo_db, L.Count - ragadozo_db);
            // ---
            Hal m = L[0];
            foreach (Hal p in L)
                if (p.suly > m.suly) m = p;
            Console.WriteLine("legsulyosabb hal egy {1}, {0} kg", m.suly, m.halfaj);
            // ---
            int db = 0;
            foreach (Hal p in L)
                if (p.magas <= 110 && 110<= p.magas+p.melyseg) db++;
            Console.WriteLine("Osszesen {0} db hal képes 110 cm mélységben úszni",db);
            // ---
            List<Hal> N = new List<Hal>(); // megevett novenyevok
            for (int i = 0; i < 100; i++)
            {
                int k = rnd.Next(L.Count);
                int l = rnd.Next(L.Count);
                if (k == l) continue;
                Hal p = L[k];
                Hal r = L[l];
                if (p.ragadozo == true && r.ragadozo == false) talanMegeszi(p, r, L, N);
                else if (p.ragadozo == false && r.ragadozo == true) talanMegeszi(r, p, L, N);
            }
            Console.WriteLine("osszesen {0} db novenyevot ettek meg", N.Count);
            double sum = 0;
            foreach (Hal p in N)
                sum += p.suly;
            Console.WriteLine("a megevett novenyevok osszsulya = {0} kg", sum);
            // --
            Console.Write("<Enter> a befejezéshez");
            Console.ReadLine();
        }
        //.......................................................................................................................
        static void talanMegeszi(Hal ragadozo, Hal novenyevo, List<Hal> elok, List<Hal> megettek)
        {
            bool megeszi = false;
            bool benne =
                 (ragadozo.magas <= novenyevo.magas && novenyevo.magas <= ragadozo.magas + ragadozo.melyseg)
                  ||
                 (novenyevo.magas <= ragadozo.magas && ragadozo.magas <= novenyevo.magas + novenyevo.melyseg);
            if (benne && rnd.Next(1, 100) < 30) megeszi = true;
            if (megeszi)
            {
                elok.Remove(novenyevo);
                megettek.Add(novenyevo);
                ragadozo.suly = ragadozo.suly + ragadozo.suly * 0.08; // 8% plusz
            }
        }
        //.......................................................................................................................
}
 
Hernyák Zoltán
2013-04-30 17:53:03