-- Defini um package Campeonato em que, para além dos tipos necessários, -- defini como estruturas de dados as Classes Equipa e Jogos -- Também podia ter definido uma classe Arbitro e Arbitros_Asssitentes, mas, -- nesta primeira aproximação usei 2 arrays de Strings contendo um os nomes dos Arbitros -- e outro os nomes dos Assistentes (para já iguais). -- Defini um tipo Vector de Equipas e um subtipo desse, o Equipas_Campeonato, -- onde guardarei (depois de lançados os dados das equipas, através de métodos -- de inicialização/carregamento/construção) todos os dados das equipas. -- No fim crio um package Campeonato2004, que terá um vector Todas deste tipo, isto é, -- um vector com todos os dados das equipas, para uma instância de campeonato. -- O que disse para Equipas, fiz o memso para os Jogos. O vector que conterá -- todos os jogos do Campeonato2004 será o chamado Todos. -- Entretanto, para além dos métodos para criar Equipas e Jogos (que depois de todos criados -- ficarão nos tais vectores que falei antes), criei (ou vou criar) métodos -- para calcular, a partir do vector quer contém os dados dos jogos todos do -- campeonato, "Os pontos de cada equipa", "os golos marcados por cada equipa", -- "os golos sofridos por cada equipa", "os golos marcados por cada equipa na situação -- de visitante", "A classificação de cada equipa". Ainda não fiz, mas todos estes métodos podiam -- ter uma componente de impressão para o écran, ou podia fazê-la à parte, depois. package Campeonato is type Data is Date; type Hora is Integer range 0..24; type Local is String(1..20); type N_Espectadores is Integer range 0..20000; type Arbitro is String(1..20); type Arbitros is array(1..20) of Arbitro; type Arbitros_Ass is array(1..40) of Arbitro; type Resultado(Vitoria, Empate, Derrota); type Res_Golos is array(2) of Integer; type Equipa is private; subtype N_De_Equipas is Natural range 20; type Vector_De_Equipas is array(N_De_Equipas range <>) of Equipa; subtype Equipas_Campeonato is Vector_De_Equipas; function Nova_Equipa(Nome_Eq: String; Pontos_Equipa, Golos_Marcados, Golos_Sofridos, Golos_Sit_Vis: Integer) return Equipa; type Jogo is private N: Integer := subtype N_De_Jogos is Natural range 2(N_De_Equipas*N_De_Equipas+1); type Vector_De_Jogos is array(N_De_Jogos range <>) of Jogo; function Novo_Jogo(IdJogo: JogoId; IdData: Date; IdHora: Hora; Id_Espectadores: Espectadores; IdArbitro: Arbitro; IdArbitrosAss: Arbitros_Ass; IdResultado: Resultado; IdRes_Golos:Res_Golos) return Jogo; private type String_Ptr is access all String; type Integer_Ptr is access all Integer; type Equipa_Record; type Equipa is access all Equipa_Record; type Equipa_record is record Nome_Eq: String_Ptr; Pontos_Equipa: Integer_Ptr; Golos_Marcados: Integer_Ptr; Golos_Sofridos: Integer_Ptr; Golos_Sit_Vis: Integer_Ptr; end record; type JogoId is array(2) of Equipa.Nome_Eq; type IdJogo_Ptr is access JogoId; type IdData_Ptr is access Data; type IdHora_Ptr is access Hora; type IdEspectadores_Ptr is access N_Espectadores; type IdArbitro_Ptr is access Arbitro; type IdResultado_Ptr is access Resultado; type IdRes_Golos_Ptr is access Res_Golos; type Jogo is acess all Jogo_Record; type Jogo_Record is record IdJogo: JogoId; IdData: Data; IdHora: Hora; IdEspect: N_Espectadores; IdArbitro: Arbitro; IdArbitrosAss: Arbitros_Ass; IdResultado: Resultado; IdRes_Golos: Res_Golos; end record; procedure Calc_Pontos_Equipas(E: in Equipas_Campeonato, J: in N_De_Jogos); procedure Calc_Golos_Marc_Equipas(E: in Equipas, J: in N_De-Jogos); procedure Calc_Golos_Sofr_Equipas(E: in Equipas, J: in N_De-Jogos); procedure Calc_Golos_Vis_Equipas(E: in Equipas, J: in N_De-Jogos); procedure Calc_Classif_Equipas(E: in Equipas_Campeonato, J: in N_De_Jogos); package body Campeonato is function Nova_Equipa(Nome_Eq: String; Pontos_Equipa, Golos_Marcados, Golos_Sofridos, Golos_Sit_Vis: Integer) return Equipa is begin return new Equipa_Record' (Nome_Eq => new String'(Nome_Eq), Pontos_Equipa => new Integer'(Pontos_Equipa):=0, Golos_Marcados => new Integer'(Golos_Marcados):=0, Golos_Sofridos => new Integer'(Golos_Sofridos):=0, Golos_Sit_Vis => new Integer'(Golos_Sit_Vis):=0); end; function Novo_Jogo(IdJogo: JogoId; IdData: Date; IdHora: Hora; Id_Espectadores: Espectadores; IdArbitro: Arbitro; IdArbitrosAss: Arbitros_Ass; IdResultado: Resultado; IdRes_Golos:Res_Golos) return Jogo is begin return new Jogo_Record' (IdJogo => new JogoId'(IdJogo), IdData => new Data'(IdData), IdHora => new Hora'(IdHora), Id_Espectadores => new Espectadores'(Id_Espectadores), IdArbitro => new Arbitro'(IdArbitro), IdArbitrosAss => new Arbitros_Ass'(IdArbitrosAss), IdResultado => new Resultado'(IdResultado)), IdRes_Golos => new Res_Golos'(IdRes-Golos); end; procedure Calc_Pontos_Equipas(E: in Equipas_Campeonato; J: in N_Jogos) is begin for I in E'Range loop for J in J'Range loop if J(1).IdJogo(1)=E.Nome_Eq then if J(7)=Vitoria then E.Pontos_Equipa:=E.Pontos_Equipa+3; end if; if J(7)=Empate then E.Pontos_Equipa:=E.Pontos_Equipa+1; end if; end if; if J(1).IdJogo(2)=E.Nome_Eq then if J(7)=Derrota then E.Pontos_Equipa:=E.Pontos_Equipa+3; end if; if J(7)=Empate then E.Pontos_Equipa:=E.Pontos_Equipa+1; end if; end if; end loop; end loop; end; -- os procedimentos seguintes ainda tenho de concretizar procedure Calc_Golos_Marc_Equipas(E: in Equipas_Campeonato; J: in N_Jogos) is procedure Calc_Sofr_Equipas(E: in Equipas_Campeonato; J: in N_Jogos) is procedure Calc_Sit_Vis_Equipas(E: in Equipas_Campeonato; J: in N_Jogos) is procedure Calc_Classif_Equipas(E: in Equipas_Campeonato) is -- A seguir instancio então um Campeonato2004 especifico, usando as funções -- de Nova_Equipa e Novo_Jogo definidos acima, para carregar os dados (das equipas e dos jogos) -- concretos. No caso das equipas, a maioria dos campos fica por preencher, o que será -- feito pelos métodos de Calc_ específicos, sendo os respectivos campos -- inicilazados a zero. with Campeonato; use Campeonato; Arbitros: Arbitros:= ("PProença", "MSantos", "PParaty", "OBenquerença", "BPaixao", "LBaptista", "ADuarte"); ArbitrosASS: Arbitros_Ass:= ("PProença", "MSantos", "PParaty", "OBenquerença", "BPaixao", "LBaptista", "ADuarte"); package Campeonato2004 is Benfica: Equipa:= Nova_Equipa("Benfica", 0, 0, 0, 0); Sporting: Equipa:= Nova_Equipa("Sporting", 0 ,0, 0, 0); Porto: Equipa("Porto", 0, 0, 0, 0); Todas: Equipas_Campeonato:= (Benfica, Sporting, Porto); Benfica_Sporting: Jogo:= Novo_Jogo(("Benfica","Sporting"), 23/04/04, 21, 45000, "OBenquerença", ("BPaixao","PCosta"), Vitoria, (2,0)); Benfica_Porto: Jogo:= Novo_Jogo(("Benfica","Porto"), 02/01/04, 15, 5000, "MSantos", ("BPaixao","OBenquerença"), Vitoria, (5,1)); Porto_Sporting: Jogo:= Novo_Jogo(("Porto","Sporting"), 18/02/04, 2, 10000, "AParaty", ("ADuarte","LBaptista"), Empate, (2,2)); Sporting_Benfica: Jogo:= Novo_Jogo(("Sporting","Benfica"), 10/04/04, 19, 23000, "PCosta", ("BPaixao","PProença"), Derrota, (0,1)); Porto_Benfica: Jogo:= Novo_Jogo(("Porto","Benfica"), 12/03/04, 15, 21200, "MSantos", ("BPaixao","OBenquerença"), Empate, (5,5)); Sporting_Porto: Jogo:= Novo_Jogo(("Sporting","Porto"), 26/02/04, 20, 1000, "PProença", ("AParaty","MSantos"), Derrota, (0,2)); Todos: N_Jogos:= (Benfica_Sporting, Benfica_Porto, Porto_Sporting, Sporting_Benfica, Porto_Benfica, Sporting_Porto); package body Campeonato2004 is begin Calc_Pontos_Equipas(Todas, Todos); Calc_Golos_Marc_Equipas(Todas, Todos); Calc_Sofr_Equipas(Todas, Todos); Calc_Sit_Vis_Equipas(Todas, Todos); Calcula_Classif_Equipas(Todas,Todos); end;