ЛР №2 Декларативне обчислення виразів (15 балів)
Реалізувати за допомогою JavaScript на основы результатів попередньої роботи декларативно-функціональне обчислення арифметичних виразів.
Основна вимога: подаючи на вхід невпорядковану множину простих виразів, отримати результат обчислення.
Наприклад, програма, отримавши деяке представлення виразів
c = a + b; (1)
b = 3 - 9; (2)
a = 23 * 5; (3)
мусить виявити, що спочатку потрібно обчислити вирази (2) та (3) , а потім - (1).
Арифметичний вираз обирається відповідно до варіанту
d=a + e
a=9 * 7
e=c / b
b=1 - 4
c=5
a=9 * 7
e=c / b
b=1 - 4
c=5
V2:
a=7 / 5
c=8 + b * 2
b=3-a
c=8 + b * 2
b=3-a
a= 4 / 3
b= 2 - 7
c= b * 5
d=c + a
b= 2 - 7
c= b * 5
d=c + a
a = 3 / 8
b = 23 + a
c = b * 13
d = 6 + c
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
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
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
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
a = 2
b = 1 / a
h = 3
k = 2
c = h + b
d = k / c
e=6
f=e / 7
a=9
f=1 / e
b=a / 9
c=1 + b
d=1 / c
e=1+d
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 )
b=9
c=d * (a - b )
d=2
e=d*2 * ( 3 + c )
a = 12
b = 8
c = a * b
d = 4
e = 3
f = d / e
g = f - c
h = 5
b = 8
c = a * b
d = 4
e = 3
f = d / e
g = f - c
h = 5
n = h / g
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
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 )
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
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
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
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
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;
}
}