Calculating change in Ada
Currency_Names, Currency_Counts and Currency_Index all use the same range,
so it is better to declare a ranged type (or a subtype):

   type Index is range 1..10;
   Currency_Names  : array (Index) of Currency_Denomination;
   Currency_Counts : array (Index) of Integer := (others=&gt;0);
   Currency_Index  : Index;


To loop backwards, it is better to use the reverse keyword:

   -- calculate needed currency
   for I in reverse Currency_Names'Range loop
      while Input_Amount &gt;= Currency_Names(I).Value loop
         Input_Amount := Input_Amount - Currency_Names(I).Value;
         -- increment currency useage in array
         Currency_Counts(I) := Currency_Counts(I) + 1;
      end loop;
   end loop;

   -- display needed currency
   for I in Currency_Counts'Range loop
      -- do not display unused currency
      if Currency_Counts(I) /= 0 then
        Text_IO.Put(Currency_Names(I).Name &amp; " ");
        Integer_Text_IO.Put(Currency_Counts(I));
        Text_IO.New_Line;
      end if;
   end loop;


A nice side-effect is that the index of Currency_Counts will now correspond to the index of Currency_Names, no need to calculate the index anymore, and the Currency_Index variable is no longer needed.