with ada.text_io; use ada.text_io;

with ada.integer_text_io; use ada.integer_text_io;

procedure table3a is

    -- Outputs the header for the table
    -- Outputs header for first column plus one column for each integer 
    -- in the range sPow .. fPow
    -- Precondition: sPow, fPow in 1 .. 99
    procedure putHeader(sPow, fPow: Integer) is
    begin
        -- First column
        put("          I");

        -- Columns for powers
        for i in sPow .. fPow loop

            if i in 1 .. 9 then
                put("       I**");
            else
                put("      I**");
            end if;

            put(i, 1);

        end loop;
        new_line;

        -- Add one to fPow to account for column for I
        for i in sPow .. fPow + 1 loop
            put("-----------");
        end loop;
        new_line;

    end putHeader;


    -- Outputs all of the rows of the table
    -- Outputs one row for each integer in range sInt .. fInt
    -- Outputs one column for each integer in range sPow .. fPow
    procedure putRows(sInt, fInt, sPow, fPow: Integer) is

        tempInt: Integer;    -- Local variable for putRows

    begin
        for i in sInt .. fInt loop

            put(i);

            for j in sPow .. fPow loop

                tempInt := i ** j;
                put(tempInt);

            end loop;

            new_line;
        end loop;

    end putRows;

    -- Variables for main routine
    startI: Integer := 2;
    finishI: Integer := 11;

    startPower: Integer := 2;
    finishPower: Integer := 4;

begin

    putHeader(startPower, finishPower);

    putRows(startI, finishI, startPower, finishPower);

end table3a;