Print($'{Arr(1,2,3)}')

теперь печатает содержимое массива
This commit is contained in:
Mikhalkovich Stanislav 2025-11-11 22:04:03 +03:00
parent deef6b40d5
commit 7aed6ed062
59 changed files with 759 additions and 772 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "11";
public const string Build = "0";
public const string Revision = "3693";
public const string Revision = "3699";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=11
%REVISION%=3693
%REVISION%=3699
%COREVERSION%=0
%MAJOR%=3

View file

@ -112,9 +112,9 @@ Microsoft.NET - </span><a href="http://www.mono-project.com/">среда
<li>Сборщик мусора начинает работу в момент
исчерпания динамической памяти, его работа занимает несколько миллисекунд. Для
приложений реального времени это непозволительно.</li>
<li>Запуск .NET-приложения обязательно требует
установки на компьютере платформы .NET. Без нее
приложение работать не будет (Отметим, что в Windows Vista и в
<li>Запуск .NET-приложения обязательно требует установки на компьютере
платформы .NET. Без нее приложение работать не будет (Отметим, что в Windows
начиная с&nbsp;
<span lang="en-us">Windows 7 </span>платформа .NET встроена).</li>
</ol>
<p>Отметим, что достоинства платформы .NET

View file

@ -58,13 +58,13 @@
<hr>
<p><b><font color="#0000FF"><i>Шаг 2.</i> </font></b>Переменные
<code>a</code> и <code>b</code>
считываются из полей ввода, выделенных желтым цветом, с помощью обычной процедуры <code>read</code>. Закроем окно задачника
считываются из полей ввода, выделенных желтым цветом, с помощью обычной функции <code>
ReadInteger</code>, <code>ReadReal</code> ... Закроем окно задачника
и изменим программу следующим образом:
</p>
<blockquote>
<code><b>uses</b> PT4;<br><b>var </b>a, b: integer;<b><br>
begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; read(a, b);<br>
<code><b>uses</b> PT4;<br><b><br>begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; <b>var (</b>a,b) := ReadInteger2;<br>
<b>end</b>.</code>
</blockquote>
<p>После запуска этого вариант программы окно задачник примет вид:</p>
@ -86,9 +86,8 @@
<hr>
<p><font color="#0000FF"><b><i>Шаг 3.</i> </b></font>Исправим тип исходных данных:</p>
<blockquote>
<code><b>uses</b> PT4;<br><b>var </b>a, b: real;<b><br>
begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; read(a, b);<br>
<code><b>uses</b> PT4;<br><b><br>begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; <b>var (</b>a,b) := ReadReal2;<br>
<b>end</b>.</code>
</blockquote>
<p>Вновь запустим программу:</p>
@ -106,12 +105,11 @@
<p><font color="#0000FF"><b><i>Шаг 4.</i> </b></font>Проведем
вычисления и выведем результирующие данные, но в неверном порядке:</p>
<blockquote>
<code><b>uses</b> PT4;<br><b>var </b>a, b, S, P: real;<b><br>
begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; read(a, b);<br>
&nbsp; S := a * b;<br>
&nbsp; P := 2 * (a + b);<br>
&nbsp; write(P, S)<br>
<code><b>uses</b> PT4;<br><b><br>begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; <b>var (</b>a,b) := ReadReal2;<br>
&nbsp; <b>var </b>S := a * b;<br>
&nbsp; <b>var </b>P := 2 * (a + b);<br>
&nbsp; Print(P, S)<br>
<b>end</b>.</code>
</blockquote>
<p>Вновь запустим программу:</p>
@ -129,10 +127,12 @@
<p><font color="#0000FF"><b><i>Шаг 5.</i> </b></font>Исправим
ошибку:</p>
<blockquote>
<code><b>uses</b> PT4;<br><b>var </b>a, b, S, P: real;<b><br>begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>&nbsp; read(a, b);<br>
&nbsp; S := a * b;<br>
&nbsp; P := 2 * (a + b);<br>
&nbsp; write(S, P)<br><b>end</b>.</code>
<code><b>uses</b> PT4;<br><b><br>begin</b><br>&nbsp;&nbsp;Task('Begin3');<br>
&nbsp; <b>var (</b>a,b) := ReadReal2;<br>
&nbsp; <b>var </b>S := a * b;<br>
&nbsp; <b>var </b>P := 2 * (a + b);<br>
&nbsp; Print(S, P)<br>
<b>end</b>.</code>
</blockquote>
<p>После запуска программы увидим следующее окно:</p>
<blockquote>

View file

@ -37,13 +37,14 @@
<img border="0" src="gif/Load.gif" width="16" height="17"> или клавиатурной
комбинации <b>Shift+Ctrl+L</b>. Приведем текст созданной заготовки:
</p>
<blockquote><code><pre><b>uses</b> PT4Exam;
<blockquote><code><b>uses</b> PT4Exam;
<b>begin</b>
<b><br><br>begin</b>
<br>&nbsp;
Task('ExamBegin2');
<b>end</b>.
</pre></code></blockquote>
<b><br>end</b>.
</code></blockquote>
<p>После запуска программы на экране появится <a href="../PT4/window.html">окно задачника</a>:
</p>
<blockquote>
@ -93,33 +94,15 @@
<p>Приступим к выполнению задания. В данном случае следует использовать алгоритм, не требующий
применения массивов, поэтому опишем три простые переменные вещественного типа и введем в них исходные данные:
</p>
<blockquote><code><pre><b>uses</b> PT4Exam;
<b>var</b>
a, b, c: real;
<b>begin</b>
<blockquote><code><b>uses</b> PT4Exam;
<b><br><br>begin</b> <br>&nbsp;
Task('ExamBegin2');
read(a, b, c);
<b>end</b>.
</pre></code></blockquote>
<p>Мы воспользовались стандартной процедурой ввода <code>read</code>, введя все три исходных числа за один ее вызов.
Этого же результата мы могли бы добиться и с помощью процедуры <code>readln</code>:
</p>
<blockquote><code><pre>readln(a, b, c);
</pre></code></blockquote>
<p>Заметим, что использование <i>отдельных</i> процедур <code>readln</code> для ввода каждого числа приведет к ошибочному результату:
</p>
<blockquote><code><pre>readln(a);
readln(b);
readln(c);
</pre></code></blockquote>
<p>В этом случае уже после ввода первого числа произойдет автоматический переход на следующую строку
с исходными данными. Поэтому оставшиеся в первой строке числа будут пропущены, а поскольку
во второй строке &laquo;ничего нет&raquo; (входной поток состоит из единственной строки),
будет выведено сообщение об ошибке &laquo;<i>Input string was not in a correct format</i>&raquo;
(&laquo;<i>Входная строка имела неверный формат</i>&raquo;).
</p>
<p>Приведенный пример показывает, что при организации ввода данных в заданиях групп Exam необходимо учитывать особенности
стандартных процедур <code>read</code> и <code>readln</code>.
<br>&nbsp;
<b>var</b>
(a,b,c) := ReadReal3;
<b><br>end</b>.
</code></blockquote>
<p>Мы воспользовались стандартной функцией ввода <code>ReadReal3</code>, введя все три исходных числа за один ее вызов.
</p>
<p>При запуске приведенного выше варианта программы вид окна не изменится, поскольку мы не вывели никаких данных.
В заданиях групп Exam запуск программы считается ознакомительным до тех пор, пока программа не выведет
@ -132,22 +115,24 @@ readln(c);
<p>Реализуем алгоритм нахождения минимального и максимального элемента. Для этого опишем еще две
переменные <code>min</code> и <code>max</code> типа <code>real</code> и добавим в конец программы следующие операторы:
</p>
<blockquote><code><pre><b>if</b> a &lt; b <b>then</b>
<b>begin</b>
<blockquote><code><b>if</b> a &lt; b <b>then</b>
<b><br>begin</b>
<br>&nbsp;
min := a;
max := b;
<b>end</b>
<b>else</b>
<b>begin</b>
<br>&nbsp; max := b;
<b><br>end</b>
<b><br>else</b>
<b><br>begin</b> <br>&nbsp;
min := b;
max := a;
<b>end</b>;
<b>if</b> c &lt; min <b>then</b>
<br>&nbsp; max := a;
<b><br>end</b>;
<b><br>if</b> c &lt; min <b>then</b> <br>&nbsp;
min := c
<b>else</b>
<b>if</b> c &gt; max <b>then</b>
<b><br>else</b>
<b>if</b> c &gt; max <b>then</b> <br>&nbsp;
max := c;
</pre></code></blockquote>
</code></blockquote>
<p>Таким образом, для одновременного нахождения минимального и максимального из трех чисел требуется
не более трех операций сравнения и не более трех операций присваивания.
</p>
@ -161,8 +146,7 @@ readln(c);
<p>Вначале, в качестве примера, организуем вывод, не соответствующий условиям задачи. Для этого добавим в конец программы
следующий оператор:
</p>
<blockquote><code><pre>writeln(min, max);
</pre></code></blockquote>
<blockquote><code>Println(min, max); </code></blockquote>
<p>Приведем вид окна задачника при запуске полученной программы:
</p>
@ -189,16 +173,12 @@ readln(c);
</p>
<p>Для исправления первых двух ошибок достаточно изменить вывод следующим образом:
</p>
<blockquote><code><pre>writeln('MIN=', min);
writeln('MAX=', max);
</pre></code></blockquote>
<blockquote><code>Println('MIN=', min); <br>Println('MAX=', max); </code></blockquote>
<p>Однако в этом случае числа по-прежнему могут содержать неверное число дробных знаков.
Для исправления этой последней ошибки проще всего использовать
<i>атрибуты форматирования</i>, начинающиеся с символа &laquo;:&raquo; (двоеточие):
</p>
<blockquote><code><pre>writeln('MIN=', min:0:2);
writeln('MAX=', max:0:2);
</pre></code></blockquote>
<blockquote><code>Println('MIN=', min:0:2); <br>Println('MAX=', max:0:2); </code></blockquote>
<p>Первый атрибут определяет <i>ширину поля вывода</i> (если ширина равна 0, то используется минимально
необходимое поле вывода). Наличие второго атрибута (допустимого только для вещественных чисел) означает,
что число надо вывести в формате с фиксированной точкой, причем его значение равно количеству дробных знаков.

View file

@ -49,47 +49,6 @@ Programming Taskbook</a> свидетельствует, что обучение
Робот.</a></p>
<p>Исполнитель Робот является бесценным источником заданий для быстрого обучения
основным конструкциям программирования школьников средних классов. </p>
<p><a href="ctstring.html">Пример 3. Задание String9
из электронного задачника <b>Programming Taskbook</b>.</a></p>
<p>Данное задание знакомит с особенностями выполнения заданий на обработку символов
и строк. Следует обратить внимание на диагностику ошибки, связанной с выводом строки, длина которой превышает длину
строки &#151; правильного решения.</p>
<p><a href="ctfile.html">Пример 4. Задание File48
из электронного задачника <b>Programming Taskbook</b>.</a></p>
<p>Это задание знакомит с особенностями выполнения заданий
на обработку типизированных файлов. Исходные файлы при вызове
задания создаются на диске, после чего могут обрабатываться по стандартным
правилам. Содержимое файлов, созданных в процессе выполнения задания,
проверяется электронным задачником; после проверки исходные и результирующие
файлы автоматически удаляются. Следует обратить внимание на то, как содержимое
файлов отображается в окне задачника, а также на обработку ошибок времени
выполнения, возникающих при выполнении заданий. В примере описаны типичные ошибки при
работе с файлами и способы их устранения.&nbsp;&nbsp; </p>
<p><a href="ctpointer.html">Пример 5. Задания группы Dynamic
из электронного задачника <b>Programming Taskbook</b>.</a></p>
<p>В данном примере описываются задания из раздела, посвященного указателям и линейным динамическим
структурам данных. При вызове задания в динамической памяти создаются все
исходные структуры данных (в виде односвязных или двусвязных списков), а
указатели на элементы этих структур выступают в качестве входных данных задания.
Содержимое всех структур данных отображается в окне задачника в наглядном виде.
Созданные программой ученика структуры данных анализируются задачником и после
анализа все структуры данных удаляются из памяти. </p>
<p><a href="cttree.html">Пример 6. Задания группы Tree
из электронного задачника <b>Programming Taskbook</b>.</a></p>
<p>В данном примере описываются задания на обработку иерархических структур данных &#151;
деревьев. Подобные структуры, как и линейные динамические структуры, рассмотренные
в предыдущем примере, создаются задачником автоматически и в наглядном виде отображаются
в его окне. Для доступа к ним также используются указатели.
</p>
<p><a href="ctexam.html">Пример 7. Задания групп ExamBegin и ExamTaskC
из электронного задачника <b>Programming Taskbook</b>.</a></p>
<p>Пример содержит описание процесса выполнения заданий, связанных с ЕГЭ
по информатике. Основной особенностью этих заданий является то, что
при их выполнении требуется использовать стандартные процедуры ввода-вывода языка
Pascal (а не их специальные модификации, реализованные для задачника <b>Programming Taskbook</b>).
Рассматриваются задания из группы ExamBegin, посвященные базовым алгоритмам,
и задания из группы ExamTaskC, посвященные обработке сложных наборов данных.
</p>
<p>Все примеры, связанные с электронным задачником <b>Programming Taskbook</b>, иллюстрируются
изображениями окна задачника
в <a href="..\PT4\window.html#dynmode">режиме с динамической компоновкой</a>, появившемся в версии 4.11.

View file

@ -27,7 +27,7 @@ protected, атрибуты static, virtual и override для методов. <
<blockquote>
<p><code><b>type </b>AuthorAttribute = <strong>class</strong>(System.Attribute)<br>&nbsp;
<strong>auto</strong> property Name: string;<br>&nbsp; <strong>constructor</strong> (n: string);<br>&nbsp;
<strong>begin</strong><br>&nbsp;&nbsp;&nbsp; name := n;<br>&nbsp; <strong>end</strong>;&nbsp; <strong><br>end</strong>;</code></p>
<strong>begin</strong><br>&nbsp;&nbsp;&nbsp; Name := n;<br>&nbsp; <strong>end</strong>;&nbsp; <strong><br>end</strong>;</code></p>
</blockquote>
<p>Следует обратить внимание, что класс атрибута принято оканчивать на <code>
Attribute</code>.</p>
@ -42,7 +42,7 @@ Attribute</code>.</p>
<p>Следует обратить внимание, что окончание <code>Attribute</code> можно не
указывать.</p>
<p>Распознать, помечен ли данный класс атрибутом, можно, используя
отражение: </p>
анализ типа: </p>
<blockquote>
<p><code><strong>begin</strong> <br>&nbsp; <strong>var</strong> t := typeof(My);
<br>&nbsp; <strong>var</strong> attrs := t.GetCustomAttributes(false); <br>&nbsp;
@ -51,7 +51,7 @@ Attribute</code>.</p>
<strong>then</strong> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print(auth.Name);
<br><strong>end</strong>.</code></p>
</blockquote>
<p>След</p>
<p>&nbsp;</p>
</body>
</html>

View file

@ -27,9 +27,9 @@
<blockquote><code><b>type</b> Person = <strong>auto class</strong><br>&nbsp;
name: string;<br>&nbsp; age: integer;<br><strong>end</strong>;<br><strong>
var</strong> p := new Person('Иванов',20); // конструктор автокласса
генерируется автоматически<br>Writeln(p); // вызывается сгенерированный
генерируется автоматически<br>Println(p); // вызывается сгенерированный
автоматически метод ToString</code></blockquote>
<p>Здесь в отличие от действия writeln по умолчанию выводятся значения не только
<p>Здесь в отличие от действия Println по умолчанию выводятся значения не только
публичных, а всех полей.</p>
</body>

View file

@ -26,14 +26,10 @@
<b> &nbsp; &nbsp; ...<br>
</b>&nbsp;&nbsp;&nbsp; <b>procedure</b> IncCourse; <br>
&nbsp; <b>end</b>;<br>
...<br>
<b>var <br>
&nbsp; </b>p: Person;<br>
&nbsp; s: Student;<br>
<b>begin</b><br>
&nbsp; p := new Student('Иванов',20,3,1); //
<b><br>begin</b><br>
&nbsp; <strong>var </strong>p: Person := new Student('Иванов',20,3,1); //
неявное преобразование к типу базового класса<br>
&nbsp; s := Student(p); // явное
&nbsp; <strong>var</strong> s: Student := Student(p); // явное
приведение к типу производного класса <br>
<b>end</b>.</code></p>
</blockquote>

View file

@ -45,7 +45,7 @@ property</span></b><span lang="en-us"> Coun: integer <b>read</b> cnt;</span><br>
<p><code><span lang="en-us"><b>begin</b><br>
&nbsp; <b>var</b> p: Person := new Person('</span>Иванов<span lang="en-us">',20);<br>
&nbsp; <b>var</b> p1: Person := new Person('</span>Петров<span lang="en-us">',18);<br>
&nbsp; Writeln(Person.Count); // </span>обращение к классовому методу
&nbsp; Println(Person.Count); // </span>обращение к классовому методу
<span lang="en-us">Count<br>
<b>end</b>.</span></code></p>
<p>В отличие от статических полей и методов, обычные поля и методы называются

View file

@ -25,14 +25,14 @@
<strong>end</strong>;<br>
<br><strong>begin<br></strong>&nbsp; MyPrint(1);<br>&nbsp; 1.MyPrintEx;<br>
<strong>end</strong>.</code></blockquote>
<p>Здесь MyPrint - это обычная процедура с параметром типа integer, MyPrintEx -
метод расширения типа integer. При этом при вызове первый параметр MyPrintEx
становится объектом, вызывающим MyPrintEx как метод.</p>
<p>Здесь <code>MyPrint</code> - это обычная процедура с параметром типа integer, MyPrintEx -
метод расширения типа integer. При этом при вызове первый параметр <code>MyPrintEx</code> становится объектом, вызывающим
<code>MyPrintEx</code> как метод.</p>
<p>Можно расширить тип последовательности, тогда все классы, являющиеся
последовательностями (динамические одномерные массивы, списки List&lt;T&gt;, множества
HashSet&lt;T&gt; и SortedSet&lt;T&gt;),
последовательностями (динамические одномерные массивы, списки <code>List&lt;T&gt;</code>, множества
<code>HashSet&lt;T&gt;</code> и <code>SortedSet&lt;T&gt;</code>),
получат этот метод. Например, в системном модуле PABCSystem так введен метод
расширения ForEach для последовательностей:</p>
расширения <code>ForEach</code> для последовательностей:</p>
<blockquote><code><strong>procedure</strong> &amp;ForEach&lt;T&gt;(Self: <strong>sequence
of</strong> T; action: T -&gt; ()); <strong>extensionmethod</strong>;<br>
<strong>begin</strong><br>&nbsp; <strong>foreach</strong> x: T <strong>in</strong>

View file

@ -58,7 +58,7 @@
Print;<br><b>&nbsp;&nbsp;&nbsp; property</b> Name: string read fName;<br><b>&nbsp;&nbsp;&nbsp;
property</b> Age: integer read fAge;<b><br>&nbsp; end</b>;<br><strong><br>
procedure</strong> Person.Print;<br><strong>begin</strong><br>&nbsp;
Writeln($'Имя: {Name} Возраст: {Age}');<br><strong>end</strong>;</code></p>
Println($'Имя: {Name} Возраст: {Age}');<br><strong>end</strong>;</code></p>
</blockquote>
<p>После слова <code><b>class</b></code>
в скобках может быть указано имя класса-предка (см. <A href="inheritance.html">
@ -115,7 +115,7 @@
<b>&nbsp; end</b>;<br>
&nbsp; ...<br>
<b>var</b> p: Person := new Person('Иванов',20);<br>
Writeln(p); // Имя: Иванов&nbsp; Возраст: 20</code></p>
Println(p); // Имя: Иванов&nbsp; Возраст: 20</code></p>
</blockquote>
<h2>Присваивание и передача в качестве параметров подпрограмм</h2>
<p>Переменная типа класс является ссылкой и хранит ссылку на объект, создаваемый
@ -144,9 +144,9 @@
значения. </p>
<blockquote>
<p><code><b>var</b> p1 := new Person('Петров',20);<br><b>var</b> p2 := new
Person('Петров',20);<br>writeln(p1=p2); // False<br>
Person('Петров',20);<br>Println(p1 = p2); // False<br>
p2 := p1; <br>
writeln(p1=p2); // True</code></p>
Println(p1 = p2); // True</code></p>
</blockquote>
<p>Это поведение можно изменить, <A href="operoverloading.html">перегрузив</A>
операцию = для класса.</p>

View file

@ -66,7 +66,7 @@ integer);<br>
<p><code>&nbsp;&nbsp;&nbsp; <b>procedure</b> Print;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>inherited</b>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('Курс: ',course,'&nbsp; Группа: ',group);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writeln('Курс: ',course,'&nbsp; Группа: ',group);<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp;</code></p>
</body>

View file

@ -32,7 +32,7 @@ B</code>
var </b>a1: A;<br>
...<br>
a1 := B.Create;<br>
writeln(a1 <b>is</b> B); // True</code></p>
Println(a1 <b>is</b> B); // True</code></p>
</blockquote>
<p>Если <code>a1</code> - переменная
классового типа, а <code>B</code> - тип класса, то выражение <code>a1 <b>as</b>

View file

@ -91,11 +91,19 @@ value: Complex);<br>&nbsp;&nbsp;&nbsp; <b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&
<b>end</b>;<br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Можно перегружать операции с помощью <a href="extensionmethods.html">методов расширения</a> - в этом случае при
описании подпрограммы не следует писать слово class. Например, так в системном модуле
описании подпрограммы не следует писать слово static. Например, так в системном модуле
реализовано добавление числа к строке:</p>
<blockquote>
<p><code><strong>function</strong> operator+(str: string; n:
integer): string; <strong>extensionmethod</strong>;<br><strong>begin</strong><br>&nbsp; result := str +
<p><code><strong>function</strong> <strong>operator</strong>+(str: string; n:
integer): string; <strong>extensionmethod</strong>;<br><strong>begin</strong><br>&nbsp;
Result := str +
n.ToString;<br><strong>end</strong>;</code></p>
</blockquote>
<p>При перегрузке операций методами расширения ключевое слово <code> <strong>extensionmethod</strong></code> можно не писать:</p>
<blockquote>
<p><code><strong>function</strong> <strong>operator</strong>+(str: string; n:
integer): string;<br><strong>begin</strong><br>&nbsp;
Result := str +
n.ToString;<br><strong>end</strong>;</code></p>
</blockquote>
<p>Можно перегружать расширенные операции присваивания +=, -= и т.д.: </p>

View file

@ -106,7 +106,7 @@ PropertyReader</code></code>, при доступе на запись - <code>
&nbsp; p.Age := p.Age + 1; // компилятор заменяет этот код на p.setAge(p.getAge
+ 1);<br>
&nbsp;
writeln(p.Id); <br><strong>end</strong>.</code></p>
Println(p.Id); <br><strong>end</strong>.</code></p>
</blockquote>
<p>Всякий раз, когда мы присваиваем свойству <code>Age</code>
новое значение,

View file

@ -36,14 +36,14 @@
&nbsp; public </b><br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> Print;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('Base');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println('Base');<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;<br>
&nbsp; Derived =<b> class</b>(Base)<br>
<b>&nbsp; public </b><br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> Print;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('Derived');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println('Derived');<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;</code> </p>
</blockquote>
@ -79,14 +79,14 @@
&nbsp; public </b><br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> Print; <b>virtual</b>;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('Base');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println('Base');<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;<br>
&nbsp; Derived =<b> class</b>(Base)<br>
<b>&nbsp; public </b><br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> Print; <b>override</b>;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('Derived');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println('Derived');<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;</code> </p>
</blockquote>
@ -105,7 +105,7 @@ Derived</code> за счет того что решение о вызове ме
<blockquote>
<p><code><b>type</b><br>&nbsp; DerivedTwice1 =<b> class</b>(Derived)<br>
<b>&nbsp; public </b><br>&nbsp;&nbsp;&nbsp; <b>procedure</b> Print; </code><code><b>reintroduce</b></code><code>;<br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('DerivedTwice1');<br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println('DerivedTwice1');<br>&nbsp;&nbsp;&nbsp;
<b>end</b>;<br>&nbsp; <b>end</b>;</code> </p>
</blockquote>
<p>Если мы хотим начать новую цепочку виртуальности, то следует использовать и
@ -114,7 +114,7 @@ Derived</code> за счет того что решение о вызове ме
<p><code><b>type</b><br>&nbsp; DerivedTwice2 =<b> class</b>(Derived)<br>
<b>&nbsp; public </b><br>&nbsp;&nbsp;&nbsp; <b>procedure</b> Print; </code><code><b>virtual</b>; </code><code>
<b>reintroduce</b>;<br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln('DerivedTwice2');<br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println('DerivedTwice2');<br>&nbsp;&nbsp;&nbsp;
<b>end</b>;<br>&nbsp; <b>end</b>;</code> </p>
</blockquote>
<p>Если переопределить виртуальную функцию невиртуальной без ключевого слова

View file

@ -57,21 +57,21 @@
&nbsp; B =<b> class</b>(A)<br>
<b>&nbsp; public<br>
</b>&nbsp;
<b>&nbsp; procedure</b> print;<br>
<b>&nbsp; procedure</b> Print;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln(a); // верно, т.к.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println(a); // верно, т.к.
a - защищенное поле<b><br>
</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln(x); // неверно,
</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Println(x); // неверно,
т.к. х - закрытое поле<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;<br>
...<br>
<b>var</b> b1: B := new B(5); <br>
...<br>
writeln(b1.x); // неверно, т.к. х - закрытое
поле<br>writeln(b1.a); // неверно, т.к. a -
Println(b1.x); // неверно, т.к. х - закрытое
поле<br>Println(b1.a); // неверно, т.к. a -
защищенное поле<br>
b1.print; // верно, т.к. print -
b1.Print; // верно, т.к. Print -
открытый метод</code></blockquote>
<p>Комментарии по тексту программы описывают верное и неверное в смысле доступа
обращение к полям и методам.</p>

View file

@ -28,6 +28,8 @@
<param name="Keyword" value="string_nullbased">
<param name="Keyword" value="platformtarget">
<param name="Keyword" value="targetframework">
<param name="Keyword" value="zerobasedstrings">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>

View file

@ -54,7 +54,7 @@
&nbsp; x[0] := 1;<br>
&nbsp; x[1] := 2.71;<br>
&nbsp; x[2] := 3.14;<br>
&nbsp; writeln(FindFirstInArray(x,1));<br>
&nbsp; Println(FindFirstInArray(x,1));<br>
<b>end</b>.</code></p>
</blockquote>
<p>произойдет ошибка. Причина состоит в том, что первый параметр имеет тип
@ -95,10 +95,10 @@ integer</span>, что не соответствует ни одному тип
&nbsp; x := <b>new</b> Pair&lt;integer,real&gt;;<br>
&nbsp; x.first := 3;<br>
&nbsp; y := x.ChangeSecond('abc');<br>
&nbsp; writeln(y.first, y.second);<br>
&nbsp; Println(y.first, y.second);<br>
<b>end</b>.</code></p>
</blockquote>
<p>По окончании работы данная программа выведет 3abc.</p>
<p>По окончании работы данная программа выведет 3 abc.</p>
</body>
</html>

View file

@ -16,7 +16,7 @@
</p>
<p>Например, <span lang="ru">в классе </span><code>System.Array</code>
<span lang="ru">имеется несколько статических обобщенных методов с обобщенными
подпрограммами в качестве параметров. Так</span>, <code>System.Array.Find</code>
подпрограммами в качестве параметров. Так</span>, <code>System.Array.FindAll</code>
<span lang="ru">имеет следующий прототип:</span></p>
<blockquote>
<p><code>System.Array.FindAll&lt;T&gt;(a: <b>array</b> <b>of</b> T; pred:
@ -27,11 +27,7 @@
<code>pred</code><span lang="ru">.</span></p>
<p><span lang="ru">Приведем пример вызова этой функции:</span></p>
<blockquote>
<p><code><b>function</b> f(x: integer): boolean;<br>
<b>begin</b><br>
&nbsp; Result := ;<br>
<b>end</b>;</code></p>
<p><code><b>var</b> a := Seq(1,3,6,5,8);<br>
<p><code><b>var</b> a := [1,3,6,5,8];<br>
<b>var</b> b := System.Array.FindAll(a,x -&gt; x <b>mod</b> 2 = 0);</code></p>
</blockquote>
<p><span lang="ru">Здесь возвращается массив </span><code>b</code><span lang="ru">,

View file

@ -59,22 +59,19 @@ Stack&lt;integer&gt;</code> - класс списка с элементами т
</blockquote>
<p>Использование шаблона класса иллюстрируется ниже:</p>
<blockquote>
<p><code><b>var</b> <br>
&nbsp; si: Stack&lt;integer&gt;;<br>
&nbsp; sr: Stack&lt;real&gt;;<br>
<b>begin</b><br>
&nbsp; si := <b>new</b> Stack&lt;integer&gt;;&nbsp; <br>
&nbsp; sr := <b>new</b> Stack&lt;real&gt;;<br>
<p><code><b>begin</b><br>
<strong>&nbsp; var </strong>si := <b>new</b> Stack&lt;integer&gt;;&nbsp; <br>
<strong>&nbsp; var </strong>sr := <b>new</b> Stack&lt;real&gt;;<br>
&nbsp; <b>for</b> <span lang="en-us"><b>var</b> </span>i := 1 <b>to</b> 10 <b>do</b><br>
&nbsp;&nbsp;&nbsp; si.Push(Random(100));<br>
&nbsp; <b>while</b> <b>not</b> si.IsEmpty <b>do</b><br>
&nbsp;&nbsp;&nbsp; sr.Push(si.Pop);<br>
&nbsp; <b>while</b> <b>not</b> sr.IsEmpty <b>do</b><br>
&nbsp;&nbsp;&nbsp; write(sr.Pop,' ');<br>
&nbsp;&nbsp;&nbsp; Print(sr.Pop);<br>
<b>end</b>.</code></p>
</blockquote>
<p>Подстановка конкретного типа-параметра в обобщенный тип называется
инстанцированием.</p>
<strong>инстанцированием</strong>.</p>
<p>&nbsp;</p>
</body>

View file

@ -58,7 +58,7 @@ read и write. </p>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> Print;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(xx,' ',yy);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print(xx,yy);<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Интерфейсы можно наследовать друг от
@ -108,7 +108,7 @@ read и write. </p>
&nbsp; ...<br>
<b>var</b> p: Point := ip <b>as</b> Point;<br>
<b>if</b> p&lt;&gt;nil <b>then</b> <br>
&nbsp; writeln('Преобразование успешно');</code></p>
&nbsp; Println('Преобразование успешно');</code></p>
</blockquote>
</body>

View file

@ -38,9 +38,9 @@
t1: TTT;</code></p>
</blockquote>
<p>Документирующие комментарии могут занимать несколько строк, каждая из которых
должна начинаться с<span class="auto-style1"> ///</span> . Для комментирования
должна начинаться с<code> ///</code> . Для комментирования
подпрограмм можно использовать в первой строке документирующий комментарий
<span class="auto-style1">///-</span>, тогда его содержимое меняет заголовок
<code>///-</code>, тогда его содержимое меняет заголовок
подпрограммы в подсказке при наведении курсора мыши. Например:</p>
<blockquote>
<p><code>///- Exclude(var s : set of T; el : T)<br>///Удаляет элемент el из
@ -48,7 +48,7 @@
TypedSet; el: object);</code></p>
</blockquote>
<p>Если первая строка документирующего комментария имеет вид
<span class="auto-style1">///--</span>, то подсказка не всплывает. Это делается
<code>///--</code>, то подсказка не всплывает. Это делается
для элементов, которые хочется скрыть от системы всплывающих подсказок.</p>
</body>

View file

@ -81,7 +81,7 @@
<p><b><code>interface</code></b></p>
<p><code><b>uses</b> GraphABC;</code></p>
<p><code><b>const</b> Dim = 5;<br>
<b>var</b> Colors: <b>array</b> [1..Dim] <b>of</b> integer;</code></p>
<b>var</b> Colors: <b>array</b> <b>of</b> integer := new integer[Dim];</code></p>
<p><code><b>function</b> RandomColor: integer;<br>
<b>procedure</b> FillByRandomColor;</code></p>
<p><b><code>implementation</code></b></p>
@ -91,7 +91,7 @@
<b>end</b>;<br>
<b>procedure</b> FillByRandomColor;<br>
<b>begin</b><br>
&nbsp; <b>for</b> i: integer := 1 <b>to</b> Dim <b>do</b><br>
&nbsp; <b>for</b> <strong>var </strong>i := 0 <b>to</b> Dim-1 <b>do</b><br>
&nbsp;&nbsp;&nbsp; Colors[i] := RandomColor; <br>
<b>end</b>;</code></p>
<p><code><b>initialization</b><br>

View file

@ -78,21 +78,17 @@
<span class="auto-style2"><em>ИмяБиблиотеки</em></span><span class="auto-style1">}</span>.
Например:</p>
<blockquote>
<p><span class="auto-style1">{$reference ABC.dll}<br>{$reference ABC1.dll}<br>
<br><strong>begin</strong><br>&nbsp; writeln(a.GetType); <br><strong>end</strong>.</span> </p>
<p><code>{$reference ABC.dll}<br>{$reference ABC1.dll}<br>
<br><strong>begin</strong><br>&nbsp; writeln(a.GetType); <br><strong>end</strong>.</code> </p>
</blockquote>
<p>Подключение библиотеки может проводиться в любом месте исходного файла.</p>
<p>Библиотеки ABC и ABC1 имеют соответственно вид:</p>
<blockquote>
<p class="auto-style1"><strong>library</strong> ABC;</p>
<p class="auto-style1"><strong>var</strong> a: integer;</p>
<p><span class="auto-style1"><strong>end</strong>.</span> </p>
</blockquote>
<p><code><strong>library</strong> ABC;<strong><br>var</strong> a: integer;<strong><br>end</strong>.</code>
</blockquote>
<p>и</p>
<blockquote>
<p class="auto-style1"><strong>library</strong> ABC1;</p>
<p class="auto-style1"><strong>var</strong> a: real;</p>
<p><span class="auto-style1"><strong>end</strong>.</span> </p>
<p><code><strong>library</strong> ABC1;<strong><br>var</strong> a: real;<strong><br>end</strong>.</code> </p>
</blockquote>
<h2>Алгоритм поиска имен в библиотеках </h2>
<p>В первую очередь имя ищется в исходном модуле, затем в модулях, подключенных
@ -103,9 +99,9 @@
<p>В случае коллизии имен используемое имя можно предварять именем библиотеки с
последующей точкой:</p>
<blockquote>
<p><span class="auto-style1">{$reference ABC.dll}<br>{$reference ABC1.dll}<br>
<br><strong>begin</strong><br>&nbsp; writeln(ABC1.a.GetType); <br><strong>
end</strong>.</span> </p>
<p><code>{$reference ABC.dll}<br>{$reference ABC1.dll}<br>
<br><strong>begin</strong><br>&nbsp; Println(ABC1.a.GetType); <br><strong>
end</strong>.</code> </p>
</blockquote>
<p>&nbsp;</p>
</body>

View file

@ -73,7 +73,7 @@ span.a
раньше второй в первый элемент массива запишется значение из второго, а если
позже то из третьего элемента массива.</p>
<blockquote>
<p><code><b>var</b> a:integer;<br>
<p><code><b>var</b> a: integer;<br>
<font color="#666666">{$omp parallel for}<br>
</font>
<b>for</b> <b>var</b> i:=1 <b>to</b> 10 <b>do</b><br>
@ -93,9 +93,7 @@ span.a
параллельности. Вычисление различных элементов матрицы происходит независимо,
поэтому не надо предусматривать никаких средств синхронизации.</span></p>
<blockquote>
<p><code><b>uses</b> Arrays;<br>
<br>
<b>procedure</b> ParallelMult(a,b,c: <b>array</b> [,] <b>of</b> real; n:
<p><code><b>procedure</b> ParallelMult(a,b,c: <b>array</b> [,] <b>of</b> real; n:
integer);<br>
<b>begin</b><br>
<font color="#666666"><span lang="ru">&nbsp; </span>{$omp parallel for }<br>
@ -127,17 +125,15 @@ span.a
<br>
<b>begin</b><br>
<b><span lang="ru">&nbsp; </span>var</b> a :=
Arrays.CreateRandomRealMatrix(n,n);<br>
MatrRandomReal(n,n);<br>
<b><span lang="ru">&nbsp; </span>var</b> b :=
Arrays.CreateRandomRealMatrix(n,n);<br>
MatrRandomReal(n,n);<br>
<b><span lang="ru">&nbsp; </span>var</b> c := new real[n,n];<br>
<span lang="ru">&nbsp; </span>ParallelMult(a,b,c,n);<br>
<span lang="ru">&nbsp; </span>writeln('Параллельное перемножение матриц:
',Milliseconds,' миллисекунд');<br>
<span lang="ru">&nbsp; </span>Println('Параллельное перемножение матриц:',Milliseconds,'миллисекунд');<br>
<b><span lang="ru">&nbsp; </span>var</b> d := Milliseconds;<br>
<span lang="ru">&nbsp; </span>Mult(a,b,c,n);<br>
<span lang="ru">&nbsp; </span>writeln('Непараллельное перемножение матриц:
',Milliseconds-d,' миллисекунд');<br>
<span lang="ru">&nbsp; </span>Println('Непараллельное перемножение матриц:',Milliseconds-d,'миллисекунд');<br>
<b>end</b>.</code></p>
</blockquote>
</body>

View file

@ -48,7 +48,7 @@
<blockquote>
<p><code><b>var</b> a: integer := 1;<br>
<font color="#666666">{$omp parallel for reduction(+:a)}<br>
</font><b>for</b> <b>var</b> i: integer:=1 <b>to</b> 2 <b>do</b><br>
</font><b>for</b> <b>var</b> i:=1 <b>to</b> 2 <b>do</b><br>
&nbsp; a := a+1;</code></p>
</blockquote>
<p>Здесь начальное значение переменной a единица, для действия + локальные

View file

@ -26,11 +26,11 @@
<p>Критические секции можно использовать при обращении к общим переменным, чтобы
избежать потерь данных.</p>
<blockquote>
<p><code><b>var</b> a:integer:=0;<br>
<p><code><b>var</b> a: integer := 0;<br>
<font color="#666666">{$omp parallel for}<br>
</font><b>for</b> <b>var</b> i:integer:=1 <b>to</b> 100 <b>do</b><br>
&nbsp; {$omp critical}<br>
&nbsp; a:=a+1;</code></p>
</font><b>for</b> <b>var</b> i:=1 <b>to</b> 100 <b>do</b><br>
<font color="#666666">&nbsp; {$omp critical}<br>
</font>&nbsp; a := a + 1;</code></p>
</blockquote>
<p>Здесь критическую секцию можно использовать вместо редукции. Весь оператор
<code>a:=a+1</code> выполнится одним потоком и только потом другим. Однако использование
@ -40,13 +40,13 @@
<p>Но не во всех случаях использование критических секций помогает обеспечить
корректную работу параллельных конструкций.</p>
<blockquote>
<p><code><b>var</b> a:integer := 0;<br>
<p><code><b>var</b> a: integer := 0;<br>
<font color="#666666">{$omp parallel sections}<br>
</font><b>begin</b><br>
<font color="#666666">&nbsp; {$omp critical}<br>
</font>&nbsp; a:=1;<br>
</font>&nbsp; a := 1;<br>
<font color="#666666">&nbsp; {$omp critical}<br>
</font>&nbsp; a:=a+1;<br>
</font>&nbsp; a := a+1;<br>
<b>end</b>;</code></p>
</blockquote>
<p>Значение переменной a зависит от того, в каком порядке выполнятся секции.

View file

@ -39,12 +39,12 @@
<p>Рекомендуется использовать вторую форму условной операции.</p>
<p><strong>Ограничение</strong>. Вторую форму условной операции нельзя
использовать в качестве выражения верхнего уровня в лямбдах. Следующий код
ошибочен:</p>
<strong><em>ошибочен</em></strong>:</p>
<blockquote>
<p><code><b>var</b> l: real -&gt; real := x -&gt; <strong>if</strong> x&lt;0 <strong>
then</strong> 0 <strong>else</strong> x;</code></p>
</blockquote>
<p>Для решения указанной проблемы можно взять условную операцию в скобки:</p>
<p>Для решения указанной проблемы нужно <em><strong>взять условную операцию в скобки</strong></em>:</p>
<blockquote>
<p><code><b>var</b> l: real -&gt; real := x -&gt; (<strong>if</strong> x&lt;0 <strong>
then</strong> 0 <strong>else</strong> x);</code></p>

View file

@ -6,13 +6,6 @@
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
<link rel="StyleSheet" href="../../default.css">
<style type="text/css">
.auto-style1 {
font-family: monospace;
font-size: 10pt;
color: #000080;
}
</style>
</head>
<body><H1>Срезы</H1>
<p>Срез - это набор элементов динамического массива, списка List&lt;T&gt; или строки,
@ -34,28 +27,27 @@
<code>a?[from:to:step]</code>
</blockquote>
<p>и содержит копию элементов исходного контейнера в диапазоне [<code>from</code>,
<span class="auto-style1">to</span>) с
шагом <span class="auto-style1">step</span>. Запись [<span class="auto-style1">from</span>,
<span class="auto-style1">to</span>) означает, что элемент с индексом
<span class="auto-style1">from</span> включается в
диапазон, а элемент с индексом <span class="auto-style1">to</span> - не включается.
<code>to</code>) с
шагом <code>step</code>. Запись [<code>from</code>,
<code>to</code>) означает, что элемент с индексом
<code>from</code> включается в
диапазон, а элемент с индексом <code>to</code> - не включается.
Значения <code>from</code>,
<span class="auto-style1">to</span>, <span class="auto-style1">step</span>
<code>to</code>, <code>step</code>
должны быть целыми.</p>
<p>Если <span class="auto-style1">step</span> не указывается, то предполагается, что
<span class="auto-style1">step</span>=1, т.е. элементы
<p>Если <code>step</code> не указывается, то предполагается, что
<code>step</code>=1, т.е. элементы
расположены непрерывно.</p>
<p>Тип среза совпадает с типом контейнера: срез элементов массива представляет
собой массив, срез строки - строку и срез для List&lt;T&gt; также принадлежит к типу
List&lt;T&gt;.</p>
<p>Для обычных срезов исключение генерируется в следующих случаях. Если индекс <span class="auto-style1">from</span> выходит за границы, то во
<p>Для обычных срезов исключение генерируется в следующих случаях. Если индекс <code>from</code> выходит за границы, то во
время выполнения программы возникает исключение. Индекс
<span class="auto-style1">to</span> может выходить за границы на 1, т.е.
<code>to</code> может выходить за границы на 1, т.е.
находиться в диапазоне [-1..a.Count] для динамических массивов и списков List&lt;T&gt;
и в диапазоне [0..s.Length+1] для строк, в противном случае также возникает
исключение. </p>
<p>Если <span class="auto-style1">
step</span>=0, то для всех видов срезов генерируется исключение.</p>
<p>Если <code>step</code>=0, то для всех видов срезов генерируется исключение.</p>
<p>Срезы вида
<code>a?</code>
называются <i>безопасными срезами</i> и во всех остальных случаях не генерируют
@ -65,30 +57,29 @@ step</span>=0, то для всех видов срезов генерирует
контейнеру.</p>
<p>Приведём ряд примеров:</p>
<blockquote>
<p><code><b>var</b> a := Arr(0,1,2,3,4,5,6);<br>Println(a[2:5]); // [2,3,4]<br>
<p><code><b>var</b> a array of integer := [0,1,2,3,4,5,6];<br>Println(a[2:5]); // [2,3,4]<br>
Println(a[2:a.Length]); // [2,3,4,5,6]<br>Println(a[2:1000]); // Исключение!<br>Println(a?[2:1000]);
// [2,3,4,5,6]<br>Println(a[2:7:2]); // [2,4,6]<br>
Println(a[2:0]); // пустой массив<br><b>var</b> s := '0123456';<br>
Println(s[2:5]); // 123<br>Println(s[0:2]); // Исключение!<br>Println(s?[0:2]);
// 12<br>Println(s?[-2::2]); // 135<br>Println(s[2:s.Length]); // 12345</code></p>
</blockquote>
<p>Шаг <span class="auto-style1">step</span> может быть отрицательным. Например:</p>
<p>Шаг <code>step</code> может быть отрицательным. Например:</p>
<blockquote>
<p><code><b>var</b> a := Arr(0,1,2,3,4,5,6);<br>Println(a[5:2:-1]); //
[5,4,3]<br>Println(a[2:5:-1]); // пустой массив<br>
Println(a[a.Length-1:-1:-2]); // [6,4,2,0]</code></p>
</blockquote>
<p>В записи среза выражение <span class="auto-style1">from</span> или выражение
<span class="auto-style1">to</span> могут быть пропущены, в этом случае в срез
попадают все элементы с соответствующей стороны. Если <span class="auto-style1">
step</span>&gt;0, то пропущенный <span class="auto-style1">from</span> полагается
равным индексу первого элемента, пропущенный <span class="auto-style1">to</span>
<p>В записи среза выражение <code>from</code> или выражение
<code>to</code> могут быть пропущены, в этом случае в срез
попадают все элементы с соответствующей стороны. Если <code>
step</code>&gt;0, то пропущенный <code>from</code> полагается
равным индексу первого элемента, пропущенный <code>to</code>
полагается равным индексу последнего элемента + 1. Если
<span class="auto-style1">step</span>&lt;0, то пропущенный
<span class="auto-style1">from</span> полагается равным индексу последнего
элемента, а пропущенный <span class="auto-style1">to</span> - индексу первого
элемента - 1. </p>
<p>Например:</p>
<code>step</code>&lt;0, то пропущенный
<code>from</code> полагается равным индексу последнего
элемента, а пропущенный <code>to</code> - индексу первого
элемента - 1. </p><p>Например:</p>
<blockquote>
<p><code><b>var</b> s := '0123456';<br>Println(s[2:]); // 23456<br>
Println(s[:4]); // 012<br>Println(s[::-1]); // 6543210</code></p>

View file

@ -59,30 +59,25 @@ b=1</code>, то <code>b <b>shl</b> 10=1024</code>, а <code><b>not</b> b=254</c
операции <code>+</code> (объединение), <code>-</code>
(разность) и <code>*</code> (пересечение):</p>
<blockquote>
<p><code><b>var</b> <br>
&nbsp; s1,s2,s: <b>set</b> <b>of</b> byte;<br>
<b>begin<br>
</b>&nbsp; s1:=[1..4];<br>
&nbsp; s2:=[2..5];<br>
&nbsp; s:=s1+s2; // s=[1..5]<br>
&nbsp; s:=s1-s2; // s=[1]<br>
&nbsp; s:=s1*s2; // s=[2..4] </code></p>
<p><code><b>var</b> s1,s2,s: <b>set</b> <b>of</b> byte;<br>
s1 := [1..4];<br>
s2 := [2..5];<br>
s := s1 + s2; // s = [1..5]<br>
s := s1 - s2; // s = [1]<br>
s := s1 * s2; // s = [2..4] </code></p>
</blockquote>
<p>К множествам применимы также операции отношения = (равенство), <code>&lt;&gt;</code>
(неравенство), &lt;= (вложено) и
&gt;= (содержит):</p>
<blockquote>
<p><code><b>var</b> <br>
&nbsp; s1,s2,s: <b>set</b> <b>of</b> byte;<br>
&nbsp; b: boolean;<br>
<b>begin<br>
</b>&nbsp; s1:=[1..4];<br>
&nbsp; s2:=[2..5];<br>
&nbsp; s:=[1,2];&nbsp; <br>
&nbsp; b:=s1=s2; // b=False<br>
&nbsp; b:=s2&lt;&gt;s; // b=True<br>
&nbsp; b:=s&lt;=s2; // b=False<br>
&nbsp; b:=s1&gt;=s; // b=True</code></p>
<p><code><b>var</b> s1,s2,s: <b>set</b> <b>of</b> byte;<br>
s1 := [1..4];<br>
s2 := [2..5];<br>
s := [1,2];&nbsp; <br>
<strong>var </strong>b := s1=s2; // b = False<br>
b := s2 &lt;&gt; s; // b = True<br>
b := s &lt;= s2; // b = False<br>
b := s1 &gt;= s; // b = True</code></p>
</blockquote>
<p>Наконец, операция <code><b>in</b></code>
определяет, принадлежит ли элемент множеству:</p>
@ -113,17 +108,17 @@ b=1</code>, то <code>b <b>shl</b> 10=1024</code>, а <code><b>not</b> b=254</c
Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие
одинаковый приоритет, выполняются слева направо.</p>
<p><b>Таблица приоритетов операций</b></p>
<table border="0" width="444" id="table1">
<table border="0" width="544" id="table1">
<tr>
<td><code>@</code>,
<b><code>not</code></b>,
<code>^</code>, <code>+</code>, <code>-</code> (унарные), <code>new</code>
</td>
<td>1 (наивысший)</td>
<td style="width: 173px">1 (наивысший)</td>
</tr>
<tr>
<td><code>**</code></td>
<td style="width: 142px">2</td>
<td style="width: 173px">2</td>
</tr>
<tr>
<td><code>*</code>,
@ -135,18 +130,18 @@ b=1</code>, то <code>b <b>shl</b> 10=1024</code>, а <code><b>not</b> b=254</c
<code><b>shr</b></code>,
<code><b>as</b></code>,
<code><b>is</b></code></td>
<td>3</td>
<td style="width: 173px">3</td>
</tr>
<tr>
<td><code>+</code>,
<code>-</code> (бинарные),
<code><b>or</b></code>,
<code><b>xor</b></code> </td>
<td>4</td>
<td style="width: 173px">4</td>
</tr>
<tr>
<td><code>..</code></td>
<td>5</td>
<td style="width: 173px">5</td>
</tr>
<tr>
<td><code>=</code>,
@ -156,11 +151,11 @@ b=1</code>, то <code>b <b>shl</b> 10=1024</code>, а <code><b>not</b> b=254</c
<code>&lt;=</code>,
<code>&gt;=</code>,
<code><b>in</b></code></td>
<td>6</td>
<td style="width: 173px">6</td>
</tr>
<tr>
<td><code>?: </code>&nbsp;</td>
<td>7 (низший)</td>
<td style="width: 173px">7 (низший)</td>
</tr>
</table>

View file

@ -49,9 +49,9 @@ Base</code> возвращают <code>True</code>,
<p><code><b>var</b> b: Base;</code></p>
<p><code><b>begin</b><br>
&nbsp; b := new Base;<br>
&nbsp; writeln(b <b>i</b><b>s</b> Derived);<br>
&nbsp; Println(b <b>i</b><b>s</b> Derived);<br>
&nbsp; b := new Derived;<br>
&nbsp; writeln(b <b>i</b><b>s</b> Derived);<br>
&nbsp; Println(b <b>i</b><b>s</b> Derived);<br>
<b>end</b>. </code></p>
</blockquote>
<p>первый раз выводится <code>False</code>,

View file

@ -12,18 +12,18 @@
<p><b>Таблица приоритетов операций</b></p>
<table border="0" width="444" id="table1">
<tr>
<td style="width: 320px"><code>**</code></td>
<td style="width: 360px"><code>**</code></td>
<td width="120">1 (наивысший)</td>
</tr>
<tr>
<td style="width: 320px"><code>@</code>,
<td style="width: 360px"><code>@</code>,
<b><code>not</code></b>,
<code>^</code>, <code>+</code>, <code>-</code> (унарные), <code>new</code>
</td>
<td width="120">2</td>
</tr>
<tr>
<td style="width: 320px"><code>*</code>,
<td style="width: 360px"><code>*</code>,
<code>/</code>,
<code><b>div</b></code>,
<code><b>mod</b></code>,
@ -35,18 +35,18 @@
<td width="120">3</td>
</tr>
<tr>
<td style="width: 320px"><code>+</code>,
<td style="width: 360px"><code>+</code>,
<code>-</code> (бинарные),
<code><b>or</b></code>,
<code><b>xor</b></code> </td>
<td width="120">4</td>
</tr>
<tr>
<td style="width: 320px"><code>..</code></td>
<td style="width: 360px"><code>..</code></td>
<td width="120">5</td>
</tr>
<tr>
<td style="width: 320px"><code>=</code>,
<td style="width: 360px"><code>=</code>,
<code>&lt;&gt;</code>,
<code>&lt;</code>,
<code>&gt;</code>,
@ -56,7 +56,7 @@
<td width="120">6</td>
</tr>
<tr>
<td style="width: 320px"><code>?: </code>&nbsp;</td>
<td style="width: 360px"><code>?: </code>&nbsp;</td>
<td width="120">7 (низший)</td>
</tr>
</table>

View file

@ -17,12 +17,11 @@
<body><H1>Строковые операции</H1>
<p>К <a href="../Types/string.html">строкам</a> применимы все <a href="relop.html">операции сравнения</a> <code>&lt;</code>, <code>&gt;</code>, <code>&lt;=</code>, <code>&gt;=</code>, <code>=</code>, <code>&lt;&gt;</code>.
Сравнение строк на неравенство осуществляется <strong>
лексикографически</strong>: <span class="auto-style2">s1 &lt; s2</span> если для
первого несовпадающего символа с номером i <span class="auto-style2">s1[i]&lt;s2[i]</span>
или все символы строк совпадают, но <span class="auto-style2">s1</span> короче
<span class="auto-style2">s2</span>.
</p>
<p>Кроме этого, к строкам и символам применима операция
лексикографически</strong>: <code>s1 &lt; s2</code> если для
первого несовпадающего символа с номером i <code>s1[i]&lt;s2[i]</code>
или все символы строк совпадают, но <code>s1</code> короче
<code>s2</code>.
</p><p>Кроме этого, к строкам и символам применима операция
конкатенации (слияния) <code>+</code>, ее результат имеет строковый тип.
</p>
<p>Например, <code>'a'+'b'='ab'</code>. </p>

View file

@ -19,7 +19,7 @@
&nbsp; Derived = <b>class</b>(Base) ... <b>end</b>;</code></p>
<p><code><b>var</b> b: Base := new Derived;</code></p>
<p><code><b>begin</b><br>
&nbsp; writeln(b.GetType = <b>typeof</b>(Derived));&nbsp; <br>
&nbsp; Println(b.GetType = <b>typeof</b>(Derived));&nbsp; <br>
<b>end</b>.</code></p>
</blockquote>

View file

@ -49,10 +49,9 @@
<code><b>begin<br>
</b>
<b>&nbsp; var</b> a,b: integer;<br>
&nbsp; <b>var</b> r: real;<br>
&nbsp; readln(a,b);<br>
&nbsp; x := a/b;<br>
&nbsp; writeln(x);<br>
&nbsp; (a,b) := ReadInteger2;<br>
&nbsp; <strong>var </strong>x: real := a/b;<br>
&nbsp; Println(x);<br>
<b>end.</b></code></blockquote>
</body>

View file

@ -24,7 +24,7 @@ exit</H1>
<p><code>flag := False;<br>
<b>for</b> <b>var</b> i:=1 <b>to</b> 10 <b>do</b><br>
<b>begin</b><br>
&nbsp; read(x);<br>
&nbsp; <strong>var</strong> x := ReadInteger;<br>
&nbsp; <b>if</b> x&lt;0 <b>then</b> <b>continue</b>; //
пропуск текущей итерации цикла<br>
&nbsp; <b>if</b> x=5 <b>then</b><br>
@ -51,6 +51,17 @@ exit</H1>
</blockquote>
<p>Вызов <code><b>exit</b></code> в разделе операторов
основной программы приводит к ее немедленному завершению.</p>
<p>Оператор <code><b>exit</b></code> внутри функции может быть вызван с
параметром для немедленного возврата значения из функции:</p>
<blockquote>
<p><code><b>function</b> Analyze(x: integer): boolean;<br>
<b>begin</b><br>
&nbsp; <b>if</b> x&lt;0 <b>then</b> <br>
&nbsp;&nbsp;&nbsp; <b>exit</b>(False)<br>
&nbsp; ...<br>
<b>end</b>;</code></p>
</blockquote>
<p>Более точно, <code><b>break</b></code>, <code><b>continue</b></code>
и <code><b>exit</b></code> в <b>
PascalABC.NET</b> являются операторами вызова специальных внутренних процедур.</p>

View file

@ -84,13 +84,13 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из указанных элементов</td></tr>
<tr><td><code><b>function</b> SeqFill&lt;T&gt;(count: integer; x: T): <b>sequence </b> <b>of</b> T;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из count элементов x</td></tr>
<tr><td><code><b>function</b> SeqGen&lt;T&gt;(count: integer; f: integer-&gt;T): <b>sequence </b> <b>of</b> T;</code>
<tr><td><code><b>function</b> SeqGen&lt;T&gt;(count: integer; f: integer &gt; T): <b>sequence </b> <b>of</b> T;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из count элементов, заполненных значениями f(i)</td></tr>
<tr><td><code><b>function</b> SeqGen&lt;T&gt;(count: integer; f: integer-&gt;T; from: integer): <b>sequence </b> <b>of</b> T;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из count элементов, заполненных значениями f(i), начиная с i=from</td></tr>
<tr><td><code><b>function</b> SeqGen&lt;T&gt;(count: integer; first: T; next: T-&gt;T): <b>sequence </b> <b>of</b> T;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из count элементов, начинающуюся с first, с функцией next перехода от предыдущего к следующему</td></tr>
<tr><td><code><b>function</b> SeqGen&lt;T&gt;(count: integer; first, second: T; next: (T,T) -&gt;T): <b>sequence </b> <b>of</b> T;</code>
<tr><td><code><b>function</b> SeqGen&lt;T&gt;(count: integer; first, second: T; next: (T,T) &gt; T): <b>sequence </b> <b>of</b> T;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из count элементов, начинающуюся с first и second,с функцией next перехода от двух предыдущих к следующему</td></tr>
<tr><td><code><b>function</b> SeqRandom(n: integer := 10; a: integer := 0; b: integer := 100): <b>sequence </b> <b>of</b> integer;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает последовательность из n случайных целых элементов</td></tr>

View file

@ -22,7 +22,7 @@
<p><code><b>procedure</b> PrintTwo(a,b: integer; delim: char
:= ' ');<br>
<b>begin</b><br>
&nbsp; write(a,delim,b);<br>
&nbsp; Write(a,delim,b);<br>
<b>end</b>;</code></p>
<p><code>...<br>
PrintTwo(3,5);<br>

View file

@ -26,7 +26,7 @@
<b>procedure</b> A(i: integer);
<b>begin</b>
...
B(i-1);
B(i - 1);
<b>end</b>;<b>
procedure</b> B(i: integer);
<b>begin</b>

View file

@ -23,7 +23,7 @@
<b>var </b>i: integer;
<b>begin</b>
// к глобальной переменной i внутри процедуры нельзя обратиться
i:=5; // присваивание локальной переменной i; ...
i := 5; // присваивание локальной переменной i; ...
<b>end</b>;</code>
</pre>
</blockquote>

View file

@ -83,7 +83,7 @@
<p><code><b>uses</b> un2,un1;</code></p>
<p><code><b>procedure</b> p(i: integer);<br>
<b>begin</b><br>
&nbsp; write(1);<br>
&nbsp; Print(1);<br>
<b>end</b>;</code></p>
<p><code><b>begin</b><br>
&nbsp; p(2.2);<br>
@ -95,7 +95,7 @@
<p><code><b>unit</b> un2;</code></p>
<p><code><b>procedure</b> p(r: real);<br>
<b>begin</b><br>
&nbsp; write(3);<br>
&nbsp; Print(3);<br>
<b>end</b>;</code></p>
<p><code><b>end</b>.</code></p>
</blockquote>
@ -104,7 +104,7 @@
<p><code><b>unit</b> un1;</code></p>
<p><code><b>procedure</b> p(r: real);<br>
<b>begin</b><br>
&nbsp; write(2);<br>
&nbsp; Print(2);<br>
<b>end</b>;</code></p>
<p><code><b>end</b>.</code></p>
</blockquote>
@ -126,12 +126,12 @@
<blockquote>
<p><code><b>procedure</b> p(i: integer);<br>
<b>begin</b><br>
&nbsp; write(1);<br>
&nbsp; Print(1);<br>
<b>end</b>;</code></p>
<p><code><b>procedure</b> p(<b>params</b> a: <b>array</b> <b>of</b>
integer);<br>
<b>begin</b><br>
&nbsp; write(2);<br>
&nbsp; Print(2);<br>
<b>end</b>;</code></p>
<p><code><b>begin</b><br>
&nbsp; p(1)&nbsp; <br>

View file

@ -38,7 +38,7 @@
<blockquote>
<code><b>procedure</b> PrintSquare(i: integer);<br>
<b>begin</b><br>
&nbsp; writeln(i*i);<br>
&nbsp; Println(i*i);<br>
<b>end</b>;</code></blockquote>
Тогда при вызове <code>PrintSquare(5*a-b)</code> значение <code>5*a-b</code> будет вычислено и присвоено переменной <code>i</code>, после чего
выполнится тело процедуры.<p class="pabcmain">Если параметр передается по ссылке, то при вызове
@ -72,9 +72,9 @@
</b>&nbsp; Person = <b>record</b><br>
&nbsp;&nbsp;&nbsp; name: string;<br>
&nbsp;&nbsp;&nbsp; age,height,weight: integer;<br>
&nbsp; <b>end</b>;</code><p><code><b>procedure</b> Print(<b>const</b> p: Person);<br>
&nbsp; <b>end</b>;</code><p><code><b>procedure</b> PrintPupil(<b>const</b> p: Person);<br>
<b>begin<br>
</b>&nbsp; write(p.name,' ',p.age,' ',p.height,' ',p.weight);<br>
</b>&nbsp; Print(p.name,p.age,p.height,p.weight);<br>
<b>end</b>;</code></p>
<p><code><b>procedure</b> IncAge(<b>var</b> p: Person);<br>
<b>begin</b><br>

View file

@ -12,6 +12,13 @@
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
<link rel="StyleSheet" href="../../default.css">
<style type="text/css">
.auto-style1 {
font-family: Consolas, monospace;
font-size: 12pt;
color: #000080;
}
</style>
</head>
<body>
@ -112,11 +119,35 @@
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := x;<br>
<b>end</b>;</code></p>
<p ><code><strong>begin</strong><br>&nbsp; var a := Seq(1,5,3);<br>&nbsp;
writeln(MinElement(a) + Sum(2,3));<br><strong>end</strong>.</code></p>
<p ><code><strong>begin</strong><br>&nbsp; <strong>var</strong> a := [1,5,3];<br>&nbsp;
Println(MinElement(a) + Sum(2,3));<br><strong>end</strong>.</code></p>
</blockquote>
<p >Если внутри функции не присвоить переменной <code>Result</code> некоторое
значение, то функция вернет в результате своего вызова непредсказуемое значение.</p>
<p >Вместо присваивания Result в теле функции можно вызвать оператор exit с
параметром - это приведет к немедленному выходу из функции и возврату значения:</p>
<blockquote>
<p ><code><b>function</b> Find&lt;T&gt;(a: <b>
array of</b> T; x: T): boolean;<br>
<b>begin</b><br>
&nbsp; <b>foreach</b> <strong>var </strong>y <b>in</b>
a <b>do</b><br>
&nbsp;&nbsp;&nbsp; <b>if</b> y = x <b>then</b>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>exit</strong>(True);<br>&nbsp; Result :=
False;<br>
<b>end</b>;</code></p>
</blockquote>
<p >Функция может возвращать кортеж значений:</p>
<blockquote>
<p ><code><b>function</b> DivMod(a,b: integer): (integer,integer);<br><strong>
begin</strong><br>&nbsp; Result := (a <strong>div </strong>b, a <strong>mod</strong>
b);<br><strong>e</strong></code><span class="auto-style1"><strong>nd</strong>;</span></p>
</blockquote>
<p >При вызове такой функции ее результат обычно распаковывается в переменные</p>
<blockquote>
<p ><code><strong>var</strong> (a,b) := DivMod(7,2);</code></p>
</blockquote>
<h2 >Упрощенный синтаксис описания подпрограмм</h2>
<p >В <span lang="en-us">PascalABC.NET </span>имеется упрощенный синтаксис
описания однооператорных процедур: </p>
@ -129,7 +160,9 @@
</blockquote>
<p >При этом в ряде случаев для возвращаемого значения функции возможен автовывод типов:</p>
<blockquote>
<p ><code><b>function</b> Add(a,b: real)<span lang="en-us"> := </span>a + b;</code></p>
<p ><code><b>function</b> Add(a,b: real)<span lang="en-us"> := </span>a + b;<br><b>function</b>
DivMod(a,b: integer) := (a <strong>div</strong> b, a <strong>mod</strong>
b);</code></p>
</blockquote>
</body>

View file

@ -45,13 +45,13 @@
<p>Данный способ хорош тем, что позволяет совместить описание массива и
выделение под него памяти:</p>
<blockquote>
<p><code><b>var</b> <br>&nbsp; a: <b>array of</b> integer := new integer[5];<br>
&nbsp; b: <b>array</b> [,] <b>of</b> real := new real[4,3]; </code></p>
<p><code><b>var</b> a: <b>array of</b> integer := new integer[5];<br>
<b>var</b> b: <b>array</b> [,] <b>of</b> real := new real[4,3]; </code></p>
</blockquote>
<p>Описание типа можно при этом опускать - тип автовыводится:</p>
<blockquote>
<p><code><b>var</b> <br>&nbsp; a := new integer[5];<br>
&nbsp; b := new real[4,3]; </code></p>
<p><code><b>var</b> a := new integer[5];<br>
<b>var</b> b := new real[4,3]; </code></p>
</blockquote>
<p>Второй способ выделения памяти под динамический массив использует стандартную процедуру <code>SetLength</code>: </p>
<blockquote>
@ -62,6 +62,15 @@
<p>Процедура <code>SetLength</code> обладает тем преимуществом, что при ее
повторном вызове старое содержимое массива сохраняется.</p>
<h2>Инициализация динамического массива</h2>
<p>Проще всего инициализировать динамический массив, используя инициализатор []
- при этом выделяется память:</p>
<blockquote>
<p><code><strong>var</strong> a := [1,3,5,7,9];</code></p>
</blockquote>
<p>Инициализатор при использовании различных типов выбирает самый общий тип:</p>
<blockquote>
<p><code>[1,3.4,5]; // array of real<br>['a','','fgh'] // array of string</code></p>
</blockquote>
<p>Можно инициализировать динамический массив при выделении под него память
операцией new:</p>
<blockquote>
@ -81,7 +90,7 @@
<p>При этом происходит выделение памяти под указанное справа количество
элементов. </p>
<p>Инициализация одномерного массива проще всего осуществляется стандартными
функциями Seq..., которые выделяют память нужного размера и заполняют массив
функциями Arr..., которые выделяют память нужного размера и заполняют массив
указанными значениями:</p>
<blockquote>
<p><code><strong>var</strong> a := Arr(1,3,5,7,8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -115,21 +124,21 @@
<p>После выделения памяти ввод динамического массива можно осуществлять
традиционно в цикле:</p>
<blockquote><code><strong>for var</strong> i:=0 <strong>to</strong> a.Length-1
<strong>do</strong><br>&nbsp; read(a[i]);</code></blockquote>
<strong>do</strong><br>&nbsp; Read(a[i]);</code></blockquote>
<p>Ввод динамического массива можно осуществлять
с помощью стандартной функции ReadArrInteger:</p>
<blockquote><code><strong>var</strong> a := ReadArrInteger(10);</code></blockquote>
<p>При этом под динамический массив выделяется память нужного размера.</p>
<h2>Вывод динамического массива</h2>
<p>Процедура write выводит динамический массив, заключая элементы в квадратные
<p>Процедура Write выводит динамический массив, заключая элементы в квадратные
скобки и разделяя их запятыми:</p>
<blockquote><code><strong>var </strong> a := Arr(1,3,5,7,9);<strong><br></strong>
writeln(a); // [1,3,5,7,9] </code>&nbsp;<span class="auto-style2"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<blockquote><code><strong>var </strong> a := Arr(1,3,5,7,9);<strong><br></strong>
Writeln(a); // [1,3,5,7,9] </code>&nbsp;<span class="auto-style2"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</font></span></blockquote>
<p>n-мерный динамический массив выводится так, что каждая размерность
заключается в квадратные скобки:.</p>
<blockquote><code><strong>var </strong> m := new integer[3,3]
((1,2,3),(4,5,6),(7,8,9));<strong><br></strong>writeln(m); //
((1,2,3),(4,5,6),(7,8,9));<strong><br></strong>Writeln(m); //
[[1,2,3],[4,5,6],[7,8,9]] </code></blockquote>
<p>Динамический массив можно выводить также методом расширения Print или
Println:</p>

View file

@ -57,14 +57,21 @@
&nbsp; bs: ByteSet := [1,3,5,20..25];<br>
&nbsp; fios: StringSet := ['Иванов','Петров','Сидорова'];</code></p>
</blockquote>
<p>Начиная с версии PascalABC.NET 3.10, при создании множества с помощью [] надо
обязательно указывать тип переменной. Если этого не сделать , то по умолчанию
типом конструкции в [] будет массив:</p>
<blockquote>
<p><code><strong>var </strong>s: set of integer := [1,2,3];<br><strong>var</strong>
a := [1,2,3]; // array of integer</code></p>
</blockquote>
<p>Значения в списке могут отсутствовать, тогда множество является пустым:</p>
<blockquote>
<p><code>bs:=[];</code></p>
</blockquote>
<p>Пустое множество-константа <code>[]</code> совместимо по присваиванию с множеством любого типа.
Однако тип пустого множества-константы не выводится автоматически: </p>
<p>Константа <code>[]</code> совместима по присваиванию с множеством любого типа.
Однако тип [] не выводится автоматически: </p>
<blockquote>
<p><code><strong>var</strong> bs:=[]; // Ошибка!</code></p>
<p><code><strong>var</strong> s: <strong>set of</strong> integer := [];<strong><br>var</strong> bs:=[]; // Ошибка!</code></p>
</blockquote>
<p>Множество, задаваемое конструктором множества, может иметь элементы различных
типов, например:</p>

View file

@ -31,11 +31,11 @@
&nbsp;&nbsp;Count = 10;<br>
&nbsp; Name = 'Mike';<br>
&nbsp; DigitsSet = ['0'..'9'];<br>
&nbsp; Arr: <b>array</b> [1..5] <b>of</b> <b>integer</b> = (1,3,5,7,9);<br>
&nbsp; Arr: <b>array</b> <b>of</b> <b>integer</b> = (1,3,5,7,9);<br>
&nbsp; Rec: <b>record</b> name: <b>string</b>;
age: integer <b>end</b> = (name: 'Иванов';
age: 23);<br>
&nbsp; Arr2: <b>array</b> [1..2,1..2] <b>of</b>
&nbsp; Arr2: <b>array</b> <b>of</b>
real = ((1,2),(3,4));</code></p>
</blockquote>
<p>&nbsp;</p>

View file

@ -68,11 +68,10 @@ uses</strong></span>, каждая из которых
<code><b>program</b> MyProgram;<br>
<b>var</b> <br>
&nbsp; a,b: integer;<br>
&nbsp; x: real;<br>
<b>begin<br>
</b>&nbsp; readln(a,b);<br>
&nbsp; x := a/b;<br>
&nbsp; writeln(x);<br>
</b>&nbsp; (a,b) := ReadInteger2;<br>
<strong>&nbsp; var </strong>x := a/b;<br>
&nbsp; Println(x);<br>
<b>end</b>.</code></blockquote>
<p>или</p>
<blockquote>
@ -81,6 +80,16 @@ uses</strong></span>, каждая из которых
</b>&nbsp; <strong>var</strong> x := 100;<br>&nbsp; <strong>var</strong> y :=
100;<br>&nbsp; <strong>var</strong> r := 50;<br>&nbsp; Circle(x,y,r);<br>
<b>end</b>.</code></blockquote>
<p>Глобальные описания переменных до begin основной программы в основном
используются редко и считаются устаревшим стилем. Глобальные описания переменных
могут использоваться в учебных программах, в которых несколько процедур
используют эти переменные:</p>
<blockquote>
<code><b>uses</b> GraphWPF;<br><br><strong>var</strong> x: integer;<br><br>
<strong>procedure</strong> Draw := Circle(x,300,5);<br><br>
<b>begin<br>
</b>&nbsp; x := 100;<br>&nbsp; Draw;<br>
<b>end</b>.</code></blockquote>
<p>Кроме того, имеется возможность записывать программы без внешнего begin-end.
Для этого в начале программы используется префикc ##:</p>
<blockquote>
@ -91,16 +100,10 @@ uses</strong></span>, каждая из которых
секцию uses и описывать процедуры и функции:</p>
<blockquote>
<code>
<div class="language-pascal highlighter-rouge">
<div class="highlight">
<pre class="highlight"><span class="p">##
<strong>uses</strong> GraphWPF;</span>
<span class="k"><strong>function</strong></span> <span class="n">Draw</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> real<span class="p">)</span> <span class="p">:=</span> Circle(x,y,5)<span class="p">;</span>
<span class="p">Draw(100,100);</span></pre>
</div>
</div>
</code></blockquote>
<p>&nbsp;</p>
<span class="p">##<br>
<strong>uses</strong> GraphWPF;</span><br>
<span class="k"><strong>function</strong></span> <span class="n">Draw</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> real<span class="p">)</span> <span class="p">:=</span> Circle(x,y,5)<span class="p">;</span><br>
<span class="p">Draw(100,100);</span></code></blockquote>
</body>
</html>

View file

@ -39,10 +39,10 @@
конструкции. Так, следующий код корректен: </p>
<blockquote>
<p><code><b>var </b>a: <b>array of</b> integer := (3,5,7);<b><br>
for</b> i: integer := 1 <b>to</b> 9 <b>do</b> <br>
&nbsp; write(a[i]); <br>
<b>foreach</b> i: integer <b>in</b> a <b>do</b> <br>
&nbsp; write(i);</code></p>
for</b> <strong>var </strong>i := 1 <b>to</b> 9 <b>do</b> <br>
&nbsp; Print(a[i]); <br>
<b>foreach</b> <strong>var </strong>i <b>in</b> a <b>do</b> <br>
&nbsp; Print(i);</code></p>
</blockquote>
<p>
Идентификатор с тем же именем, определенный во вложенном пространстве имен, <i>скрывает</i>
@ -75,14 +75,14 @@
<a href="../Classes/inherited.html">inherited</a></code></b>:</p>
<blockquote>
<p><code><b>type</b><br>
&nbsp; A=<b>class</b><br>
&nbsp; A =<b> class</b><br>
&nbsp;&nbsp;&nbsp; i: integer;<br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> p;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i := 5;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;<br>
&nbsp; B=<b>class</b>(A)<br>
&nbsp; B =<b> class</b>(A)<br>
&nbsp;&nbsp;&nbsp; i: integer;<br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> p;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>

View file

@ -68,7 +68,7 @@
<p>Распаковка кортежа в переменные часто используется при возвращении функцией
кортежа:</p>
<blockquote>
<code><strong>function</strong> SP(a,b: real) := (a*b,2*(a+b)); </code>&nbsp;<br>
<code><strong>function</strong> SP(a,b: real) := (a*b, 2*(a+b)); </code>&nbsp;<br>
...<br>
<code><strong>var</strong> (S,P) := SP(2,3); </code>
</blockquote>

File diff suppressed because it is too large Load diff

View file

@ -521,7 +521,15 @@ namespace Languages.Pascal.Frontend.Core
}
expr.source_context.begin_position.line_num = str.source_context.begin_position.line_num;
expr.source_context.end_position.line_num = str.source_context.end_position.line_num;
mc.parameters.Add(expr);
method_call applyO2S = new method_call();
applyO2S.dereferencing_value = new ident("__ApplyO2S", expr.source_context);
applyO2S.parameters = new expression_list();
applyO2S.parameters.Add(expr);
applyO2S.source_context = expr.source_context;
//mc.parameters.Add(expr);
mc.parameters.Add(applyO2S); // добавляем обернутое выражение
}
mc.source_context = str.source_context;

View file

@ -1 +1 @@
3.11.0.3693
3.11.0.3699

View file

@ -1 +1 @@
!define VERSION '3.11.0.3693'
!define VERSION '3.11.0.3699'

View file

@ -72,6 +72,9 @@ const
AllDelimiters = ' <>=^`|~$№§!"#%&''()*,+-./:;?@[\]_{}«­·»'#9#10#13;
//{{{--doc: Конец секции стандартных констант для документации }}}
// Внутренняя функция для интерполированных строк
///--
function __ApplyO2S(obj: object): object;
///--
const
@ -2437,6 +2440,7 @@ function CommandLineArgs: array of string;
/// Преобразует объект в строковое представление
function ObjectToString(obj: object): string;
// -----------------------------------------------------
//>> Подпрограммы для работы с динамическими массивами # Subroutines for array of T
// -----------------------------------------------------
@ -2561,14 +2565,14 @@ function SeqRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100):
/// Возвращает последовательность из n случайных вещественных элементов
function SeqRandomReal(n: integer := 10; a: real := 0; b: real := 10; digits: integer := 1): sequence of real;
/// Возвращает последовательность из count элементов, заполненных значениями f(i)
function SeqGen<T>(count: integer; f: integer->T): sequence of T;
function SeqGen<T>(count: integer; f: integer T): sequence of T;
/// Возвращает последовательность из count элементов, заполненных значениями f(i), начиная с i=from
function SeqGen<T>(count: integer; f: integer->T; from: integer): sequence of T;
/// Возвращает последовательность из count элементов, начинающуюся с first, с функцией next перехода от предыдущего к следующему
function SeqGen<T>(count: integer; first: T; next: T->T): sequence of T;
/// Возвращает последовательность из count элементов, начинающуюся с first и second,
///с функцией next перехода от двух предыдущих к следующему
function SeqGen<T>(count: integer; first, second: T; next: (T,T) ->T): sequence of T;
function SeqGen<T>(count: integer; first, second: T; next: (T,T) T): sequence of T;
/// Возвращает последовательность элементов с начальным значением first,
///функцией next перехода от предыдущего к следующему и условием pred продолжения последовательности
function SeqWhile<T>(first: T; next: T->T; pred: T->boolean): sequence of T;
@ -5067,6 +5071,13 @@ begin
Result := res.ToString;
end;
function __ApplyO2S(obj: object): object;
begin
if obj is System.IFormattable then
Result := obj
else Result := ObjectToString(obj);
end;
function NumberFormat(DecimalSeparator: string; GroupSeparator: string): NumberFormatInfo;
begin
var nfi := new NumberFormatInfo;

View file

@ -2,5 +2,5 @@
begin
var s := $'{f1} {0}';
assert(s = 'formatstring8.$delegate0 0');
assert(s = 'function f1(b: byte): integer 0');
end.

View file

@ -72,6 +72,9 @@ const
AllDelimiters = ' <>=^`|~$№§!"#%&''()*,+-./:;?@[\]_{}«­·»'#9#10#13;
//{{{--doc: Конец секции стандартных констант для документации }}}
// Внутренняя функция для интерполированных строк
///--
function __ApplyO2S(obj: object): object;
///--
const
@ -2437,6 +2440,7 @@ function CommandLineArgs: array of string;
/// Преобразует объект в строковое представление
function ObjectToString(obj: object): string;
// -----------------------------------------------------
//>> Подпрограммы для работы с динамическими массивами # Subroutines for array of T
// -----------------------------------------------------
@ -2561,14 +2565,14 @@ function SeqRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100):
/// Возвращает последовательность из n случайных вещественных элементов
function SeqRandomReal(n: integer := 10; a: real := 0; b: real := 10; digits: integer := 1): sequence of real;
/// Возвращает последовательность из count элементов, заполненных значениями f(i)
function SeqGen<T>(count: integer; f: integer->T): sequence of T;
function SeqGen<T>(count: integer; f: integer T): sequence of T;
/// Возвращает последовательность из count элементов, заполненных значениями f(i), начиная с i=from
function SeqGen<T>(count: integer; f: integer->T; from: integer): sequence of T;
/// Возвращает последовательность из count элементов, начинающуюся с first, с функцией next перехода от предыдущего к следующему
function SeqGen<T>(count: integer; first: T; next: T->T): sequence of T;
/// Возвращает последовательность из count элементов, начинающуюся с first и second,
///с функцией next перехода от двух предыдущих к следующему
function SeqGen<T>(count: integer; first, second: T; next: (T,T) ->T): sequence of T;
function SeqGen<T>(count: integer; first, second: T; next: (T,T) T): sequence of T;
/// Возвращает последовательность элементов с начальным значением first,
///функцией next перехода от предыдущего к следующему и условием pred продолжения последовательности
function SeqWhile<T>(first: T; next: T->T; pred: T->boolean): sequence of T;
@ -5067,6 +5071,13 @@ begin
Result := res.ToString;
end;
function __ApplyO2S(obj: object): object;
begin
if obj is System.IFormattable then
Result := obj
else Result := ObjectToString(obj);
end;
function NumberFormat(DecimalSeparator: string; GroupSeparator: string): NumberFormatInfo;
begin
var nfi := new NumberFormatInfo;

Binary file not shown.