<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=42056&amp;view=findpost&amp;p=274609</guid>
        <pubDate>Sat, 03 Jan 2004 14:03:46 +0000</pubDate>
        <title>PreFix, InFix, PostFix и их вычисление</title>
        <link>https://forum.sources.ru/index.php?showtopic=42056&amp;view=findpost&amp;p=274609</link>
        <description><![CDATA[Some1: Многие знают, что математика - извращённая наука. А некоторые, включая вас, столкнулись с тем, что она очень уж извращённая. :) <br>
Математики даже свои записи записать одним способом не могут. Подавай им всякие Fixы.<br>
<br>
Для записи любого математического выражения существует три формы. Друг от друга они отличаются порядком записи переменных и знаков между ними<br>
Рассмотрим их одно за другим.<br>
Сначала <span class="tag-color tag-color-named" data-value="blue" style="color: blue"><span class='tag-size' data-value='11' style='font-size:11pt;'>Infix</span></span><br>
Это всем привычная нам форма записи математического выражения.<br>
Например: a+b-c*d+(k-i)/n^2 это самое обычное InFixное выражение.<br>
Ну что про него можно сказать? То, что вычисляется оно начиная с скобок. Сначала мы считаем выражения в скобках, а затем уже то, что вне. К тому же у нас главенствуют сначала степени, затем умножения и деления, и уже после этого мы вычисляем сложения и вычитания.<br>
Название InFix такая запись получила из-за того, что знаки (Fix), которые обозначают действия с переменными содержатся внутри выражений, между переменными (In). Если мы пишем a*b, то мы имеем ввиду, что нужно взять число слева от *, и умножить его на число справа от *.<br>
Ну в целом всё. Дальше будет чуть сложнее понять.<br>
<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue"><span class='tag-size' data-value='11' style='font-size:11pt;'>Prefix</span></span><br>
В такой форме записи знаки действий, которые действуют на два числа пишутся перед именами этих двух чисел.<br>
Вот простой пример: +ab<br>
Обозначает, что мы возьмём действие &quot;+&quot; и применим его на переменные &quot;a&quot; и &quot;b&quot;.<br>
Также можно записать и другие знаки. Например *cd или /kn.<br>
Ну а как записывать более сложные случаи?<br>
Тут всё зависит от порядка следования знаков. Знаки набирают главенство слева направо.<br>
Вот пример:<br>
*+ab-cd можно понимать так:<br>
Берём знак &quot;*&quot;, ищем для него левый член: +ab, и правый член: -сd<br>
+ab это a+b, а -cd это с-d.<br>
Значит будет (a+b)*(c-d)<br>
Вот ещё пример: -*a+bc/de<br>
Расшифруем:<br>
Слева от - будет &quot;*&quot;. Значит посмотрим, что нужно для &quot;*&quot;. Слева от &quot;*&quot; стоит &quot;a&quot;, а справа от &quot;*&quot; стоит &quot;+&quot;. Для &quot;+&quot; слева стоит &quot;b&quot;, а справа &quot;c&quot;.<br>
На данный момент получили    a*(b+c) -<br>
Теперь глянем, что нужно справа от &quot;-&quot;. Нужно &quot;/&quot;. Слева для &quot;/&quot; стоит &quot;d&quot;, а справа &quot;e&quot;.<br>
Значит получим: a*(b+c) - d/e<br>
<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue"><span class='tag-size' data-value='11' style='font-size:11pt;'>Postfix</span></span><br>
Это полный аналог для PreFix, но знаки действий ставятся наоборот, после операндов, с которыми действовать. Пример: ab-cd+^ (знак &quot;^&quot; - возведение в степень)<br>
Читаем так: берём &quot;а&quot; и &quot;b&quot;. Ставим между ними знак &quot;-&quot;. Берём &quot;с&quot; и &quot;d&quot;, ставим между ними знак &quot;+&quot;. Берём (a-b) и (c-d), ставим между ними знак &quot;^&quot;. Получаем &quot;(a-b)^(c+d)&quot;.<br>
Вот ещё пример (без объяснения. Попробуйте понять сами):<br>
Infix - c*(a+B)*(d-f/e)<br>
PostFix - caB+*dfe/-*<br>
<br>
Для InFix&#39;ной и PostFix&#39;ной записей характерно то, что не нужно в выражениях писать скобки. Так как главенство одних частей выражения над другими зависит от их расположения в строке.<br>
<br>
<hr><br>
Всё это довольно сложная тема, особенно для тех, у кого гуманитарный склад ума. К счастью, я написал целый модуль, позволяющий переводить строки из одного типа в другой.<br>
<br>
В процессе перевода используется бинарное дерево. Такое дерево организуется при помощи двухсвязных списков.<br>
Вот пример построения бинарного дерева:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; / \</div><div class="code_line">&nbsp;&nbsp; &nbsp; / &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp; &nbsp;- &nbsp; &nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; / \ &nbsp; &nbsp; / \</div><div class="code_line">&nbsp;&nbsp;a &nbsp; + &nbsp; e &nbsp; -</div><div class="code_line">&nbsp;&nbsp; &nbsp; / \ &nbsp; &nbsp; / \</div><div class="code_line">&nbsp;&nbsp; &nbsp;c &nbsp; d &nbsp; f &nbsp; g</div><div class="code_line">&nbsp;</div><div class="code_line">Тут зашифровано выражение:</div><div class="code_line">(a-(c+d))*(e/(f-g))</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Модуль позволяет создавать такие деревья из строки с выражением в формате InFix, PostFix или PreFix, а так же позволяет из бинарного дерева делать наоборот строки с выражениями в любом из этих трёх форматов.<br>
<br>
Кроме того в модуле есть функция, которая может вычислять числовое значение математических выражений, если задать значения для переменных.<br>
Тоесть если у нас выражение &quot;(a-(c+d))*(e/(f-g))&quot; и мы зададим числовые значения для переменных a, b, c, d, e, f и g, то эта функция подставит эти значения, и вычислит значение выражения.<br>
На базе этого юнита можно написать программу - калькулятор, способную анализировать математические выражения.<br>
При преобразовании в InFix&#39;ный формат, или из InFix&#39;ного формата юнит учитывает (и добавляет, где нужно) все скобки.<br>
<br>
<hr><br>
<span class="tag-color tag-color-named" data-value="purple" style="color: purple">Текст юнита и программы, демонстрирующей основные возможности юнита, и наглядно показывающей, как им пользоваться:</span>]]></description>
        <author>Some1</author>
        <category>Pascal: Математика</category>
      </item>
	
      </channel>
      </rss>
	