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.