Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 8.04 KB | None | 0 0
  1. WITH ada.text_IO; USE ada.text_IO;
  2. WITH ada.Integer_Text_IO; USE ada.integer_text_IO;
  3. --------------------------------------------------------------------------------
  4. --| Assignment 3
  5. --| Zachary
  6. --| NOTES:
  7. --| This program takes a text file and creates an adjacency array.
  8. --| Then loops through and applys Appel and Hakens 4 color theorum.
  9. --| Then each element and its color is output to a text file/screen.
  10. --------------------------------------------------------------------------------
  11. PROCEDURE Assignment_3 IS
  12.  
  13.    --TEXT FILE VARIABLES
  14.    inputFile        : File_Type;
  15.    inputName        : string(1..20);
  16.    outputFile       : File_Type;
  17.    outputName       : string(1..20);
  18.    Last         : integer;
  19.    inNum        : integer;
  20.    array_Length     : integer := 0;
  21.  
  22.  
  23.    --DEFINE POSSIBLE COLORS
  24.    TYPE ColorTypes IS (green, blue, red, orange, empty);
  25.    PACKAGE Color_IO IS NEW Enumeration_IO (enum => ColorTypes);
  26.    USE Color_IO;
  27.  
  28.  
  29.    --DEFINITION OF GRAPH NODES
  30.    TYPE graphNode;
  31.    TYPE graphPtr IS ACCESS graphNode;
  32.    TYPE graphNode IS RECORD
  33.       Element   : integer;
  34.       color     : colorTypes;
  35.       next  : graphPtr;
  36.    END RECORD;
  37.  
  38.  
  39.    --DEFINE RECORD TO USE IN ADJACENCY ARRAY
  40.    TYPE adj_Record IS RECORD
  41.       next  : graphPtr;
  42.    END RECORD;
  43.  
  44.  
  45.    --DEFINE ADJACENCY LIST ARRAY
  46.    SUBTYPE index IS positive RANGE 1..100;
  47.    TYPE adjacency_List IS ARRAY (index) OF adj_Record;
  48.    List : adjacency_List;
  49.  
  50.  
  51.    --DEFINE PROCEDURE TO DETERMINE IF A COLOR IS ADJACENT
  52.    --PRE: Takes a list and boolean color values
  53.    --POST: Passes back all the colors used in the list as "true"
  54.    PROCEDURE isAdjacent
  55.      (List : IN graphPtr;  Blu, Grn, Rd, Org : IN OUT Boolean) IS
  56.    Curr : graphPtr := List;
  57.    BEGIN
  58.       WHILE Curr /= NULL LOOP
  59.          IF Curr.Color = blue THEN
  60.             Blu := True;
  61.          ELSIF Curr.Color = green THEN
  62.             Grn := True;
  63.          ELSIF Curr.Color = red THEN
  64.             Rd := True;
  65.          ELSIF Curr.Color = orange THEN
  66.             Org := True;
  67.          END IF;
  68.          Curr := Curr.Next;
  69.       END LOOP;
  70.    END isAdjacent;
  71.  
  72.  
  73.    --DEFINE COLORING NODES HELPER FUNCTION
  74.    --PRE: takes in a list, element, color
  75.    --POST: returns the list with all nodes of "element" colored
  76.    PROCEDURE colorAll
  77.      (L : IN OUT adjacency_List; E : IN integer; LengthL : IN integer; Color : IN ColorTypes) IS
  78.       tempPtr : graphPtr;
  79.    BEGIN
  80.  
  81.       FOR i IN 1..lengthL LOOP
  82.          tempPtr := L(i).next;
  83.          WHILE tempPtr /= NULL LOOP
  84.             IF tempPtr.Element = E THEN
  85.                tempPtr.Color := Color;
  86.                tempPtr := tempPtr.Next;
  87.             ELSE
  88.                tempPtr := TempPtr.Next;
  89.             END IF;
  90.          END LOOP;
  91.       END LOOP;
  92.    END colorAll;
  93.  
  94.  
  95.    --DEFINE PROCEDURE TO ASSIGN COLORS TO EACH NODE IN A GRAPH
  96.    --PRE: Takes in a graph
  97.    --POST: Returns graph such that no two nodes have the same color
  98.    PROCEDURE assignColors
  99.      (Graph : IN OUT adjacency_List; Length : IN integer) IS
  100.  
  101.       Blu     : Boolean  := False;
  102.       Grn     : Boolean  := False;
  103.       Rd      : Boolean  := False;
  104.       Org     : Boolean  := False;
  105.       CurrentL    : graphPtr;
  106.       TempPtr     : graphPtr;
  107.       Tempcolor   : ColorTypes := empty;
  108.  
  109.    BEGIN
  110.  
  111.       FOR i IN 1..array_length LOOP
  112.          TempPtr  := Graph(i).Next;
  113.          currentL := Graph(i).Next;
  114.          Blu := False;
  115.          Grn := False;
  116.          Rd  := False;
  117.          Org := False;
  118.  
  119.          IF tempPtr.Color = empty THEN
  120.  
  121.             isAdjacent(List => currentL,
  122.                        Blu  => Blu,
  123.                        Grn  => Grn,
  124.                        Rd   => Rd,
  125.                        Org  => Org);
  126.  
  127.             IF Blu = False THEN
  128.                tempPtr.Color := Blue;
  129.                tempColor := Blue;
  130.             ELSIF Grn = False THEN
  131.                tempptr.Color := Green;
  132.                tempColor := Green;
  133.             ELSIF Rd = False THEN
  134.                tempptr.Color := Red;
  135.                tempColor := red;
  136.             ELSE
  137.                tempptr.Color := Orange;
  138.                tempColor := Orange;
  139.             END IF;
  140.  
  141.             ColorALL(L       => Graph,
  142.                      E       => tempptr.element,
  143.                  LengthL => length,
  144.                      Color   => tempColor);
  145.  
  146.             ELSE
  147.                TempPtr := TempPtr.Next;
  148.  
  149.          END IF;
  150.          tempColor := empty;
  151.  
  152.       END LOOP;
  153.    END assignColors;
  154.  
  155.  
  156.    --DEFINE PROCEDURE TO ADD A NODE
  157.    --PRE: Takes in a graph, a node to be added
  158.    --POST: Passes out a graph(adj list) with the added node.
  159.    PROCEDURE insertNode (G : IN OUT graphPtr; E : IN integer) IS
  160.    P : graphPtr := G;
  161.    BEGIN
  162.       IF P = NULL THEN
  163.          P := NEW graphNode'(Element => E, Color => empty, Next => NULL);
  164.       ELSE
  165.          insertNode(G => P.next, E => E);
  166.       END IF;
  167.       G := P;
  168.    END insertNode;
  169.  
  170.    temp     : integer := 0;
  171.    tempPtr  : graphPtr := NULL;
  172.    outPtr   : graphPtr;
  173.  
  174.  
  175. BEGIN --------*** Assignment 3 ***----------
  176.  
  177.    --PROMPT FOR INPUT FILE
  178.    Put("Enter Adjacency List File Name: ");
  179.    Get_Line(Item => inputName, Last => Last);
  180.    Open (File => inputFile, mode => ada.Text_IO.In_File, Name => inputName(1..Last));
  181.    New_Line;
  182.  
  183.  
  184.    --READS EACH LINE AND BUILD THE GRAPH
  185.    WHILE End_Of_File(File => inputFile) = False LOOP
  186.  
  187.       --RETRIEVE FIRST ELEMENT IN THE LINE
  188.       TempPtr := Null;
  189.       Get (Item => inNum, file => inputFile);
  190.       --ADD NODE
  191.       insertNode(G => TempPtr, E => inNum);
  192.       List(inNum).Next := TempPtr;
  193.  
  194.       WHILE End_Of_Line(File => inputFile) = False LOOP
  195.          --RETRIEVE THE REST OF THE ELEMENTS IN THE LINE
  196.          Get (Item => temp, file => inputFile);
  197.          TempPtr := List(inNum).Next;
  198.          --ADD NODE
  199.          insertNode(G => TempPtr, E => temp);
  200.          List(inNum).Next := TempPtr;
  201.       END LOOP;
  202.  
  203.       --INCRIMENT "LENGTH OF ARRAY"
  204.       array_Length := array_Length + 1;
  205.       Skip_Line(File => inputFile);
  206.  
  207.    END LOOP;
  208.  
  209.  
  210.    --CLOSE INPUT FILE
  211.    close(File => inputFile);
  212.  
  213.  
  214.    --OUTPUT NUBER OF NODES IN THE GRAPH
  215.    put("# Nodes: ");
  216.    ada.Integer_Text_IO.put(array_length,Width =>  3);
  217.    New_Line(2);
  218.  
  219.  
  220.    --PROMPT FOR OUTPUT FILE
  221.    Put("Enter Output File: ");
  222.    Get_Line(Item => outputName, Last => Last);
  223.    Open (File => outputFile, mode => ada.Text_IO.Out_File, Name => outputName(1..Last));
  224.    New_Line;
  225.  
  226.  
  227.    --ASSIGN COLORS TO THE GRAPH
  228.    assignColors(Graph   => List,
  229.                 Length  => array_Length);
  230.  
  231.  
  232.    --WRITE FULL ADJ LIST TO SCREEN
  233.    put("Adjacency List:");
  234.    new_line;
  235.    FOR i IN 1..array_length LOOP
  236.       outPtr := List(i).next;
  237.       LOOP
  238.          put(integer'image(outptr.element));
  239.          put(item => outptr.color);
  240.          IF i <= 9 THEN
  241.             put("     ");
  242.          ELSE
  243.             put("    ");
  244.          END IF;
  245.  
  246.          IF outPtr.Next /= NULL THEN
  247.             outPtr := outPtr.Next;
  248.          ELSE
  249.             EXIT;
  250.          END IF;
  251.       END LOOP;
  252.    New_Line;
  253.    END LOOP;
  254.    New_Line;
  255.  
  256.  
  257.    --WRITE NODES AND ASSIGNED COLORS TO THE TEXT FILE/SCREEN
  258.    put("Color Assignments");
  259.    New_Line;
  260.    FOR i IN 1..Array_Length LOOP
  261.       --OUTPUT TO SCREEN
  262.       put(integer'image(List(i).Next.element));
  263.       IF i <= 9 THEN
  264.          put("     ");
  265.       ELSE
  266.          put("    ");
  267.       END IF;
  268.       put(List(i).Next.Color);
  269.       New_Line;
  270.       --OUTPUT TO TEXT FILE
  271.       put(Item => integer'image(List(i).Next.element), File => outputFile);
  272.       IF i < 9 THEN
  273.          put(Item => "     ", File => outputFile);
  274.       ELSE
  275.          put(Item => "    ", File => outputFile);
  276.       END IF;
  277.       put(item => List(i).Next.color, File => outputFile);
  278.       New_Line(File => outputFile);
  279.    END LOOP;
  280.  
  281.  
  282.    --CLOSE OUTPUT FILE
  283.    close(File => outputFile);
  284.    new_line;
  285.  
  286.  
  287.    --NOTIFY COLORS ASSIGNMENT COMPLETE AND OUTPUT FILE COMPLETED
  288.    put("Colors assigned and written to output file.");
  289.    New_Line(2);
  290.  
  291.  
  292.    --NOTIFY USER OF SUCCESSFUL COMPLETION.
  293.    Put("END OF PROGRAM.");
  294.    New_Line(2);
  295.  
  296. END Assignment_3;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement