Advertisement
pseudocreator

a^n (advanced) {it}/{rec} solution

Mar 20th, 2014
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE z;
  2. FROM InOut IMPORT WriteString, WriteLn, WriteInt, ReadInt, Read;
  3. FROM RealInOut IMPORT ReadReal, WriteReal;
  4.  
  5. VAR
  6.    a, result : REAL;
  7.    n : INTEGER;
  8.    ok, again : BOOLEAN;
  9.    proc : PROCEDURE(REAL,INTEGER,VAR BOOLEAN):REAL;
  10.    smb : CHAR;
  11.  
  12. PROCEDURE stepen1(a: REAL; n: INTEGER; VAR ok: BOOLEAN): REAL;
  13. CONST
  14.      maxr = MAX(REAL);
  15. VAR
  16.    stepen : REAL;
  17. BEGIN
  18.     IF (a = 0.0) AND (n <= 0) THEN
  19.       ok := FALSE;
  20.       RETURN 0.0
  21.     ELSE
  22.         ok := TRUE;
  23.         IF (a = 0.0) THEN
  24.           RETURN 0.0
  25.         ELSIF (a = 1.0) OR (n = 0) THEN
  26.              RETURN 1.0
  27.         ELSIF n = 1 THEN
  28.              RETURN a
  29.         ELSE
  30.             IF n < 0 THEN
  31.               a := 1.0 / a;
  32.               n := ABS(n)
  33.             END;
  34.             stepen := 1.0;
  35.             WHILE (n > 0) AND ok DO
  36.                  IF ODD(n) THEN
  37.                    stepen := stepen * a
  38.                  END;
  39.                  n := n DIV 2;
  40.                  ok := (maxr / a) > a;
  41.                  IF (n > 0) AND ok THEN
  42.                    a := a * a
  43.                  END
  44.             END;
  45.             RETURN stepen;
  46.          END
  47.      END;
  48. END stepen1;
  49.  
  50.  
  51. PROCEDURE stepen2(a: REAL; n: INTEGER; VAR ok: BOOLEAN): REAL;
  52.  
  53.         PROCEDURE Sqr(x: REAL): REAL;
  54.         BEGIN
  55.              RETURN x*x
  56.         END Sqr;
  57.  
  58.         PROCEDURE RekStepen(a: REAL; n: INTEGER): REAL;
  59.         BEGIN
  60.              IF n = 1 THEN
  61.                RETURN a
  62.              ELSIF ODD(n) THEN
  63.                   RETURN a * Sqr(RekStepen(a,n DIV 2))
  64.              ELSE
  65.                  RETURN Sqr(RekStepen(a,n DIV 2))
  66.              END;
  67.         END RekStepen;
  68.  
  69. BEGIN
  70.      IF (a = 0.0) AND (n <= 0) THEN
  71.        ok := FALSE;
  72.        RETURN 0.0
  73.      ELSE
  74.          ok := TRUE;
  75.          IF a = 0.0 THEN
  76.            RETURN 0.0
  77.          ELSIF (n = 0) OR (a = 1.0) THEN
  78.               RETURN 1.0
  79.          ELSIF n = 1 THEN
  80.               RETURN a
  81.          ELSE
  82.              IF n < 0 THEN
  83.                a := 1.0 / a;
  84.                n := ABS(n)
  85.              END;
  86.              RETURN RekStepen(a, n)
  87.          END
  88.      END
  89. END stepen2;
  90.  
  91. BEGIN
  92.     WriteString('Enter a: ');
  93.     ReadReal(a);
  94.     WriteLn;
  95.     WriteString('Enter n: ');
  96.     ReadInt(n);
  97.     WriteLn;
  98.     WriteString('Chose your procedure');
  99.     WriteLn;
  100.     WriteString(' Enter i for iteratively solution;');
  101.     WriteLn;
  102.     WriteString(' or r for recursively solution (same result ofc)!'); WriteLn;
  103.     again := FALSE;
  104.     REPEAT
  105.           IF again THEN
  106.             WriteString('Enter again, input must be <i> OR <r> : ');
  107.             WriteLn;
  108.           END;
  109.           Read(smb);
  110.           WriteLn;
  111.           again := TRUE;
  112.      UNTIL (smb = 'i') OR (smb = 'r');
  113.      CASE smb OF
  114.          'i' : proc := stepen1|
  115.          'r' : proc := stepen2
  116.      END;
  117.      result := proc(a,n,ok);
  118.      IF ok THEN
  119.         WriteString('Result for a^n is: ');
  120.         WriteReal(result,10)
  121.      ELSE
  122.          WriteString('Invalid input')
  123.      END
  124. END z.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement