-- Exo 1a
x <= y <= z <=> x <= y and y <= z
-- Exo 1b
max(x, y) <= z <=> (x >= y and x <= z) or (x < y and y <= z)
<=> x <= z and y <= z
min(x, y) >= z <=> (x <= y and x >= z) or (x > y ans y >= z)
<=> x >= z and y >= z
-- Exo 1c
max(x, y) >= z <=> (x >= y and x >= z) or (x < y and y >= z)
<=> x >= z or y >= z
min(x, y) <= z <=> (x <= y and x <= z) or (x > y ans y <= z)
<=> x <= z or y <= z
-- Exo 1d
Solution Patrice :
---------------------
IF x <= y THEN
IF y > z THEN
IF x <= z THEN -- x <= z < y
y <-> z
ELSE -- z < x <= y
x <- z <- y <- x -- simultanément, faut adapter avec la var aux
END IF
ELSE -- x <= y <= z
NULL ;
ELSE -- x > y
IF y <= z THEN -- x ? z
IF x <= z THEN -- y < x <= z
x <-> y
ELSE -- y <= z < x
x <- y <- z <- x
END IF
ELSE -- x > y > z
x <-> z
END IF
END IF
Solution Sylvie :
--------------------
(Dans X,Y, et Z, on a respectivement A,B,et C au départ)
if X > Y then
Echanger X et Y
end if;
------ maintenant X = min(A,B) - Y=max(A,B)
if Y > Z then
Echanger Y et Z
end if;
------- maintenant Z = max(Y,Z) = max(A,B,C) : il reste à
------- éventuellement ordonner X et Y
if X > Y then
Echanger X et Y
end if;
-- Exo 1e
(année mod 400 = 0) or (année mod 4 = 0 and année mod 100 <> 0)
-- Exo 2a
function isTriangle(a, b, c : in Natural) return boolean is
begin
return a <= b + c and b <= a + c and c <= a + b;
end;
-- Exo 2b
function isRectangledTriangle(a, b, c : in Natural) return boolean is
begin
return a**2 = b**2 + c**2 or b**2 = a**2 + c**2 or c**2 <= a**2 + b**2;
end;
-- Exo 2c
function min3(a, b, c : in Natural) return boolean is
begin
if a <= b and a <= c then
return a;
elsif b <= c then
return b;
else
return c;
end if;
end;
function min3(a, b, c : in Natural) return boolean is
begin
return Natural'Min(a, Natural'Min(b, c));
end;
-- Exo 3a
function isPerfectSquare_1(n : in Natural) return boolean is
p : natural;
begin
p := 1;
while (p + 1)**2 <= n loop
p := p + 1;
end loop
return p ** 2 = n;
end
-- Exo 3c
function naturalSqrt(n : in Natural) return natural is
p : natural;
begin
p := 1;
while (p + 1)**2 <= n loop
p := p + 1;
end loop
return p;
end
-- Exo 4
function isPrimeNumber_naif(n : Natural) return boolean is
nbDiviseur : Natural := 0;
begin
for i in 1..n loop
if n mod i = 0 then
nbDiviseur := nbDiviseur + 1;
end if;
end loop;
return n = 2;
end;
function isPrimeNumber_Optimisation_1(n : Natural) return boolean is
nbDiviseur : Natural := 0;
begin
i := 2;
loop
exit when i**2 >= n;
if n mod i = 0 then
return false;
end if;
i := i + 1;
end loop;
return true;
end;
function isPrimeNumber_Optimisation_2(n : Natural) return boolean is
nbDiviseur : Natural := 0;
i : Natural;
begin
if n = 2 then
return true;
end if;
if n mod 2 = 0 or n = 1then
return false;
end if;
i := 3;
loop
exit when i**2 >= n;
if n mod i = 0 then
return false;
end if;
i := i + 2;
end loop;
return true;
end;
-- Exo 5a
somme : Natural := 0;
n : Natural := 0;
tmp : Natural := 0;
begin
loop
get(tmp);
exit when tmp = 0;
n := n + 1;
somme := somme + tmp;
end loop;
if n /= 0 then
put(Float(somme) / Float(n));
end if;
end;
-- Exo 5b
max : Natural := 0;
tmp : Natural;
begin
loop
get(tmp);
exit when tmp = 0;
if tmp > max then
max := tmp;
end if
end loop;
put(max);
end;
-- Exo 5c
max : Natural := 0;
occ : Natural := 0;
tmp : Natural := 0;
begin
loop
get(tmp);
exit when tmp = 0;
if tmp > max then
max := tmp;
occ := 1;
elsif tmp = max then
occ := occ + 1;
end if;
end loop;
put(max); put(" : "); put(occ);
end;
-- Exo 6a
a, b, c, d : float;
begin
get(a); get(b); get(c);
d := b**2 - 4 * a * c;
if d = 0 then
put("1 solution : ");
put(-b / (2 * a));
elsif d > 0 then
put("2 solutions : ");
put((-b + sqrt(d)) / (2 * a));
put((-b - sqrt(d)) / (2 * a));
else
put("Aucune solution dans R");
end if;
end;
-- Exo 6b
-- pour d = b**2 - 4*a*c > 0
-- soit t = -(b + sign(b) * sqrt(b**2 - 4*a*c)) / 2
-- alors r1 = t / a
-- et r2 = c / t (car r1 * r2 = c / a)
function sign(x : float) return float is
begin
if x < 0 then
return -1.0;
else
return 1.0;
end if;
end;
a, b, c, d : float;
t : float;
begin
get(a); get(b); get(c);
d := b**2 - 4 * a * c;
if d = 0 then
put("1 solution : ");
put(-b / (2 * a));
elsif d > 0 then
put("2 solutions : ");
t = -(b + sign(b) * sqrt(b**2 - 4*a*c)) / 2;
put(t / a);
put(c / t);
else
put("Aucune solution dans R");
end if;
end;
-- Exo 7abcd
type T_IntArray is array (Integer range <>) of Integer;
procedure PascalTriangle(N : Natural) is
T : T_IntArray(1..N);
Last, tmp : Natural;
begin
for I in T'Range loop
T(I) := 0;
end loop;
t(1) := 1;
for I in 1..N loop
Last := 0;
for j in 1..i loop
Tmp := T(J);
T(J) := last + T(J);
Last := Tmp;
put(t(j), 5);
end loop;
New_Line;
end loop;
end;
-- Exo 8a
b, n : Natural;
while n /= 0 loop
put(n mod b);
n = n / b;
end loop;