Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi|Pascal]Калькулятор


Автор: jhonyxakep 17.6.2009, 07:45
Нужно написать программу которая будет брать из файла input.txt выражение и выводить его результат в файл output.txt

В файле input.txt могут присутствовать только ()+-
Заранее спасибо smile 

Автор: Elerond 17.6.2009, 08:23
jhonyxakep, не совсем понял... в файле должно быть математическое выражение? т.е. кроме ()+- еще и числа...

Автор: jhonyxakep 17.6.2009, 08:42
например (1+2)-2 в output ответ, с учётом скобок

Добавлено через 43 секунды
ещё может-быть (1+(1+2+(1+2+3+(1+2+3+4))))-2

Автор: Gaudi 17.6.2009, 11:51
Операции с одинаковым приоритетом, скобки не нужны. Просто решаешь выражение справа налево.

Автор: Elerond 17.6.2009, 12:28
Gaudi, это верно конечно, но наверное от них хотят показать как они справятся с приоритетами.

Добавлено через 7 минут и 22 секунды
В общем у меня паскаля не было под рукой, вот необходимые функции на делфи... функция Calc является основной... думаю считывание с файла сам сделаешь.

Это проверка на баланс скобок и лишние символы, правда не смотрит на повторение типа "++"
Код

function ScannErrors(InputText: String): Boolean;
var
  i, n, m: Integer;
begin
  Result:=False;
  n:=0; m:=0;
  for i:=1 to Length(InputText) do begin
    if InputText[i]='(' then Inc(n);
    if InputText[i]=')' then Inc(m);
    if not (InputText[i] in [')', '(', '-', '+', '0'..'9', ' ']) then Result:=True;
  end;
  if n<>m then Result:=True;
end;


Тут функция которая считает выражения типа 1+2+3+4, т.е. то что внутри скобок
Код

function Summa(Prev: Integer; SubInputText: String; Znak: Char): Integer;
var
  i, ch: Integer;
begin
  while Pos(' ', SubInputText)>0 do
    Delete(SubInputText, Pos(' ', SubInputText), 1);
  if Znak='-' then ch:=-1 else ch:=1;
  if (Pos('+', SubInputText)=0) and (Pos('-', SubInputText)=0) then Result:=Prev+StrToInt(SubInputText)*ch else begin
    for i:=1 to Length(SubInputText) do begin
      if SubInputText[i]='+' then begin
        ch:=StrToInt(Copy(SubInputText, 1, i-1));
        Break;
      end;
      if SubInputText[i]='-' then begin
        ch:=StrToInt(Copy(SubInputText, 1, i-1));
        Break;
      end;
    end;
    if Znak='-' then ch:=ch*(-1);
    Result:=Prev+Summa(ch, Copy(SubInputText, i+1, Length(SubInputText)), SubInputText[i]);
  end;
end;


Основная функция ))
Код

function Calc(InputText: String):Integer;
var
  i, j, ch: Integer;
begin
  for i:=1 to Length(InputText) do
    if InputText[i]='(' then begin
      for j:=i+1 to Length(InputText) do begin  
        if InputText[j]='(' then Break;
        if InputText[j]=')' then begin
          ch:=Summa(0, Copy(InputText, i+1, j-i-1), '+'); 
          Delete(InputText, i, j-i+1);
          Insert(IntToStr(ch), InputText, i);
          Break;
        end;
      end;
      if InputText[j]=')' then begin
        Break;
      end;
    end;
   if Pos('(', InputText)>0 then Result:=Calc(InputText) else Result:=Summa(0, InputText, '+'); 
end;


Добавлено через 8 минут и 12 секунд
Достаточно запустить функцию Calc и будет все работать  smile 

Автор: jhonyxakep 17.6.2009, 12:49
Ещё вопрос, а как нибудь можно это сделать с Рекурсией, или это не возможно?

Автор: Elerond 17.6.2009, 12:54
Если приглядеться то можно заметить, что функции Calc и Summa рекурсивные

Автор: jhonyxakep 17.6.2009, 13:36
sorry, не заметил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)