Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 23:00   #1
LukeSkywalker
 
Регистрация: 08.05.2012
Сообщений: 9
Восклицание Учет старшинства операций в калькуляторе

Здравствуйте, я пишу курсовую роботу в Delphi, а именно калькулятор. Никак не могу решить проблему: калькулятор считает без учета старшинства операций, т.е. выражения типа "2+2*2" он считает как "8". Помогите пожалуйста, как сделать учет старшинства операций? Если нужно, могу выложить файлы проекта.
LukeSkywalker вне форума Ответить с цитированием
Старый 08.05.2012, 23:26   #2
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Найти эти приоритетные знаки и произвести обработку дву соседних цифр. Заменить эти 3 знака (2 числа и оператор) полученым ответом. Проиводить такие манипуляции до тех пор, пока они не закончатся.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 09.05.2012, 00:22   #3
tralala
 
Регистрация: 01.04.2012
Сообщений: 6
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
  i:integer;
  proizv,result,number:real;
  zn1,zn2:char;
begin
  number:=0;
  result:=0;
  zn1:='+';
  zn2:=' ';
  s:= Edit1.Text;
  for i:=1 to Length(s) do begin
    case s[i] of
      '0'..'9':
        number:= number * 10 + Ord(s[i]) - ord('0');

      '+': begin
          if zn2 = '*' then
          begin
            proizv:= proizv * number;
            zn2:=' ';
            if zn1 = '+' then result:= result + proizv
            {only '+'}   else result:= result - proizv;
          end
          else
          if zn2 = '/' then
          begin
            proizv:= proizv / number;
            zn2:=' ';
            if zn1 = '+' then result:= result + proizv
                         else result:= result - proizv;
          end
          else
          begin
            if zn1 = '+' then result:= result + number
                         else result:= result - number;
          end;
        zn1:= '+';
        number:= 0;
      end;

      '-': begin
          if zn2 = '*' then
          begin
            proizv:= proizv * number;
            zn2:=' ';
            if zn1 = '+' then result:= result + proizv
            {only '+'}   else result:= result - proizv;
          end else if zn2 = '/' then
          begin
            proizv:= proizv / number;
            zn2:=' ';
            if zn1 = '+' then result:= result + proizv
                         else result:= result - proizv;
          end
          else
          begin
            if zn1 = '+' then result:= result + number
                         else result:= result - number;
          end;
        zn1:= '-';
        number:= 0;
      end;

      '*': begin
        if zn2 = ' ' then
        begin
          proizv:= number;
        end
        else
        begin
          if zn2 = '*' then
            proizv:= proizv * number
          else {zn2 = '/'}
            proizv:= proizv / number;
        end;
        zn2:= '*';
        number:= 0;
      end;

      '/': begin
        if zn2 = ' ' then
        begin
          proizv:= number;
        end else
        begin
          if zn2 = '*' then
            proizv:= proizv * number
          else {zn2 = '/'}
            proizv:= proizv / number;
        end;
        zn2:= '/';
        number:= 0;
      end;

    end;
  end;
  // досчитать все
  if zn2 = '*' then
  begin
    proizv:= proizv * number;
    zn2:=' ';
    if zn1 = '-' then result:= result - proizv
    {'+' or ' '} else result:= result + proizv;
  end
  else
  if zn2 = '/' then
    begin
    proizv:= proizv / number;
    zn2:=' ';
    if zn1 = '-' then result:= result - proizv
                 else result:= result + proizv;
    end
  else
  begin
    if zn1 = '-' then result:= result - number
                 else result:= result + number;
  end;

  Edit2.Text:= floattostr(result);

end;

end.
tralala вне форума Ответить с цитированием
Старый 09.05.2012, 14:57   #4
LukeSkywalker
 
Регистрация: 08.05.2012
Сообщений: 9
По умолчанию

Спасибо, буду пробовать!
LukeSkywalker вне форума Ответить с цитированием
Старый 09.05.2012, 16:03   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
"2+2*2"
Перед Вами операция сложения А+B, где А=2, В=2*2. Прежде чем выполнить сложение (или вычитание) Вам нужно вычислить А и вычислить В. Для этого можно использовать ту же самую функцию что и для поиска А+В. То есть сюда просится рекурсия. Второй вариант использовать стек и перестроить выражение так, чтобы операции всегда выполнялись в нужной последовательности.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ввод в калькуляторе katerina17171 Помощь студентам 0 25.10.2011 11:31
ошибки в калькуляторе -=Andriushka=- Помощь студентам 3 05.03.2011 18:37
проверка в калькуляторе 4UDaK Помощь студентам 2 27.04.2010 19:13
mod в калькуляторе pinch000 Общие вопросы C/C++ 1 08.11.2009 02:44
Формат числа в калькуляторе Mint86 Microsoft Office Excel 8 25.07.2008 11:49