home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / math / mathfun.src < prev    next >
Encoding:
Text File  |  1988-05-03  |  27.9 KB  |  1,203 lines

  1. --::::::::::
  2. --mathgeni.ada
  3. --::::::::::
  4. -- MATHGENI.ADA
  5. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  6. -- Generic package of integer type functions
  7. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  8. -- LOG OF CHANGES 
  9.  
  10. --    1.    86 04 23: CODING BEGUN BY DAVID KWONG.  
  11.  
  12. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  13.     WITH TEXT_IO;
  14. GENERIC
  15.  
  16.     TYPE FLOATG IS DIGITS <>;
  17.     TYPE INTEGERG IS RANGE <>;
  18.  
  19. PACKAGE MATH_FUNCTIONS_GENERIC_INTEGER  IS
  20.  
  21.     -- MAX function gives maximum of both arguments
  22.  
  23.     FUNCTION MAX(LEFT,RIGHT:INTEGERG) RETURN INTEGERG;
  24.  
  25.     -- MIN function gives minimum of both arguments
  26.  
  27.     FUNCTION MIN(LEFT,RIGHT:INTEGERG) RETURN INTEGERG;
  28.  
  29.     -- REMAINDER function gives signed remainder of left/right
  30.     -- result is of type FLOATG 
  31.  
  32.     FUNCTION REMAINDER(LEFT,RIGHT:INTEGERG)    RETURN FLOATG;
  33.  
  34.     -- Sign function = +1 when A>=0, -1 when A<0
  35.  
  36.     FUNCTION  SIGN(A:INTEGERG)  RETURN INTEGERG;
  37.  
  38.     -- SIGNUM function =+1 when A>0, 0 when A=0, -1 when A<0
  39.  
  40.     FUNCTION  SIGNUM(A:INTEGERG)  RETURN INTEGERG;
  41.  
  42. END MATH_FUNCTIONS_GENERIC_INTEGER;  -- End specification of package
  43.  
  44. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  45.  
  46. PACKAGE BODY MATH_FUNCTIONS_GENERIC_INTEGER IS
  47.  
  48.     FUNCTION MAX(LEFT,RIGHT:INTEGERG) RETURN INTEGERG IS
  49.  
  50.     BEGIN
  51.  
  52.         IF LEFT < RIGHT THEN
  53.             RETURN RIGHT;
  54.         ELSE
  55.             RETURN LEFT;
  56.         END IF;
  57.  
  58.     EXCEPTION
  59.  
  60.         WHEN OTHERS =>
  61.             TEXT_IO.PUT("MAX(INTEGERG) Unidentified error");
  62.             RAISE;
  63.  
  64.     END MAX;
  65.  
  66.     FUNCTION MIN(LEFT,RIGHT:INTEGERG) RETURN INTEGERG IS
  67.  
  68.     BEGIN
  69.  
  70.         IF LEFT < RIGHT THEN
  71.             RETURN LEFT;
  72.         ELSE
  73.             RETURN RIGHT ;
  74.         END IF;
  75.  
  76.     EXCEPTION
  77.  
  78.         WHEN OTHERS =>
  79.             TEXT_IO.PUT("MIN(INTEGERG) Unidentified error");
  80.             RAISE;
  81.  
  82.     END MIN;
  83.  
  84.     FUNCTION REMAINDER(LEFT,RIGHT:INTEGERG) RETURN FLOATG IS
  85.  
  86.         A: FLOATG;
  87.  
  88.     BEGIN
  89.  
  90.         RETURN FLOATG(LEFT)/FLOATG(RIGHT)-FLOATG(LEFT/RIGHT);
  91.  
  92.     EXCEPTION
  93.  
  94.         WHEN OTHERS =>
  95.             TEXT_IO.PUT("REMAINDER(INTEGERG) Unidentified error");
  96.             RAISE;
  97.  
  98.     END REMAINDER;
  99.  
  100.     FUNCTION SIGN(A:INTEGERG) RETURN INTEGERG IS
  101.  
  102.     BEGIN
  103.  
  104.         IF A<0 THEN
  105.             RETURN -1 ;
  106.         ELSE
  107.             RETURN 1;
  108.         END IF;
  109.  
  110.     EXCEPTION
  111.  
  112.         WHEN OTHERS =>
  113.             TEXT_IO.PUT("SIGN(INTEGERG): Unidentified error");
  114.             RAISE;
  115.  
  116.     END SIGN;
  117.  
  118.     FUNCTION SIGNUM(A:INTEGERG) RETURN INTEGERG IS
  119.  
  120.     BEGIN
  121.  
  122.         IF A<0 THEN
  123.             RETURN -1 ;
  124.         ELSIF A=0 THEN
  125.             RETURN 0;
  126.         ELSE
  127.             RETURN 1;
  128.         END IF;
  129.  
  130.     EXCEPTION
  131.  
  132.         WHEN OTHERS =>
  133.             TEXT_IO.PUT("SIGNUM(INTEGERG): Unidentified error");
  134.             RAISE;
  135.  
  136.     END SIGNUM;
  137.  
  138. END MATH_FUNCTIONS_GENERIC_INTEGER;
  139. --::::::::::
  140. --mathgenf.ada
  141. --::::::::::
  142. -- MATHGENF.ADA
  143. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  144. -- Generic package of float type math functions
  145. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  146. --LOG OF CHANGES
  147.  
  148. --   1.   86 04 24: CODING BEGUN BY DAVID KWONG.
  149.  
  150. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  151.  
  152.     WITH TEXT_IO;
  153. GENERIC
  154.  
  155.     TYPE FLOATG IS DIGITS <>;
  156.     TYPE INTEGERG IS RANGE <>;
  157.  
  158. PACKAGE MATH_FUNCTIONS_GENERIC_FLOAT IS
  159.  
  160.     -- Ceiling function returns smallest INTEGERG >= A
  161.  
  162.     FUNCTION CEILING(A:FLOATG)  RETURN FLOATG;
  163.  
  164.     -- Floor function rounds to largest INTEGERG <= A
  165.  
  166.     FUNCTION FLOOR(A:FLOATG)  RETURN FLOATG;
  167.  
  168.     -- MAX function gives maximum of both arguments
  169.  
  170.     FUNCTION MAX(LEFT,RIGHT:FLOATG) RETURN FLOATG;
  171.  
  172.     -- MIN function gives minimum of both arguments
  173.  
  174.     FUNCTION MIN(LEFT,RIGHT:FLOATG) RETURN FLOATG;
  175.  
  176.     -- MOD function for Floats follows the ADA convention for
  177.     -- INTEGERGs
  178.  
  179.     FUNCTION "MOD"(LEFT,RIGHT:FLOATG) RETURN FLOATG;
  180.  
  181.     -- "REM" function for Floats follows the ADA convention for
  182.     -- INTEGERGs
  183.  
  184.     FUNCTION "REM"(LEFT,RIGHT:FLOATG) RETURN FLOATG;
  185.  
  186.     -- REMAINDER function gives sign remainder of left/right
  187.  
  188.     FUNCTION REMAINDER(LEFT,RIGHT:FLOATG)  RETURN FLOATG;
  189.  
  190.     -- ROUND function rounds A to nearest INTEGERG
  191.  
  192.     FUNCTION ROUND(A:FLOATG)  RETURN FLOATG;
  193.  
  194.     -- Sign function = +1.0 when A<=0.0, -1.0 when A<0.0
  195.  
  196.     FUNCTION  SIGN(A:FLOATG)  RETURN FLOATG;
  197.  
  198.     -- SIGNUM function =+1.0 when A>0.0, 0.0 when A=0.0, -1.0 when A<0.0
  199.  
  200.     FUNCTION  SIGNUM(A:FLOATG)  RETURN FLOATG;
  201.  
  202.     -- Truncate function for Floats only =
  203.     -- largest INTEGERG <= ABS(A) * SIGNUM(INTEGERGD(A))
  204.     -- (INTEGERG type conversion will round to closest INTEGERG)
  205.  
  206.     FUNCTION  TRUNCATE(A:FLOATG)  RETURN FLOATG;
  207.  
  208. END MATH_FUNCTIONS_GENERIC_FLOAT;  -- End specification of package
  209.  
  210. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  211.  
  212. PACKAGE BODY MATH_FUNCTIONS_GENERIC_FLOAT IS
  213.  
  214.     FUNCTION CEILING(A:FLOATG) RETURN FLOATG IS
  215.  
  216.         INTEGERGA: INTEGERG := INTEGERG(A);
  217.  
  218.     BEGIN
  219.  
  220.         IF(FLOATG(INTEGERGA) < A) THEN
  221.             RETURN FLOATG(INTEGERGA+1);
  222.         ELSE
  223.             RETURN FLOATG(INTEGERGA);
  224.         END IF;
  225.  
  226.     EXCEPTION
  227.  
  228.         WHEN OTHERS =>
  229.             TEXT_IO.PUT("CEILING(FLOATG) Unidentified error");
  230.             RAISE;
  231.          
  232.     END CEILING;
  233.  
  234.     FUNCTION FLOOR(A:FLOATG) RETURN FLOATG IS
  235.  
  236.         INTEGERGA: INTEGERG := INTEGERG(A);
  237.  
  238.     BEGIN
  239.  
  240.         IF(A < FLOATG(INTEGERGA)) THEN
  241.             RETURN FLOATG(INTEGERGA-1);
  242.         ELSE
  243.             RETURN FLOATG(INTEGERGA);
  244.         END IF;
  245.  
  246.     EXCEPTION
  247.  
  248.         WHEN OTHERS =>
  249.             TEXT_IO.PUT("FLOOR(FLOATG) Unidentified error");
  250.             RAISE;
  251.  
  252.     END FLOOR;
  253.  
  254.     FUNCTION MAX(LEFT,RIGHT:FLOATG) RETURN FLOATG IS
  255.  
  256.     BEGIN
  257.  
  258.         IF LEFT < RIGHT THEN
  259.             RETURN RIGHT;
  260.         ELSE
  261.             RETURN LEFT;
  262.         END IF;
  263.  
  264.     EXCEPTION
  265.  
  266.         WHEN OTHERS =>
  267.             TEXT_IO.PUT("MAX(FLOATG) Unidentified error");
  268.             RAISE;
  269.  
  270.     END MAX;
  271.  
  272.     FUNCTION MIN(LEFT,RIGHT:FLOATG) RETURN FLOATG IS
  273.  
  274.     BEGIN
  275.  
  276.         IF LEFT < RIGHT THEN
  277.             RETURN LEFT;
  278.         ELSE
  279.             RETURN RIGHT ;
  280.         END IF;
  281.  
  282.     EXCEPTION
  283.  
  284.         WHEN OTHERS =>
  285.             TEXT_IO.PUT("MIN(FLOATG) Unidentified error");
  286.             RAISE;
  287.  
  288.  
  289.     END MIN;
  290.  
  291.     FUNCTION "MOD"(LEFT,RIGHT:FLOATG) RETURN FLOATG IS
  292.     
  293.     BEGIN
  294.  
  295.             RETURN ABS(RIGHT*FLOOR(LEFT/RIGHT)-LEFT)*SIGN(RIGHT);
  296.  
  297.     EXCEPTION
  298.  
  299.         WHEN OTHERS =>
  300.             TEXT_IO.PUT("MOD(FLOAT): unidentified error");
  301.             RAISE;
  302.  
  303.     END "MOD";
  304.  
  305.     FUNCTION "REM"(LEFT,RIGHT:FLOATG) RETURN FLOATG IS
  306.  
  307.     BEGIN
  308.  
  309.         RETURN LEFT-FLOOR(ABS(LEFT/RIGHT))*ABS(RIGHT)*SIGN(LEFT);
  310.  
  311.     EXCEPTION
  312.  
  313.         WHEN OTHERS =>
  314.             TEXT_IO.PUT("REM(FLOAT): unidentified error");
  315.             RAISE;
  316.  
  317.     END "REM";
  318.  
  319.     FUNCTION REMAINDER(LEFT,RIGHT:FLOATG) RETURN FLOATG IS
  320.  
  321.         A: FLOATG := LEFT/RIGHT;
  322.  
  323.     BEGIN
  324.  
  325.         RETURN A-TRUNCATE(A);
  326.  
  327.     EXCEPTION
  328.  
  329.         WHEN OTHERS =>
  330.             TEXT_IO.PUT("REMAINDER(FLOATG) Unidentified error");
  331.             RAISE;
  332.  
  333.     END REMAINDER;
  334.  
  335.     FUNCTION ROUND(A:FLOATG) RETURN FLOATG IS
  336.  
  337.     BEGIN
  338.  
  339.         RETURN FLOATG(INTEGERG(A));
  340.  
  341.     EXCEPTION
  342.  
  343.         WHEN OTHERS =>
  344.             TEXT_IO.PUT("ROUND(FLOATG) Unidentified error");
  345.             RAISE;
  346.  
  347.     END ROUND;
  348.  
  349.     FUNCTION SIGN(A:FLOATG) RETURN FLOATG IS
  350.  
  351.     BEGIN
  352.  
  353.         IF A<0.0 THEN
  354.             RETURN -1.0;
  355.         ELSE
  356.             RETURN 1.0;
  357.         END IF;
  358.  
  359.     EXCEPTION
  360.  
  361.         WHEN OTHERS =>
  362.             TEXT_IO.PUT("SIGN(FLOATn): Unidentified error");
  363.             RAISE;
  364.          
  365.     END SIGN;
  366.     
  367.     FUNCTION SIGNUM(A:FLOATG) RETURN FLOATG IS
  368.  
  369.     BEGIN
  370.  
  371.         IF A<0.0 THEN
  372.             RETURN -1.0 ;
  373.         ELSIF A=0.0 THEN
  374.             RETURN 0.0;
  375.         ELSE
  376.             RETURN 1.0;
  377.         END IF;
  378.  
  379.     EXCEPTION
  380.  
  381.         WHEN OTHERS =>
  382.             TEXT_IO.PUT("SIGNUM(FLOATn): Unidentified error");
  383.             RAISE;
  384.  
  385.     END SIGNUM;
  386.  
  387.     FUNCTION TRUNCATE(A:FLOATG) RETURN FLOATG  IS
  388.  
  389.     BEGIN
  390.  
  391.         RETURN SIGN(A)*FLOOR(ABS(A));
  392.  
  393.     EXCEPTION
  394.  
  395.         WHEN OTHERS =>
  396.             TEXT_IO.PUT("TRUNCATE(FLOATn): Unidentified error");
  397.             RAISE;
  398.  
  399.     END TRUNCATE;
  400.  
  401. END MATH_FUNCTIONS_GENERIC_FLOAT;
  402. --::::::::::
  403. --mathfung.ada
  404. --::::::::::
  405. -- MATHFUNG.ADA
  406. -- This generic package can be instantiated with three different
  407. -- user defined types(one integer and 2 floating point types)
  408. -- The functions provided are:
  409. -- FLOOR,REMAINDER,ROUND,SIGN,SIGNUM,TRUNCATE,REM,MODE
  410. -- All functions are defined for FLOAT types, only REMAINDER,
  411. -- SIGN and SIGNUM
  412. -- are defined for INTEGER types.  The rest of the functions don't
  413. -- make sense for INTEGER types or are inherent in the language.
  414. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  415. --LOG OF CHANGES
  416.  
  417. -- 1.  86 04 24: CODING BEGUN BY DAVID KWONG.
  418.  
  419. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  420.  
  421.     WITH MATH_FUNCTIONS_GENERIC_INTEGER;
  422.     WITH MATH_FUNCTIONS_GENERIC_FLOAT;
  423.  
  424. GENERIC -- PACKAGE MATH FUNCTIONS
  425.  
  426.     TYPE FLOATS IS DIGITS <>;
  427.     TYPE FLOATD IS DIGITS <>;
  428.     TYPE INTEGERD IS RANGE <>;
  429.  
  430. PACKAGE MATH_FUNCTIONS_GENERIC IS
  431.  
  432.     PACKAGE MF_INTEGER IS NEW
  433.          MATH_FUNCTIONS_GENERIC_INTEGER(FLOATD,INTEGERD);
  434.  
  435.     PACKAGE MF_FLOATS IS NEW
  436.          MATH_FUNCTIONS_GENERIC_FLOAT(FLOATS,INTEGERD);
  437.  
  438.     PACKAGE MF_FLOATD IS NEW
  439.          MATH_FUNCTIONS_GENERIC_FLOAT(FLOATD,INTEGERD);
  440.  
  441. -- All functions must be renamed if they are to be visible
  442. -- with a use clause when this package is instantiated
  443. -- The floating point renames are identical except for the types
  444. --
  445. -- DEFINITION OF FUNCTIONS
  446. --
  447. -- Ceiling function returns smallest INTEGERD >= A
  448. -- Floor function returns largest INTEGERD <= A
  449. -- MAX function returns the largest of 2 arguments
  450. -- MIN function returns the smallest of 2 arguments
  451. -- MOD function for FLOATs follows the ADA convention for INTEGERD
  452. -- REM function for FLOATs follows the ADA convention for INTEGERD
  453. -- REMAINDER function gives signed remainder of left/right
  454. -- ROUND function rounds A to nearest INTEGERD
  455. -- Sign function = +1.0 when A<=0.0, -1.0 when A<0.0
  456. -- SIGNUM function =+1.0 when A>0.0, 0.0 when A=0.0, -1.0 when A<0.0
  457. -- Truncate function for FLOATs only =
  458. -- largest INTEGERD <= ABS(A) * SIGNUM(INTEGERDD(A))
  459. --   (INTEGERD type conversion will round to closest INTEGERD)
  460.  
  461. ---------- Integer functions ------------------------------------
  462.  
  463.     FUNCTION MAX(LEFT,RIGHT:INTEGERD) RETURN INTEGERD
  464.         RENAMES MF_INTEGER.MAX;
  465.  
  466.     FUNCTION MIN(LEFT,RIGHT:INTEGERD) RETURN INTEGERD
  467.         RENAMES MF_INTEGER.MIN;
  468.  
  469.     FUNCTION REMAINDER(LEFT,RIGHT:INTEGERD) RETURN FLOATD
  470.         RENAMES MF_INTEGER.REMAINDER;
  471.  
  472.     FUNCTION SIGN(A:INTEGERD) RETURN INTEGERD RENAMES
  473.         MF_INTEGER.SIGN;
  474.  
  475.     FUNCTION SIGNUM(A:INTEGERD) RETURN INTEGERD RENAMES
  476.         MF_INTEGER.SIGNUM;
  477.  
  478. -------- FLOATING POINT SINGLE PRECISION FUNCTIONS --------------------
  479.  
  480.     FUNCTION MAX(LEFT,RIGHT:FLOATS) RETURN FLOATS
  481.         RENAMES MF_FLOATS.MAX;
  482.  
  483.     FUNCTION MIN(LEFT,RIGHT:FLOATS) RETURN FLOATS
  484.         RENAMES MF_FLOATS.MIN;
  485.  
  486.     FUNCTION CEILING(A:FLOATS) RETURN FLOATS RENAMES MF_FLOATS.CEILING;
  487.  
  488.     FUNCTION FLOOR(A:FLOATS) RETURN FLOATS RENAMES MF_FLOATS.FLOOR;
  489.  
  490.     FUNCTION REMAINDER(LEFT,RIGHT:FLOATS) RETURN FLOATS RENAMES
  491.         MF_FLOATS.REMAINDER;
  492.  
  493.     FUNCTION ROUND(A:FLOATS) RETURN FLOATS RENAMES MF_FLOATS.ROUND;
  494.  
  495.     FUNCTION SIGN(A:FLOATS) RETURN FLOATS RENAMES MF_FLOATS.SIGN;
  496.  
  497.     FUNCTION SIGNUM(A:FLOATS) RETURN FLOATS RENAMES
  498.         MF_FLOATS.SIGNUM;
  499.  
  500.     FUNCTION TRUNCATE(A:FLOATS) RETURN FLOATS RENAMES
  501.         MF_FLOATS.TRUNCATE;
  502.  
  503.     FUNCTION "REM"(LEFT,RIGHT:FLOATS) RETURN FLOATS RENAMES
  504.         MF_FLOATS."REM";
  505.  
  506.     FUNCTION "MOD"(LEFT,RIGHT:FLOATS) RETURN FLOATS RENAMES
  507.         MF_FLOATS."MOD";
  508.  
  509. -------- FLOATING POINT DOUBLE PRECISION FUNCTIONS --------------------
  510.  
  511.     FUNCTION MAX(LEFT,RIGHT:FLOATD) RETURN FLOATD
  512.         RENAMES MF_FLOATD.MAX;
  513.  
  514.     FUNCTION MIN(LEFT,RIGHT:FLOATD) RETURN FLOATD
  515.         RENAMES MF_FLOATD.MIN;
  516.  
  517.     FUNCTION CEILING(A:FLOATD) RETURN FLOATD RENAMES
  518.         MF_FLOATD.CEILING;
  519.  
  520.     FUNCTION FLOOR(A:FLOATD) RETURN FLOATD RENAMES MF_FLOATD.FLOOR;
  521.  
  522.     FUNCTION REMAINDER(LEFT,RIGHT:FLOATD) RETURN FLOATD RENAMES
  523.         MF_FLOATD.REMAINDER;
  524.  
  525.     FUNCTION ROUND(A:FLOATD) RETURN FLOATD RENAMES MF_FLOATD.ROUND;
  526.     
  527.     FUNCTION SIGN(A:FLOATD) RETURN FLOATD RENAMES MF_FLOATD.SIGN;
  528.  
  529.     FUNCTION SIGNUM(A:FLOATD) RETURN FLOATD RENAMES
  530.         MF_FLOATD.SIGNUM;
  531.  
  532.     FUNCTION TRUNCATE(A:FLOATD) RETURN FLOATD RENAMES
  533.         MF_FLOATD.TRUNCATE;
  534.  
  535.     FUNCTION "REM"(LEFT,RIGHT:FLOATD) RETURN FLOATD RENAMES
  536.         MF_FLOATD."REM";
  537.  
  538.     FUNCTION "MOD"(LEFT,RIGHT:FLOATD) RETURN FLOATD RENAMES
  539.         MF_FLOATD."MOD";
  540.  
  541. END MATH_FUNCTIONS_GENERIC;
  542. --::::::::::
  543. --arrayfg1.ada
  544. --::::::::::
  545. -- ARRAYFG1.ADA
  546. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  547. -- Generic package of one dimensional array type functions.
  548. --    This is the generic package for ARRAY1D functions with private
  549. --    type components.  The index is a discrete type.  This package can
  550. --    be instantiated for one dimensional scalar arrays of either
  551. --    float or integer type.
  552. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  553. ----- DEFINITION OF FUNCTIONS
  554. -- MAX(A) returns the maximum of all the elements of A
  555. -- MIN(A) returns the minimum of all the elements of A
  556. -- PROD(A) returns the product of all the elements of A
  557. -- SUM(A) returns the sum of all the elements of A
  558. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  559. -- LOG OF CHANGES
  560.  
  561. --   1.   86 06 24: CODING BEGUN BY DAVID KWONG.
  562.  
  563. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  564.     WITH TEXT_IO;
  565. GENERIC
  566.  
  567.     TYPE COMTYP IS PRIVATE;
  568.     TYPE INDEX IS (<>);
  569.     TYPE ARRAY1D IS ARRAY( INDEX RANGE <>) OF COMTYP;
  570.     WITH FUNCTION "+"(LEFT,RIGHT:COMTYP) RETURN COMTYP IS <>;
  571.     WITH FUNCTION "*"(LEFT,RIGHT:COMTYP) RETURN COMTYP IS <>;
  572.     WITH FUNCTION ">"(LEFT,RIGHT:COMTYP) RETURN BOOLEAN IS <>;
  573.  
  574. PACKAGE ARRAY_FUNCTIONS_GENERIC_1D IS
  575.  
  576.     FUNCTION MAX(A:ARRAY1D) RETURN COMTYP;
  577.     FUNCTION MIN(A:ARRAY1D) RETURN COMTYP;
  578.     FUNCTION PROD(A:ARRAY1D) RETURN COMTYP;
  579.     FUNCTION SUM(A:ARRAY1D) RETURN COMTYP;
  580.  
  581. -- Exceptions
  582.  
  583. END ARRAY_FUNCTIONS_GENERIC_1D;  -- End specification of package
  584.  
  585. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  586.  
  587. PACKAGE BODY ARRAY_FUNCTIONS_GENERIC_1D IS
  588.  
  589.     FUNCTION MAX(A:ARRAY1D) RETURN COMTYP IS
  590.  
  591.         B:COMTYP:=A(A'FIRST);
  592.  
  593.     BEGIN
  594.  
  595.         FOR I IN A'RANGE LOOP
  596.             IF (A(I)>B) THEN
  597.                B:=A(I);
  598.             END IF;
  599.  
  600.         END LOOP;
  601.  
  602.         RETURN B;
  603.  
  604.     EXCEPTION
  605.  
  606.         WHEN OTHERS =>
  607.             TEXT_IO.PUT("MAX(ARRAY1D) Unidentified error");
  608.             RAISE;
  609.  
  610.     END MAX;
  611.  
  612.     FUNCTION MIN(A:ARRAY1D) RETURN COMTYP IS
  613.  
  614.         B:COMTYP:=A(A'LAST);
  615.  
  616.     BEGIN
  617.  
  618.         FOR I IN A'RANGE LOOP
  619.             IF (B > A(I)) THEN
  620.                B:=A(I);
  621.             END IF;
  622.         END LOOP;
  623.  
  624.         RETURN B;
  625.  
  626.     EXCEPTION
  627.  
  628.         WHEN OTHERS =>
  629.             TEXT_IO.PUT("MIN(ARRAY1D) Unidentified error");
  630.             RAISE;
  631.  
  632.     END MIN;
  633.  
  634.     FUNCTION PROD(A:ARRAY1D) RETURN COMTYP IS
  635.     
  636.         B:COMTYP:=A(A'FIRST);
  637.  
  638.     BEGIN
  639.  
  640.         FOR I IN INDEX'SUCC(A'FIRST)..A'LAST LOOP
  641.             B:=A(I)*B;
  642.         END LOOP;
  643.  
  644.         RETURN B;
  645.  
  646.     EXCEPTION
  647.  
  648.         WHEN OTHERS =>
  649.             TEXT_IO.PUT("PROD(ARRAY1D) Unidentified error");
  650.             RAISE;
  651.  
  652.     END PROD;
  653.  
  654.     FUNCTION SUM(A:ARRAY1D) RETURN COMTYP IS
  655.  
  656.         B:COMTYP:=A(A'FIRST);
  657.  
  658.     BEGIN
  659.  
  660.         FOR I IN INDEX'SUCC(A'FIRST).. A'LAST LOOP
  661.             B:=A(I)+B;
  662.         END LOOP;
  663.  
  664.         RETURN B;
  665.  
  666.     EXCEPTION
  667.  
  668.         WHEN OTHERS =>
  669.             TEXT_IO.PUT("SUM(ARRAY1D) Unidentified error");
  670.             RAISE;
  671.  
  672.     END SUM;
  673. END ARRAY_FUNCTIONS_GENERIC_1D;
  674. --::::::::::
  675. --arrayfg2.ada
  676. --::::::::::
  677. -- ARRAYFG2.ADA
  678. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  679. -- Generic package of two dimensional array type functions.
  680. --    This is the generic package for ARRAY2D functions with private
  681. --    type components.  The index is a discrete type.  This package can
  682. --    be instantiated for two dimensional scalar arrays of either
  683. --    float or integer type.
  684. --
  685. -- The functions are implemented by taking 1 dimensional slices
  686. -- of the two dimensional arrays and using the 1 dimensional
  687. -- functions on them
  688. --
  689. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  690. ----- DEFINITION OF FUNCTIONS
  691. -- MAX(A) returns the maximum of all the elements of A
  692. -- MIN(A) returns the minimum of all the elements of A
  693. -- PROD(A) returns the product of all the elements of A
  694. -- SUM(A) returns the sum of all the elements of A
  695. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  696. -- LOG OF CHANGES
  697.  
  698. --   1.   86 06 25: CODING BEGUN BY DAVID KWONG.
  699.  
  700. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  701.     WITH TEXT_IO;
  702.     WITH ARRAY_FUNCTIONS_GENERIC_1D;
  703. GENERIC
  704.  
  705.     TYPE COMTYP IS PRIVATE;
  706.     TYPE INDEX IS (<>);
  707.     TYPE ARRAY2D IS ARRAY( INDEX RANGE <>, INDEX RANGE <>) OF COMTYP;
  708.     WITH FUNCTION "+"(LEFT,RIGHT:COMTYP) RETURN COMTYP IS <>;
  709.     WITH FUNCTION "*"(LEFT,RIGHT:COMTYP) RETURN COMTYP IS <>;
  710.     WITH FUNCTION ">"(LEFT,RIGHT:COMTYP) RETURN BOOLEAN IS <>;
  711.  
  712. PACKAGE ARRAY_FUNCTIONS_GENERIC_2D IS
  713.  
  714.     FUNCTION MAX(A:ARRAY2D) RETURN COMTYP;
  715.     FUNCTION MIN(A:ARRAY2D) RETURN COMTYP;
  716.     FUNCTION PROD(A:ARRAY2D) RETURN COMTYP;
  717.     FUNCTION SUM(A:ARRAY2D) RETURN COMTYP;
  718.  
  719. -- Exceptions
  720.  
  721. END ARRAY_FUNCTIONS_GENERIC_2D;  -- End specification of package
  722.  
  723. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  724.  
  725. PACKAGE BODY ARRAY_FUNCTIONS_GENERIC_2D IS
  726. -- Instantiate package with one dimensional array functions
  727.  
  728.     TYPE ARRAY1D IS ARRAY(INDEX RANGE <>) OF COMTYP;
  729.     PACKAGE AF_1D IS NEW ARRAY_FUNCTIONS_GENERIC_1D(COMTYP,INDEX
  730.         ,ARRAY1D);
  731.  
  732.     FUNCTION MAX(A:ARRAY2D) RETURN COMTYP IS
  733.  
  734.         COLA1D: ARRAY1D(A'RANGE(2));
  735.         SUMA1D: ARRAY1D(A'RANGE(1));
  736.  
  737.     BEGIN
  738.  
  739.         FOR I IN A'RANGE(1) LOOP
  740.             FOR J IN A'RANGE(2) LOOP
  741.                COLA1D(J) := A(I,J);
  742.             END LOOP;
  743.             SUMA1D(I) := AF_1D.MAX(COLA1D);
  744.         END LOOP;
  745.  
  746.         RETURN AF_1D.MAX(SUMA1D);
  747.  
  748.     EXCEPTION
  749.  
  750.         WHEN OTHERS =>
  751.             TEXT_IO.PUT("MAX(ARRAY2D) Unidentified error");
  752.             RAISE;
  753.  
  754.     END MAX;
  755.  
  756.     FUNCTION MIN(A:ARRAY2D) RETURN COMTYP IS
  757.  
  758.         COLA1D: ARRAY1D(A'RANGE(2));
  759.         SUMA1D: ARRAY1D(A'RANGE(1));
  760.  
  761.     BEGIN
  762.  
  763.         FOR I IN A'RANGE(1) LOOP
  764.             FOR J IN A'RANGE(2) LOOP
  765.                COLA1D(J) := A(I,J);
  766.             END LOOP;
  767.             SUMA1D(I) := AF_1D.MIN(COLA1D);
  768.         END LOOP;
  769.  
  770.         RETURN AF_1D.MIN(SUMA1D);
  771.  
  772.     EXCEPTION
  773.  
  774.         WHEN OTHERS =>
  775.             TEXT_IO.PUT("MIN(ARRAY2D) Unidentified error");
  776.             RAISE;
  777.  
  778.     END MIN;
  779.  
  780.     FUNCTION PROD(A:ARRAY2D) RETURN COMTYP IS
  781.  
  782.         COLA1D: ARRAY1D(A'RANGE(2));
  783.         SUMA1D: ARRAY1D(A'RANGE(1));
  784.  
  785.     BEGIN
  786.  
  787.         FOR I IN A'RANGE(1) LOOP
  788.             FOR J IN A'RANGE(2) LOOP
  789.                COLA1D(J) := A(I,J);
  790.             END LOOP;
  791.             SUMA1D(I) := AF_1D.PROD(COLA1D);
  792.         END LOOP;
  793.  
  794.         RETURN AF_1D.PROD(SUMA1D);
  795.  
  796.      EXCEPTION
  797.  
  798.         WHEN OTHERS =>
  799.             TEXT_IO.PUT("PROD(ARRAY2D) Unidentified error");
  800.             RAISE;
  801.  
  802.     END PROD;
  803.  
  804.     FUNCTION SUM(A:ARRAY2D) RETURN COMTYP IS
  805.  
  806.         COLA1D: ARRAY1D(A'RANGE(2));
  807.         SUMA1D: ARRAY1D(A'RANGE(1));
  808.  
  809.     BEGIN
  810.  
  811.         FOR I IN A'RANGE(1) LOOP
  812.             FOR J IN A'RANGE(2) LOOP
  813.                COLA1D(J) := A(I,J);
  814.             END LOOP;
  815.             SUMA1D(I) := AF_1D.SUM(COLA1D);
  816.         END LOOP;
  817.  
  818.         RETURN AF_1D.SUM(SUMA1D);
  819.  
  820.     EXCEPTION
  821.  
  822.         WHEN OTHERS =>
  823.             TEXT_IO.PUT("SUM(ARRAY2D) Unidentified error");
  824.             RAISE;
  825.  
  826.     END SUM;
  827. END ARRAY_FUNCTIONS_GENERIC_2D;
  828. --::::::::::
  829. --arrayfg.ada
  830. --::::::::::
  831. -- ARRAYFG.ADA
  832. -- This package defines the ARRAY functions that
  833. -- are included in HAL/S for the ADA language.
  834. -- The functions provided are:
  835. -- MAX,MIN,PROD,SUM
  836. -- for 1 dimensional(ARRAY1D) and 2 dimensional arrays(ARRAY2D).
  837. -- All functions are defined for double precision integer, and
  838. -- single and double
  839. -- precision floating point component types.
  840. --
  841. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  842. --LOG OF CHANGES 
  843.  
  844. --    1.    86 06 25: CODING BEGUN BY DAVID KWONG.  
  845.  
  846. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  847.  
  848.     WITH ARRAY_FUNCTIONS_GENERIC_1D;
  849.     WITH ARRAY_FUNCTIONS_GENERIC_2D;
  850. GENERIC
  851. -- Generic scalar types
  852.     TYPE FLOATS IS DIGITS <>;
  853.     TYPE FLOATD IS DIGITS <>;
  854.     TYPE INTEGERD IS RANGE <>;
  855. -- Generic ARRAY1D types
  856.     TYPE ARRAY1DS IS ARRAY (INTEGERD RANGE <>) OF FLOATS;
  857.     TYPE ARRAY1DD IS ARRAY (INTEGERD RANGE <>) OF FLOATD;
  858.     TYPE ARRAY1DI IS ARRAY (INTEGERD RANGE <>) OF INTEGERD;
  859. -- Generic ARRAY2D types
  860.     TYPE ARRAY2DS IS ARRAY (INTEGERD RANGE <>,INTEGERD RANGE <>)
  861.         OF FLOATS;
  862.     TYPE ARRAY2DD IS ARRAY (INTEGERD RANGE <>,INTEGERD RANGE <>)
  863.         OF FLOATD;
  864.     TYPE ARRAY2DI IS ARRAY (INTEGERD RANGE <>,INTEGERD RANGE <>)
  865.         OF INTEGERD;
  866.  
  867. PACKAGE ARRAY_FUNCTIONS_GENERIC IS
  868.  
  869. -- Instantiate the one dimensional array functions
  870.     PACKAGE ARRAY1D_FLOATS IS NEW
  871.             ARRAY_FUNCTIONS_GENERIC_1D(FLOATS,INTEGERD,ARRAY1DS);
  872.  
  873.     PACKAGE ARRAY1D_FLOATD IS NEW
  874.             ARRAY_FUNCTIONS_GENERIC_1D(FLOATD,INTEGERD,ARRAY1DD);
  875.  
  876.     PACKAGE ARRAY1D_INTEGER IS NEW
  877.             ARRAY_FUNCTIONS_GENERIC_1D(INTEGERD,INTEGERD,ARRAY1DI);
  878.  
  879. -- Instantiate the two dimensional array functions
  880.     PACKAGE ARRAY2D_FLOATS IS NEW
  881.             ARRAY_FUNCTIONS_GENERIC_2D(FLOATS,INTEGERD,ARRAY2DS);
  882.  
  883.     PACKAGE ARRAY2D_FLOATD IS NEW
  884.             ARRAY_FUNCTIONS_GENERIC_2D(FLOATD,INTEGERD,ARRAY2DD);
  885.  
  886.     PACKAGE ARRAY2D_INTEGER IS NEW
  887.             ARRAY_FUNCTIONS_GENERIC_2D(INTEGERD,INTEGERD,ARRAY2DI);
  888.  
  889. -- All functions must be renamed if they are to be visible
  890. -- with a use clause when this package is instantiated
  891. --
  892. -- DEFINITION OF FUNCTIONS
  893. --
  894. -------- Floating point single precision functions  --------------------
  895.  
  896. -- ARRAY1D types
  897.  
  898.     FUNCTION MAX(A:ARRAY1DS) RETURN FLOATS RENAMES
  899.         ARRAY1D_FLOATS.MAX;
  900.     FUNCTION MIN(A:ARRAY1DS) RETURN FLOATS RENAMES
  901.         ARRAY1D_FLOATS.MIN;
  902.     FUNCTION PROD(A:ARRAY1DS) RETURN FLOATS RENAMES
  903.         ARRAY1D_FLOATS.PROD;
  904.     FUNCTION SUM(A:ARRAY1DS) RETURN FLOATS RENAMES
  905.         ARRAY1D_FLOATS.SUM;
  906.  
  907. -- ARRAY2D types
  908.  
  909.     FUNCTION MAX(A:ARRAY2DS) RETURN FLOATS RENAMES
  910.         ARRAY2D_FLOATS.MAX;
  911.     FUNCTION MIN(A:ARRAY2DS) RETURN FLOATS RENAMES
  912.         ARRAY2D_FLOATS.MIN;
  913.     FUNCTION PROD(A:ARRAY2DS) RETURN FLOATS RENAMES
  914.         ARRAY2D_FLOATS.PROD;
  915.     FUNCTION SUM(A:ARRAY2DS) RETURN FLOATS RENAMES
  916.         ARRAY2D_FLOATS.SUM;
  917.  
  918. -------- Floating point double  precision functions  -------------------
  919.  
  920. -- ARRAY1D types
  921.  
  922.     FUNCTION MAX(A:ARRAY1DD) RETURN FLOATD RENAMES
  923.         ARRAY1D_FLOATD.MAX;
  924.     FUNCTION MIN(A:ARRAY1DD) RETURN FLOATD RENAMES
  925.         ARRAY1D_FLOATD.MIN;
  926.     FUNCTION PROD(A:ARRAY1DD) RETURN FLOATD RENAMES
  927.         ARRAY1D_FLOATD.PROD;
  928.     FUNCTION SUM(A:ARRAY1DD) RETURN FLOATD RENAMES
  929.         ARRAY1D_FLOATD.SUM;
  930.  
  931. -- ARRAY2D types
  932.  
  933.     FUNCTION MAX(A:ARRAY2DD) RETURN FLOATD RENAMES
  934.         ARRAY2D_FLOATD.MAX;
  935.     FUNCTION MIN(A:ARRAY2DD) RETURN FLOATD RENAMES
  936.         ARRAY2D_FLOATD.MIN;
  937.     FUNCTION PROD(A:ARRAY2DD) RETURN FLOATD RENAMES
  938.         ARRAY2D_FLOATD.PROD;
  939.     FUNCTION SUM(A:ARRAY2DD) RETURN FLOATD RENAMES
  940.         ARRAY2D_FLOATD.SUM;
  941.  
  942. ---------- Integer functions -------------------------------------------
  943.  
  944. -- ARRAY1D types
  945.  
  946.     FUNCTION MAX(A:ARRAY1DI) RETURN INTEGERD RENAMES
  947.         ARRAY1D_INTEGER.MAX;
  948.     FUNCTION MIN(A:ARRAY1DI) RETURN INTEGERD RENAMES
  949.         ARRAY1D_INTEGER.MIN;
  950.     FUNCTION PROD(A:ARRAY1DI) RETURN INTEGERD RENAMES
  951.         ARRAY1D_INTEGER.PROD;
  952.     FUNCTION SUM(A:ARRAY1DI) RETURN INTEGERD RENAMES
  953.         ARRAY1D_INTEGER.SUM;
  954.  
  955. -- ARRAY2D types
  956.  
  957.     FUNCTION MAX(A:ARRAY2DI) RETURN INTEGERD RENAMES
  958.         ARRAY2D_INTEGER.MAX;
  959.     FUNCTION MIN(A:ARRAY2DI) RETURN INTEGERD RENAMES
  960.         ARRAY2D_INTEGER.MIN;
  961.     FUNCTION PROD(A:ARRAY2DI) RETURN INTEGERD RENAMES
  962.         ARRAY2D_INTEGER.PROD;
  963.     FUNCTION SUM(A:ARRAY2DI) RETURN INTEGERD RENAMES
  964.         ARRAY2D_INTEGER.SUM;
  965.  
  966. END ARRAY_FUNCTIONS_GENERIC;
  967. --::::::::::
  968. --mathtest.ada
  969. --::::::::::
  970. --- MATHTEST.ADA
  971. -- This is a test procedure to use the math functions
  972. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  973. --LOG OF CHANGES
  974.  
  975. --   1.   86 04 29: CODING BEGUN BY DAVID KWONG.
  976.  
  977. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  978.     WITH MATH_FUNCTIONS_GENERIC;
  979.     WITH TEXT_IO; USE TEXT_IO;
  980.     WITH FLOAT_TEXT_IO;
  981.     USE FLOAT_TEXT_IO;
  982.     WITH INTEGER_TEXT_IO; USE INTEGER_TEXT_IO;
  983.  
  984.  
  985. PROCEDURE MATHTEST IS
  986.  
  987.     TYPE INTEGERD IS NEW INTEGER;
  988.     TYPE FLOATS IS NEW FLOAT;
  989.     TYPE FLOATD IS NEW LONG_FLOAT;
  990.  
  991.     PACKAGE MATH_FUNCTIONS IS NEW
  992.         MATH_FUNCTIONS_GENERIC(FLOATS,FLOATD,INTEGERD);
  993.     USE MATH_FUNCTIONS;
  994.  
  995.     X,Y,Z,A,B,C,F,F2 :FLOATD;
  996.     I,J,K,L,M,N :INTEGERD;
  997.  
  998.     FNAME: STRING(1..30);
  999.     OUTFILE: FILE_TYPE;
  1000.     NCHAR: INTEGER;
  1001.  
  1002.  
  1003. BEGIN
  1004.  
  1005. -- Open up output file
  1006.     NEW_LINE;
  1007.     PUT("PLEASE ENTER NAME OF OUTPUT FILE: ");
  1008.     GET_LINE(FNAME,NCHAR);
  1009.     NEW_LINE;
  1010.     CREATE(FILE=>OUTFILE, MODE=> OUT_FILE, NAME=> FNAME(1..NCHAR));
  1011.     SET_OUTPUT(OUTFILE);
  1012.  
  1013.  
  1014.     PUT("          I        SIGN(I)    SIGNUM(I)");
  1015.     PUT(" FLOAT(5.0/F) REMAINDER(5.0/F) ");
  1016.     PUT("INTEGER(F/2.0)  ROUND(F/2.0)");
  1017.     PUT("     F/2.0     TRUNCATE(F/2.0)");
  1018.     NEW_LINE;
  1019.  
  1020.     FOR II IN 1..21 LOOP
  1021.  
  1022.         I := INTEGERD(II - 11);
  1023.         F := FLOATD(I);
  1024.         F2 :=F/2.0;
  1025.         Y := ROUND(F2);
  1026.         C := TRUNCATE(F2);
  1027.         PUT(INTEGER(I));PUT(" "); PUT(INTEGER(SIGN(I)));
  1028.         PUT(INTEGER(SIGNUM(INTEGERD(I))));PUT("      ");
  1029.         IF(I /= 0 ) THEN
  1030.             X := REMAINDER(INTEGERD(5),INTEGERD(I));
  1031.             PUT(FLOAT(5.0/F));PUT(" ");PUT(FLOAT(X));PUT(" ");
  1032.         ELSE
  1033.         -- Divide by zero.. answer undefined make = 0
  1034.             PUT(FLOAT(0.0)); PUT(" ");PUT(FLOAT(0.0));PUT(" ");
  1035.         END IF;
  1036.  
  1037.         PUT(INTEGER(F2));PUT("         ");PUT(FLOAT(Y));PUT("  ");
  1038.         PUT(FLOAT(F2));PUT(" ");PUT(FLOAT(C));
  1039.         NEW_LINE;
  1040.  
  1041.     END LOOP;
  1042.  
  1043.     NEW_LINE(2);
  1044.  
  1045.     PUT("       F              I          I REM 5    F REM 5 ");
  1046.     PUT("         I MOD 5       F MOD 5");
  1047.     PUT("  CEILING(F)   FLOOR(F)");
  1048.     NEW_LINE;
  1049.     F :=-10.5;
  1050.     FOR II IN 1..41 LOOP
  1051.  
  1052.         F := 0.5 + F;
  1053.         I := INTEGERD(F);
  1054.         J := I REM 5;
  1055.         Z := F REM 5.0;
  1056.         K := I MOD 5;
  1057.         A := F MOD 5.0;
  1058.         PUT(FLOAT(F));PUT(" ");PUT(INTEGER(I));PUT(" ");
  1059.         PUT(INTEGER(J));PUT("     "); PUT(FLOAT(Z));PUT(" ");
  1060.         PUT(INTEGER(K));PUT("     "); PUT(FLOAT(A));PUT(" ");
  1061.         PUT(FLOAT(CEILING(F)));PUT(" ");PUT(FLOAT(FLOOR(F)));
  1062.         NEW_LINE;
  1063.  
  1064.     END LOOP;
  1065.  
  1066.     NEW_LINE(2);
  1067.     PUT("      F               I         I REM -5  F REM -5.0 ");
  1068.     PUT("        I MOD -5   F MOD -5.0");
  1069.     NEW_LINE;
  1070.     F :=-10.5;
  1071.     FOR II IN 1..41 LOOP
  1072.  
  1073.         F := 0.5 + F;
  1074.         I := INTEGERD(F);
  1075.         J := I REM (-5);
  1076.         Z := F REM (-5.0);
  1077.         K := I MOD (-5);
  1078.         A := F MOD (-5.0);
  1079.         PUT(FLOAT(F));PUT(" ");PUT(INTEGER(I));PUT(" ");
  1080.         PUT(INTEGER(J));PUT("     "); PUT(FLOAT(Z));PUT(" ");
  1081.         PUT(INTEGER(K));PUT("     "); PUT(FLOAT(A));
  1082.         NEW_LINE;
  1083.  
  1084.     END LOOP;
  1085.  
  1086.     NEW_LINE;
  1087.     PUT("TEST MAX AND MIN OF 4.0 AND 5.23");
  1088.     NEW_LINE;
  1089.     X := MAX(4.0,5.23);
  1090.     PUT(FLOAT(X));
  1091.     Y := MIN(4.0,5.23);
  1092.     PUT(FLOAT(Y));
  1093.  
  1094.     CLOSE(OUTFILE);
  1095.  
  1096. END MATHTEST;
  1097. --::::::::::
  1098. --testaf.ada
  1099. --::::::::::
  1100. -- TESTAF.ADA
  1101. -- This procedure will test the 1 and 2 dimensional array functions
  1102. -- of the package ARRAY_FUNCTIONS_GENERIC
  1103. --
  1104. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  1105. --LOG OF CHANGES 
  1106.  
  1107. --    1.    86 06 25: CODING BEGUN BY DAVID KWONG.
  1108.  
  1109. ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
  1110.  
  1111. WITH ARRAY_FUNCTIONS_GENERIC;
  1112. WITH TEXT_IO; USE TEXT_IO;
  1113. WITH FLOAT_TEXT_IO;
  1114. USE FLOAT_TEXT_IO;
  1115. WITH INTEGER_TEXT_IO;
  1116. USE INTEGER_TEXT_IO;
  1117.  
  1118. PROCEDURE TESTAF IS
  1119.  
  1120.     TYPE INTEGERD IS NEW INTEGER;
  1121.     TYPE FLOATS IS NEW FLOAT;
  1122.     TYPE FLOATD IS NEW LONG_FLOAT;
  1123.     TYPE VECTORS IS ARRAY(INTEGERD RANGE <>) OF FLOATS;
  1124.     TYPE VECTORD IS ARRAY(INTEGERD RANGE <>) OF FLOATD;
  1125.     TYPE VECTORI IS ARRAY(INTEGERD RANGE <>) OF INTEGERD;
  1126.     TYPE MATRIXS IS ARRAY(INTEGERD RANGE <>,INTEGERD RANGE <>)
  1127.         OF FLOATS;
  1128.     TYPE MATRIXD IS ARRAY(INTEGERD RANGE <>,INTEGERD RANGE <>)
  1129.         OF FLOATD;
  1130.     TYPE MATRIXI IS ARRAY(INTEGERD RANGE <>,INTEGERD RANGE <>)
  1131.         OF INTEGERD;
  1132.  
  1133.     PACKAGE ARRAYF IS NEW ARRAY_FUNCTIONS_GENERIC(FLOATS,
  1134.         FLOATD,INTEGERD,VECTORS,VECTORD,VECTORI,MATRIXS,
  1135.         MATRIXD,MATRIXI);
  1136.     USE ARRAYF;
  1137.     
  1138.     X:VECTORS(1..3):=(1.0,2.0,3.0);
  1139.     Y:VECTORD(1..3):=(5.0,6.0,7.0);
  1140.     ANSS:FLOATS;
  1141.     ANSD:FLOATD;
  1142. -- TWO DIMENSIONAL ARRAYS
  1143.     N:MATRIXS(1..3,1..3):=((1.0,2.0,3.0),(4.0,5.0,6.0),(7.0,8.0,9.0));
  1144.     M:MATRIXI(1..2,1..2):=((3,4),(5,6));
  1145.  
  1146. BEGIN
  1147.  
  1148.     PUT("CHECK SINGLE DIMENSION ARRAYS or VECTORS");
  1149.     NEW_LINE;
  1150.     PUT ("X:"); 
  1151.     FOR I IN X'RANGE LOOP
  1152.         PUT(FLOAT(X(I)));
  1153.     END LOOP;
  1154.     NEW_LINE;
  1155.     PUT ("Y:");
  1156.     FOR I IN Y'RANGE LOOP
  1157.         PUT(FLOAT(Y(I)));
  1158.     END LOOP;
  1159.  
  1160.     NEW_LINE(2);
  1161.     ANSS:=PROD(X);
  1162.     PUT("PROD(X),MAX(X)=");
  1163.     PUT(FLOAT(ANSS));
  1164.     ANSS:=MAX(X);
  1165.     PUT(FLOAT(ANSS));
  1166.     NEW_LINE;
  1167.     PUT("MIN(X),SUM(Y)=");
  1168.     ANSS:=MIN(X);
  1169.     PUT(FLOAT(ANSS));
  1170.     ANSD:=SUM(Y);
  1171.     PUT(FLOAT(ANSD));
  1172.     NEW_LINE(2);
  1173.     PUT("2 DIMENSIONAL ARRAY FUNCTIONS or MATRICES");
  1174.     NEW_LINE;
  1175.     PUT("M:");
  1176.     NEW_LINE;
  1177.     FOR I IN M'RANGE(1) LOOP
  1178.         FOR J IN M'RANGE(2) LOOP
  1179.             PUT(INTEGER(M(I,J)));
  1180.         END LOOP;
  1181.         NEW_LINE;
  1182.     END LOOP;
  1183.     NEW_LINE;
  1184.     PUT("M:");
  1185.     NEW_LINE;
  1186.     FOR I IN N'RANGE(1) LOOP
  1187.         FOR J IN N'RANGE(2) LOOP
  1188.             PUT(FLOAT(N(I,J)));
  1189.         END LOOP;
  1190.         NEW_LINE;
  1191.     END LOOP;
  1192.     NEW_LINE(2);
  1193.  
  1194.     PUT(" PROD(N),SUM(M)=");
  1195.     PUT(FLOAT(PROD(N)));
  1196.     PUT(INTEGER(SUM(M)));
  1197.     NEW_LINE;
  1198.     PUT(" MAX(M),MIN(N)=");
  1199.     PUT(INTEGER(MAX(M)));
  1200.     PUT(FLOAT(MIN(N)));
  1201.  
  1202. END TESTAF;
  1203.