-
Notifications
You must be signed in to change notification settings - Fork 0
/
Grafo.cs
143 lines (119 loc) · 7.33 KB
/
Grafo.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TI_Grafos
{
class Grafo
{
public List<Aresta> arestas = new List<Aresta>();
public List<Aresta> arestasRemovidas = new List<Aresta>();
public List<Professor> professor = new List<Professor>();
public List<Periodo> periodo = new List<Periodo>();
public List<Horario> Horario = new List<Horario>();
public Grafo() //Construtor padrão
{
}
//Método responsável por receber por parâmetro um professor e fazer sua adição na lista de Professores.
public void adicionarVerticeProfessor(Professor prof)
{
//Se a lista Professor não conter o professor que está sendo passado por parâmetro, ela será adicionado, caso contrario nada será feito.
if (!professor.Contains(prof))
professor.Add(prof);
}
//Método que recebe por parâmetro um período e sua respectiva disciplina a fim de inserir na lista de periodos.
public void adicionarVerticePeriodo(Periodo pe, Disciplina disciplina)
{
//variável contendo a informação da instanciação Periodo.
var aux = new Periodo(pe.Periodos, disciplina);
//Se a lista Periodo não conter o periodo e a disciplina que estão na variável auxiliar,será feito a adição. Caso contrario , nada ocorrerá.
if (!periodo.Contains(aux))
periodo.Add(aux);
}
//Método que recebe por parâmetro professor, sua respectiva disciplina e período, para se insetir na lista de arestas.
public void adicionarAresta(Professor profes, Disciplina disc, Periodo per)
{
//Fazendo a instanciação e a inserção na lista de Arestas.
Aresta aresta = new Aresta(profes, disc, per);
arestas.Add(aresta);
}
//Método responsável por realizar a verificação em caso de conflito de duas ou mais ocorrencias de um professor ministrando aulas no mesmo período.
public void VerificarArestas()
{
Aresta aresta = new Aresta();
foreach (var item in arestas.ToList()) //Percorrendo cada elemento presente na lista Aresta
{
//Se existir mais de duas arestas com o mesmo periodo, ele será retirado da lista de Arestas
//e colocado em outra lista denominada arestasRemovidas, para ser mostrado ao final do processo o conflito.
if (arestas.Where(a => a.Periodo.Periodos == item.Periodo.Periodos).Count() > 2)
{
arestasRemovidas.Add(item);
arestas.Remove(item);
}
}
//Percorre a lista de arestas
foreach (var item in arestas.ToList())
{
//Se existem professores com mais de duas disciplinas na arestas, ele será removido e será adicionado na lista de arestasRemovidas.
if (arestas.Where(a => a.Professor.Nome == item.Professor.Nome).Count() > 2)
{
arestasRemovidas.Add(item);
arestas.Remove(item);
//Percorre todos os elementos contidos na lista de professor
foreach (var prof in professor.ToList())
{
//Verifica na lista de professores se existe um professor que tenha o grau um, se sim, ele adiciona na lista de arestas
if (arestas.Where(a => a.Professor.Nome == prof.Nome).Count() == 1)
{
aresta = new Aresta(prof, item.Disciplina, item.Periodo);
arestas.Add(aresta);
break;
}
//Se não, não será executado nada.
}
}
}
//Realizando a ordenção por período
arestasRemovidas = arestasRemovidas.OrderBy(a => a.Periodo.Periodos).ToList();
}
//Método responsável por adicionar na lista de Horário os períodos já contidos através da recuperação do método VerificarArestas.
public void adicionarHorarios()
{
VerificarArestas(); //Invocando a chamada do método
//Percorrendo a lista de Arestas
arestas.ForEach(lv =>
{
//Se não tiver nenhum horário que possua o periodo, adiciona o professor, a disciplina e o periodo no primeiro horario.
if (!Horario.Any(p => p.Periodo.Periodos == lv.Periodo.Periodos))
Horario.Add(new Horario(lv.Professor, lv.Disciplina, lv.Periodo, 1));
//Se não, verifica se o horario é diferente de 2, (irrelevante) e adiciona no horario 2.
else if (Horario.First(p => p.Periodo.Periodos == lv.Periodo.Periodos).Horarios != 2)
Horario.Add(new Horario(lv.Professor, lv.Disciplina, lv.Periodo, 2));
//Se nao cair em nenhuma condicional, nada é feito.
});
Horario = Horario.OrderBy(h => h.Periodo.Periodos).ToList(); //Realizando a ordenação por período na lista Horario
}
//Método responsável pela impressão de forma organizada dos elementos contidos em todas as listas criadas.
public void printarMatriz()
{
adicionarHorarios();
int maxDisciplinas = arestas.Max(p => p.Disciplina.Disciplinas.Length);
int maxProfessor = arestas.Max(p => p.Professor.Nome.Length);
int maxPeriodos = arestas.Max(p => p.Periodo.Periodos.ToString().Length);
Console.WriteLine("\n Professores");
professor.ForEach(lv => Console.WriteLine("Professor: " + lv.Nome));
Console.WriteLine("\n Disciplina e Periodo");
periodo.ForEach(lv => Console.WriteLine("Disciplina: " + lv.Disciplina.Disciplinas + adicionarEspaco(lv.Disciplina.Disciplinas, maxDisciplinas) + " \t" + "Periodo: " + lv.Periodos));
Console.WriteLine("\n Arestas");
arestas.ForEach(lv => Console.WriteLine("Professor: " + lv.Professor.Nome + adicionarEspaco(lv.Professor.Nome, maxProfessor) + "\t" + "Disciplina: " + lv.Disciplina.Disciplinas + adicionarEspaco(lv.Disciplina.Disciplinas, maxDisciplinas) + " \t" + "Periodo: " + lv.Periodo.Periodos));
Console.WriteLine("\n Horarios");
Horario.ForEach(lv => Console.WriteLine("Professor: " + lv.Professor.Nome + adicionarEspaco(lv.Professor.Nome, maxProfessor) + "\t" + "Disciplina: " + lv.Disciplina.Disciplinas + adicionarEspaco(lv.Disciplina.Disciplinas, maxDisciplinas) + "\t" + "Periodo: " + lv.Periodo.Periodos + adicionarEspaco(lv.Periodo.Periodos.ToString(), maxPeriodos) + "\t" + "Horario: " + lv.Horarios));
Console.WriteLine("\n Arestas removidas");
arestasRemovidas.ForEach(lv => Console.WriteLine("Professor: " + lv.Professor.Nome + adicionarEspaco(lv.Professor.Nome, maxProfessor) + "\t" + "Disciplina: " + lv.Disciplina.Disciplinas + adicionarEspaco(lv.Disciplina.Disciplinas, maxDisciplinas) + "\t" + "Periodo: " + lv.Periodo.Periodos));
}
private string adicionarEspaco(string nome, int max)
{
return nome.Length < max ? new String(' ', max - nome.Length) : "";
}
}
}