ЛР №2 Декларативне обчислення виразів (15 балів)

Реалізувати за допомогою JavaScript на основы результатів попередньої роботи декларативно-функціональне обчислення арифметичних виразів.

Основна вимога: подаючи на вхід невпорядковану множину простих виразів, отримати результат обчислення.

Наприклад, програма, отримавши деяке представлення виразів

c = a + b; (1)

b = 3 - 9; (2)

a = 23 * 5; (3)

мусить виявити, що спочатку потрібно обчислити вирази (2) та (3) , а потім - (1).


Арифметичний вираз обирається відповідно до варіанту

V1:
d=a + e
a=9 * 7
e=c / b
b=1 - 4
c=5

V2:
a=7 / 5
c=8 + b * 2
b=3-a

V3
a= 4 / 3
b= 2 - 7
c= b * 5
d=c + a

V4
a = 3 / 8
b = 23 + a
c = b * 13
d = 6 + c

V5
a = 8 - 6
b = 5 + a
c = 3 / 2
d = b * c
e = 9 -  d

V6
a=3 * 13
b=2 + a
c=1 / b
d=1 + c

V7
a=3 * 4
b=a - 1
c=9 / b
d=d
e=d + 2 - c

V8
g = f - d
a = 2
b = 1 / a
h = 3
k = 2
c = h + b
d = k / c
e=6
f=e / 7

V9
a=9
f=1 / e
b=a / 9
c=1 + b
d=1 / c
e=1+d

V10
a=1
b=9
c=d * (a - b )
d=2
e=d*2 * ( 3 + c )

V12
a = 12
b = 8
c = a * b
d = 4
e = 3
f = d / e
g = f - c
h = 5

n = h / g

V13
a=6
b=5
c=4
d=3
e=c * d
f=2
g=b + e
h= 1 + a * b
r=1 - f * g / h


V14
a=2
b=3  - a
c=7
d=3 / 4 - c / b
e=11  * ( a + d )

V15
a=8
b=1
c=6 * ( a  - b )
d=19
e=d / 11 + c

V16
a=11
b=51
c=2
d=c + 1 / ( a + 1 )
e=b * d

V17
a=4
b=2
c=1
d=c + 1 / b
e=d + c / b / 3
f=c / b / 3 /a
g=e + f

V18
a=2
b=3
c=4
d=2 * b * c * 5
e=a  / d
f=a * a / ( 2 * b )
g=a - f  + e


Приклад структури програми (замініть виділені рядки на свій код):

var expr=[
   a:{
      val:NaN,
      calc:function(expr){ return expr.a+expr.b; }
   },
   b:{
      val:NaN,
      calc:function(expr){ return 3+expr.c; }
   },
   c:{
      val:NaN,
      calc:function(expr){}
   },

]

var changed=true
var getv=function(x){ return isNaN(x)?'':x; }
while(changed){
   changed=false;
   for(var v in expr){
        prev=expr[v].val;
        next=expr[v].val=expr[v].calc(expr)
        if(getv(prev)!=getv(next)) changed=true;
   }
}