PROGRAM 5
-- Filename: program5.adb Author: Anthony F. Ortiz
-- This program reads any number greater than 10 and less than 10000
-- (except for same number digits, 1, 11, 111, 1111, etc.), puts its
-- digits in a array, sorts them, subtracts descending order from
-- ascending order, prints each subtraction, and loops until the
-- number equals 6174.
with Text_IO; use Text_IO;
-- This is the main program.
procedure Game_6174 is
package Int_IO is new Integer_IO (Integer); use Int_IO;
type Int_Array is Array (0..3) of Integer; -- An array from 0 to 3.
Number : Integer; -- Starting number.
Number_Array : Int_Array; -- Array for the digits.
-- Gets a number from the keyboard.
procedure Get_Number (Number : in out Integer) is
begin
Put ("Enter a 4 digit number. ");
Get (Number);
New_Line;
New_Line;
Put ("The iterations are");
New_Line;
end Get_Number;
-- Puts each digit of the number into an array.
procedure Get_Digits (Number : in out Integer;
Number_Array : in out Int_Array) is
I : Integer; -- Count the number of digits.
begin
I := 0;
while (I /= 4) loop
Number_Array (I) := Number mod 10;
Number := Number / 10;
I := I + 1;
end loop;
end Get_Digits;
-- A swap procedure used for the selection sort.
procedure Swap (A : in out Integer; B : in out Integer) is
Temp : Integer; -- Holds the value in variable A.
begin
Temp := A;
A := B;
B := Temp;
end Swap;
-- Sorts the array of digits using a selection sort.
procedure Sort (Number_Array : in out Int_Array) is
Top : Integer; -- Variable for selection sort.
N : Integer; -- Number of digits in array.
Largestindex : Integer; -- Variable for selection sort.
J : Integer; -- Variable for selection sort.
begin
N := Number_Array'Last;
for Top in 0..N - 1 loop
Largestindex := Top;
for J in Top + 1..N loop
if (Number_Array (J) > Number_Array (Largestindex)) then
Largestindex := J;
end if;
end loop;
Swap (Number_Array (largestindex), Number_array (top));
end loop;
end Sort;
-- Subtract the descending number from the ascending number.
procedure Subtract (Number : in out Integer; Number_Array : in Int_Array) is
Ascending_Number : Integer; -- Number with digits in ascending order.
Descending_Number : Integer; -- Number with digits in descending order.
begin
Ascending_Number := 1000 * Number_Array (3) + 100 * Number_Array (2) +
10 * Number_Array (1) + Number_Array (0);
Descending_Number := 1000 * Number_Array (0) + 100 * Number_Array (1) +
10 * Number_Array (2) + Number_Array (3);
Number := Descending_Number - Ascending_Number;
end Subtract;
-- Print the result of the subtraction.
procedure Print_Number (Number : in Integer) is
begin
New_Line;
Put (Number, 10);
end Print_Number;
begin
Get_Number (Number);
while (Number /= 6174) loop
Get_Digits (Number, Number_Array);
Sort (Number_Array);
Subtract (Number, Number_Array);
Print_Number (Number);
end loop;
end Game_6174;
-- outfile: prog5.out
Enter a 4 digit number. 1000
The iterations are
999
8991
8082
8532
6174
BACK TO CS3120 PAGE.