Идея алгоритма. Расписание на неделю C#
Написать программу, работающую с файлом из записей следующей типизации:
int group; //Номер группы
char subGroup; //Подгруппа 0-обе, 1-а , 2-б
char day; //День недели 1-понедельник и тд
char lenta; //Номер ленты
string subject; //Предмет
Наличие конкретной записи в файле указывает на то, что у подгруппы а,б или обоих в день day , лентой-lenta по рассписанию предмет-subject. Программа должна иметь возможность создавать файл , а также:
а) Для конкретного дня недели, номер группы, подгруппы и ленты выдавать какой предмет должен быть по расписанию(если занятия нет , то вывести сообщение об этом)
b)Для заданной группы и подгруппы составить расписание на неделю
Я бы хотел попросить помощи , в плане , направить в нужном направлении по ходу решения. Уже 3 дня бьюсь над задачкой. В голове крутиться только реализация через трехмерный масив. Буду благодарен за помощь
class Program
{
struct User
{
public int group;
public char subGroup;
public char day;
public char lenta;
public string subject;
public void DisplayInfo()
{
string info = ($"Группа: {group}" +
$"Подгруппа: {subGroup} " +
$"День: {day} " +
$"Лента: {lenta}" +
$"Предмет: {subject}");
Console.WriteLine(info);
}
}
static void Main(string[] args)
{
User student;
Console.Write("Введите номер вашей группы: ");
student.group = int.Parse(Console.ReadLine());
Console.Write("Введите номер вашей подгруппы: ");
student.subGroup = char.Parse(Console.ReadLine());
Console.Write("Укажите номер дня в неделе: ");
student.day = char.Parse(Console.ReadLine());
//Создание трехмерного масива для расписания
int[][][] firstArray = new int[3][][];
for (int i = 0; i < 3; i++)
{
int[][] secondArray = new int[7][];
for (int j = 0; j < 7; j++)
{
int[] thirdArray = new int[7];
for (int k = 0; k < 7; k++)
{
thirdArray[k] = 0;
}
secondArray[j] = thirdArray;
}
firstArray[i] = secondArray;
}
Console.ReadKey();
}
Ответы (1 шт):
Чтобы не утонуть в многомерных массивах, тем более, что у вас список может быть разной длины, лучше используйте списки List<T>. В нихм ожно добавлять и удалять элементы, например у вас может быть разное количество подгрупп в каждой группе.
Вот например дневное расписание на один день для одной группы и подгруппы
struct Schedule
{
public string Group { get; set; }
public string SubGroup { get; set; }
public DateTime Day { get; set; }
public Dictionary<TimeSpan, string> DayShedule { get; set; }
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append(Day.ToString("dd.MM.yyyy")).Append(' ');
sb.Append(Group).Append('-').AppendLine(SubGroup);
foreach (var pair in DayShedule)
{
sb.Append(pair.Key.ToString(@"hh\:mm")).Append(' ').AppendLine(pair.Value);
}
return sb.ToString();
}
}
Может я переусложнил, но вы удилите лишнее, если надо. Я сделал именно так для наглядности.
Всё, теперь это можно хранить в списке и делать выборку с помощью System.Linq.
Давайте создадим список и добавим в него данные
List<Schedule> schedules = new List<Schedule>();
schedules.Add(new Schedule
{
Group = "Ы",
SubGroup = "15",
Day = DateTime.Parse("15.01.2020"),
DayShedule = new Dictionary<TimeSpan, string>
{
[TimeSpan.FromHours(9)] = "Алгебра",
[TimeSpan.FromHours(11)] = "Физика",
[TimeSpan.FromHours(13)] = "Экономика",
[TimeSpan.FromHours(15)] = "Геометрия",
}
});
schedules.Add(new Schedule
{
Group = "Ы",
SubGroup = "15",
Day = DateTime.Parse("16.01.2020"),
DayShedule = new Dictionary<TimeSpan, string>
{
[TimeSpan.FromHours(11)] = "Английский",
[TimeSpan.FromHours(15)] = "Физкультура",
}
});
schedules.Add(new Schedule
{
Group = "Б",
SubGroup = "15",
Day = DateTime.Parse("16.01.2020"),
DayShedule = new Dictionary<TimeSpan, string>
{
[TimeSpan.FromHours(11)] = "Английский",
[TimeSpan.FromHours(15)] = "Физкультура",
}
});
Тогда можно будет одной строкой получить выборку для любой группы, на любой день, как наприме, давайте выберем расписание для группы Ы и выведем в консоль.
var selection = schedules.Where(x => x.Group == "Ы");
foreach (Schedule s in selection)
Console.WriteLine(s);
Если вам незнаком Linq, то можно выбрать вот так
foreach (Schedule s in schedules)
{
if (s.Group == "Ы")
Console.WriteLine(s);
}
Вывод будет такой
15.01.2020 Ы-15
09:00 Алгебра
11:00 Физика
13:00 Экономика
15:00 Геометрия
16.01.2020 Ы-15
11:00 Английский
15:00 Физкультура
Можно таким же образом выбирать по временному промежутку, датам, подгруппам, времени, предметам, как угодно.