Test ADA en INFO1

Test d'ALGO1 pour les INFO1 : le texte du test PDF et ses sources TEX
et une proposition de correction de la question 1 :

Ada
with  ada.Text_IO,ada.Integer_Text_IO; 
use  ada.Text_IO,ada.Integer_Text_IO;
 
 
 
procedure Test1 is
   N,S : Integer;
   
   function SommeChiffres_rec(N: in Integer) return Integer is
      Q : Integer;
   begin
      Q := N/10;
      if Q = 0 then 
         return N;
      else
         return (N rem 10) + SommeChiffres_rec(Q);
      end if;
   end; 
   
   function SommeChiffres_tq(N: in Integer) return Integer is
      Q,S : Integer;
   begin
      Q := N;
      S := 0;
      while Q > 0 loop 
         S := S + (Q rem 10);
         Q := Q / 10;
      end loop;
      return S;
   end; 
   
   procedure SommeChiffres_rj(N: in Integer; S: out Integer) is
      Q : Integer;
   begin
      Q := N;
      S := 0;
      loop 
         S := S + (Q rem 10);
         Q := Q / 10;
         exit when Q = 0;
      end loop;
   end; 
   
   
begin
   Put("N ? ");
   Get(N);
   Put(SommeChiffres_rec(N));
   Put(SommeChiffres_tq(N));
   SommeChiffres_Rj(N,S);
   Put(S);
end;

et de la question 2 :

Ada
with  ada.Text_IO,ada.Integer_Text_IO; 
use  ada.Text_IO,ada.Integer_Text_IO;
 
 
 
procedure Test2 is
   N : Integer;
   
   
   function Fibo_Rec(N: in Integer) return Integer is
   begin
      if N = 0 then
         return 0;
      elsif N = 1 then
         return 1;
      else 
         return Fibo_Rec(N-1) + Fibo_Rec(N-2);
      end if;
   end;
 
   function Fibo_Pour(N: in Integer) return Integer is
      A,B,C : Integer;
   begin
      if N = 0 then
         return 0;
      elsif N = 1 then
         return 1;
      else 
         A := 0;
         B := 1;
         for I in 2..N loop
            C := A + B;
            A := B;
            B := C;
         end loop;
           return C;
      end if;
   end;
 
   function Fibo_tq(N: in Integer) return Integer is
      A,B,C,I : Integer;
   begin
      if N = 0 then
         return 0;
      elsif N = 1 then
         return 1;
      else 
         A := 0;
         B := 1;
         I := 2;
         while I <= N loop
            C := A + B;
            A := B;
            B := C;
            I := I+1;
         end loop;
           return C;
      end if;
   end;
   
begin
   Put("N ? ");
   Get(N);
   Put(Fibo_Rec(N));
   Put(Fibo_pour(N));
   Put(Fibo_tq(N));
end;

courtesy of webmatter.de