with ada.text_io; use ada.text_io;

with ada.integer_text_io; use ada.integer_text_io;

procedure table3c is

    -- 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;


    procedure putRows(sInt, fInt, sPow, fPow: Integer) is
        tempInt: Integer;

    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;

    procedure getData(sI, fI, sP, fP: out Integer) is
    begin
        loop
            put("Enter starting integer: ");
            get(sI);
            exit when sI > -1;
            put_line("Integer must be non-negative.");
        end loop;

        loop
            put("Enter ending integer: ");
            get(fI);
            exit when fI > sI;
            put_line("Ending integer must be larger than starting.");
        end loop;

        loop
            put("Enter starting power: ");
            get(sP);
            exit when sP > -1
            put_line("Power must be non-negative.");
        end loop;

        loop
            put("Enter ending power: ");
            get(fP);
            exit when fP > sP;
            put_line("Ending power must be larger than starting.");
        end loop;

    end getData;


    startI, finishI: Integer;
    startPower, finishPower: Integer;

begin

    getData(StartI, finishI, startPower, finishPower);

    new_line;
    putHeader(startPower, finishPower);

    putRows(startI, finishI, startPower, finishPower);

end table3c;