Напишите программу которая вычисляет выражение содержащее целые числа и знаки сложения и вычитания
Перейти к содержимому

Напишите программу которая вычисляет выражение содержащее целые числа и знаки сложения и вычитания

Методы программирования

Задание состоит из двух частей, первая из которых обязательна для выполнения, вторую необходимо выполнить для получения отличной оценки. Срок сдачи задания — 9 октября.

а. Вычисление значения арифметического выражения, заданного в инфиксной форме.

Теория

Говорят, что выражение записано в инфиксной форме, если знак операции (сложения, умножения, вычитания либо деления) стоит между своими аргументами, например, 5 + 7 . Каждая операция имеет приоритет выполнения (сначала выполняются умножение и деление, затем сложение и вычитание). Для изменения приоритета выполнения операций используются круглые скобки.

Вычислять значение выражения, записанного в инфиксной форме, неудобно. Проще сначала перевести его в постфиксную, или обратную польскую запись, в которой знак операции записывается после своих операндов, например, 5 7 + .

Для перевода выражения из инфиксной формы в постфиксную с учетом приоритетов операций и скобок существует простой алгоритм (Дейкстры). Алгоритм работает со стеком, в котором хранятся знаки операций. Сначала стек пуст. На вход алгоритму подается последовательность лексем (числа, скобки или знаки операций), представляющая некоторое арифметическое выражение, записанное в инфиксной форме. Результатом работы алгоритма является эквивалентное выражение в постфиксной форме. Вводятся приоритеты операций: открывающая скобка имеет приоритет 0 , знаки + и – — приоритет 1 и знаки * и / — приоритет 2 .

  1. Если не достигнут конец входной последовательности, прочитать очередную лексему.
    1. Если прочитан операнд (число), записать его в выходную последовательность.
    2. Если прочитана открывающая скобка, положить ее в стек.
    3. Если прочитана закрывающая скобка, вытолкнуть из стека в выходную последовательность все до открывающей скобки. Сами скобки уничтожаются.
    4. Если прочитан знак операции, вытолкнуть из стека в выходную последовательность все операции с большим либо равным приоритетом, а прочитанную операцию положить в стек.

    Заметим, что порядок операндов в выходной последовательности не отличается от порядка операндов в исходной последовательности. В выходной последовательности отсутствуют скобки.

    Для вычисления значения выражения, записанного в постфиксной форме, можно использовать описанный далее алгоритм. На вход подается последовательность лексем (числа или знаки операций), представляющая некоторое арифметическое выражение, записанное в постфиксной форме. Результатом работы алгоритма является значение этого выражения.

    1. Если не достигнут конец входной последовательности, прочитать очередную лексему.
      1. Если прочитан операнд (число), положить его в стек.
      2. Если прочитан знак операции, вытолкнуть из стека два операнда и положить в стек результат применения прочитанной операции к этим операндам, взятым в обратном порядке.

      Ясно, что эти два алгоритма можно объединить, если в первом алгоритме вместо вывода в выходную последовательность передавать лексему сразу на вход второму алгоритму и обрабатывать «на лету» (придется поддерживать одновременно два стека).

      Формулировка задания

      Во входном файле input.txt в единственной строке находится арифметическое выражение, записанное в инфиксной форме (используются только целые положительные числа и четыре операции + , – , * , / . В выходной файл output.txt записать значение этого выражения. Стеки реализовывать при помощи связанных списков (операции добавления в начало списка и удаления первого элемента, см. теорию по заданию 1.

      Примеры
      Ввод: input.txt
      (1+2)*(3+4)
      Вывод: output.txt
      21

      b. * Выполнение программы вычислений

      Формулировка задания

      Во входном файле input.txt находится программа, написанная на специальном языке программирования. В языке существуют два вида операторов: оператор присваивания VARIABLE=EXPRESSION , где VARIABLE — имя переменной, состоящее из букв и цифр, не начинающееся с цифры и длиной не более 5 символов, а EXPRESSION — выражение в инфиксной форме, содержащее целые числа, скобки, знаки операций ( + , – , * , / ) и переменные и не содержащее пробелов. Значением любой переменной изначально считается 0 , оператор присваивания изменяет значение переменной на значение выражения. Второй вид оператора — оператор вывода на экран: PRINT EXPRESSION , где PRINT — служебное слово, а EXPRESSION определяется так же, как и для оператора присваивания. Этот оператор выводит в файл output.txt значение выражения EXPRESSION и переводит строку.

      Примеры
      Ввод: input.txt
      VAR1=5
      VAR2=VAR1*(7+VAR3)
      PRINT VAR1
      PRINT VAR2+1
      Вывод: output.txt
      5
      36

      Напишите программу которая вычисляет выражение содержащее целые числа и знаки сложения и вычитания

      Скачай курс
      в приложении

      Перейти в приложение
      Открыть мобильную версию сайта

      © 2013 — 2023. Stepik

      Наши условия использования и конфиденциальности

      Get it on Google Play

      Public user contributions licensed under cc-wiki license with attribution required

      Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков

      Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «–»). Выражение вводится как символьная строка, все числа целые.
      Пример:
      Введите выражение:
      12-3+45
      Ответ: 54

      94731 / 64177 / 26122
      Регистрация: 12.04.2006
      Сообщений: 116,782
      Ответы с готовыми решениями:

      Напишите функцию, которая вычисляет наибольший общий делитель двух чисел
      Напишите функцию,которая вычисляет наибольший общий делитель двух чисел

      Распарсить выражение, состоящее из чисел, скобок и знаков сложения и вычитания, и вывести результат
      Сложение и вычитание Имя входного файла: evalpm.in Имя выходного файла: evalpm.out Ограничение.

      Написать программу, которая вычисляет и выводит наименьшее из трех введенных чисел.Тернарный оператор
      Написать программу, которая вычисляет и выводит наименьшее из трех введенных пользователем чисел.

      447 / 333 / 172
      Регистрация: 01.07.2015
      Сообщений: 1,162

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
      string s; cin >> s; vectorint> nums; vectorchar> ops; size_t pos = s.find_first_of("+-", 0); int before = 0; int j = 0; while (pos != string::npos) { nums.push_back(atoi(s.substr(before, pos + 1).c_str())); ops.push_back(s[pos]); before = pos + 1; ++j; if (j == 2) nums.push_back(atoi(s.substr(pos + 1).c_str())); pos = s.find_first_of("+-", pos + 1); } int ans = 0; for (size_t i = 0; i  ops.size(); ++i) { if (i == 0) ans = nums[i]; if (ops[i] == '+') { ans += nums[i + 1]; } else { ans -= nums[i + 1]; } } cout  ;

      код особо не тестил
      66 / 57 / 13
      Регистрация: 16.03.2017
      Сообщений: 426
      как то так

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
      QString a = "12-3+45"; QString z1=""; QString z2=""; QString n1="",n2="",n3=""; int z1N, z2N; int n1N,n2N,n3N,s; for (int i = 0; ia.size(); i++)  else {z2 = a[i]; z2N=i;} } } for (int i=0; iz1N; i++) { n1+= a[i] } for (int i=z1N +1; iz2N; i++) { n2+= a[i] } for (int i=z2N +1; ia.size(); i++) { n3+= a[i] } s = QString::number(n1) + QString::number(n2)+ QString::number(n3)

      2701 / 1954 / 974
      Регистрация: 21.12.2010
      Сообщений: 3,639
      Записей в блоге: 10

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      #include #include int main() { char str[] = "12-3+45"; int res = 0; for (char* p = str; *p; ) { res += strtol(p, &p, 10); } std::cout  res  std::endl; }

      87844 / 49110 / 22898
      Регистрация: 17.06.2006
      Сообщений: 92,604
      Помогаю со студенческими работами здесь

      Напишите программу, которая вычисляет среднее арифметическое чисел, находящихся в файле numbers.txt
      Ребят, есть условие и решение задачи, объясните пожалуйста комментариями ее решения, очень нужно.

      Напишите программу, которая вычисляет среднее арифметическое чисел, находящихся в файле D:\numbers.txt
      Напишите программу, которая вычисляет среднее арифметическое чисел, находящихся в файле.

      Напишите функцию, которая вычисляет наибольший общий делитель двух чисел
      Напишите функцию, которая вычисляет наибольший общий делитель двух чисел c++ Помогите пожалуйста.

      Напишите программу которая вычисляет выражение содержащее целые числа и знаки сложения и вычитания

      Пусть у нас выполняется следующее выражение:

      number = 3 + 4 * 5 ** 2 + 7 print(number) # 110

      Здесь начале выполняется возведение в степень (5 ** 2) как операция с большим приоритетом, далее результат умножается на 4 (25 * 4), затем происходит сложение (3 + 100) и далее опять идет сложение (103 + 7).

      Чтобы переопределить порядок операций, можно использовать скобки:

      number = (3 + 4) * (5 ** 2 + 7) print(number) # 224

      Следует отметить, что в арифметических операциях могут принимать участие как целые, так и дробные числа. Если в одной операции участвует целое число (int) и число с плавающей точкой (float), то целое число приводится к типу float.

      Арифметические операции с присвоением

      Ряд специальных операций позволяют использовать присвоить результат операции первому операнду:

      • += Присвоение результата сложения
      • -= Присвоение результата вычитания
      • *= Присвоение результата умножения
      • /= Присвоение результата от деления
      • //= Присвоение результата целочисленного деления
      • **= Присвоение степени числа
      • %= Присвоение остатка от деления
      number = 10 number += 5 print(number) # 15 number -= 3 print(number) # 12 number *= 4 print(number) # 48

      Округление и функция round

      При операциях с числами типа float надо учитывать, что результат операций с ними может быть не совсем точным. Например:

      first_number = 2.0001 second_number = 5 third_number = first_number / second_number print(third_number) # 0.40002000000000004

      В данном случае мы ожидаем получить число 0.40002, однако в конце через ряд нулей появляется еще какая-то четверка. Или еще одно выражение:

      print(2.0001 + 0.1) # 2.1001000000000003

      В случае выше для округления результата мы можем использовать встроенную функцию round() :

      first_number = 2.0001 second_number = 0.1 third_number = first_number + second_number print(round(third_number)) # 2

      В функцию round() передается число, которое надо округлить. Если в функцию передается одно число, как в примере выше, то оно округляется до целого.

      Функция round() также может принимать второе число, которое указывает, сколько знаков после запятой должно содержать получаемое число:

      first_number = 2.0001 second_number = 0.1 third_number = first_number + second_number print(round(third_number, 4)) # 2.1001

      В данном случае число third_number округляется до 4 знаков после запятой.

      Если в функцию передается только одно значение — только округляемое число, оно округляется то ближайшего целого

      # округление до целого числа print(round(2.49)) # 2 - округление до ближайшего целого 2 print(round(2.51)) # 3

      Однако если округляемая часть равна одинаково удалена от двух целых чисел, то округление идет к ближайшему четному:

      print(round(2.5)) # 2 - ближайшее четное print(round(3.5)) # 4 - ближайшее четное

      Округление производится до ближайшего кратного 10 в степени минус округляемая часть:

      # округление до двух знаков после запятой print(round(2.554, 2)) # 2.55 print(round(2.5551, 2)) # 2.56 print(round(2.554999, 2)) # 2.55 print(round(2.499, 2)) # 2.5

      Однако следует учитывать, что функция round() не идеальный инструмент. Например, выше при округление до целых чисел применяется правило, согласно которому, если округляемая часть одинаково удалена от двух значений, то округление производится до ближайшего четного значения. В Python в связи с тем, что десятичная часть числа не может быть точно представлена в виде числа float, то это может приводить к некоторым не совсем ожидаемым результатам. Например:

      # округление до двух знаков после запятой print(round(2.545, 2)) # 2.54 print(round(2.555, 2)) # 2.56 - округление до четного print(round(2.565, 2)) # 2.56 print(round(2.575, 2)) # 2.58 print(round(2.655, 2)) # 2.65 - округление не до четного print(round(2.665, 2)) # 2.67 print(round(2.675, 2)) # 2.67

      Подобно о проблеме можно почитать к документации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *