fel
le

I. ZH - kutyatelep

A zárthelyi dolgozatra a skillek:

  • osztály deklarálása, példányosítás
  • propertyk, védelmi szintek
  • csak olvasható propertyk
  • enum alapú property,
  • egy osztály több konstruktor, this konstruktorhívás
  • példányok listákba szervezése
  • olyan osztály készítése, melynek mezője lista, ennek használata
  • főprogram készítése, mely teszteli az osztályokat,
  • random értékek generálása, string és enum esetén is.

A feladat

Egy kutyatelepen kutyák vannak, különböző fajú és életkorú. A kutyák között törzskönyvezettek és nem törzskönyvezettek is előfordulnak. A kutyák szaporodhatnak, de csak az azonos fajúak. A kiskutyák faja így mindíg adott (két spániel kiskutyája is spániel fajú lesz). A kutyatelep adott létszámú kutyát képes tárolni, az azon felüli szaporodást nem tudják tárolni, a kiskutyákat pl. eladják vagy elajándékozzák. A kutyák minden évben öregszenek, az idősebb kutyák elpusztulhatnak, ekkor kikerülnek a kutyatelepről (hely szabadul fel).

Kutya osztály

  • faja: enum, terrier, bulldog, spaniel, vizsla, konstruktorban beállítható, később csak olvasható
  • him: bool, true/false, konstruktorban beállítható, később csak olvasható
  • törzskönyvezett: bool, true/false, kezdetben false, olvasható, írható, de csak csak true-ra módosítható,
  • kora: egész, kezdetben 1 éves, olvasható, írható, de írás során csak 1-el növelhető a korábbi értékhez képest
  • apaszülő: kutya típusú adat, a papa kutya példány referenciája, kezdetben null, olvasható, csak egyszer írható (beállítható), csak hím kutya lehet az értéke
  • anyaszülő: kutya típusú adat, a mama kutya példány referenciája, kezdetben null, olvasható, csak egyszer írható (beállítható), csak nőstény kutya lehet az értéke,
  • fv tudszaporodni( kutya ): bool értékkel tér vissza, megadja hogy képes-e szaporodni a kutya az adott paraméterű másik (hím) kutyapéldánnyal. Csak nőstények esetén ad vissza true-t, és csak akkor ha a hím kutya (paraméterben) ugyanazon fajú (pl. mindkettő spániel), és az előző szaporodás óta eltelt már legalább 2 év.
  • fv szaporodik( kutya ): A függvény kiskutyákat „gyárt”, akiknél be van állítva mindkét szülők. A kiskutyák ugyanilyen fajúak, 1 évesek, a nemük random. Ha mindkét szülő törzskönyvezett, akkor a kiskutyák is azok. A fv visszatérési értéke egy lista, melyre random 4-7 kiskutya kerül.
  • konstruktor: faja, hím-e, törzskönyvezett, papa, mama, életkora
  • konstruktor: faja, hím-e, a többi egyéb mezői értelemszerű kezdőértékről kezdenek

Kutyatelep konténer osztály:

  • maximális létszám: egész, min 5 maximum 200
  • kutyák egy listája: mező, a maximális létszámig bővülhet, az egyes fajú kutyákból maximum 50 darab lehet!
  • darabszám: csak olvasható, megadja a kutyatelepen lévő kutyák számát,
  • fv darabszám( kutyafaj ): megadja, hogy a listán adott fajú kutyából hány darab van
  • fv elhelyez( kutya ): bool-al tér vissza, egy kutya elhelyezése a listán, nem lehet null a paraméter,adott fajú kutyából nem lehet több mint 50. Ha nem sikerül a kutya elhelyezése akkor false-t ad vissza.
  • fv lekerdez( sorszam ): adott sorszámú (indexű) kutya példány lekérdezése a listából, a kutya példányt adja meg
  • fv elteltEgyEv(): nincs paraméter, minden kutya életkora öregedjen 1 évet. Amelyik kutya életkora eléri a 15 évet, akkor életkor*5% eséllyel a kutya elpusztul (egy 5 éves kutya 30% esély hogy az idén elpusztul). Az elpusztult állatokat törölni kell a listáról.
  • konstruktor: a maximális létszámmal, a lista kezdetben üres

Főprogram:

  • Példányosít egy kutyatelepet, maximálisan 180 kutyával,
  • majd elhelyez rajta szülők nélküli kutyákat, random fajjal és nemmel, random életkorral, 60% eséllyel törzskönyvezett, összesen 40 darabot.
  • Ezek után 100 kísérletet tesz szaporításra oly módon, hogy random választ 2 kutyát a listáról, és ellenőrzi, hogy valamelyik kutya képes-e szaporodni a másikkal.
  • Ha igen, akkor meghívja, a szaporodik függvényét. A kapott kiskutyákat elhelyezi a kutyatelepen (ha lehet).
  • Ha a kutyatelepen már nincs szabad hely a kiskutyáknak (minimum 8 üres hely) akkor nem szaporítja a létszámot.
  • Ezek után minden kutya öregszik egy évet (az idős állatok elpusztulnak).
  • Ezt ismételjük meg 20x, minden év végén írjuk ki a kutyatelep létszámát, az éves szaporulat darabszámát, és azon kiskutyák adatait, amelyet már nem lehet elhelyezni a kutyatelepen egyéb okból.
  • A végén írjuk ki hány kutya lett, összesen hány törzskönyvezett, és a spániel fajú kutyák adatait részletezve.

Egy lehetséges megoldás (thx. mikroby)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KutyaZH
{
    enum kfaja { terrier, bulldog, spaniel, vizsla }
    class kutya
    {
        static Random rnd = new Random();
        protected kfaja _faja;
        protected bool _him;
        protected bool _torzskonyvezett;
        protected int _kora = 1;
        protected bool kora_beallit;
        protected kutya _apaszulo;
        protected kutya _anyaszulo;
        protected int utolso_szaporodas;

        public kfaja faja
        {
            get { return _faja; }
        }
        public bool him
        {
            get { return _him; }
        }
        public bool torzskonyvezett
        {
            get { return _torzskonyvezett; }
            set
            {
                if (torzskonyvezett && value == false) throw new Exception("Rossz Törzskönyvezett érték!");
                _torzskonyvezett = value;
               
            }
        }
        public int kora
        {
            get { return _kora; }
            set
            {
                if ( value<0) throw new Exception("Rossz kor érték!");
                if (_koray == 0 ) _kora = value;
                else if (value != kora + 1) throw new Exception("Rossz kor érték!");
                _kora = value;              

            }
        }
        public kutya apaszulo
        {
            get { return _apaszulo; }
            set
            {
                if (value==null) throw new Exception("Nem lehet null!");
                if (_apaszulo!=null) throw new Exception("Egyszer már beállítottad!");
                if (value.him==false) throw new Exception("Apaállat nem lehet nőstény!");
                _apaszulo = value;

            }        

        }
        public kutya anyaszulo
        {
            get { return _anyaszulo; }
            set
            {
                if (value==null) throw new Exception("Nem lehet null!");
                if (_anyaszulo!=null) throw new Exception("Egyszer már beállítottad!");
                if (value.him==true) throw new Exception("Anyaállat nem lehet hím!");
                _anyaszulo = value;

            }

        }
        public bool tudszaporodni(kutya k)
        {
            if (((!_him) && (k.him)) && _faja == k._faja && utolso_szaporodas <= kora - 2)
            {
                utolso_szaporodas = kora;
                return true;
            }
            return false;
        }
        public List<kutya> szaporodik(kutya k)
        {
            if (tudszaporodni(k))
            {
                int kutyaszam = rnd.Next(4, 8);
                bool kiskutya_torzskony = false;
                if (torzskonyvezett && k.torzskonyvezett) kiskutya_torzskony = true;
                List<kutya> kis_kutya = new List<kutya>();
                for (int i = 0; i < kutyaszam; i++)
                {
                    bool him_e = rnd.Next(1, 100) < 50;
                    kutya kiskutya = new kutya(this._faja, him_e, kiskutya_torzskony, k, this); // itt van a 2 szülő
                    kiskutya.kora = 1;
                    kis_kutya.Add(kiskutya);
                }
                return kis_kutya;
            }
            else return null;
        }

        public kutya(kfaja faja, bool hime, bool torzskonyv, kutya papa, kutya mama)
        {
            _faja = faja;
            _him = hime;
            _torzskonyvezett = torzskonyv;
            apaszulo = papa;
            anyaszulo = anyaszulo;            
        }
        public kutya(kfaja faja, bool hime)
            :this(faja, hime,false, null, null) {}      
                 
    }
    class kutyatelep // konténer
    {
        static private Random rnd = new Random();
        protected int _maximalis_letszam;
        protected List<kutya> kutyalista;
        public int maximalis_letszam
        {
            get
            { return _maximalis_letszam; }
            set
            {
                if (value < 5 || value > 200) throw new Exception("Rossz Maximalis érték!");
                _maximalis_letszam = value;
            }
        }
       
        public int darabszam
        {
            get { return kutyalista.Count; }
        }
        public int faj_darabszam(kfaja kf)
        {
            int db = 0;
            foreach (kutya k in kutyalista)
            {
                if (kf == k.faja) db++;
            }
            return db;
        }

        public bool elhelyez(kutya k)
        {
            if (k == null) return false;
            if (faj_darabszam(k.faja) >= 50) return false;
            if (kutyalista.Count>=maximalis_letszam) return false;
            kutyalista.Add(k);
            return true;
        }

        public kutya lekerdez(int index)
        {
            return kutyalista[index];
        }

        public void elteltEgyEv()
        {

            List<kutya> torlendok = new List<kutya>();
            foreach(kutya k in kutyalista)
            {
                k.kora = k.kora + 1;
                if (k.kora * 5 > rnd.Next(1, 100)) // elpusztul
                    torlendok.Add(k);
            }
            foreach (kutya p in torlendok)
                kutyalista.Remove(p);
        }
        public kutyatelep(int max)
        {
            maximalis_letszam = max;
            kutyalista = new List<kutya>();
        }

    }
    class Program
    {
        static Random rnd = new Random();        
        static void Main(string[] args)
        {            
            kutyatelep ktelep = new kutyatelep(180);
            for (int i = 0; i < 40; i++)
            {
                int rf = rnd.Next(0, 4);
                kfaja k_faja = (kfaja)rf;
                int reletkor = rnd.Next(1, 10);
                bool random = rnd.Next(1, 100) < 50;
                bool rtorzskonyv = rnd.Next(1, 100) < 60;
                kutya kutyak = new kutya(k_faja,random);
                kutyak.kora = reletkor;
                kutyak.torzskonyvezett = rtorzskonyv;
                ktelep.elhelyez(kutyak);
            }
            for (int l = 0; l < 20; l++)
            {

                Console.WriteLine("Év:{0}", l+1);
                Console.WriteLine("Darabszám a Telepen:{0}", ktelep.darabszam);
                List<kutya> kiskutyalista_akiketnem = new List<kutya>();
                List<kutya> kiskutyalista = new List<kutya>();
                int szaporulat = 0;              
                for (int i = 0; i < 100; i++)
                {
                    int k1 = rnd.Next(ktelep.darabszam);
                    int k2 = rnd.Next(ktelep.darabszam);
                    if (k1 == k2) continue;
                    kutya k1_kutya = ktelep.lekerdez(k1);
                    kutya k2_kutya = ktelep.lekerdez(k2);                    
                    kiskutyalista = k1_kutya.szaporodik(k2_kutya);
                   
                    if (kiskutyalista != null)
                    {
                        szaporulat += kiskutyalista.Count;
                        foreach(kutya k in kiskutyalista)
                        {
                            if (!((ktelep.maximalis_letszam - 8 > ktelep.darabszam) && ktelep.elhelyez(k))) kiskutyalista_akiketnem.Add(k); ;
                        }
                    }                  
                }
                ktelep.elteltEgyEv();                
                Console.WriteLine("Szaporulat:{0}", szaporulat);
                Console.WriteLine("Kisktyák akiket nem lehet elhelyezni:");
                if (kiskutyalista_akiketnem != null)
                {
                    foreach (kutya k in kiskutyalista_akiketnem)
                    {
                        Console.WriteLine("Faja:{0}", k.faja);
                        string him;
                        if (k.him) him = "hím"; else him = "nőstény";
                        Console.WriteLine("{0}", him);
                        Console.WriteLine("Kora:{0}", k.kora);
                        Console.WriteLine("Törzskönyvezett{0}", k.torzskonyvezett);
                    }
                }

            int torzskonyvezett = 0;
            int spaniel_him = 0;
            int spaniel_nosteny = 0;
            int spaniel_torzskonyv = 0;
            for (int i = 0; i < ktelep.darabszam;i++ )
            {
                kutya k = ktelep.lekerdez(i);
                if (k.torzskonyvezett) torzskonyvezett++;
                if (k.faja == (kfaja)2)
                {
                   
                    if (k.him) spaniel_him++; else spaniel_nosteny++;
                    if (k.torzskonyvezett) spaniel_torzskonyv++;
                }
                   
            }
            Console.WriteLine("-------------------------------------------------------");
            Console.WriteLine("A telepen összesen {0} kutya van!", ktelep.darabszam);
            Console.WriteLine("Összesen {0} törzskönyvezett", torzskonyvezett);
            Console.WriteLine("---------------------------------");
            Console.WriteLine("Spániel {0}", ktelep.faj_darabszam((kfaja)2));
            Console.WriteLine("Hím:{0}", spaniel_him);
            Console.WriteLine("Nőstény:{0}", spaniel_nosteny);
            Console.WriteLine("Törzskönyvezett:{0}", spaniel_torzskonyv);
            Console.WriteLine("-------------------------------------------------------");

                Console.ReadLine();
            }

        }
    }
}
 
Hernyák Zoltán
2013-04-30 17:53:08