<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Александр Осипов</title><author><name>Александр Осипов</name></author><id>https://teletype.in/atom/ralex061</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/ralex061?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/ralex061?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-04T10:27:29.124Z</updated><entry><id>ralex061:7-SJ8KZvjLI</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/7-SJ8KZvjLI?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>Анонс обучающего курса на платформе Stepik. Часть 3</title><published>2023-11-08T13:19:05.317Z</published><updated>2023-11-08T13:36:55.733Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/21/10/2110228b-4b64-4d0e-b94f-c76a174196e0.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/34/30/3430a09e-c291-41ec-bc38-6ef4e25bf9e1.jpeg&quot;&gt;Часто приходится слышать как люди, увидев код в PascalАВС.NЕТ в точечной нотации, говорят: &quot;А, тут LINQ используется...&quot;. И это зачастую совершенно неверно. Вот пример кода с точечной нотацией, который не имеет к LINQ никакого отношения:</summary><content type="html">
  &lt;figure id=&quot;S5xg&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/34/30/3430a09e-c291-41ec-bc38-6ef4e25bf9e1.jpeg&quot; width=&quot;927&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Zt7e&quot;&gt;Часто приходится слышать как люди, увидев код PascalАВС.NЕТ в точечной нотации, говорят: &amp;quot;А, тут LINQ используется...&amp;quot;. И это зачастую совершенно неверно. Вот пример кода с точечной нотацией, который не имеет к LINQ никакого отношения:&lt;/p&gt;
  &lt;pre id=&quot;VXLX&quot;&gt;##
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], &amp;#x27; &amp;#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
}&lt;/pre&gt;
  &lt;p id=&quot;1syJ&quot;&gt;Так что же такое LINQ на самом деле?&lt;/p&gt;
  &lt;p id=&quot;b5vc&quot;&gt;LINQ - сокращенное название технологии Microsoft LINQ to Objects библиотек .NET Framework. для доступа к данным, расположенным в памяти компьютера. Сам термин LINQ - аббревиатура Language INtegrated Query (интегрированный язык запросов). Используя LINQ, можно обращаться к последовательностям, а также к коллекциям данных, например, к спискам List, как к таблицам базы данных.&lt;/p&gt;
  &lt;p id=&quot;fUsd&quot;&gt;Традиционно данные из последовательностей извлекались путем перебора всех элементов в цикле &lt;strong&gt;&lt;code&gt;foreach&lt;/code&gt;&lt;/strong&gt;. Использование LINQ предполагает создание &lt;em&gt;&lt;strong&gt;запросов&lt;/strong&gt;&lt;/em&gt; - фрагментов кода, описывающих данные, которые требуется извлечь без указания того, как это сделать.&lt;/p&gt;
  &lt;p id=&quot;tyOe&quot;&gt;Использование запросов LINQ дает следующие преимущества:&lt;/p&gt;
  &lt;ul id=&quot;CDoA&quot;&gt;
    &lt;li id=&quot;E447&quot;&gt;запросы короткие, их удобно читать и легко понимать;&lt;/li&gt;
    &lt;li id=&quot;vNOi&quot;&gt;запросы мощные, с их помощью можно производить сложную обработку данных;&lt;/li&gt;
    &lt;li id=&quot;ZcIp&quot;&gt;запросы могут переноситься в другие источники данных практически без изменения (они одинаковы для последовательностей, списков и т.д.).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;AuJt&quot;&gt;Чем сложнее набор манипуляций с данными, тем больший выигрыш достигается с использованием запросов LINQ, объединенных в цепочки точечной нотации.&lt;/p&gt;
  &lt;p id=&quot;xBUc&quot;&gt;Технология LINQ включает около полусотни операций, разделяющихся на две группы - отложенные (&amp;quot;ленивые&amp;quot;) операции и не отложенные операции (исполняются сразу). К группе не отложенных операций относятся получение &lt;em&gt;&lt;strong&gt;свёрток&lt;/strong&gt;&lt;/em&gt; (приведение данных к единственному значению - сумме, произведению, количеству и т.п.), выборка единственного элемента, преобразование к другому типу данных (последовательности в список List, массив или словарь), а также установление эквивалентности двух наборов данных.&lt;/p&gt;
  &lt;p id=&quot;hzOq&quot;&gt;Чтобы получить непосредственный доступ к методам LINQ, нужно либо подключить &lt;em&gt;&lt;strong&gt;пространство имён&lt;/strong&gt;&lt;/em&gt; &lt;code&gt;System.Linq&lt;/code&gt;, либо указывать его при каждом вызове метода. Для последовательностей в .NET нужно обращаться к классу &lt;code&gt;Enumerable&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;Gq8g&quot;&gt;## 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&lt;/pre&gt;
  &lt;pre id=&quot;8itI&quot;&gt;##
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&lt;/pre&gt;
  &lt;p id=&quot;TGWR&quot;&gt;Вызовы подобной длины приходится писать, например, в языке C#. Разработчики PascalАВС.NЕТ ввели множество дополнительных функций и методов расширения, позволяющих сделать работу с LINQ существенно удобнее.&lt;/p&gt;
  &lt;pre id=&quot;DW11&quot;&gt;##
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&lt;/pre&gt;
  &lt;p id=&quot;jlTO&quot;&gt;Здесь &lt;code&gt;Range&lt;/code&gt; - уже не метод из LINQ, а функция PascalАВС.NЕТ. Если в .NET-методе второй параметр обозначал длину генерируемой последовательности, то в функции это верхняя граница диапазона данных. Сама же функция находится в системной библиотеке PABCSystem и является &amp;quot;обёрткой&amp;quot; для вызова метода .NET:&lt;/p&gt;
  &lt;pre id=&quot;5hDQ&quot;&gt;function Range(a, b: integer): sequence of integer;
begin
  if b &amp;lt; a then 
    Result := System.Linq.Enumerable.Empty&amp;amp;&amp;lt;integer&amp;gt;
  else Result := System.Linq.Enumerable.Range(a, b - a + 1);
end;&lt;/pre&gt;
  &lt;p id=&quot;YyHn&quot;&gt;В состав .NET LINQ входят 14 типов операций: агрегация, преобразование, конкатенация, элемент, множество, генерация, группирование, соединение, упорядочивание, проекция, разбиение, ограничение, квантификатор и эквивалентность.&lt;/p&gt;

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

</content></entry><entry><id>ralex061:zEIHv4Lo78_</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/zEIHv4Lo78_?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>Работа с  калькулятором сетей TCP/IP в PascalАВС.NЕТ</title><published>2023-09-21T15:28:46.635Z</published><updated>2023-09-22T01:23:55.434Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c7/c8/c7c8484b-a249-44af-bc15-be32c200717b.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg&quot;&gt;В библиотеке School начиная с версии PascalАВС.NЕТ 3.9.0.3360 от 21.09.23 доступен калькулятор сетей TCP/IP, реализованный на базе двух классов: собственно калькулятора CalcIP и класса 32-битных адресов Addr32, обеспечивающего работу калькулятора, а также предоставляющего удобную работу с адресами IPv4 при самостоятельном использовании.</summary><content type="html">
  &lt;figure id=&quot;xFhB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg&quot; width=&quot;645&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hYIe&quot;&gt;В библиотеке School начиная с версии PascalАВС.NЕТ 3.9.0.3360 от 21.09.23 доступен калькулятор сетей TCP/IP, реализованный на базе двух классов: собственно калькулятора &lt;code&gt;CalcIP&lt;/code&gt; и класса 32-битных адресов &lt;code&gt;Addr32&lt;/code&gt;, обеспечивающего работу калькулятора, а также предоставляющего удобную работу с адресами IPv4 при самостоятельном использовании.&lt;/p&gt;
  &lt;h2 id=&quot;PtO6&quot;&gt;Класс Addr32&lt;/h2&gt;
  &lt;p id=&quot;JtfA&quot;&gt;В классе доступны на чтение три свойства (приведен пример для 192.168.0.1):&lt;/p&gt;
  &lt;ul id=&quot;Ix4s&quot;&gt;
    &lt;li id=&quot;Gb4I&quot;&gt;&lt;code&gt;value: string&lt;/code&gt; - адрес в десятичном представлении с октетами, &lt;code&gt;192.168.0.1&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;zDB0&quot;&gt;&lt;code&gt;value2: string&lt;/code&gt; - дополненное (при необходимости) слева нулями до длины 32 бита двоичное представление адреса, &lt;code&gt;11000000101010000000000000000001&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;6ODZ&quot;&gt;&lt;code&gt;value10: longword&lt;/code&gt; - беззнаковое целое значение адреса, &lt;code&gt;3232235521&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HhDZ&quot;&gt;Метод &lt;code&gt;AddrFormat(addr: string): string&lt;/code&gt; форматирует параметр &lt;code&gt;addr&lt;/code&gt;, разделяя точкой каждые 8 бит: &lt;code&gt;11000000.10101000.00000000.00000001.&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6pxC&quot;&gt;Перегруженный метод &lt;code&gt;.ToString: string&lt;/code&gt; служит для простого и наглядного вывода значений адресов созданного объекта:&lt;/p&gt;
  &lt;pre id=&quot;c5nk&quot;&gt;## uses School;

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

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

var ip := new Addr32(&amp;#x27;135.12.171.214&amp;#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 
}&lt;/pre&gt;
  &lt;p id=&quot;r8QX&quot;&gt;Класс содержит два конструктора. Аргумент первого из них - адрес в десятичной записи с октетами. В приведенных примерах вызывался именно этот конструктор. Второй конструктор используется для построения маски сети по префиксу - количеству единичных бит в левой части маски. Например, для сетевого адреса a.b.c.d/19 маску можно создать вызовом &lt;code&gt;Addr32(19)&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;aY1N&quot;&gt;## uses School;

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

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

</content></entry><entry><id>ralex061:k_YLcCFPfVE</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/k_YLcCFPfVE?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>PascalАВС.NЕТ: калькулятор сетей TCP/IP в библиотеке School</title><published>2023-09-20T20:29:09.285Z</published><updated>2023-09-21T11:17:25.248Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c7/c8/c7c8484b-a249-44af-bc15-be32c200717b.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg&quot;&gt;Калькулятор дает возможность в наглядном виде получить основную информацию о подсетях TCP/IP, задав адрес сети и маску подсети. Отображение информации с помощью калькулятора показано на приведенном ниже рисунке для ip-адреса 15.218.42.12 и маски 255.255.192.0.</summary><content type="html">
  &lt;figure id=&quot;RGxD&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/70/e2/70e253c2-85fc-4348-a2c4-29e00c6a84e7.jpeg&quot; width=&quot;645&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;hleK&quot;&gt;Назначение и основные возможности&lt;/h3&gt;
  &lt;p id=&quot;1X9e&quot;&gt;Калькулятор сетей доступен в PascalАВС.NЕТ версии не ниже 3.9.0.3360 от 21.09.2023. Он дает возможность в наглядном виде получить основную информацию о подсетях TCP/IP, задав адрес сети и маску подсети.&lt;/p&gt;
  &lt;h3 id=&quot;la7m&quot;&gt;Реализация&lt;/h3&gt;
  &lt;p id=&quot;NnG5&quot;&gt;Калькулятор реализован на базе двух классов.&lt;/p&gt;
  &lt;p id=&quot;xCfH&quot;&gt;Класс с именем Addr32 позволяет создавать объекты, моделирующие 32-битные сетевые адреса IPv4 и маски. Пользователю доступны три свойства адреса: &lt;code&gt;value&lt;/code&gt; (десятичный адрес в формате с октетами, например, 15.218.42.12), &lt;code&gt;value2&lt;/code&gt; (адрес в виде беззнакового двоичного числа длиной 32 бита) и &lt;code&gt;value10&lt;/code&gt; (адрес, переведенный из двоичной системы счисления в десятичную). Для объектов этого класса перегружены побитовые логические операции &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;not&lt;/code&gt;, а также операция &lt;code&gt;+&lt;/code&gt; для сложения адреса с целочисленным значением (инкремент). Это дает простоту и удобство при работе с масками.&lt;/p&gt;
  &lt;p id=&quot;SLrp&quot;&gt;Другой класс с именем CalcIP - это сам калькулятор на основе заданного сетевого адреса и маски. Маску можно задавать в формате десятичного адреса, префикса или непосредственно в виде 32-битной строки. У калькулятора девять свойств и их имена перечислены в круглых скобках на приведенном выше рисунке. Свойство &lt;code&gt;Bitmask&lt;/code&gt; имеет тип &lt;code&gt;byte&lt;/code&gt;, свойство &lt;code&gt;Hosts&lt;/code&gt; - тип &lt;code&gt;integer&lt;/code&gt;, а остальные семь являются объектами класса Addr32. Таким образом, если создать калькулятор с именем MyCalc, двоичный адрес первого хоста в коде программы будет доступен под именем &lt;code&gt;MyCalc.Hostmin.value2&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;DaAb&quot;&gt;Что еще можно получить с помощью калькулятора&lt;/h3&gt;
  &lt;p id=&quot;GFsy&quot;&gt;Создав объект класса Addr32 на основе того или иного формата адреса, можно получить отображение этого адреса. Перегруженный метод .ToString позволяет сформировать строку, содержащую адрес в удобном для восприятия виде. Например, оператор &lt;code&gt;Print(new Addr32(&amp;#x27;34.118.53.125&amp;#x27;));&lt;/code&gt; выведет:&lt;br /&gt;&lt;code&gt;34.118.53.125, 00100010.01110110.00110101.01111101&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;t5lc&quot;&gt;Метод калькулятора GenAddr - генератор адресов хостов. Он возвращает последовательность адресов в виде объектов класса Addr32.&lt;/p&gt;
  &lt;p id=&quot;U1uK&quot;&gt;Еще один генератор, GenAddrBin, возвращает последовательность двоичных 32-битных адресов - это удобно для операций с битовой маской. Поскольку 32-битное отображение - это строка, применение к нему регулярных выражений открывает широчайшие возможности.&lt;/p&gt;
  &lt;h3 id=&quot;8PdE&quot;&gt;Примеры использования калькулятора&lt;/h3&gt;
  &lt;p id=&quot;RC4e&quot;&gt;1. Вот так можно получить сетевую информацию, задав ip-адрес и маску.&lt;/p&gt;
  &lt;figure id=&quot;GEQn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fe/42/fe42c81c-a8f5-4b6a-8fc1-d82720e9179b.jpeg&quot; width=&quot;952&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;64JR&quot;&gt;2. Решение варианта задания 13 с сайта К. Полякова.&lt;/p&gt;
  &lt;p id=&quot;oeDZ&quot;&gt;(№ 6842) (К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 158.132.161.128 и маской сети 255.255.255.128.&lt;br /&gt;Сколько в этой сети IP-адресов, которые в двоичной записи IP-адреса оканчиваются единицей?&lt;br /&gt;В ответе укажите только число.&lt;/p&gt;
  &lt;pre id=&quot;ARGn&quot;&gt;## uses School;

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

</content></entry><entry><id>ralex061:pfEegL34C-8</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/pfEegL34C-8?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>Анонс обучающего курса на платформе Stepik. Часть 2.</title><published>2023-09-18T16:03:41.574Z</published><updated>2023-09-19T15:47:50.564Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a2/2e/a22e2e92-acf4-4e84-84c5-5323cba2340e.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f8/4a/f84a9d6f-b89f-4dde-81b3-f39c26b07e03.jpeg&quot;&gt;Для повышения эффективности обработки структурированных данных используют их объединение в коллекции. Коллекция предлагает готовый набор средств работы с данными различной, иногда достаточно сложной структуры. Коллекции Microsotf ,NET поддерживают списки, стеки, очереди, множества, словари и т.д. При этом коллекции позволяют применять единый стандартизованный подход к данным различной структуры.</summary><content type="html">
  &lt;figure id=&quot;TJDl&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f8/4a/f84a9d6f-b89f-4dde-81b3-f39c26b07e03.jpeg&quot; width=&quot;927&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;Uwig&quot;&gt;1. Немного теории&lt;/h3&gt;
  &lt;p id=&quot;PwlL&quot;&gt;Для повышения эффективности обработки структурированных данных используют их объединение в &lt;em&gt;&lt;strong&gt;коллекции&lt;/strong&gt;&lt;/em&gt;. Коллекция предлагает готовый набор средств работы с данными различной, иногда достаточно сложной структуры. Коллекции Microsotf .NET поддерживают списки, стеки, очереди, множества, словари и т.д. При этом коллекции позволяют применять единый стандартизованный подход к данным различной структуры.&lt;/p&gt;
  &lt;p id=&quot;5RKY&quot;&gt;Среда .NET предоставляет несколько типов коллекций, но мы остановимся только на одном: &lt;em&gt;&lt;strong&gt;обобщенных коллекциях&lt;/strong&gt;&lt;/em&gt;, которые часто также называют &lt;em&gt;&lt;strong&gt;дженéриками&lt;/strong&gt;&lt;/em&gt; (англ. generic). Все элементы в обобщенной коллекции имеют &lt;em&gt;&lt;strong&gt;единый тип T&lt;/strong&gt;&lt;/em&gt;, который указывается в программе, что позволяет создавать компилятору быстрый и надежный код. Подстановка конкретного типа на место &lt;strong&gt;T&lt;/strong&gt;, которую выполняет компилятор, называется &lt;em&gt;&lt;strong&gt;инстанцированием&lt;/strong&gt;&lt;/em&gt;. Так, для коллекции &lt;code&gt;&lt;strong&gt;List&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/code&gt; мы должны указывать известный компилятору тип, например, &lt;code&gt;List&amp;lt;integer&amp;gt;&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;qVgs&quot;&gt;Обобщенные коллекции предоставляют методы для создания данных, их редактирования, добавления новых элементов и удаления существующих, а также поиска. Ко всем коллекциям применимы методы для работы с последовательностями и технология LINQ, следовательно вы уже умеете работать с коллекциями.&lt;/p&gt;
  &lt;h3 id=&quot;0Wzm&quot;&gt;2. Как, ничего не зная об ООП, построить свой список &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;5WCU&quot;&gt;Термин list (англ. список) в информатике обозначает структуру, в которой данные упорядочены некоторым образом и могут повторяться. В таком определении список является моделью конечной математической последовательности. От массива список отличается возможностью удалять и добавлять элементы в любом месте. Сразу же отметьте, что реализация коллекции &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt; наиболее эффективно выполняет добавление и удаление элементов в конце списка, наименее эффективно - внутри него. Коллекция реализована на базе обыкновенного динамического массива, для которого добавлены методы вставки и удаления элементов.&lt;/p&gt;
  &lt;pre id=&quot;xR0x&quot;&gt;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 -&amp;gt; t = elem);
  if i &amp;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.&lt;/pre&gt;
  &lt;p id=&quot;0vhj&quot;&gt;Конечно, если вам известны методы &lt;code&gt;Add&lt;/code&gt; и &lt;code&gt;Remove&lt;/code&gt; для списка &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;, вы помните, что они работают, как процедуры, т.е. изменяют значение переданного им экземпляра коллекции, а не возвращают ее новый экземпляр. Здесь так написать нельзя, поскольку параметр &lt;code&gt;Self&lt;/code&gt; не может указываться с &lt;strong&gt;&lt;code&gt;var&lt;/code&gt;&lt;/strong&gt; за исключением случая, когда он является строкой &lt;strong&gt;&lt;code&gt;string&lt;/code&gt;&lt;/strong&gt;. Но если освоите ООП, сможете создавать свои классы и там делать все &amp;quot;по-настоящему&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;sp06&quot;&gt;Нужно понимать, что приведенный выше код - лишь модель, поясняющая суть устройства списка &lt;code&gt;List&amp;lt;T&amp;gt;.&lt;/code&gt;Она реализована на базе обыкновенного динамического массива, для которого добавлены методы вставки и удаления элементов.&lt;/p&gt;

</content></entry><entry><id>ralex061:8xpaewOE2YQ</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/8xpaewOE2YQ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>Анонс обучающего курса на платформе Stepik</title><published>2023-09-09T00:01:05.037Z</published><updated>2023-09-11T13:08:08.334Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/fa/13/fa13908c-b97c-44a1-aa32-223090d3cb92.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/7d/15/7d1580e0-fa5e-4b99-8ef9-ac9df80df9af.jpeg&quot;&gt;В языке PascalАВС.NЕТ при описании формальных параметров подпрограммы в качестве типа можно указать интерфейс. В самом деле, и класс, и интерфейс - это типы данных, так что ничего необычайного тут нет. Но, указав интерфейс, мы можем придать подпрограмме некоторую универсальность. Хотим работать с индексами (массивы, списки) - указываем интерфейс IList, не хотим (но при этом еще и с последовательностями можно работать) - указываем IEnumerable.</summary><content type="html">
  &lt;figure id=&quot;wVIE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/1f/951f30f7-4f7f-4f18-8f78-57c4014ae645.png&quot; width=&quot;511&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Lha1&quot;&gt;В языке PascalАВС.NЕТ при описании формальных параметров подпрограммы в качестве типа можно указать интерфейс. В самом деле, и класс, и интерфейс - это типы данных, так что ничего необычайного тут нет. Но, указав интерфейс, мы можем придать подпрограмме некоторую универсальность. Хотим работать с индексами (массивы, списки) - указываем интерфейс &lt;code&gt;IList&lt;/code&gt;, не хотим (но при этом еще и с последовательностями можно работать) - указываем &lt;code&gt;IEnumerable&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;uLW6&quot;&gt;function Exotic(x: IEnumerable&amp;lt;integer&amp;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 
}&lt;/pre&gt;
  &lt;p id=&quot;PyqX&quot;&gt;Посмотрите: наша функция охотно принимает в качестве параметра и последовательность, и массив, и список!&lt;/p&gt;
  &lt;p id=&quot;U4jl&quot;&gt;А нельзя ли написать такую же функцию, которая еще и тип &lt;code&gt;T&lt;/code&gt; будет обрабатывать с тем, чтобы при конкретном обращении к ней происходило инстанцирование типа? С параметром &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. Можно. Но оставим такую задачу для модуля с ООП. В конце-концов, должна же быть в курсе какая-то интрига?&lt;/p&gt;

</content></entry><entry><id>ralex061:RUf-kLiAd6t</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/RUf-kLiAd6t?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>Анонс обучающего курса на платформе Stepik</title><published>2023-09-08T23:40:10.264Z</published><updated>2023-09-08T23:49:43.705Z</updated><summary type="html">В курсе рассматриваются возможности языка, не вошедшие ни в один из ранее вышедших курсов. Большая часть этого материала имеется в книге &quot;PascalАВС.NЕТ: введение в современное программирование&quot;, но на момент начала создания этого курса книга готовилась праздновать свой трехлетний юбилей, а язык развивается непрерывно...</summary><content type="html">
  &lt;h3 id=&quot;tdb0&quot;&gt;До конца текущего года запланирован выход очередного бесплатного обучающего курса &lt;strong&gt;&lt;em&gt;&amp;quot;PascalАВС.NЕТ: продвинутый уровень&amp;quot;&lt;/em&gt;.&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;7A8f&quot;&gt;В курсе рассматриваются возможности языка, не вошедшие ни в один из ранее вышедших курсов. Большая часть этого материала имеется в книге &amp;quot;PascalАВС.NЕТ: введение в современное программирование&amp;quot;, но на момент начала создания этого курса книга готовилась праздновать свой трехлетний юбилей, а язык развивается непрерывно...&lt;/p&gt;
  &lt;section&gt;
    &lt;h2 id=&quot;X0oC&quot;&gt;Чему вы научитесь&lt;/h2&gt;
    &lt;ul id=&quot;hgwS&quot;&gt;
      &lt;li id=&quot;MHVW&quot;&gt;понимать, как устроены имеющиеся в языке данные и коллекции;&lt;/li&gt;
      &lt;li id=&quot;6g7y&quot;&gt;писать собственные обработчики ошибок;&lt;/li&gt;
      &lt;li id=&quot;7QiF&quot;&gt;подключать и использовать библиотеки Microsoft .NET;&lt;/li&gt;
      &lt;li id=&quot;9EQm&quot;&gt;осознанно работать с текстовыми файлами различных типов;&lt;/li&gt;
      &lt;li id=&quot;8lYo&quot;&gt;создавать собственные классы (объектно-ориентированное программирование).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;p id=&quot;SI8s&quot;&gt;Если ознакомиться с пятью ранее написанными мной учебными курсами, может возникнуть глубоко неверное впечатление, что PascalАВС.NЕТ создавался для школьных нужд, включая сдачу ЕГЭ. На самом деле, это полноценный универсальный .NET-язык, позволяющий решать широчайший круг задач. Другое дело, что учебных часов в школе недостаточно для сколь-нибудь глубокого изучения этого замечательного языка. К тому же, школьные задачи совершенно не требуют знания и умения применять обработку ошибок, серьезную работу с файлами, подключения внешних библиотек и объектно-ориентированного программирования на уровне написания собственных классов. &amp;quot;За бортом&amp;quot; школы остаются и многие другие знания, навыки и умения, с которыми вы познакомитесь в этом курсе.&lt;/p&gt;
  &lt;h3 id=&quot;6mOC&quot;&gt;Для кого предназначен курс&lt;/h3&gt;
  &lt;p id=&quot;qnzC&quot;&gt;Этот курс может быть наиболее полезен студентам, а также всем тем, кто хочет глубже изучить тенденции современного программирования, в частности, освоить объектно-ориентированный подход. Этот курс абсолютно не нужен для сдачи школьных ОГЭ и ЕГЭ. Он сложен и оперирует понятиями, мало доступными рядовому школьнику.&lt;/p&gt;
  &lt;h3 id=&quot;3zXz&quot;&gt;Программа курса&lt;/h3&gt;
  &lt;ol id=&quot;QVGl&quot;&gt;
    &lt;li id=&quot;mOvd&quot;&gt;Введение&lt;/li&gt;
    &lt;li id=&quot;sMaV&quot;&gt;Типы данных в PascalАВС.NЕТ&lt;/li&gt;
    &lt;li id=&quot;ftIm&quot;&gt;Подпрограммы&lt;/li&gt;
    &lt;li id=&quot;0ovB&quot;&gt;Последовательности и обобщенные коллекции&lt;/li&gt;
    &lt;li id=&quot;R2pL&quot;&gt;Строки. Регулярные выражения&lt;/li&gt;
    &lt;li id=&quot;yjfN&quot;&gt;Текстовые файлы&lt;/li&gt;
    &lt;li id=&quot;2OnQ&quot;&gt;Модули и библиотеки&lt;/li&gt;
    &lt;li id=&quot;zUab&quot;&gt;Обработка ошибок&lt;/li&gt;
    &lt;li id=&quot;mhmb&quot;&gt;Объектно-ориентированное программирование (ООП) &lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;NxTz&quot;&gt;С целью подогреть интерес целевой аудитории, время от времени здесь будут предлагаться отдельные страницы из курса.&lt;/p&gt;

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

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

</content></entry><entry><id>ralex061:kzPsRSqVlGt</id><link rel="alternate" type="text/html" href="https://teletype.in/@ralex061/kzPsRSqVlGt?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ralex061"></link><title>Библиотека School: быстрая работа с простыми числами</title><published>2022-12-23T10:16:31.463Z</published><updated>2022-12-23T10:30:55.036Z</updated><summary type="html">Если вам приходилось обращаться к библиотеке School при большом объеме работы с простыми числами, вы могли заметить, что эта работа происходит весьма быстро во всем диапазоне натуральных чисел, представимых типом integer. В чем тут секрет?</summary><content type="html">
  &lt;p id=&quot;iLUd&quot;&gt;Если вам приходилось обращаться к библиотеке School при большом объеме работы с простыми числами, вы могли заметить, что эта работа происходит весьма быстро во всем диапазоне натуральных чисел, представимых типом &lt;strong&gt;integer&lt;/strong&gt;. В чем тут секрет?&lt;/p&gt;
  &lt;h2 id=&quot;ZTiI&quot;&gt;Немного теории&lt;/h2&gt;
  &lt;p id=&quot;KoA7&quot;&gt;В диапазоне от 2 до 2 147 483 647 содержится 105 097 565 простых чисел. На выяснение этого факта мой компьютер потратил 13,2 с (с учетом того, что был получен список всех этих 105 миллионов чисел). Понятно, что никакое обычное &amp;quot;решето&amp;quot; не сможет просеять два с лишним миллиарда чисел по той простой причине, что в программе не получится объявить массив подобного размера. Поэтому приходится использовать алгоритм &amp;quot;Модифицированное решето Эратосфена&amp;quot;. Его суть в том, что весь диапазон чисел разбивается на поддиапазоны (сегменты) и каждом из них используются простые числа, полученные в предшествующем диапазоне. Конечно, это несколько увеличивает время работы.&lt;/p&gt;
  &lt;p id=&quot;KX8E&quot;&gt;Алгоритм проверки числа на простоту предусматривает перебор его возможных делителей. Понятно, что проверив делимость на 2, далее нужно проверять только нечетные делители. И понятно, что проверять нужно делители, квадрат которых не превышает самого числа. Это означает, что делители числа типа &lt;strong&gt;integer&lt;/strong&gt; не могут превышать квадратного корня из числа 2 147 483 647, т.е. значения 46 340. А этому интервалу принадлежат всего-то 4 704 простых числа. Так почему бы не потратить смехотворное время и заранее не просеять эти 46340 чисел, получив массив простых чисел размером 4 704 элемента?&lt;/p&gt;
  &lt;p id=&quot;6XAi&quot;&gt;Но... ох уж это маленькое &amp;quot;но&amp;quot;! Квадрат числа 46340 равен 2 147 395 600 и числа из диапазона [2 147 395 601; 2 147 483 647] из проверки выпадают. А там находятся еще 4 085 простых чисел! Посему придется увеличить 46 340 на единицу и смириться с тем, что квадрат 46 341 требует для размещения тип &lt;strong&gt;int64&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;OpPo&quot;&gt;И тут мы обнаруживаем, что модифицированное решето Эратосфена требует, чтобы длина сегмента была простым числом. А ближайшее простое, большее или равное 46 341 - это 46 349. Вот таков окончательный размер решета.&lt;/p&gt;
  &lt;h2 id=&quot;vFkG&quot;&gt;Реализация&lt;/h2&gt;
  &lt;p id=&quot;FR2x&quot;&gt;Если заглянуть в исходный код библиотеки School, можно обнаружить три &amp;quot;магические&amp;quot; переменные и список LPrimes.&lt;/p&gt;
  &lt;pre id=&quot;dCX9&quot;&gt;LPrimes: List&amp;lt;integer&amp;gt;; // на отрезке [2;46348]
ubPrimeDivs := 46349;
nPrimeDivs: integer; // 4792
MaxPrimeDiv: integer; // 46349&lt;/pre&gt;
  &lt;p id=&quot;e2zj&quot;&gt;Вы уже увидели в этой &amp;quot;магии&amp;quot; то самое значение 46 349? Но что такое 4 792? А это количество простых чисел на интервале длиной 46 349, т.е. [0; 46 348] и там их ровно 4 792.&lt;/p&gt;
  &lt;p id=&quot;yAX2&quot;&gt;При запуске программы, использующей библиотеку School, всегда &amp;quot;на всякий случай&amp;quot; заполняется список LPrimes, содержащий 4792 первых простых числа - делителей из нулевого сегмента &amp;quot;решета&amp;quot;. Это всего-то менее 20К памяти, а процесс увеличивает время запуска на совершенно смехотворную величину.&lt;/p&gt;
  &lt;h2 id=&quot;fwue&quot;&gt;Что это даёт&lt;/h2&gt;
  &lt;p id=&quot;erSZ&quot;&gt;Немало. Это первые 4 792 простых делителя. Это основа для нахождения следующих 4 792 простых чисел. Это позволяет при проверке на простоту перебирать сразу простые делители. Это позволяет быстро выполнять факторизацию чисел. А все вместе дает возможность в короткий срок решать целый класс задач методом простого перебора, экономя время на программирование.&lt;/p&gt;

</content></entry></feed>