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: