Formula–1 bajnokság - HIVATALOS VIZSGA MEGOLDÁS
Eredeti Feladatleírás (PDF)
Itt olvashatod az eredeti vizsgafeladat leírását. Ha nem jelenik meg, kattints ide a letöltéshez.
⚠️ VIZSGA KÖVETELMÉNYEK (FRISSÍTVE):
- NEM KELL: WinForms felület és Bajnokság ToString.
- MÓDOSÍTVA: == operátor helyett Equals + GetHashCode.
- MÓDOSÍTVA: TypeError helyett Saját kivétel (F1Exception) mindenhol.
1. F1Exception osztály
/* * A F1Exception osztály: * - Hozz létre egy F1Exception nevű kivételosztályt, amely az Exception-ből öröklődik! * - Készíts egy egyparaméteres konstruktort, amely egy hibaüzenetet vár! * - Hívd meg az ősosztály konstruktorát a hibaüzenettel! */ public class F1Exception : Exception { public F1Exception() { } public F1Exception(string message) : base(message) { } }
2. Versenyzo osztály
/* * A Versenyzo osztály: * 1. nev, orszag és pontszam adattagok. * 2. Konstruktor (nev, orszag, pontszam sorrendben). * 3. pontszam alapértelmezett értéke 0. * 7. Setter csak 0 és 500 között, egyébként F1Exception: „Érvénytelen pontszám!”. * 8. ToString felülírás: {nev} ({orszag}) – {pontszam} pont. * 9. (MÓDOSÍTVA): == helyett Equals és GetHashCode felülírása. */ public class Versenyzo { private string nev; private string orszag; private int pontszam; public Versenyzo(string nev, string orszag, int pontszam = 0) { this.Nev = nev; this.Orszag = orszag; this.Pontszam = pontszam; } public string Nev { get => nev; set => nev = value; } public string Orszag { get => orszag; set => orszag = value; } public int Pontszam { get => pontszam; set { if (value < 0 || value > 500) throw new F1Exception("Érvénytelen pontszám!"); pontszam = value; } } public override string ToString() { return $"{nev} ({orszag}) - {pontszam} pont"; } public override bool Equals(object obj) { if (obj is Versenyzo masik) { return this.nev.ToLower() == masik.nev.ToLower() && this.orszag.ToLower() == masik.orszag.ToLower(); } return false; } public override int GetHashCode() { return HashCode.Combine(nev.ToLower(), orszag.ToLower()); } }
3. Csapat osztály
/* * A Csapat osztály: * 1. neve és versenyzok lista. * 2. Konstruktor (nev paraméter, lista inicializálása). * 3. hozzaad metódus (Versenyzo objektumot ad a listához). * (MÓDOSÍTVA): TypeError helyett saját F1Exception: „Nem versenyző!”. * 4. pontszam_osszesen metódus (csapat összpontszáma). */ public class Csapat { public string Nev { get; set; } private List<Versenyzo> versenyzok; public IReadOnlyList<Versenyzo> Versenyzok => versenyzok.AsReadOnly(); public Csapat(string nev) { this.Nev = nev; this.versenyzok = new List<Versenyzo>(); } public void Hozzaad(object obj) { if (!(obj is Versenyzo v)) throw new F1Exception("Nem versenyző!"); versenyzok.Add(v); } public int PontszamOsszesen() { return versenyzok.Sum(v => v.Pontszam); } public override string ToString() { string vnevek = string.Join(", ", versenyzok.Select(v => v.Nev)); return $"{Nev}: {vnevek}"; } }
4. Bajnoksag osztály
/* * A Bajnoksag osztály: * 1. csapatok lista. * 3. hozzaad_csapat metódus (Csapat objektumot ad a listához). * (MÓDOSÍTVA): Hibás típus esetén F1Exception: „Nem csapat!”. * 4. legjobb_csapat metódus (legnagyobb összpontszámú csapat). * 5. statisztika metódus (országonkénti versenyzőszám, kisbetűs országok). */ public class Bajnoksag { private List<Csapat> csapatok; public Bajnoksag() { csapatok = new List<Csapat>(); } public void HozzaadCsapat(object obj) { if (!(obj is Csapat cs)) throw new F1Exception("Nem csapat!"); csapatok.Add(cs); } public Csapat LegjobbCsapat() { return csapatok .OrderByDescending(cs => cs.PontszamOsszesen()) .FirstOrDefault(); } public Dictionary<string, int> Statisztika() { var stat = new Dictionary<string, int>(); foreach (var cs in csapatok) { foreach (var v in cs.Versenyzok) { string o = v.Orszag.ToLower(); if (stat.ContainsKey(o)) stat[o]++; else stat[o] = 1; } } return stat; } }
💡 Vizsga Tipp: A "mágikus" billentyűkombináció
A Visual Studio-ban és Riderben a CTRL + . (vagy ALT + Enter) a legjobb barátod:
A Visual Studio-ban és Riderben a CTRL + . (vagy ALT + Enter) a legjobb barátod:
- Generálás: Ha beírod az osztály nevét, a gombbal automatikusan legenerálhatod a konstruktorokat.
- Using-ok: Ha pirossal aláhúz egy típust (pl. List, Dictionary), ezzel tudod automatikusan importálni a hiányzó
usingsorokat. - Interface/Override: Segít legenerálni a metódusok vázát (pl. ToString felülírásánál).