ABARONIN

OktatásKódpanelekC#

C# megoldási panelek

Huszonegy bemásolható kódváz, amelyekből a vizsgafeladatok többsége összerakható. Minden panelnél ott áll, miről ismerhető fel, hogy épp az kell, mit kell benne kicserélni, és min szoktak elcsúszni.

Asztali és mobilalkalmazás-fejlesztés és tesztelés · 13. évfolyam · 21 panel · frissítve 2026. 09. 22.

Kereshető panelválasztó · ez az oldal egyben tartalmazza mind a(z) 21 panelt, nyomtatható.

Hogyan használd ezeket a paneleket?
  1. Olvasd el a feladatot, és jelöld be, melyik panel kell hozzá. A „Mikor kell ez” sor pont azokat a fordulatokat sorolja, amelyek a vizsgafeladatokban szerepelnek.
  2. Másold be a kódvázat, és csak azután kezdj gondolkodni. Az üres képernyő a legdrágább perc a vizsgán.
  3. Cseréld ki a sárgával jelölt helyeket. A «KAPCSOSBAN» álló részek a te feladatod adataira vonatkoznak – minden más maradhat úgy, ahogy van.
  4. Futtasd le azonnal, még mielőtt továbbmennél. Egy panel beillesztése után a programnak fordulnia és futnia kell.
  5. Fűzd össze a paneleket. Egy tipikus vizsgafeladat 3–5 panelből áll össze: beolvasás → adatszerkezet → tételek → kiírás.

A panelek nem helyettesítik a gondolkodást: azt a részt veszik le a válladról, amit úgyis fejből kellene tudni, hogy a maradék időd a feladat tényleges logikájára menjen. A saját megoldásaidat is érdemes panellé alakítani – a portfóliódban gyűjtsd őket egy panelek mappában.

A · Konzol és adatkezelés

Ezekkel a panelekkel már teljes vizsgafeladat rakható össze. Szinte minden konzolos feladat ebből a nyolcból áll.

A1Biztonságos számbeolvasás

Mikor kell ez?

„Kérje be a felhasználótól…”, „hibás adat esetén kérje be újra”, „a program ne álljon le hibás bevitelre”. Gyakorlatilag minden feladat első lépése.

// Addig kerdez, amig ervenyes szamot nem kap.
static int BekerEgesz(string kerdes, int min, int max)
{
    while (true)
    {
        Console.Write(kerdes);
        string? sor = Console.ReadLine();

        if (int.TryParse(sor, out int ertek) && ertek >= min && ertek <= max)
        {
            return ertek;
        }
        Console.WriteLine($"Ervenytelen! Adj meg egy egeszet {min} es {max} kozott.");
    }
}

// Hasznalat:
int «darab» = BekerEgesz("«Hany elem legyen»: ", «1», «100»);

Illesztési pontok

  • «darab» – a változó neve a feladat szerint
  • «1», «100» – az érvényes tartomány; ha nincs korlát, adj meg int.MinValue és int.MaxValue értéket
  • Tizedes számhoz: int → double, int.TryParse → double.TryParse

Tipikus hibák

  • Parse a TryParse helyett: az első hibás beírásnál kivétellel leáll a program.
  • A tartományellenőrzés kimarad, és a „hány elem” kérdésre -5 is átmegy.
  • A while (true)-ból nincs return – ilyenkor végtelen ciklus lesz belőle.

A2Menüvezérelt főprogram

Mikor kell ez?

„A program menüből legyen vezérelhető”, „a felhasználó válasszon a következő műveletek közül”, „a program a 0 megadásáig fusson”. Ez a feladat teljes váza – a menüpontokba a többi panel kerül.

int valasztas;
do
{
    Console.WriteLine();
    Console.WriteLine("=== «PROGRAM NEVE» ===");
    Console.WriteLine("1 - «Elso muvelet»");
    Console.WriteLine("2 - «Masodik muvelet»");
    Console.WriteLine("0 - Kilepes");

    valasztas = BekerEgesz("Valassz: ", 0, «2»);

    switch (valasztas)
    {
        case 1:
            «ELSO MUVELET KODJA»
            break;
        case 2:
            «MASODIK MUVELET KODJA»
            break;
    }
} while (valasztas != 0);

Console.WriteLine("Viszlat!");

Illesztési pontok

  • Minden menüponthoz egy Console.WriteLine sor és egy case ág kell – a kettőt együtt bővítsd.
  • «2» – a legnagyobb menüpont száma, ezt a BekerEgesz ellenőrzi (A1 panel).
  • Hosszabb műveletet ne ide írj: hívj metódust, a case ágban csak egy sor legyen.

Tipikus hibák

  • Hiányzó break – a C# fordító ezt hibaként jelzi, nem fut le a program.
  • while do-while helyett: a menü meg sem jelenik, mert a feltétel előbb értékelődik ki.
  • A valasztas a cikluson belül van deklarálva, ezért a while feltételében már nem látszik.

A3Formázott táblázatos kiírás

Mikor kell ez?

„Írja ki táblázatos formában”, „az adatok oszlopokba rendezve jelenjenek meg”, „két tizedesjegy pontossággal”. Pontot ér a vizsgán, és pár sor az egész.

Console.WriteLine($"{"«Nev»",-20}{"«Ar»",10}{"«Darab»",8}");
Console.WriteLine(new string('-', 38));

foreach (var elem in «lista»)
{
    Console.WriteLine($"{elem.«Nev»,-20}{elem.«Ar»,10:N0}{elem.«Darab»,8}");
}

Illesztési pontok

  • A vessző utáni szám az oszlopszélesség: negatív = balra, pozitív = jobbra igazít.
  • A kettőspont utáni rész a formátum: N0 ezres tagolás, F2 két tizedes, C pénznem, P1 százalék.
  • A new string('-', 38) hosszát a fenti szélességek összegére állítsd.

Tipikus hibák

  • A szélesség és a formátum sorrendjének felcserélése: helyesen {ertek,10:F2}, nem {ertek:F2,10}.
  • A fejléc és az adatsorok más szélességgel készülnek, ezért elcsúsznak az oszlopok.
  • Kapcsos zárójel a formátumsztringben – ha kell egy darab, kettőzni kell: {{.

A4A hat programozási tétel egy helyen

Mikor kell ez?

„Összesen…”, „hány darab…”, „van-e olyan…”, „melyik az első…”, „a legnagyobb…”, „gyűjtse ki azokat…”. A vizsgafeladatok pontjainak nagy része ebből a hat mintából áll.

// 1. OSSZEGZES
decimal osszeg = 0;
foreach (var e in «lista») osszeg += e.«Ertek»;

// 2. MEGSZAMLALAS
int db = 0;
foreach (var e in «lista») if («e.Darab < 5») db++;

// 3. ELDONTES (van-e ilyen)
bool van = false;
foreach (var e in «lista»)
{
    if («e.Darab == 0») { van = true; break; }
}

// 4. KERESES (melyik az elso ilyen; ha nincs, null marad)
«Termek»? talalt = null;
foreach (var e in «lista»)
{
    if («e.Nev == kulcs») { talalt = e; break; }
}

// 5. MAXIMUMKIVALASZTAS (ures listara elszall - elotte ellenorizz!)
var legnagyobb = «lista»[0];
foreach (var e in «lista»)
{
    if (e.«Ar» > legnagyobb.«Ar») legnagyobb = e;
}

// 6. KIVALOGATAS
var kivalogatott = new List<«Termek»>();
foreach (var e in «lista») if («e.Darab < 5») kivalogatott.Add(e);

Illesztési pontok

  • «lista» és «Termek» – a saját gyűjteményed és elemtípusod neve.
  • A sárga feltételek helyére a feladat szövegéből következő logika kerül.
  • Minimumhoz a maximum panelben > helyett < kell, semmi más.

Tipikus hibák

  • Maximumkiválasztás üres listán: lista[0] kivételt dob. Előtte if (lista.Count == 0).
  • Eldöntésnél kimarad a break – működik, csak feleslegesen végigfut.
  • Keresésnél a talalt használata előtt nincs if (talalt != null) vizsgálat.

A5CSV beolvasása objektumlistába

Mikor kell ez?

„A megadott állomány soronként tartalmazza…”, „az adatok pontosvesszővel elválasztva szerepelnek”, „olvassa be az adatokat”. A vizsgafeladatok többsége így kap adatot.

using System.Globalization;

var «termekek» = new List<«Termek»>();

if (!File.Exists("«adatok.csv»"))
{
    Console.WriteLine("Nem talalhato az allomany!");
    return;
}

foreach (string sor in File.ReadAllLines("«adatok.csv»"))
{
    if (string.IsNullOrWhiteSpace(sor)) continue;

    string[] mezok = sor.Split(';');

    «termekek».Add(new «Termek»(
        mezok[0],
        decimal.Parse(mezok[1], CultureInfo.InvariantCulture),
        int.Parse(mezok[2])));
}

Console.WriteLine($"{«termekek».Count} sor beolvasva.");

Illesztési pontok

  • A mezok[…] indexek a fájl oszlopsorrendjét követik – számold meg a mintaállományban.
  • Ha az első sor fejléc, hagyd ki: File.ReadAllLines(...).Skip(1).
  • Más elválasztóhoz csak a Split(';') karakterét cseréld.

Tipikus hibák

  • Tizedespont és tizedesvessző keveredése. A CultureInfo.InvariantCulture pontot vár; ha a fájlban vessző van, hagyd el a paramétert.
  • Az állomány nem a futtatható program mellett van – tedd a projektbe, és állítsd a Copy to Output Directory beállítást „Copy if newer”-re.
  • Üres utolsó sor miatt IndexOutOfRangeException – ezt előzi meg az IsNullOrWhiteSpace vizsgálat.

A6Lista mentése fájlba

Mikor kell ez?

„Az eredményt írja ki a … állományba”, „mentse el a módosított adatokat”. Külön pontot ér, és két perc megírni.

var sorok = new List<string>();

foreach (var e in «termekek»)
{
    sorok.Add($"{e.«Nev»};{e.«Ar»};{e.«Darab»}");
}

File.WriteAllLines("«eredmeny.csv»", sorok);
Console.WriteLine("Mentes kesz.");

Illesztési pontok

  • A $"…" sor felépítése tükrözze a beolvasás (A5) formátumát, ha ugyanazt a fájlt írod vissza.
  • Szöveges jelentéshez a sorok listába tetszőleges mondatokat is tehetsz.
  • Hozzáfűzéshez felülírás helyett: File.AppendAllLines.

Tipikus hibák

  • File.WriteAllText használata listával – az WriteAllLines kell, különben nem lesznek sortörések.
  • A kimenet a bin\Debug mappába kerül, és a diák a projektmappában keresi.
  • Elfelejtett fejlécsor, ha a feladat kéri.

A7Rendezés és szűrés

Mikor kell ez?

„ábécérendben”, „csökkenő sorrendben az ár szerint”, „csak azokat, amelyek…”, „a három legdrágább”. Két sor, sok pont.

// Rendezes helyben, sajat szempont szerint
«termekek».Sort((a, b) => a.«Nev».CompareTo(b.«Nev»));       // novekvo
«termekek».Sort((a, b) => b.«Ar».CompareTo(a.«Ar»));         // csokkeno

// Ugyanez LINQ-kel, uj listat adva vissza
var draga = «termekek»
    .Where(t => «t.Ar > 10000»)
    .OrderByDescending(t => t.«Ar»)
    .ThenBy(t => t.«Nev»)
    .ToList();

// Osszesitesek egy sorban
decimal osszes = «termekek».Sum(t => t.«Ar» * t.«Darab»);
var legdragabb = «termekek».MaxBy(t => t.«Ar»);
int mennyi = «termekek».Count(t => «t.Darab < 5»);

Illesztési pontok

  • A Sort a meglévő listát rendezi át; a LINQ-lánc új listát ad, az eredetit békén hagyja.
  • Csökkenő rendezéshez a Sort-ban a és b sorrendje cserélődik fel.
  • „Az első három”: a lánc végére .Take(3), még a ToList() elé.

Tipikus hibák

  • A LINQ eredményének elfelejtett eltárolása: a Where önmagában nem változtat semmit.
  • MaxBy üres listán null-t ad – használat előtt ellenőrizd.
  • Ékezetes rendezésnél az alapértelmezett CompareTo a magyar ábécét követi; ha a feladat mást kér, jelezni kell.

A8Dátum beolvasása és formázása

Mikor kell ez?

„a dátum éééé.hh.nn formátumban”, „hány napja…”, „a legutóbbi…”, „az adott hónapban”. Majdnem minden nyilvántartós feladatban felbukkan.

// Beolvasas szovegbol (pl. CSV-mezobol)
if (!DateTime.TryParse(«mezok[3]», out DateTime datum))
{
    Console.WriteLine("Hibas datum: " + «mezok[3]»);
    «continue vagy return»;
}

// Kiiras
Console.WriteLine(datum.ToString("yyyy. MM. dd."));

// Szamitasok
int napok = (DateTime.Today - datum).Days;
bool ideiEv = datum.Year == DateTime.Today.Year;
bool marLejart = datum < DateTime.Today;

Illesztési pontok

  • Formátumok: "yyyy. MM. dd.", "yyyy-MM-dd", "MM.dd." – a feladat szövege szerint.
  • Fix formátumú bemenethez: DateTime.TryParseExact(szoveg, "yyyy.MM.dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out datum).
  • Idő nélküli mai dátum: DateTime.Today; időponttal: DateTime.Now.

Tipikus hibák

  • A hónap kisbetűvel: mm a percet jelenti, a hónap MM.
  • Két dátum különbsége TimeSpan, nem szám – a .Days kell a végére.
  • DateTime.Now használata összehasonlításban, ami az óra-perc miatt váratlan eredményt ad.

B · OOP és osztályhierarchia

A vizsgafeladatok „készítsen osztályt…” típusú részei szinte kivétel nélkül ezekből rakhatók össze.

B1Osztályváz

Mikor kell ez?

„Készítsen osztályt a … tárolására”, „az osztály rendelkezzen a következő adatokkal”. Ez az OOP-feladatok kiindulópontja.

// Termek.cs - kulon fajlba, ne a Program.cs-be!
class «Termek»
{
    public string «Nev» { get; set; }
    public decimal «Ar» { get; set; }
    public int «Darab» { get; set; }

    public «Termek»(string «nev», decimal «ar», int «darab»)
    {
        «Nev» = «nev»;
        «Ar» = «ar»;
        «Darab» = «darab»;
    }

    // Szamitott ertek: property-kent is irhato, de metoduskent egyertelmubb
    public decimal «Ertek»() => «Ar» * «Darab»;

    public override string ToString() => $"{«Nev»} - {«Ar»:N0} Ft ({«Darab»} db)";
}

Illesztési pontok

  • Property-nevek nagy kezdőbetűvel, a konstruktor paraméterei kicsivel – ez a C# konvenció.
  • Ha egy adat nem változhat a létrehozás után: { get; } és csak a konstruktorból kap értéket.
  • A ToString() formátuma legyen az, amit a feladat kiíratni kér – akkor a kiírás egy sor lesz.

Tipikus hibák

  • Az osztály a Program.cs tetején van, top-level statements mellett – fordítási hiba, a típus csak az utasítások után vagy külön fájlban állhat.
  • Elmarad a konstruktor, és az objektumok félig kitöltve jönnek létre.
  • override nélküli ToString() – a kiírás az osztály nevét adja.

B2Öröklődés

Mikor kell ez?

„…mindkét típusnak van neve és ára, de a … ezen felül…”, „közös ősosztályból származzanak”. Ha a feladat két hasonló, de nem azonos dolgot ír le.

class «Jarmu»
{
    public string «Rendszam» { get; set; }
    public int «Evjarat» { get; set; }

    public «Jarmu»(string rendszam, int evjarat)
    {
        «Rendszam» = rendszam;
        «Evjarat» = evjarat;
    }

    public virtual string Leiras() => $"{«Rendszam»} ({«Evjarat»})";
}

class «Teherauto» : «Jarmu»
{
    public double «Teherbiras» { get; set; }

    public «Teherauto»(string rendszam, int evjarat, double teherbiras)
        : base(rendszam, evjarat)
    {
        «Teherbiras» = teherbiras;
    }

    public override string Leiras() => base.Leiras() + $", {«Teherbiras»} t";
}

Illesztési pontok

  • A közös adatok az ősosztályba, a csak rá jellemzők a származtatottba kerülnek.
  • A : base(...) hívás adja tovább az ős konstruktorának a paramétereket.
  • Csak azt a metódust tedd virtual-lá, amit tényleg felül akarsz definiálni.

Tipikus hibák

  • Hiányzó : base(...), ezért az ős paraméter nélküli konstruktorát keresi a fordító – és nincs ilyen.
  • Az ős adatai private-ok, így a leszármazott nem éri el őket. Használj protected-et vagy property-t.
  • new az override helyett: a metódus elrejtődik, és ősosztály-típusú változón át az ős változata fut le.

B3Absztrakt osztály és polimorf hívás

Mikor kell ez?

„…önmagában nem létezik, csak a konkrét típusai”, „minden típus másképp számolja a …-t”, „egyetlen listában tárolja mindegyiket”.

abstract class «Alkalmazott»
{
    public string Nev { get; set; }

    protected «Alkalmazott»(string nev) { Nev = nev; }

    // Nincs torzse: minden leszarmazott sajat modon szamolja
    public abstract decimal «Fizetes»();
}

class «Orabéres» : «Alkalmazott»
{
    public int Orak { get; set; }
    public decimal OraDij { get; set; }

    public «Orabéres»(string nev, int orak, decimal oraDij) : base(nev)
    {
        Orak = orak; OraDij = oraDij;
    }

    public override decimal «Fizetes»() => Orak * OraDij;
}

// Hasznalat: egy lista, kulonbozo tipusok, mindegyik a sajat kepletevel
var dolgozok = new List<«Alkalmazott»> { «...» };
foreach (var d in dolgozok)
{
    Console.WriteLine($"{d.Nev}: {d.«Fizetes»():N0} Ft");
}

Illesztési pontok

  • Az abstract metódus a „mit”, a leszármazottak override-jai a „hogyan”.
  • Ha az ősnek van értelmes alapértelmezett viselkedése, abstract helyett virtual kell.
  • A közös lista típusa mindig az ősosztály.

Tipikus hibák

  • new Alkalmazott(...) – absztrakt osztály nem példányosítható.
  • Valamelyik leszármazottban kimarad az override, és az osztály nem fordul le.
  • A listát a leszármazott típusával deklarálják, ezért csak az egyik fajta fér bele.

B4IComparable megvalósítása

Mikor kell ez?

„az objektumok legyenek rendezhetők”, „alapértelmezés szerint … szerint rendezve”. Ettől működik a lista.Sort() paraméter nélkül.

class «Termek» : IComparable<«Termek»>
{
    public string Nev { get; set; }
    public decimal Ar { get; set; }

    public «Termek»(string nev, decimal ar) { Nev = nev; Ar = ar; }

    // Negativ: elorebb; 0: egyforma; pozitiv: hatrebb
    public int CompareTo(«Termek»? masik)
    {
        if (masik is null) return 1;
        return «Ar».CompareTo(masik.«Ar»);
    }
}

// Ezutan eleg ennyi:
termekek.Sort();

Illesztési pontok

  • A CompareTo testében az a mező szerepeljen, amit a feladat alapértelmezett rendezésnek kér.
  • Csökkenő alaprendezéshez fordítsd meg: masik.Ar.CompareTo(Ar).
  • Két szempont: int elso = Ar.CompareTo(masik.Ar); return elso != 0 ? elso : Nev.CompareTo(masik.Nev);

Tipikus hibák

  • Generikus IComparable<T> helyett a régi, nem generikus IComparable – akkor object a paraméter, és castolni kell.
  • Saját kivonás CompareTo helyett: decimal-nál nem is fordul le, int-nél túlcsordulhat.
  • A null eset kihagyása – fordítási figyelmeztetést ad.

B5Saját kivételosztály és kivételkezelés

Mikor kell ez?

„hibás adat esetén dobjon kivételt”, „a program kezelje le a hibát, és folytassa a működését”, „saját kivételtípust használjon”.

// HibasAdatException.cs
class «HibasAdatException» : Exception
{
    public «HibasAdatException»(string uzenet) : base(uzenet) { }
}

// Dobas ott, ahol a hiba kiderul
public void «AratBeallit»(decimal ar)
{
    if (ar < 0)
    {
        throw new «HibasAdatException»($"Az ar nem lehet negativ: {ar}");
    }
    Ar = ar;
}

// Kezeles ott, ahol tudsz vele kezdeni valamit
try
{
    «termek».«AratBeallit»(«ertek»);
}
catch («HibasAdatException» ex)
{
    Console.WriteLine("Hiba: " + ex.Message);
}
finally
{
    Console.WriteLine("A feldolgozas befejezodott.");
}

Illesztési pontok

  • A kivétel neve mindig Exception-re végződjön.
  • A finally ág elhagyható, ha nincs mit lezárni.
  • Beépített típusok is jók: ArgumentException, ArgumentOutOfRangeException, FormatException.

Tipikus hibák

  • Üres catch blokk: a hiba eltűnik, és órákig keresed.
  • catch (Exception) mindenre – elnyeli azokat a hibákat is, amelyekre nem számítottál.
  • Kivétel dobása ott, ahol egy egyszerű if is elég lenne (pl. felhasználói bevitel ellenőrzése – oda az A1 panel való).

B6Statikus segédosztály

Mikor kell ez?

ha ugyanaz az ellenőrzés vagy átalakítás több helyen kell, és nem tartozik egyetlen objektumhoz sem. Ez az a panel, amitől a kódod „tisztának” néz ki a pontozásnál.

// Ellenorzesek.cs - nincs peldanyositva, csak hivod
static class «Ellenorzesek»
{
    public static bool «ErvenyesRendszam»(string szoveg)
    {
        return !string.IsNullOrWhiteSpace(szoveg) && szoveg.Length == «7»;
    }

    public static decimal «Kerekit»(decimal ertek, int tizedes = 2)
    {
        return Math.Round(ertek, tizedes, MidpointRounding.AwayFromZero);
    }
}

// Hasznalat - peldanyositas nelkul, osztalynevvel:
if («Ellenorzesek».«ErvenyesRendszam»(«bemenet»)) { «...» }

Illesztési pontok

  • Minden metódus static, és az osztály is – így nem lehet véletlenül példányosítani.
  • Az alapértelmezett paraméter (int tizedes = 2) elhagyható a híváskor.
  • Ide tedd a több helyen használt konstansokat is: public const decimal AFA = 0.27m;

Tipikus hibák

  • Statikus osztály példányosítása – fordítási hiba.
  • Statikus metódusból példányszintű mező elérése; statikus tag csak statikusat lát.
  • Minden a segédosztályba kerül, és „mindenes” gyűjtőhely lesz belőle – a tiszta kód témakörben ez kódszagnak számít.

B7Objektumlista-kezelő osztály

Mikor kell ez?

„a program tárolja a …-eket, és tegye lehetővé az új felvételét, törlését, keresését”. Ez fogja össze a többi panelt – a menü (A2) ennek a metódusait hívja.

// TermekTar.cs
class «TermekTar»
{
    private readonly List<«Termek»> elemek = new List<«Termek»>();

    public int Darabszam => elemek.Count;

    public void Hozzaad(«Termek» elem) => elemek.Add(elem);

    public «Termek»? Keres(string «nev»)
    {
        foreach (var e in elemek)
        {
            if (e.«Nev» == «nev») return e;
        }
        return null;
    }

    public bool Torol(string «nev»)
    {
        var talalt = Keres(«nev»);
        if (talalt is null) return false;
        elemek.Remove(talalt);
        return true;
    }

    public IReadOnlyList<«Termek»> Mind() => elemek;
}

Illesztési pontok

  • A belső lista private: kívülről csak a metódusokon át lehet módosítani.
  • A Mind() IReadOnlyList-et ad vissza, hogy kívülről ne lehessen beleírni.
  • Ide kerülnek a tételek (A4) is: OsszErtek(), Legdragabb(), Utanrendelendok().

Tipikus hibák

  • A lista public, így a menüből közvetlenül módosítják – ilyenkor az osztálynak nincs értelme.
  • Törlés foreach közben: futásidejű kivétel. Előbb keresd meg, aztán töröld (mint fent).
  • Keres visszatérési értékét null-vizsgálat nélkül használják.

B8Típusfüggő kiegészítés polimorf bejárásban

Mikor kell ez?

„mindegyik elemről írja ki a közös adatokat, a …-ról ezen felül a …-t is”, „ha az elem …, akkor jelenítse meg a …-t”. Akkor kell, ha a közös bejárásban egyetlen típusra van plusz teendő – és nem éri meg emiatt új metódust tenni az ősbe.

// A kozos resz polimorf: mindenki a sajat Leiras()-at futtatja
foreach («Alakzat» elem in «alakzatok»)
{
    Console.WriteLine(elem.«Leiras»());

    // Csak EGY tipusra van plusz teendo: is + minta
    if (elem is «Kor» k)
    {
        Console.WriteLine($"   atmero: {2 * k.«Sugar»}");
    }
}

// Ugyanez regebbi alakban (as + null-vizsgalat):
«Kor»? k2 = elem as «Kor»;
if (k2 != null) { «...» }

// Klasszikus kasztolas - InvalidCastException, ha nem stimmel a tipus
«Kor» k3 = («Kor»)elem;

Illesztési pontok

  • A ciklusváltozó típusa mindig az ősosztály – a bejárás maga polimorf marad.
  • Az is utáni k egy új változó: csak akkor létezik, ha az egyezés sikerült, és már a konkrét típusú.
  • Több típusra: else if (elem is «Teglalap» t) – de ha háromnál több ág lesz, inkább virtual metódust tegyél az ősbe (B2, B3).
  • Csak típusszűrésre: foreach («Kor» k in «alakzatok».OfType<«Kor»>()).

Tipikus hibák

  • A ciklusváltozón közvetlenül hívják a leszármazott tagját (elem.Sugar) – fordítási hiba, mert a fordító csak a deklarált típust látja.
  • as után elmarad a null-vizsgálat, és NullReferenceException lesz belőle. Ezért jobb az is + minta.
  • Sok is-ág a ciklusban: ez azt jelzi, hogy egy metódus hiányzik az ősből. A típusvizsgálat a polimorfizmus ellentéte.

C · NUnit és mobil

A unit tesztelés és a mobilfejlesztés panelei. Előre itt vannak, hogy a projektmunkában már készen álljanak.

C1Tesztosztály AAA mintával

Mikor kell ez?

„írjon unit teszteket a … metódushoz”, „ellenőrizze a működést automatizált tesztekkel”. Minden NUnit-feladat innen indul.

using NUnit.Framework;

[TestFixture]
public class «TermekTests»
{
    private «Termek» termek;

    [SetUp]                     // minden teszt elott ujra lefut
    public void Init()
    {
        termek = new «Termek»("Eger", 4590m, 3);
    }

    [Test]
    public void «Ertek_HaromDarab_HaromszorosArat_Ad»()
    {
        // Arrange - a kiindulo allapot (itt mar a SetUp elkeszitette)
        decimal varhato = 13770m;

        // Act - a vizsgalt muvelet, pontosan egy hivas
        decimal eredmeny = termek.«Ertek»();

        // Assert - egyetlen allitas
        Assert.That(eredmeny, Is.EqualTo(varhato));
    }
}

Illesztési pontok

  • A teszt neve mondja el, mit vizsgál: Metodus_Helyzet_VartEredmeny.
  • Gyakori állítások: Is.EqualTo, Is.True, Is.Null, Is.GreaterThan, Has.Count.EqualTo(3).
  • Lebegőpontos összehasonlítás: Is.EqualTo(3.14).Within(0.001).

Tipikus hibák

  • A teszt a fő projektben van. Külön NUnit Test Project kell, amely projekthivatkozással látja a tesztelt kódot.
  • Egy tesztben több művelet és több állítás – bukáskor nem derül ki, melyik rossz.
  • Régi kód másolása: NUnit 4-ben az Assert.AreEqual a ClassicAssert osztályba került, a modern forma az Assert.That.

C2Paraméterezett teszt

Mikor kell ez?

„több bemenetre is ellenőrizze”, „vizsgálja a határértékeket”. Egy teszt, sok esettel – ez a leghatékonyabb pontszerzés a tesztelős feladatokban.

[TestCase(2, 3, 5)]
[TestCase(-1, 1, 0)]
[TestCase(0, 0, 0)]
public void «Osszead_KetSzamot_OsszegetAd»(int a, int b, int varhato)
{
    int eredmeny = «Kalkulator».«Osszead»(a, b);

    Assert.That(eredmeny, Is.EqualTo(varhato));
}

// Egyetlen parametert vizsgalo valtozat:
[TestCase("")]
[TestCase("   ")]
[TestCase(null)]
public void «ErvenyesNev_UresBemenetre_Hamis»(string? bemenet)
{
    Assert.That(«Ellenorzesek».«ErvenyesNev»(bemenet), Is.False);
}

Illesztési pontok

  • A TestCase értékeinek száma és sorrendje pontosan a metódus paramétereit követi.
  • Az utolsó paraméter szokás szerint a várt eredmény.
  • Határértékek: a tartomány alja, teteje, és egy-egy azon kívüli érték.

Tipikus hibák

  • A [Test] attribútum bent marad a [TestCase]-ek mellett – paraméteres metódusnál ez hibát okoz.
  • A TestCase csak konstanst fogadhat; számított értékhez TestCaseSource kell.
  • Csak a „szép” eseteket tesztelik – a pont a határértékekért és a hibás bemenetekért jár.

C3Kivétel tesztelése

Mikor kell ez?

„ellenőrizze, hogy hibás adatra kivételt dob”. A B5 panel párja: ott dobjuk, itt bizonyítjuk.

[Test]
public void «AratBeallit_NegativErtekre_Kivetelt_Dob»()
{
    var termek = new «Termek»("Eger", 4590m, 3);

    var ex = Assert.Throws<«HibasAdatException»>(
        () => termek.«AratBeallit»(-100m));

    Assert.That(ex!.Message, Does.Contain("negativ"));
}

[Test]
public void «AratBeallit_PozitivErtekre_Nem_Dob»()
{
    var termek = new «Termek»("Eger", 4590m, 3);

    Assert.DoesNotThrow(() => termek.«AratBeallit»(5000m));
}

Illesztési pontok

  • A lambda (() => …) belsejébe kerül a hívás, amitől a kivételt várod.
  • A dobott kivétel típusa a <…> közé kerül.
  • Az üzenet vizsgálata elhagyható, de erősebb tesztet ad.

Tipikus hibák

  • A metódus lambda nélkül, közvetlenül hívódik – akkor a teszt maga száll el, nem a keretrendszer fogja el a kivételt.
  • Túl általános típus (Exception): a teszt akkor is zöld, ha egészen más hiba történt.
  • Elmarad a „nem dob” eset, pedig az is jár pontot.

C4PWA minimum

Mikor kell ez?

„az alkalmazás legyen telepíthető mobil eszközre”, „offline is működjön”. Két fájl és három sor – ennyitől lesz egy weboldalból telepíthető alkalmazás.

// manifest.json
{
  "name": "«Alkalmazas teljes neve»",
  "short_name": "«Rovid nev»",
  "start_url": "/",
  "display": "standalone",
  "background_color": "«#ffffff»",
  "theme_color": "«#6d3fc4»",
  "icons": [
    { "src": "icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "icon-512.png", "sizes": "512x512", "type": "image/png" }
  ]
}

// index.html - a head-be
<link rel="manifest" href="/manifest.json">
<script>
  if ("serviceWorker" in navigator) {
    navigator.serviceWorker.register("/sw.js");
  }
</script>

// sw.js - a legegyszerubb offline cache
const CACHE = "«app-v1»";
const FILES = ["/", "/index.html", "/style.css", "/app.js"];

self.addEventListener("install", e => {
  e.waitUntil(caches.open(CACHE).then(c => c.addAll(FILES)));
});

self.addEventListener("fetch", e => {
  e.respondWith(caches.match(e.request).then(v => v || fetch(e.request)));
});

Illesztési pontok

  • A FILES tömbben minden olyan fájl legyen, ami offline is kell.
  • A CACHE nevét változtasd meg (app-v2), amikor frissítesz – különben a régi verzió marad.
  • A két ikonméret kötelező a telepíthetőséghez.

Tipikus hibák

  • A service worker file:// protokollon nem működik – helyi szerver kell (VS Code Live Server).
  • Elavult cache: a módosítás nem látszik, mert a régi verziót szolgálja ki. Cache-név csere vagy DevTools → Application → Unregister.
  • Rossz útvonal a manifestben vagy a register hívásban – a DevTools Application fülén ellenőrizhető.

C5React Native képernyő

Mikor kell ez?

„készítsen legalább három képernyőt tartalmazó mobilalkalmazást”, „az adatok listában jelenjenek meg”. Egy képernyő váza state-tel, listával és beviteli mezővel.

import { useState } from "react";
import { View, Text, TextInput, Button, FlatList, StyleSheet }
  from "react-native";

export default function «ListaKepernyo»({ navigation }) {
  const [«elemek», set«Elemek»] = useState([]);
  const [szoveg, setSzoveg] = useState("");

  const hozzaad = () => {
    if (szoveg.trim() === "") return;
    set«Elemek»([...«elemek», { id: Date.now().toString(), nev: szoveg }]);
    setSzoveg("");
  };

  return (
    <View style={styles.lap}>
      <Text style={styles.cim}>«Bevasarlolista»</Text>

      <TextInput
        style={styles.mezo}
        value={szoveg}
        onChangeText={setSzoveg}
        placeholder="«Uj elem»"
      />
      <Button title="Hozzaadas" onPress={hozzaad} />

      <FlatList
        data={«elemek»}
        keyExtractor={item => item.id}
        renderItem={({ item }) => <Text style={styles.sor}>{item.nev}</Text>}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  lap:  { flex: 1, padding: 16 },
  cim:  { fontSize: 22, fontWeight: "bold", marginBottom: 12 },
  mezo: { borderWidth: 1, borderColor: "#ccc", padding: 8, marginBottom: 8 },
  sor:  { paddingVertical: 8, borderBottomWidth: 1, borderColor: "#eee" },
});

Illesztési pontok

  • Új képernyő = a fájl másolata más néven, más tartalommal; a navigációba is fel kell venni.
  • Átlépés másik képernyőre: navigation.navigate("Reszletek", { item }).
  • A keyExtractor minden elemhez egyedi azonosítót ad – enélkül figyelmeztetést kapsz.

Tipikus hibák

  • A state közvetlen módosítása (elemek.push(...)) – a képernyő nem frissül. Mindig új tömböt adj át.
  • <div> és <p> használata: React Native-ben View és Text van, HTML-elemek nincsenek.
  • Minden szöveg Text komponensben kell legyen, különben futásidejű hibát kapsz.
Asztali és mobil alkalmazásfejlesztés és tesztelés · Váci SzC Petzelt József Technikum és Szakképző Iskola. A kódvázak .NET 10 és NUnit 4 alapján készültek. A panelkészlet a tanév során bővül – az új panelek ugyanezekkel az azonosítókkal kerülnek be. Legutóbbi bővítés: B8 (2026. 09. 22.).

Utolsó frissítés: 2026. 09. 22.

Vissza a kódpanelekhez · Oktatás