home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / tools / wmgsmath.tst < prev    next >
Encoding:
Text File  |  1988-05-03  |  5.3 KB  |  248 lines

  1. with Text_Io, TRIG_FUNCTIONS, Graphic, core_functions, numeric_primitives;
  2. use  Text_Io, TRIG_FUNCTIONS, Graphic, core_functions, numeric_primitives;
  3. procedure Math_Test is
  4.   Pic   : View_Port;
  5.   Done  : boolean := false;
  6.   Reply : character;
  7.  
  8. package FI is new Float_Io(float);
  9. use FI;
  10.  
  11. procedure Get_Input(Allowed : in string; Response : out character) is
  12.   Reply : character;
  13. begin
  14.   loop
  15.     get(Reply);
  16.     put(ascii.bs);
  17.     put(' ');
  18.     put(ascii.bs);
  19.     if Reply in 'A'..'Z' then
  20.       Reply := character'val(character'pos(Reply) + 32);
  21.     end if;
  22.     for I in 1..Allowed'last loop
  23.       if Reply = Allowed(I) then
  24.         done := true;
  25.         exit;
  26.       end if;
  27.     end loop;
  28.     exit when done;
  29.   end loop;
  30.   Response := Reply;
  31. end Get_Input;
  32.  
  33. procedure Show_Options is
  34. begin
  35.   new_line;
  36.   put_line("    a) Sin");
  37.   put_line("    b) Cos");
  38.   put_line("    c) Tan");
  39.   put_line("    d) Log");
  40.   put_line("    e) Log10");
  41.   put_line("    f) Truncate");
  42.   put_line("    z) quit");
  43. end Show_Options;
  44.  
  45. procedure Numeric_Test is
  46.   Reply : character := ' ';
  47.  
  48.   procedure Tester(C : in character) is
  49.     X : float;
  50.   begin
  51.     put("  X = ");
  52.     get(X);
  53.     Case C is
  54.       when 'a' => put("Sin(X) = ");   put(Sin(X));
  55.       when 'b' => put("Cos(X) = ");   put(Cos(X));
  56.       when 'c' => put("Tan(X) = ");   put(Tan(X));
  57.       when 'd' => put("Log(X) = ");   put(Log(X));
  58.       when 'e' => put("Log10(X) = "); put(Log10(X));
  59.       when 'f' => put("Truncate(X) = "); put(Truncate(X));
  60.       when others => null;
  61.     end case;
  62.     new_line;
  63.   end Tester;
  64.  
  65. begin  -- Numeric_Test
  66.   Show_Options;
  67.   Get_Input("abcdefz", Reply);
  68.   if Reply = 'z' then
  69.     done := true;
  70.   else
  71.     Tester(Reply);
  72.   end if;
  73. end Numeric_Test;
  74.  
  75. procedure Graphic_Test is
  76.   X_Min, X_Max, Y_Min, Y_Max : float;
  77.   X: float;
  78.  
  79.   procedure Show_Window is
  80.   begin
  81.     Set_Window(X_Min, Y_Min, X_Max, Y_Max);
  82.     Set_Color(Red);
  83.     Frame_Port;
  84.     Move_To(X_Min, 0.0);
  85.     Line_To(X_Max, 0.0);
  86.     Move_To(0.0, Y_Min);
  87.     Line_To(0.0, Y_Max);
  88.     Set_Color(Green);
  89.     put(ascii.esc);
  90.     put("[0;68H(");
  91.     put(X_Max, 3, 4);
  92.     put(',');
  93.     put(Y_Max, 3, 4);
  94.     put(')');
  95.     put(ascii.esc);
  96.     put("[22;2H(");
  97.     put(X_Max, 3, 4);
  98.     put(',');
  99.     put(Y_Max, 3, 4);
  100.     put(')');
  101.     Set_Mode(Graphics);
  102.   end Show_Window;
  103.  
  104.   procedure Show_Sin is
  105.     Inc : constant float := Pi / 30.0;
  106.   begin
  107.     X_Min := -Two_Pi;
  108.     X_Max :=  Two_Pi;
  109.     Y_Min := -1.5;
  110.     Y_Max :=  1.5;
  111.     Show_Window;
  112.     X := X_Min;
  113.     Move_To(X, Sin(X));
  114.     while X <= X_Max loop
  115.       X := X + Inc;
  116.       Line_To(X, Sin(X));
  117.     end loop;
  118.   end Show_Sin;
  119.  
  120.   procedure Show_Cos is
  121.     Inc : constant float := Pi / 30.0;
  122.   begin
  123.     X_Min := -Two_Pi;
  124.     X_Max :=  Two_Pi;
  125.     Y_Min := -1.5;
  126.     Y_Max :=  1.5;
  127.     Show_Window;
  128.     X := X_Min;
  129.     Move_To(X, Cos(X));
  130.     while X <= X_Max loop
  131.       X := X + Inc;
  132.       Line_To(X, Cos(X));
  133.     end loop;
  134.   end Show_Cos;
  135.  
  136.   procedure Show_Tan is
  137.     Inc : constant float := Pi / 30.0;
  138.     Y, Last_Y : float;
  139.   begin
  140.     X_Min := -Two_Pi;
  141.     X_Max :=  Two_Pi;
  142.     Y_Min := -5.0;
  143.     Y_Max :=  5.0;
  144.     Show_Window;
  145.     X := X_Min;
  146.     Y := Tan(X);
  147.     Move_To(X, Y);
  148.     while X <= X_Max loop
  149.       X := X + Inc;
  150.       Last_Y := Y;
  151.       Y := Tan(X);
  152.       if abs(Y - Last_Y) > 5.0 then
  153.         Move_To(X, Y);
  154.       else
  155.         Line_To(X, Y);
  156.       end if;
  157.     end loop;
  158.   end Show_Tan;
  159.  
  160.   procedure Show_Log is
  161.     Inc : float;
  162.   begin
  163.     X_Min := -1.0;
  164.     X_Max :=  20.0;
  165.     Y_Min := -5.0;
  166.     Y_Max :=  5.0;
  167.     Inc   := X_Max / 50.0;
  168.     Show_Window;
  169.     X := Inc;
  170.     Move_To(X, Log(X));
  171.     while X <= X_Max loop
  172.       X := X + Inc;
  173.       Line_To(X, Log(X));
  174.     end loop;
  175.   end Show_Log;
  176.  
  177.   procedure Show_Log10 is
  178.     Inc : float;
  179.   begin
  180.     X_Min := -1.0;
  181.     X_Max :=  20.0;
  182.     Y_Min := -5.0;
  183.     Y_Max :=  5.0;
  184.     Show_Window;
  185.     Inc   := X_Max / 50.0;
  186.     X := Inc;
  187.     Move_To(X, Log10(X));
  188.     while X <= X_Max loop
  189.       X := X + Inc;
  190.       Line_To(X, Log10(X));
  191.     end loop;
  192.   end Show_Log10;
  193.  
  194.   procedure Show_Truncate is
  195.     Inc : float := 0.2;
  196.   begin
  197.     X_Min := -20.0;
  198.     X_Max :=  20.0;
  199.     Y_Min := -20.0;
  200.     Y_Max :=  20.0;
  201.     Show_Window;
  202.     X := X_Min;
  203.     Move_To(X, Truncate(X));
  204.     while X <= X_Max loop
  205.       X := X + Inc;
  206.       Line_To(X, Truncate(X));
  207.     end loop;
  208.   end Show_Truncate;
  209.  
  210. begin  -- Graphic_Test
  211.   Show_Options;
  212.   Get_Input("abcdefz", Reply);
  213.   if Reply = 'z' then
  214.     done := true;
  215.   else
  216.     Erase_Screen;
  217.     case Reply is
  218.       when 'a' => Show_Sin;
  219.       when 'b' => Show_Cos;
  220.       when 'c' => Show_Tan;
  221.       when 'd' => Show_Log;
  222.       when 'e' => Show_Log10;
  223.       when 'f' => Show_Truncate;
  224.       when others => null;
  225.     end case;
  226.     Set_Mode(Text);
  227.   end if;
  228.   put(ascii.esc);
  229.   put("[23;0HPress <Space Bar> to continue");
  230.   Get_Input(" ", Reply);
  231. end Graphic_Test;
  232.  
  233. begin
  234.   put("Numeric or Graphic: ");
  235.   Create_Port(Pic, 5, 2, 70, 20);
  236.   Select_Port(Pic);
  237.   Set_Window(-10, -10, 10, 10);
  238.   Get_Input("ng", Reply);
  239.   loop
  240.     if Reply = 'n' then
  241.       Numeric_Test;
  242.     else
  243.       Graphic_Test;
  244.     end if;
  245.     exit when Done;
  246.   end loop;
  247. end Math_Test;
  248.