Другие языки программирования и технологии

Олимпиадная задача по программированию в Pascal (Free, ABC.net) 10 класс! Помогите решить?)

Во входном файле записано арифметическое выражение, считая, что выражение синтаксически правильное, вычислить ответ и записать его в выходной файл. Причём Порядок действий такой:
1. Действия в скобках
2. Сложение / вычитание
3. Умножение / деление
Если в процессе получается деление на 0, то в выходной файл записать Error
Выражение например такое: 2*(6/3-1)+4-1
То есть, сначала 3-1, потом 6/2, потом 3+4, потом 7+1, потом 2*8

///Просьба с комментариями и объяснением))) ///
Да не вопрос. Зачем только ограничивать - можно все фунции задействовать. Заодно и правильность выражения проверим ;)

uses System, Microsoft.CSharp, System.CodeDom.Compiler, System.Reflection;
var
c : CSharpCodeProvider;
cp : CompilerParameters;
cr : CompilerResults;
o : object;
s : string;
begin
c := new CSharpCodeProvider();
cp := new CompilerParameters();
cp.ReferencedAssemblies.Add('system.dll');
cp.GenerateInMemory := true;

write('Введите выражение: '); ReadLn(s);

cr := c.CreateCompiler().CompileAssemblyFromSource(
cp,
'using System;namespace evaluator{public class evaluator{public object eval(){return ' + s +';}}}'
);
if (cr.Errors.Count > 0) then
begin
writeln('Ошибка в выражении: ', cr.Errors[0].ErrorText);
Halt(1);
end;

o := cr.CompiledAssembly.CreateInstance('evaluator.evaluator');
o := o.GetType().GetMethod('eval').Invoke(o, nil);

writeln('Результат: ', o);
end.

P.S: Обычно я не помогаю в олимп. задачах т. к. это не очень честно, но тут особый случай и у Вас её вряд-ли примут, хотя она рабочая. Наверное никто такого извращения не делал на PascalABC.Net %)

Пруф: 4*Math.Cos(0)/2+1+((4+2)*(3+1)) = 4*1/2 + 1 + (6*4) = 2 + 1 + 24 = 27

Проверяем
Jaxa Niyazov
Jaxa Niyazov
84 764
Лучший ответ
Вадим Галяпин Я же написал, 10 класс, у нас так-то всякий uses не используется, я сам только CRT и знаю
Легкотня
Алексей Пумпур
Алексей Пумпур
63 228
Вадим Галяпин Для кого как)))
А, паскаль =)
А я уже хотел монструозного монстра на С++ с предварительным парсингом и отложенным выполнением на pastebin выложить.
Ну короче, если тебя не устраивает вариант выше, то почитай вот это: https://ru.wikipedia.org/wiki/Обратная_польская_запись
Этой херней можно не только матан считать, но и произвольные, предварительно зареганные, функции парсить прямо из текста.
СВ
Саша Волювач
16 778
Jaxa Niyazov Кст да - странно что Pascal. У нас можно было выбрать из 5 языков =)
program dx;
var a: integer;
f:Text;
c:Text;
begin
c:='error'
a:=(((6/(3-1))+4)-1)*2;
assign(f,'D:/test.txt');
rewrite(f);
if a=0 then
writeln(f,c)
else
writeln(f,a);
close(f);
end.
подходит ли выражение ?
Вадим Галяпин Дело в том, что выражение считывается из файла, а не вводится с клавиатуры, а считать выражение мы можем только как набор символов в String