public static bool LotOfClassesInDay(int maxCountClassesInDay, StudentsClass[,] sClasses, ISchedule schedule, StudentsClass specialClass) { int rowClass = -1; int dayOfSpecialClass = Constants.GetDayOfClass(schedule.GetClassPosition(specialClass).Value.Time); //если пара есть в списке "особых пар" - получаю номер строки, в которой располагаются другие "особые" пары if ((rowClass = GetRow(sClasses, specialClass)) != -1) { int dayCount = 0; //количество "особых" пар из полученной строки, поставленных в данный день for (int classIndex = 0; classIndex < sClasses.GetLength(1); classIndex++) { if (sClasses[rowClass, classIndex] == null) continue; StudentsClassPosition? position = schedule.GetClassPosition(sClasses[rowClass, classIndex]); if (position.HasValue)//если пара установлена { if (dayOfSpecialClass == Constants.GetDayOfClass(position.Value.Time)) dayCount++; if (dayCount > maxCountClassesInDay) { return true; } } } } return false; }
public static bool ClassesAtSameTime(StudentsClass c1, StudentsClass c2, ISchedule schedule) { StudentsClassPosition? firstClassPosition = schedule.GetClassPosition(c1); StudentsClassPosition? secondClassPosition = schedule.GetClassPosition(c2); if (firstClassPosition.HasValue && secondClassPosition.HasValue) { if (firstClassPosition.Value.Time > secondClassPosition.Value.Time) { if (secondClassPosition.Value.Time + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK != firstClassPosition.Value.Time) { return false; } } else if (secondClassPosition.Value.Time > firstClassPosition.Value.Time) { if (firstClassPosition.Value.Time + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK != secondClassPosition.Value.Time) { return false; } } } return true; }
public static bool ClassesAtSameTime(ISchedule schedule, int classRow, StudentsClass[,] sClasses) { StudentsClassPosition? firstClassPosition = schedule.GetClassPosition(sClasses[classRow, 0]); StudentsClassPosition? secondClassPosition = schedule.GetClassPosition(sClasses[classRow, 1]); if (firstClassPosition.HasValue && secondClassPosition.HasValue) { if (firstClassPosition.Value.Time > secondClassPosition.Value.Time) { if (secondClassPosition.Value.Time + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK != firstClassPosition.Value.Time) { return false; } } else if (secondClassPosition.Value.Time > firstClassPosition.Value.Time) { if (firstClassPosition.Value.Time + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK != secondClassPosition.Value.Time) { return false; } } } return true; }
public static bool LotOfClassesInWeek(int maxCountClassesInWeek, StudentsClass[,] sClasses, ISchedule schedule, StudentsClass specialClass) { int rowClass = -1; //если пара есть в списке "особых пар" - получаю номер строки, в которой располагаются другие "особые" пары if ((rowClass = GetRow(sClasses, specialClass)) != -1) { int weekCount1 = 0; //количество "особых" пар из полученной строки, поставленных на первую неделю int weekCount2 = 0; //количество "особых" пар из полученной строки, поставленных на вторую неделю for (int classIndex = 0; classIndex < sClasses.GetLength(1); classIndex++) { if (sClasses[rowClass, classIndex] == null) continue; StudentsClassPosition? position = schedule.GetClassPosition(sClasses[rowClass, classIndex]); if (position.HasValue)//если пара установлена { if (Constants.GetWeekOfClass(position.Value.Time) == 0)//если пара располагается на первой неделе weekCount1++; else//на второй weekCount2++; } } if (weekCount1 > maxCountClassesInWeek || weekCount2 > maxCountClassesInWeek) { return true; } } return false; }
public int GetFineOfFullSchedule(ISchedule schedule, EntityStorage eStorage) { int fineResult = 0; for (int groupIndex = 0; groupIndex < eStorage.StudentSubGroups.Length; groupIndex++) { PartialSchedule groupSchedule = schedule.GetPartialSchedule(eStorage.StudentSubGroups[groupIndex]); for (int dayIndex = 0; dayIndex < Constants.DAYS_IN_WEEK; dayIndex++) { StudentsClass[] sClass = groupSchedule.GetClassesOfDay(dayIndex); for (int classIndex = 0; classIndex < sClass.Length; classIndex++) { if (sClasses.FindAll((c) => c.sClass == sClass[classIndex]).Count() > 0) { FixedClasses vipClass = sClasses.Find((c) => c.sClass == sClass[classIndex]); if (vipClass.Room != schedule.GetClassRoom(sClass[classIndex]) && vipClass.Time != schedule.GetClassPosition(sClass[classIndex]).Value.Time) { if (isBlock) return Constants.BLOCK_FINE; else fineResult += fine; } } } } } return fineResult; }
public int GetFineOfAddedClass(ISchedule schedule, EntityStorage eStorage) { int fineResult = 0; StudentsClass tClass = schedule.GetTempClass(); int tTime = schedule.GetClassPosition(tClass).Value.Time; if (sClasses.FindAll((c) => c.sClass == tClass).Count() > 0) { FixedClasses vipClass = sClasses.Find((c) => c.sClass == tClass); if (vipClass.Room != schedule.GetClassRoom(tClass) || vipClass.Time != tTime) { if (isBlock) return Constants.BLOCK_FINE; else fineResult += fine; } } else { if (sClasses.FindAll((c) => c.Time == tTime && StudentsClass.StudentClassContainsEvenOneSubGroup(tClass, c.sClass)).Count() > 0) { if (isBlock) return Constants.BLOCK_FINE; else fineResult += fine; } } return fineResult; }
public int GetFineOfFullSchedule(ISchedule schedule, EntityStorage eStorage) { int fineResult = 0; foreach (StudentSubGroup subGroup in eStorage.StudentSubGroups) { for (int dayIndex = 0; dayIndex < Constants.DAYS_IN_WEEK; dayIndex++) { StudentsClass[] subGroupDay = schedule.GetPartialSchedule(subGroup).GetClassesOfDay(dayIndex); for (int classIndex = 0; classIndex < subGroupDay.Length; classIndex++) { if (Array.Find<StudentsClass>(sClassesList.ToArray(), (c) => c == subGroupDay[classIndex]) != null) { StudentsClassPosition? firstClassPosition = schedule.GetClassPosition(subGroupDay[classIndex]); StudentsClass secondClass = schedule.GetClassByRoomAndPosition(firstClassPosition.Value.ClassRoom, firstClassPosition.Value.Time + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK); if (secondClass != null) { int firstClassRow = ClassesInWeek.GetRow(sClasses, subGroupDay[classIndex]); int secondClassRow = ClassesInWeek.GetRow(sClasses, secondClass); if (secondClassRow == -1 || secondClassRow != firstClassRow) { if (isBlock) return Constants.BLOCK_FINE; else fineResult += fine; } } } } } } return fineResult; }
public int GetFineOfAddedClass(ISchedule schedule, EntityStorage eStorage) { int fineResult = 0; StudentsClass tempClass = schedule.GetTempClass(); int classTime = schedule.GetTimeOfTempClass(); int roomIndex = schedule.GetClassPosition(schedule.GetTempClass()).Value.ClassRoom; int weekOfClass = Constants.GetWeekOfClass(classTime); if (Array.Find(sClassesList.ToArray(), (c) => c == schedule.GetTempClass()) != null) { StudentsClass secondClass; if (weekOfClass == 0) secondClass = schedule.GetClassByRoomAndPosition(roomIndex, classTime + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK); else secondClass = schedule.GetClassByRoomAndPosition(roomIndex, classTime - Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK); if (secondClass != null) { int firstClassRow = ClassesInWeek.GetRow(sClasses, tempClass); int secondClassRow = ClassesInWeek.GetRow(sClasses, secondClass); if (secondClassRow == -1 || secondClassRow != firstClassRow) { if (isBlock) return Constants.BLOCK_FINE; else fineResult += fine; } } } return fineResult; }
public static bool ClassesHasSameRoom(ISchedule schedule, int classRow, StudentsClass[,] sClasses) { StudentsClassPosition? firstClassPosition = schedule.GetClassPosition(sClasses[classRow, 0]); StudentsClassPosition? secondClassPosition = schedule.GetClassPosition(sClasses[classRow, 1]); if (firstClassPosition.HasValue && secondClassPosition.HasValue) { if (firstClassPosition.Value.ClassRoom != secondClassPosition.Value.ClassRoom) { return false; } } return true; }
public static bool ClassesHasSameRoom(StudentsClass c1, StudentsClass c2, ISchedule schedule) { StudentsClassPosition? firstClassPosition = schedule.GetClassPosition(c1); StudentsClassPosition? secondClassPosition = schedule.GetClassPosition(c2); if (firstClassPosition.HasValue && secondClassPosition.HasValue) { if (firstClassPosition.Value.ClassRoom != secondClassPosition.Value.ClassRoom) { return false; } } return true; }
public static bool PairClassesAtSameTimeInSameRoom(ISchedule schedule, StudentsClass[,] sClasses, List<StudentsClass> sClassesList, StudentsClass firstClass) { StudentsClassPosition? firstClassPosition = schedule.GetClassPosition(firstClass); int weekOfClass = Constants.GetWeekOfClass(firstClassPosition.Value.Time); if (Array.Find(sClassesList.ToArray(), (c) => c == firstClass) != null) { int classRow = ClassesInWeek.GetRow(sClasses, firstClass); int firstClassCol = ClassesInWeek.GetColumn(sClasses, firstClass); int secondClassCol = -1; switch (firstClassCol) { case 0: secondClassCol = 1; break; case 1: secondClassCol = 0; break; default: break; } StudentsClass secondClass = sClasses[classRow, secondClassCol]; StudentsClassPosition? secondClassPosition = schedule.GetClassPosition(secondClass); int probablySecondClassTime; if (weekOfClass == 0) probablySecondClassTime = firstClassPosition.Value.Time + Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK; else probablySecondClassTime = firstClassPosition.Value.Time - Constants.CLASSES_IN_DAY * Constants.DAYS_IN_WEEK; if (secondClassPosition.HasValue) { if (probablySecondClassTime == secondClassPosition.Value.Time) { if (firstClassPosition.Value.ClassRoom != secondClassPosition.Value.ClassRoom) { return false; } } } else { secondClass = schedule.GetClassByRoomAndPosition(firstClassPosition.Value.ClassRoom, probablySecondClassTime); if (secondClass != null) { return false; } } } return true; }