-- Inputs a numbers in range 0 .. 999 and prints its reverse
-- Demonstrates 2 parameter modes: In and Out
-- In mode parameters are used to send information into a procedure
-- Out mode parameters are used to send information back from a procedure
-- Default mode is In
pragma Ada_2012; -- Make sure 2012 compiler is used. Needed for expression functions.
with ada.text_io; use ada.text_io;
with ada.integer_text_io; use ada.integer_text_io;
procedure modes1 is
subtype Digit is Natural range 0 .. 9;
subtype Small_Nat is Natural range 0 .. 999;
function ones_dig(n: Small_Nat) return Digit is (n mod 10);
function tens_dig(n: Small_Nat) return Digit is ((n / 10) mod 10);
function hundreds_dig(n: Small_Nat) return Digit is (n / 100);
-- Returns the digits of n1
-- Has both In mode and Out mode parameters
procedure find_digits(n: In Small_Nat; d1, d10, d100: Out Digit) is
begin
d1 := ones_dig(n);
d10 := tens_dig(n);
d100 := hundreds_dig(n);
end find_digits;
-- Returns the reverse of n1
function reverse_it(n1: In Small_Nat) return Small_Nat is
d1, d10, d100: Digit;
begin
find_digits(n1, d1, d10, d100);
return 100 * d1 + 10 * d10 + d100;
end reverse_it;
s1: Small_Nat;
begin
get(s1);
put(reverse_it(s1)); -- Call procedure as a statement
exception
when constraint_error => put_line("Value out of range");
when others => put_line("Error occurred");
end modes1;
-- Input: 123
-- Output: 321