Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Строчный калькулятор

Страницы: 1
Строчный калькулятор
Всем привет, помогите разобраться, задали написать строчный калькулятор. Для теста калькулятора даны несколько простых примеров
1)1+2+3+4=
2)4+1*2=
3)(1+2*(3+4))-1=

С первым примером все просто, но вот далее с приоритетам операций все сложнее. Подскажите, куда капать?
Что конкретно непонятно в приоритетах операций? Обычно в каждом языке этот порядок прописан. Какие-то простые вещи можно даже в Википедии найти
Accende lumen sensibus, infude ainorem corbidus!
motorway11, Строчый калькулятор (он же ленточный) это программа, на вход которой подается строка. Программа должна распознать в нем математическое выражение и вычислить его по всем математическим правилам.

motorway11, Гребите в сторону теории языков.
Нашел курс лекции по ТЯ

http://www.intuit.ru/department/algorithms/mathformlang/

и еще тут

http://ermak.cs.nstu.ru/trans/

но к решению задачи пока не приблизился:(
Попробуйте вот такую функцию на Delphi...
Помойму подойдёт smile;)

Код
function Calculate(SMyExpression: string; digits: Byte): string;
   // Calculate a simple expression
  // Supported are:  Real Numbers, parenthesis
var
   z: Char;
   ipos: Integer;

   function StrToReal(chaine: string): Real;
   var
     r: Real;
     Pos: Integer;
   begin
     Val(chaine, r, Pos);
     if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
     Result := r;
   end;

   function RealToStr(inreal: Extended; digits: Byte): string;
   var
     S: string;
   begin
     Str(inreal: 0: digits, S);
     realToStr := S;
   end;

   procedure NextChar;
   var
     s: string;
   begin
     if ipos > Length(SMyExpression) then
     begin
       z := #9;
       Exit;
     end
     else
     begin
       s := Copy(SMyExpression, ipos, 1);
       z := s[1];
       Inc(ipos);
     end;
     if z = ' ' then nextchar;
   end;

   function Expression: Real;
   var
     w: Real;

     function Factor: Real;
     var
       ws: string;
     begin
       Nextchar;
       if z in ['0'..'9'] then
       begin
         ws := '';
         repeat
           ws := ws + z;
           nextchar
         until not (z in ['0'..'9', '.']);
         Factor := StrToReal(ws);
       end
       else if z = '(' then
       begin
         Factor := Expression;
         nextchar
       end
       else if z = '+' then Factor := +Factor
       else if Z = '-' then Factor := -Factor;
     end;

     function Term: Real;
     var
       W: Real;
     begin
       W := Factor;
       while Z in ['*', '/'] do
         if z = '*' then w := w * Factor
       else
         w := w / Factor;
       Term := w;
     end;
   begin
     w := term;
     while z in ['+', '-'] do
       if z = '+' then w := w + term
     else
       w := w - term;
     Expression := w;
   end;
 begin
   ipos   := 1;
   Result := RealToStr(Expression, digits);
 end;

И пример вызова функции:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Form1.Edit2.Text:= Calculate(Form1.Edit1.Text, 3);
end;
И скриншот работы функции на Вашем примере smile;) Вводим выражение, нажимаем кнопку, получаем результат smile;)
Рисунок
PIC1.PNG (12.33 КБ) [ Скачать ]
А пояснение к коду можешь дать?
Мда, все как просто оказалось.

Цитата
max katonin пишет:
А пояснение к коду можешь дать?

Все просто, выражение считает построчно. Если встречается выражение в скобках, рекурсивно функция вызывает сама себя, рассчитывает выражение внутри скобок и продолжает считать дальше:)

Valera, спасибо:)
Цитата
max katonin пишет:
motorway11, Строчый калькулятор (он же ленточный) это программа, на вход которой подается строка. Программа должна распознать в нем математическое выражение и вычислить его по всем математическим правилам.
motorway11, Гребите в сторону теории языков.

В принципе, я это понял и даже хотел посоветовать автору использовать аналог функции eval из других языков, но, похоже, ему надо было все это вручную написать. Сам же я так с ходу, наверно, не написал бы такой калькулятор smile:)
Accende lumen sensibus, infude ainorem corbidus!
Тоже решал через рекурсию. Сложнее только с функциями типа 2+SQRT(2).
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)