public void Odober(Osoba kdo, int host) { for (int i = 0; i < zoznam.Count; i++) { if ((zoznam[i].kdo == kdo) && (zoznam[i].host == host)) { Udalost ud = zoznam[i]; zoznam.Remove(ud); } } return; // odoberame vstky vyskyty, to je potrebne, napr. ak odchadza zakaznik, ktoreho jedlo uz kuchari pripravuju, potrebujeme zrusit vsetkych tychto kucharov }
public void OdoberZKalendara(ref Kalendar Kalendar, int cislo, int cas) { for (int i = 0; i < Kalendar.zoznam.Count; i++) { if ((Kalendar.zoznam[i].kdo == Osoba.Kuchar) && (Kalendar.zoznam[i].host == cislo)) { Udalost ud = Kalendar.zoznam[i]; Kalendar.zoznam.Remove(ud); PocetVolKuchar += 1; //odstranili sme z kalendara zamestnanych kucharov, pracujucich na objednavke, pre zakaznika, ktory odchadza ZamestnajKuchara(ref Kalendar, cas); } } return; }
public Udalost Vyber() //Vrati udalost, ktora sa udeje ako prva v zozname udalosti. { Udalost help = null; foreach (Udalost udalost in zoznam) { if ((help == null) || (udalost.kdy < help.kdy)) { help = udalost; } } if (help != null) { zoznam.Remove(help); } return(help); }
public void Vypocet() { KalendarRestaurace.Pridaj(1, Osoba.Host, StavHosta.NovyHost, 0); // pridame do kalendara prichod prveho hosta Udalost udalost = null; while ((udalost = KalendarRestaurace.Vyber()) != null) //cyklus v ktorom vyberame z kalendara udalosti podla casu a spracuvavame ich { cas = udalost.kdy; // Aktualizace casu //Console.Write("CAS: " + cas + " Obs.: " + ObsluzenychLudi + " Odch.: " + LudiaOdisli + " kto " + udalost.kdo + " cislo " + udalost.host + " stav " + udalost.akce); if (udalost.kdo == Osoba.Host) { switch (udalost.akce) { case StavHosta.NovyHost: // Generovanie a vstup noveho hosta do restaurace GenerujNovehoHosta(ref CisloZakaznika); int Pom1 = 1; //rnd.Next(1, 11); if (cas + Pom1 < MaxCas - 30) //30 min pred zaverecnou uz negenerujeme novych hosti, takze uz generovani nedame do kalendara { KalendarRestaurace.Pridaj(cas + Pom1, Osoba.Host, StavHosta.NovyHost, 0); //Do kalendara: generovanie noveho hosta nahodne o 1 az 10 minut } break; case StavHosta.Usadeny: //Ak nastane tato situace, zakaznik cakal pridlho na objednanie jedla //Console.WriteLine(); obsluha.OdstranZakaznika(udalost.host); //Odstranenie daneho hosta zo zoznamu ukolov obsluhy ZakaznikOdchadzaZRestaurace(udalost.host, 0); //Nespokojny zakaznik odchadza, netreba uklidit, zakaznik si ani neobjednal break; case StavHosta.Objednane: //Ak nastane tato situace, zakaznik cakal pridlho na prinesenie jedla //Console.WriteLine(); kuchyna.OdstranZakaznika(udalost.host); //Odstranenie daneho hosta zo zoznamov v kuchyni kuchyna.OdoberZKalendara(ref KalendarRestaurace, udalost.host, cas); //Odobratie rozpracovanych jedal daneho hosta obsluha.OdstranZakaznika(udalost.host); //Odstranenie daneho hosta zo zoznamu ukolov obsluhy obsluha.OdoberZKalendara(ref KalendarRestaurace, udalost.host, ref VRestauraci, ref kuchyna, cas); //Odobratie volanie obsluhy kucharom na prinesenie jedla ZakaznikOdchadzaZRestaurace(udalost.host, 0); //Zakaznik odchhadza, nie je potrebne uklidit, este nejedli break; case StavHosta.DoneseneJedlo: //Sytuacia, kedy zakaznik doje svoje jedlo. V tomto momente sa rozodne, ci odchadza, alebo si objedna dalsi napoj case StavHosta.DonesenyNapoj: //Sytuacia, kedy zakaznik dopije napoj. Zachova sa rovnako, ako po dojedeni jedla //Console.WriteLine(); int Pozice = obsluha.NajdiStolSoZakaznikom(udalost.host, VRestauraci); //Pozice hosta v restauraci int OdchodAleboNapoj = rnd.Next(1, 101); //nahodne cislo od 1 do 100 if ((cas < MaxCas) && (OdchodAleboNapoj <= 20)) { //Cas este nedosiahol maxima, host si moze este objednat napoj. Objedna napoj s pravdepodobnosti 20% VRestauraci[Pozice].Stav = StavHosta.CakaNaObjednanieNapoja; KalendarRestaurace.Pridaj(cas, Osoba.Casnik, StavHosta.CakaNaObjednanieNapoja, udalost.host); //Zavolanie casnika na objednanie napoja KalendarRestaurace.Pridaj(cas + 15, Osoba.Host, StavHosta.CakaNaObjednanieNapoja, udalost.host); //Trpezlivost na cakanie na casnika } else //Cas prekrocil max cas, teda uz neprijimame objednavky, host musi odist alebo si uz host nechce objednat { VRestauraci[Pozice].Stav = StavHosta.Zaplatim; //Host si uz nic neobjednava, chce odist, musi teda este zaplatit, zavola casnika KalendarRestaurace.Pridaj(cas, Osoba.Casnik, StavHosta.Zaplatim, udalost.host); //Zavolanie casnika, chceme zaplatit KalendarRestaurace.Pridaj(cas + 20, Osoba.Host, StavHosta.Zaplatim, udalost.host); //Trpezlivost na cakanie na zaplatenie } break; case StavHosta.CakaNaObjednanieNapoja: //Vyprsala trpezlivost na cakanie na objednanie napoja, host odchadza case StavHosta.Zaplatim: //Vyprsala trpezlivost na cakanie na naplatenie, odchadza obsluha.OdstranZakaznika(udalost.host); //Odstranime zakaznika zo zoznamu ukolov daneho casnika ZakaznikOdchadzaZRestaurace(udalost.host, 1); //Nespokojny zakaznik odchadza, zakaznik uz jedol, takze treba uklidit //Console.WriteLine(); break; case StavHosta.Odchod: ZakaznikOdchadzaZRestaurace(udalost.host, 0); //Zakaznik odchadza, stol uvolnime po uklideni //Console.WriteLine(); break; default: break; } } else if (udalost.kdo == Osoba.Casnik) { //Console.WriteLine(); obsluha.SpracujUlohu(cas, udalost.host, ref KalendarRestaurace, ref VRestauraci, ref kuchyna); if (MaxPocObsl - obsluha.PocetVolObsluha > MaxPotrebObsluha) { MaxPotrebObsluha = MaxPocObsl - obsluha.PocetVolObsluha; } } else //udalost.kdo == Osoba.Kuchar { //tato moznost nastane iba ked kuchar dovari nejake jedlo //Console.WriteLine(); //Najprv zistime ci nie je zmena v max potrebnom pocte kucharov, lebo dalej sa kuchar uvolni if (MaxPocKuch - kuchyna.PocetVolKuchar > MaxPotrebKuchar) { MaxPotrebKuchar = MaxPocKuch - kuchyna.PocetVolKuchar; } kuchyna.SpracujHotoveJedlo(ref KalendarRestaurace, udalost.host, cas); } } return; }