Во входном файле записано арифметическое выражение, считая, что выражение синтаксически правильное, вычислить ответ и записать его в выходной файл. Причём Порядок действий такой:
1. Действия в скобках
2. Сложение / вычитание
3. Умножение / деление
Если в процессе получается деление на 0, то в выходной файл записать Error
Выражение например такое: 2*(6/3-1)+4-1
То есть, сначала 3-1, потом 6/2, потом 3+4, потом 7+1, потом 2*8
///Просьба с комментариями и объяснением))) ///
Другие языки программирования и технологии
Олимпиадная задача по программированию в Pascal (Free, ABC.net) 10 класс! Помогите решить?)
Да не вопрос. Зачем только ограничивать - можно все фунции задействовать. Заодно и правильность выражения проверим ;)
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
Проверяем

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
Проверяем

Вадим Галяпин
Я же написал, 10 класс, у нас так-то всякий uses не используется, я сам только CRT и знаю
Легкотня
Вадим Галяпин
Для кого как)))
А, паскаль =)
А я уже хотел монструозного монстра на С++ с предварительным парсингом и отложенным выполнением на pastebin выложить.
Ну короче, если тебя не устраивает вариант выше, то почитай вот это: https://ru.wikipedia.org/wiki/Обратная_польская_запись
Этой херней можно не только матан считать, но и произвольные, предварительно зареганные, функции парсить прямо из текста.
А я уже хотел монструозного монстра на С++ с предварительным парсингом и отложенным выполнением на pastebin выложить.
Ну короче, если тебя не устраивает вариант выше, то почитай вот это: https://ru.wikipedia.org/wiki/Обратная_польская_запись
Этой херней можно не только матан считать, но и произвольные, предварительно зареганные, функции парсить прямо из текста.
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.
подходит ли выражение ?
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
Похожие вопросы
- Ошибка в Delphi 10 lite помогите решить пожалуйста
- Помогите решить задачу по информатике 9 класс. Pascal ABC
- помогите с информатикой (pascal ABC)\ 10 класс
- Помогите написать программу в Pascal abc net
- Помогите пожалуйста решить задачу по программированию. В чем я ошибаюсь?
- Помогите с программированием на Pascal ABC
- Помогите решить 2-ую задачу по программированию в языке Pascal
- Помогите решить задачу на программирование!
- Задайте массив из файла в Pascal.ABC.net
- Какую функцию выполняют команды real и integer (var a,b,c:integer;) на Pascal ABC Net? И чем они отличаются?