static void IgenyekOlvas(out igeny[] igenyek, out short csapatok) { /* ELSŐ RÉSZFELADAT * ---------------- * Olvassa be az igeny.txt állományban talált adatokat, s azok * felhasználásával oldja meg a következő feladatokat! */ FileStream igeny_txt = IgenyFajlMegnyit(); // A StreamReader objektum olvasni fogja a létrejött fájlkapcsolatot. StreamReader txt = new StreamReader(igeny_txt); // A feladatnak megfelelően beolvassuk a fejléc adatokat: // Első sorában a szintek száma (legfeljebb 100), a második // sorban a csapatok száma (legfeljebb 50), a harmadik sorban // pedig az igények száma (legfeljebb 100) olvasható. short emeletek = System.Convert.ToInt16(txt.ReadLine()); csapatok = System.Convert.ToInt16(txt.ReadLine()); short igenyek_szam = System.Convert.ToInt16(txt.ReadLine()); // Létrehozunk egy, igeny típusú adatsorokat tartalmazó tömböt. igenyek = new igeny[igenyek_szam]; // Majd egyesével végiglépkedve beolvasunk minden további sort a fájl végéig. // (Jelen pillanatban a StreamReader "mutatója" a negyedik sor elején áll.) // A negyedik sortól kezdve soronként egy-egy igény szerepel a jelzés sorrendjében. for (int i = 0; i < igenyek_szam; i++) { // Egy igény hat számból áll: az első három szám az időt adja // meg (óra, perc, másodpercszám sorrendben), a negyedik a csapat // sorszáma, az ötödik az induló-, a hatodik a célszint sorszáma. // Az egyes számokat pontosan egy szóköz választja el egymástól. // Minden egész sort beolvassuk és utána a szóközök mentén felbontva // feltöltjük az igényeket tartalmazó tömböt. string sor = txt.ReadLine(); string[] elemek = sor.Split(' '); igenyek[i].ora = System.Convert.ToInt16(elemek[0]); igenyek[i].perc = System.Convert.ToInt16(elemek[1]); igenyek[i].masodperc = System.Convert.ToInt16(elemek[2]); igenyek[i].csapat = System.Convert.ToInt16(elemek[3]); igenyek[i].honnan = System.Convert.ToInt16(elemek[4]); igenyek[i].hova = System.Convert.ToInt16(elemek[5]); } // Lezárjuk az olvasó kapcsolatot az igeny.txt fájlhoz. txt.Close(); igeny_txt.Close(); }
static void UtolsoEmelet(ref igeny[] igenyek) { /* HARMADIK RÉSZFELADAT * -------------------- * Határozza meg, hogy melyik szinten áll majd a lift az utolsó kérés teljesítését követően! */ // A lift értelemszerűen az utolsó igény érkezési pontján fog állni. // A igenyek.GetUpperBound(0) megadja a legutolsó igény azonosítószámát a tömbben, // majd mi kiolvassuk az igények tömb ezen elemének a "hova" változójából a választ. System.Console.Write("3. feladat: A lift az utolsó igény teljesítése után a(z) "); System.Console.WriteLine(igenyek[igenyek.GetUpperBound(0)].hova + ". emeleten áll meg."); }
static void SzintIntervallum(ref igeny[] igenyek) { /* NEGYEDIK RÉSZFELADAT * -------------------- * Írja a képernyőre, hogy a megfigyelés kezdete és az * utolsó igény teljesítése között melyik volt a legalacsonyabb * és melyik a legmagasabb sorszámú szint, amelyet a lift érintett! */ // Létrehozunk egy üres tömböt, amely kétszer akkora, mint amennyi igény van. int[] emelet_lista = new int[(int)igenyek.Length * 2]; int i = 0; int em_i = 0; while (i < igenyek.Length) { // Amíg vannak igények, minden indulási és érkezési értéket átemelünk ebbe a tömbbe. // A j minden elem után nő egyet (ez az index az igényekhez), // az em_i pedig az emelet_lista tömbben való index, amely j-nként kettőt nő // (hiszen minden igény két emelet értéket ad meg). // A második sorban mindenképpen ++em_i -t használunk, hogy // az em_i előbb nőjjön 1-gyel, minthogy azt kulcsként // használnánk. Tehát ha az em_i 2 volt, akkor a // "honnan" érték a 2. helyre íródik, az em_i 1-gyel nő, és így // a 3. helyre írja a "hova" értéket. // (Vesd össze: em_i++ esetén a kettő lenne az index és csak a sor UTÁN nőne 1-gyel.) emelet_lista[em_i] = igenyek[i].honnan; emelet_lista[++em_i] = igenyek[i].hova; i++; em_i++; } // Végigmegyünk az összes emelet listáján, közben maximum- és minimumkeresést végezve. int maximum = emelet_lista[0]; int minimum = emelet_lista[0]; for (int j = 0; j < emelet_lista.Length; j++) { if (emelet_lista[j] > maximum) { maximum = emelet_lista[j]; } if (emelet_lista[j] < minimum) { minimum = emelet_lista[j]; } } System.Console.Write("4. feladat: A lift a(z) " + System.Convert.ToString(minimum) + ". és a(z) "); System.Console.WriteLine(System.Convert.ToString(maximum) + ". szintek között mozgott."); }
static void Szabalytalan(ref igeny[] igenyek, short csapatok, ref List<int> csapatok_lista, out List<igeny> vizsgalt_csapat_utjai, out int vizsgalt_csapat) { /* HETEDIK RÉSZFELADAT * ------------------- * Előfordul, hogy egyik vagy másik szerelőcsapat áthágja * a szabályokat, és egyik szintről gyalog megy a másikra. * (Ezt onnan tudhatjuk, hogy más emeleten igényli a liftet, * mint ahova korábban érkezett.) Generáljon véletlenszerűen egy * létező csapatsorszámot! (Ha nem jár sikerrel, dolgozzon a 3. csapattal!) * Határozza meg, hogy a vizsgált időszak igényei alapján lehet-e egyértelműen * bizonyítani, hogy ez a csapat vétett a szabályok ellen! Ha igen, akkor adja * meg, hogy melyik két szint közötti utat tették meg gyalog, ellenkező * esetben írja ki a "Nem bizonyítható szabálytalanság" szöveget! */ // Készítünk egy véletlengenerátor objektumot, ez fogja majd elkészíteni a számunkat. Random veletlen_generator = new Random(); vizsgalt_csapat = 0; // A hatodik feladatban elkészült egy lista, amely tartalmazza // azokat a csapatokat, amelyek NEM vették igénybe a liftet (csapatok_lista). // Az alábbi while ciklusban generálunk egy véletlenszerű csapat sorszámot. // Ha ez a generált szám egy olyan csapatra mutat, amelyik nem vette igénybe // a liftet, akkor újra generálunk egy másikat, és így tovább, amíg létező // csapatot azonosító sorszámot kapunk. bool csapat_letezik = false; while (!csapat_letezik) { vizsgalt_csapat = veletlen_generator.Next(1, csapatok); if (!csapatok_lista.Contains(vizsgalt_csapat)) { csapat_letezik = true; } } System.Console.WriteLine("7. feladat: A következő csapatot vizsgáljuk: " + System.Convert.ToString(vizsgalt_csapat) + "."); // Készítünk egy tömböt, amelyet feltöltünk a kiválasztott csapat összes igényével. vizsgalt_csapat_utjai = new List<igeny>(igenyek.Length); for (int i = 0; i < igenyek.Length; i++) { if (igenyek[i].csapat == vizsgalt_csapat) { vizsgalt_csapat_utjai.Add(igenyek[i]); } } // Megvizsgáljuk, hogy volt-e szabálytalanság: // egyesével végiglépkedünk a feltöltött listán. // A feladat szövege szerint akkor történt szabálytalanság, ha: // "[a csapat] más emeleten igényli a liftet, mint ahova korábban érkezett." // Tehát ha bármely igény 'honnan'-ja eltér az előző 'hova'-jától, // akkor szabálytalanok voltak, és ezt regisztráljuk. bool volt_szabalytalansag = false; int szabalytalan_honnan = -1; int szabalytalan_hova = -1; for (int j = 1; j < vizsgalt_csapat_utjai.Count; j++) { if (vizsgalt_csapat_utjai[j].honnan != vizsgalt_csapat_utjai[j - 1].hova) { volt_szabalytalansag = true; szabalytalan_honnan = vizsgalt_csapat_utjai[j - 1].hova; szabalytalan_hova = vizsgalt_csapat_utjai[j].honnan; } } // A vizsgálat eredményét kiírjuk a képernyőre. if (volt_szabalytalansag == true) { System.Console.WriteLine("Történt szabálytalanság."); System.Console.Write("A vizsgált csapat a következő két szint között gyalog közlekedett: "); System.Console.WriteLine(System.Convert.ToString(szabalytalan_honnan) + ". és " + System.Convert.ToString(szabalytalan_hova) + "."); } else { System.Console.WriteLine("Nem történt szabálytalanság."); } }
static void NemUtazott(ref igeny[] igenyek, short csapatok, out List<int> csapatok_lista) { /* HATODIK RÉSZFELADAT * ------------------- * Határozza meg, hogy mely szerelőcsapatok nem vették igénybe * a liftet a vizsgált intervallumban! A szerelőcsapatok sorszámát * egymástól egy-egy szóközzel elválasztva írja a képernyőre! */ // Készítünk egy listát, amely csapatok darabszámú elemet tartalmazhat. csapatok_lista = new List<int>(csapatok); // Ezt a listát feltöltjük az összes, forrásfájl szerint létező // csapat számával (1-től csapatszámig). for (int i = 1; i <= csapatok; i++) { csapatok_lista.Add(i); } // Iterálva (végiglépkedve) az igényeket tartalmazó tömböt, // kitöröljük azokat a csapatokat, amelyekhez találtunk igényt. for (int j = 0; j < igenyek.Length; j++) { csapatok_lista.Remove(igenyek[j].csapat); } // A listát rendezzük, majd a képernyőre írjuk a megoldást. // (A List.ToArray() metódus egy, a lista elemével azonos // típusú tömböt (tehát List<int> esetén int[]-t) készít, // amely már iterálható a foreach{} blokkal.) csapatok_lista.Sort(); System.Console.Write("6. feladat: A következő csapatok nem használták a liftet: "); foreach (int nem_utazott_csapat_id in csapatok_lista.ToArray()) { System.Console.Write(System.Convert.ToString(nem_utazott_csapat_id) + ' '); } System.Console.WriteLine(); }
static void FelfeleIndulasok(ref igeny[] igenyek) { /* ÖTÖDIK RÉSZFELADAT * ------------------ * Határozza meg, hogy hányszor kellett a liftnek felfelé indulnia * utassal és hányszor utas nélkül! Az eredményt jelenítse meg a képernyőn! */ // Ha a lift célállomása az adott igényen belül magasabban van, // mint az induló állomás, akkor az egy út felfelé utassal. // Azonban, ha a jelenlegi célállomás a következő igény // induló állomása alatt van, akkor a liftnek felelé kell mozognia, // tehát az egy felfelé út lesz utas nélkül. int felfele_utas = 0; int felfele_utas_nelkul = 0; for (int l = 0; l < igenyek.Length - 1; l++) { if (igenyek[l].honnan < igenyek[l].hova) { felfele_utas++; } if (igenyek[l].hova < igenyek[l + 1].honnan) { felfele_utas_nelkul++; } } System.Console.Write("5. feladat: A lift ennyiszer indult felfelé: utassal: "); System.Console.Write(System.Convert.ToString(felfele_utas) + ", utas nélkül: "); System.Console.WriteLine(System.Convert.ToString(felfele_utas_nelkul) + "."); }