Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 7.12 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. WITH Fib_Package;
  4. --------------------------------------------------------------------------------
  5. --| Assignment 4
  6. --| Zachary
  7. --| NOTES: takes in a number 'n' between 4 and 25 & returns 'n' such that
  8. --|         T(n) = T(n-1) ^ T(n-2) ^ T(n-3) ^ T(-4) ASSUMING
  9. --|         T(0) = A, T(1) = T, T2 = C, T(3) = G
  10. --| ***PRESS ENTER WHEN PROGRAM COMPLETES***
  11. --| Text File crashes when input exceeds 22
  12. --------------------------------------------------------------------------------
  13. PROCEDURE Assignment_4 IS
  14.  
  15.    --define program variables
  16.    n        : Natural;
  17.    outFile  : File_Type;
  18.    outName  : string(1..32);
  19.    last     : integer;
  20.    N_string : string(1..3412255); --largest string possible when n=25
  21.    Length   : integer;
  22.  
  23.    --Define Package
  24.    PACKAGE Fib_Pack IS NEW Fib_Package (ElementType => integer);
  25.    USE Fib_Pack;
  26.  
  27. BEGIN --Assignment_4
  28.  
  29.    --get a proper "n" value
  30.    LOOP
  31.       new_Line;
  32.       put("enter an integer between 4 and 25: ");
  33.       get(n);
  34.  
  35.       IF n < 4 OR n > 25 THEN
  36.          put("INVALID INPUT");
  37.          new_line;
  38.       ELSE
  39.          skip_line;
  40.          EXIT;
  41.       END IF;
  42.    END LOOP;
  43.  
  44.    --prompt for outfile name
  45.    put("enter an output file: ");
  46.    get_line(item => outName, last => last);
  47.    open(File => outfile, Mode => Out_File, Name => outname(1..last));
  48.    New_Line;
  49.  
  50.    --Call Fill_Array to create array of 1..n values
  51.    Compute_Fib(n => n,
  52.                n_Length => Length,
  53.                Data  => N_String);
  54.  
  55.    --Output Fib_Seq to screen
  56.    put("Fib Value of ");
  57.    put(n, width => 2);
  58.    put(": ");
  59.    put_line(n_String(1..(Length)));
  60.  
  61.    --output number of chars in the fib sequence
  62.    put("# of chars: ");
  63.    put(item => Length, width => 6);
  64.    new_Line(2);
  65.  
  66.    --Output Fib_Seq to file
  67.    put(item => ("# of chars: "), File => outfile);
  68.    put(item => Length, width => 6, File => outfile);
  69.    new_Line(File => outfile);
  70.    put(item => "Fibonacci Value of ", file => outFile);
  71.    put(Item => n, width => 2, file => outFile);
  72.    put(item => ":", File => outFile);
  73.    new_line(File => outfile);
  74.    put_line(Item => (n_String(1..(Length))), File => outFile);
  75.  
  76.    --Close output text file
  77.    close(File => outfile);
  78.  
  79.    --notify of file completion
  80.    put("Data Output to File.");
  81.    new_Line(2);
  82.  
  83.    --notify of program completion
  84.    put("Program 4 Completed.");
  85.    new_line(2);
  86.  
  87.    --Makes program hang while using command line so output is readable
  88.    put("<<< Press Enter To Exit >>>");
  89.    skip_line;
  90.  
  91. END Assignment_4;
  92.  
  93. --------------------------------------------------------------------------------
  94. --------------------------------------------------------------------------------
  95.  
  96. GENERIC
  97.    TYPE ElementType IS PRIVATE;
  98. PACKAGE Fib_Package IS
  99. --------------------------------------------------------------------------------
  100. --| Specification of Fibonacci Sequence Package
  101. --| Zachary
  102. --------------------------------------------------------------------------------
  103.  
  104. TYPE nPtr IS LIMITED PRIVATE;
  105.  
  106.    --PROCEDURE DEFINITIONS
  107.  
  108.    PROCEDURE Compute_Fib (n : IN integer; n_Length : OUT integer; data : IN OUT String);
  109.    --PRE: take in an integer 'n' & an array of pointers
  110.    --POST: passes out the array with correct fib values
  111.  
  112. PRIVATE
  113.  
  114.    TYPE nNode;
  115.    TYPE nPtr IS ACCESS nNode;
  116.    TYPE nNode IS RECORD
  117.       Val   : string(1..3412255); --largest string possible when n=25
  118.       Length    : integer;
  119.       next  : nptr;
  120.    END RECORD;
  121.  
  122. END Fib_Package;
  123.  
  124. --------------------------------------------------------------------------------
  125. --------------------------------------------------------------------------------
  126.  
  127. WITH ada.text_IO;
  128. USE ada.text_IO;
  129. WITH ada.Integer_Text_IO;
  130. USE ada.integer_text_IO;
  131. WITH ada.Unchecked_Deallocation;
  132. --------------------------------------------------------------------------------
  133. --| Body of Fibonacci Sequence Package
  134. --| Zachary
  135. --------------------------------------------------------------------------------
  136.  
  137. PACKAGE BODY Fib_Package IS
  138.  
  139.    --declare unchecked deallocation
  140.    PROCEDURE Dispose IS NEW ada.Unchecked_Deallocation
  141.       (Object => nNode, Name => nPtr);
  142.  
  143.    --Computes the fib value of a given 'n' integer
  144.    --PRE: take in an integer 'n' & an array of pointers
  145.    --POST: passes out the array with correct fib values
  146.    PROCEDURE Compute_Fib (n : IN integer; n_Length : OUT integer; data : IN OUT String) IS
  147.       Fib_Seq   : nPtr := NULL;
  148.       Prev1 : nPtr;
  149.       prev2 : nPtr;
  150.       prev3 : nPtr;
  151.       prev4 : nPtr;
  152.       deallPtr  : nPtr;
  153.       temp_S    : string(1..3412255); --largest string possible when n=25
  154.  
  155.    BEGIN --compute_fib
  156.  
  157.       --Create first four nodes
  158.       FOR i in 0..3 LOOP
  159.          IF i = 0 THEN
  160.             Fib_Seq := NEW nNode;
  161.             Fib_Seq.length := 1;
  162.             Fib_Seq.val(1..(Fib_Seq.length)) := "A";
  163.             prev4 := Fib_Seq;
  164.          ELSIF i = 1 THEN
  165.             Fib_Seq.next := NEW nNode;
  166.             Fib_Seq := Fib_Seq.next;
  167.             Fib_Seq.length := 1;
  168.             Fib_Seq.val(1..(Fib_Seq.length)) := "T";
  169.             prev3 := Fib_Seq;
  170.          ELSIF i = 2 THEN
  171.             Fib_Seq.next := NEW nNode;
  172.             Fib_Seq := Fib_Seq.next;
  173.             Fib_Seq.length := 1;
  174.             Fib_Seq.val(1..(Fib_Seq.length)) := "C";
  175.             prev2 := Fib_Seq;
  176.          ELSIF i = 3 THEN
  177.             Fib_Seq.next := NEW nNode;
  178.             Fib_Seq := Fib_Seq.next;
  179.             Fib_Seq.length := 1;
  180.             Fib_Seq.val(1..(Fib_Seq.length)) := "G";
  181.             prev1 := Fib_Seq;
  182.          END IF;
  183.       END LOOP;
  184.  
  185.       FOR i IN 4..n LOOP
  186.  
  187.          --deallocate memory on the fly that wont be used again
  188.          IF i > 4 THEN
  189.             dispose(X => deallPtr);
  190.          END IF;
  191.  
  192.          --creates list node
  193.          Fib_Seq.next := NEW nNode;
  194.          Fib_Seq := Fib_Seq.next;
  195.  
  196.          --assigns length of fib value to nNode.Length
  197.          Fib_Seq.length := (prev1.length +
  198.                             prev2.length +
  199.                             prev3.length +
  200.                             prev4.length);
  201.  
  202.          --Concatonates 4 previous values and create new fib value
  203.          Fib_Seq.val(1..(Fib_Seq.length)) :=  ((prev1.val(1..(prev1.length)))
  204.                                      & (prev2.val(1..(prev2.length)))
  205.                                              & (prev3.val(1..(prev3.length)))
  206.                                              & (prev4.val(1..(prev4.length))));
  207.  
  208.          --assign prev pointers to proper values
  209.          deallptr   := prev4;
  210.          prev4      := prev3;
  211.          prev3      := prev2;
  212.          prev2      := prev1;
  213.          prev1      := Fib_seq;
  214.  
  215.       END LOOP;
  216.  
  217.       --assign values to pass back out
  218.       n_Length  := Fib_Seq.Length;
  219.       temp_S(1..n_length)    := Fib_Seq.val(1..n_length);
  220.       data(data'first..n_length) := temp_S(1..n_length);
  221.  
  222.       --deallocate prev(1-4) & deallPtr & Fib_Seq
  223.       Dispose(X => prev1);
  224.       Dispose(X => prev2);
  225.       Dispose(X => prev3);
  226.       Dispose(X => prev4);
  227.       Dispose(X => deallPtr);
  228.       Fib_seq := NULL;
  229.  
  230.    END Compute_Fib;
  231. END Fib_package;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement