package Salas is type Sala is abstract tagged record Nome_Sala: String (1..5); Lotaçao_Sala: Integer range 20..100; end record; package Salas.Teoricas is NDisc_Teo: Integer; type Disc_Sala_Teo is array (1..NDisc_Teo) of Disciplina.Nome_Disciplina; type Sala_Teorica is new Sala with record Disciplinas: array of Disc_Sala_Teo; end record; package Salas.Praticas is NDisc_Prat: Integer; type Disc_Sala_Prat is array (1..NDisc_Prat) of Disciplina.Nome_Disciplina; type Sala_Pratica is new Sala with record Disciplinas: array of Disc_Sala_Prat; end record; package Salas.Laboratoriais is NDisc_Lab: Integer; type Disc_Sala_Lab is array (1..NDisc_Lab) of Disciplina.Nome_Disciplina; type Sala_Laboratorial is new Sala with record Disciplinas: Disc_Sala_Lab; end record; package Disciplinas is type Disciplina is record Nome_Disciplina: String (1..25); Curso_Disciplina: String (1..25); NTurmas_Disciplina: Integer; NAlunos_Insc_Disciplina: integer; CHoraria_Teo_Disc: Integer; CHoraria_Prat_Disc: Integer; CHoraria_Lab_Disc: Integer; Racio: Integer end record; procedure NTurmas_Disc(Lista_Disc: Disciplinas.Lists) ; package body Disciplinas is use Alunos; procedure NTurmas_Disc(Lista_Alunos: Cell_Ptr, Lista_Disciplinas: Cell_Ptr) return Integer is Local1: Cell_Ptr:=Lista_Alunos; Local2: Cell_Ptr:=Lista_Disciplinas; while Local2 /= null loop while Local1 /= null loop for Aluno.Disc_Insc_Aluno.Disc_Insc in 1..Max loop if Aluno.Disc_Insc_Aluno.Disc_Insc == Disciplina.Nome_Disciplina Disciplina.NAlunos_Insc_Disciplina=Disciplina.NAlunos_Insc_Disciplina + 1; end loop; end loop; Disciplina.NTurmas_Disciplina=Disciplina.NAlunos_Insc_Disciplina/Disciplina.Racio end loop; package Disciplinas.Lists is type Disc_Ptr is access Disciplina; type Cell; type Cell_Ptr is access Cell; type Cell is record Next: Cell_Ptr; Element: Disc_Ptr; end record; procedure Add_To_List(List: in out Cell_Ptr; DiscPtr: in Disc_Ptr); procedure Build_List(Lista_Disc: in out Lists.Cell_Ptr); end; package body Disciplinas.Lists is procedure Add_To_List(List: in out Cell_Ptr; DiscPtr: in Disc_Ptr) is begin List:= new Cell'(List, DiscPtr); --acrescenta à cabeça end Add_To_List; procedure Build_List(Lista_Disc: in out Lists.Cell_Ptr) is --tenho de fazer depois-- end Disciplinas.Lists; package Alunos is Max: Integer; type Disc_Insc is array (1..Max) of Disciplina.Nome_Disciplina; type Aluno is record Nome_Aluno: String (1..30), Numero_Aluno: Integer; Curso_Aluno: Curso; Disc_Insc_Aluno: Disc_Insc; end record; package Cursos is N_Disc_Curso: Integer type Disc_Curso is array (1..N_Disc_Curso) of Disciplina.Nome_Disciplina; type Curso is record Nome_Curso: String (1..50) Disciplinas_Curso: Disc_Curso, end record; with Salas; with Disciplinas; with Alunos; with Cursos; with Ada.Text_IO; procedure Horarios (Lista_Disciplinas: Cell_Ptr) is type HoraDisc is Integer range <1..60> --horas disponíveis/semana(2ª a 6ª) NTotDisc: Integer Local3: Cell.Ptr:=Lista.Disciplinas; while Local3 /= null and Local.Curso_Disciplina == Local.Curso_Disciplina-1 loop while Disciplina.NTurmas_Disciplina /= 0 for HorasDisc --agora é ter cuidado em distribuir as horas teóricas, práticas etc., --indo eliminando horas disponíveis, até que se acabe a Turma, --e depois repetir por todas as turmas --... e ter em conta também as salas. type Lista_Disciplinas is array (1..NTotDisc) of Disciplinas.Nome_Disciplina; begin for I in 1..NTotDisc loop function(List_Al_Disc: LAD) return HoraDisc, Sala.Nome_Sala; end loop; begin Formar_Turmas_Disc_Curso --para isso preciso de separar Alunos inscrito nessa disciplina -- dá-me o nº de turmas dessa disciplina (loop para todas as disciplinas) Turma_Disc --atribuir horas e salas de acordo com carga horária semanal, tipo de aulas -- com o cuidado de não atribuir salas já ocupadas e horas que essa turma -- já tenha ocupadas