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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2015, 19:54   #1
Sergey_32
Новичок
Джуниор
 
Регистрация: 06.05.2015
Сообщений: 1
По умолчанию Создание калькулятора.

Здравствуйте! Я начинающий программист.Решил попробовать сделать калькулятор и столкнулся с проблемой определения порядка вычислительных операций.Моя программа работает так :записываешь выражение например 1+3-2-5= и она тебе выдаёт ответ.Подскажите идею ,как можно определять порядок вычислительных операций.
Код:
var
  i: integer;//счётчик знака строки.
  b, z: real;
  s: string;
  znak: char;

begin
  i := 1;
  read(s);
  while (s[i] <> '=') and (s[i] <> '+')  and (s[i] <> '-') do //Определяю первое число.
  begin
    case s[i] of 
      '1': b := b * 10 + 1;
      '2': b := b * 10 + 2;
      '3': b := b * 10 + 3;
      '4': b := b * 10 + 4;
      '5': b := b * 10 + 5;
      '6': b := b * 10 + 6;
      '7': b := b * 10 + 7;
      '8': b := b * 10 + 8;
      '9': b := b * 10 + 9;
      '0': b := b * 10;
    end;
    i := i + 1;
  end;
  z := b;
  znak := s[i];// определяю знак.
  i := i + 1;
  
  while (s[i] <> '=')  do //Произвожу математическую операцию,пока не распознается знак равно.
  begin
    b := 0;// обнуляю значение переменной.
    while(s [i] <> '+') and (s[i] <> '=')  and (s[i] <> '-') do
    begin
      case s[i] of
        '1': b := b * 10 + 1;
        '2': b := b * 10 + 2;
        '3': b := b * 10 + 3;
        '4': b := b * 10 + 4;
        '5': b := b * 10 + 5;
        '6': b := b * 10 + 6;
        '7': b := b * 10 + 7;
        '8': b := b * 10 + 8;
        '9': b := b * 10 + 9;
        '0': b := b * 10;
      end;
      i := i + 1;
    end;
    
    case znak of 
      '+': z := z + b; 
      '-': z := z - b; 
    end;
    if s[i] <> '=' then begin
      znak := s[i];
      i := i + 1;
    end;
  end;
  
  write(z);
end.
Sergey_32 вне форума Ответить с цитированием
Старый 06.05.2015, 20:33   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Sergey_32 Посмотреть сообщение
..Подскажите идею ,как можно определять порядок вычислительных операций...
То что вам нужно, называется парсер формул или математический парсер.
Задача непростая для начинающего, и не только начинающего. Обычно решается через рекурсию.
В интернете можно найти готовые решения. Я когда-то находил исходники на Паскале для этого.
Но там крутые парсеры. Они могут расшифровать что-нибудь типа exp(sin(x+1/ln(x+3)))*2+1/(x+1)
type_Oleg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание строкового калькулятора NikitaX007 Общие вопросы по Java, Java SE, Kotlin 9 06.04.2015 16:16
Создание и внедрение на сайт (MODX) простого калькулятора Al_hagen Фриланс 6 17.11.2014 18:25
Создание калькулятора в среде Delphi. dariya.95 Помощь студентам 3 24.06.2013 10:55
Создание калькулятора exelim Общие вопросы C/C++ 6 18.11.2011 12:33
создание калькулятора SpoteG Помощь студентам 3 17.06.2010 06:03