E blokk · Tömbök, listák, Dictionary · 6. tananyag — gyakorló feladatgyűjtemény
Új anyag ma nincs. Helyette 15 feladat, amelyben a
gyűjtemény kiválasztása is a feladat része: tömb,
lista vagy Dictionary? A feladatszöveg
szándékosan nem árulja el — az adatok természete dönt.
Néhány feladatnál több gyűjtemény is működik (például két párhuzamos
lista vagy egy Dictionary). Ilyenkor nem az
a kérdés, melyik „a helyes”, hanem hogy át tudod-e gondolni, melyik
teszi egyszerűbbé a megoldást.
Egy iskolai futóverseny eredményeit rögzíted. Kérd be egyesével a versenyzők nevét és idejét (egész percben), amíg üres nevet nem kapsz. Ugyanaz a név ne szerepelhessen kétszer. A végén írd ki a győztes nevét és idejét, az átlagidőt egy tizedessel, valamint azok nevét, akik az átlagnál gyorsabbak voltak.
Dictionary<string, int>:
kulcs a név, érték az idő. (Két párhuzamos lista is működne, de az
egyediség ellenőrzése ContainsKey-jel
kényelmesebb.)Dictionary<string, int> eredmenyek = Beolvas(); if (eredmenyek.Count == 0) { Konzol.Hiba("Nem volt versenyző."); } else { string gyoztes = Gyoztes(eredmenyek); double atlag = Atlag(eredmenyek); Konzol.Siker($"A győztes: {gyoztes} ({eredmenyek[gyoztes]} perc)"); Console.WriteLine($"Átlagidő: {atlag:F1} perc"); Console.WriteLine("Az átlagnál gyorsabbak:"); foreach (var par in eredmenyek) { if (par.Value < atlag) { Console.WriteLine($" {par.Key} ({par.Value} perc)"); } } } Dictionary<string, int> Beolvas() { Dictionary<string, int> d = new Dictionary<string, int>(); string nev; do { Console.Write("Név (üres sor: vége): "); nev = Console.ReadLine(); if (nev != "") { if (d.ContainsKey(nev)) { Konzol.Hiba("Ez a név már szerepel."); } else { d[nev] = Konzol.SzamotKer("Idő (perc): ", 1, 600); } } } while (nev != ""); return d; } double Atlag(Dictionary<string, int> d) { int osszeg = 0; foreach (int ido in d.Values) { osszeg += ido; } return (double)osszeg / d.Count; } string Gyoztes(Dictionary<string, int> d) { string legjobb = ""; int legjobbIdo = int.MaxValue; foreach (var par in d) { if (par.Value < legjobbIdo) { legjobb = par.Key; legjobbIdo = par.Value; } } return legjobb; }
Két finomság, amit érdemes észrevenni:
int.MaxValue
kezdőértékkel indul, mert a Dictionary-nek
nincs index szerinti „első eleme” — így a
B2-es
MaxValue is gyakorlati szerepet kap;Két párhuzamos lista, más metódusfelbontás — mind jó, ha átgondolt a gyűjtemény-választás, és a program a szélső esetekben is helyesen működik.
Egy gyűjtemény, egy-két programozási tétel — de a szélső esetekre már itt is figyelni kell.
A program kódjában tárold 20 dobókocka-dobás eredményét. Írd ki, melyik számot hányszor dobták, és melyik volt a leggyakoribb.
Egy hét minden napjához tartozik egy napi középhőmérséklet. Írd ki a legmelegebb és a leghidegebb nap nevét a hőmérsékletével együtt, valamint azt, hány napon volt az átlagnál melegebb.
Kérj be neveket, amíg a felhasználó üres sort nem ad. Ha egy név már szerepel, jelezd sárgával, és ne vedd fel újra. A végén írd ki a neveket sorszámozva, és azt, hány név szerepel.
Négy termék nevét, egységárát és a vásárolt mennyiséget tárold a programban. Írd ki a tételenkénti részösszegeket igazított táblázatban, a végösszeget, és azt, melyik tétel került a legtöbbe.
Melyik gyűjtemény teszi egyszerűvé a megoldást? Gondold végig, mielőtt kódolni kezdesz.
Tárold a heti öt nyerőszámot (1 és 90 között). Kérd be a játékos öt tippjét: tartományon kívüli vagy már megadott számra kérdezz újra. Írd ki, hány találata van, és melyek a talált számok.
Tárold néhány diák nevét és jegyét. Visszatérő menüből lehessen: egy diák jegyét lekérdezni név alapján, egy jegyet módosítani, az osztályátlagot kiírni, és a legjobb jegyet kapott diákok nevét kiírni (holtverseny esetén mindet). Nem létező névre adj hibaüzenetet.
Kérj be egy mondatot, és írd ki, hány szóból áll, melyik a
leghosszabb szava, és hány szava kezdődik magánhangzóval. (A mondatot
a mondat.Split(' ') bontja szavakra a
szóközök mentén.)
Egy futár a nap végén rögzíti a kiszállításai távolságát kilométerben; a 0 jelzi a nap végét. Írd ki az összes megtett távolságot, a leghosszabb utat és azt, hányadik kiszállítás volt, valamint a 10 km-nél rövidebb utak számát.
Egy boltban a nyilvántartás szerinti készlet és a leltárkor ténylegesen megszámolt készlet is termékenként ismert (mindkettőt a programban tárold). Írd ki azokat a termékeket, amelyeknél eltérés van, az eltérés mértékével és irányával (hiány vagy többlet).
A mozi egyik sorában 10 szék van. Visszatérő menüből lehessen széket foglalni és foglalást lemondani sorszám szerint, kirajzolni a sort (■ foglalt, □ szabad), és kiírni a szabad helyek számát. Foglalt szék újrafoglalását és szabad szék lemondását ne engedd.
Egy buszjárat megállóinak nevét tárold útvonal szerinti sorrendben. Kérd be az indulási és az érkezési megálló nevét, és írd ki, hány megálló van a kettő között. Ha valamelyik megálló nem létezik, jelezd.
Beágyazott ciklusok, több tétel egymásra építve — és egy előzetes a Mastermind-projektből.
Kérj be egész számokat 0-ig. Minden szám kerüljön azonnal a helyére
úgy, hogy a tárolt számok mindig növekvő sorrendben legyenek — és
minden beszúrás után írd ki az aktuális sort. Kész rendező metódust
(pl. Sort) nem használhatsz!
A program tárol egy négy színből álló titkos kódot, a színeket betűk jelölik (pl. P, Z, K, S). A játékos beír egy négybetűs tippet. Írd ki, hány betű van a helyén, és hány olyan, amely szerepel a kódban, de máshol. Ügyelj rá, hogy ismétlődő betűknél se számolj kétszer!
Kérj be szavazatokat (jelöltneveket), amíg üres sort nem kapsz. Ha valamelyik jelölt a szavazatok több mint felét megkapta, hirdesd ki győztesnek. Ha nem, írd ki a két legtöbb szavazatot kapott jelöltet, akik második fordulóba jutnak.
Írj metódust, amely egy egész számokat tartalmazó tömböt kap, és visszaadja a három legnagyobb különböző értéket csökkenő sorrendben (ha háromnál kevesebb különböző érték van, akkor annyit). Az eredeti tömböt nem módosíthatod, és kész rendező metódust nem használhatsz.
E6.13 Mastermind-elozetes kesz).