<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Александр Осипов</title><generator>teletype.in</generator><description><![CDATA[Александр Осипов]]></description><link>https://teletype.in/@ralex061?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/ralex061?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/ralex061?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 04 Apr 2026 10:28:56 GMT</pubDate><lastBuildDate>Sat, 04 Apr 2026 10:28:56 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@ralex061/7-SJ8KZvjLI</guid><link>https://teletype.in/@ralex061/7-SJ8KZvjLI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/7-SJ8KZvjLI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Анонс обучающего курса на платформе Stepik. Часть 3</title><pubDate>Wed, 08 Nov 2023 13:19:05 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/21/10/2110228b-4b64-4d0e-b94f-c76a174196e0.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/34/30/3430a09e-c291-41ec-bc38-6ef4e25bf9e1.jpeg"></img>Часто приходится слышать как люди, увидев код в PascalАВС.NЕТ в точечной нотации, говорят: &quot;А, тут LINQ используется...&quot;. И это зачастую совершенно неверно. Вот пример кода с точечной нотацией, который не имеет к LINQ никакого отношения:]]></description><content:encoded><![CDATA[
  <figure id="S5xg" class="m_original">
    <img src="https://img4.teletype.in/files/34/30/3430a09e-c291-41ec-bc38-6ef4e25bf9e1.jpeg" width="927" />
  </figure>
  <p id="Zt7e">Часто приходится слышать как люди, увидев код PascalАВС.NЕТ в точечной нотации, говорят: &quot;А, тут LINQ используется...&quot;. И это зачастую совершенно неверно. Вот пример кода с точечной нотацией, который не имеет к LINQ никакого отношения:</p>
  <pre id="VXLX">##
function Sum(Self: array of integer): integer; extensionmethod;
begin
  Result := 0;
  foreach var n in Self do
    Result += n
end;

function Println(Self: array of integer): array of integer; extensionmethod;
begin
  var n := Self.Length;
  Result := new integer[n];
  for var i := 0 to n - 2 do
  begin  
    Result[i] := Self[i];
    Write(Self[i], &#x27; &#x27;)
  end;
  Result[n - 1] := Self[n - 1];
  Writeln(Self[n - 1])
end;

var n := ReadInteger;
var a := new integer[n];
a[0] := 1;
a[1] := 3;
for var i := 2 to n - 1 do
  a[i] := 3 * a[i - 2] + 5 * a[i - 1] - 4;
Write(a.Println.Sum)
{
Результат работы программы:
10
1 3 14 75 413 2286 12665 70179 388886 2154963
2629485
}</pre>
  <p id="1syJ">Так что же такое LINQ на самом деле?</p>
  <p id="b5vc">LINQ - сокращенное название технологии Microsoft LINQ to Objects библиотек .NET Framework. для доступа к данным, расположенным в памяти компьютера. Сам термин LINQ - аббревиатура Language INtegrated Query (интегрированный язык запросов). Используя LINQ, можно обращаться к последовательностям, а также к коллекциям данных, например, к спискам List, как к таблицам базы данных.</p>
  <p id="fUsd">Традиционно данные из последовательностей извлекались путем перебора всех элементов в цикле <strong><code>foreach</code></strong>. Использование LINQ предполагает создание <em><strong>запросов</strong></em> - фрагментов кода, описывающих данные, которые требуется извлечь без указания того, как это сделать.</p>
  <p id="tyOe">Использование запросов LINQ дает следующие преимущества:</p>
  <ul id="CDoA">
    <li id="E447">запросы короткие, их удобно читать и легко понимать;</li>
    <li id="vNOi">запросы мощные, с их помощью можно производить сложную обработку данных;</li>
    <li id="ZcIp">запросы могут переноситься в другие источники данных практически без изменения (они одинаковы для последовательностей, списков и т.д.).</li>
  </ul>
  <p id="AuJt">Чем сложнее набор манипуляций с данными, тем больший выигрыш достигается с использованием запросов LINQ, объединенных в цепочки точечной нотации.</p>
  <p id="xBUc">Технология LINQ включает около полусотни операций, разделяющихся на две группы - отложенные (&quot;ленивые&quot;) операции и не отложенные операции (исполняются сразу). К группе не отложенных операций относятся получение <em><strong>свёрток</strong></em> (приведение данных к единственному значению - сумме, произведению, количеству и т.п.), выборка единственного элемента, преобразование к другому типу данных (последовательности в список List, массив или словарь), а также установление эквивалентности двух наборов данных.</p>
  <p id="hzOq">Чтобы получить непосредственный доступ к методам LINQ, нужно либо подключить <em><strong>пространство имён</strong></em> <code>System.Linq</code>, либо указывать его при каждом вызове метода. Для последовательностей в .NET нужно обращаться к классу <code>Enumerable</code>.</p>
  <pre id="Gq8g">## uses System.Linq;
var s := Enumerable.Range(-3, 8);
s.Println;                                // -3 -2 -1 0 1 2 3 4
s := Enumerable.Reverse(s);
s.Print                                   // 4 3 2 1 0 -1 -2 -3</pre>
  <pre id="8itI">##
var s := System.Linq.Enumerable.Range(-3, 8);
s.Println;                                // -3 -2 -1 0 1 2 3 4
s := System.Linq.Enumerable.Reverse(s);
s.Print                                   // 4 3 2 1 0 -1 -2 -3</pre>
  <p id="TGWR">Вызовы подобной длины приходится писать, например, в языке C#. Разработчики PascalАВС.NЕТ ввели множество дополнительных функций и методов расширения, позволяющих сделать работу с LINQ существенно удобнее.</p>
  <pre id="DW11">##
var s := Range(-3, 4);
s.Println;                                // -3 -2 -1 0 1 2 3 4
s := s.Reverse;
s.Print                                   // 4 3 2 1 0 -1 -2 -3</pre>
  <p id="jlTO">Здесь <code>Range</code> - уже не метод из LINQ, а функция PascalАВС.NЕТ. Если в .NET-методе второй параметр обозначал длину генерируемой последовательности, то в функции это верхняя граница диапазона данных. Сама же функция находится в системной библиотеке PABCSystem и является &quot;обёрткой&quot; для вызова метода .NET:</p>
  <pre id="5hDQ">function Range(a, b: integer): sequence of integer;
begin
  if b &lt; a then 
    Result := System.Linq.Enumerable.Empty&amp;&lt;integer&gt;
  else Result := System.Linq.Enumerable.Range(a, b - a + 1);
end;</pre>
  <p id="YyHn">В состав .NET LINQ входят 14 типов операций: агрегация, преобразование, конкатенация, элемент, множество, генерация, группирование, соединение, упорядочивание, проекция, разбиение, ограничение, квантификатор и эквивалентность.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/Boz5Hp4tqox</guid><link>https://teletype.in/@ralex061/Boz5Hp4tqox?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/Boz5Hp4tqox?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Работа с  калькулятором сетей TCP/IP в PascalАВС.NЕТ</title><pubDate>Fri, 22 Sep 2023 19:22:38 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c7/c8/c7c8484b-a249-44af-bc15-be32c200717b.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg"></img>Решим с помощью калькулятора практическую задачу по созданию подсетей.]]></description><content:encoded><![CDATA[
  <figure id="7oLM" class="m_original">
    <img src="https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg" width="645" />
  </figure>
  <p id="8Zoq">Решим с помощью калькулятора практическую задачу по созданию подсетей.</p>
  <p id="1KYX"><em>В некоторой организации сетевому администратору поручили организовать на базе выданного организации ip-адреса 89.16.105.0/24 три подсети емкостью 120, 58 и 15 узлов. С этой целью ему нужно подготовить задание для инженеров и указать в нем диапазоны адресов для каждой подсети.</em></p>
  <p id="rs3K">Проверяем, имеет ли сеть достаточную емкость. Учитываем, что для подсети с n узлами потребуется емкость, равная n+2 (добавляется адрес самой подсети и широковещательный адрес). Потребное количество адресов составляет</p>
  <p id="yHC0">(120+2)+(58+2)+(15+2) = 122+ 60 + 17 = 199.</p>
  <p id="5Pcy">Маска сети /24 означает, что 24 из 32 бит адреса заняты адресом сети, а на долю узлов (они же - хосты) остается 32-24 = 8 бит. Эти 8 бит позволяют завести 2^8 = 256 узлов, так что часть адресов попадут в запас.</p>
  <p id="AS86">Каждая подсеть должна иметь свою битовую маску, поэтому количество узлов в ней должно быть кратно степени двойки. Распределяем адреса для каждой подсети в порядке убывания числа узлов.</p>
  <p id="YOlG">1. 2^6 &lt; 122 &lt; 2^7, поэтому для подсети потребуется маска хоста с префиксом /25. 7 бит отводим на узлы подсети, остаются 32-7 = 25 бит для  маски адреса. Теперь мы можем с помощью калькулятора рассчитать параметры первой подсети.</p>
  <pre id="mhR9">## uses School;
Print(new CalcIP(&#x27;89.16.105.0&#x27;, 25));</pre>
  <figure id="awz7" class="m_original">
    <img src="https://img2.teletype.in/files/10/ba/10bacb7a-5ab2-4651-8f01-91c8b710a8d3.png" width="946" />
  </figure>
  <p id="btIF">Первая подсеть будет иметь сетевой адрес 89.16.105.0/25, ее широковещательный адрес 89.16.105.127 и диапазон адресов узлов 89.16.105.1 - 89.16.105.120.</p>
  <p id="Mchw">2. 2^5 &lt; 60 &lt; 2^6, поэтому для подсети потребуется маска длиной 6 бит; ее префикс /26. Адрес этой подсети на единицу превышает широковещательный адрес предыдущей подсети, т.е. он равен 89.16.105.128.</p>
  <pre id="G4tV">Print(new CalcIP(&#x27;89.16.105.128&#x27;, 26));</pre>
  <figure id="L1xG" class="m_original">
    <img src="https://img3.teletype.in/files/65/c5/65c588fd-5256-4345-a1a9-a502db0cb473.png" width="942" />
  </figure>
  <p id="V1MO">Вторая подсеть будет иметь сетевой адрес 89.16.105.128/26, ее широковещательный адрес 89.16.105.191 и диапазон адресов узлов 89.16.105.129 - 89.16.105.188.</p>
  <p id="wxlv">2^4 &lt; 17 &lt; 2^5, поэтому для подсети потребуется маска длиной 5 бит; ее префикс /27. Адрес этой подсети на единицу превышает широковещательный адрес предыдущей подсети, т.е. он равен 89.16.105.192.</p>
  <pre id="CMLe">Print(new CalcIP(&#x27;89.16.105.192&#x27;, 27));</pre>
  <figure id="4vee" class="m_original">
    <img src="https://img3.teletype.in/files/21/52/21528c2b-edd8-4381-98d3-0cc3046c6b49.png" width="938" />
  </figure>
  <p id="SNUH">Третья подсеть будет иметь сетевой адрес 89.16.105.192/27, ее широковещательный адрес 89.16.105.223 и диапазон адресов узлов 89.16.105.193 - 89.16.105.207.</p>
  <p id="hkAa">Конечно, этот же расчет можно было провести и &quot;на бумаге&quot;, и с помощью калькулятора из сети Интернет, но целью этого материала было показать, что калькулятор в PascalАВС.NЕТ отлично подходит для решения подобных задач.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/zEIHv4Lo78_</guid><link>https://teletype.in/@ralex061/zEIHv4Lo78_?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/zEIHv4Lo78_?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Работа с  калькулятором сетей TCP/IP в PascalАВС.NЕТ</title><pubDate>Thu, 21 Sep 2023 15:28:46 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c7/c8/c7c8484b-a249-44af-bc15-be32c200717b.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg"></img>В библиотеке School начиная с версии PascalАВС.NЕТ 3.9.0.3360 от 21.09.23 доступен калькулятор сетей TCP/IP, реализованный на базе двух классов: собственно калькулятора CalcIP и класса 32-битных адресов Addr32, обеспечивающего работу калькулятора, а также предоставляющего удобную работу с адресами IPv4 при самостоятельном использовании.]]></description><content:encoded><![CDATA[
  <figure id="xFhB" class="m_original">
    <img src="https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg" width="645" />
  </figure>
  <p id="hYIe">В библиотеке School начиная с версии PascalАВС.NЕТ 3.9.0.3360 от 21.09.23 доступен калькулятор сетей TCP/IP, реализованный на базе двух классов: собственно калькулятора <code>CalcIP</code> и класса 32-битных адресов <code>Addr32</code>, обеспечивающего работу калькулятора, а также предоставляющего удобную работу с адресами IPv4 при самостоятельном использовании.</p>
  <h2 id="PtO6">Класс Addr32</h2>
  <p id="JtfA">В классе доступны на чтение три свойства (приведен пример для 192.168.0.1):</p>
  <ul id="Ix4s">
    <li id="Gb4I"><code>value: string</code> - адрес в десятичном представлении с октетами, <code>192.168.0.1</code>;</li>
    <li id="zDB0"><code>value2: string</code> - дополненное (при необходимости) слева нулями до длины 32 бита двоичное представление адреса, <code>11000000101010000000000000000001</code>;</li>
    <li id="6ODZ"><code>value10: longword</code> - беззнаковое целое значение адреса, <code>3232235521</code>.</li>
  </ul>
  <p id="HhDZ">Метод <code>AddrFormat(addr: string): string</code> форматирует параметр <code>addr</code>, разделяя точкой каждые 8 бит: <code>11000000.10101000.00000000.00000001.</code></p>
  <p id="6pxC">Перегруженный метод <code>.ToString: string</code> служит для простого и наглядного вывода значений адресов созданного объекта:</p>
  <pre id="c5nk">## uses School;

var a := new Addr32(&#x27;192.168.0.1&#x27;);
Print(a)
{
192.168.0.1,   11000000.10101000.00000000.00000001
}</pre>
  <p id="avJq"> В классе перегружены три логические побитовые операции: <code>and</code>; <code>or</code>, <code>not</code>. Они могут быть полезны для операций с маской. Применяются в коде программы, естественно, к самим объектам, а не к их свойствам. Например, наложим на сетевой адрес <code>135.12.171.214 </code>маску <code>255.255.248 </code>и получим адрес сети:</p>
  <pre id="pdYf">## uses School;

var ip := new Addr32(&#x27;135.12.171.214&#x27;);
var mask := new Addr32(&#x27;255.255.248.0&#x27;);
var net_addr := ip and mask;
Print(net_addr)
{
135.12.168.0,  10000111.00001100.10101000.00000000
}</pre>
  <p id="x9hS">Перегрузка операции сложения (<code>+</code>) позволяет складывать с адресом целое число <code>n: lobgword</code>, тем самым получая новый адрес, отстоящий от имеющегося на <code>n</code>. Такая операция полезна при переборе адресов.</p>
  <pre id="ebn0">## uses School;

var ip := new Addr32(&#x27;135.12.171.214&#x27;);
for var i := 0 to 5 do
  Println(ip + i)
{
135.12.171.214,10000111.00001100.10101011.11010110 
135.12.171.215,10000111.00001100.10101011.11010111 
135.12.171.216,10000111.00001100.10101011.11011000 
135.12.171.217,10000111.00001100.10101011.11011001 
135.12.171.218,10000111.00001100.10101011.11011010 
135.12.171.219,10000111.00001100.10101011.11011011 
}</pre>
  <p id="r8QX">Класс содержит два конструктора. Аргумент первого из них - адрес в десятичной записи с октетами. В приведенных примерах вызывался именно этот конструктор. Второй конструктор используется для построения маски сети по префиксу - количеству единичных бит в левой части маски. Например, для сетевого адреса a.b.c.d/19 маску можно создать вызовом <code>Addr32(19)</code>.</p>
  <pre id="aY1N">## uses School;

var mask := new Addr32(19);
Print(mask)
{
255.255.224.0, 11111111.11111111.11100000.00000000 
}</pre>
  <h2 id="hAYk">Класс CalcIP</h2>
  <p id="WVAt">В классе доступны на чтение девять свойств. Их имена и назначение видны, если объект класса <code>CalcIP</code> отправить на вывод.</p>
  <ul id="FsOr">
    <li id="0rVd"><code>Address: Addr32</code> - IP-адрес;</li>
    <li id="k1Gq"><code>Netmask: Addr32</code> - маска сетевого адреса;</li>
    <li id="T63r"><code>Bitmask: byte</code> - количество единиц в маске адреса сети;</li>
    <li id="5NqI"><code>Hosts: integer</code>- количество хостов в сети (исключая адрес сети и широковещательный адрес)</li>
    <li id="CflI"><code>Wildcard: Addr32</code>- маска хостов (инверсия <code>Bitmask</code>);</li>
    <li id="tncW"><code>Network: Addr32</code>- адрес сети;</li>
    <li id="5vmO"><code>Broadcast: Addr32</code>- широковещательный адрес;</li>
    <li id="zWnM"><code>Hostmin: Addr32</code>- адрес первого хоста;</li>
    <li id="XW3q"><code>Hostmax: Addr32</code>- адрес последнего хоста.</li>
  </ul>
  <p id="sld6">Перегруженный метод <code>.ToString: string</code> служит для вывода всех свойств объекта в отформатированном виде:</p>
  <figure id="l4W5" class="m_original">
    <img src="https://img2.teletype.in/files/1e/93/1e939751-4511-46cd-8fc6-3a34c54c9c7d.png" width="1004" />
  </figure>
  <p id="615w">Класс содержит два конструктора. Первый требует задать в виде десятичных адресов с октетами ip-адрес и маску сети. Пример вызова такого конструктора приведен на рисунке выше. Этот же калькулятор можно было создать, задав в качестве второго параметра префикс маски подсети, т.е. /28:</p>
  <pre id="mJzd">var calc := new CalcIP(&#x27;202.75.38.176&#x27;, 28);</pre>
  <p id="64tN">Генератор адресов <code>GenAddrBin: sequence of string</code> позволяет создавать последовательность двоичных адресов хостов, включая адрес сети и широковещательный адрес. Формат адреса - <code>Addr32.value2</code>.  </p>
  <p id="dzw7">Еще один генератор адресов <code>GenAddr: sequence of Addr32</code> может быть использован для более сложной работы с адресными объектами.</p>
  <h3 id="KaN6">Пример. Решение задачи с сайта К. Полякова</h3>
  <p id="PiCW"><em>(№ 6844) (К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 202.75.38.176 и маской сети 255.255.255.240.<br />Сколько в этой сети IP-адресов, у которых в двоичной записи IP-адреса никакие три единицы или три нуля не стоят рядом?<br />В ответе укажите только число.</em></p>
  <pre id="Mqq5">## uses School;

var calc6844 := new CalcIP(&#x27;202.75.38.176&#x27;, &#x27;255.255.255.240&#x27;);
calc6844.GenAddrBin.Count(addr -&gt; not addr.IsMatch(&#x27;000|111&#x27;)).Println;</pre>
  <p id="jMQR">Ответ: 5.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/k_YLcCFPfVE</guid><link>https://teletype.in/@ralex061/k_YLcCFPfVE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/k_YLcCFPfVE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>PascalАВС.NЕТ: калькулятор сетей TCP/IP в библиотеке School</title><pubDate>Wed, 20 Sep 2023 20:29:09 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c7/c8/c7c8484b-a249-44af-bc15-be32c200717b.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg"></img>Калькулятор дает возможность в наглядном виде получить основную информацию о подсетях TCP/IP, задав адрес сети и маску подсети. Отображение информации с помощью калькулятора показано на приведенном ниже рисунке для ip-адреса 15.218.42.12 и маски 255.255.192.0.]]></description><content:encoded><![CDATA[
  <figure id="RGxD" class="m_original">
    <img src="https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg" width="645" />
  </figure>
  <h3 id="hleK">Назначение и основные возможности</h3>
  <p id="1X9e">Калькулятор сетей доступен в PascalАВС.NЕТ версии не ниже 3.9.0.3360 от 21.09.2023. Он дает возможность в наглядном виде получить основную информацию о подсетях TCP/IP, задав адрес сети и маску подсети.</p>
  <h3 id="la7m">Реализация</h3>
  <p id="NnG5">Калькулятор реализован на базе двух классов.</p>
  <p id="xCfH">Класс с именем Addr32 позволяет создавать объекты, моделирующие 32-битные сетевые адреса IPv4 и маски. Пользователю доступны три свойства адреса: <code>value</code> (десятичный адрес в формате с октетами, например, 15.218.42.12), <code>value2</code> (адрес в виде беззнакового двоичного числа длиной 32 бита) и <code>value10</code> (адрес, переведенный из двоичной системы счисления в десятичную). Для объектов этого класса перегружены побитовые логические операции <code>and</code>, <code>or</code>, <code>not</code>, а также операция <code>+</code> для сложения адреса с целочисленным значением (инкремент). Это дает простоту и удобство при работе с масками.</p>
  <p id="SLrp">Другой класс с именем CalcIP - это сам калькулятор на основе заданного сетевого адреса и маски. Маску можно задавать в формате десятичного адреса, префикса или непосредственно в виде 32-битной строки. У калькулятора девять свойств и их имена перечислены в круглых скобках на приведенном выше рисунке. Свойство <code>Bitmask</code> имеет тип <code>byte</code>, свойство <code>Hosts</code> - тип <code>integer</code>, а остальные семь являются объектами класса Addr32. Таким образом, если создать калькулятор с именем MyCalc, двоичный адрес первого хоста в коде программы будет доступен под именем <code>MyCalc.Hostmin.value2</code>.</p>
  <h3 id="DaAb">Что еще можно получить с помощью калькулятора</h3>
  <p id="GFsy">Создав объект класса Addr32 на основе того или иного формата адреса, можно получить отображение этого адреса. Перегруженный метод .ToString позволяет сформировать строку, содержащую адрес в удобном для восприятия виде. Например, оператор <code>Print(new Addr32(&#x27;34.118.53.125&#x27;));</code> выведет:<br /><code>34.118.53.125, 00100010.01110110.00110101.01111101</code></p>
  <p id="t5lc">Метод калькулятора GenAddr - генератор адресов хостов. Он возвращает последовательность адресов в виде объектов класса Addr32.</p>
  <p id="U1uK">Еще один генератор, GenAddrBin, возвращает последовательность двоичных 32-битных адресов - это удобно для операций с битовой маской. Поскольку 32-битное отображение - это строка, применение к нему регулярных выражений открывает широчайшие возможности.</p>
  <h3 id="8PdE">Примеры использования калькулятора</h3>
  <p id="RC4e">1. Вот так можно получить сетевую информацию, задав ip-адрес и маску.</p>
  <figure id="GEQn" class="m_original">
    <img src="https://img4.teletype.in/files/fe/42/fe42c81c-a8f5-4b6a-8fc1-d82720e9179b.jpeg" width="952" />
  </figure>
  <p id="64JR">2. Решение варианта задания 13 с сайта К. Полякова.</p>
  <p id="oeDZ">(№ 6842) (К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 158.132.161.128 и маской сети 255.255.255.128.<br />Сколько в этой сети IP-адресов, которые в двоичной записи IP-адреса оканчиваются единицей?<br />В ответе укажите только число.</p>
  <pre id="ARGn">## uses School;

var x := new CalcIP(&#x27;58.132.161.128&#x27;, &#x27;255.255.255.128&#x27;);
x.GenAddrBin.Count(addr -&gt; addr[^1] = &#x27;1&#x27;).Println;     // 64</pre>
  <h3 id="7aJp">Что дальше?</h3>
  <p id="Hi6R">Следующий материал на эту тему будет посвящен деталям работы с калькулятором сетей TCP/IP.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/pfEegL34C-8</guid><link>https://teletype.in/@ralex061/pfEegL34C-8?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/pfEegL34C-8?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Анонс обучающего курса на платформе Stepik. Часть 2.</title><pubDate>Mon, 18 Sep 2023 16:03:41 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a2/2e/a22e2e92-acf4-4e84-84c5-5323cba2340e.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/f8/4a/f84a9d6f-b89f-4dde-81b3-f39c26b07e03.jpeg"></img>Для повышения эффективности обработки структурированных данных используют их объединение в коллекции. Коллекция предлагает готовый набор средств работы с данными различной, иногда достаточно сложной структуры. Коллекции Microsotf ,NET поддерживают списки, стеки, очереди, множества, словари и т.д. При этом коллекции позволяют применять единый стандартизованный подход к данным различной структуры.]]></description><content:encoded><![CDATA[
  <figure id="TJDl" class="m_original">
    <img src="https://img4.teletype.in/files/f8/4a/f84a9d6f-b89f-4dde-81b3-f39c26b07e03.jpeg" width="927" />
  </figure>
  <h3 id="Uwig">1. Немного теории</h3>
  <p id="PwlL">Для повышения эффективности обработки структурированных данных используют их объединение в <em><strong>коллекции</strong></em>. Коллекция предлагает готовый набор средств работы с данными различной, иногда достаточно сложной структуры. Коллекции Microsotf .NET поддерживают списки, стеки, очереди, множества, словари и т.д. При этом коллекции позволяют применять единый стандартизованный подход к данным различной структуры.</p>
  <p id="5RKY">Среда .NET предоставляет несколько типов коллекций, но мы остановимся только на одном: <em><strong>обобщенных коллекциях</strong></em>, которые часто также называют <em><strong>дженéриками</strong></em> (англ. generic). Все элементы в обобщенной коллекции имеют <em><strong>единый тип T</strong></em>, который указывается в программе, что позволяет создавать компилятору быстрый и надежный код. Подстановка конкретного типа на место <strong>T</strong>, которую выполняет компилятор, называется <em><strong>инстанцированием</strong></em>. Так, для коллекции <code><strong>List&lt;T&gt;</strong></code> мы должны указывать известный компилятору тип, например, <code>List&lt;integer&gt;</code>.</p>
  <p id="qVgs">Обобщенные коллекции предоставляют методы для создания данных, их редактирования, добавления новых элементов и удаления существующих, а также поиска. Ко всем коллекциям применимы методы для работы с последовательностями и технология LINQ, следовательно вы уже умеете работать с коллекциями.</p>
  <h3 id="0Wzm">2. Как, ничего не зная об ООП, построить свой список <code>List&lt;T&gt;</code></h3>
  <p id="5WCU">Термин list (англ. список) в информатике обозначает структуру, в которой данные упорядочены некоторым образом и могут повторяться. В таком определении список является моделью конечной математической последовательности. От массива список отличается возможностью удалять и добавлять элементы в любом месте. Сразу же отметьте, что реализация коллекции <code>List&lt;T&gt;</code> наиболее эффективно выполняет добавление и удаление элементов в конце списка, наименее эффективно - внутри него. Коллекция реализована на базе обыкновенного динамического массива, для которого добавлены методы вставки и удаления элементов.</p>
  <pre id="xR0x">type
  TList = array of integer;

function Add(Self: TList; elem: integer): Tlist; extensionmethod;
// добавление элемента elem в конец списка
begin
  Result := Self + |elem|;
end;

function Remove(Self: TList; elem: integer):TList; extensionmethod;
// удаление первого найденного элемента со значением elem
begin
  var i := Self.FindIndex(t -&gt; t = elem);
  if i &gt; -1 then Result := Self[:i] + Self?[i + 1:]
  else Result := Self
end;

begin
  var a: Tlist := |5, -2, 1, 4, 0, 4, 2|;
  a.Println;                              // 5 -2 1 4 0 4 2 
  a := a.Add(7);
  a.Println;                              // 5 -2 1 4 0 4 2 7
  a := a.Remove(0);
  a.Print                                 // 5 -2 1 4 4 2 7
end.</pre>
  <p id="0vhj">Конечно, если вам известны методы <code>Add</code> и <code>Remove</code> для списка <code>List&lt;T&gt;</code>, вы помните, что они работают, как процедуры, т.е. изменяют значение переданного им экземпляра коллекции, а не возвращают ее новый экземпляр. Здесь так написать нельзя, поскольку параметр <code>Self</code> не может указываться с <strong><code>var</code></strong> за исключением случая, когда он является строкой <strong><code>string</code></strong>. Но если освоите ООП, сможете создавать свои классы и там делать все &quot;по-настоящему&quot;.</p>
  <p id="sp06">Нужно понимать, что приведенный выше код - лишь модель, поясняющая суть устройства списка <code>List&lt;T&gt;.</code>Она реализована на базе обыкновенного динамического массива, для которого добавлены методы вставки и удаления элементов.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/8xpaewOE2YQ</guid><link>https://teletype.in/@ralex061/8xpaewOE2YQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/8xpaewOE2YQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Анонс обучающего курса на платформе Stepik</title><pubDate>Sat, 09 Sep 2023 00:01:05 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fa/13/fa13908c-b97c-44a1-aa32-223090d3cb92.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/7d/15/7d1580e0-fa5e-4b99-8ef9-ac9df80df9af.jpeg"></img>В языке PascalАВС.NЕТ при описании формальных параметров подпрограммы в качестве типа можно указать интерфейс. В самом деле, и класс, и интерфейс - это типы данных, так что ничего необычайного тут нет. Но, указав интерфейс, мы можем придать подпрограмме некоторую универсальность. Хотим работать с индексами (массивы, списки) - указываем интерфейс IList, не хотим (но при этом еще и с последовательностями можно работать) - указываем IEnumerable.]]></description><content:encoded><![CDATA[
  <figure id="wVIE" class="m_original">
    <img src="https://img2.teletype.in/files/95/1f/951f30f7-4f7f-4f18-8f78-57c4014ae645.png" width="511" />
  </figure>
  <p id="Lha1">В языке PascalАВС.NЕТ при описании формальных параметров подпрограммы в качестве типа можно указать интерфейс. В самом деле, и класс, и интерфейс - это типы данных, так что ничего необычайного тут нет. Но, указав интерфейс, мы можем придать подпрограмме некоторую универсальность. Хотим работать с индексами (массивы, списки) - указываем интерфейс <code>IList</code>, не хотим (но при этом еще и с последовательностями можно работать) - указываем <code>IEnumerable</code>.</p>
  <pre id="uLW6">function Exotic(x: IEnumerable&lt;integer&gt;): real;
begin
  Result := 0.0;
  foreach var a in x do
    Result += a ** 2;
  Result := Sqrt(Result)
end;

begin
  var s := Seq(3, 4, 5);
  Println(Exotic(s));
  var a := |3, 4, 5|;
  Println(Exotic(a));
  var L := Lst(3, 4, 5);
  Println(Exotic(L));
end.
{
7.07106781186548 
7.07106781186548 
7.07106781186548 
}</pre>
  <p id="PyqX">Посмотрите: наша функция охотно принимает в качестве параметра и последовательность, и массив, и список!</p>
  <p id="U4jl">А нельзя ли написать такую же функцию, которая еще и тип <code>T</code> будет обрабатывать с тем, чтобы при конкретном обращении к ней происходило инстанцирование типа? С параметром <code>IEnumerable&lt;T&gt;</code>. Можно. Но оставим такую задачу для модуля с ООП. В конце-концов, должна же быть в курсе какая-то интрига?</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/RUf-kLiAd6t</guid><link>https://teletype.in/@ralex061/RUf-kLiAd6t?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/RUf-kLiAd6t?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Анонс обучающего курса на платформе Stepik</title><pubDate>Fri, 08 Sep 2023 23:40:10 GMT</pubDate><description><![CDATA[В курсе рассматриваются возможности языка, не вошедшие ни в один из ранее вышедших курсов. Большая часть этого материала имеется в книге &quot;PascalАВС.NЕТ: введение в современное программирование&quot;, но на момент начала создания этого курса книга готовилась праздновать свой трехлетний юбилей, а язык развивается непрерывно...]]></description><content:encoded><![CDATA[
  <h3 id="tdb0">До конца текущего года запланирован выход очередного бесплатного обучающего курса <strong><em>&quot;PascalАВС.NЕТ: продвинутый уровень&quot;</em>.</strong></h3>
  <p id="7A8f">В курсе рассматриваются возможности языка, не вошедшие ни в один из ранее вышедших курсов. Большая часть этого материала имеется в книге &quot;PascalАВС.NЕТ: введение в современное программирование&quot;, но на момент начала создания этого курса книга готовилась праздновать свой трехлетний юбилей, а язык развивается непрерывно...</p>
  <section>
    <h2 id="X0oC">Чему вы научитесь</h2>
    <ul id="hgwS">
      <li id="MHVW">понимать, как устроены имеющиеся в языке данные и коллекции;</li>
      <li id="6g7y">писать собственные обработчики ошибок;</li>
      <li id="7QiF">подключать и использовать библиотеки Microsoft .NET;</li>
      <li id="9EQm">осознанно работать с текстовыми файлами различных типов;</li>
      <li id="8lYo">создавать собственные классы (объектно-ориентированное программирование).</li>
    </ul>
  </section>
  <p id="SI8s">Если ознакомиться с пятью ранее написанными мной учебными курсами, может возникнуть глубоко неверное впечатление, что PascalАВС.NЕТ создавался для школьных нужд, включая сдачу ЕГЭ. На самом деле, это полноценный универсальный .NET-язык, позволяющий решать широчайший круг задач. Другое дело, что учебных часов в школе недостаточно для сколь-нибудь глубокого изучения этого замечательного языка. К тому же, школьные задачи совершенно не требуют знания и умения применять обработку ошибок, серьезную работу с файлами, подключения внешних библиотек и объектно-ориентированного программирования на уровне написания собственных классов. &quot;За бортом&quot; школы остаются и многие другие знания, навыки и умения, с которыми вы познакомитесь в этом курсе.</p>
  <h3 id="6mOC">Для кого предназначен курс</h3>
  <p id="qnzC">Этот курс может быть наиболее полезен студентам, а также всем тем, кто хочет глубже изучить тенденции современного программирования, в частности, освоить объектно-ориентированный подход. Этот курс абсолютно не нужен для сдачи школьных ОГЭ и ЕГЭ. Он сложен и оперирует понятиями, мало доступными рядовому школьнику.</p>
  <h3 id="3zXz">Программа курса</h3>
  <ol id="QVGl">
    <li id="mOvd">Введение</li>
    <li id="sMaV">Типы данных в PascalАВС.NЕТ</li>
    <li id="ftIm">Подпрограммы</li>
    <li id="0ovB">Последовательности и обобщенные коллекции</li>
    <li id="R2pL">Строки. Регулярные выражения</li>
    <li id="yjfN">Текстовые файлы</li>
    <li id="2OnQ">Модули и библиотеки</li>
    <li id="zUab">Обработка ошибок</li>
    <li id="mhmb">Объектно-ориентированное программирование (ООП) </li>
  </ol>
  <p id="NxTz">С целью подогреть интерес целевой аудитории, время от времени здесь будут предлагаться отдельные страницы из курса.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/nU6REA5cGYu</guid><link>https://teletype.in/@ralex061/nU6REA5cGYu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/nU6REA5cGYu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>PascalАВС.NЕТ 3.8.3 build 3238: изменения в библиотеке School</title><pubDate>Sat, 11 Feb 2023 07:04:58 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/e2/4f/e24ffd29-8705-425d-9865-7bf8ea457e12.png"></img>Функция Digits(n) и расширение n.Digits позволяют получить список List&lt;integer&gt;, содержащий цифры десятичного числа n. Теперь у Digits появился необязательный целочисленный параметр base, позволяющий указать основание системы счисления, в которой требуется получить цифры числа. При основании, превышающем 10, каждая &quot;цифра&quot; числа представляется соответствующим десятичным числом. Поскольку основание может быть многоразрядным числом, такие &quot;цифры&quot; тоже могут оказаться многоразрядными. Например, рассмотрим представление числа 1234567890 в системе счисления по основанию 2023. Очевидно, что каждая &quot;цифра&quot; представления может находиться в интервале [0;2022].]]></description><content:encoded><![CDATA[
  <h3 id="fMcS">1. Digits</h3>
  <p id="sdqx">Функция <strong>Digits(n)</strong> и расширение <strong>n.Digits</strong> позволяют получить список <strong>List&lt;integer&gt;</strong>, содержащий цифры десятичного числа <strong>n</strong>. Теперь у <strong>Digits</strong> появился необязательный целочисленный параметр <strong>base</strong>, позволяющий указать основание системы счисления, в которой требуется получить цифры числа. При основании, превышающем 10, каждая &quot;цифра&quot; числа представляется соответствующим десятичным числом. Поскольку основание может быть многоразрядным числом, такие &quot;цифры&quot; тоже могут оказаться многоразрядными. Например, рассмотрим представление числа <em><strong>1234567890</strong></em> в системе счисления по основанию <strong><em>2023</em></strong>. Очевидно, что каждая &quot;цифра&quot; представления может находиться в интервале <strong><em>[0;2022]</em></strong>.</p>
  <figure id="30pe" class="m_original">
    <img src="https://img3.teletype.in/files/e2/4f/e24ffd29-8705-425d-9865-7bf8ea457e12.png" width="553" />
  </figure>
  <p id="TyFL">Понятно, что в данном случае бессмысленно говорить о каком-то специальном алфавите, позволяющий одним символом представить любую из 2023 &quot;цифр&quot;. Поэтому было принято решение оставить числа &quot;как есть&quot; и записывать представление числа 1234567890 по основанию 2023 как [301, 1342, 1795]. Но ведь в таком виде это коэффициенты полинома P(2023), представленные в порядке убывания степеней числа 2023. Отсюда возникла идея ввести функцию, выполняющую обратную операцию: по списку коэффициентов полинома получить числовое значение полинома. А это равнозначно переводу числа из системы счисления по заданному основанию в десятичную систему. Так в библиотеке <strong>School</strong> появились функция и расширение <strong>DigitsToInt64</strong>.</p>
  <h3 id="PtMK">2. DigitsToInt64</h3>
  <p id="OCcN">Функция <strong>DigitsToInt64(L, base)</strong> и расширение <strong>L.Digits(base)</strong> позволяют перевести число из расширенной формы представления в системе счисления по основанию <strong>base</strong> в десятичную систему счисления. Здесь <strong>L</strong> - список типа <strong>List&lt;integer&gt;</strong>, полученный в результате использования <strong>Digits</strong> или созданный иным способом. По умолчанию <strong>base</strong> = 10 и в этом случае параметр можно опускать.</p>
  <p id="mHfN">Эту же функцию можно использовать для вычисления значения полинома по упорядоченному списку коэффициентов.</p>
  <h3 id="53nv">3. Практическое применение</h3>
  <p id="0l57">Перевести число 105516 в шестнадцатиричную систему счисления и сделать проверку обратным переводом в десятичную систему.</p>
  <p id="0yPI"><code>## uses School;<br />var q := 105516.Digits(16);<br />q.Println;                    // 1 9 12 2 12<br />q.DigitsToInt64(16).Print     // 105516</code></p>
  <p id="oFNI">Найти сумму &quot;цифр&quot; десятичного числа 7456330, представленного в системе счисления по основанию 43.</p>
  <p id="5tCQ"><code>## uses School;<br />7456330.Digits(43).Sum.Print    // 70</code></p>
  <p id="0bps">Решить задачу №5823 из задания 14 с сайта К.Ю. Полякова.</p>
  <p id="zSr0">(А. Богданов) Операнды арифметического выражения записаны в системе счисления с некоторым частично заданным основанием (основания указаны в скобках - замечание моё):</p>
  <p id="KQcS">13(132х4) - 13х42(22)</p>
  <p id="RIXi">В записи чисел переменной x обозначена неизвестная цифра. Определите наибольшее значение x, при котором абсолютное значение данного арифметического выражения при делении на 100 даёт остаток 53. Для найденного значения x вычислите целое частное от деления абсолютного значения арифметического выражения на 100 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.</p>
  <p id="JXiU"><code>## uses School;<br />for var x := 9 downto 0 do<br />begin<br />  var v := Abs(Lst(1, 3).DigitsToInt64(13200 + 10 * x + 4) -<br />      Lst(1, 3, x, 4, 2).DigitsToInt64(22));<br />  if v mod 100 = 53 then<br />  begin<br />    Print(v div 100);  // 2554<br />    break<br />  end<br />end</code></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/ZqR33Gct1uC</guid><link>https://teletype.in/@ralex061/ZqR33Gct1uC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/ZqR33Gct1uC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Write для вывода на экран - анахронизм в PascalАВС.NЕТ</title><pubDate>Wed, 04 Jan 2023 15:57:04 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4f/9c/4f9cc098-cc61-443b-bf3f-e6ae9bb81b4c.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/91/09/91093088-8250-4956-97f4-e49e2f64816a.jpeg"></img>Есть в IDE PascalАВС.NЕТ иконка &quot;Здоровье кода&quot;. Считается, что у программы часть здоровья отнимает использование Write с формированием интервалов за счет вставки пробелов. Примерно вот так:]]></description><content:encoded><![CDATA[
  <p id="FaRl">Есть в IDE PascalАВС.NЕТ иконка &quot;Здоровье кода&quot;. Считается, что у программы часть здоровья отнимает использование Write с формированием интервалов за счет вставки пробелов. Примерно вот так:</p>
  <figure id="QZtR" class="m_original">
    <img src="https://img2.teletype.in/files/91/09/91093088-8250-4956-97f4-e49e2f64816a.jpeg" width="919" />
  </figure>
  <p id="k8m1">В таких случаях рекомендуется использовать Print с автоматическим формированием пробелов.</p>
  <figure id="fwTn" class="m_original">
    <img src="https://img4.teletype.in/files/fc/28/fc28be5d-4694-439b-ad2e-97784c1b1511.png" width="931" />
  </figure>
  <p id="jYEw">Запись стала короче. Но всегда ли можно так просто использовать Print вместо Write? Оказывается, не всегда. В Print нельзя указывать формат вывода данных - общую ширину поля и количество знаков в дробной части для вещественного типа. А что же делать? И тут два выхода: либо все же использовать Write (в этом случае &quot;Здоровье кода&quot; очки не снимает), либо использовать форматирование средствами .NET.</p>
  <figure id="l3hM" class="m_original">
    <img src="https://img3.teletype.in/files/eb/e4/ebe48c85-8dda-4d38-bac3-2a0a617fe038.png" width="938" />
  </figure>
  <p id="xJ88">Самый простой вариант вывода средствами .NET - использовать интерполированную строку. Она начинается с символа $, указываемого перед собственно строкой, заключенной в одинарные кавычки: $&#x27; ... &#x27;.</p>
  <figure id="Ze7e" class="m_original">
    <img src="https://img2.teletype.in/files/9f/8f/9f8f9f3e-57ce-47d1-a40c-18ebbbdc66ec.png" width="924" />
  </figure>
  <p id="jf6I">Фактически, мы пишем строку так, как она должна выглядеть на экране, а выводимые значения заключаем в фигурные скобки. Самое сложное тут - заучить форматы представления данных. Но на первое время достаточно следующего:</p>
  <ul id="3Au5">
    <li id="XeSe">если нужно указать ширину поля вывода, ее отделяют от выводимой переменной (или выражения) запятой, за которой следует выражение, значение которого задает ширину. В случае, когда значение отрицательное, выводимое значение прижимается к левому краю, в противном случае - к правому;</li>
    <li id="jZqB">далее можно указать символ, определяющий тип выводимого значения, например D - целочисленное, F - вещественное, S - строковое, B - логическое. Этому символу предшествует двоеточие.</li>
    <li id="r17y">для вещественных чисел после F можно указать количество выводимых цифр в дробной части. По умолчанию используется формат F2.</li>
  </ul>
  <p id="tjXy">Этого на первое время более чем достаточно для оформления вывода. Хотите знать больше - ищите материал про интерполяцию строк в .NET или в материалах по языку C#. </p>
  <pre id="A2OT">##
var (a, b, c, d) := (8, -4.63, &#x27;Приветик&#x27;, 5 &gt; 3);
Println($&#x27;{a} {b} {c} {d}&#x27;);                    // 8 -4.63 Приветик True
Println($&#x27;a={a}, b={b}, c={c}, d={d}&#x27;);         // a=8, b=-4.63, c=Приветик, d=True
Println($&#x27;{a,5} {b,8} {c,-9}{d}&#x27;);              //     8    -4.63 Приветик True
Println($&#x27;{a,5:D}{b,8:F3} {c} {d}&#x27;);            //     8  -4.630 Приветик True
Println($&#x27;{a,5:D3}{b,8:F3} {c} {d}&#x27;);           //   008  -4.630 Приветик True 
Println($&#x27;{a,5:D3}{b,8:F3}{c,10:S} {d}&#x27;);       //   008  -4.630  Приветик True
Println($&#x27;{a,5:D3}{b,8:F3}{c,10:S} {d,6:B}&#x27;);   //   008  -4.630  Приветик   True
Println($&#x27;{a,5:D3}{b,8:F3} {c,-11:S}{d}&#x27;);      //   008  -4.630 Приветик   True
Println($&#x27;{a,5:D2}  {b,-6:F0} {c,-9:S}{d}&#x27;);    //    08  -5     Приветик True</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ralex061/kzPsRSqVlGt</guid><link>https://teletype.in/@ralex061/kzPsRSqVlGt?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061</link><comments>https://teletype.in/@ralex061/kzPsRSqVlGt?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ralex061#comments</comments><dc:creator>ralex061</dc:creator><title>Библиотека School: быстрая работа с простыми числами</title><pubDate>Fri, 23 Dec 2022 10:16:31 GMT</pubDate><description><![CDATA[Если вам приходилось обращаться к библиотеке School при большом объеме работы с простыми числами, вы могли заметить, что эта работа происходит весьма быстро во всем диапазоне натуральных чисел, представимых типом integer. В чем тут секрет?]]></description><content:encoded><![CDATA[
  <p id="iLUd">Если вам приходилось обращаться к библиотеке School при большом объеме работы с простыми числами, вы могли заметить, что эта работа происходит весьма быстро во всем диапазоне натуральных чисел, представимых типом <strong>integer</strong>. В чем тут секрет?</p>
  <h2 id="ZTiI">Немного теории</h2>
  <p id="KoA7">В диапазоне от 2 до 2 147 483 647 содержится 105 097 565 простых чисел. На выяснение этого факта мой компьютер потратил 13,2 с (с учетом того, что был получен список всех этих 105 миллионов чисел). Понятно, что никакое обычное &quot;решето&quot; не сможет просеять два с лишним миллиарда чисел по той простой причине, что в программе не получится объявить массив подобного размера. Поэтому приходится использовать алгоритм &quot;Модифицированное решето Эратосфена&quot;. Его суть в том, что весь диапазон чисел разбивается на поддиапазоны (сегменты) и каждом из них используются простые числа, полученные в предшествующем диапазоне. Конечно, это несколько увеличивает время работы.</p>
  <p id="KX8E">Алгоритм проверки числа на простоту предусматривает перебор его возможных делителей. Понятно, что проверив делимость на 2, далее нужно проверять только нечетные делители. И понятно, что проверять нужно делители, квадрат которых не превышает самого числа. Это означает, что делители числа типа <strong>integer</strong> не могут превышать квадратного корня из числа 2 147 483 647, т.е. значения 46 340. А этому интервалу принадлежат всего-то 4 704 простых числа. Так почему бы не потратить смехотворное время и заранее не просеять эти 46340 чисел, получив массив простых чисел размером 4 704 элемента?</p>
  <p id="6XAi">Но... ох уж это маленькое &quot;но&quot;! Квадрат числа 46340 равен 2 147 395 600 и числа из диапазона [2 147 395 601; 2 147 483 647] из проверки выпадают. А там находятся еще 4 085 простых чисел! Посему придется увеличить 46 340 на единицу и смириться с тем, что квадрат 46 341 требует для размещения тип <strong>int64</strong>.</p>
  <p id="OpPo">И тут мы обнаруживаем, что модифицированное решето Эратосфена требует, чтобы длина сегмента была простым числом. А ближайшее простое, большее или равное 46 341 - это 46 349. Вот таков окончательный размер решета.</p>
  <h2 id="vFkG">Реализация</h2>
  <p id="FR2x">Если заглянуть в исходный код библиотеки School, можно обнаружить три &quot;магические&quot; переменные и список LPrimes.</p>
  <pre id="dCX9">LPrimes: List&lt;integer&gt;; // на отрезке [2;46348]
ubPrimeDivs := 46349;
nPrimeDivs: integer; // 4792
MaxPrimeDiv: integer; // 46349</pre>
  <p id="e2zj">Вы уже увидели в этой &quot;магии&quot; то самое значение 46 349? Но что такое 4 792? А это количество простых чисел на интервале длиной 46 349, т.е. [0; 46 348] и там их ровно 4 792.</p>
  <p id="yAX2">При запуске программы, использующей библиотеку School, всегда &quot;на всякий случай&quot; заполняется список LPrimes, содержащий 4792 первых простых числа - делителей из нулевого сегмента &quot;решета&quot;. Это всего-то менее 20К памяти, а процесс увеличивает время запуска на совершенно смехотворную величину.</p>
  <h2 id="fwue">Что это даёт</h2>
  <p id="erSZ">Немало. Это первые 4 792 простых делителя. Это основа для нахождения следующих 4 792 простых чисел. Это позволяет при проверке на простоту перебирать сразу простые делители. Это позволяет быстро выполнять факторизацию чисел. А все вместе дает возможность в короткий срок решать целый класс задач методом простого перебора, экономя время на программирование.</p>

]]></content:encoded></item></channel></rss>