DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦b5d6ee42a⟧ Ada Source

    Length: 9216 (0x2400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Magic_Square, seg_03dfee

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Io;
with Text_Io;
package body Magic_Square is
    procedure Move (D : Direction;
                    Row_Position : in out Integer;
                    Col_Position : in out Integer;
                    Tab_Size : in out Integer) is
    begin
        case D is
            when Sud_Ouest =>
                Row_Position := ((Row_Position + 1) mod (Tab_Size + 1));
                if Row_Position = 0 then
                    Row_Position := 1;
                end if;
                Col_Position := Col_Position - 1;
                if Col_Position = 0 then
                    Col_Position := Tab_Size;
                end if;
            when Nord_Est =>
                Row_Position := Row_Position - 1;
                if Row_Position = 0 then
                    Row_Position := Tab_Size;
                end if;
                Col_Position := ((Col_Position + 1) mod (Tab_Size + 1));
                if Col_Position = 0 then
                    Col_Position := 1;
                end if;
            when Nord_Ouest =>
                Row_Position := Row_Position - 1;
                if Row_Position = 0 then
                    Row_Position := Tab_Size;
                end if;
                Col_Position := Col_Position - 1;
                if Col_Position = 0 then
                    Col_Position := Tab_Size;
                end if;
            when Nord =>
                Row_Position := Row_Position - 1;
                if Row_Position = 0 then
                    Row_Position := Tab_Size;
                end if;
            when others =>
                null;
        end case;
    end Move;


    procedure Go_To_Center (Row_Position : in out Integer;
                            Col_Position : in out Integer;
                            Tab_Size : Integer) is
    begin
        Row_Position := Tab_Size / 2 + 1;
        Col_Position := Tab_Size / 2 + 1;
    end Go_To_Center;


    procedure Init_Square (Row_Position : in out Integer;
                           Col_Position : in out Integer;
                           Tab_Size : Integer) is
        I : Integer;
        J : Integer;
    begin
        for I in 1 .. Tab_Size loop
            for J in 1 .. Tab_Size loop
                Tab (I, J) := 0;
            end loop;
        end loop;
        Go_To_Center (Row_Position, Col_Position, Tab_Size);
    end Init_Square;

    procedure Affichage (Tab_Size : Integer) is
        I, J : Integer;
    begin
        Text_Io.Put (" |-");
        for I in 1 .. (Tab_Size * 2 - 1) loop
            Text_Io.Put ("---");
        end loop;
        Text_Io.Put_Line ("-| ");

        for I in 1 .. Tab_Size loop

            Text_Io.Put (" | ");
            for J in 1 .. Tab_Size loop
                Io.Put (Tab (I, J), Width => 3);
                Text_Io.Put (" | ");
            end loop;
            Text_Io.Put_Line ("");

            Text_Io.Put (" |-");
            for I in 1 .. (Tab_Size * 2 - 1) loop
                Text_Io.Put ("---");
            end loop;
            Text_Io.Put_Line ("-|");
        end loop;

    end Affichage;

    procedure Calcul_Tableau (Row_Position : in out Integer;
                              Col_Position : in out Integer;
                              Tab_Size : in out Integer) is
        I, J, Token : Integer;
        Tab_Capacity : Integer := Tab_Size * Tab_Size;
        Dir : Direction;
    begin
        Token := 1;
        Dir := Nord;
        Move (Dir, Row_Position, Col_Position, Tab_Size);
        Tab (Row_Position, Col_Position) := Token;
        Dir := Nord_Est;
        Token := Token + 1;
        Move (Dir, Row_Position, Col_Position, Tab_Size);
        while Token <= Tab_Capacity loop
            if Tab (Row_Position, Col_Position) = 0 then
                Tab (Row_Position, Col_Position) := Token;
                Token := Token + 1;
                Dir := Nord_Est;
                Move (Dir, Row_Position, Col_Position, Tab_Size);
            else
                Dir := Sud_Ouest;
                Move (Dir, Row_Position, Col_Position, Tab_Size);
                Dir := Nord_Ouest;
                Move (Dir, Row_Position, Col_Position, Tab_Size);  
                Dir := Nord_Est;
                Move (Dir, Row_Position, Col_Position, Tab_Size);
            end if;
        end loop;
    end Calcul_Tableau;

    procedure Run (Tab_Size : in out Integer) is
        Row_Position : Integer;
        Col_Position : Integer;
    begin
        Init_Square (Row_Position, Col_Position, Tab_Size);
        Go_To_Center (Row_Position, Col_Position, Tab_Size);
        Calcul_Tableau (Row_Position, Col_Position, Tab_Size);
        Affichage (Tab_Size);
    end Run;

    procedure Run2 is
        Nombre_Pair, Nombre_Trop_Grand : exception;
        Test : Integer;
        Tab_Size : Integer := 5;
    begin
        Gogo:
            loop
                Text_Io.Put_Line ("Donnez la taille du tableau");
                Io.Get (Tab_Size);
                if Tab_Size >= 100 then
                    raise Nombre_Trop_Grand;
                    exit Gogo;
                end if;
                Test := (Tab_Size mod 2);
                if (Test = 0) then
                    Text_Io.Put_Line ("Nombre_Pair");
                    raise Nombre_Pair;
                    exit Gogo;
                end if;
                Text_Io.Put_Line ("");
                Run (Tab_Size);
                Text_Io.Put_Line ("");
            end loop Gogo;
        Text_Io.Put_Line ("Out Loop");
    exception
        when Nombre_Trop_Grand =>
            Text_Io.Put_Line ("Exception : array overflow");
        when Nombre_Pair =>
            Text_Io.Put_Line ("Exception : array size must be odd");
        when others =>
            Text_Io.Put_Line ("Fatal error");
    end Run2;
end Magic_Square;

E3 Meta Data

    nblk1=8
    nid=5
    hdr6=e
        [0x00] rec0=1b rec1=00 rec2=01 rec3=032
        [0x01] rec0=1f rec1=00 rec2=06 rec3=010
        [0x02] rec0=20 rec1=00 rec2=03 rec3=01c
        [0x03] rec0=1b rec1=00 rec2=04 rec3=004
        [0x04] rec0=1b rec1=00 rec2=08 rec3=004
        [0x05] rec0=1b rec1=00 rec2=07 rec3=00e
        [0x06] rec0=02 rec1=00 rec2=02 rec3=000
        [0x07] rec0=88 rec1=5f rec2=76 rec3=580
    tail 0x2173d3c2885fd74ce2372 0x42a00088462060003
Free Block Chain:
  0x5: 0000  00 00 00 a9 80 03 65 29 3b 03 00 22 20 20 20 20  ┆      e);  "    ┆