<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - palva</title>
		<link>https://www.cyberforum.ru/blogs/242513/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Tue, 15 Sep 2026 01:05:19 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - palva</title>
			<link>https://www.cyberforum.ru/blogs/242513/</link>
		</image>
		<item>
			<title>Новый CodeBlocs. Версия 25.03</title>
			<link>https://www.cyberforum.ru/blogs/242513/10696.html</link>
			<pubDate>Sat, 03 Jan 2026 22:33:59 GMT</pubDate>
			<description>Оказывается, недавно вышла новая версия CodeBlocks за номером 25.03. Когда-то давно я возился с...</description>
			<content:encoded><![CDATA[<div>Оказывается, недавно вышла новая версия <code class="inlinecode">CodeBlocks</code> за номером 25.03. Когда-то давно я возился с только что вышедшей тогда версией 20.03. С тех пор я давно снёс всё с компьютера и забыл. Теперь попробую установить новую версию с нуля настроить компиляторы си и фортрана, идущие вместе с <code class="inlinecode">CodeBlocks</code>, и попробовать их. Я не буду вдаваться в теорию и уходить в подробности. Я лишь буду подробно объяснять те шаги, которые я делаю. Надеюсь, что мои заметки будут полезны начинающим, и они смогут пройти дальше меня и изучить подробности.<br />
<br />
Скачиваем. Открываю <a rel="nofollow noopener noreferrer" href="https://www.codeblocks.org/" target="_blank" title="https://www.codeblocks.org/">https://www.codeblocks.org/</a> Слева в меню есть ссылка &quot;Downloads&quot;, которая открывает страницу скачивания. На ней есть ссылка &quot;Download the binary release&quot;. На очередной странице под заголовком Microsoft Windows (64 bit, default) имеется пять вариантов скачивания. Выбираю четвертый вариант, о котором сказано:<br />
<br />
NOTE: The codeblocks-25.03mingw-setup.exe file includes additionally the GCC/G++/GFortran/Clang compiler and GDB debugger from WinLibs project (version 14.2.0, 32/64 bit).<br />
<br />
По сути это означает, что вместе с <code class="inlinecode">CodeBlocs</code> скачивается набор компиляторов (перечислено), а также отладчик. Вам придётся скачать около 400 Мб. В то время как установочный файл CodeBlocks без компиляторов весит 50 Мб.<br />
<br />
Установка. Устанавливаем по умолчанию. В максимальном объёме. Со всем соглашаемся. В конце установки нажимаем кнопку открытия <code class="inlinecode">CodeBlocks</code>. При первом запуске происходит поиск и присоединение компиляторов. В поставке идут компиляторы <code class="inlinecode">MinGW</code> версии 14.2. Установка размещает директорию <code class="inlinecode">MinGW</code> как поддиректорию директории <code class="inlinecode">CodeBlocks</code>. Компилятор в <code class="inlinecode">CodeBlocks</code> это не то что вы подумали. Это не программа, это набор программ на разные случаи жизни, которые для пользователя фигурируют под некоторым именем. Например, под именем <code class="inlinecode">GNU GCC Compiler</code> собраны исполнительные файлы <code class="inlinecode">gcc.exe</code>, <code class="inlinecode">g++.exe</code> и некоторые другие. Всего этих компиляторов-имён несколько десятков, в каждом из них уже прописаны какие-то исполнительные файлы. Вот при своём первом запуске <code class="inlinecode">CodeBlocs</code> и проверяет, для каких компиляторов местоположение исполнительных файлов указано правильно. Результат этой проверки показан в первом открывшемся окне. Мы видим, что <code class="inlinecode">GNU GCC Compiler</code> имеет правильные установки. Он объявлен дефолтным. В списке оказались правильно прописанными еще два компилятора, которые нас не интересуют. Обратите внимание, что компилятора фортрана <code class="inlinecode">GNU Fortran Compiler</code> среди правильно прописанных нет, далее мы будем прописывать его вручную. Нажимаем <code class="inlinecode">OK</code>, и появляется второе окно первого запуска. Оно касается связи <code class="inlinecode">CodeBlocks</code> с некоторыми файловыми расширениями. Нужно выбрать, какие файлы будут по умолчанию открываться в <code class="inlinecode">CodeBlocks</code>. Я выбираю четвёртый вариант. Теперь все файлы с расширениями c/cpp, f/f90/f95, cbp и некоторые другие будут открываться при помощи <code class="inlinecode">CodeBlocks</code>. Нажимаем OK, второе окно закрывается и, наконец, открывается сам CodeBlocks.<br />
<br />
Теперь нам надо проверить настройки компиляторов и поправить их, если что не так. Через верхнее меню открываем <code class="inlinecode">Settings -&gt; Compiler...</code>. Откроется окно <code class="inlinecode">Global Compiller Settings</code>, которое в самом верхнем выпадающем списке содержит имена компиляторов. Нас интересуют два из них. Обычно там уже выбран и настроен компилятор по умолчанию <code class="inlinecode">GNU GCC Compiler</code>. Нам надо зайти и проверить, всё ли правильно. Выбираем вкладку <code class="inlinecode">Toolchain executables</code>, на которой должна быть указана директория компиляторов, у меня это <code class="inlinecode">C:\Program Files\CodeBlocks\MinGW</code>, и указаны исполнительные файлы. У меня они такие:<br />
<br />
<code class="inlinecode">C compiler: gcc.exe<br />
C++ compiller: g++.exe<br />
Linker for dynamic libs: g++.exe<br />
Linker for static libs: ar.exe<br />
Debugger: GDB/CDB debugger: Default<br />
Resource compiler: windres.exe<br />
Make program: mingw32-make.exe<br />
</code><br />
Если мы в окне что-то исправляли, то нам надо нажать OK, и нас выбросит из установки компиляторов. Нужно снова открывать <code class="inlinecode">Settings -&gt; Compiler...</code>.<br />
<br />
Теперь фортран. Ищем компилятор <code class="inlinecode">GNU Fortran Compiler</code>. Снова выбираем вкладку <code class="inlinecode">Toolchain executables</code>. Здесь <code class="inlinecode">CodeBlocks</code> не нашёл правильных исполнительных файлов. Во-первых, надо исправить директорию компиляторов, а именно <code class="inlinecode">C:\Program Files\CodeBlocks\MinGW</code>, а во вторых установить такие исполнительные файлы.<br />
<br />
<code class="inlinecode">C compiler: gfortran.exe<br />
C++ compiller: g++.exe<br />
Linker for dynamic libs: gfortran.exe<br />
Linker for static libs: ar.exe<br />
Debugger: GDB/CDB debugger: Default<br />
Resource compiler: windres.exe<br />
Make program: mingw32-make.exe</code><br />
<br />
Далее, на вкладке <code class="inlinecode">Linker settings</code> в правом разделе вставляем строку <code class="inlinecode">-lgfortran</code> Это подключение фортрановских библиотек. Теперь можно нажать <code class="inlinecode">OK</code> и окно настройки компиляторов закроется.<br />
<br />
Для разработчика наверняка понадобится отладчик. Иногда он неправильно установлен. Проверим. Через верхнее меню открываем <code class="inlinecode">Settings -&gt; Debugger...</code>. Слева в открывшемся окне в дереве отмечаем пункт <code class="inlinecode">Default</code> справа в поле <code class="inlinecode">Executable path:</code> должен быть путь к исполнительному файлу отладчика. Для поиска отладчика удобнее всего использовать кнопку с тремя точками правее поля ввода. У меня в поле получилось <code class="inlinecode">C:\Program Files\CodeBlocks\MinGW\bin\gdb.exe</code>.<br />
<br />
Посмотрите ещё настройки редактора кода. <code class="inlinecode">Settings -&gt; Editor...</code>. Здесь можно выбрать шрифт, размер, кодировку. Если вы будете создавать консольные программы, то для ввода/вывода русских букв будет удобно, когда ваша программа набрана в кодировке <code class="inlinecode">cpp866</code>. В настройках она обозначена как <code class="inlinecode">WINDOWS-866</code>. Можно оставить как есть <code class="inlinecode">WINDOWS-1251</code>, но тогда надо в самой программе добавить некоторый код для  переключения кодировки кириллицы.<br />
<br />
Для экспериментов создаём пустую директорию <code class="inlinecode">D:\Projects</code> Сначала пробуем редактор. Из верхнего меню открываем <code class="inlinecode">File -&gt; New -&gt; File...</code> окно создания файла. В нём кликаем по иконке <code class="inlinecode">C/C++ source</code> Справа вверху нажимаем кнопку <code class="inlinecode">Go</code> (Вперёд). Проходим по мастеру создания файла, задавая тип <code class="inlinecode">C++</code>, имя файла <code class="inlinecode">main.cpp</code> и директорию <code class="inlinecode">D:\Projects</code>, в которой он будет создан. В результате созданный пустой файл будет открыт в окне редактирования Вводим в него следующий текст:<br />
<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="220044491"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="220044491" style="height: 142px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw2">using</span> <span class="kw2">namespace</span> std<span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hello world!&quot;</span> <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>и сохраняем файл выбором соответствующего пункта меню, нажатия кнопки на панели инструментов или нажатия горячей клавиши Ctrl-S. Как видите, в <code class="inlinecode">CodeBlocks</code> существует много способов для выполнения одного и того же действия. При наведении курсора мыши на иконку панели инструментов возникает подсказка, за что отвечает эта иконка.<br />
<br />
Таким же образом, но кликая по кнопке <code class="inlinecode">Fortran source</code> создаём файл <code class="inlinecode">main.f90</code>, в который вводим следующий фортрановский текст:<br />
<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="884568066"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="884568066" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1">write<span class="br0">&#40;</span><span class="sy0">*</span>,<span class="sy0">*</span><span class="br0">&#41;</span> <span class="st0">'Hello, world!'</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Попробуем выйти из <code class="inlinecode">CodeBlocks</code> закрытием окна. <code class="inlinecode">CodeBlocks</code> предложит нам сохранить фортрановский файл, с чем мы, конечно, соглашаемся.<br />
<br />
Теперь попробуем два раза кликнуть левой кнопкой мыши по файлу <code class="inlinecode">main.cpp</code>. Как и положено, данный файл открывается в редакторе <code class="inlinecode">CodeBlocks</code>. Далее кликаем по <code class="inlinecode">main.f90</code>. Этот файл тоже открывается но во второй вкладке редактора. Для компиляции и запуска предназначены следующие кнопки на панели инструментов: шестерёнка <code class="inlinecode">Build</code>, треугольник <code class="inlinecode">Run</code>, шестеренка с треугольником <code class="inlinecode">Build and run</code> и круговые стрелки <code class="inlinecode">Rebuild</code>. Эти же действия можно вызвать через главное меню, имеются также горячие клавиши.<br />
<br />
Итак, встаём на вкладку <code class="inlinecode">main.cpp</code>. Нажимаем <code class="inlinecode">Build and run</code>. Запустится компиляция и в случае успешной компиляции запустится сама программа. При этом мы увидим чёрное окно, куда программой будет выведено приветствие, затем появится просьба нажать клавишу для закрытия окна. Типа, работает. Посмотрим, какие файлы появились в нашей директории. Мы видим исполняемый файл <code class="inlinecode">main.exe</code> и его полуфабрикат объектный файл <code class="inlinecode">main.o</code>. Теперь, не закрывая <code class="inlinecode">CodeBlocks</code>, кликаем по вкладке редактора <code class="inlinecode">main.f90</code>. На этот раз, если мы нажмём <code class="inlinecode">Build and run</code>, создание исполнительного файла не завершится. Будет выдана информация о неразрешённых внешних ссылках. Казалось бы, мы уже подключили фортрановские библиотеки. Но давайте разбираться. В самой первой строке сообщений о работе в скобках написано <code class="inlinecode">(compiler: unknown)</code>. А в этом случае запускается компилятор по умолчанию, то есть компилятор <code class="inlinecode">GNU GCC Compiller</code>. Убедиться в этом можно переключив вкладку сообщений. После попыток компиляции там будут открыты Сообщения при сборке (<code class="inlinecode">Build messages</code>). Если переключиться на Журнал сборки (<code class="inlinecode">Build log</code>) то мы увидим две строчки -- два запуска программы <code class="inlinecode">g++.exe</code>. Довольно неожиданно. Оказывается, программа <code class="inlinecode">g++.exe</code> по расширению файла умеет выбрать нужный компилятор. Причем в её ассортименте не только C и C++, но и фортран. Теперь понятно, почему настройки <code class="inlinecode">GNU Fortran Compiler</code> не сработали. Настраивать нужно тот компилятор который используется, т. е. компилятор по умолчанию. Но вы уже умеете это делать. На вкладке <code class="inlinecode">Linker settings</code> компилятора <code class="inlinecode">GNU GCC Compiller</code> в правое окно впишите строчку <code class="inlinecode">-lgfortran</code> и нажмите <code class="inlinecode">OK</code>. Теперь компиляция фортрановской программы пройдёт. Если вам нужен только фортран, то корректнее не заниматься настройкой компилятора <code class="inlinecode">GCC</code>, а сделать компилятор <code class="inlinecode">Fortran</code> компилятором по умолчанию. Для этого заходим в настройки компиляторов, выбираем <code class="inlinecode">GNU Fortran Compiler</code> и ниже нажимаем на кнопку <code class="inlinecode">Set as default</code>. Правда, в этом случае программы си компилироваться не будут.<br />
<br />
Итак, мы умеем прямо из редактора кода компилировать и запускать программы на си и фортране. Для кого-то это окажется достаточным. Главный недостаток такого режима разработки это невозможность запустить отладчик. А для отладчика файл с программой должен быть не сам по себе, а находится в рамках проекта. В проекте можно выбрать компилятор, включить в него множество файлов с кодом, переключать режим Отладка/Релиз и многое другое. <code class="inlinecode">CodeBlocks</code> отслеживает, какие файлы были изменены разработчиком, и при очередной сборке делает только те перекомпиляции, которые требуются. В проекте можно установить различные параметры компиляции, которые будут перекрывать параметры указанные в настройках компиляторов. Поэтому давайте уберём опцию <code class="inlinecode">-lgfortran</code> из установок <code class="inlinecode">GNU GCC Compiller</code>. Будем учиться работать с параметрами проекта. Прежде чем создавать проекты поговорим о некоторых других вещах:<br />
<br />
Если вы два раза кликните в папке по файлу <code class="inlinecode">main.exe</code>, то он работать не будет. Вы увидите окно с сообщением, о том что программа не может найти библиотеку. Программа для выполнения требует среду, которая состоит из нескольких dll-библиотек. Эти библиотеки находятся в директории <code class="inlinecode">bin</code>, и составляют суммарно более 7 мегабайт. В то время как исполняемый файл занимает килобайтов 60. Можно собрать исполняемый файл таким образом, чтобы он включал в себя весь требуемый код из библиотек. Но в этом случае его размер увеличится более чем в десять раз. Я привожу приблизительные цифры. Библиотеки среды выполнения можно скопировать в директорию <code class="inlinecode">D:\Project</code>. В этом случае они будут видны из файла <code class="inlinecode">main.exe</code> и файл запустится без осложнений. Я приведу здесь их список. Если вы захотите перенести результат компиляции на другой компьютер, то их тоже надо переносить. Возможно, список не полный. Но для наших программ он достаточный.<br />
<br />
<code class="inlinecode">libgcc_s_seh-1.dll<br />
libquadmath-0.dll<br />
libwinpthread-1.dll<br />
libgfortran-5.dll<br />
libstdc++-6.dll<br />
</code><br />
Здесь часть библиотек нужна только для си, а часть только для фортрана.<br />
<br />
Можно решить проблему другим образом: не копировать библиотеки, а прописать директорию <code class="inlinecode">bin</code> в переменную <code class="inlinecode">PATH</code>. Вы наверняка умеете это делать. В этом случае среда выполнения <code class="inlinecode">MinGW</code> также будет доступна. Только перезапустите после этого командное окно. Если вы не хотите трогать переменные среды, то можно модифицировать <code class="inlinecode">PATH</code> из командного окна, а затем запускайте <code class="inlinecode">main.exe</code>. Например, в директории <code class="inlinecode">D:\Project</code> создайте следующий файл под именем <code class="inlinecode">run.bat</code><br />
<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="818985190"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="818985190" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1"><span class="sy0">@</span><span class="kw3">echo</span> off
PATH C:\Program Files\CodeBlocks\MinGW\bin;<span class="sy0">%</span>PATH<span class="sy0">%</span>
main.exe
echo.
pause</pre></td></tr></table></div></td></tr></tbody></table></div>При его запуске файл <code class="inlinecode">main.exe</code> запустится и даже притормозится закрытие окна, чтобы вы могли увидеть результат работы.<br />
<br />
Теперь покажем, как запустить компиляцию из командного окна. Нажимаем <code class="inlinecode">Win-R</code>, запускаем <code class="inlinecode">cmd</code>. Дальше в окне выполняем следующие команды:<br />
<br />
<code class="inlinecode">D:<br />
cd D:\Projects<br />
</code><br />
Мы оказались в нашей директории. Чтобы модифицировать <code class="inlinecode">PATH</code>, проще всего запустить уже созданный нами файл<br />
<br />
<code class="inlinecode">run.bat</code><br />
<br />
Он запускает <code class="inlinecode">main.exe</code>, это нам не нужно, но при этом он делает нужную нам вещь -- модифицирует <code class="inlinecode">PATH</code>. Теперь файлы компиляторов доступны, и мы готовы их запускать. Причем настройки в <code class="inlinecode">CodeBlocks</code> никак не будут влиять на их работу. Пробуем такие команды запуска:<br />
<br />
<code class="inlinecode">g++ main.cpp<br />
g++ main.f90 -lgfortran<br />
gfortran main.f90<br />
gfortran main.f90 -static<br />
</code><br />
Первая команда компилирует файл C++ остальные фортран. Все команды изготавливают исполняемый файл с именем по умолчанию <code class="inlinecode">a.exe</code>. Каждая следующая строка перезаписывает этот файл. Чтобы задать нужное имя выходного файла, можно добавить опцию <code class="inlinecode">-o main.exe</code> Предпоследний запуск делает файл размером 64804, а последний -- 702597 байт. Зато последний файл работает автономно без среды выполнения. Автономный файл для C++ получится больше двух мегабайт. Для его создания можно, например, запустить команду<br />
<br />
<code class="inlinecode">g++ main.cpp -static -o main_static.exe</code><br />
<br />
Вот. Получилось 2696659 байт.<br />
<br />
Теперь займёмся созданием проекта. Главный файл у нас будет на C++, а на фортране мы напишем подпрограммы. Итак, запускаем <code class="inlinecode">CodeBlocks</code>. Нажимаем <code class="inlinecode">Create a new project</code>. В открывшемся окне выбираем иконку <code class="inlinecode">Console application</code> и нажимаем кнопку <code class="inlinecode">Go</code>. Следующее окно пропускаем, в следующем выбираем <code class="inlinecode">C++</code>, в следующем окне в <code class="inlinecode">Project Title</code> пишем <code class="inlinecode">cppfor</code>, <code class="inlinecode">Folder to create prоject in</code> выбираем или пишем <code class="inlinecode">D:\Project</code>. Нажимаем <code class="inlinecode">Next</code>. Здесь нам предлагают выбрать компилятор. Выбираем <code class="inlinecode">GNU Fortran Compiler</code>, поскольку в нём уже присоединены фортрановские библиотеки. Далее нам предлагают создать два режима: один для отладки (<code class="inlinecode">Debug</code>) и второй в качестве окончательного релиза (<code class="inlinecode">Release</code>). Оставляем обе галочки и нажимаем <code class="inlinecode">Finish</code>. Проект создан. Слева в дереве проекта плюсиком открываем <code class="inlinecode">Sources</code>. Единственный файл <code class="inlinecode">main.cpp</code> удаляем. Создаём пустой файл <code class="inlinecode">File -&gt; New -&gt; Empty file</code>. Мастер создания задаёт вопрос, следует ли данный файл присоединять к проекту. Отвечаем <code class="inlinecode">Yes</code>. Предлагается задать имя файла. Задаём <code class="inlinecode">ccc.cpp</code> и нажимаем <code class="inlinecode">Сохранить</code>. Следующее окно для выбора Debug/Release. Оставляем обе галочки и нажимаем <code class="inlinecode">ОК</code>. Файл открывается. Вставляем в него следующий текст:<br />
<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="243491084"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="243491084" style="height: 318px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
&nbsp;
<span class="kw2">using</span> <span class="kw2">namespace</span> std<span class="sy4">;</span>
&nbsp;
<span class="kw4">extern</span> <span class="st0">&quot;C&quot;</span> <span class="kw4">void</span> sub_<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="kw4">extern</span> <span class="st0">&quot;C&quot;</span> <span class="kw4">double</span> trace_ <span class="br0">&#40;</span><span class="kw4">double</span> <span class="sy2">*</span>a, <span class="kw4">int</span> <span class="sy2">*</span>n<span class="br0">&#41;</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">3</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">double</span> a<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> <span class="sy1">=</span>
&nbsp; &nbsp; <span class="br0">&#123;</span><span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><span class="nu0">4</span>, <span class="nu0">5</span>, <span class="nu0">6</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><span class="nu0">7</span>, <span class="nu0">8</span>, <span class="nu0">9</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp; &nbsp; sub_<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> trace_<span class="br0">&#40;</span><span class="sy3">&amp;</span>a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>, <span class="sy3">&amp;</span>n<span class="br0">&#41;</span> <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hello world!&quot;</span> <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Таким же точно образом создаём файл <code class="inlinecode">for.f90</code> со следующим содержимым:<br />
<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="782162591"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="782162591" style="height: 318px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="de1"><pre class="de1"><span class="kw1">subroutine</span> sub<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw3">implicit</span> <span class="kw3">none</span>
&nbsp; &nbsp; write<span class="br0">&#40;</span><span class="sy0">*</span>,<span class="sy0">*</span><span class="br0">&#41;</span> <span class="st0">&quot;This is subroutine&quot;</span>
<span class="kw1">end</span> <span class="kw1">subroutine</span>
&nbsp;
<span class="kw1">function</span> trace<span class="br0">&#40;</span>a, n<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw3">implicit</span> <span class="kw3">none</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span>, <span class="kw3">dimension</span><span class="br0">&#40;</span>n, n<span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">a</span>
&nbsp; &nbsp; <span class="kw3">integer</span> <span class="sy0">::</span> <span class="me2">n</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">trace</span>
&nbsp; &nbsp; <span class="kw3">integer</span> <span class="sy0">::</span> <span class="me2">i</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">s</span>
&nbsp; &nbsp; s <span class="sy0">=</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="kw1">do</span> i <span class="sy0">=</span> <span class="nu0">1</span>, n
&nbsp; &nbsp; &nbsp; &nbsp; s <span class="sy0">=</span> s <span class="sy0">+</span> a<span class="br0">&#40;</span>i, i<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">do</span>
&nbsp; &nbsp; trace <span class="sy0">=</span> s
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Теперь проверяем какой вид файла мы изготавливаем. Смотрим <code class="inlinecode">Build -&gt; Select target</code>, там стоит <code class="inlinecode">Debug</code>. Нас это устраивает. Нажимаем кнопку <code class="inlinecode">Build and run</code>. Всё компилируется и запускается. Закрываем чёрное окно нажатием клавиш.<br />
<br />
Теперь пробуем отладчик. На панели инструментов отладчику посвящена группа иконок правее. Она начинается иконкой с красной треугольной стрелочкой, при наведении на которую мышкой выплывает подсказка <code class="inlinecode">Debug/Continue</code>. В коде <code class="inlinecode">for.f90</code> справа от номера строки 14 кликаем мышкой. В этом месте появляется красный кружок. Это точка останова. Запускаем программу нажатием на иконку <code class="inlinecode">Debug/Continue</code>. Программа начинает работу в автоматическом режиме и останавливается на точке остановки. Поверх красного кружка появляется зеленый треугольник, который показывает, где мы сейчас стоим. Можно перейти на чёрное окно консоли и посмотреть, что программа туда уже успела вывести. Теперь мы хотим посмотреть содержание переменной <code class="inlinecode">a(2,3)</code>. Открываем окно переменных через верхнее меню <code class="inlinecode">Debug -&gt; Debugging windows -&gt; Watches</code>. Переменная a в этом окне с плюсиком, поскольку это массив. Плюсиками добираемся до индексов <code class="inlinecode">(2,3)</code>, видим там значение 8. Теперь лезем в сишный код. Видим, что там этому значению соответствует индекс <code class="inlinecode">&#91;2&#93;&#91;1&#93;</code>. Всё правильно. Фортран в отличие от си хранит матрицы не по строкам, а по столбцам, а индексы начинаются с 1, а не с 0. Далее возвращаемся на фортрановский код и нажимаем иконку <code class="inlinecode">Next line</code>. Зеленый треугольник в коде перемещается на следующую строку, а переменная <code class="inlinecode">i</code> в окне переменных меняет значение с 0 на 1. Отладчик работает. Нажимаем ещё правее иконку с крестиком <code class="inlinecode">Stop Debugger</code>. Чёрное окно и окно переменных закроются.<br />
<br />
Мы готовы к релизу. Меняем таргет. <code class="inlinecode">Build -&gt; Select target</code>, здесь галочкой помечаем <code class="inlinecode">Release</code>. Запускаем <code class="inlinecode">Rebuild</code>. Сборка успешна. Обратите внимание, исполняемый файл <code class="inlinecode">cppfor.exe</code> в варианте <code class="inlinecode">Debug</code> содержит информацию для отладки и занимает 116042 байтов. Файл <code class="inlinecode">Release</code> не содержит этой информации и занимает 23040 байтов. Теперь предположим, мы захотели для релиза выпустить автономный файл. Для этого открываем <code class="inlinecode">Project -&gt; Build Options...</code> В левом дереве выбираем <code class="inlinecode">Release</code>, далее на вкладке <code class="inlinecode">Linker settings</code> в правом окне вписываем строку <code class="inlinecode">-static-libquadmath</code> Нажимаем <code class="inlinecode">OK</code>. Снова пробуем собрать. Собирается без ошибок. Заходим в папку <code class="inlinecode">cppfor\bin\Release</code> и пытаемся двойным кликом запустить полученный <code class="inlinecode">cppfor.exe</code> автономно. Запускается. Размер файла 1315328 байтов.<br />
<br />
На этом я закончил эксперименты. Возможно, многое я не понял и использовал неправильно. Информационный шум интернета бывает противоречив. Кое-какие вопросы, связанные с настройками компиляторов у меня остались неразрешёнными. Любые замечания и поправки приветствуются.</div>

]]></content:encoded>
			<dc:creator>palva</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/242513/10696.html</guid>
		</item>
		<item>
			<title>Работа с массивами в современном фортране</title>
			<link>https://www.cyberforum.ru/blogs/242513/1879.html</link>
			<pubDate>Fri, 03 Jan 2014 19:55:42 GMT</pubDate>
			<description>В новом фортране появились операции над массивами. Их можно поэлементно складывать, умножать и т....</description>
			<content:encoded><![CDATA[<div>В новом фортране появились операции над массивами. Их можно поэлементно складывать, умножать и т. д. Матрицы и вектора умножаются не в математическом, а в поэлементном смысле. Для матричного умножения все же приходится использовать встроенные функции. Сечения массива позволяют работать с подматрицами – клетками матрицы. Клетки можно не только извлекать из матрицы, клеткам, как и любым матрицам можно что-то присвоить. Мы хотим продемонстрировать этот механизм на примере одного алгоритма обращения матриц. Процитируем книгу <b>Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ эффективных алгоритмов. (М.: 1979) с. 262. </b><br />
<br />

<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">Лемма 6.5. Пусть матрица A разбита так:<br />
<br />
<img src="https://www.cyberforum.ru/cgi-bin/latex.cgi?%3Cbr%20%2F%3E%0D%0A%5Cbegin%7Bbmatrix%7D%3Cbr%20%2F%3E%0D%0AA_%7B11%7D%20%26amp%3B%20A_%7B12%7D%5C%5C%20%3Cbr%20%2F%3E%0D%0AA_%7B21%7D%20%26amp%3B%20A_%7B22%7D%3Cbr%20%2F%3E%0D%0A%5Cend%7Bbmatrix%7D" border="0" alt="https://www.cyberforum.ru/cgi-bin/latex.cgi<br />
\begin{bmatrix}<br />
A_{11} &amp; A_{12}\\ <br />
A_{21} &amp; A_{22}<br />
\end{bmatrix}" /><br />
<br />
Предположим, что существует <img src="https://www.cyberforum.ru/cgi-bin/latex.cgi?A_%7B11%7D%5E%7B-1%7D" border="0" alt="https://www.cyberforum.ru/cgi-bin/latex.cgi?A_{11}^{-1}" />. Обозначим <img src="https://www.cyberforum.ru/cgi-bin/latex.cgi?A_%7B22%7D-A_%7B21%7DA_%7B11%7D%5E%7B-1%7DA_%7B12%7D" border="0" alt="https://www.cyberforum.ru/cgi-bin/latex.cgi?A_{22}-A_{21}A_{11}^{-1}A_{12}" /> через <img src="https://www.cyberforum.ru/cgi-bin/latex.cgi?%5CDelta" border="0" alt="https://www.cyberforum.ru/cgi-bin/latex.cgi?\Delta" /> и допустим, что <img src="https://www.cyberforum.ru/cgi-bin/latex.cgi?%5CDelta%5E%7B-1%7D" border="0" alt="https://www.cyberforum.ru/cgi-bin/latex.cgi?\Delta^{-1}" /> существует. Тогда<br />
<br />
<img src="https://www.cyberforum.ru/cgi-bin/latex.cgi?%3Cbr%20%2F%3E%0D%0AA%5E%7B-1%7D%3D%5Cbegin%7Bbmatrix%7D%3Cbr%20%2F%3E%0D%0AA_%7B11%7D%5E%7B-1%7D%2BA_%7B11%7D%5E%7B-1%7DA_%7B12%7D%5CDelta%5E%7B-1%7DA_%7B21%7DA_%7B11%7D%5E%7B-1%7D%20%26amp%3B%20-A_%7B11%7D%5E%7B-1%7DA_%7B12%7D%5CDelta%5E%7B-1%7D%5C%5C%20%3Cbr%20%2F%3E%0D%0A-%5CDelta%5E%7B-1%7DA_%7B21%7DA_%7B11%7D%5E%7B-1%7D%20%26amp%3B%20%5CDelta%5E%7B-1%7D%3Cbr%20%2F%3E%0D%0A%5Cend%7Bbmatrix%7D" border="0" alt="https://www.cyberforum.ru/cgi-bin/latex.cgi<br />
A^{-1}=\begin{bmatrix}<br />
A_{11}^{-1}+A_{11}^{-1}A_{12}\Delta^{-1}A_{21}A_{11}^{-1} &amp; -A_{11}^{-1}A_{12}\Delta^{-1}\\ <br />
-\Delta^{-1}A_{21}A_{11}^{-1} &amp; \Delta^{-1}<br />
\end{bmatrix}" /></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>Далее в книге идет доказательство, которое мы здесь приводить не будем.<br />
<br />
Предположим, нам надо обратить матрицу четвертого порядка. По изложенной Лемме такую задачу можно свести к двум обращениям матриц второго порядка и нескольким умножениям матриц. А уж для обращения матриц второго порядка нетрудно написать очевидную подпрограмму. Вопрос о том, будут ли матрицы второго порядка обратимыми, мы оставим открытым. Скорее всего будут. В крайнем случае программа, которую мы ниже предлагаем, при специально подобранных плохих данных упадет из-за деления на нуль.<br />
<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="635718996"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="635718996" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
41
42
43
44
45
46
47
</pre></td><td class="de1"><pre class="de1"><span class="co1">! И. В. Проскуряков.</span>
<span class="co1">! Сборник задач по линейной алгебре. 2005.</span>
<span class="co1">! № 857. Найти обратную матрицу к матрице</span>
<span class="co1">! |3 &nbsp;3 -4 -3|</span>
<span class="co1">! |0 &nbsp;6 &nbsp;1 &nbsp;1|</span>
<span class="co1">! |5 &nbsp;4 &nbsp;2 &nbsp;1|</span>
<span class="co1">! |2 &nbsp;3 &nbsp;3 &nbsp;2|</span>
<span class="co1">! В задачнике имеется следующий ответ</span>
<span class="co1">! | -7 &nbsp; 5 &nbsp;12 &nbsp;-19|</span>
<span class="co1">! | &nbsp;3 &nbsp;-2 &nbsp;-5 &nbsp; &nbsp;8|</span>
<span class="co1">! | 41 -30 -69 &nbsp;111|</span>
<span class="co1">! |-59 &nbsp;43 &nbsp;99 -159|</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> <span class="sy0">::</span> <span class="me2">a</span><span class="br0">&#40;</span><span class="nu0">4</span>,<span class="nu0">4</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="sy0">&amp;</span>
<span class="co1">! (Обратите внимание, что матрица в фортране записывается по столбцам.)</span>
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="sy0">/</span> <span class="nu0">3</span>, <span class="nu0">0</span>, <span class="nu0">5</span>, <span class="nu0">2</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">3</span>, <span class="nu0">6</span>, <span class="nu0">4</span>, <span class="nu0">3</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; <span class="sy0">-</span><span class="nu0">4</span>, <span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; <span class="sy0">-</span><span class="nu0">3</span>, <span class="nu0">1</span>, <span class="nu0">1</span>, <span class="nu0">2</span> <span class="sy0">/</span><span class="br0">&#41;</span>
<span class="kw1">interface</span>
&nbsp; &nbsp; <span class="kw1">function</span> inv2<span class="br0">&#40;</span>a<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span>, <span class="kw3">dimension</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">a</span>, inv2
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">function</span> inv2
<span class="kw1">end</span> <span class="kw1">interface</span>
<span class="kw3">integer</span> i,j
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> <span class="sy0">::</span> <span class="me2">a11_inv</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span>, d_inv<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span>
&nbsp;
a11_inv<span class="sy0">=</span>inv2<span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span>,<span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
d_inv<span class="sy0">=</span>inv2<span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span>,<span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">-</span><span class="kw4">matmul</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span>,<span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span><span class="br0">&#41;</span>,<span class="kw4">matmul</span><span class="br0">&#40;</span>a11_inv,a<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span>,<span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
a<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span>,<span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">=</span>a11_inv<span class="sy0">+</span><span class="kw4">matmul</span><span class="br0">&#40;</span>a11_inv,<span class="kw4">matmul</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span>,<span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span><span class="br0">&#41;</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">matmul</span><span class="br0">&#40;</span>d_inv,<span class="kw4">matmul</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span>,<span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span><span class="br0">&#41;</span>,a11_inv<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
a<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span>,<span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">=-</span><span class="kw4">matmul</span><span class="br0">&#40;</span>a11_inv,<span class="kw4">matmul</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span>,<span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span><span class="br0">&#41;</span>,d_inv<span class="br0">&#41;</span><span class="br0">&#41;</span>
a<span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span>,<span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">=-</span><span class="kw4">matmul</span><span class="br0">&#40;</span>d_inv,<span class="kw4">matmul</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span>,<span class="nu0">1</span><span class="sy0">:</span><span class="nu0">2</span><span class="br0">&#41;</span>,a11_inv<span class="br0">&#41;</span><span class="br0">&#41;</span>
a<span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span>,<span class="nu0">3</span><span class="sy0">:</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">=</span>d_inv
<span class="co1">! Результат</span>
print <span class="st0">'(4F7.1)'</span>, <span class="br0">&#40;</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span>i,j<span class="br0">&#41;</span>, j<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">4</span><span class="br0">&#41;</span>, i<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">4</span><span class="br0">&#41;</span>
<span class="kw1">end</span>
&nbsp; &nbsp; 
<span class="kw1">function</span> inv2<span class="br0">&#40;</span>a<span class="br0">&#41;</span>
<span class="co1">! Обращение матрицы порядка 2</span>
<span class="kw3">real</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">a</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span>, inv2<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span>, det
inv2<span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">=</span>a<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span>
inv2<span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">=-</span>a<span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span>
inv2<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">=-</span>a<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">1</span><span class="br0">&#41;</span>
inv2<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">=</span>a<span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">1</span><span class="br0">&#41;</span>
det<span class="sy0">=</span><span class="nu0">1.0</span><span class="sy0">/</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">*</span>a<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">-</span>a<span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">*</span>a<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
inv2<span class="sy0">=</span>inv2<span class="sy0">*</span>det
<span class="kw1">end</span> <span class="kw1">function</span> inv2</pre></td></tr></table></div></td></tr></tbody></table></div>Вряд ли приведенный алгоритм имеет практическую ценность. Книга, из которой он взят, посвящена теоретической эффективности алгоритмов. Для обращения матриц даже такого небольшого порядка как 4 практичнее использовать готовые библиотеки. Хотя заняться замерами эффективности было бы интересно.<br />
<br />
Если же говорить об эффективности, то сама реализация, пусть и прозрачная, вызывает сомнения с точки зрения эффективности. Про эффективность оптимизатора Intel-Fortran сложены легенды. Но в данном случае человек может заметить такие свойства задачи, которых не заметит никакой оптимизатор. Вот здесь <a rel="nofollow noopener noreferrer" href="http://www.delphimaster.net/view/15-1181196883/0-40" target="_blank" title="http://www.delphimaster.net/view/15-1181196883/0-40">http://www.delphimaster.net/vi... 96883/0-40</a> в 2007 году я обсуждал этот алгоритм и пытался реализовать его наиболее эффективно.</div>

]]></content:encoded>
			<dc:creator>palva</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/242513/1879.html</guid>
		</item>
		<item>
			<title>Пример рекурсии в фортране</title>
			<link>https://www.cyberforum.ru/blogs/242513/1872.html</link>
			<pubDate>Wed, 01 Jan 2014 15:46:58 GMT</pubDate>
			<description>Современный фортран допускает рекурсивные подпрограммы и функции. Вот пример вычисления...</description>
			<content:encoded><![CDATA[<div>Современный фортран допускает рекурсивные подпрограммы и функции. Вот пример вычисления определителя при помощи разложения по строке. Определитель всегда разлагается по верхней строке, при этом вычеркивается верхняя строка и один из столбцов. Номера невычернутых столбцов передаются на нижний уровень рекурсии в массиве ia. Первоначально этот массив содержит номера всех столбцов матрицы. Параметр k содержит размер массива ia. Номер первой невычеркнутой строки равен n-k+1. Именно по этой строке будет сделано разложение на очередном уровне рекурсии.<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="930123800"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="930123800" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1"><span class="co1">! Д. К. Фаддеев, И. С. Соминский.</span>
<span class="co1">! Сборник задач по высшей алгебре. 1977.</span>
<span class="co1">! № 279. Вычислить определитель.</span>
<span class="co1">! Ответ: 900.</span>
&nbsp;
&nbsp; &nbsp; <span class="kw3">integer</span>, <span class="kw3">parameter</span> <span class="sy0">::</span> <span class="me2">n</span><span class="sy0">=</span><span class="nu0">4</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> <span class="sy0">::</span> <span class="me2">a</span><span class="br0">&#40;</span>n,n<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="sy0">&amp;</span>
<span class="co1">! Обратите внимание, что матрица в фортране записывается по столбцам.</span>
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="sy0">/</span> <span class="nu0">1</span>, <span class="sy0">-</span><span class="nu0">2</span>, &nbsp;<span class="nu0">3</span>, &nbsp;<span class="nu0">4</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">2</span>, &nbsp;<span class="nu0">1</span>, <span class="sy0">-</span><span class="nu0">4</span>, &nbsp;<span class="nu0">3</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">3</span>, <span class="sy0">-</span><span class="nu0">4</span>, <span class="sy0">-</span><span class="nu0">1</span>, <span class="sy0">-</span><span class="nu0">2</span>, <span class="sy0">&amp;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">4</span>, &nbsp;<span class="nu0">3</span>, &nbsp;<span class="nu0">2</span>, <span class="sy0">-</span><span class="nu0">1</span> &nbsp;<span class="sy0">/</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw3">integer</span> <span class="sy0">::</span> <span class="me2">ia</span><span class="br0">&#40;</span>n<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="sy0">/</span> <span class="br0">&#40;</span>i, i<span class="sy0">=</span><span class="nu0">1</span>,n<span class="br0">&#41;</span> <span class="sy0">/</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> det
&nbsp; &nbsp; print <span class="sy0">*</span>, det<span class="br0">&#40;</span>a, n, ia, n<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">end</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="kw1">recursive</span> <span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> <span class="kw1">function</span> det<span class="br0">&#40;</span>a, n, ia, k<span class="br0">&#41;</span>
<span class="co1">! &nbsp; &nbsp;Функция вычисляет минор матрицы a размера n x n, стоящий на пересечении</span>
<span class="co1">! &nbsp; &nbsp;k последних строк и k столбцов, номера которых перечислены в массиве ia.</span>
&nbsp; &nbsp; <span class="kw3">integer</span> k,n
&nbsp; &nbsp; <span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span>, <span class="kw3">dimension</span> <span class="br0">&#40;</span>n,n<span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">a</span>
&nbsp; &nbsp; <span class="kw3">integer</span>, <span class="kw3">dimension</span><span class="br0">&#40;</span>k<span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">ia</span>
&nbsp; &nbsp; <span class="kw3">integer</span> i, j, <span class="kw4">sign</span>
&nbsp; &nbsp; <span class="kw3">integer</span>, <span class="kw3">dimension</span><span class="br0">&#40;</span>k<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">iar</span>
&nbsp; &nbsp; <span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> <span class="sy0">::</span> <span class="me2">s</span>
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>k<span class="sy0">==</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; &nbsp; &nbsp; det<span class="sy0">=</span>a<span class="br0">&#40;</span>n,ia<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">if</span>
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>k<span class="sy0">==</span>n<span class="br0">&#41;</span> ia <span class="sy0">=</span> <span class="br0">&#40;</span><span class="sy0">/</span> <span class="br0">&#40;</span>i, i<span class="sy0">=</span><span class="nu0">1</span>,n<span class="br0">&#41;</span> <span class="sy0">/</span><span class="br0">&#41;</span>
&nbsp; &nbsp; s<span class="sy0">=</span><span class="nu0">0.0</span>
&nbsp; &nbsp; <span class="kw4">sign</span> <span class="sy0">=</span> <span class="nu0">1</span>
&nbsp; &nbsp; <span class="kw1">do</span> i <span class="sy0">=</span> <span class="nu0">1</span>,k
&nbsp; &nbsp; &nbsp; &nbsp; iar<span class="sy0">=</span><span class="br0">&#40;</span><span class="sy0">/</span> <span class="br0">&#40;</span>ia<span class="br0">&#40;</span>j<span class="br0">&#41;</span>, j<span class="sy0">=</span><span class="nu0">1</span>,i<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>ia<span class="br0">&#40;</span>j<span class="br0">&#41;</span>, j<span class="sy0">=</span>i<span class="sy0">+</span><span class="nu0">1</span>,k<span class="br0">&#41;</span> <span class="sy0">/</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; s <span class="sy0">=</span> s <span class="sy0">+</span> <span class="kw4">sign</span> <span class="sy0">*</span> a<span class="br0">&#40;</span>n<span class="sy0">-</span>k<span class="sy0">+</span><span class="nu0">1</span>,ia<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">*</span> det<span class="br0">&#40;</span>a, n, iar, k<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">sign</span> <span class="sy0">=</span> <span class="sy0">-</span><span class="kw4">sign</span>
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">do</span>
&nbsp; &nbsp; det <span class="sy0">=</span> s
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">function</span> det</pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>palva</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/242513/1872.html</guid>
		</item>
		<item>
			<title>Генерация случайных чисел в фортране</title>
			<link>https://www.cyberforum.ru/blogs/242513/1858.html</link>
			<pubDate>Mon, 23 Dec 2013 23:11:28 GMT</pubDate>
			<description>Для генерации случайных чисел в фортране имеется встроенная подпрограмма RANDU. Эта подпрограмма...</description>
			<content:encoded><![CDATA[<div>Для генерации случайных чисел в фортране имеется встроенная подпрограмма RANDU. Эта подпрограмма предполагает, что состояние генератора хранится в двух пользовательских переменных целого типа. Их сохранение от вызова к вызову генератора, а также инициализация, а если требуется рандомизация, должны обеспечиваться пользователем. Это создает дополнительные хлопоты по сравнению с подобными программами для других языков, где состояние генератора хранится где-то во внутренней памяти. Исторически также сложилось, что для хранения требуется две переменных, а не одна. Это добавляет неудобств. Естественно, что программисты стали использовать генераторы, реализованные в разных численных библиотеках или даже писали генераторы сами. Позднее в современных версиях фортрана появились более удобные средства (RANDOM_NUMBER, RANDOM_SEED). Но мы сначала опробуем работу RANDU. Этот генератор возвращает псевдослучайное значение типа REAL*4, равномерно распределенное между нулем и единицей. (В документации сказано, что единица случиться не может, но не стоит на это надеяться.) Приведем пример:<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="767607679"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="767607679" style="height: 142px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> s1,s2
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
print <span class="sy0">*</span>,s1,s2
<span class="co1">call randu(s1,s2,r)</span>
print <span class="sy0">*</span>,s1,s2
print <span class="sy0">*</span>,r
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Мы объявили две переменных s1 и s2 для хранения состояния и дальше обратились к RANDU, передавая эти переменные в качестве параметров. RANDU выработал нам псевдослучайное число r, которое мы напечатали. Чисто из любопытства мы напечатали значения переменных s1 и s2 до и после обращения к RANDU. Обратите внимание, что переменным s1 и s2 мы не присвоили начальные значения, и там оказался мусор. Запуская программу несколько раз и даже на разных компьютерах мы видим, что мусор там оказывается один и тот же. Поэтому и число, генерируемое программой RANDU будет одним и тем же. После работы RANDU, как мы видим, состояние генератора изменилось. Поэтому дальнейший вызов RANDU, если бы он был, дал бы нам другое случайное число. Как правило многократный вызов RANDU осуществляется с одними и теми же переменными состояния.<br />
<br />
Теперь рассмотрим вопрос о начальном состоянии генератора. Если вы действительно хотите, чтобы случайные числа при запусках программы были одними и теми же, вы не должны надеяться на постоянство мусора. Вам нужно обязательно присвоить переменным s1 и s2 какие-нибудь начальные значения. Маленькие числа присваивать не желательно. Уж очень плохого качества получаются при этом первые случайные числа. Мне нравится начинать с таких чисел: 1234 и 4321. Если же вам нужно, чтобы от запуска к запуску программа давала разные случайные числа, тогда вам нужно обеспечить, чтобы начальное значение генератора тоже было разным. Для этого обычно используют текущее время. Можно использовать встроенную функцию TIME которая вообще-то дает символьное представление времени (8 символов), но мы можем подсунуть ей целый массив и использовать те значения массива, куда лягут минуты и секунды. Следующая программа печатает первые 20 случайных чисел, причем делает это по-разному от запуска к запуску.<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="119573032"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="119573032" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> s1,s2,tm<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
<span class="kw3">integer</span> i
<span class="co1">CALL TIME(tm)</span>
s1<span class="sy0">=</span>tm<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span>
s2<span class="sy0">=</span>tm<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">20</span>
&nbsp; &nbsp; <span class="kw1">call</span> randu<span class="br0">&#40;</span>s1,s2,r<span class="br0">&#41;</span>
&nbsp; &nbsp; print <span class="sy0">*</span>,r
<span class="kw1">end</span> <span class="kw1">do</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Теперь рассмотрим тонкий вопрос. Может ли генератор дать нам число 1.0. Документация говорит, что не может. Мы, однако, хотим проверить. Для начала напишем программу, которая будет присваивать выработанное случайное выражение целой переменной. По правилам фортрана целая часть числа будет при этом отброшена. Нам остается поймать случай, когда в целую переменную попадет значение 1, и напечатать соответствующее состояние генератора.<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="206599828"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="206599828" style="height: 286px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> s1,s2,t1,t2
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
<span class="kw3">integer</span> n
s1<span class="sy0">=</span><span class="nu0">1234</span>
s2<span class="sy0">=</span><span class="nu0">4321</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">100000000</span>
&nbsp; &nbsp; t1<span class="sy0">=</span>s1
&nbsp; &nbsp; t2<span class="sy0">=</span>s2
&nbsp; &nbsp; <span class="kw1">call</span> randu<span class="br0">&#40;</span>s1,s2,r<span class="br0">&#41;</span>
&nbsp; &nbsp; n<span class="sy0">=</span>r
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>n<span class="sy0">==</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; &nbsp; &nbsp; print <span class="sy0">*</span>,t1,t2
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">exit</span>
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">if</span>
<span class="kw1">end</span> <span class="kw1">do</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>И что вы думаете? Я несколько раз приписывал нуль к числу итераций, пока не добрался до ста миллионов. И только тогда программа напечатала 14570 21825. Теперь мы можем воспроизвести это чудо и отдельно с ним разобраться.<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="305263158"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="305263158" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> s1,s2
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
<span class="kw3">integer</span> n
s1<span class="sy0">=</span><span class="nu0">14570</span>
s2<span class="sy0">=</span><span class="nu0">21825</span>
<span class="co1">call randu(s1,s2,r)</span>
n<span class="sy0">=</span>r
<span class="kw1">if</span><span class="br0">&#40;</span>r.<span class="me1">eq</span>.1.0<span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; print <span class="sy0">*</span>,r,n
<span class="kw1">end</span> <span class="kw1">if</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Как видите, это число ведет себя как единица, так что скорее всего и является единицей. Мы уж не будем анализировать его двоичный вид. Понятно, что генератор случайных чисел основан на целой арифметике, и где-то внутри целое число преобразуется в real*4. Теоретически оно получается меньше единицы, но разрядной сетки real*4 не хватает для представления всех битов из целого числа. Округление и дает нам единицу. Не подумайте, что мы нашли невинную диковинку. На самом деле это очень существенную вещь. Лично я однажды попался на этом. Программа, через полгода устойчивой работы вдруг упала. (Правда, было это на бейсике, который дал мне понятную диагностику, позволившую мне догадаться, в чем дело.) В дальнейшем мы увидим, как возможность единицы заставляет нас усложнять алгоритмы и включать дополнительные проверки.<br />
<br />
Классический вопрос, который появляется у новичка, -- это как заполнить случайными числами массив целого типа. Иногда дополнительно указывают диапазон возможных значений. Никаких условий на характер случайности не налагается, то есть предполагается, что все числа из диапазона равновероятны. Далее обычно нужно с этими числами что-нибудь сделать. Мы вычислим размах, то есть разность максимального и минимального числа диапазона. Итак, программа:<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="970487727"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="970487727" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> s1,s2,tm<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
<span class="kw3">integer</span> a<span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span> <span class="co1">! Массив, который нужно заполнить</span>
<span class="kw3">integer</span> lb,ub <span class="co1">! Нижняя и верхняя граница диапазона</span>
<span class="kw3">integer</span> i,p,imx,imn
<span class="co1">call time(tm)</span>
s1<span class="sy0">=</span>tm<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span>
s2<span class="sy0">=</span>tm<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>
lb<span class="sy0">=-</span><span class="nu0">100</span>
ub<span class="sy0">=</span><span class="nu0">100</span>
<span class="co1">! Генерация</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">100</span>
&nbsp; &nbsp; <span class="kw1">call</span> randu<span class="br0">&#40;</span>s1,s2,r<span class="br0">&#41;</span>
&nbsp; &nbsp; p <span class="sy0">=</span> <span class="br0">&#40;</span>ub<span class="sy0">-</span>lb<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">*</span>r
&nbsp; &nbsp; p <span class="sy0">=</span> lb<span class="sy0">+</span>p
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>p&gt;ub<span class="br0">&#41;</span> p<span class="sy0">=</span>ub <span class="co1">! проверка, нужная при r=1</span>
&nbsp; &nbsp; a<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">=</span>p
<span class="kw1">end</span> <span class="kw1">do</span>
<span class="co1">! Считаем размах</span>
imx<span class="sy0">=</span>a<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
imn<span class="sy0">=</span>a<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">2</span>,<span class="nu0">100</span>
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span>i<span class="br0">&#41;</span>&gt;imx<span class="br0">&#41;</span> imx<span class="sy0">=</span>a<span class="br0">&#40;</span>i<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>a<span class="br0">&#40;</span>i<span class="br0">&#41;</span>&lt;imn<span class="br0">&#41;</span> imn<span class="sy0">=</span>a<span class="br0">&#40;</span>i<span class="br0">&#41;</span>
<span class="kw1">end</span> <span class="kw1">do</span>
print <span class="sy0">*</span>,a <span class="co1">! печать массива</span>
print <span class="sy0">*</span>,imx<span class="sy0">-</span>imn <span class="co1">! печать размаха</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Если есть возможность использовать средства фортрана 90, то генерацию можно написать несколько короче. Программа RANDOM_SEED, вызванная без параметров, инициализирует генератор, используя текущее время. О переменных, хранящих состояние генератора, заботиться уже не нужно. Вычисление размаха мы опустили.<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="597574194"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="597574194" style="height: 286px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span> a<span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span> <span class="co1">! Массив, который нужно заполнить</span>
<span class="kw3">integer</span> lb,ub <span class="co1">! Нижняя и верхняя граница диапазона</span>
<span class="kw3">integer</span> i,p
<span class="co1">call random_seed;</span>
lb<span class="sy0">=-</span><span class="nu0">100</span>
ub<span class="sy0">=</span><span class="nu0">100</span>
<span class="co1">! Генерация</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">100</span>
&nbsp; &nbsp; <span class="kw1">call</span> <span class="kw4">random_number</span><span class="br0">&#40;</span>r<span class="br0">&#41;</span>
&nbsp; &nbsp; p <span class="sy0">=</span> <span class="br0">&#40;</span>ub<span class="sy0">-</span>lb<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">*</span>r
&nbsp; &nbsp; p <span class="sy0">=</span> lb<span class="sy0">+</span>p
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>p&gt;ub<span class="br0">&#41;</span> p<span class="sy0">=</span>ub <span class="co1">! проверка, нужная при r=1</span>
&nbsp; &nbsp; a<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">=</span>p
<span class="kw1">end</span> <span class="kw1">do</span>
print <span class="sy0">*</span>,a <span class="co1">! печать массива</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Вторая частая задача это сгенерировать массив так, чтобы целые числа не повторялись. Мы конкретизируем: перетасовать колоду карт (числа от 1 до 36).<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="276574767"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="276574767" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> s1,s2,tm<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
<span class="kw3">integer</span> a<span class="br0">&#40;</span><span class="nu0">36</span><span class="br0">&#41;</span> <span class="co1">! Массив, который нужно заполнить</span>
<span class="kw3">integer</span> lb,ub <span class="co1">! Нижняя и верхняя граница диапазона</span>
<span class="kw3">integer</span> i,p,t
<span class="co1">call time(tm)</span>
s1<span class="sy0">=</span>tm<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span>
s2<span class="sy0">=</span>tm<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>
lb<span class="sy0">=</span><span class="nu0">1</span>
ub<span class="sy0">=</span><span class="nu0">36</span>
<span class="co1">! Начальное заполнение (в стиле фортрана 90)</span>
forall<span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">1</span><span class="sy0">:</span><span class="nu0">36</span><span class="br0">&#41;</span> a<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">=</span>i
<span class="co1">! или в стиле фортрана 77</span>
<span class="co1">! &nbsp; do i=1,36</span>
<span class="co1">! &nbsp; &nbsp; &nbsp; a(i)=i</span>
<span class="co1">! &nbsp; end do</span>
<span class="co1">! Тасование</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">36</span>,<span class="nu0">2</span>,<span class="sy0">-</span><span class="nu0">1</span>
&nbsp; &nbsp; <span class="kw1">call</span> randu<span class="br0">&#40;</span>s1,s2,r<span class="br0">&#41;</span>
&nbsp; &nbsp; p <span class="sy0">=</span> <span class="br0">&#40;</span>ub<span class="sy0">-</span>lb<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">*</span>r
&nbsp; &nbsp; p <span class="sy0">=</span> lb<span class="sy0">+</span>p
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>p&gt;ub<span class="br0">&#41;</span> p<span class="sy0">=</span>ub <span class="co1">! проверка, нужная при r=1</span>
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>p.<span class="me1">ne</span>.<span class="me1">i</span><span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy0">=</span>a<span class="br0">&#40;</span>i<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; a<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">=</span>a<span class="br0">&#40;</span>p<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; a<span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="sy0">=</span>t
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">if</span>
&nbsp; &nbsp; ub<span class="sy0">=</span>ub<span class="sy0">-</span><span class="nu0">1</span>
<span class="kw1">end</span> <span class="kw1">do</span>
print <span class="sy0">*</span>,a <span class="co1">! печать массива</span>
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Последним примером будет генерация непрерывной случайной величины, имеющей нормальное распределение. Один из алгоритмов ее порождения основан на центральной предельной теореме. Если мы сложим 12 величин, имеющих равномерное распределение, то получим величину по распределению очень близкую к нормальному. Останется подогнать математическое ожидание и стандартное отклонение. Мы сгенерируем 10000 значений такой величины и посчитаем для сравнения выборочную среднюю и выборочную дисперсию.<br />
<div class="codeblock"><table class="fortran"><thead><tr><td colspan="2" id="357621928"  class="head">Fortran</td></tr></thead><tbody><tr class="li1"><td><div id="357621928" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1"><span class="kw3">integer</span><span class="sy0">*</span><span class="nu0">2</span> <span class="sy0">::</span> <span class="me2">s1</span><span class="sy0">=</span><span class="nu0">1234</span>, s2<span class="sy0">=</span><span class="nu0">4321</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">4</span> r
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> <span class="sy0">::</span> <span class="me2">Mean</span><span class="sy0">=</span><span class="nu0">3.0</span>, Sigma<span class="sy0">=</span><span class="nu0">0.5</span> <span class="co1">! Требуемые средняя и стандартное отклонение.</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> vm, vs <span class="co1">! Выборочная средняя и выборочное стандартное отклонение</span>
<span class="kw3">real</span><span class="sy0">*</span><span class="nu0">8</span> s
<span class="kw3">integer</span> i, k
<span class="kw3">integer</span>, <span class="kw3">parameter</span> <span class="sy0">::</span> <span class="me2">n</span><span class="sy0">=</span><span class="nu0">10000</span> <span class="co1">! объем выборки</span>
&nbsp;
vm<span class="sy0">=</span><span class="nu0">0</span>
vs<span class="sy0">=</span><span class="nu0">0</span>
<span class="kw1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,n
&nbsp; &nbsp; <span class="co1">! начало вычисления нормальной величины</span>
&nbsp; &nbsp; s<span class="sy0">=</span><span class="nu0">0.0</span>
&nbsp; &nbsp; <span class="kw1">do</span> k<span class="sy0">=</span><span class="nu0">1</span>,<span class="nu0">12</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">call</span> randu<span class="br0">&#40;</span>s1,s2,r<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; s<span class="sy0">=</span>s<span class="sy0">+</span>r
&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">do</span>
&nbsp; &nbsp; s<span class="sy0">=</span><span class="br0">&#40;</span>s<span class="sy0">-</span><span class="nu0">6.0</span><span class="br0">&#41;</span><span class="sy0">*</span>Sigma<span class="sy0">+</span>Mean
&nbsp; &nbsp; <span class="co1">! конец вычисления нормальной величины</span>
&nbsp; &nbsp; vm<span class="sy0">=</span>vm<span class="sy0">+</span>s &nbsp; <span class="co1">! накопление суммы</span>
&nbsp; &nbsp; vs<span class="sy0">=</span>vs<span class="sy0">+</span>s<span class="sy0">*</span>s <span class="co1">! накопление суммы квадратов</span>
<span class="kw1">end</span> <span class="kw1">do</span>
vm<span class="sy0">=</span>vm<span class="sy0">/</span>n <span class="co1">! выборочная средняя</span>
vs<span class="sy0">=</span><span class="kw4">sqrt</span><span class="br0">&#40;</span><span class="br0">&#40;</span>vs<span class="sy0">/</span>n<span class="sy0">-</span>vm<span class="sy0">*</span>vm<span class="br0">&#41;</span><span class="sy0">*</span>n<span class="sy0">/</span><span class="br0">&#40;</span>n<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="co1">! выборочное стандарное отклонение</span>
print <span class="sy0">*</span>,vm, vs
<span class="kw1">end</span></pre></td></tr></table></div></td></tr></tbody></table></div>Выборочные параметры полученной выборки совпали с заданными с точностью до нескольких тысячных.<br />
<br />
(Эксперименты проводились на Intel Fortran 11.1)</div>

]]></content:encoded>
			<dc:creator>palva</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/242513/1858.html</guid>
		</item>
		<item>
			<title>Регулярные выражения в Delphi XE</title>
			<link>https://www.cyberforum.ru/blogs/242513/1844.html</link>
			<pubDate>Thu, 19 Dec 2013 17:46:19 GMT</pubDate>
			<description>Начиная с версии XE, в Delphi появились регулярные выражения. То есть, при помощи сторонних...</description>
			<content:encoded><![CDATA[<div>Начиная с версии XE, в Delphi появились регулярные выражения. То есть, при помощи сторонних продуктов работать  ними можно было и раньше, но теперь соответствующий юнит появляется вместе с установкой  Delphi. Вот примеры использования.<br />
<br />
Имеется ли вхождение? Да, имеется.<br />
<div class="codeblock"><table class="delphi"><thead><tr><td colspan="2" id="548508530"  class="head">Delphi</td></tr></thead><tbody><tr class="li1"><td><div id="548508530" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="co2">{$APPTYPE CONSOLE}</span>
<span class="kw1">uses</span> RegularExpressions<span class="sy1">;</span>
<span class="kw1">begin</span>
&nbsp; <span class="kw1">if</span> TregEx<span class="sy1">.</span><span class="me1">IsMatch</span><span class="br0">&#40;</span><span class="st0">'eksaek647dl'</span><span class="sy1">,</span> <span class="st0">'ek\d+'</span><span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="st0">'Yes'</span><span class="br0">&#41;</span>
&nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="st0">'No'</span><span class="br0">&#41;</span>
<span class="co1">// Yes</span>
<span class="kw1">end</span><span class="sy1">.</span></pre></td></tr></table></div></td></tr></tbody></table></div>А теперь нет - не тот регистр букв.<br />
<div class="codeblock"><table class="delphi"><thead><tr><td colspan="2" id="977752285"  class="head">Delphi</td></tr></thead><tbody><tr class="li1"><td><div id="977752285" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="co2">{$APPTYPE CONSOLE}</span>
<span class="kw1">uses</span> RegularExpressions<span class="sy1">;</span>
<span class="kw1">begin</span>
&nbsp; <span class="kw1">if</span> TregEx<span class="sy1">.</span><span class="me1">IsMatch</span><span class="br0">&#40;</span><span class="st0">'eksaek647dl'</span><span class="sy1">,</span> <span class="st0">'ek\d+'</span><span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="st0">'Yes'</span><span class="br0">&#41;</span>
&nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="st0">'No'</span><span class="br0">&#41;</span>
<span class="co1">// No</span>
<span class="kw1">end</span><span class="sy1">.</span></pre></td></tr></table></div></td></tr></tbody></table></div>Игнорируем регистр букв - опять найдено.<br />
<div class="codeblock"><table class="delphi"><thead><tr><td colspan="2" id="824194061"  class="head">Delphi</td></tr></thead><tbody><tr class="li1"><td><div id="824194061" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="co2">{$APPTYPE CONSOLE}</span>
<span class="kw1">uses</span> RegularExpressions<span class="sy1">;</span>
<span class="kw1">begin</span>
&nbsp; <span class="kw1">if</span> TregEx<span class="sy1">.</span><span class="me1">IsMatch</span><span class="br0">&#40;</span><span class="st0">'eksaeK647dl'</span><span class="sy1">,</span> <span class="st0">'ek\d+'</span><span class="sy1">,</span> <span class="br0">&#91;</span>roIgnoreCase<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="kw1">then</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="st0">'Yes'</span><span class="br0">&#41;</span>
&nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="st0">'No'</span><span class="br0">&#41;</span>
<span class="co1">// Yes</span>
<span class="kw1">end</span><span class="sy1">.</span></pre></td></tr></table></div></td></tr></tbody></table></div>Находим все вхождения.<br />
<div class="codeblock"><table class="delphi"><thead><tr><td colspan="2" id="935954209"  class="head">Delphi</td></tr></thead><tbody><tr class="li1"><td><div id="935954209" style="height: 254px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="de1"><pre class="de1"><span class="co2">{$APPTYPE CONSOLE}</span>
<span class="kw1">uses</span> RegularExpressions<span class="sy1">;</span>
<span class="kw1">var</span>
&nbsp; m<span class="sy1">:</span> TMatch<span class="sy1">;</span>
<span class="kw1">begin</span>
&nbsp; m <span class="sy1">:</span><span class="sy3">=</span> TRegEx<span class="sy1">.</span><span class="me1">Match</span><span class="br0">&#40;</span><span class="st0">'eksaek647dlgddek43gfd'</span><span class="sy1">,</span><span class="st0">'ek\d+'</span><span class="br0">&#41;</span><span class="sy1">;</span>
&nbsp; <span class="kw1">while</span> m<span class="sy1">.</span><span class="me1">Success</span> <span class="kw1">do</span>
&nbsp; <span class="kw1">begin</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span>m<span class="sy1">.</span><span class="me1">Index</span><span class="sy1">,</span> <span class="st0">' '</span><span class="sy1">,</span> m<span class="sy1">.</span><span class="me1">Length</span><span class="sy1">,</span> <span class="st0">' '</span><span class="sy1">,</span> m<span class="sy1">.</span><span class="me1">value</span><span class="br0">&#41;</span><span class="sy1">;</span>
&nbsp; &nbsp; m <span class="sy1">:</span><span class="sy3">=</span> m<span class="sy1">.</span><span class="me1">NextMatch</span><span class="sy1">;</span>
&nbsp; <span class="kw1">end</span><span class="sy1">;</span>
<span class="co1">//5 5 ek647</span>
<span class="co1">//15 4 ek43</span>
<span class="kw1">end</span><span class="sy1">.</span></pre></td></tr></table></div></td></tr></tbody></table></div>Или, что то же самое, но в другом режиме использования, удобном, когда много строк проверяется на одно и то же регулярное выражение.<br />
<div class="codeblock"><table class="delphi"><thead><tr><td colspan="2" id="469148723"  class="head">Delphi</td></tr></thead><tbody><tr class="li1"><td><div id="469148723" style="height: 270px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="de1"><pre class="de1"><span class="co2">{$APPTYPE CONSOLE}</span>
<span class="kw1">uses</span> RegularExpressions<span class="sy1">;</span>
<span class="kw1">var</span>
&nbsp; re<span class="sy1">:</span> TRegex<span class="sy1">;</span>
&nbsp; mc<span class="sy1">:</span> TMatchCollection<span class="sy1">;</span>
&nbsp; i<span class="sy1">:</span> <span class="kw4">Integer</span><span class="sy1">;</span>
<span class="kw1">begin</span>
&nbsp; re<span class="sy1">.</span><span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">'ek\d+'</span><span class="br0">&#41;</span><span class="sy1">;</span>
&nbsp; mc <span class="sy1">:</span><span class="sy3">=</span> re<span class="sy1">.</span><span class="me1">Matches</span><span class="br0">&#40;</span><span class="st0">'eksaek647dlgddek43gfd'</span><span class="br0">&#41;</span><span class="sy1">;</span>
&nbsp; <span class="kw1">for</span> i<span class="sy1">:</span><span class="sy3">=</span><span class="nu0">0</span> <span class="kw1">to</span> mc<span class="sy1">.</span><span class="me1">Count</span><span class="sy3">-</span><span class="nu0">1</span> <span class="kw1">do</span> <span class="kw1">begin</span>
&nbsp; &nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span>mc<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy1">.</span><span class="me1">Index</span><span class="sy1">,</span> <span class="st0">' '</span><span class="sy1">,</span> mc<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy1">.</span><span class="me1">Length</span><span class="sy1">,</span> <span class="st0">' '</span><span class="sy1">,</span> mc<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy1">.</span><span class="me1">value</span><span class="br0">&#41;</span><span class="sy1">;</span>
&nbsp; <span class="kw1">end</span><span class="sy1">;</span>
<span class="co1">//5 5 ek647</span>
<span class="co1">//15 4 ek43</span>
<span class="kw1">end</span><span class="sy1">.</span></pre></td></tr></table></div></td></tr></tbody></table></div>Обратите внимание: TRegEx это не class, а record.<br />
<br />
Замена и разбиение строк.<br />
<div class="codeblock"><table class="delphi"><thead><tr><td colspan="2" id="377568335"  class="head">Delphi</td></tr></thead><tbody><tr class="li1"><td><div id="377568335" style="height: 238px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="de1"><pre class="de1"><span class="co2">{$APPTYPE CONSOLE}</span>
<span class="kw1">uses</span> RegularExpressions<span class="sy1">;</span>
<span class="kw1">var</span>
&nbsp; s<span class="sy1">:</span> <span class="kw4">String</span><span class="sy1">;</span>
&nbsp; ar<span class="sy1">:</span> TArray&lt;String&gt;<span class="sy1">;</span>
<span class="kw1">begin</span>
&nbsp; s <span class="sy1">:</span><span class="sy3">=</span> TregEx<span class="sy1">.</span><span class="me1">Replace</span><span class="br0">&#40;</span><span class="st0">'55ek6saeK647dl'</span><span class="sy1">,</span> <span class="st0">'ek\d+'</span><span class="sy1">,</span> <span class="st0">' '</span><span class="sy1">,</span> <span class="br0">&#91;</span>roIgnoreCase<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy1">;</span>
&nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy1">;</span>
<span class="co1">// 55 sa dl</span>
&nbsp; ar <span class="sy1">:</span><span class="sy3">=</span> TregEx<span class="sy1">.</span><span class="me1">Split</span><span class="br0">&#40;</span>s<span class="sy1">,</span> <span class="st0">' s?'</span><span class="br0">&#41;</span><span class="sy1">;</span>
<span class="co1">// 3 a</span>
&nbsp; <span class="kw3">WriteLn</span><span class="br0">&#40;</span><span class="kw3">Length</span><span class="br0">&#40;</span>ar<span class="br0">&#41;</span><span class="sy1">,</span> <span class="st0">' '</span><span class="sy1">,</span> ar<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy1">;</span>
<span class="kw1">end</span><span class="sy1">.</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>palva</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/242513/1844.html</guid>
		</item>
	</channel>
</rss>
