Vezérlőpult
E6. Gyakorló feladatok · Tömbök, listák, Dictionary

E blokk · Tömbök, listák, Dictionary · 6. tananyag — gyakorló feladatgyűjtemény

Gyakorló feladatok: tömbök, listák, Dictionary

Ú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.

1 tanóra + otthoni gyakorlás15 feladat⭐ – ⭐⭐⭐ szintek

Ezt gyakorlod

1Hogyan dolgozz a feladatokkal?

  1. Először a gyűjteményt válaszd ki. Ismert és fix az elemek száma? Változik menet közben? Név szerint kell keresni? Ha erre megvan a válasz, a program fele kész.
  2. Keresd meg a tételt. A legtöbb feladat egy-két programozási tétel összekapcsolása: összegzés, megszámlálás, maximumkiválasztás, eldöntés.
  3. Gondolj a szélső esetekre: üres gyűjtemény, egyetlen elem, holtverseny a maximumnál, nem létező kulcs.
  4. Bontsd metódusokra — a gyűjteményt paraméterként add át (D blokk).
  5. Feladatonként új projekt, kész feladat után commit (A7).
ℹ️ TÖBB JÓ MEGOLDÁS IS LEHET

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.

2Kidolgozott mintafeladat

MINTA⭐⭐Futóverseny

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.

A gondolatmenet

  1. Milyen gyűjtemény? A versenyzők száma előre ismeretlen, ezért a tömb nem jó. A nevek egyediek, és a névhez tartozik az idő → 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.)
  2. Miért kell tárolni? Az átlagnál gyorsabbak kiírásához előbb az átlagot kell tudni — ehhez minden adatnak meg kell lennie. Két bejárás: először az átlag, aztán a szűrés.
  3. Melyik tételek? Összegzés (átlag), minimumkiválasztás (győztes: a legkisebb idő), és az átlag alattiak kiválogatása.
  4. Metódusok: beolvasás, átlag, győztes — a főprogram csak összefűzi őket.

Egy lehetséges megoldás

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:

⚠️ A TE MEGOLDÁSOD LEHET MÁS

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.

3Alapfeladatok ⭐

Bemelegítés

Egy gyűjtemény, egy-két programozási tétel — de a szélső esetekre már itt is figyelni kell.

E6.1⭐Dobókocka-statisztika

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.

E6.2⭐Hőmérséklet-napló

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.

E6.3⭐Névsor

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.

E6.4⭐Bevásárlás összesítő

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.

4Haladó feladatok ⭐⭐

Itt már választani kell

Melyik gyűjtemény teszi egyszerűvé a megoldást? Gondold végig, mielőtt kódolni kezdesz.

E6.5⭐⭐Lottó-ellenőrző

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.

E6.6⭐⭐Osztályzatok név szerint

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.

E6.7⭐⭐Szóstatisztika

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.)

E6.8⭐⭐Futárjárat

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.

E6.9⭐⭐Leltár-eltérés

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).

E6.10⭐⭐Mozi-foglalás

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.

E6.11⭐⭐Menetrend

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.

5Kihívások ⭐⭐⭐

A blokk legszebb feladatai

Beágyazott ciklusok, több tétel egymásra építve — és egy előzetes a Mastermind-projektből.

E6.12⭐⭐⭐Rendezett beszúrás

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!

E6.13⭐⭐⭐Mastermind-előzetes

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!

E6.14⭐⭐⭐Szavazás két fordulóban

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.

E6.15⭐⭐⭐Dobogó-metódus

Í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.

6Zárás — mielőtt továbblépsz

  1. Minden megoldásnál nézd végig: jó gyűjteményt választottál? Mi történne, ha a másik kettő valamelyikét használnád?
  2. Szélső esetek: üres gyűjtemény, egy elem, holtverseny, nem létező kulcs — mindegyiket próbáld ki.
  3. Minden kész feladat után commit — beszédes üzenettel (pl. E6.13 Mastermind-elozetes kesz).
  4. Ha egy feladat nem ment, az térkép a témazáróhoz: pontosan megmutatja, melyik fejezetet nézd át újra.
  5. Az F blokkban az adatok végre fájlból jönnek és fájlba mennek — a beolvasott sorok egy string-tömbben érkeznek, így minden, amit itt gyakoroltál, azonnal használható lesz.