public void pocetak(List <Sestra> sestre, GlobalniRaspored globalniRaspored) { for (int i = 0; i < sestre.Count; i++) { sestre[i].prazniRaspored(); } globalniRaspored.prazniRaspored(); radiLiNekaSestDana = 0; }
public void obeleziSve(List <Sestra> sestre, GlobalniRaspored globalniRaspored) { for (int i = 0; i < sestre.Count; i++) { for (int j = 0; j < 7; j++) { if (sestre[i].raspored[3, j] == 1) { if (globalniRaspored.gl[3, j] == null) { globalniRaspored.gl[3, j] = sestre[i]; } } } } }
public bool krajnjaProvera(List <Sestra> sestre, GlobalniRaspored globalniRaspored) { if (!globalniRaspored.proveraRasporeda()) { return(false); } for (int i = 0; i < sestre.Count; i++) { if (SumaSaOffDayovima(sestre[i].raspored) != 7) { return(false); } } obeleziSve(sestre, globalniRaspored); return(true); }
static void Main(string[] args) { Sestra nurse1 = new Sestra("Jelena", "Vasic"); Sestra nurse2 = new Sestra("Marija", "Majkic"); Sestra nurse3 = new Sestra("Dragana", "Tomcic"); Sestra nurse4 = new Sestra("Snezana", "Subasic"); GlobalniRaspored globalniRaspored = new GlobalniRaspored(); List <Sestra> sestre = new List <Sestra>(); sestre.Add(nurse1); sestre.Add(nurse2); sestre.Add(nurse3); sestre.Add(nurse4); Functions fun = new Functions(); do { fun.pocetak(sestre, globalniRaspored); for (int k = 0; k < 2; k++) { for (int i = 0; i < 7; i++) { //prva petlja je za dane {PON,UT...} for (int j = 0; j < 3; j++) { //druga je za smene {PREPO,POP,UVE,OFF} if (k == 0) { fun.shuffleSestre(sestre); if (globalniRaspored.gl[j, i] == null) { fun.DodajPrvuSlobodnuSestru(sestre, globalniRaspored, j, i); } } else if (k > 0) { if (globalniRaspored.gl[j, i] == null) { fun.TraziSlobodnu(sestre, globalniRaspored, j, i); } } } } } for (int i = 0; i < sestre.Count; i++) { //proveri raspored svake sestre pojedinacno fun.proveriRasporedSestre(sestre[i].raspored); } } while (!fun.krajnjaProvera(sestre, globalniRaspored)); for (int i = 0; i < sestre.Count; i++) { Console.WriteLine(); sestre[i].printaj(); } Console.WriteLine("************************Globalni raspored***********************"); globalniRaspored.printaj(); Console.ReadKey(); }
} //u sustini samo dodeljulje offdayove sestrama koje vec imaju 5 ili 6 dana public void TraziSlobodnu(List <Sestra> sestre, GlobalniRaspored globalniRaspored, int red, int kolona) { for (int i = 0; i < sestre.Count; i++) { int[,] niz = sestre[i].raspored; if (SumaSaOffDayovima(niz) == 7) { continue; } else if (IzracunajSumu(niz) == 6) { radiLiNekaSestDana = 1; offdays(sestre[i].raspored); continue; } else if (IzracunajSumu(niz) <= 5) { if (IzracunajSumu(niz) == 5 && radiLiNekaSestDana != 0) { offdays(sestre[i].raspored); continue; } if (niz[red, kolona] == 0) { if (!proveriSestruTajDan(niz, kolona)) { if (globalniRaspored.gl[red, kolona] == null) { if (red == 0) { int br = proveriSestruPrepodne(niz); if (br == -1) { continue; } } else if (red == 1) { int br = proveriSestruPopodne(niz); if (br == -1) { continue; } } else if (red == 2) { int br = proveriSestruUvece(niz); if (br == -1) { continue; } } sestre[i].raspored[red, kolona] = 1; globalniRaspored.gl[red, kolona] = sestre[i]; if (IzracunajSumu(niz) == 6) { radiLiNekaSestDana = 1; offdays(sestre[i].raspored); return; } } } } } } }
public void DodajPrvuSlobodnuSestru(List <Sestra> sestre, GlobalniRaspored globalniRaspored, int red, int kolona) { //tu treba sve uslove da dodam //valjalo bi kada bi napravio zastite neke za red i kolonu da ne bi dobijao greske indexOutOfRange for (int i = 0; i < sestre.Count; i++) { int[,] niz = sestre[i].raspored; //DA SESTRA RADI 5 ili 6 dana u nedelji #region PRVI USLOV int suma = IzracunajSumu(niz); if (suma == 6) { radiLiNekaSestDana = 1; } if (suma == 5 || suma == 6) { if (radiLiNekaSestDana != 0) { offdays(sestre[i].raspored); } //prvi uslov nije zadovoljen, ova sestra je radila dovoljno ove nedelje, ostale dane joj treba popuniti sa OFF dayovima //napraviti funkciju koja dodaje off-dayove na ostatak // offdays(niz);//***************************************IDEJA OVO ZAKOMENTARISATI continue; //samo da predje odma na sledecu sestru } #endregion //da li sestra radi trenutnu smenu #region DRUGI USLOV if (niz[red, kolona] == 1) { continue; // to nam govori da ova sestra radi ovu smenu } #endregion //provera da li je sestra radila dovoljan broj dana u odredjenoj smeni #region TRECI USLOV int rez = 0; if (red == 0) { rez = proveriSestruPrepodne(niz); } //pozivanje funkcije prepodne else if (red == 1) { rez = proveriSestruPopodne(niz); } //pozivanje funkcije poslepodne else if (red == 2) { rez = proveriSestruUvece(niz); } //pozivanje funkcije uvece else { rez = 43; //offday al 43 je random broj cisto da preskocimo sledece ifove iako ne bi trebalo uopste da se poziva ova funkcija } //else nam je offday if (rez == -1) { //popunila sve dane continue; //predji na sledeci } #endregion //**************************************************************************************** if (proveriSestruTajDan(niz, kolona)) { continue; //sestra vec radi taj dan neku smenu, treba preci na sledecu } //*************************************************************************************** //u slucaju da je smena poslepodne ili uvece sledeci ili prethodni dan mora biti isto poslepodne ili uvece #region CETVRTI USLOV if (red == 1 || red == 2) { int provera1 = proveriSestruPopodne(niz); int provera2 = proveriSestruUvece(niz); if (red == 1) { if (provera1 == 0) { //fali jos jos smena popodne //TODO DODELITI JOJ SMENU POSLEPODNE I UPISATI U GLOBALNI RASPORED sestre[i].raspored[red, kolona] = 1; globalniRaspored.gl[red, kolona] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } else if (provera1 == 1) { //izmedju minimuma i maximuma int danas = proveriSestruPoslepodneiUvece(niz, red, kolona); if (danas == 1) { if (niz[red, kolona - 1] == 0) { if (proveriSestruTajDan(niz, kolona - 1)) { //TODO DODELITI JOJ SMENU POSLEPODNE I UPISATI U GLOBALNI RASPORED sestre[i].raspored[red, kolona - 1] = 1; globalniRaspored.gl[red, kolona - 1] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } } } else if (danas == -1) { if (niz[red, kolona + 1] == 0) { if (proveriSestruTajDan(niz, kolona + 1)) { //TODO DODELITI JOJ SMENU POSLEPODNE I UPISATI U GLOBALNI RASPORED sestre[i].raspored[red, kolona + 1] = 1; globalniRaspored.gl[red, kolona + 1] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } } } } else if (provera1 == -1) { continue; //smene za popodne su joj popunjene cao zdravo idemo na sledecu sestru } } else if (red == 2) { if (provera2 == 0) { //fali jos jos smena uvece //TODO DODELITI JOJ SMENU uvece I UPISATI U GLOBALNI RASPORED sestre[i].raspored[red, kolona] = 1; globalniRaspored.gl[red, kolona] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } else if (provera2 == 1) { int danas = proveriSestruPoslepodneiUvece(niz, red, kolona); if (danas == 1) { if (niz[red, kolona - 1] == 0) { if (proveriSestruTajDan(niz, kolona - 1)) { //TODO DODELITI JOJ SMENU uvece I UPISATI U GLOBALNI RASPORED sestre[i].raspored[red, kolona - 1] = 1; globalniRaspored.gl[red, kolona - 1] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } } } else if (danas == -1) { if (niz[red, kolona + 1] == 0) { if (proveriSestruTajDan(niz, kolona + 1)) { //TODO DODELITI JOJ SMENU uvece I UPISATI U GLOBALNI RASPORED sestre[i].raspored[red, kolona + 1] = 1; globalniRaspored.gl[red, kolona + 1] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } } } else if (provera1 == -1) { continue; //smene za uvece su joj popunjene cao zdravo idemo na sledecu sestru } } } } #endregion else { sestre[i].raspored[red, kolona] = 1; globalniRaspored.gl[red, kolona] = sestre[i]; PostaviNaPoslednjeMesto(sestre, i); return; } } return; }