245 wiersze
7,7 KiB
Ada
245 wiersze
7,7 KiB
Ada
with Fiche_Plongee, Capteurs, Gada.Text_IO;
|
|
use Fiche_Plongee, Capteurs, Gada.Text_IO;
|
|
|
|
procedure td is
|
|
|
|
-- TD 2
|
|
|
|
function Effectif_Palanquee(Table: T_Palanq) return integer is
|
|
I : integer := 1; -- to go through the table
|
|
Counter : Integer := 0; -- the final value
|
|
begin
|
|
|
|
for I in 1 .. Max_Plongeurs loop
|
|
if Table.Plongeurs(I).Present then
|
|
Counter := Counter+1;
|
|
end if;
|
|
end loop;
|
|
|
|
return Counter;
|
|
end Effectif_Palanquee;
|
|
|
|
|
|
function Effectif_Fiche(Table: T_Fiche_Secu) return integer is
|
|
I : Integer := 0; -- to go through the table
|
|
J : Integer := 0; -- to go through the table
|
|
Counter : Integer := 0; -- the final value
|
|
begin
|
|
|
|
for I in 1 .. Table.NB_Palanquees loop -- welook at all the palanquees
|
|
for J in 1 .. Max_Plongeurs loop -- then we look at all the plongeurs in the palanquee
|
|
if Table.Tab_Palanquees(I).Plongeurs(J).Present then -- if they are present
|
|
Counter := Counter+1; -- we increment the counter
|
|
end if;
|
|
end loop;
|
|
end loop;
|
|
|
|
return Counter;
|
|
end Effectif_Fiche;
|
|
|
|
function Est_Plongee_Technique(Palanq : T_Palanq) return Boolean is
|
|
I : Integer := 1; -- to go through the table
|
|
Teacher : Integer := 0; -- to store the number of teachers
|
|
Student : Integer := 0; -- to store the number of students
|
|
Other : Integer := 0; -- to store the number of plongeurs that are neither student nor teachers
|
|
begin
|
|
for I in 0 .. Max_Plongeurs loop -- we go through the palanquee
|
|
if Palanq.Plongeurs(I).Present then -- we check if the plongeur is present
|
|
if Palanq.Plongeurs(I).Role = Ens then -- if he is present and is a teacher we increment teacher
|
|
Teacher := Teacher + 1;
|
|
elsif Palanq.Plongeurs(I).Role = Eleve then -- if he is present and is a student we increment student
|
|
Student := Student + 1;
|
|
else -- if he is present and is neither a teacher nor a student we increment other
|
|
Other := Other +1;
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
return (Teacher = 1 and Other = 0 and (Student > 0 and Student <5)); -- we return the value taken by the condition
|
|
end Est_Plongee_Technique;
|
|
|
|
|
|
function Numero_Premiere_Technique(Fiche : T_Fiche_Secu) return Integer is
|
|
I : Integer := 1; -- to go through the table
|
|
Tech : Boolean := Est_Plongee_Technique(Fiche.Tab_Palanquees(I)); -- we initialize this as the very first entry of the table
|
|
|
|
begin
|
|
|
|
while (not Tech) loop -- while our plongee is not technique we keep on looking at the next entry
|
|
I := I+1; -- I miss the i++ so bad
|
|
Tech := Est_Plongee_Technique(Fiche.Tab_Palanquees(I)); -- we take the value of whether the Ith plongee is technique
|
|
end loop;
|
|
return I;
|
|
end Numero_Premiere_Technique;
|
|
|
|
function Durees_Fiche_OK(Fiche: T_Fiche_Secu) return Boolean is
|
|
I : Integer := 1; -- to go through the table
|
|
Good : Boolean := True; -- if it stays good all along then it's good else it's not
|
|
begin
|
|
for I in 1 .. Fiche.NB_Palanquees loop
|
|
if Fiche.Tab_Palanquees(I).Duree_Reelle_Fond >= Fiche.Temps_Plongee_Max_Autorise then
|
|
Good := False;
|
|
end if;
|
|
end loop;
|
|
return Good;
|
|
end Durees_Fiche_OK;
|
|
|
|
|
|
function Profondeur_Max(Table: T_palanq) return Integer is
|
|
I : Integer := 0;
|
|
Max : Integer := 0;
|
|
NB_Max_Plongeurs: constant Integer := 10; -- Not explicitely given so I figured out I'll put it to be 10
|
|
|
|
|
|
begin
|
|
for I in 0 .. Max_Plongeurs loop
|
|
if Table.Plongeurs(I).Profondeur_Max_Autorisee < Max then -- it's smaller than because if smone can't go further the it become the new max
|
|
Max := Table.Plongeurs(I).Profondeur_Max_Autorisee;
|
|
end if;
|
|
end loop;
|
|
return I;
|
|
|
|
end Profondeur_Max;
|
|
|
|
function Profondeur_Fiche_OK(Fiche: T_Fiche_Secu) return Boolean is
|
|
I : Integer := 1;
|
|
Good : Boolean := True;
|
|
begin
|
|
for I in 1 .. Fiche.NB_Palanquees loop
|
|
if Fiche.Tab_Palanquees(I).Profondeur_Reelle >= Profondeur_Max(Fiche.Tab_Palanquees(I)) then
|
|
Good := False;
|
|
end if;
|
|
end loop;
|
|
return Good;
|
|
end Profondeur_Fiche_OK;
|
|
|
|
|
|
|
|
|
|
-- TD 3
|
|
-- Q1: exmample of events:
|
|
-- (Signal_Feu:32400.0)
|
|
-- (Plot,2,32400.8)
|
|
-- (Plot,3,32400.9)
|
|
-- (Plot,1,32401.2)
|
|
|
|
-- (Sud,3,32420.8)
|
|
-- (Sud,2,32421.8)
|
|
-- (Sud,2,32421.85)
|
|
-- (Sud,2,32421.90)
|
|
-- (Sud,1,32423.8)
|
|
|
|
-- (Nord,3,32440.8)
|
|
-- (Nord,2,32441.8)
|
|
-- (Nord,1,32443.8)
|
|
|
|
-- (Sud,3,32460.8)
|
|
-- (Sud,2,32461.8)
|
|
-- (Sud,1,32463.8)
|
|
|
|
-- (Nord,3,32480.8)
|
|
-- (Bouton_Fin,32480.9)
|
|
-- (Nord,2,32481.8)
|
|
-- (Nord,1,32483.8)
|
|
|
|
|
|
procedure Course is
|
|
Temp: Float := 0.0;
|
|
Rank: Integer := 0;
|
|
Sorted: Boolean := False;
|
|
J : Integer := 0;
|
|
I : Integer := 0;
|
|
NB_Swimmer: Integer :=8; -- could be more;
|
|
Running : Boolean:= True;
|
|
Event : T_Evenement;
|
|
TDepart : Float := 0.0;
|
|
type T_TableTime is array (1..NB_Swimmer, 1..4) of Float; --time of the nth swimmer at 1: Start, 2:50 m, 3 finish, 4, the last time it reached a Nord base
|
|
type T_TableNum is array (1..NB_Swimmer) of Integer; -- number of times the nth swimmer did a 50m
|
|
type T_TableArr is array (1..NB_Swimmer) of Float; -- time at which the awimmer arrives
|
|
|
|
TableTime: T_TableTime := (others => (others => 0.0));
|
|
TableNum : T_TableNum :=(others => 0);
|
|
Arrival : T_TableArr :=(others => 0.0);
|
|
begin
|
|
|
|
while Running loop
|
|
Event := Attend_Signal;
|
|
|
|
-- I had done a case at first but we need to do something more complex
|
|
-- case Event.emmeteur is
|
|
-- when Capteur_Plot =>
|
|
-- when Capteur_Nord =>
|
|
-- when Capteur_Sud => null;
|
|
-- when Signal_Feu =>
|
|
-- when Bouton_Fin =>
|
|
-- end case;
|
|
if Event.Emetteur = Signal_Feu then
|
|
TDepart := Event.Date; -- We stock the first value to have the time of the swimmers
|
|
elsif Event.Emetteur = Capteur_Plot then
|
|
if Event.Date - TDepart < 0.1 then -- it is a false start https://en.wikipedia.org/wiki/False_start
|
|
Running := False;
|
|
Put_Line("False start at line" & Integer'Image(Event.Num));
|
|
else
|
|
TableTime(Event.Num,1) := Event.Date; -- starting value
|
|
TableTime(Event.Num,4) := Event.Date; -- Last value
|
|
end if;
|
|
elsif (Event.Emetteur = Capteur_Nord and (Event.Date - TableTime(Event.Num,4)>5.0)) then -- it's hard to do 50m in less than 5 seconds
|
|
if TableNum(Event.Num) = 0 then
|
|
TableTime(Event.Num,2) := Event.Date;
|
|
TableNum(Event.Num):=TableNum(Event.Num)+1;
|
|
end if;
|
|
if TableNum(Event.Num) = 15 then
|
|
TableTime(Event.Num,3) := Event.Date;
|
|
end if;
|
|
elsif Event.Emetteur = Bouton_Fin then
|
|
Running := False;
|
|
end if;
|
|
End loop;
|
|
|
|
for I in 1 .. NB_Swimmer loop
|
|
Arrival(I) := TableTime(I,3);
|
|
end loop;
|
|
|
|
-- We order the table:
|
|
while not Sorted loop
|
|
|
|
for I in 1 .. NB_Swimmer-1 loop
|
|
if Arrival(I)>Arrival(I+1) then
|
|
Temp := Arrival(I);
|
|
Arrival(I) := Arrival(I+1);
|
|
Arrival(I+1) := Temp;
|
|
Temp :=0.0;
|
|
end if;
|
|
end loop;
|
|
|
|
Sorted := True;
|
|
for I in 1 .. NB_Swimmer-1 loop
|
|
if Arrival(I)>Arrival(I+1) then
|
|
Sorted := False;
|
|
end if;
|
|
end loop;
|
|
end loop;
|
|
|
|
for I in 1 .. NB_Swimmer loop
|
|
J := 0;
|
|
while (Arrival(I) /= TableTime(J,3)) loop
|
|
J := J+1;
|
|
end loop;
|
|
|
|
Put_Line("Swimmer " & Integer'Image(J) & " arrived in place " & Integer'Image(I) & " with a time of " & Float'Image(Arrival(I)-TDepart));
|
|
end loop;
|
|
|
|
end Course;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
Put_Line("42");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end td;
|