2021. április 25., vasárnap

2021.04.26.-28 Gyakorlás - Barlangok

A megoldás alapján javítsd a programodat. 

A txt-t megkaptad Teamsben.

 //A program neve legyen: barlangok.

            //A tanult objektum-orientált programszerkezetet használd a megoldásnál.

            //Minden képernyőre író feladat előtt írjuk ki a főprogramban a feladat sorszámát.

            //A forrás fájlt megkapod, annak tartalmát kell feldolgoznod.

            //A fájl most 183 sort tartalmaz, amelyből az elsőt nem kell feldolgoznod.

            //A programod készüljön fel arra, hogy hosszabb, és más tartalmú fájlt is fel tudjon dolgozni.

            //Minden feladat előtt írd ki a képernyőre, melyik feladat megoldása következik.

 

            //Az adatok sorrendben a következők:          

            //nev:        a barlang neve

            //hossz:      a barlang hossza méterben

            //kiterjedes: a barlang kiterjedése méterben

            //melyseg:    a barlang mélysége méterben

            //magassag:   a barlang magassága a bejárathoz képest méterben

            //telepules:  településnév, amelyhez a barlang tartozik

            

            //1.feladat:

            //Olvasd be a fájlt, és tárold a tartalmat egy osztálypéldányokat tartalmazó listában a tanult módon.

 

            //2.feladat:

            // Írd ki a képernyőre a települések nevét, mellé a barlang nevét, és a hosszát. Ehhez virtuális metódust használj a tanult módon: ToString().

 

            //3.feladat:

            // Jelenítsd meg a képernyőn a 100 méternél hosszabb barlangok nevét. Ehhez paraméteres metódust használj.

 

            //4.feladat:

            // Írd ki a képernyőre a leghosszabb barlang nevét.

            //A feladatot lehetőleg paraméteres függvénnyel valósítsd meg.

            //Ha nem függvénnyel valósítod meg, kaphatsz részpontokat.        

 

            //5.feladat:

            // Van-e 50 méternél rövidebb barlang?

            //Ha van, írd ki a nevét és a települést a képernyőre.

            //Ha nincs, írj ki hibaüzenetet.

            //Ha a választ meg tudod adni, ne keress tovább.

            //A feladatot lehetőleg függvénnyel valósítsd meg.

            //Ha nem függvénnyel valósítod meg, kaphatsz részpontokat.

            

            //6.feladat:

            //Kérd meg a felhasználót a főprogramban, hogy adja meg egy barlang nevét.

            //Írd ki a képernyőre azoknak a barlangoknak a nevét - soronként egyet -

            //amik ugyanazon a településen vannak, mint amelyik településen a bekért nevű barlang van. 

            //Ha nincs ilyen, írj ki hibaüzenetet.

            //A feladatot paraméteres metódussal oldd meg.

            //Ha nem sikerül így, akkor is kaphatsz részpontokat.

 

            //7. feladat:

            //Írj ki egy új fájlba soronként egy 1-től kezdődő sorszámot,

            //mellé abc-ben a 100 méternél mélyebb barlangok nevét.

 

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Linq;
namespace _20210426
{
    //A program neve legyen: barlangok.
    //A tanult objektum-orientált programszerkezetet használd a megoldásnál.
    //Minden képernyőre író feladat előtt írjuk ki a főprogramban a feladat sorszámát.
    //A forrás fájlt megkapod, annak tartalmát kell feldolgoznod.
    //A fájl most 183 sort tartalmaz, amelyből az elsőt nem kell feldolgoznod.
    //A programod készüljön fel arra, hogy hosszabb, és más tartalmú fájlt is fel tudjon dolgozni.
    //Minden feladat előtt írd ki a képernyőre, melyik feladat megoldása következik.

    //Az adatok sorrendben a következők:           
    //nev:        a barlang neve
    //hossz:      a barlang hossza méterben
    //kiterjedes: a barlang kiterjedése méterben
    //melyseg:    a barlang mélysége méterben
    //magassag:   a barlang magassága a bejárathoz képest méterben
    //telepules:  településnév, amelyhez a barlang tartozik


    class Barlang
    {
        public string nev;
        public double hossz;
        public double kiterjedes;
        public double melyseg;
        public double magassag;
        public string telepules;
        public Barlang(string sor)
        {
            List<stringatmeneti = sor.Split('\t').ToList();
            nev = atmeneti[0];
            hossz = Convert.ToDouble(atmeneti[1]);
            kiterjedes = Convert.ToDouble(atmeneti[2]);
            melyseg = Convert.ToDouble(atmeneti[3]);
            magassag = Convert.ToDouble(atmeneti[4]);
            telepules = atmeneti[5];
        }

        public override string ToString()
        {
            return $"Település neve:{telepules}\nBarlang neve:{nev}\nHossza:{hossz} m";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //1.feladat:
            //Olvasd be a fájlt, és tárold a tartalmat egy osztálypéldányokat tartalmazó listában a tanult módon.

            List<Barlangbarlangok = new List<Barlang>();
            foreach (var i in File.ReadAllLines("barlang.txt").Skip(1))
            {
                barlangok.Add(new Barlang(i));
            }

            //2.feladat:
            // Írd ki a képernyőre a települések nevét, mellé a barlang nevét, és a hosszát.
            //Ehhez virtuális metódust használj a tanult módon: ToString().
            Console.WriteLine("\n2. feladat");
            for (int i = 0; i < barlangok.Counti++)
            {
                Console.WriteLine(barlangok[i].ToString());
            }

            //Másik megoldás:
            //Ez is működik, mivel a virtuális metódus "eredetijét", a ToString()-et
            //automatikusan futtatja a fordító a WriteLine() használatakor
            //(mert megpróbálja értelmezni, hogyan lehetne a paraméterből stringet csinálni)
            //(ezért is volt jó felülírni a ToStringet)
            Console.WriteLine("\n2. feladat-másik megoldás");
            for (int i = 0; i < barlangok.Counti++)
            {
                Console.WriteLine(barlangok[i]);
            }


            //3.feladat:
            // Jelenítsd meg a képernyőn a 100 méternél hosszabb barlangok nevét. 
            //Ehhez paraméteres metódust használj.
            Console.WriteLine("\n3. feladat");
            _100meter(barlangok);

            //4.feladat:
            // Írd ki a képernyőre a leghosszabb barlang nevét. 
            //A feladatot lehetőleg paraméteres függvénnyel valósítsd meg.
            //Ha nem függvénnyel valósítod meg, kaphatsz részpontokat. 
            Console.WriteLine("\n4. feladat");
            Console.WriteLine($"Leghosszabb barlang neve: {leghosszabbBarlang(barlangok)}");


            //5.feladat:
            // Van-e 50 méternél rövidebb barlang?
            //Ha van, írd ki a nevét és a települést a képernyőre.
            //Ha nincs, írj ki hibaüzenetet.
            //Ha a választ meg tudod adni, ne keress tovább.
            //A feladatot lehetőleg függvénnyel valósítsd meg.
            //Ha nem függvénnyel valósítod meg, kaphatsz részpontokat.

            Console.WriteLine("\n5. feladat");
            Console.WriteLine(_50nelRovidebb(barlangok));

            //6.feladat:
            //Kérd meg a felhasználót a főprogramban, hogy adja meg egy barlang nevét.
            //Írd ki a képernyőre azoknak a barlangoknak a nevét - soronként egyet - 
            //amik ugyanazon a településen vannak, mint amelyik településen a bekért nevű barlang van.  
            //Ha nincs ilyen, írj ki hibaüzenetet. 
            //A feladatot paraméteres metódussal oldd meg.
            //Ha nem sikerül így, akkor is kaphatsz részpontokat.

            Console.WriteLine("\n6. feladat");
            Console.Write("Kérem a barlang nevét: ");
            string be = Console.ReadLine();
            barlangkeres(barlangokbe);


            //7. feladat:
            //Írj ki egy új fájlba soronként egy 1-től kezdődő sorszámot, 
            //mellé abc-ben a 100 méternél mélyebb barlangok nevét.

            Console.WriteLine("\n7. feladat");
            fajliras(barlangok);
            Console.WriteLine("Fájlbaírás kész.");

            //Emelt szintű feladat:
            //Írd ki településenként a barlangok nevét.
            //A település neve csak egyszer jelenjen meg.

            Console.WriteLine("\nEmelt feladat");
            Console.WriteLine(felsorolas(barlangok));
            Console.ReadLine();

        }
        #region Metódusok 
        static void _100meter(List<Barlanglista)
        {
            Console.WriteLine("Barlangok neve: ");
            for (int i = 0; i < lista.Counti++)
            {
                if (lista[i].hossz > 100)
                {
                    Console.WriteLine(lista[i].nev);
                }
            }
        }

        static string leghosszabbBarlang(List<Barlanglista)
        {
            List<doublehosszok = new List<double>();
            for (int i = 0; i < lista.Counti++)
            {
                hosszok.Add(lista[i].hossz);
            }
            double max = hosszok.Max(); //megadja a maximális értéket
            int index = hosszok.IndexOf(max); //megadja a maximális érték indexét
            string maxNeve = lista[index].nev//kinyerjük a nagy listából az annyiadik elemből a nev mezőértékét
            return maxNeve;
            //ugyanez egy sorban (emelt szinten kell tudni így):
            //return lista[hosszok.IndexOf(hosszok.Max())].nev; 
        }

        //Ez itt a hab a tortán, ezt nem volt kötelező írni, de mintapéldája annak,
        //hogyan kell metóduson belül új metódust hívni.
        static string kiirNevTelepules(List<Barlanglistaint index)
        {
            return $"A barlang neve: {lista[index].nev}\nA település neve: {lista[index].telepules}";
        }
        static string _50nelRovidebb(List<Barlanglista)
        {
            int i = 0;
            bool van = false;
            while (i < lista.Count && !van)
            {
                if (lista[i].hossz < 50)
                {
                    van = true;
                }
                i++;
            }
            //Mint látjuk, itt két return van, de egymást kizáró szelekciós ágakban
            //tehát csak az egyik tud egyszerre megvalósulni.
            if (lista.Count == i)
            {
                return "50 méternél nincs rövidebb barlang";
            }
            else
            {
                return kiirNevTelepules(lista,i-1);
            }
        }
        static void barlangkeres(List<Barlanglistastring be)
        {
            int i = 0;
            while (i < lista.Count && lista[i].nev != be)
            {
                i++;
            }
            //ha rosszul adta meg, hibás lesz az eredmény, de nem volt feladat ellenőrizni
            bool van = false;
            for (int j = 0; j < lista.Countj++)
            {
                if (lista[i].telepules == lista[j].telepules)
                {
                    if (lista[j].nev != be//azért, hogy ne írja ki ugyanazt a barlangnevet, amit bekértünk
                    {
                        Console.WriteLine(lista[j].nev);
                        van = true;
                    }
                }
            }
            if (!van)
            {
                Console.WriteLine("Nincs másik barlang az adott településen.");
            }
        }
        static void fajliras(List<Barlanglista)
        {
            StreamWriter sw = new StreamWriter("melyebbarlangok.txt");
            List<stringnevekABC = new List<string>();
            for (int i = 0; i < lista.Counti++)
            {
                if (lista[i].melyseg > 100)
                {
                    nevekABC.Add(lista[i].nev);
                }
            }
            nevekABC.Sort();
            for (int i = 0; i < nevekABC.Counti++)
            {
                sw.WriteLine($"{i + 1}. {nevekABC[i]}");
            }
            sw.Close();
        }

        static string felsorolas(List<Barlanglista)
        {
            List<stringtelepulesek = new List<string>();
            for (int i = 0; i < lista.Counti++)
            {
                telepulesek.Add(lista[i].telepules);
            }
            //a lista egyforma elemei közül egyet őrzünk meg a Distinct segítségével
            telepulesek = telepulesek.Distinct().ToList();
            telepulesek.Sort();
            //foreach (var item in telepulesek)
            //{
            //   Console.WriteLine(item);
            //}
            string text = string.Empty;
            for (int i = 0; i < telepulesek.Counti++)
            {
                text += telepulesek[i].ToUpper() + '\n';
                for (int j = 0; j < lista.Countj++)
                {
                    if (telepulesek[i] == lista[j].telepules)
                    {
                        text += '\t'lista[j].nev + '\n' ;
                    }
                }
                text += '\n';
            }
            return text;
        }
        #endregion
    }
}



2021.04.14. Elmélet tz