Задача. От клавиатурата е въведен правилно построен израз от вида:

<израз> ::= число | (<и><израз><и><операция><и><израз><и>)
<операция> ::= +|-|*|/|div|mod
<и> ::= интервал
<число> ::= число от тип double

Да се дефинира функция double evaluate(), която изчислява стойността на така въведения израз.

За да упражним връщането на функция като резултат на функция, нека да дефинираме типа данни

typedef double (*binOp) (double, double)

и по една функция за всяка от допустимите в задачата операции - oPlus, oMinus, oMult, oRDiv, oIDiv, oMod, която по два параметъра намира сътответния резултат. Създавайки подходящ тип данни структура и масив, да построим таблица от вида

идентификатор (char *id)функция (binOp fp)
+
oPlus
...
...

Да дефинираме и функция getOp с подходящ прототип, която по даден идентификатор намира функцията, която изчислява съответната операция. Функцията проектираме така, че при евентуално бъдещо допълване на таблицата с операции, да не се налага да променяме getOp.

Накрая, да дефинираме рекурсивно функцията
double evaluate(), имаща следното поведение:

Evaluate:

token = read_input_word //"(" или число

if (token is a number)
return token;

argOne = Evaluate

operation = getOp (read_input_word)

argTwo = Evaluate

read_input_word //")"

return operation (argOne, argTwo)



На фиг. 1 е изобразен процеса, който реализира изпълнението на функцията Evaluate, ако на входа е въведен израза ((1+2)*3). Листата на изобразено дърво са терминалните символи в езика и са всъщност позициите, в които функцията осъществява четене от входа, в ред - отляво-надясно.
Заб: Структурата от данни на фигурата понякога се нарича дърво на извода за дадения израз.

фигура 1

Фиг. 1.
Последно модифициране: събота, 12 ноември 2011, 17:38