with ada.text_io; use ada.text_io; 
with ada.integer_text_io; use ada.integer_text_io; 
with ada.float_text_io; use ada.float_text_io; 
 
procedure g1procsv3 is

    -- Input and the range values and put them in order
    -- Low, high: return endpoints of inclusive range
    procedure input_range(low, high: out Integer) is
    begin
        -- Input the range values
        get(low);
        get(high);

        -- Put range values into nondescending order
        if low > high then
            declare                       -- Declare a variable
                t: Integer := low;
            begin
                low := high;
                high := t;
            end;
        end if;
    end input_range;

    -- Input the numbers and count their locations within the range
    --      specified by low and high
    -- Parameters:
    -- low, high: endpoints of inclusive range
    -- l, e, h: return frequency counts for low, within, and high values
    procedure input_and_process_remaining(low, high: Integer; 
        l, e, h: out Natural) is
        num: Integer;
    begin
        -- Initialize the counts
        l := 0;
        e := 0;
        h := 0;
        -- Get and count the values
        while not end_of_file loop
            get(num);
            if num < low then
                l := l + 1;
            elsif num <= high then
                e := e + 1;
            else -- num > rhi
                h := h + 1;
            end if;
        end loop;
    end input_and_process_remaining;

    -- Print one line of the results
    -- Parameters:
    -- s: label of result
    -- i: count to display
    -- i: total count for calculating percentages
    procedure putline(s: String; i, n: natural) is
        -- Percentage that i is to n
        pct: constant float := 100.0 * float(i) / float(n);
    begin
        put(s);
        set_col(14);                 -- Move to the correct column
        put(i);
        put(" ");
        put(pct, fore => 4, aft => 1, exp => 0);
        put("%");
        new_line;
    end putline;

    -- Calculates percentages and outputs results for l, e, and h and their total
    -- Parameters:
    -- l, e, h: frequency counts for low, within, and high values, respectively
    procedure calculate_percent_and_output_results(l, e, h: Natural) is
        total: constant Natural := l + e + h;
    begin
        putline("Below Range:", l, total);
        putline("Within Range:", e, total);
        putline("Above Range:", h, total);
        putline("Total:", total, total);
    end calculate_percent_and_output_results;

    -- Variables for main routine
    low, high: Integer;     -- Endpoints for inclusive range
    lo, eq, hi: natural;    -- Frequency counts for each range
begin
    input_range(low, high);
    input_and_process_remaining(low, high, lo, eq, hi);
    calculate_percent_and_output_results(lo, eq, hi);
end g1procsv3;