2023. október 27., péntek

2023.10.27. Házi feladat

 Házi feladat megoldani a Szoftverek feladatsort (hiányzóknak is).

2023.10.27. Kamionok alap megoldás

 using System;


namespace KamionokAlap
{
    class Kamion
    {
        public string Marka { get; set; }
        public string Tipus { get; set; }
        public int Evjarat { get; set; }
        public int Teljesitmeny { get; set; }
        public double Uzemanyagfogyasztas { get; set; }
        public int KmAllas { get; set; }

        public Kamion(string sor)
        {
            string[] mezok = sor.Split(';');
            Marka = mezok[0];
            Tipus = mezok[1];
            Evjarat = int.Parse(mezok[2]);
            Teljesitmeny = int.Parse(mezok[3]);
            Uzemanyagfogyasztas = double.Parse(mezok[4]);
            KmAllas = int.Parse(mezok[5]);
        }

        public void Kiir()
        {
            Console.WriteLine($"Márka: {Marka}, Típus: {Tipus}, Évjárat: {Evjarat}, Teljesítmény: {Teljesitmeny} lóerő, Üzemanyagfogyasztás: {Uzemanyagfogyasztas} l/100km, Km-óra állás: {KmAllas}");
        }

        public override string ToString()
        {
            return $"Márka: {Marka}, Típus: {Tipus}, Évjárat: {Evjarat}, Teljesítmény: {Teljesitmeny} lóerő, Üzemanyagfogyasztás: {Uzemanyagfogyasztas} l/100km, Km-óra állás: {KmAllas}";
        }

        public double TeljesitmenyKW()
        {
            return Math.Round(Teljesitmeny * 0.7355,2);
        }

    }
}

using System;
using System.Collections.Generic;
using System.IO;

namespace KamionokAlap
{  
    class Program
    {
        static void Main(string[] args)
        {
            List<Kamion> kamionok = BeolvasKamionok(@"..\..\..\src\kamionok.txt");

            Console.WriteLine("\nÖsszes kamion adatai:");
            foreach (var kamion in kamionok)
            {
                Console.WriteLine(kamion);
            }

            Console.WriteLine($"\n1. Feladat: Átlagos évjárat: {AtlagosEvjarat(kamionok)}");

            List<Kamion> manKamionok = new List<Kamion>();
            Console.WriteLine($"\n2. Feladat: {ManKamionok(kamionok, manKamionok)} db MAN kamion van 2018 vagy újabb évjáratú.");

            List<Kamion> legtobbfutott = LegtobbfutottKamion(kamionok);
            Console.WriteLine("\n3. Feladat: Legtöbbet futott kamion(ok):");
            foreach (var kamion in legtobbfutott)
            {
                Console.WriteLine(kamion);
            }

            //ebben a megoldásban az elsőt kapjuk meg
            Kamion iveco = IvecoKamion(kamionok);
            Console.WriteLine("\n4. Feladat: " + (iveco != null ? "Van" : "Nincs") + " olyan Iveco kamion, aminek a fogyasztása kevesebb, mint a legerősebb motorteljesítményű Mercedes modell fogyasztása.");
            iveco.Kiir();

            Console.WriteLine("\n5. Feladat: Üzemanyagfogyasztás 30 l alatt:");
            List<Kamion> alacsonyFogyasztasuKamionok = AlacsonyFogyasztasuKamionok(kamionok);
            foreach (var kamion in alacsonyFogyasztasuKamionok)
            {
                Console.WriteLine(kamion);
            }

            Kamion max;
            Kamion min;
            string eredmeny = LegerosebbLeggyengebbEgyezik(kamionok, out max, out min) ? "igen" : "nem";
            Console.WriteLine($"\n6. Feladat: A legerősebb és leggyengébb kamionnak ugyanaz a gyártója? {eredmeny}");
            Console.WriteLine($"Legerősebb kamion: {max}");
            Console.WriteLine($"Leggyengébb kamion: {min}");

 

            Console.WriteLine("\n7. Feladat: \nFájlba írás: Kamionok átszámolva kW-ra");
            KiirKilowattba(kamionok, @"..\..\..\src\kamionok_kw.txt");

            Console.ReadKey();
        }

        static List<Kamion> BeolvasKamionok(string file)
        {
            List<Kamion> kamionok = new List<Kamion>();
            try
            {
                string[] sorok = File.ReadAllLines(file);
                for (int i = 1; i < sorok.Length; i++)
                {
                    kamionok.Add(new Kamion(sorok[i]));
                }
            }
            catch (IOException e)
            {
                Console.WriteLine("Hiba a fájl olvasása közben: " + e.Message);
            }
            return kamionok;
        }
        static double AtlagosEvjarat(List<Kamion> kamionok)
        {
            double osszeg = 0;
            foreach (var kamion in kamionok)
            {
                osszeg += kamion.Evjarat;
            }
            return Math.Round(osszeg / kamionok.Count);
        }

        static int ManKamionok(List<Kamion> k, List<Kamion> man)
        {
            foreach (var item in k)
            {
                if (item.Marka == "MAN" && item.Evjarat >= 2018)
                {
                    man.Add(item);
                }
            }
            return man.Count;
        }

        static List<Kamion> LegtobbfutottKamion(List<Kamion> kamionok)
        {
            Kamion max = kamionok[0];
            List<Kamion> legtobbfutott = new List<Kamion>();

            foreach (var kamion in kamionok)
            {
                if (kamion.KmAllas > max.KmAllas)
                {
                    max = kamion;
                }
            }
            foreach (var item in kamionok)
            {
                if (item.KmAllas == max.KmAllas)
                {
                    legtobbfutott.Add(item);
                }
            }
            return legtobbfutott;
        }

        static Kamion IvecoKamion(List<Kamion> kamionok)
        {
            Kamion maxTeljesitmenyuMercedes = kamionok[0];
            foreach (var item in kamionok)
            {
                if (item.Marka =="Mercedes" && maxTeljesitmenyuMercedes.Teljesitmeny < item.Teljesitmeny)
                {
                    maxTeljesitmenyuMercedes = item;
                }
            }
            //teszt
            //Console.WriteLine("maxTeljesitmenyuMercedes telj. mercedes");
            //maxTeljesitmenyuMercedes.Kiir();
            foreach (var item in kamionok)
            {
                if (item.Marka == "Iveco" && item.Uzemanyagfogyasztas < maxTeljesitmenyuMercedes.Uzemanyagfogyasztas)
                {
                    return item;
                }
            }
            return null;
        }

        static List<Kamion> AlacsonyFogyasztasuKamionok(List<Kamion> kamionok)
        {
            List<Kamion> alacsonyFogyasztasu = new List<Kamion>();

            foreach (var kamion in kamionok)
            {
                if (kamion.Uzemanyagfogyasztas < 30)
                {
                    alacsonyFogyasztasu.Add(kamion);
                }
            }
            return alacsonyFogyasztasu;
        }

        static bool LegerosebbLeggyengebbEgyezik(List<Kamion> kamionok, out Kamion kamionMax, out Kamion kamionMin)
        {
            kamionMax = kamionok[0];
            kamionMin = kamionok[0];

            foreach (var kamion in kamionok)
            {
                if (kamion.Teljesitmeny > kamionMax.Teljesitmeny)
                {
                    kamionMax = kamion;
                }
                if (kamion.Teljesitmeny < kamionMin.Teljesitmeny)
                {
                    kamionMin = kamion;
                }
            }
            return kamionMax.Marka == kamionMin.Marka;
        }


        static void KiirKilowattba(List<Kamion> kamionok, string fajlnev)
        {
            using StreamWriter writer = new StreamWriter(fajlnev);
            foreach (var kamion in kamionok)
            {
                writer.WriteLine($"Márka: {kamion.Marka}, Típus: {kamion.Tipus}, Évjárat: {kamion.Evjarat}, Teljesítmény: {kamion.TeljesitmenyKW()} kW, Üzemanyagfogyasztás: {kamion.Uzemanyagfogyasztas} l/100km, Km-óra állás: {kamion.KmAllas}");
            }
        }
    }
}


2023.10.26. Repülők LINQ megoldás

Kevin megoldása alapján

 using System;

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

namespace arpaskTZ
{
    class Repulogep
    {
        public string GyartoModell { get; set; }
        public int Evjarat { get; set; }
        public string MotorTipus { get; set; }
        public int UtasSzam { get; set; }
        public int HatoTav { get; set; }
        public int UtazasiMagassag { get; set; }
        public double UtazasiMagassagKmben
        {
            get
            {
                return (double)UtazasiMagassag / 1000;
            }
        }

        public Repulogep(string sor)
        {
            var r = sor.Split(";");
            GyartoModell = r[0];
            Evjarat = int.Parse(r[1]);
            MotorTipus = r[2];
            UtasSzam = int.Parse(r[3]);
            HatoTav = int.Parse(r[4]);
            UtazasiMagassag = int.Parse(r[5]);
        }

        public override string ToString() => $"{GyartoModell}, {Evjarat}, {MotorTipus}, {UtasSzam}, {HatoTav}, {UtazasiMagassag}";
    }
}

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

namespace arpaskTZ
{
    class Fuggvenyek
    {
        public static double AtlagEvjarat(List<Repulogep> repulogepek)
        {
            return repulogepek
                .Average(r => r.Evjarat);
        }

        public static double MaxUtasSzam500(List<Repulogep> repulogepek)
        {
            return repulogepek.Count;
        }

        public static List<Repulogep> LegnagyobbHatotav(List<Repulogep> repulogepek)
        {
            int legnagyobbHatotavolsag = repulogepek
                .OrderByDescending(r => r.HatoTav)
                .Select(r => r.HatoTav)
                .First();

            return repulogepek
                .Where(r => r.HatoTav == legnagyobbHatotavolsag)
                .ToList();
        }

        public static List<Repulogep> KicsiBoeing(List<Repulogep> repulogepek)
        {
            var legregebbiAirBus = repulogepek
                .Where(r => r.GyartoModell.StartsWith("Airbus"))
                .OrderBy(r => r.Evjarat)
                .First();

            return repulogepek
                .Where(r => r.UtasSzam < legregebbiAirBus.UtasSzam && r.GyartoModell.StartsWith("Boeing"))
                .ToList();
        }

        public static List<Repulogep> AlcsonyanSzall(List<Repulogep> repulogepek)
        {
            return repulogepek
                .Where(r => r.UtazasiMagassag < 6000)
                .ToList();
        }

        public static (Repulogep legkisebb, Repulogep legnagyobb, bool ugyanazE) LegnagyobbLegkisebb(List<Repulogep> repulogepek)
        {
            var legkisebbHatotavu = repulogepek
                .OrderBy(r => r.HatoTav)
                .First();

            var legnagyobbHatotavu = repulogepek
                .OrderByDescending(r => r.HatoTav)
                .First();

            bool vanE = legkisebbHatotavu.GyartoModell == legnagyobbHatotavu.GyartoModell;

            return (legkisebbHatotavu, legnagyobbHatotavu, vanE);
        }
    }
}

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

namespace arpaskTZ
{
    class Program
    {
        static void Main(string[] args)
        {
            var repulogepek = new List<Repulogep>();

            try
            {
                using var sr = new StreamReader(@"..\..\..\src\repulogepek.txt", Encoding.UTF8);

                while (!sr.EndOfStream)
                {
                    repulogepek.Add(new Repulogep(sr.ReadLine()));
                }
            }
            catch (Exception)
            {
                Console.WriteLine("Nem található a file");
            }

            foreach (var r in repulogepek)
            {
                Console.WriteLine(r);
            }

            Console.WriteLine("9. feladat");

            Console.WriteLine($"A repülők átlagos évjárata: {Math.Round(Fuggvenyek.AtlagEvjarat(repulogepek))}");

            Console.WriteLine("10. feladat");

            var f10 = repulogepek
                .Where(r => r.UtasSzam > 500)
                .ToList();

            Console.WriteLine($"{Fuggvenyek.MaxUtasSzam500(f10)} olyan repülőgép van, aminek utasszáma meghaladja az 500-at");

            Console.WriteLine("11. feladat");

            var f11Lista = Fuggvenyek.LegnagyobbHatotav(repulogepek);

            foreach (var f in f11Lista)
            {
                Console.WriteLine(f);
            }

            Console.WriteLine("12. feladat");

            var kicsiBoeingek = Fuggvenyek.KicsiBoeing(repulogepek);

            if (kicsiBoeingek.Count != 0)
            {
                Console.WriteLine(kicsiBoeingek[0]);
            }
            else
            {
                Console.WriteLine("Nincs ilyen Boeing");
            }

            Console.WriteLine("13. feladat");

            var alacsonyanSzallnak = Fuggvenyek.AlcsonyanSzall(repulogepek);

            foreach (var a in alacsonyanSzallnak)
            {
                Console.WriteLine(a);
            }

            Console.WriteLine("15. feladat");
            using var sw = new StreamWriter(@"..\..\..\src\valami.txt", false, Encoding.UTF8);
            {
                foreach (var r in repulogepek)
                {
                    sw.WriteLine($"{r.GyartoModell}, {r.UtazasiMagassagKmben}");
                }
            }
            Console.WriteLine("Fájlba írás kész.");

            Console.WriteLine("16. feladat");

            var (legkisebb, legnagyobb, vanE) = Fuggvenyek.LegnagyobbLegkisebb(repulogepek);

            Console.WriteLine(legkisebb);

            Console.WriteLine(legnagyobb);

            Console.WriteLine($"{(vanE ? "Ugyanaz" : "Nem ugyanaz")} a legkisebb és a legnagyobb hatótávú repülő gyártója");

            Console.ReadKey();
        }
    }
}

2023. október 26., csütörtök

2023. október 17., kedd

2023.10.12. Tesztelés - Soft skilles dokumentum befejezése

 Aki nem fejezte be, annak házi feladat befejezni - és figyelj, hogy meg legyen velem osztva.

A teszpiramisos dokumentum is legyen megosztva.

2023.10.18. A szoftverkrízis

  A szoftverkrízis

Feldolgozandó kötelező források, amikben a következő fő témákat keressétek:

  1. mi az a szoftverkrízis?
  2. mi okozhatja?
  3. milyen konkrét példákat ismerünk?
  4. mi a megoldás?

https://aries.ektf.hu/~hz/pdf-tamop/pdf-xx/ProgTechJegyzet.1.1.6.pdf

https://dtk.tankonyvtar.hu/bitstream/handle/123456789/13039/0046_szoftverteszteles.pdf?sequence=2&isAllowed=y

https://www.informatika-programozas.hu/informatika_java_programozas_gyakorlat_3_objektumorientaltsag.html

Innen és más forrásokból konkrét példákat kell gyűjteni:

https://irh.inf.unideb.hu/~kuki/rsz.pdf


Feladat:

  • 4-5 fős csoportokban dolgoztok
  • kell egy projekt-vezető, és egy helyettes (hiányzás esetére)
  • szét kell osztani a feladatokat (a vezető kiosztja, és/vagy önkéntesen elvállaljátok)
    •     új dokumentumok kutatása
    •     kötelező és új dokumentumok áttekintése
    •     majd részekre bontása az elemzés, feldolgozás céljából
  • a szétosztott dokumentumrészletekből a neki jutó részeket mindenki önállóan feldolgozza: kérdéseket ír, majd ezeket saját szavaival megválaszolja, ezeket egy helyen gyűjtitek (ezt a megosztott dokumentumot a vezető hozza létre)
  • két csapattag kevesebb elemzési feladatot kap, viszont megtanulja a Google űrlap készítését, és amikor már gyűlnek a kérdések, elkezdenek egy űrlapot készíteni a kérdésekből
  • a kész űrlapot a csapattagok megoldják tesztelésképpen, és ha szükséges, módosítják azt
  • a letesztelt űrlapot a másik két csapattal megosztjuk, majd ők is megoldják

3 óra van a feladat megoldására. (Szerdán három hiányzóval, rövidített órán éppen csak elkezdtük.)

2023. október 12., csütörtök

2023. október 11., szerda

2023.10.11. Monitorok hagyományos megoldás

Ne feledjük, hogy pénteken TZ.

using System;

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

namespace monitorAlapOOP
{
    class Monitor
    {
        public string Gyarto { get; private set; } // ezt a propertyt nem dolgoztuk ki, továbbfejlesztésre vár
        public string Tipus { get; set; } //ha nincs private a set-nél, nem olyan erős a védelem
        public double Meret { get; set; }
        public double Ar { get; set; }
        public bool Gamer { get; set; }
        private double bruttoAr; //ennél az adattagnál kidolgozzuk a propertyt, így ő rejtett láthatóságú      
        public int Darab; //ez egy "sima" adattag, nem property (nem ajánlott ilyet írni)
        const double Afa = 27;

        public double BruttoAr  //ez egy property, ami a bruttoAr adattag "értékére vigyáz"
        {
            get { return bruttoAr; }
            set
            {
                if (value > Ar)
                {
                    bruttoAr = value;
                }
                else
                {
                    throw new Exception("HIBA! A bruttó érték nem nagyobb a nettónál! Az érték nulla marad.");
                }
            }
        }  

        public Monitor(string sor) //ez a konstruktor
        {
            List<string> kezelo = sor.Split(';').ToList();
            this.Gyarto = kezelo[0];
            this.Tipus = kezelo[1];
            this.Meret = Convert.ToDouble(kezelo[2].Replace('.', ','));
            this.Ar = Convert.ToDouble(kezelo[3]);
            if (kezelo.Contains("gamer")) //vagy: kezelo.Count == 5
            {
                this.Gamer = true;
            }
            else
            {
                this.Gamer = false;
            }
            this.Darab = 15;
            //KIVÉTELKEZELÉS (Hibakezelés):
            try //"próbáld meg ezt a részt végrehajtani":
            {
                this.BruttoAr = Convert.ToDouble(kezelo[3]) * (Afa / 100 + 1);

                //ha a hibakezelést akarjuk tesztelni, akkor vegyük ki ezt az egy sort megjegyzésből:
                //brutto = 1; //miután ez hibás értékadás, nem fog végrehajtódni, az érték nulla marad
                //és megjelenik a hibaüzenet
                //figyeljük meg 12. feladatot, ez a hiba ott is jelentkezik ugyanígy
            }
            catch (Exception ex) //"ha volt feldobva hiba futás közben, kapd el, kezeld helyesen és írd ki a feldobott üzenetet"
            {
                Console.WriteLine(ex.Message);
            }
            //itt nem közvetlenül az adattagba írunk, hiszen a <BruttoAr> propertyt használjuk itt,
            //ami a rejtett bruttoAr adattagba ír
            //ha itt rosszul számoljuk a bruttó árat, nem engedi beletenni az adattagba
            //(nyilván itt ugyanaz az ember írja mindkettőt, de megeshet, hogy ez nem így van)
        }


        public string GamerErteke(bool gmr)  //ez egy paraméteres függvény
        {
            if (gmr) return "játék monitor";
            else return "nem játék monitor";
        }

        public override string ToString() //virtuális metódus felülírása
        {
            //így is jó:
            //return "Gyártó: " + Gyarto + "; | Típus: " + Tipus + "; | Méret: " + Meret + " col;" + " | Nettó ár: " + Ar +" Ft\n";
            return $"Gyártó: {Gyarto}; | Típus: {Tipus} | Méret: {Meret} col; | Nettó ár: {Ar} Ft\n";
        }

        public double Ezer(double a)
        {
            return a / 1000;
        }

        public string Kiir() //ez a virtuális metódus helyett van, de meg kell tanulni inkább a virtuális metódust
        {
            return $"Gyártó: {Gyarto.ToUpper()};\nTípus: {Tipus.ToUpper()} ;\nMéret: {Meret} col;\nNettó ár (ezer ft): {Ezer(Ar):0}\nBruttó ár (ezer ft): {Ezer(BruttoAr):0}\nRaktárkészlet: {Darab} darab\n{GamerErteke(Gamer)}";
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
    //Monitor vásár
    //Egy hardver cég többféle monitort árul. A monitorokról a következő adatokat tároljuk: a monitor gyártója; típusa; mérete; ára;
    //illetve amelyik kifejezetten játékra való, ott még megadják azt is, hogy gamer.
    //A méret colban van, az ár nettó és forintban értjük.
    //Forrásfájl tartalma (a tartalmat használd így, ahogy van, az első sort majd nem kell figyelembe venni beolvasáskor):

    //Keszleten levo monitorok
    //Samsung;S24D330H;24;33000  
    //Acer;V227Qbi;21.5;31000  
    //AOC;24G2U;23.8;66000  
    //Samsung;Odyssey G9 C49g95TSSU;49;449989;gamer
    //LG;25UM58-P;25;56000  
    //Samsung;C27JG50QQU;27.5;91000  

    //Feladatok:
    //Lehetőleg minden kiírást a főprogram végezzen el. Próbálj minél több kódot újrahasznosítani.
    //1. Hozz létre egy osztályt a monitorok adatai számára. Olvasd be a fájl tartalmát.
    //2. Írd ki a monitorok összes adatát, soronként egy monitort a képernyőre. A kiírás így nézzen ki:
    //Gyártó: Samsung; Típus: S24D330H; Méret: 24 col; Nettó ár: 33000 Ft
    //2. Tárold az osztálypéldányokban a bruttó árat is (ÁFA: 27%, konkrétan a 27-tel számolj, ne 0,27-tel vagy más megoldással.)
    //3. Tételezzük fel, hogy mindegyik monitorból 15 db van készleten, ez a nyitókészlet. Mekkora a nyitó raktárkészlet bruttó (tehát áfával növelt) értéke?
    //Írj egy metódust, ami meghívásakor kiszámolja a raktárkészlet aktuális bruttó értékét. A főprogram írja ki az értéket.
    //4. Írd ki egy új fájlba, és a képernyőre az 50.000 Ft feletti nettó értékű monitorok összes adatát (a darabszámmal együtt) úgy,
    //hogy a szöveges adatok nagybetűsek legyenek, illetve az árak ezer forintba legyenek átszámítva.
    //Az ezer forintba átszámítást egy külön függvényben valósítsd meg.
    //5. Egy vevő keresi a HP EliteDisplay E242 monitort. Írd ki neki a képernyőre, hogy hány darab ilyen van a készleten.
    //Ha nincs a készleten, ajánlj neki egy olyan monitort, aminek az ára az átlaghoz fölülről közelít. Ehhez használd az átlagszámító függvényt (később lesz feladat).
    //6. Egy újabb vevőt csak az ár érdekli. Írd ki neki a legolcsóbb monitor méretét, és árát.
    //7. A cég akciót hirdet. A 70.000 Ft fölötti árú Samsung monitorok bruttó árából 5%-ot elenged.
    //Írd ki, hogy mennyit veszítene a cég az akcióval, ha az összes akciós monitort eladná.
    //8. Írd ki a képernyőre minden monitor esetén, hogy az adott monitor nettó ára a nettó átlag ár alatt van-e, vagy fölötte,
    //esetleg pontosan egyenlő az átlag árral. Ezt is a főprogram írja ki.
    //9. Modellezzük, hogy megrohamozták a vevők a boltot. 5 és 15 közötti random számú vásárló 1 vagy 2 random módon kiválasztott monitort vásárol,
    //ezzel csökkentve az eredeti készletet. Írd ki, hogy melyik monitorból mennyi maradt a boltban.
    //Vigyázz, hogy nulla darab alá ne mehessen a készlet. Ha az adott monitor éppen elfogyott, ajánlj neki egy másikat (lásd fent).
    //10. Írd ki a képernyőre, hogy a vásárlások után van-e olyan monitor, amelyikből mindegyik elfogyott.
    //11. Írd ki a gyártókat abc sorrendben a képernyőre. Oldd meg úgy is, hogy a metódus írja ki, és úgy is, hogy a főprogram.
    //12. Csökkentsd a legdrágább monitor bruttó árát 10%-kal, írd ki ezt az értéket a képernyőre.

    //A feladatsor egy lehetséges megoldása:

namespace monitorAlapOOP
{
    class Program
    {
        static void Main(string[] args)
        {
            //1. Hozz létre egy osztályt a monitorok adatai számára. Olvasd be a fájl tartalmát. Oldd meg, hogy bármennyi monitort is tudj kezelni.
            //Tárold az osztálypéldányokban a bruttó árat is (ÁFA: 27 %, konkrétan a 27 - tel számolj.)

            //ez a lista fogja tárolni az osztálypéldányokat, tehát az összes adatot,
            //ami a fájlból származik
            //Ez a hagyományos inicializálás:
            //List<Monitor> monitorok = new List<Monitor>();

            //Ez a fajta inicializálás C# 9.0-tól kezdve használható ilyen esetben:
            List<Monitor> monitorok = new();

            //ezzel is lehet strukturálni a kódot (region):
            #region 1. Feladat: Beolvasás
            Console.WriteLine("\n1. Feladat");
            foreach (var i in File.ReadAllLines(@"..\..\..\src\monitorok.txt").Skip(1))
            {
                monitorok.Add(new Monitor(i));
            }
            Console.WriteLine("Beolvasás kész.");
            #endregion

            //2. Írd ki az adatokat a képernyőre.
            Console.WriteLine("\n2. Feladat");
            foreach (var i in monitorok)
            {
                Console.WriteLine(i);
            }

            //3. Tételezzük fel, hogy mindegyik monitorból 15 db van készleten, ez a nyitókészlet. Mekkora a nyitó raktárkészlet bruttó (tehát áfával növelt) értéke?
            //Írj egy metódust, ami meghívásakor kiszámolja a raktárkészlet aktuális bruttó értékét. A főprogram írja ki az értéket.
            Console.WriteLine("\n3. Feladat");
            Console.WriteLine($"A raktárkészlet összértéke {Raktar(monitorok):0} Ft");

            //4. Írd ki egy új fájlba, és a képernyőre az 50000 Ft feletti nettó értékű monitorok összes adatát (a darabszámmal együtt) úgy,
            //hogy a szöveges adatok nagybetűsek legyenek, illetve az árak ezer forintba legyenek átszámítva.
            //Az ezer forintba átszámítást egy külön függvényben valósítsd meg.

            Console.WriteLine("\n4. Feladat");
            Console.WriteLine("Mentés...");
            FajlbaIras(monitorok);
            Console.WriteLine("Mentve\n");

            Console.WriteLine("\n4. Feladat másképp");
            Console.WriteLine("Mentés másképp...");
            FajlbaIras2(monitorok);
            Console.WriteLine("Mentve\n");

            //5. Egy vevő keresi a HP EliteDisplay E242 monitort. Írd ki neki a képernyőre, hogy hány darab ilyen van a készleten.
            //Ha nincs a készleten, ajánlj neki egy olyan monitort, aminek az ára az átlaghoz fölülről közelít. Ehhez használd az átlagszámító függvényt (később lesz feladat).
            Console.WriteLine("\n5. Feladat");
            Console.WriteLine("\nAjánlás");
            MonitorKereso(monitorok);

            //6. Egy újabb vevőt csak az ár érdekli. Írd ki neki a legolcsóbb monitor méretét, és árát.
            Console.WriteLine("\n6. Feladat");
            int index = Legolcsobb(monitorok);
            Console.WriteLine($"Legolcsóbb monitor {monitorok[index].Ar} Ft; {monitorok[index].Meret} col");

            //7. A cég akciót hirdet. A 70000 Ft fölötti árú Samsung monitorok bruttó árából 5%-ot elenged.
            //Írd ki, hogy mennyit veszítene a cég az akcióval, ha az összes akciós monitort eladná.                        
            Console.WriteLine("\n7. Feladat");
            Console.WriteLine($"A cég {SamsungAkcio(monitorok):0} Ft-ot veszítene.");

            //8. Írd ki a képernyőre minden monitor esetén, hogy az adott monitor nettó ára a nettó átlag ár alatt van-e, vagy fölötte,
            //esetleg pontosan egyenlő az átlag árral. Ezt is a főprogram írja ki.
            Console.WriteLine("\n8. Feladat");
            AtlagAlattiFolotti(monitorok);

            //9. Modellezzük, hogy megrohamozták a vevők a boltot. 5 és 15 közötti random számú vásárló
            //1 vagy 2 random módon kiválasztott monitort vásárol,
            //ezzel csökkentve az eredeti készletet. Írd ki, hogy melyik monitorból mennyi maradt a boltban.
            //Vigyázz, hogy nulla darab alá ne mehessen a készlet. Ha az adott monitor éppen elfogyott,
            //ajánlj neki egy másikat (lásd fent).
            Console.WriteLine("\n9. Feladat");
            Vasarlas(monitorok);

            //10. Írd ki a képernyőre, hogy a vásárlások után van-e olyan monitor, amelyikből mindegyik elfogyott.
            Console.WriteLine("\n10. Feladat");
            Elfogyott(monitorok);

            //11. Írd ki a gyártókat abc sorrendben a képernyőre. Oldd meg úgy is, hogy a metódus írja ki, és úgy is, hogy a főprogram.
            Console.WriteLine("\n11. Feladat/1");
            Console.WriteLine("A gyártók abc sorrendben, mindegyikből egy:");
            Console.WriteLine(AbcSorrend1(monitorok));

            Console.WriteLine("\n11. Feladat/2");
            AbcSorrend2(monitorok);

            //12. Csökkentsd a legdrágább monitor bruttó árát 10%-kal, írd ki ezt az értéket a képernyőre.
            Console.WriteLine("\n12. Feladat");
            Legdragabb(monitorok);

            Console.ReadLine();
        }
        static double NettoAtlag(List<Monitor> adatok)
        {
            //1. megoldás, ez is jó:
            //double atlag = 0;
            //for (int i = 0; i < adatok.Count; i++)
            //{
            //    atlag += adatok[i].Ar;
            //}
            //return atlag / adatok.Count;

            //2. megoldás
            List<double> arLista = new List<double>();
            for (int i = 0; i < adatok.Count; i++)
            {
                arLista.Add(adatok[i].Ar);
            }
            return arLista.Average();
        }

        static int Ajanlo(List<Monitor> adatok)
        {
            List<double> arakTavolsag = new List<double>();
            double atlag = NettoAtlag(adatok);
            for (int i = 0; i < adatok.Count; i++)
            {
                arakTavolsag.Add(adatok[i].Ar - atlag);
            }

            double min = double.MaxValue;
            int monitorIndex = 0;
            for (int i = 0; i < arakTavolsag.Count; i++)
            {
                if (arakTavolsag[i] > 0)
                {
                    if (arakTavolsag[i] < min)
                    {
                        min = arakTavolsag[i];
                        monitorIndex = i;
                    }
                }
            }
            return monitorIndex;
        }

        static string AbcSorrend1(List<Monitor> adatok)
        {
            List<string> gyartok = new List<string>();

            foreach (var item in adatok)
            {
                if (!gyartok.Contains(item.Gyarto))
                {
                    gyartok.Add(item.Gyarto);
                }
            }
            gyartok.Sort();
            return string.Join("\n", gyartok);
        }

        static void AbcSorrend2(List<Monitor> adatok)
        {
            List<string> gyartok = new List<string>();
            for (int i = 0; i < adatok.Count; i++)
            {
                if (!gyartok.Contains(adatok[i].Gyarto))
                {
                    gyartok.Add(adatok[i].Gyarto);
                }
            }
            gyartok.Sort();
            foreach (var item in gyartok)
            {
                Console.WriteLine(item);
            }
        }

        static double Raktar(List<Monitor> adatok)
        {
            double osszeg = 0;
            for (int i = 0; i < adatok.Count; i++)
            {
                osszeg += adatok[i].BruttoAr * adatok[i].Darab;
            }
            return osszeg;
        }

        static void AtlagAlattiFolotti(List<Monitor> adatok)
        {
            double atlagErteke = NettoAtlag(adatok);
            for (int i = 0; i < adatok.Count; i++)
            {
                Console.Write($"{adatok[i].Tipus} monitor ára az ");
                if (adatok[i].Ar < atlagErteke)
                {
                    Console.WriteLine("átlag alatt van.");
                }
                else
                    if (adatok[i].Ar > atlagErteke)
                {
                    Console.WriteLine("átlag fölött van.");
                }
                else
                {
                    Console.WriteLine("átlaggal egyenlő.");
                }
            }
        }

        static int Legolcsobb(List<Monitor> adatok)
        {
            List<double> arak = new List<double>();
            foreach (var item in adatok)
            {
                arak.Add(item.Ar);
            }
            return arak.IndexOf(arak.Min());
        }

        static void Legdragabb(List<Monitor> adatok)
        {
            List<double> arLista = new List<double>();
            for (int i = 0; i < adatok.Count; i++)
            {
                arLista.Add(adatok[i].BruttoAr);
            }
            double legdragabb = arLista.Max();
            double brutto = 0;
            foreach (var item in adatok)
            {
                brutto = item.BruttoAr;
                if (brutto == legdragabb)
                {
                    Console.WriteLine($"{item.Gyarto} {item.Tipus} gép csökkentett bruttó ára {brutto - brutto * 0.1:0} Ft");
                    //itt nem változott meg az eredeti érték, és mindegyik monitorra vonatkozóan kiírjuk
                }
            }
        }

        static void Elfogyott(List<Monitor> adatok)
        {
            bool log = false;
            for (int i = 0; i < adatok.Count; i++)
            {
                if (adatok[i].Darab == 0)
                {
                    Console.WriteLine($"{adatok[i].Gyarto} {adatok[i].Tipus} monitor teljesen elfogyott.");
                    log = true;
                }
            }
            if (!log)
            {
                Console.WriteLine("Minden monitorból van még készleten minimum 1 db.");
            }
        }

        static void Vasarlas(List<Monitor> adatok)
        {
            Random rnd = new Random();
            int randomInt;
            int randomSzam1 = rnd.Next(5, 16); //Teszteld 100 vásárlóval, akkor biztos lesz, amelyik elfogy.
            int randomSzam2 = rnd.Next(1, 3);
            for (int i = 0; i < randomSzam1; i++)
            {
                for (int j = 0; j < randomSzam2; j++)
                {
                    randomInt = rnd.Next(0, adatok.Count);

                    if (adatok[randomInt].Darab > 0)
                    {
                        adatok[randomInt].Darab--;
                        Console.WriteLine($"{adatok[randomInt].Gyarto} {adatok[randomInt].Tipus} monitorból {adatok[randomInt].Darab} db maradt készleten.");
                    }
                    else
                    {
                        int index = Ajanlo(adatok);
                        Console.WriteLine($"A keresett monitor elfogyott. Ajánlott monitor: {adatok[index].Gyarto} {adatok[index].Tipus}");
                    }
                }
            }
        }

        static double SamsungAkcio(List<Monitor> monitorok)
        {
            List<double> hetvenPluszArak = new List<double>();
            for (int i = 0; i < monitorok.Count; i++)
            {
                if (monitorok[i].Ar >= 70000 && monitorok[i].Gyarto == "Samsung")
                {
                    hetvenPluszArak.Add((monitorok[i].BruttoAr - (monitorok[i].BruttoAr * 0.05)) * monitorok[i].Darab);
                }
            }
            return hetvenPluszArak.Sum();
        }

        static void MonitorKereso(List<Monitor> monitorok)
        {
            List<double> arak = new List<double>();
            List<string> adatok = new List<string>();
            double atlagErtek = NettoAtlag(monitorok);
            string kerMonitor = "HP EliteDisplay E242";

            for (int i = 0; i < monitorok.Count; i++)
            {
                adatok.Add(monitorok[i].Gyarto + " " + monitorok[i].Tipus);
            }
            if (adatok.Contains(kerMonitor))
            {
                Console.WriteLine($"{kerMonitor} monitorból {monitorok[adatok.IndexOf(kerMonitor)].Darab} darab van készleten.");
            }
            else
            {
                int index = Ajanlo(monitorok);
                Console.WriteLine($"{monitorok[index].Gyarto} {monitorok[index].Tipus} monitort ajánlom, ennek ára: {monitorok[index].Ar} Ft");
            }
        }

        static void FajlbaIras(List<Monitor> monitorok)
        {
            //ez nem eléggé tiszta kód:
            //StreamWriter sw = new StreamWriter("out.txt");
            //string ki = String.Empty;
            //for (int i = 0; i < monitorok.Count; i++)
            //{
            //    if (monitorok[i].ar > 50000)
            //    {
            //        ki = monitorok[i].kiir();
            //        Console.WriteLine(ki);
            //        sw.WriteLine(ki);
            //        Console.WriteLine();
            //    }
            //}
            //sw.Close();

            using (StreamWriter sw = new StreamWriter("out.txt"))
            {
                string ki = String.Empty;
                for (int i = 0; i < monitorok.Count; i++)
                {
                    if (monitorok[i].Ar > 50000)
                    {
                        ki = monitorok[i].Kiir();
                        Console.WriteLine(ki);
                        sw.WriteLine(ki);
                        Console.WriteLine();
                    }
                }
            }
        }

        static void FajlbaIras2(List<Monitor> m)
        {
            List<string> toFile = new List<string>();
            string kiIr = String.Empty;
            for (int i = 0; i < m.Count; i++)
            {
                if (m[i].Ar > 50000)
                {
                    kiIr = m[i].Kiir();
                    toFile.Add(kiIr);
                    Console.WriteLine(kiIr);
                    Console.WriteLine();
                }
            }
            File.WriteAllLines("out1.txt", toFile);
        }
    }
}