Арифметическое выражение на алгоритмическом языке
Задание: записать арифметическое выражение на алгоритмическом языке и указать порядок выполнения операций.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Записать арифметическое выражение на алгоритмическом языке и указать порядок выполнения операций
записать арифметическое выражение на алгоритмическом языке и указать порядок выполнения операций. .
Решение задачи на алгоритмическом языке
Ребятки! мне преподаватель сказала, что нужно составить алгоритм на Си++ задачи, которую я.
Реализовать этот алгоритм в виде программы на алгоритмическом языке С++
Она должна состоять из: главной (main) функции, осуществляющей ввод исходных данных (матрицы) и.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Арифметическое выражение на алгоритмическом языке
Задание: записать арифметическое выражение на алгоритмическом языке и указать порядок выполнения.
Записать арифметическое выражение на алгоритмическом языке Паскаль. Результат вывести на экран
Записать арифметическое выражение на алгоритмическом языке Паскаль. Результат вывести на экран. .

Записать арифметическое выражение на алгоритмическом языке Паскаль. Результат вывести на экран
Записать арифметическое выражение на алгоритмическом языке Паскаль. Результат вывести на экран. .
Записать арифмитическое выражение на алгоритмическом языке и указать порядок выполнения операций
Записать арифмитическое выражение на алгоритмическом языке и указать порядок выполнения операций.
Алгоритм парсинга арифметических выражений
В статье рассмотрен один из возможных алгоритмов программной реализации парсера арифметических выражений, с возможностью последующего расчета их значений.
Парсер — это программа, анализирующая входное арифметическое выражение. Программы подобного класса, иногда называют так же «распознавателями».
Парсинг — процесс разбора входного арифметического выражения на более простые составляющие.
Результатом работы парсера является сформированное дерево лексем. Под лексемами будем понимать фрагменты входного арифметического выражения, которые не подлежат дальнейшему разбиению на составные части.
Описание алгоритма распознавания приводится без привязки к какому-либо языку программирования. В заключении статьи приведен пример реализации данного алгоритма на PHP. Возможна реализация алгоритма практически на любом языке программирования (даже без поддержки ООП).
Постановка задачи
- Количество открывающих скобок равно количеству закрывающих.
- Целая часть числа отделена от дробной с помощью точки.
- В строке присутствуют только допустимые символы: цифры 0. 9, операторы +-*/^, скобки, точка и параметры x, y, z.
Для каждого конкретного выражения дерево объектов строится один раз. Затем, используя полученное дерево объектов, вычисляем итоговое значение выходного выражения с учетом значений параметров. Повторять вычисления можно неограниченное число раз.
Алгоритм должен позволить обработку входных выражений неограниченной длины (в разумных пределах) без ограничений по уровню вложенности скобок.
Лексический анализ входного выражения
Перед тем как приступить непосредственно к парсингу входного выражения, желательно удалить незначащие символы (такие как пробел и т.п.) и сформировать цельные лексемы. Данная процедура не является обязательной в рамках алгоритма, однако позволяет существенно упростить понимание самого алгоритма и его программную реализацию.
Для примера, вернёмся к рассмотрению строки арифметического выражения, приведённую выше: (x+10.2)^2+5*y-z. В процессе лексического анализа указанная строка будет преобразована в массив строк следующей структуры: [0]=>”(”, [1]=>”x”, [2]=>”+”, [3]=>”10.2”, [4]=>”)”, [5]=>”^”, [6]=>”2”, [7]=>”+”, [8]=>”5”, [9]=>”*”, [10]=>”y”, [11]=>”-”, [12]=>”z”.
Таким образом, цельная лексема представляет из себя либо оператор (арифметическую операцию), либо операнд (число, состоящее из одной или нескольких цифр), либо параметр (x, y, z) или скобку (как элемент, изменяющий приоритет выполнения арифметических операций в строке).
Лексема как объект
- Поле name — определяет уникальное имя объекта.
- Поле lec — массив лексем, для хранения информации о той части входного выражения вершиной которого является данный узел «дерева» объектов.
- Поле const — если данный объект представляет собой параметр, тогда переменная хранит его наименование.
- Поле var — если данный объект представляет собой число или параметр, то переменная хранит его значение.
Все объекты древовидной структуры могут принадлежать одному классу, достаточно просто переопределить один метод при создании объекта. Или, как вариант, можно описать абстрактный класс с одной абстрактной функцией calc(). Далее для каждого типа лексемы опишем свой класс, наследующий абстрактный класс и определяющий конкретное поведение метода calc(). В примере программной реализации выбран последний способ, для которого требуется существенно меньший объём кода.
Некоторые поля могут оставаться незаполненными — это зависит от того, какую лексему моделирует данный конкретный объект.
Лексема как узел древовидной структуры
Конфигурация объектов, моделирующих лексемы в общих чертах ясна. Но тут возникает вопрос о том, как сформировать из этих объектов древовидную структуру?
Данная проблема довольно типична для проектов программного обеспечения. Суть решения можно получить из шаблона проектирования с названием: «Компоновщик». Слепое копирование всех тонкостей данного шаблона проектирования (паттерна) не входит в наши планы, поэтому пытаемся выделить самое главное и необходимое для конкретного случая.
- Поле childrenLeft — левый «наследник» данного объекта.
- Поле childrenRight — правый «наследник» данного объекта.
- Поле parent — «родитель» данного объекта.

Из приведённой схемы становится предельно ясно, почему каждый узел может иметь только двоих «наследников», или не иметь их совсем.
Полученная структура объектов вполне приемлема для расчета значений арифметических выражений посредством вызова метода calc() самого верхнего на схеме объекта.
Поиск точки «перегиба» арифметического выражения
Под точкой «перегиба» арифметического выражения будем понимать один из элементов массива лексем, являющийся оператором (арифметическим действием) и имеющем максимальное значение приоритета по отношению к другим операторам.
Для ввода возможности оценивать значения приоритетов арифметических операций в программе достаточно определить массив со структурой: [+]=>3, [-]=>3, [*]=>2, [/]=>2, [^]=>1.
Если значение приоритета максимально у нескольких операторов, следует выбирать последний из них, это позволит сформировать древовидную структуру корректно вычисляющую численные значения.
Далее в массиве лексем выделяются элементы, стоящие слева от точки «перегиба» и записываются в поле lec объекта, являющегося левым «наследником». Элементы, расположенные справа от точки «перегиба» заносятся в аналогичное поле правого «наследника». Следует так же упомянуть, что при поиске точки «перегиба» следует учитывать уровень вложенности скобок в массиве цельных лексем.
Построение древовидной структуры
В данном разделе подробно разберём последовательность формирования «дерева» объектов в рамках предложенного алгоритма.
Рассмотрим процедуру построения первых трёх объектов «дерева», включая корневой объект и его двоих «наследников». Получив на входе массив цельных лексем всего арифметического выражения, находим в нём точку «перегиба». Напомню, что это всегда оператор (арифметическое действие). Значение найденной точки «перегиба» позволяет однозначно определить класс объекта, находящегося на вершине структуры. Далее делим массив лексем на две части, как было описано выше. В каждой из обеих частей так же находим точки «перегиба», которые указывают на класс объектов левого и правого «наследников». Теперь можно сформировать все три объекта и указать связи между ними. В завершение объекты помещают в массив arNode для последующих действий над ними.
Для нашего входного выражения: (x+10.2)^2+5*y-z описанная процедура выглядит следующим образом. Под определение точки «перегиба» подпадают два оператора: «+» (между цифрами «2» и «5») и «-». Выбираем последний оператор в перечне: «-». Значение этого оператора позволяет выбрать необходимый класс корневого объекта и его имя. В частности, формируется объект класса Minus с именем Minus1. После деления исходного массива лексем на две части получаем два массива из элементов: (x+10.2)^2+5*y и z. Для первой лексемы точка перегиба «+», а вторая состоит только из одного элемента z. Это значит, что в качестве «наследников» корневого объекта следует сформировать объекты классов Plus и Constant с именами Plus1 и Constant1 соответственно. Осталось заполнить поля вновь созданных объектов: childrenLeft, childrenRight и parent для формирования древовидной структуры и внести объекты в массив arNode.
Дальнейшее формирование «дерева» очень похоже на процедуру создания первой тройки, но имеет свои тонкости. В массиве arNode простым перебором по элементам массива ищем объект с полем lec, содержащем более одного элемента в массиве и одновременно с пустыми полями childrenLeft и childrenRight. Считываем значение поля lec у выбранного объекта, делим его на две части в точке «перегиба». Далее находим точки «перегиба» у получившихся обеих частей и формируем два объекта-наследника для выбранного объекта, в соответствии с логикой изложенной выше. Не забываем формировать связи между объектами и добавлять сами объекты в массив arNode.
Указанную последовательность действий повторяем до тех пор, пока ни один из объектов древовидной структуры не будет соответствовать указанным условиям. Теперь можно считать, что «дерево» для нашего входного выражения построено и готово для вычисления значений.
Вычисление значений
Процесс вычисления значений входного арифметического выражения становится предельно ясен при просмотре листинга программной реализации алгоритма. Остановимся на некоторых существенных моментах.
Расчет происходит после вызова метода calc() объекта класса Main. В программе предусмотрена возможность использования не более трех параметров при вызове данного метода: x, y, z. Несложно это количество изменить с учетом потребностей конкретного применения описанного алгоритма.
Предварительно метод ищет в массиве объекты, описывающие лексемы параметров, затем в поля var найденных объектов заносятся числовые значения, указанные при вызове метода calc(). Теперь можно приступать к поиску в массиве arNode объекта с пустым полем parent (это будет корневой объект древовидной структуры) и вызвать его метод calc(). Метод возвращает значение арифметического выражения.
Пример программной реализации
Листинг программной реализации решено выложить целиком. Это позволяет скопировать программу целиком при необходимости проведения с ней экспериментов или доработки.
‘; echo print_r($arStr); echo ‘
‘; // преобразуем массив символов в массив лексем $j=0; $accum = $arStr[0]; for($i=1; $i if($accum==»-» && $i==1) < if(preg_match("/\d/", $arStr[$i]))< $accum = $accum.$arStr[$i]; >if($arStr[$i]==»(«) < $arLec[$j] = "0"; $arLec[++$j] = "-"; ++$j; $accum = $arStr[$i]; >continue; > if($accum==»-» && $arLec[$j-1]==»(«) < $accum = $accum.$arStr[$i]; continue; >if (preg_match(«/^[\d.]/», $accum) && preg_match(«/^[\d.]/», $arStr[$i]))< $accum = $accum.$arStr[$i]; >else < $arLec[$j] = $accum; ++$j; $accum = $arStr[$i]; >> /* $j = 0; if($arStr[0]==»-«)< $accum = $arStr[0]; >else < $accum = $arStr[0]; >for ($i=1; $i if (preg_match(«/^[\d.]/», $accum)&&preg_match(«/^[\d.]/», $arStr[$i]))< $accum = $accum.$arStr[$i]; >else < $arLec[$j] = $accum; ++$j; $accum = $arStr[$i]; >> * */ echo ‘
'; echo print_r($arLec); echo '
‘; return $arLec; > // построение одного объекта function objBuilder($point) < static $arNumNode = Array( "addition" =>1, «subtraction» => 1, «exponentiation» =>1, «multiplication» => 1, «division» => 1, «number» => 1, «constant» => 1); switch ($point)< case "+": $name = "Plus".$arNumNode["addition"]; $node = new Plus($name); ++$arNumNode["addition"]; break; case "-": $name = "Minus".$arNumNode["subtraction"]; $node = new Minus($name); ++$arNumNode["subtraction"]; break; case "*": $name = "Multiply".$arNumNode["multiplication"]; $node = new Multiply($name); ++$arNumNode["multiplication"]; break; case "/": $name = "Fission".$arNumNode["division"]; $node = new Fission($name); ++$arNumNode["division"]; break; case "^": $name = "Exponent".$arNumNode["exponentiation"]; $node = new Exponent($name); ++$arNumNode["exponentiation"]; break; case "x": $name = "Constant".$arNumNode["constant"]; $node = new Constant($name); $node->const = «x»; $node->var = 0; ++$arNumNode[«constant»]; break; case «y»: $name = «Constant».$arNumNode[«constant»]; $node = new Constant($name); $node->const = «y»; $node->var = 0; ++$arNumNode[«constant»]; break; case «z»: $name = «Constant».$arNumNode[«constant»]; $node = new Constant($name); $node->const = «z»; $node->var = 0; ++$arNumNode[«constant»]; break; default: $name = «Variable».$arNumNode[«number»]; $node = new Variable($name); $node->var = $point; ++$arNumNode[«number»]; > return $node; > // строительство тройки объектов дерева function trioBuilder($topLec, $leftLec, $rightLec, $topP, $leftP, $rightP, $topObj)< // вершина тройки if(!$topObj)< $topTrio = objBuilder($topP); $topTrio->lec = $topLec; > else < $topTrio = $topObj; >// левая ветвь тройки $leftTrio = objBuilder($leftP); $leftTrio->lec = $leftLec; // правая ветвь тройки $rightTrio = objBuilder($rightP); $rightTrio->lec = $rightLec; // формирование тройки из объектов $topTrio->childrenLeft = $leftTrio; $topTrio->childrenRight = $rightTrio; $leftTrio->parent = $topTrio; $rightTrio->parent = $topTrio; if(!$topObj) < $trio = Array($topTrio, $leftTrio, $rightTrio); return $trio; >else < $duo = Array($leftTrio, $rightTrio); return $duo; >> // проверка на полное построение дерева function stopBuild($arNode)< foreach ($arNode as $obj)< if($obj->lec[1] && !$obj->childrenLeft && !$obj->childrenRight) < return FALSE; >> return TRUE; > // поиск вершины для следующей тройки function searchObj($arNode)< foreach ($arNode as $obj)< if($obj->lec[1] && !$obj->childrenLeft && !$obj->childrenRight) < return $obj; >> > // определение точки перегиба выражения function inflPoint($lec) < $infl=0; $max=0; static $br = 0; static $arPrioritet = Array( "+" =>3, «-» => 3, «*» => 2, «/» => 2, «^» => 1); foreach ($lec as $key=>$value) < if(preg_match("/^[\d.]/", $value))< continue; >if($value==»(«) < ++$br; continue; >if($value==»)») < --$br; continue; >if($arPrioritet[$value]-3*$br >= $max) < $max=$arPrioritet[$value]-3*$br; $infl=$key; >> return $infl; > $arLec = parse($str); // первая тройка дерева $topN = inflPoint($arLec); $topP = $arLec[$topN]; $leftLec = array_slice($arLec, 0, $topN); if($leftLec[0]==»(» && $leftLec[count($leftLec)-1]==»)») < array_shift($leftLec); array_pop($leftLec); >$rightLec = array_slice($arLec, $topN+1); if($rightLec[0]==»(» && $rightLec[count($rightLec)-1]==»)») < array_shift($rightLec); array_pop($rightLec); >$leftN = inflPoint($leftLec); $leftP = $leftLec[$leftN]; $rightN = inflPoint($rightLec); $rightP = $rightLec[$rightN]; $trio = trioBuilder($arLec, $leftLec, $rightLec, $topP, $leftP, $rightP, NULL); $arNode = $trio; // все последующие тройки дерева while (!stopBuild($arNode))< $topTrio = searchObj($arNode); $arLec = $topTrio->lec; $topN = inflPoint($arLec); $leftLec = array_slice($arLec, 0, $topN); if($leftLec[0]==»(» && $leftLec[count($leftLec)-1]==»)») < array_shift($leftLec); array_pop($leftLec); >$rightLec = array_slice($arLec, $topN+1); if($rightLec[0]==»(» && $rightLec[count($rightLec)-1]==»)») < array_shift($rightLec); array_pop($rightLec); >$leftN = inflPoint($leftLec); $leftP = $leftLec[$leftN]; $rightN = inflPoint($rightLec); $rightP = $rightLec[$rightN]; $duo = trioBuilder(NULL, $leftLec, $rightLec, NULL, $leftP, $rightP, $topTrio); $arNode = array_merge($arNode, $duo); > $this->arNode = $arNode; > > abstract class Term < public $name; public $childrenLeft; public $childrenRight; public $parent; public $lec; public $const; public $var; public function __construct($name) < $this->name = $name; > abstract function calc(); > class Plus extends Term < public function calc() < return $this->childrenLeft->calc()+$this->childrenRight->calc(); > > class Minus extends Term < public function calc() < return $this->childrenLeft->calc()-$this->childrenRight->calc(); > > class Multiply extends Term < public function calc() < return $this->childrenLeft->calc()*$this->childrenRight->calc(); > > class Fission extends Term < public function calc() < return $this->childrenLeft->calc()/$this->childrenRight->calc(); > > class Exponent extends Term < public function calc() < return pow ($this->childrenLeft->calc(), $this->childrenRight->calc()); > > class Constant extends Term < public function calc() < return $this->var; > > class Variable extends Term < public function calc() < return $this->var; > > // задаем исходное математическое выражение $str = «(x+10.2)^2+5*y-z»; $x = 2; $y = 1; $z = 3; $parse = new Main(); // строительство дерева классов $parse->builder($str); //echo ‘
'; //echo print_r($parse->arNode); //echo '
‘; echo $str.» при: x=».$x.»; y=».$y.»; z tm-article-presenter__meta»>
- программирование
- алгоритм
- расчет арифметических выражений
Алгоритм вычисления арифметического выражения в виде строки
В нашей славной компании есть очень хорошая, стимулирующая система т.н. грейдов: раз в полгода, любой разработчик может повысить свой грейд, что влечет за собой увеличение зарплаты. Другими словами, грейд — это аттестация. Хочешь увеличить зарплату? Раз в полгода можешь аттестоваться на следующую ступень, и расти от джуна до сеньора (за один раз можно перепрыгнуть не более, чем на две ступени). Аттестация проходит в дружелюбной форме, вопросы выложены в базе знаний, никакой бюрократической волокиты нет. Условием для допуска к аттестации служит решение алгоритмической задачи.
И вот я аттестовываюсь, и мне дают задачу: вычислить арифметическое выражение в виде строки. Да фигня вопрос, скажете вы (как и я в начале). Все это давно описано, и ничего сложного здесь нет. Вы будете одновременно правы и неправы. Вопрос то, конечно фигня, но это алгоритмическая задача. Готовые библиотеки использовать нельзя, нужно написать именно алгоритмическое решение. И окунулся я в мир операндов, операторов, как бинарных, так и унарных. И как все это красиво распарсить, как не запутаться со скобками, и… самым коварным оказался унарный минус.
Решение писать будем на php.
Чего-то нового в этой задаче, конечно же, нет. После недолгого гугления мы находим, что для разбора арифметического выражения в виде строки, машиной, лучше всего подходит Обратная польская запись. Материалов по ОПЗ много, разбирать её подробно смысла нет. Например, ссылка на вики.
Пример записи в ОПЗ: 3 4 2 + *
В упрощенном виде можно сказать, что ОПЗ — это запись арифметического выражения, в котором операторы записываются после операндов, и в котором нет скобок.
Под операндами мы понимаем вещественные числа, под операторами — символы арифметических операций +, -, *, /, ^
Почему ОПЗ так хороша для машинных вычислений?
Да потому, что в выражении нет скобок, и машине не надо производить лишних действий. Есть только операнды и операторы. Причем операторы всегда пишутся после операндов (постфиксная запись).
Машина линейно идет по строке, если попалось число, то кладем его в стек, иначе, если оператор бинарный, берем из стека правый операнд, берем из стека левый операнд, вычисленное значение кладем в стек. Когда дойдем до конца строки, достаем из стека результат вычислений.
В упрощенном виде (без проверок) это выглядит так:
$right = array_pop($stack); $left = array_pop($stack); switch ($item) < case '-': $stack[] = $left - $right; break; case '+': $stack[] = $left + $right; break; case '*': $stack[] = $left * $right; break; case '/': $stack[] = $left / $right; break; case '^': $stack[] = $left ** $right; break; >> // результат вычисления арифметического выражения echo $stack[0] . PHP_EOL;
Все вроде просто, понятно, пока мы не продолжим читать про ОПЗ дальше. Цитата из вики:
В отличие от инфиксной записи, невозможно использовать одни и те же знаки для записи унарных и бинарных операций
Т.е. знак — (минус) мы можем использовать только как оператор вычитания. Для обозначения унарного минуса в ОПЗ, мы его использовать не можем.
Нам прямо предписывается использовать для обозначения унарного минуса любой свой придуманный символ. Давайте договоримся, что это будет тильда ~ .
Более того — унарный оператор в ОПЗ имеет наивысший приоритет (в данной статье мы будем говорить про унарный минус)!
Что за нафиг? Почему какому-то несчастному оператору (унарный минус), уделяется столько внимания? Мы должны придумать для него специальный символ, и вдобавок ко всему у него еще и наивысший приоритет при разборе выражения?
Ну, с приоритетом понятно — действительно, прежде чем вычислять выражение, мы, в первую очередь, должны разобраться с положительными и отрицательными числами.
Разбираемся дальше. Для этого примем (вспомним) два постулата:
- Любое число, в памяти машины, хранится в виде байт-кода. Отрицательное число определяется значением старшего бита
- Для машины символ минус — это всегда оператор вычитания. Ни о каких унарных минусах машина не знает
Что из этого следует? Давайте рассмотрим простейший пример:
$a = -2
Что происходит в данном примере, с точки зрения машины?
Переменной $a необходимо присвоить отрицательное значение числа 2.
Для машины минус — это оператор вычитания. Операция бинарная. Справа 2, а слева ничего нет. Т.е. слева 0.
Т.е. в $a попадет результат вычисления выражения 0 — 2 . Вычитать машина умеет прекрасно, в память машины будет записано верное отрицательное число.
Смотрим дальше. Есть выражение с двумя унарными минусами, например —2 .
Как его должна считать машина? Если следовать нашей логике, то так: 0 — (0 — 2) .
Т.е. унарный минус — это не просто вычитание операнда из ноля, но еще и правоассоциативная арифметическая операция, как и оператор возведения в степень.
Прежде чем идти дальше, давайте дадим определение унарному минусу в инфиксном арифметическом выражении:
- Унарный минус — это оператор — (минус), перед которым в арифметическом выражении всегда стоит не число, и не закрывающая скобка
Подведем промежуточные итоги
- Мы выяснили, что для машинного разбора строки с арифметическим выражением необходимо его привести к ОПЗ (постфиксная запись)
- Мы разобрались почему у унарного минуса наивысший приоритет, и мы запомнили, что у него должен быть свой символ (у нас это тильда ~)
Нам осталось разобрать алгоритм приведения инфиксного арифметического выражения к постфиксному
Опять же всё давно изобретено до нас, использовать мы будет классический алгоритм сортировочной станции. Просто распишем его максимально подробно и понятно.
Прежде чем приступить к описанию алгоритма уточним давно известный алгоритм приоритета стековых операций.
В нашем случае операторы и приоритеты стековых операций будут выглядеть так:
private const UNARY_MINUS = '~'; private const OPEN_BRACKET = '('; private const CLOSE_BRACKET = ')'; private const MINUS = '-'; private const PLUS = '+'; private const DIVISION = '/'; private const MULTIPLICATION = '*'; private const EXPONENTIATION = '^'; private const PRIORITY = [ self::OPEN_BRACKET => 0, self::CLOSE_BRACKET => null, self::PLUS => 2, self::MINUS => 2, self::MULTIPLICATION => 3, self::DIVISION => 3, self::EXPONENTIATION => 4, self::UNARY_MINUS => 5 ];
Также необходимо определить правоассоциативные арифметические операции:
private const RIGHT_ASSOCIATIVE_EXPRESSION = [ self::EXPONENTIATION, self::UNARY_MINUS ];
В процессе разбора строки мы будем использовать понятие выходная строка (постфиксное выражение) и стек.
Алгоритм приведения инфиксной записи к постфиксной
Если при разборе строки нам встретилось число, то помещаем его в выходную строку
Иначе
- Если в стеке пусто, или нам попалась открывающая скобка — помещаем оператор в стек
- Если нам попался правоассоциативный оператор, и на вершине стека лежит такой же оператор, то ничего не делаем, просто добавляем оператор в стек
Иначе
- Если нам попалась не закрывающая скобка, то выталкиваем из стека, в выходную строку, операторы с бОльшим, или равным приоритетом. Если, при выталкивании из стека, нам попался оператор с мЕньшим приоритетом — останавливаемся.
Добавляем оператор на вершину стека. - Если нам попалась закрывающая скобка, то выталкиваем из стека, в выходную строку, все операторы до первой открывающей скобки. Открывающую скобку из стека удаляем
- Если строка закончилась — выталкиваем все операторы из стека в строку вывода
Собственно всё. Данный алгоритм можно реализовать на любом ЯП.
Давайте приведём «вручную» выражение 2 * (2 + -2 ^ 2 ^ 3) — 1 к ОПЗ, и вычислим его
Приводим к постфиксной записи
Определим переменные для вычисления
$stack = []; $outString = [];
Разбираем строку 2 * (2 + -2 ^ 2 ^ 3) — 1
-
Первый символ в строке 2, это число — помещаем его в выходную строку
$outString = [2];
$outString = [2]; $stack = ['*'];
$outString = [2]; $stack = ['*', '('];
$outString = [2, 2]; $stack = ['*', '('];
$outString = [2, 2]; $stack = ['*', '(', '+'];
$outString = [2, 2]; $stack = ['*', '(', '+', '~'];
$outString = [2, 2, 2]; $stack = ['*', '(', '+', '~'];
$outString = [2, 2, 2, '~']; $stack = ['*', '(', '+', '^'];
И так далее… — если число, то помещаем в строку вывода, если оператор, то пытаемся вытолкнуть из стека, в строку вывода, другие операторы, сам оператор ставим на вершину стека. Всё согласно алгоритму выше.
Открывающая скобка имеет наименьший приоритет, её вытолкнуть нельзя, она должна быть уничтожена закрывающей скобкой. Приоритеты операторов мы также определили.
В конечном итоге мы получаем постфиксное выражение 2 2 2 ~ 2 3 ^ ^ + * 1 —
Ну, дальше, как было написано выше, дело техники.
- Мы идем по строке с постфиксным выражением.
- Если нам попалось число, то кладём его в стек.
- Если нам попался унарный минус, то приводим число на вершине стека, к отрицательному значению (0 минус операнд).
Если нам попался бинарный оператор
- берем с вершины стека число — это правый операнд
- берем с вершины стека число — это левый операнд
- вычисляем выражение, кладем его в стек
Если строка закончилась, возвращаем вычисленное значение из стека (если арифметическое выражение верно, то в стеке останется один элемент).
Полное решение на языке php
Спойлер
Пример использования класса Calculate
postfixString) < echo 'Исходное выражение: ' . $expression; echo 'Строка в постфиксной записи (~ - это унарный минус): ' . $calc->postfixString . PHP_EOL; echo 'Результат вычисления постфиксной записи: ' . $calc->result . PHP_EOL; > else < echo $calc->result . PHP_EOL; >
Листинг класса Calculate
0, self::CLOSE_BRACKET => 1, self::PLUS => 2, self::MINUS => 2, self::MULTIPLICATION => 3, self::DIVISION => 3, self::EXPONENTIATION => 4, self::UNARY_MINUS => 5 ]; private const RIGHT_ASSOCIATIVE_EXPRESSION = [ self::EXPONENTIATION, self::UNARY_MINUS ]; private array $stack = []; private array $outString = []; /** * @var float|string */ public $result; public string $postfixString = ''; public function __construct(string $expression) < try < $expression = $this->checkExpression($expression); $this->createOutString($expression); $this->postfixString = implode(' ', $this->outString); $this->calcFromOutString(); > catch (Exception $e) < $this->result = $e->getMessage(); > > private function checkExpression(string $expression): string < preg_match('/-?\d+\s+-?\d+/', $expression, $matches); if ($matches) < throw new DomainException('Между числами нет оператора!'); >$openBracket = substr_count($expression, self::OPEN_BRACKET); $closeBracket = substr_count($expression, self::CLOSE_BRACKET); if ($openBracket !== $closeBracket) < throw new DomainException('Непарные скобки!'); >// удаляем все пробелы из строки $expression = preg_replace('/\s/', '', $expression); $expression = str_replace(',', '.', $expression); preg_match('/[^\d()+\/*-.^]+/', $expression, $matches); if ($matches) < throw new DomainException('Ошибка! В строке могут быть только цифры, скобки, и операторы +, -, *, /, ^'); >return $expression; > private function calc($left, $right, $operator) < switch ($operator) < case self::MINUS: return $left - $right; case self::PLUS: return $left + $right; case self::MULTIPLICATION: return $left * $right; case self::EXPONENTIATION: return $left ** $right; case self::DIVISION: if ($right == 0) < throw new DomainException('Деление на ноль!'); >return $left / $right; default: throw new DomainException('Неизвестный оператор ' . $operator); > > /** * приводим к постфиксной записи */ private function createOutString(string $expression) < $length = strlen($expression) - 1; $number = null; for ($i = 0; $i > $number .= $item; if ($right !== '.' && !is_numeric($right)) < $this->outString[] = (float)$number; $number = null; > continue; > if ($item === self::MINUS) < if (!is_numeric($left) && $left !== self::CLOSE_BRACKET) < $item = self::UNARY_MINUS; >> if ($item === self::OPEN_BRACKET && is_numeric($left)) < throw new DomainException('Перед открывающей скобкой нет оператора'); >if ($item === self::CLOSE_BRACKET && (is_numeric($right) || $right === self::OPEN_BRACKET)) < throw new DomainException('После закрывающей скобки нет оператора'); >$this->addToStackAndPushFromStack($item); > while ($this->stack) < $this->outString[] = array_pop($this->stack); > > private function addToStackAndPushFromStack(string $operator) < if (!$this->stack || $operator === self::OPEN_BRACKET) < $this->stack[] = $operator; return; > $stack = array_reverse($this->stack); if ($operator === self::CLOSE_BRACKET) < foreach ($stack as $key =>$item) < unset($stack[$key]); if ($item === self::OPEN_BRACKET) < $this->stack = array_reverse($stack); return; > $this->outString[] = $item; > > foreach ($stack as $key => $item) < if (in_array($item, self::RIGHT_ASSOCIATIVE_EXPRESSION) && $item === $operator) < break; >if (self::PRIORITY[$item] < self::PRIORITY[$operator]) < break; >$this->outString[] = $item; unset($stack[$key]); > $this->stack = array_reverse($stack); $this->stack[] = $operator; > /** * Вычисляем из постфиксной записи */ private function calcFromOutString() < $stack = []; foreach ($this->outString as $item) < if (is_float($item)) < $stack[] = $item; continue; >if ($item === self::UNARY_MINUS) < $last = array_pop($stack); if (!is_numeric($last)) < throw new DomainException('Неверное выражение!'); >$stack[] = 0 - $last; continue; > $right = array_pop($stack) ?? null; $left = array_pop($stack) ?? null; if ($right === null || $left === null) < throw new DomainException('Неверное выражение!'); >$stack[] = $this->calc($left, $right, $item); > $this->result = $stack[0]; > >
Подведем итоги
Для красивого вычисления арифметического выражения в виде строки необходимо:
- Разобраться что такое Обратная польская запись, и почему она идеально подходит для машинных вычислений
- Привести арифметическое выражение к ОПЗ, и вычислить его
И для первого, и для второго пункта ключевым понятием является стек — последовательность, организованная по принципу — последний зашел, первый вышел. На вершине стека всегда находится его последний элемент.
Как записать арифметическое выражение на алгоритмическом языке
В записи логических выражений помимо арифметических операций сложения, вычитания, умножения, деления и возведения в степень используются операции отношения(меньше),(больше), = (больше или равно), = (равно),(не равно), а также логические операции и, или, не.
Примеры записи логических выражений, истинных при выполнении указанных условий.
| Условие | Запись на школьном алгоритмическом языке |
| Дробная часть вещественого числа a равна нулю | int(a) = 0 |
| Целое число a — четное | mod(a, 2) = 0 |
| Целое число a — нечетное | mod(a, 2) = 1 |
| Целое число k кратно семи | mod(a, 7) = 0 |
| Каждое из чисел a, b положительно | (a0) и (b0) |
| Только одно из чисел a, b положительно | ((a0) и (b |
| Хотя бы одно из чисел a, b, c является отрицательным | (a |
| Число x удовлетворяет условию axb | (xa) и (x |
| Число x имеет значение в промежутке [1, 3] | (x=1) и (x |
| Целые числа a и b имеют одинаковую четность | ((mod(a, 2)=0) и (mod(b, 2)=0) или ((mod(a, 2)=1) и (mod(b, 2)=1)) |
| Точка с координатами (x, y) лежит в круге радиуса r с центром в точке (a, b) | (x-a)**2 + (y-b)**2r*r |
| Уравнение ax^2 + bx + c = 0 не имеет действительных корней | b*b — 4*a*c0 |
| Точка (x, y) принадлежит первой или третьей четверти | ((x0) и (y0)) или((x0)) |
| Точка (x, y) принадлежит внешности единичного круга с центром в начале координат или его второй четверти | (x*x + y*y1) или((x*x + y*y |
| Целые числа a и b являются взаимнопротивоположными | a = -b |
| Целые числа a и b являются взаимнообратными | a*b = 1 |
| Число a больше среднего арифметического чисел b, c, d | a(b+c+d) / 3 |
| Число a не меньше среднего геометрического чисел b, c, d | a = (b+c+d) ** (1/3) |
| Хотя бы одна из логических переменных F1 и F2 имеет значение да | F1 или F2 |
| Обе логические переменые F1 и F2 имеют значение да | F1 и F2 |
| Обе логические переменые F1 и F2 имеют значение нет | не F1 и не F2 |
| Логическая переменная F1 имеет значение да, а логическая переменная F2 имеет значение нет | F1 и не F2 |
| Только одна из логических переменных F1 и F2 имеет значение да | (F1 и не F2) или (F2 и не F1) |
7.1. Запишите по правилам алгоритмического языка выражения:
| a) | e) |
| б) | ж) |
| в) | з) |
| г) | и) |
| д) | к) |
7.2. Запишите в обычной математической форме арифметические выражения:
| а) a / b ** 2; б) a+b/c+1; в) 1/a*b/c; г) a**b**c/2; д) (a**b)**c/2; е) a/b/c/d*p*q; ж) x**y**z/a/b; з) 4/3*3.14*r**3; и) b/sqrt(a*a+b); к) d*c/2/R+a**3; | л) 5*arctg(x)-arctg(y)/4; м) lg(u*(1/3)+sqrt(v)+z); н) ln(y*(-sqrt(abs(x)))); о) abs(x**(y/x)-(y/x)**(1/3)); п) sqrt((x1-x2)**2+(y1-y2)**2); р) exp(abs(x-y))*(tg(z)**2+1)**x; c) lg(sqrt(exp(x-y))+x**abs(y)+z); т) sqrt(exp(a*x)*sin(x)**n)/cos(x)**2; у) sqrt(sin(arctg(u))**2+abs(cos(v))); ф) abs(cos(x)+cos(y))**(1+sin(y)**2); |
7.3. Вычислите значения арифметических выражений при x=1:
Решение: abs(1-3)=2; ln(exp(3))=3; lg(10000)=4; 2/3*2/4=0.33;
7.4. Запишите арифметические выражения, значениями которых являются:
а) площадь треугольника со сторонами a, b, c (a, b, c0) и полупериметром p;
б) среднее арифметическое и среднее геометрическое чисел a, b, c, d;
в) расстояние от точки с координатами (x,y) до точки (0,0);
г) синус от x градусов;
д) площадь поверхности куба (длина ребра равна а);
е) радиус описанной сферы куба (длина ребра равна а);
ж) координаты точки пересечения двух прямых, заданных уравнениями
a1x+b1y+c1=0 и a2x+b2y+c2=0 (прямые не параллельны).
7.5. Вычислите значения логических выражений:
д) (mod(a,7)=1) и (div(a,7)=1) при a=8;
7.6. Запишите логические выражения, истинные только при выполнении указанных условий:
а)x принадлежит отрезку [a, b]
б)x лежит вне отрезка [a, b];
в)x принадлежит отрезку [a, b] или отрезку [c, d];
г)x лежит вне отрезков [a, b] и [c, d];
д)целое k является нечетным числом;
е)целое k является трехзначным числом, кратным пяти;
ж)элемент ai,j двумерного массива находится на пересечении нечетной строки и четного столбца;
з)прямые a1x+b1y+c1=0 и a2x+b2y+c2=0 параллельны;
и)из чисел a, b, c меньшим является с, а большим b;
к)среди чисел a, b, c, d есть взаимно противоположные;
л)среди целых чисел a, b, c есть хотя бы два четных;
м)из отрезков с длинами a, b, c можно построить треугольник;
н)треугольники со сторонами a1, b1, c1 и a2, b2, c2 подобны;
о)точка с координатами (x,y) принадлежит внутренней области треугольника с вершинами A(0,5), B(5,0) и C(1,0);
п)точка с координатами (x,y) принадлежит области, внешней по отношению к треугольнику с вершинами A(0,5), B(1,0) и C(5,0);
р)четырехугольник со сторонами a, b, c и d является ромбом.
7.7. Начертите на плоскости (x,y) область, в которой и только в которой истинно указанное выражение. Границу, не принадлежащую этой области, изобразите пунктиром.
| а) (x=0) Ответ: | е) ((x-2)**2+y*yx/2) Ответ: |
| б) (x=0) или (y=0г) (x+y0) и (y=1 | ж) (x*x+y*yx*x);з) (y=x) и (y+x=0) и (y1); |
7.8. Запишите логическое выражение, которое принимает значение истина тогда и только тогда, когда точка с координатами (x, y) принадлежит заштрихованной области.
7.9. Пусть a=3, b=5, c=7. Какие значения будут иметь эти переменные в результате выполнения последовательности операторов:
Ответ: а=2, b=9, c=13;
7.10. Задайте с помощью операторов присваивания следующие действия:
а)массив X=(x1, x2) преобразовать по правилу: в качестве x1 взять сумму, а в качестве х2 — произведение исходных компонент;
б) поменять местами значения элементов массива X=(x1, x2);
в) в массиве A(N) компоненту с номером i (1
г) u = max(x, y, z) + min(x-z, y+z, y, z);
7.11. Задайте с помощью команд если или выбор вычисления по формулам:
| a) | |
| б) | |
| в) | где |
| г) | |
| д) | |
| е) | |
| ж) | если точка лежит внутри круга радиусом r (r0) с центром в точке (a,b) в противном случае |
7.12. Постройте графики функций y(x), заданных командами если:
| а) если x | в) если x |
| Решение | г) если x |
| б) если x | д) если abs(x)2то y:=x*xиначе если x=1то y:=4иначе y:=4*x*x все все все |
7.13. Определите значение целочисленной переменной S после выполнения операторов:
| а) S:=128 нц для i от 1 до 4 S:=div(S,2) кц | Решение |
| i | S |
| 128/2=64 | |
| 64/2=32 | |
| 32/2=16 | |
| 16/2=8 |
7.14. Определите значение переменной S после выполнения операторов:
| а) i:=0; S:=0 нц пока i | г) S:=0; N:=125 нц пока N0 S:=S+mod(N,10) | S — сумма цифр N:=div(N,10) | числа N кц |
| Решение |
| Условие i3 | i | S |
| 03? да | 0+12=1 | |
| 13? да | 1+22=5 | |
| 23? да | 5+32=14 | |
| 33? нет(кц) |
7.15. Составьте алгоритмы решения задач линейной структуры (условия этих задач заимствованы из учебного пособия В.М. Заварыкина, В.Г. Житомирского и М.П. Лапчика Основы информатики и вычислительной техники, 1989):
а) в треугольнике известны три стороны a, b и c; найти (в градусах) углы этого треугольника, используя формулы:
| С=180o-(А+В). |
Пояснение. Обратите внимание на то, что стандартные тригонометрические функции arccos и arcsin возвращают вычисленное значение в радианной мере.
алг Углы треугольника(арг вещ a,b,c, рез вещ UgolA,UgolB,UgolC)нач вещ RadGr,UgolARad | RadGr — коэф. перевода угла из радианной меры в градусную | UgolARad — угол A (в радианах) RadGr:=180/3.14 UgolARad:=ArcCos((b*b+c*c-a*a)/(2*b*c)) UgolA:=UgolARad*RadGr UgolB:=ArcSin(b*sin(UgolARad)/a)*RadGr UgolC:=180-(UgolA+UgolB)кон
б) в треугольнике известны две стороны a, b и угол C (в радианах) между ними; найти сторону c, углы A и B (в радианах) и площадь треугольника, используя формулы:
с2 = a2 + b2 — 2ab cos C.
Пояснение. Сначала нужно найти сторону c , а затем остальные требуемые значения;
в) в треугольнике известны три стороны a, b и c; найти радиус описанной окружности и угол A (в градусах), используя формулы:
г) в правильной треугольной пирамиде известны сторона основания a и угол A (в градусах) наклона боковой грани к плоскости основания; найти объем и площадь полной поверхности пирамиды, используя формулы:
| V=Socн· H/2; |
| где |
д) в усеченном конусе известны радиусы оснований R и r и угол A (в радианах) наклона образующей к поверхности большего основания; найти объем и площадь боковой поверхности конуса, используя формулы:
e) в правильной четырехугольной пирамиде сторона основания равна a , а боковое ребро наклонено к плоскости основания под углом A ; найти объем и площадь полной поверхности пирамиды и площадь сечения, проходящего через вершину пирамиды и диагональ основания d ; использовать формулы:
7.16. Составьте алгоритм решения задач развлетвляющейся структуры:
а) определить, является ли треугольник с заданными сторонами a, b, c равнобедренным;
алг Треугольник(арг вещa,b,c, рез лог Otvet)дано | a0, b0, c0, a+bc, a+cb, b+caнадо| Otvet = да, если треугольник равнобедренный | Otvet = нет, если треугольник не равноведренныйнач если (a=b) или (a=c) или (b=c)то Otvet:= да иначе Otvet:= нет всекон
б) определить количество положительных чисел среди заданных чисел a, b и c;
в) меньшее из двух заданных неравных чисел увеличить вдвое, а большее оставить без изменения;
г) числа a и b — катеты одного прямоугольного треугольника, а c и d — другого; определить, являются ли эти треугольники подобными;
д) даны три точки на плоскости; определить, какая из них ближе к началу координат;
е) определить, принадлежит ли заданная точка (x, y) плоской фигуре, являющейся кольцом с центром в начале координат, с внутренним радиусом r1 и внешним радиусом r2 ;
ж) упорядочить по возрастанию последовательность трех чисел a, b и c.
Ответы — Раздел 7. Алгоритмы. Алгоритмизация. Алгоритмические языки
7.2. а) ;б) ;в) ;г) ;д) ;е) ;ж) ;з) ;и) ;к) ;л) ;м) ;н) ;о) ;п) ;р) ;с) ;т) ;у) ;ф) .
7.3. б) 16; в) 5,5;г) -256; д) 3;е) -2; ж) 1.8.
7.4. б) среднее арифметическое: (a+b+c+d)/4; среднее геометрическое: (a*b*c*d)**(1/4);в) sqrt(x*x+y*y); г) sin(x*3.14/180); д) 6*a*a; е) sqrt(3)*a/2;ж) абсцисса: (c1*b2-c2*b1)/(b1*a2-b2*a1); ордината: (c2*a1-c1*a2)/(b1*a2-b2*a1).
7.5. б) нет;в) да;г) да;д) да;е) нет;
б) (xa) или (xb);в) ((x=a) и (x=c) и (x b)) и ((xc) или (xd));д) mod(k,2)=1;е) (mod(k,5)=0) и (k99) и (k1000);ж) (mod(i,2)=1) и (mod(j,2)=0);з) a1*b2=a2*b1;и) (ca) и (ba);к) (a=-b) или (a=-c) или (a=-d) или (b=-c) или (b=-d) или (c=-d);л) ((mod(a,2)=0) и (mod(b,2)=0)) или ((mod(a,2)=0) и (mod(c,2)=0))или ((mod(b,2)=0) и (mod(с,2)=0));м) (a0) и (b0) и (c0) и (a+bc) и (a+cb) и (b+ca);н) ((a1*b2=a2*b1) и (a1*c2=a2*c1)) или ((a1*c2=a2*b1) и (a1*b2=a2*c1))или ((a1*c2=b2*b1) и (a1*a2=b2*c1)) или ((a1*a2=b2*b1) и (a1*c2=b2*c1))или ((a1*a2=c2*b1) и (a1*b2=c2*c1)) или ((a1*b2=c2*b1) и (a1*a2=c2*c1));о) (y5-5*x) и (y0);п) (y5-x) или (y7.7. б) в) г) д) ж) з) и) к)
а) (y=1-x) и ((y=x) и (y=-x) (вариант ответа: (y=abs(x)));в) (abs(x)=x-3);д) (abs(x)=9) и ((x=0) или (y=2-x) или (y=x*x) или (y=y*y) или (x=1)) или (x=-1);и) (((y=-x)) или ((x=0)=(y=x))) и (x*x+y*y7.9. б) a=-19;b=-114;c=17;в) a=3;b=1,875;c=15;г) a=7;b=3;c=735;д) a=10;b=2;c=120;е) a=4;b=7;c=3;ж) a=16; b=100, c=11200.
а) если x =x то y:=sign(x)*abs(x)**(1/3) то z:=x+y иначе y:=sqrt(x) иначе z:=0.5 все все все все в) если x0 г) выбор то z:=lg(-x) при с=0 : z:=1 иначе z:=sqrt(x+1) при с=1 : z:=x все при с=2 : z:=3*x*x — 1/2 если z=0 при с=3 : z:=x*x*x — 3*x/2 то F:=2*z+1 иначе z:=2*x**4 — 3*x/2 иначе F:=sin(z) все все д) если abs(x)+abs(y)r е) если x1 то z:=sqrt(x*x+y*y) то если y1 иначе z:=max(abs(x), abs(y)) то v:=x+y все иначе v:=x-y всеж) если (x-a)**2 +(y-b)**2r*r иначе если y0 то z:=abs(x)+abs(y) то v:=y-x иначе z:=x+y иначе v:=-x-y все все все
7.13. б) 81; в) 21;д) 11;е) 44.
7.14. б) 0; в) 13;д) 52; е) 14.
б) алг Треугольник1(арг вещ a,b,UgolC, рез вещ c, UgolA, UgolB, S) нач ввод a, b, UgolC c:=sqrt(a*a+b*b-2*a*b*cos(UgolC)) UgolA:=arcsin(a*sin(UgolC)/c) UgolB:=arcsin(b*sin(UgolC)/c) S:=b*c*sin(UgolA)/2 вывод c, UgolA, UgolB, S кон в) алг Треугольник2(арг вещ a,b,c, рез вещ Radius,UgolA) нач вещ p ввод a,b,c p:=(a+b+c)/2 UgolA:=2*arctg(sqrt((p-b)*(p-c)/(p*(p-a))))*180/3.14 Radius:=a*b*c/(4*sqrt(p*(p-a)*(p-b)*(p-c))) вывод Radius, UgolA кон г) алг Объем и Площадь Пирамиды(арг вещ a,UgolAGrad, рез вещ V, S) нач вещ H,SBase,UgolARad | H — высота пирамиды; SBase — площадь основания ввод a,UgolAGrad UgolARad:=UgolAGrad*3.14/180 SBase:=a*a*sqrt(3)/4 H:=a*sqrt(3)/6*tg(UgolARad) V:=SBase*H/3 S:=SBase*(1+1/cos(UgolARad)) вывод V, S кон д) алг Объем и Площадь конуса(арг вещ RBig,RSmall,Ugol, рез вещ V, S) нач вещ H,L ввод RBig,RSmall,Ugol H:=(RBig-RSmall)*tg(Ugol) L:=(RBig-RadSmall)/cos(Ugol) V:=1/3*3.14*H*(RSmall**2 + RBig**2 + RSmall*RBig) S:=3.14*L*(RBig+RSmall) вывод V, S кон е) алг Параметры пирамиды (арг вещ a,UgolA, рез вещ V, S, Sесtion) нач вещ H ввод a,UgolA H:=a*sqrt(2)/2*tg(UgolA) V:=1/3*a*a*H Sесtion:=a*H*sqrt(2)/2 S:=a*a*(1+sqrt(2*tg(UgolA)**2+1)) вывод V, S, Sесtion кон
Статьи к прочтению:
Pascal. Часть 3. Арифметические выражения
Похожие статьи:
алг Сумма квадратов (арг цел n, рез цел S)дано | n0надо | S = 1*1 + 2*2 + 3*3 + … + n*nнач цел iввод n; S:=0нц для i от 1 до n S:=S+i*iкц вывод S…
Алгоритм- это последовательность четких обозначенных предписаний, которые будучи применены к определенным имеющимся данным, обеспечиваю получение…
Записать арифметическое выражение на алгоритмическом языке и указать порядок выполнения операций (Язык C#) Фотографию прикрепил

Я так понимаю, что запись нужна именно на шарпе, а не на алгоритмическом языке, ибо в ином случае указывать язык не было надобности.
Сначала выполняется возведение в степень (y^2), затем идёт умножение (0.5 * y), затем выполняется сложение (+4), затем применяется модуль, а затем из всего этого извлекается корень и значение записывается в переменную E.
Объекты алгоритмов. Выражения

В данный момент вы не можете посмотреть или раздать видеоурок ученикам
Чтобы получить доступ к этому и другим видеоурокам комплекта, вам нужно добавить его в личный кабинет, приобретя в каталоге.
Получите невероятные возможности



Конспект урока «Объекты алгоритмов. Выражения»
· Правила для записи выражений на алгоритмическом языке;
· Арифметические, логические, строковые выражения.
Мы уже знаем, что данные можно записывать в переменные, которые бывают целыми либо вещественными. Над переменными целого и вещественного типов можно выполнять операции: сложение, вычитание, умножение, деление.
Такое построение называется выражением.
Самыми простыми выражениями будут выражения, которые состоят или из одной переменной или из одной константы.

То есть Выражение — это языковая конструкция для поиска значений с помощью операндов.
Итак, как мы уже выяснили, выражения состоят из операндов (констант, переменных, функций), которые объединяются знаками операций.
То есть выражение задаёт порядок выполнения действий над величинами.
Запись алгоритмических выражений имеет свои синтаксические правила. Например, невозможно записывать выражения в виде обыкновенных дробей. Запись пять восьмых компьютер не поймёт. Из математики известно, что черту дроби можно заменить знаком деления.

Запись четыре ас компьютер также не поймёт, операцию умножения опускать нельзя: следует писать:

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

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


Выражение sqrt (x) служит для обозначения операции извлечения квадратного корня из x. Выражение abs(x) вычисляет модуль значения переменной x, а sqr(x) вычисляет квадрат значения переменной x.
Логические выражения описывают некоторые условия, которые могут удовлетворяться или не удовлетворяться.
Логическое выражение может принимать одно из двух значений — ИСТИНА или ЛОЖЬ. Например,

Строковые выражения состоят из величин (констант, переменных) символьного и литерного типов, соответствующих функций и операций сцепления (присоединения).
Операция сцепления обозначается знаком плюс. С помощью данной операции можно соединить несколько последовательностей символов в одну последовательность.
Значениями строковых выражений являются последовательности символов. Например, если строковая величина B = ‘рог’, то значение строкового выражения ’пи’ плюс B будет пирог.
Перейдём к практической части урока.
Необходимо записать на алгоритмическом языке и найти значение данного выражения:
Запишем сначала данное выражение в алгоритмическом виде.
Вещественные числа записываются в виде десятичной дроби, состоящей из целой и дробной частей, разделённых запятой.

Рассмотрим следующее выражение:
Итак, запишем его сначала на алгоритмическом языке.

Рассмотрим выражение, содержащее функции. Запишем на алгоритмическом языке и найдём его значение.

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

Обратите внимание, поскольку логическое выражение содержит союз И, то оно будет истинно только тогда, когда будет истинно каждое из выражений из которых оно состоит.
Также необходимо отметить что, поскольку третье и четвёртое неравенства нестрогие, то в окончательное решение будут входить точки, которые лежат на этих отрезках.
Итак, изобразим декартовую систему координат. Отметим на оси ОX точку -2. Проведём прямую, параллельную оси ОY. Решениями первого неравенства будут те точки координатной плоскости, которые принадлежат выделенной области. У этих точек первая координата будет больше -2.
Для решения второго неравенства, отметим на оси ОX точку с координатой 2. Решениями второго неравенства будут те точки координатной плоскости которые принадлежат выделенной области. У этих точек первая координата будет меньше 2.
Решая аналогично третье и четвёртое неравенство получим, что решениями логического выражения будут точки расположенные в выделенной области.
Давайте проверим. Возьмём точку, принадлежащую выделенной области, например, точку с координатами (1, 1).
Подставим координаты в наше логическое выражение и проверим каждое неравенство. Все неравенства принимают истинное значение.
По определению логическое выражение содержащее союз И, будет истинно только тогда, когда будет истинно каждое из выражений из которых оно состоит. Следовательно всё выражение принимает истинное значение.
Теперь возьмём точку, не входящую в выделенную область. Например, точку с координатами (-4, -1).
Подставим координаты в наше логическое выражение и проверим каждое неравенство. Первое неравенство принимает значение ложь, остальные неравенства принимают значение истина.

По определению логическое выражение содержащее союз И, будет истинно только тогда, когда будет истинно каждое из выражений из которых оно состоит. Следовательно всё выражение принимает значение Ложь.
Пришло время подвести итоги урока.
Выражение — это языковая конструкция для поиска значений с помощью операндов.
Запись алгоритмических выражений имеет свои синтаксические правила.
Выполнение каждой операции в выражениях происходит с учётом её приоритета. Порядок выполнения операций следующий:
• Выражения в скобках вычисляются в первую очередь.
• После вычисления значений выражений в скобках вычисляются функции.
• После функций выполняется умножение и деление (они имеют одинаковый приоритет и выполняются в порядке их следования слева направо).
Правила записи арифметических выражений в алгоритмическом языке 8 класс
Обращаем Ваше внимание, что в соответствии с Федеральным законом N 273-ФЗ «Об образовании в Российской Федерации» в организациях, осуществляющих образовательную деятельность, организовывается обучение и воспитание обучающихся с ОВЗ как совместно с другими обучающимися, так и в отдельных классах или группах.
Самые массовые международные дистанционные
Школьные Инфоконкурсы 2022
33 конкурса для учеников 1–11 классов и дошкольников от проекта «Инфоурок»
- Онлайн
формат - Диплом
гособразца - Помощь в трудоустройстве
Алматинская область, Ескельдинский район, КГУ сш.Уалиханова при акимате Ескельдинского района
Гудаковская Людмила Михайловна
Тема урока: «Правила записи арифметических выражений в алгоритмическом языке»
Цель урока : закрепление умений учащихся записывать арифметические выражения в алгоритмическом языке с использованием электронного учебника Л.З. Шауцуковой, контроль полученных знаний и умений при помощи карточек – лабиринтов (см. Приложение).
Проверка домашнего задания:
Три ученика на доске записывают по одному примеру, класс проверяет, исправляет ошибки.
а) что представляет собой арифметическое выражение;
б) перечислить основные правила записи арифметических выражений;
в) в каком порядке выполняются операции в арифметических выражениях.
Практическая часть.
Задание 1.Найти ошибки в записи выражений:
Пропущен знак умножения между 5 и х
Аргумент x функции sin x не заключен в скобки
Не хватает закрывающей скобки
Запишите по правилам алгоритмического языка выражения:
Открыть учебник: Теория, Глава 7. Алгоритмы. Алгоритмизация. Алгоритмические языки, пункт 7.22. Упражнения. №7.1. Проверить ответ:
Свернуть учебник на панель задач.
7.2. Запишите в обычной математической форме арифметические выражения:
а ) a / b ^ 2;
в ) 1/a*b/c;
д ) (a^b)^c/2;
ж ) x^y^z/a/b;
и ) b/sqr(a*a+b);
о ) abs(x^(y/x)-(y/x)^(1/3));
б ) a+b/c+1;
г ) a^b^c/2;
е ) a/b/c/d*p*q;
з ) 4/3*3.14*r^3;
к ) d*c/2/R+a3;
п ) sqr((x1-x2)^2+(y1-y2)^2);
ф ) abs(cos(x)+cos(y))^(1+sin(y)^2);
Восстановить учебник, сверить с ответом к заданию 7.2:
а )
в )
д )
ж )
и)
о)
ф )
б )
г )
е )
з )
к )
п)
ф)
Открыть окно языка программирования Qbasic .
Каждому ученику предлагается вариант лабиринта, состоящий из 5 карточек.
На лицевой стороне карточки лабиринта записано выражение, по которому следует получить ответ с помощью компьютера. На обратной –ответ к одному из остальных заданий. Если выражение записано верно, то ответ совпадет с одним из чисел, по нему переходить к следующей карточке и т.д. Таким образом, учащийся возвращается снова к первой карточке – «выходит из лабиринта».
Задание в письменном виде сдается учителю на проверку, а также сохраняется в памяти компьютера.
Похожие публикации:
- Как включить node js
- Как вставить svg в css
- Как сделать футер сайта css
- Как сделать чтобы контент занимал 70 ширины страницы в css
