public abstract class Osoba
public string Jmeno { get; private set; }
public string Prijmeni { get; private set; }
public Osoba(string jmeno, string prijmeni)
public virtual void PrihlasDoInformacnihoSystemu()
Console.WriteLine($"Prihlasen {this} s pravy osoby do IS");
Console.WriteLine("Ahoj");
public class Ucitel : Osoba
public Ucitel(string jmeno, string prijmeni) : base(jmeno, prijmeni)
public override void PrihlasDoInformacnihoSystemu()
Console.WriteLine($"Prihlasen {this} s pravy ucitele do IS");
public override string ToString()
return String.Format("{0}, {1}", Prijmeni, Jmeno);
public class Reditel : Ucitel
public Reditel(string jmeno, string prijmeni) : base(jmeno, prijmeni)
public void PodepisVysvedceni()
Console.WriteLine($"Reditel {this} podepisuje vysvedceni");
public class Student : Osoba
public List<Predmet> ZapsaneAbsolvovanePredmety;
public Student(string jmeno, string prijmeni) : base(jmeno, prijmeni)
ZapsaneAbsolvovanePredmety = new List<Predmet>();
public override void PrihlasDoInformacnihoSystemu()
Console.WriteLine($"Prihlasen {this} s pravy studebta do IS");
public override string ToString()
return String.Format("{0}, {1}", Prijmeni, Jmeno);
public string Kod { get; private set; }
public string Jmeno { get; private set; }
public List<string> PrerekvizityKod { get; private set; }
public Predmet(string kod, string jmeno)
Kod = kod; Jmeno = jmeno; PrerekvizityKod = new List<string>();
public Predmet(string kod, string jmeno, List<string> prerekvizity)
Kod = kod; Jmeno = jmeno; PrerekvizityKod = prerekvizity;
public class Prihlasovani
List<Student> seznamStudentu;
Dictionary<string, Predmet> katalogPredmetu;
List<Osoba> seznamOsob = new List<Osoba>();
Ucitel osobaNovotny = new Ucitel("Frantisek", "Novotny");
Object osoba = osobaNovotny;
Student zlobidlo = new Student("Antonin", "Zlobidlo");
Osoba martin = new Reditel("Martin", "Prochazka");
seznamOsob.Add(osobaNovotny);
seznamOsob.Add(zlobidlo);
foreach(Osoba o in seznamOsob)
o.PrihlasDoInformacnihoSystemu();
if (osobaNovotny is Ucitel)
Ucitel ucitelNovotny = osobaNovotny as Ucitel;
Reditel reditel = martin as Reditel;
reditel.PodepisVysvedceni();
Reditel reditelFrantisek = osobaNovotny as Reditel;
reditelFrantisek.PodepisVysvedceni();
seznamStudentu = new List<Student>();
seznamStudentu.Add(new Student("Jan", "Novak"));
seznamStudentu.Add(new Student("Petra", "Svobodova"));
seznamStudentu.Add(new Student("Jarda", "Kadlec"));
seznamStudentu.Add(new Student("Honza", "Kratochvíla"));
for (int i = 0; i < seznamStudentu.Count; i++)
Console.WriteLine(seznamStudentu[i]);
katalogPredmetu = new Dictionary<string, Predmet>
{"M001", new Predmet("M001", "Uvod do elektronove mikroskopie")},
{"P001", new Predmet("P001", "Programovani C# 1")},
{"P002", new Predmet("P002", "Programovani C# 2", new List<string> {"P001"})}
katalogPredmetu.Add("P020", new Predmet("P020", "Vyvoj mobilnich aplikaci", new List<string> { "X111" }));
katalogPredmetu.Add("P030", new Predmet("P030", "Vyvoj aplikaci pro elektronove mikroskopy", new List<string> { "M001", "P002" }));
katalogPredmetu.Add("C001", new Predmet("C001", "C# 1"));
katalogPredmetu.Add("C002", new Predmet("C002", "C# 2", new List<string> { "C001" }));
ZkontrolujKatalog(katalogPredmetu);
Student studentNovak = null;
foreach (Student student in seznamStudentu)
if (student.Prijmeni == "Novak")
ZapisPredmet(studentNovak, "P001");
ZapisPredmet(studentNovak, "P002");
ZapisPredmet(studentNovak, "P030");
ZapisPredmet(studentNovak, "M001");
ZapisPredmet(studentNovak, "P030");
ZapisPredmet(studentNovak, "X222");
private void ZkontrolujKatalog(Dictionary<string, Predmet> katalog)
foreach (KeyValuePair<string, Predmet> item in katalog)
Predmet predmet = item.Value;
foreach (string kodPrerekvizity in predmet.PrerekvizityKod)
if (!katalog.ContainsKey(kodPrerekvizity))
Console.WriteLine($"Predmet {predmet.Jmeno} obsahuje neexistujici prerekvizitu: {kodPrerekvizity}");
private void ZapisPredmet(Student student, string kodPredmetu)
if (!katalogPredmetu.TryGetValue(kodPredmetu, out Predmet predmet))
Console.WriteLine($"{student.Jmeno}, {student.Prijmeni}: Nebylo mozno zapsat predmet {kodPredmetu} (neexistujici predmet)");
bool splnujePrerekvizity = true;
foreach (string kodPrerekvizity in predmet.PrerekvizityKod)
Predmet nalezenyPredmet = student.ZapsaneAbsolvovanePredmety.Find(p => p.Kod == kodPrerekvizity);
if (nalezenyPredmet == null)
Console.WriteLine($"{student.Jmeno}, {student.Prijmeni}: Nebylo mozno zapsat predmet {predmet.Jmeno} (chybi prerekvizita)");
splnujePrerekvizity = false;
student.ZapsaneAbsolvovanePredmety.Add(predmet);
Console.WriteLine($"Uspesne zapsany predmet {predmet.Jmeno}");
public static void Main()
var prihlasovani = new Prihlasovani();