Новые версии PT4.pas и pt4pabc.dll

This commit is contained in:
Mikhail Abramyan 2018-08-30 21:02:25 +04:00
parent fd1f257d68
commit 3720c90d15
5 changed files with 1557 additions and 249 deletions

Binary file not shown.

View file

@ -3,14 +3,14 @@ unit PT4;
//------------------------------------------------------------------------------
// Модуль для подключения задачника Programming Taskbook
// Версия 4.15
// Copyright (©) 2006-2008 DarkStar, SSM
// Copyright (©) 2010 М.Э.Абрамян, дополнения к версии 1.3
// Copyright (©) 2014-2015 М.Э.Абрамян, дополнения к версии 4.13
// Copyright (©) 2015 М.Э.Абрамян, дополнения к версии 4.14
// Copyright (©) 2016 М.Э.Абрамян, дополнения к версии 4.15
// Copyright (©) 2017 М.Э.Абрамян, дополнения к версии 4.17
// Copyright (©) 2018 М.Э.Абрамян, дополнения к версии 4.18
// Версия 4.18
// Copyright © 2006-2008 DarkStar, SSM
// Copyright © 2010 М.Э.Абрамян, дополнения к версии 1.3
// Copyright © 2014-2015 М.Э.Абрамян, дополнения к версии 4.13
// Copyright © 2015 М.Э.Абрамян, дополнения к версии 4.14
// Copyright © 2016 М.Э.Абрамян, дополнения к версии 4.15
// Copyright © 2017 М.Э.Абрамян, дополнения к версии 4.17
// Copyright © 2018 М.Э.Абрамян, дополнения к версии 4.18
// Электронный задачник Programming Taskbook Copyright (c)М.Э.Абрамян, 1998-2018
//------------------------------------------------------------------------------
@ -409,8 +409,27 @@ procedure __FinalizeModule__;
// == Версия 1.3. Дополнения ==
/// Выводит строку S в разделе отладки окна задачника
procedure Show(S: string);
// == Версия 4.18. Изменения ==
(*
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: real);
/// Выводит строку S в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(S: string);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: integer);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: real);
/// Выводит число A с комментарием S в разделе отладки
/// окна задачника; для вывода числа отводится W экранных позиций
@ -434,20 +453,6 @@ procedure Show(A: integer; W: integer);
/// для вывода отводится W экранных позиций
procedure Show(A: real; W: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: real);
/// Выполняет переход на новую экранную строку
/// в разделе отладки окна задачника
procedure ShowLine;
/// Выводит строку S в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(S: string);
/// Выводит число A с комментарием S в разделе отладки
/// окна задачника; для вывода числа отводится W экранных позиций.
/// После вывода данных выполняет переход на новую экранную строку
@ -476,13 +481,37 @@ procedure ShowLine(A: integer; W: integer);
/// После вывода числа выполняет переход на новую экранную строку
procedure ShowLine(A: real; W: integer);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: integer);
*)
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: real);
/// Выводит строку S в разделе отладки окна задачника
procedure Show(S: string);
/// Выводит набор данных в разделе отладки окна задачника.
/// Вещественные числа выводятся в формате, настроенном
/// с помощью функции SetPrecision (по умолчанию 2 дробных знака).
/// Если аргументом является последовательность, то после вывода
/// ее элементов выполняется автоматический переход на новую строку.
procedure Show(params args: array of object);
/// Выполняет переход на новую экранную строку
/// в разделе отладки окна задачника
procedure ShowLine;
/// Выводит набор данных в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку.
/// Вещественные числа выводятся в формате, настроенном
/// с помощью функции SetPrecision (по умолчанию 2 дробных знака).
/// Если аргументом является последовательность, то после вывода
/// ее элементов выполняется автоматический переход на новую строку.
procedure ShowLine(params args: array of object);
/// Задает ширину W области вывода для числовых и строковых данных
/// в разделе отладки. Влияет на последующие вызовы функций
/// Show и ShowLine.
procedure SetWidth(W: Integer);
// == Версия 4.18. Конец изменений ==
/// Настраивает формат вывода вещественных чисел в разделе отладки
/// окна задачника. Если N > 0, то число выводится в формате
@ -547,10 +576,10 @@ function ReadArrReal(): array of real;
/// и возвращает введенный набор в виде массива
function ReadArrString(): array of string;
/// Вводит целую матрицу размера m на n по строкам
/// Вводит целочисленную матрицу размера m на n по строкам
function ReadMatrInteger(m,n: integer): array [,] of integer;
/// Вводит размеры матрицы и затем целую матрицу указанных размеров по строкам
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
function ReadMatrInteger(): array [,] of integer;
/// Вводит вещественную матрицу размера m на n по строкам
@ -559,7 +588,7 @@ function ReadMatrReal(m,n: integer): array [,] of real;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
function ReadMatrReal(): array [,] of real;
/// Вводит матрицу из строк размера m на n по строкам
/// Вводит строковую матрицу размера m на n по строкам
function ReadMatrString(m,n: integer): array [,] of string;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
@ -601,6 +630,90 @@ procedure ReadMatr(var m: integer; var a: List<List<real>>);
procedure ReadMatr(var m: integer; var a: List<List<string>>);
// == Изменения в версии 4.18
/// Вводит квадратную целочисленную матрицу порядка m по строкам
function ReadMatrInteger(m: integer): array [,] of integer;
/// Вводит квадратную вещественную матрицу порядка m по строкам
function ReadMatrReal(m: integer): array [,] of real;
/// Вводит квадратную строковую матрицу порядка m по строкам
function ReadMatrString(m: integer): array [,] of string;
/// Вводит размер набора целых чисел и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListInteger(): List<integer>;
/// Вводит размер набора вещественных чисел и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListReal(): List<real>;
/// Вводит размер набора строк и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListString(): List<string>;
/// Вводит n целых чисел
/// и возвращает введенные числа в виде списка List
function ReadListInteger(n: integer): List<integer>;
/// Вводит n вещественных чисел
/// и возвращает введенные числа в виде списка List
function ReadListReal(n: integer): List<real>;
/// Вводит n строк
/// и возвращает введенные строки в виде списка List
function ReadListString(n: integer): List<string>;
/// Вводит целочисленную матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(m,n: integer): array of array of integer;
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(): array of array of integer;
/// Вводит вещественную матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(m,n: integer): array of array of real;
/// Вводит квадратную целочисленную матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(m: integer): array of array of integer;
/// Вводит квадратную вещественную матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(m: integer): array of array of real;
/// Вводит квадратную строковую матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(m: integer): array of array of string;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(): array of array of real;
/// Вводит строковую матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(m,n: integer): array of array of string;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(): array of array of string;
/// Вводит целочисленную матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(m,n: integer): List<List<integer>>;
/// Вводит квадратную целочисленную матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(m: integer): List<List<integer>>;
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(): List<List<integer>>;
/// Вводит вещественную матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(m,n: integer): List<List<real>>;
/// Вводит квадратную вещественную матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(m: integer): List<List<real>>;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(): List<List<real>>;
/// Вводит строковую матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(m,n: integer): List<List<string>>;
/// Вводит квадратную строковую матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(m: integer): List<List<string>>;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(): List<List<string>>;
(*
procedure WriteMatr<T>(a: array[,] of T);
procedure WriteMatr<T>(a: array of array of T);
@ -608,27 +721,25 @@ procedure WriteMatr<T>(a: array of array of T);
procedure WriteMatr<T>(a: List<List<T>>);
// == Дополнения 2016.07
procedure PrintMatr<T>(a: array[,] of T);
procedure PrintMatr<T>(a: array of array of T);
procedure PrintMatr<T>(a: List<List<T>>);
// == Конец дополнений 2016.07
*)
// == Конец изменений в версии 4.18
// == Конец дополнений к версии 4.14 ==
// == Версия 4.18. Дополнения ==
type IPT4Printable = interface
end;
// == Версия 4.18. Конец дополнений ==
implementation
// == Версия 4.18. Дополнения ==
uses ABCDatabases;
// == Версия 4.18. Конец дополнений ==
const
NotSupportedReadTypeMessage = 'Ввод данных типа {0} не поддерживается';
NotSupportedWriteTypeMessage = 'Вывод данных типа {0} не поддерживается';
@ -1803,10 +1914,14 @@ begin
end
// == Версия 4.17. Конец дополнений ==
// == Версия 4.18. Дополнения ==
else if args[i] is IPT4Printable then
PutString(args[i].ToString)
else
begin
var res := PrintAttributeString(args[i]);
if res <> nil then
PutString(res)
else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString);
end
// == Версия 4.18. Конец дополнений ==
else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString);
end;
procedure PT4_ExecuteBeforeProcessTerminateIn__Mode(e: Exception);
@ -1898,8 +2013,57 @@ end;
var
D: integer := 2;
procedure Show(s: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'show';
var
_Width: integer := 0;
procedure ShowStr(s: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'show';
procedure Show(s: string);
begin
ShowStr(s.PadRight(_Width));
end;
procedure Show(s: char);
begin
ShowStr(s.ToString);
end;
procedure Show(A: Real);
begin
ShowStr((D > 0 ? string.Format('{0,'+_Width+':f'+D+'}', a)
: (D = 0 ? string.Format('{0,'+_Width+':e}', a)
: string.Format('{0,'+_Width+':e'+(-D)+'}', a))).Replace(',','.'));
end;
procedure Show(A: Integer);
begin
ShowStr(A.ToString.PadLeft(_Width));
end;
procedure ShowLine;
begin
Show(#13);
end;
procedure ShowLine(S: string);
begin
Show(S);
ShowLine;
end;
procedure ShowLine(A: Real);
begin
Show(A);
ShowLine;
end;
procedure ShowLine(A: Integer);
begin
Show(A);
ShowLine;
end;
(*
procedure Show(S: string; A: Integer; W: Integer);
var s0: string;
begin
@ -2001,9 +2165,169 @@ end;
procedure ShowLine(A: Real);
begin
Show('', A, 0);
Show(A);
Show(#13);
end;
*)
// == Версия 4.18. Дополнения ==
var LineBreak := false;
procedure ShowArray(a: System.Array; indexes: array of integer; i: integer); forward;
var spaces := 0;
procedure Show(params args: array of object);
begin
// SHowStr('!!!!');
var b := false;
for var i:=0 to args.length-1 do
begin
if args[i] = nil then Show('nil') else
if args[i] is integer then Show(integer(args[i])) else
if args[i] is shortint then ShowStr(shortint(args[i]).ToString.PadLeft(_Width)) else
if args[i] is smallint then ShowStr(smallint(args[i]).ToString.PadLeft(_Width)) else
if args[i] is int64 then ShowStr(int64(args[i]).ToString.PadLeft(_Width)) else
if args[i] is byte then ShowStr(byte(args[i]).ToString.PadLeft(_Width)) else
if args[i] is word then ShowStr(word(args[i]).ToString.PadLeft(_Width)) else
if args[i] is longword then ShowStr(longword(args[i]).ToString.PadLeft(_Width)) else
if args[i] is uint64 then ShowStr(uint64(args[i]).ToString.PadLeft(_Width)) else
if args[i] is real then Show(real(args[i])) else
if args[i] is char then Show(char(args[i])) else
if args[i] is string then Show(string(args[i])) else
if args[i] is boolean then Show(boolean(args[i]).ToString) else
if args[i] is Node then Show('Node') else
if args[i] is PointerOutput then
begin
var ip := IntPtr(PointerOutput(args[i]).p);
ShowStr(ip.ToString.PadLeft(_Width));
end
else if args[i].GetType.FullName.StartsWith('System.Tuple') then
begin
LineBreak := false;
Show('(');
foreach var e in args[i].GetType.GetProperties do
begin
if b then
Show(',')
else
b := true;
Show(e.GetValue(args[i],nil));
end;
Show(')');
b := false;
end
else if args[i].GetType.Name.StartsWith('KeyValuePair') then
begin
LineBreak := false;
Show('(');
foreach var e in args[i].GetType.GetProperties do
begin
if b then
Show(':')
else
b := true;
Show(e.GetValue(args[i],nil));
end;
Show(')');
b := false;
end
else if args[i] is System.Array then
begin
var a := args[i] as System.Array;
ShowArray(a, new integer[a.Rank], 0);
end
else if args[i] is IEnumerable then
begin
var isdictorset := args[i].GetType.Name.Equals('Dictionary`2') or args[i].GetType.Name.Equals('SortedDictionary`2')
or (args[i].GetType = typeof(TypedSet)) or args[i].GetType.Name.Equals('HashSet`1')
or args[i].GetType.Name.Equals('SortedSet`1');
var (lbr, rbr) := isdictorset ? ('{', '}') : ('[', ']');
if LineBreak then
loop spaces do
Show(' ');
Show(lbr);
LineBreak := false;
var e := (args[i] as IEnumerable).GetEnumerator;
while e.MoveNext do
begin
if b then
begin
if not LineBreak then
Show(',');
end
else
b := true;
spaces += 1;
Show(e.Current);
spaces -= 1;
end;
if LineBreak then
loop spaces do
Show(' ');
Show(rbr);
Show(#13);
LineBreak := true;
b := false;
end
else
begin
var res := PrintAttributeString(args[i]);
if res <> nil then
Show(res)
else
Show(args[i].ToString);
end;
end;
end;
procedure ShowArray(a: System.Array; indexes: array of integer; i: integer);
begin
if i = a.Rank then
Show(a.GetValue(indexes))
else
begin
if LineBreak then
loop spaces do
Show(' ');
Show('[');
LineBreak := false;
for var k := 0 to a.GetLength(i) - 1 do
begin
indexes[i] := k;
spaces += 1;
ShowArray(a, indexes, i + 1);
spaces -= 1;
if k < a.GetLength(i) - 1 then
if not LineBreak then
Show({LineBreak ? ' ' : }',');
end;
if LineBreak then
loop spaces do
Show(' ');
Show(']');
Show(#13);
LineBreak := true;
end;
end;
procedure ShowLine(params args: array of object);
begin
LineBreak := false;
Show(args);
if not LineBreak then
ShowLine;
end;
procedure SetWidth(W: Integer);
begin
if W >= 0 then
_Width := W;
end;
// == Конец дополнений к версии 4.18 ==
procedure HideTask; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'hidetask';
@ -2268,6 +2592,121 @@ begin
a.Add(ReadSeqString(m).ToList);
end;
// == Версия 4.18. Дополнения ==
function ReadMatrInteger(m: integer): array [,] of integer;
begin
result := ReadMatrInteger(m,m);
end;
function ReadMatrReal(m: integer): array [,] of real;
begin
result := ReadMatrReal(m,m);
end;
function ReadMatrString(m: integer): array [,] of string;
begin
result := ReadMatrString(m,m);
end;
function ReadArrArrInteger(m, n: integer): array of array of integer;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrInteger(n);
end;
function ReadArrArrReal(m, n: integer): array of array of real;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrReal(n);
end;
function ReadArrArrString(m, n: integer): array of array of string;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrString(n);
end;
function ReadArrArrInteger(m: integer): array of array of integer := ReadArrArrInteger(m, m);
function ReadArrArrReal(m: integer): array of array of real := ReadArrArrReal(m, m);
function ReadArrArrString(m: integer): array of array of string := ReadArrArrString(m, m);
function ReadArrArrInteger: array of array of integer;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrInteger(m, n);
end;
function ReadArrArrReal: array of array of real;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrReal(m, n);
end;
function ReadArrArrString: array of array of string;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrString(m, n);
end;
function ReadListInteger(n: integer): List<integer> := Range(1, n).Select(e -> GetInteger()).ToList();
function ReadListReal(n: integer): List<real> := Range(1, n).Select(e -> GetReal()).ToList();
function ReadListString(n: integer): List<string> := Range(1, n).Select(e -> GetString()).ToList();
function ReadListInteger: List<integer> := ReadListInteger(ReadInteger);
function ReadListReal: List<real> := ReadListReal(ReadInteger);
function ReadListString: List<string> := ReadListString(ReadInteger);
function ReadListListInteger(m, n: integer): List<List<integer>>;
begin
result := new List<List<integer>>(m);
loop m do
result.Add(ReadListInteger(n));
end;
function ReadListListReal(m, n: integer): List<List<real>>;
begin
result := new List<List<real>>(m);
loop m do
result.Add(ReadListReal(n));
end;
function ReadListListString(m, n: integer): List<List<string>>;
begin
result := new List<List<string>>(m);
loop m do
result.Add(ReadListString(n));
end;
function ReadListListInteger(m: integer): List<List<integer>> := ReadListListInteger(m, m);
function ReadListListReal(m: integer): List<List<real>> := ReadListListReal(m, m);
function ReadListListString(m: integer): List<List<string>> := ReadListListString(m, m);
function ReadListListInteger: List<List<integer>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListInteger(m, n);
end;
function ReadListListReal: List<List<real>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListReal(m, n);
end;
function ReadListListString: List<List<string>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListString(m, n);
end;
// == Конец дополнений к версии 4.18 ==
procedure WriteMatr<T>(a: array[,] of T);
begin
for var i := 0 to a.GetLength(0)-1 do
@ -2295,7 +2734,7 @@ begin
var b := self.ToArray();
PT4.Put(b.Length);
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы последовательности
@ -2303,14 +2742,14 @@ procedure Write<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы динамического массива
procedure Write<T>(self: array of T); extensionmethod;
begin
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы матрицы
@ -2318,10 +2757,12 @@ procedure Write<T>(self: array [,] of T); extensionmethod;
begin
for var i:=0 to self.GetLength(0)-1 do
for var j:=0 to self.GetLength(1)-1 do
PT4.Put(self[i,j]);
PT4.Write(self[i,j]);
end;
// == Дополнения 2016.07
(*
// == Удалено в версии 4.18
procedure PrintMatr<T>(a: array[,] of T);
begin
@ -2343,14 +2784,14 @@ begin
for var j := 0 to a[i].Count-1 do
write(a[i][j]);
end;
*)
/// Выводит размер и элементы последовательности
procedure PrintAll<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
PT4.Put(b.Length);
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит размер и элементы динамического массива
@ -2358,7 +2799,7 @@ procedure PrintAll<T>(self: array of T); extensionmethod;
begin
PT4.Put(self.Length);
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит размер и элементы динамического массива
@ -2366,7 +2807,7 @@ procedure WriteAll<T>(self: array of T); extensionmethod;
begin
PT4.Put(self.Length);
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы последовательности
@ -2374,14 +2815,14 @@ procedure Writeln<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы динамического массива
procedure Writeln<T>(self: array of T); extensionmethod;
begin
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы матрицы
@ -2389,7 +2830,7 @@ procedure Writeln<T>(self: array [,] of T); extensionmethod;
begin
for var i:=0 to self.GetLength(0)-1 do
for var j:=0 to self.GetLength(1)-1 do
PT4.Put(self[i,j]);
PT4.Write(self[i,j]);
end;
// == Конец дополнений 2016.07
@ -2398,53 +2839,48 @@ end;
/// Выводит в разделе отладки окна задачника
/// комментарий cmt, размер последовательности и значения,
/// полученные из элементов последовательности
/// с помощью указанного лямбда-выражения
function Show<TSource>(self: sequence of TSource; cmt: string; selector: System.Func<TSource, string>): sequence of TSource; extensionmethod;
/// с помощью указанного лямбда-выражения.
/// После этого переходит на новую экранную строку.
function Show<TSource>(self: sequence of TSource; cmt: string; selector: System.Func<TSource, object>): sequence of TSource; extensionmethod;
begin
var b := self.Select(selector).ToArray();
PT4.Show(cmt);
PT4.Show((b.Length + ':').PadLeft(3));
foreach var e in b do
PT4.Show(e);
PT4.ShowLine();
var b := self.Select(selector);//.ToArray();
if cmt <> '' then
PT4.Show(cmt);
PT4.Show((b.Count + ':').PadLeft(3));
// foreach var e in b do
PT4.Show(b);
if not LineBreak then
PT4.ShowLine();
result := self;
end;
/// Выводит в разделе отладки окна задачника
/// размер последовательности и значения,
/// полученные из элементов последовательности
/// с помощью указанного лямбда-выражения
function Show<TSource>(Self: sequence of TSource; selector: System.Func<TSource, string>): sequence of TSource; extensionmethod;
/// с помощью указанного лямбда-выражения.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource; selector: System.Func<TSource, object>): sequence of TSource; extensionmethod;
begin
result := self.Show('', selector);
end;
/// Выводит в разделе отладки окна задачника
/// комментарий cmt, размер последовательности и ее элементы
/// комментарий cmt, размер последовательности и ее элементы.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource; cmt: string): sequence of TSource; extensionmethod;
begin
result := self;
var a := self.ToArray;
var s := '';
var t := '';
if a.Length > 0 then
t := a[0].GetType.Name;
if t = 'Double' then
if D > 0 then
s := '{0,0:f' + D + '}'
else
s := '{0,0:e}';
a.Show(cmt, e -> s = '' ? e.ToString() :
string.Format(s, e).Replace(',', '.'));
self.Show(cmt, e -> object(e));
end;
/// Выводит в разделе отладки окна задачника
/// размер последовательности и ее элементы.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource): sequence of TSource; extensionmethod;
begin
result := self.Show('');
result := self;
self.Show('', e -> e as object);
end;
// == Конец дополнений к версии 4.14 ==

View file

@ -3,14 +3,14 @@ unit PT4;
//------------------------------------------------------------------------------
// Модуль для подключения задачника Programming Taskbook
// Версия 4.15
// Copyright (©) 2006-2008 DarkStar, SSM
// Copyright (©) 2010 М.Э.Абрамян, дополнения к версии 1.3
// Copyright (©) 2014-2015 М.Э.Абрамян, дополнения к версии 4.13
// Copyright (©) 2015 М.Э.Абрамян, дополнения к версии 4.14
// Copyright (©) 2016 М.Э.Абрамян, дополнения к версии 4.15
// Copyright (©) 2017 М.Э.Абрамян, дополнения к версии 4.17
// Copyright (©) 2018 М.Э.Абрамян, дополнения к версии 4.18
// Версия 4.18
// Copyright © 2006-2008 DarkStar, SSM
// Copyright © 2010 М.Э.Абрамян, дополнения к версии 1.3
// Copyright © 2014-2015 М.Э.Абрамян, дополнения к версии 4.13
// Copyright © 2015 М.Э.Абрамян, дополнения к версии 4.14
// Copyright © 2016 М.Э.Абрамян, дополнения к версии 4.15
// Copyright © 2017 М.Э.Абрамян, дополнения к версии 4.17
// Copyright © 2018 М.Э.Абрамян, дополнения к версии 4.18
// Электронный задачник Programming Taskbook Copyright (c)М.Э.Абрамян, 1998-2018
//------------------------------------------------------------------------------
@ -409,8 +409,27 @@ procedure __FinalizeModule__;
// == Версия 1.3. Дополнения ==
/// Выводит строку S в разделе отладки окна задачника
procedure Show(S: string);
// == Версия 4.18. Изменения ==
(*
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: real);
/// Выводит строку S в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(S: string);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: integer);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: real);
/// Выводит число A с комментарием S в разделе отладки
/// окна задачника; для вывода числа отводится W экранных позиций
@ -434,20 +453,6 @@ procedure Show(A: integer; W: integer);
/// для вывода отводится W экранных позиций
procedure Show(A: real; W: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: real);
/// Выполняет переход на новую экранную строку
/// в разделе отладки окна задачника
procedure ShowLine;
/// Выводит строку S в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(S: string);
/// Выводит число A с комментарием S в разделе отладки
/// окна задачника; для вывода числа отводится W экранных позиций.
/// После вывода данных выполняет переход на новую экранную строку
@ -476,13 +481,37 @@ procedure ShowLine(A: integer; W: integer);
/// После вывода числа выполняет переход на новую экранную строку
procedure ShowLine(A: real; W: integer);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: integer);
*)
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: real);
/// Выводит строку S в разделе отладки окна задачника
procedure Show(S: string);
/// Выводит набор данных в разделе отладки окна задачника.
/// Вещественные числа выводятся в формате, настроенном
/// с помощью функции SetPrecision (по умолчанию 2 дробных знака).
/// Если аргументом является последовательность, то после вывода
/// ее элементов выполняется автоматический переход на новую строку.
procedure Show(params args: array of object);
/// Выполняет переход на новую экранную строку
/// в разделе отладки окна задачника
procedure ShowLine;
/// Выводит набор данных в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку.
/// Вещественные числа выводятся в формате, настроенном
/// с помощью функции SetPrecision (по умолчанию 2 дробных знака).
/// Если аргументом является последовательность, то после вывода
/// ее элементов выполняется автоматический переход на новую строку.
procedure ShowLine(params args: array of object);
/// Задает ширину W области вывода для числовых и строковых данных
/// в разделе отладки. Влияет на последующие вызовы функций
/// Show и ShowLine.
procedure SetWidth(W: Integer);
// == Версия 4.18. Конец изменений ==
/// Настраивает формат вывода вещественных чисел в разделе отладки
/// окна задачника. Если N > 0, то число выводится в формате
@ -547,10 +576,10 @@ function ReadArrReal(): array of real;
/// и возвращает введенный набор в виде массива
function ReadArrString(): array of string;
/// Вводит целую матрицу размера m на n по строкам
/// Вводит целочисленную матрицу размера m на n по строкам
function ReadMatrInteger(m,n: integer): array [,] of integer;
/// Вводит размеры матрицы и затем целую матрицу указанных размеров по строкам
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
function ReadMatrInteger(): array [,] of integer;
/// Вводит вещественную матрицу размера m на n по строкам
@ -559,7 +588,7 @@ function ReadMatrReal(m,n: integer): array [,] of real;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
function ReadMatrReal(): array [,] of real;
/// Вводит матрицу из строк размера m на n по строкам
/// Вводит строковую матрицу размера m на n по строкам
function ReadMatrString(m,n: integer): array [,] of string;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
@ -601,6 +630,90 @@ procedure ReadMatr(var m: integer; var a: List<List<real>>);
procedure ReadMatr(var m: integer; var a: List<List<string>>);
// == Изменения в версии 4.18
/// Вводит квадратную целочисленную матрицу порядка m по строкам
function ReadMatrInteger(m: integer): array [,] of integer;
/// Вводит квадратную вещественную матрицу порядка m по строкам
function ReadMatrReal(m: integer): array [,] of real;
/// Вводит квадратную строковую матрицу порядка m по строкам
function ReadMatrString(m: integer): array [,] of string;
/// Вводит размер набора целых чисел и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListInteger(): List<integer>;
/// Вводит размер набора вещественных чисел и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListReal(): List<real>;
/// Вводит размер набора строк и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListString(): List<string>;
/// Вводит n целых чисел
/// и возвращает введенные числа в виде списка List
function ReadListInteger(n: integer): List<integer>;
/// Вводит n вещественных чисел
/// и возвращает введенные числа в виде списка List
function ReadListReal(n: integer): List<real>;
/// Вводит n строк
/// и возвращает введенные строки в виде списка List
function ReadListString(n: integer): List<string>;
/// Вводит целочисленную матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(m,n: integer): array of array of integer;
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(): array of array of integer;
/// Вводит вещественную матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(m,n: integer): array of array of real;
/// Вводит квадратную целочисленную матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(m: integer): array of array of integer;
/// Вводит квадратную вещественную матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(m: integer): array of array of real;
/// Вводит квадратную строковую матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(m: integer): array of array of string;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(): array of array of real;
/// Вводит строковую матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(m,n: integer): array of array of string;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(): array of array of string;
/// Вводит целочисленную матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(m,n: integer): List<List<integer>>;
/// Вводит квадратную целочисленную матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(m: integer): List<List<integer>>;
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(): List<List<integer>>;
/// Вводит вещественную матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(m,n: integer): List<List<real>>;
/// Вводит квадратную вещественную матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(m: integer): List<List<real>>;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(): List<List<real>>;
/// Вводит строковую матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(m,n: integer): List<List<string>>;
/// Вводит квадратную строковую матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(m: integer): List<List<string>>;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(): List<List<string>>;
(*
procedure WriteMatr<T>(a: array[,] of T);
procedure WriteMatr<T>(a: array of array of T);
@ -608,27 +721,25 @@ procedure WriteMatr<T>(a: array of array of T);
procedure WriteMatr<T>(a: List<List<T>>);
// == Дополнения 2016.07
procedure PrintMatr<T>(a: array[,] of T);
procedure PrintMatr<T>(a: array of array of T);
procedure PrintMatr<T>(a: List<List<T>>);
// == Конец дополнений 2016.07
*)
// == Конец изменений в версии 4.18
// == Конец дополнений к версии 4.14 ==
// == Версия 4.18. Дополнения ==
type IPT4Printable = interface
end;
// == Версия 4.18. Конец дополнений ==
implementation
// == Версия 4.18. Дополнения ==
uses ABCDatabases;
// == Версия 4.18. Конец дополнений ==
const
NotSupportedReadTypeMessage = 'Ввод данных типа {0} не поддерживается';
NotSupportedWriteTypeMessage = 'Вывод данных типа {0} не поддерживается';
@ -1803,10 +1914,14 @@ begin
end
// == Версия 4.17. Конец дополнений ==
// == Версия 4.18. Дополнения ==
else if args[i] is IPT4Printable then
PutString(args[i].ToString)
else
begin
var res := PrintAttributeString(args[i]);
if res <> nil then
PutString(res)
else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString);
end
// == Версия 4.18. Конец дополнений ==
else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString);
end;
procedure PT4_ExecuteBeforeProcessTerminateIn__Mode(e: Exception);
@ -1898,8 +2013,57 @@ end;
var
D: integer := 2;
procedure Show(s: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'show';
var
_Width: integer := 0;
procedure ShowStr(s: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'show';
procedure Show(s: string);
begin
ShowStr(s.PadRight(_Width));
end;
procedure Show(s: char);
begin
ShowStr(s.ToString);
end;
procedure Show(A: Real);
begin
ShowStr((D > 0 ? string.Format('{0,'+_Width+':f'+D+'}', a)
: (D = 0 ? string.Format('{0,'+_Width+':e}', a)
: string.Format('{0,'+_Width+':e'+(-D)+'}', a))).Replace(',','.'));
end;
procedure Show(A: Integer);
begin
ShowStr(A.ToString.PadLeft(_Width));
end;
procedure ShowLine;
begin
Show(#13);
end;
procedure ShowLine(S: string);
begin
Show(S);
ShowLine;
end;
procedure ShowLine(A: Real);
begin
Show(A);
ShowLine;
end;
procedure ShowLine(A: Integer);
begin
Show(A);
ShowLine;
end;
(*
procedure Show(S: string; A: Integer; W: Integer);
var s0: string;
begin
@ -2001,9 +2165,169 @@ end;
procedure ShowLine(A: Real);
begin
Show('', A, 0);
Show(A);
Show(#13);
end;
*)
// == Версия 4.18. Дополнения ==
var LineBreak := false;
procedure ShowArray(a: System.Array; indexes: array of integer; i: integer); forward;
var spaces := 0;
procedure Show(params args: array of object);
begin
// SHowStr('!!!!');
var b := false;
for var i:=0 to args.length-1 do
begin
if args[i] = nil then Show('nil') else
if args[i] is integer then Show(integer(args[i])) else
if args[i] is shortint then ShowStr(shortint(args[i]).ToString.PadLeft(_Width)) else
if args[i] is smallint then ShowStr(smallint(args[i]).ToString.PadLeft(_Width)) else
if args[i] is int64 then ShowStr(int64(args[i]).ToString.PadLeft(_Width)) else
if args[i] is byte then ShowStr(byte(args[i]).ToString.PadLeft(_Width)) else
if args[i] is word then ShowStr(word(args[i]).ToString.PadLeft(_Width)) else
if args[i] is longword then ShowStr(longword(args[i]).ToString.PadLeft(_Width)) else
if args[i] is uint64 then ShowStr(uint64(args[i]).ToString.PadLeft(_Width)) else
if args[i] is real then Show(real(args[i])) else
if args[i] is char then Show(char(args[i])) else
if args[i] is string then Show(string(args[i])) else
if args[i] is boolean then Show(boolean(args[i]).ToString) else
if args[i] is Node then Show('Node') else
if args[i] is PointerOutput then
begin
var ip := IntPtr(PointerOutput(args[i]).p);
ShowStr(ip.ToString.PadLeft(_Width));
end
else if args[i].GetType.FullName.StartsWith('System.Tuple') then
begin
LineBreak := false;
Show('(');
foreach var e in args[i].GetType.GetProperties do
begin
if b then
Show(',')
else
b := true;
Show(e.GetValue(args[i],nil));
end;
Show(')');
b := false;
end
else if args[i].GetType.Name.StartsWith('KeyValuePair') then
begin
LineBreak := false;
Show('(');
foreach var e in args[i].GetType.GetProperties do
begin
if b then
Show(':')
else
b := true;
Show(e.GetValue(args[i],nil));
end;
Show(')');
b := false;
end
else if args[i] is System.Array then
begin
var a := args[i] as System.Array;
ShowArray(a, new integer[a.Rank], 0);
end
else if args[i] is IEnumerable then
begin
var isdictorset := args[i].GetType.Name.Equals('Dictionary`2') or args[i].GetType.Name.Equals('SortedDictionary`2')
or (args[i].GetType = typeof(TypedSet)) or args[i].GetType.Name.Equals('HashSet`1')
or args[i].GetType.Name.Equals('SortedSet`1');
var (lbr, rbr) := isdictorset ? ('{', '}') : ('[', ']');
if LineBreak then
loop spaces do
Show(' ');
Show(lbr);
LineBreak := false;
var e := (args[i] as IEnumerable).GetEnumerator;
while e.MoveNext do
begin
if b then
begin
if not LineBreak then
Show(',');
end
else
b := true;
spaces += 1;
Show(e.Current);
spaces -= 1;
end;
if LineBreak then
loop spaces do
Show(' ');
Show(rbr);
Show(#13);
LineBreak := true;
b := false;
end
else
begin
var res := PrintAttributeString(args[i]);
if res <> nil then
Show(res)
else
Show(args[i].ToString);
end;
end;
end;
procedure ShowArray(a: System.Array; indexes: array of integer; i: integer);
begin
if i = a.Rank then
Show(a.GetValue(indexes))
else
begin
if LineBreak then
loop spaces do
Show(' ');
Show('[');
LineBreak := false;
for var k := 0 to a.GetLength(i) - 1 do
begin
indexes[i] := k;
spaces += 1;
ShowArray(a, indexes, i + 1);
spaces -= 1;
if k < a.GetLength(i) - 1 then
if not LineBreak then
Show({LineBreak ? ' ' : }',');
end;
if LineBreak then
loop spaces do
Show(' ');
Show(']');
Show(#13);
LineBreak := true;
end;
end;
procedure ShowLine(params args: array of object);
begin
LineBreak := false;
Show(args);
if not LineBreak then
ShowLine;
end;
procedure SetWidth(W: Integer);
begin
if W >= 0 then
_Width := W;
end;
// == Конец дополнений к версии 4.18 ==
procedure HideTask; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'hidetask';
@ -2268,6 +2592,121 @@ begin
a.Add(ReadSeqString(m).ToList);
end;
// == Версия 4.18. Дополнения ==
function ReadMatrInteger(m: integer): array [,] of integer;
begin
result := ReadMatrInteger(m,m);
end;
function ReadMatrReal(m: integer): array [,] of real;
begin
result := ReadMatrReal(m,m);
end;
function ReadMatrString(m: integer): array [,] of string;
begin
result := ReadMatrString(m,m);
end;
function ReadArrArrInteger(m, n: integer): array of array of integer;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrInteger(n);
end;
function ReadArrArrReal(m, n: integer): array of array of real;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrReal(n);
end;
function ReadArrArrString(m, n: integer): array of array of string;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrString(n);
end;
function ReadArrArrInteger(m: integer): array of array of integer := ReadArrArrInteger(m, m);
function ReadArrArrReal(m: integer): array of array of real := ReadArrArrReal(m, m);
function ReadArrArrString(m: integer): array of array of string := ReadArrArrString(m, m);
function ReadArrArrInteger: array of array of integer;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrInteger(m, n);
end;
function ReadArrArrReal: array of array of real;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrReal(m, n);
end;
function ReadArrArrString: array of array of string;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrString(m, n);
end;
function ReadListInteger(n: integer): List<integer> := Range(1, n).Select(e -> GetInteger()).ToList();
function ReadListReal(n: integer): List<real> := Range(1, n).Select(e -> GetReal()).ToList();
function ReadListString(n: integer): List<string> := Range(1, n).Select(e -> GetString()).ToList();
function ReadListInteger: List<integer> := ReadListInteger(ReadInteger);
function ReadListReal: List<real> := ReadListReal(ReadInteger);
function ReadListString: List<string> := ReadListString(ReadInteger);
function ReadListListInteger(m, n: integer): List<List<integer>>;
begin
result := new List<List<integer>>(m);
loop m do
result.Add(ReadListInteger(n));
end;
function ReadListListReal(m, n: integer): List<List<real>>;
begin
result := new List<List<real>>(m);
loop m do
result.Add(ReadListReal(n));
end;
function ReadListListString(m, n: integer): List<List<string>>;
begin
result := new List<List<string>>(m);
loop m do
result.Add(ReadListString(n));
end;
function ReadListListInteger(m: integer): List<List<integer>> := ReadListListInteger(m, m);
function ReadListListReal(m: integer): List<List<real>> := ReadListListReal(m, m);
function ReadListListString(m: integer): List<List<string>> := ReadListListString(m, m);
function ReadListListInteger: List<List<integer>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListInteger(m, n);
end;
function ReadListListReal: List<List<real>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListReal(m, n);
end;
function ReadListListString: List<List<string>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListString(m, n);
end;
// == Конец дополнений к версии 4.18 ==
procedure WriteMatr<T>(a: array[,] of T);
begin
for var i := 0 to a.GetLength(0)-1 do
@ -2295,7 +2734,7 @@ begin
var b := self.ToArray();
PT4.Put(b.Length);
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы последовательности
@ -2303,14 +2742,14 @@ procedure Write<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы динамического массива
procedure Write<T>(self: array of T); extensionmethod;
begin
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы матрицы
@ -2318,10 +2757,12 @@ procedure Write<T>(self: array [,] of T); extensionmethod;
begin
for var i:=0 to self.GetLength(0)-1 do
for var j:=0 to self.GetLength(1)-1 do
PT4.Put(self[i,j]);
PT4.Write(self[i,j]);
end;
// == Дополнения 2016.07
(*
// == Удалено в версии 4.18
procedure PrintMatr<T>(a: array[,] of T);
begin
@ -2343,14 +2784,14 @@ begin
for var j := 0 to a[i].Count-1 do
write(a[i][j]);
end;
*)
/// Выводит размер и элементы последовательности
procedure PrintAll<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
PT4.Put(b.Length);
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит размер и элементы динамического массива
@ -2358,7 +2799,7 @@ procedure PrintAll<T>(self: array of T); extensionmethod;
begin
PT4.Put(self.Length);
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит размер и элементы динамического массива
@ -2366,7 +2807,7 @@ procedure WriteAll<T>(self: array of T); extensionmethod;
begin
PT4.Put(self.Length);
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы последовательности
@ -2374,14 +2815,14 @@ procedure Writeln<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы динамического массива
procedure Writeln<T>(self: array of T); extensionmethod;
begin
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы матрицы
@ -2389,7 +2830,7 @@ procedure Writeln<T>(self: array [,] of T); extensionmethod;
begin
for var i:=0 to self.GetLength(0)-1 do
for var j:=0 to self.GetLength(1)-1 do
PT4.Put(self[i,j]);
PT4.Write(self[i,j]);
end;
// == Конец дополнений 2016.07
@ -2398,53 +2839,48 @@ end;
/// Выводит в разделе отладки окна задачника
/// комментарий cmt, размер последовательности и значения,
/// полученные из элементов последовательности
/// с помощью указанного лямбда-выражения
function Show<TSource>(self: sequence of TSource; cmt: string; selector: System.Func<TSource, string>): sequence of TSource; extensionmethod;
/// с помощью указанного лямбда-выражения.
/// После этого переходит на новую экранную строку.
function Show<TSource>(self: sequence of TSource; cmt: string; selector: System.Func<TSource, object>): sequence of TSource; extensionmethod;
begin
var b := self.Select(selector).ToArray();
PT4.Show(cmt);
PT4.Show((b.Length + ':').PadLeft(3));
foreach var e in b do
PT4.Show(e);
PT4.ShowLine();
var b := self.Select(selector);//.ToArray();
if cmt <> '' then
PT4.Show(cmt);
PT4.Show((b.Count + ':').PadLeft(3));
// foreach var e in b do
PT4.Show(b);
if not LineBreak then
PT4.ShowLine();
result := self;
end;
/// Выводит в разделе отладки окна задачника
/// размер последовательности и значения,
/// полученные из элементов последовательности
/// с помощью указанного лямбда-выражения
function Show<TSource>(Self: sequence of TSource; selector: System.Func<TSource, string>): sequence of TSource; extensionmethod;
/// с помощью указанного лямбда-выражения.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource; selector: System.Func<TSource, object>): sequence of TSource; extensionmethod;
begin
result := self.Show('', selector);
end;
/// Выводит в разделе отладки окна задачника
/// комментарий cmt, размер последовательности и ее элементы
/// комментарий cmt, размер последовательности и ее элементы.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource; cmt: string): sequence of TSource; extensionmethod;
begin
result := self;
var a := self.ToArray;
var s := '';
var t := '';
if a.Length > 0 then
t := a[0].GetType.Name;
if t = 'Double' then
if D > 0 then
s := '{0,0:f' + D + '}'
else
s := '{0,0:e}';
a.Show(cmt, e -> s = '' ? e.ToString() :
string.Format(s, e).Replace(',', '.'));
self.Show(cmt, e -> object(e));
end;
/// Выводит в разделе отладки окна задачника
/// размер последовательности и ее элементы.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource): sequence of TSource; extensionmethod;
begin
result := self.Show('');
result := self;
self.Show('', e -> e as object);
end;
// == Конец дополнений к версии 4.14 ==

View file

@ -3,14 +3,14 @@ unit PT4;
//------------------------------------------------------------------------------
// Модуль для подключения задачника Programming Taskbook
// Версия 4.15
// Copyright (©) 2006-2008 DarkStar, SSM
// Copyright (©) 2010 М.Э.Абрамян, дополнения к версии 1.3
// Copyright (©) 2014-2015 М.Э.Абрамян, дополнения к версии 4.13
// Copyright (©) 2015 М.Э.Абрамян, дополнения к версии 4.14
// Copyright (©) 2016 М.Э.Абрамян, дополнения к версии 4.15
// Copyright (©) 2017 М.Э.Абрамян, дополнения к версии 4.17
// Copyright (©) 2018 М.Э.Абрамян, дополнения к версии 4.18
// Версия 4.18
// Copyright © 2006-2008 DarkStar, SSM
// Copyright © 2010 М.Э.Абрамян, дополнения к версии 1.3
// Copyright © 2014-2015 М.Э.Абрамян, дополнения к версии 4.13
// Copyright © 2015 М.Э.Абрамян, дополнения к версии 4.14
// Copyright © 2016 М.Э.Абрамян, дополнения к версии 4.15
// Copyright © 2017 М.Э.Абрамян, дополнения к версии 4.17
// Copyright © 2018 М.Э.Абрамян, дополнения к версии 4.18
// Электронный задачник Programming Taskbook Copyright (c)М.Э.Абрамян, 1998-2018
//------------------------------------------------------------------------------
@ -409,8 +409,27 @@ procedure __FinalizeModule__;
// == Версия 1.3. Дополнения ==
/// Выводит строку S в разделе отладки окна задачника
procedure Show(S: string);
// == Версия 4.18. Изменения ==
(*
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: real);
/// Выводит строку S в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(S: string);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: integer);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: real);
/// Выводит число A с комментарием S в разделе отладки
/// окна задачника; для вывода числа отводится W экранных позиций
@ -434,20 +453,6 @@ procedure Show(A: integer; W: integer);
/// для вывода отводится W экранных позиций
procedure Show(A: real; W: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: integer);
/// Выводит число A в разделе отладки окна задачника
procedure Show(A: real);
/// Выполняет переход на новую экранную строку
/// в разделе отладки окна задачника
procedure ShowLine;
/// Выводит строку S в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(S: string);
/// Выводит число A с комментарием S в разделе отладки
/// окна задачника; для вывода числа отводится W экранных позиций.
/// После вывода данных выполняет переход на новую экранную строку
@ -476,13 +481,37 @@ procedure ShowLine(A: integer; W: integer);
/// После вывода числа выполняет переход на новую экранную строку
procedure ShowLine(A: real; W: integer);
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: integer);
*)
/// Выводит число A в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку
procedure ShowLine(A: real);
/// Выводит строку S в разделе отладки окна задачника
procedure Show(S: string);
/// Выводит набор данных в разделе отладки окна задачника.
/// Вещественные числа выводятся в формате, настроенном
/// с помощью функции SetPrecision (по умолчанию 2 дробных знака).
/// Если аргументом является последовательность, то после вывода
/// ее элементов выполняется автоматический переход на новую строку.
procedure Show(params args: array of object);
/// Выполняет переход на новую экранную строку
/// в разделе отладки окна задачника
procedure ShowLine;
/// Выводит набор данных в разделе отладки окна задачника,
/// после чего выполняет переход на новую экранную строку.
/// Вещественные числа выводятся в формате, настроенном
/// с помощью функции SetPrecision (по умолчанию 2 дробных знака).
/// Если аргументом является последовательность, то после вывода
/// ее элементов выполняется автоматический переход на новую строку.
procedure ShowLine(params args: array of object);
/// Задает ширину W области вывода для числовых и строковых данных
/// в разделе отладки. Влияет на последующие вызовы функций
/// Show и ShowLine.
procedure SetWidth(W: Integer);
// == Версия 4.18. Конец изменений ==
/// Настраивает формат вывода вещественных чисел в разделе отладки
/// окна задачника. Если N > 0, то число выводится в формате
@ -547,10 +576,10 @@ function ReadArrReal(): array of real;
/// и возвращает введенный набор в виде массива
function ReadArrString(): array of string;
/// Вводит целую матрицу размера m на n по строкам
/// Вводит целочисленную матрицу размера m на n по строкам
function ReadMatrInteger(m,n: integer): array [,] of integer;
/// Вводит размеры матрицы и затем целую матрицу указанных размеров по строкам
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
function ReadMatrInteger(): array [,] of integer;
/// Вводит вещественную матрицу размера m на n по строкам
@ -559,7 +588,7 @@ function ReadMatrReal(m,n: integer): array [,] of real;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
function ReadMatrReal(): array [,] of real;
/// Вводит матрицу из строк размера m на n по строкам
/// Вводит строковую матрицу размера m на n по строкам
function ReadMatrString(m,n: integer): array [,] of string;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
@ -601,6 +630,90 @@ procedure ReadMatr(var m: integer; var a: List<List<real>>);
procedure ReadMatr(var m: integer; var a: List<List<string>>);
// == Изменения в версии 4.18
/// Вводит квадратную целочисленную матрицу порядка m по строкам
function ReadMatrInteger(m: integer): array [,] of integer;
/// Вводит квадратную вещественную матрицу порядка m по строкам
function ReadMatrReal(m: integer): array [,] of real;
/// Вводит квадратную строковую матрицу порядка m по строкам
function ReadMatrString(m: integer): array [,] of string;
/// Вводит размер набора целых чисел и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListInteger(): List<integer>;
/// Вводит размер набора вещественных чисел и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListReal(): List<real>;
/// Вводит размер набора строк и его элементы
/// и возвращает введенный набор в виде списка List
function ReadListString(): List<string>;
/// Вводит n целых чисел
/// и возвращает введенные числа в виде списка List
function ReadListInteger(n: integer): List<integer>;
/// Вводит n вещественных чисел
/// и возвращает введенные числа в виде списка List
function ReadListReal(n: integer): List<real>;
/// Вводит n строк
/// и возвращает введенные строки в виде списка List
function ReadListString(n: integer): List<string>;
/// Вводит целочисленную матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(m,n: integer): array of array of integer;
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(): array of array of integer;
/// Вводит вещественную матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(m,n: integer): array of array of real;
/// Вводит квадратную целочисленную матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrInteger(m: integer): array of array of integer;
/// Вводит квадратную вещественную матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(m: integer): array of array of real;
/// Вводит квадратную строковую матрицу порядка m по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(m: integer): array of array of string;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrReal(): array of array of real;
/// Вводит строковую матрицу размера m на n по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(m,n: integer): array of array of string;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
/// и возвращает ее в виде массива массивов
function ReadArrArrString(): array of array of string;
/// Вводит целочисленную матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(m,n: integer): List<List<integer>>;
/// Вводит квадратную целочисленную матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(m: integer): List<List<integer>>;
/// Вводит размеры матрицы и затем целочисленную матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListInteger(): List<List<integer>>;
/// Вводит вещественную матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(m,n: integer): List<List<real>>;
/// Вводит квадратную вещественную матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(m: integer): List<List<real>>;
/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListReal(): List<List<real>>;
/// Вводит строковую матрицу размера m на n по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(m,n: integer): List<List<string>>;
/// Вводит квадратную строковую матрицу порядка m по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(m: integer): List<List<string>>;
/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам
/// и возвращает ее в виде списка списков
function ReadListListString(): List<List<string>>;
(*
procedure WriteMatr<T>(a: array[,] of T);
procedure WriteMatr<T>(a: array of array of T);
@ -608,27 +721,25 @@ procedure WriteMatr<T>(a: array of array of T);
procedure WriteMatr<T>(a: List<List<T>>);
// == Дополнения 2016.07
procedure PrintMatr<T>(a: array[,] of T);
procedure PrintMatr<T>(a: array of array of T);
procedure PrintMatr<T>(a: List<List<T>>);
// == Конец дополнений 2016.07
*)
// == Конец изменений в версии 4.18
// == Конец дополнений к версии 4.14 ==
// == Версия 4.18. Дополнения ==
type IPT4Printable = interface
end;
// == Версия 4.18. Конец дополнений ==
implementation
// == Версия 4.18. Дополнения ==
uses ABCDatabases;
// == Версия 4.18. Конец дополнений ==
const
NotSupportedReadTypeMessage = 'Ввод данных типа {0} не поддерживается';
NotSupportedWriteTypeMessage = 'Вывод данных типа {0} не поддерживается';
@ -1803,10 +1914,14 @@ begin
end
// == Версия 4.17. Конец дополнений ==
// == Версия 4.18. Дополнения ==
else if args[i] is IPT4Printable then
PutString(args[i].ToString)
else
begin
var res := PrintAttributeString(args[i]);
if res <> nil then
PutString(res)
else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString);
end
// == Версия 4.18. Конец дополнений ==
else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString);
end;
procedure PT4_ExecuteBeforeProcessTerminateIn__Mode(e: Exception);
@ -1898,8 +2013,57 @@ end;
var
D: integer := 2;
procedure Show(s: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'show';
var
_Width: integer := 0;
procedure ShowStr(s: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'show';
procedure Show(s: string);
begin
ShowStr(s.PadRight(_Width));
end;
procedure Show(s: char);
begin
ShowStr(s.ToString);
end;
procedure Show(A: Real);
begin
ShowStr((D > 0 ? string.Format('{0,'+_Width+':f'+D+'}', a)
: (D = 0 ? string.Format('{0,'+_Width+':e}', a)
: string.Format('{0,'+_Width+':e'+(-D)+'}', a))).Replace(',','.'));
end;
procedure Show(A: Integer);
begin
ShowStr(A.ToString.PadLeft(_Width));
end;
procedure ShowLine;
begin
Show(#13);
end;
procedure ShowLine(S: string);
begin
Show(S);
ShowLine;
end;
procedure ShowLine(A: Real);
begin
Show(A);
ShowLine;
end;
procedure ShowLine(A: Integer);
begin
Show(A);
ShowLine;
end;
(*
procedure Show(S: string; A: Integer; W: Integer);
var s0: string;
begin
@ -2001,9 +2165,169 @@ end;
procedure ShowLine(A: Real);
begin
Show('', A, 0);
Show(A);
Show(#13);
end;
*)
// == Версия 4.18. Дополнения ==
var LineBreak := false;
procedure ShowArray(a: System.Array; indexes: array of integer; i: integer); forward;
var spaces := 0;
procedure Show(params args: array of object);
begin
// SHowStr('!!!!');
var b := false;
for var i:=0 to args.length-1 do
begin
if args[i] = nil then Show('nil') else
if args[i] is integer then Show(integer(args[i])) else
if args[i] is shortint then ShowStr(shortint(args[i]).ToString.PadLeft(_Width)) else
if args[i] is smallint then ShowStr(smallint(args[i]).ToString.PadLeft(_Width)) else
if args[i] is int64 then ShowStr(int64(args[i]).ToString.PadLeft(_Width)) else
if args[i] is byte then ShowStr(byte(args[i]).ToString.PadLeft(_Width)) else
if args[i] is word then ShowStr(word(args[i]).ToString.PadLeft(_Width)) else
if args[i] is longword then ShowStr(longword(args[i]).ToString.PadLeft(_Width)) else
if args[i] is uint64 then ShowStr(uint64(args[i]).ToString.PadLeft(_Width)) else
if args[i] is real then Show(real(args[i])) else
if args[i] is char then Show(char(args[i])) else
if args[i] is string then Show(string(args[i])) else
if args[i] is boolean then Show(boolean(args[i]).ToString) else
if args[i] is Node then Show('Node') else
if args[i] is PointerOutput then
begin
var ip := IntPtr(PointerOutput(args[i]).p);
ShowStr(ip.ToString.PadLeft(_Width));
end
else if args[i].GetType.FullName.StartsWith('System.Tuple') then
begin
LineBreak := false;
Show('(');
foreach var e in args[i].GetType.GetProperties do
begin
if b then
Show(',')
else
b := true;
Show(e.GetValue(args[i],nil));
end;
Show(')');
b := false;
end
else if args[i].GetType.Name.StartsWith('KeyValuePair') then
begin
LineBreak := false;
Show('(');
foreach var e in args[i].GetType.GetProperties do
begin
if b then
Show(':')
else
b := true;
Show(e.GetValue(args[i],nil));
end;
Show(')');
b := false;
end
else if args[i] is System.Array then
begin
var a := args[i] as System.Array;
ShowArray(a, new integer[a.Rank], 0);
end
else if args[i] is IEnumerable then
begin
var isdictorset := args[i].GetType.Name.Equals('Dictionary`2') or args[i].GetType.Name.Equals('SortedDictionary`2')
or (args[i].GetType = typeof(TypedSet)) or args[i].GetType.Name.Equals('HashSet`1')
or args[i].GetType.Name.Equals('SortedSet`1');
var (lbr, rbr) := isdictorset ? ('{', '}') : ('[', ']');
if LineBreak then
loop spaces do
Show(' ');
Show(lbr);
LineBreak := false;
var e := (args[i] as IEnumerable).GetEnumerator;
while e.MoveNext do
begin
if b then
begin
if not LineBreak then
Show(',');
end
else
b := true;
spaces += 1;
Show(e.Current);
spaces -= 1;
end;
if LineBreak then
loop spaces do
Show(' ');
Show(rbr);
Show(#13);
LineBreak := true;
b := false;
end
else
begin
var res := PrintAttributeString(args[i]);
if res <> nil then
Show(res)
else
Show(args[i].ToString);
end;
end;
end;
procedure ShowArray(a: System.Array; indexes: array of integer; i: integer);
begin
if i = a.Rank then
Show(a.GetValue(indexes))
else
begin
if LineBreak then
loop spaces do
Show(' ');
Show('[');
LineBreak := false;
for var k := 0 to a.GetLength(i) - 1 do
begin
indexes[i] := k;
spaces += 1;
ShowArray(a, indexes, i + 1);
spaces -= 1;
if k < a.GetLength(i) - 1 then
if not LineBreak then
Show({LineBreak ? ' ' : }',');
end;
if LineBreak then
loop spaces do
Show(' ');
Show(']');
Show(#13);
LineBreak := true;
end;
end;
procedure ShowLine(params args: array of object);
begin
LineBreak := false;
Show(args);
if not LineBreak then
ShowLine;
end;
procedure SetWidth(W: Integer);
begin
if W >= 0 then
_Width := W;
end;
// == Конец дополнений к версии 4.18 ==
procedure HideTask; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'hidetask';
@ -2268,6 +2592,121 @@ begin
a.Add(ReadSeqString(m).ToList);
end;
// == Версия 4.18. Дополнения ==
function ReadMatrInteger(m: integer): array [,] of integer;
begin
result := ReadMatrInteger(m,m);
end;
function ReadMatrReal(m: integer): array [,] of real;
begin
result := ReadMatrReal(m,m);
end;
function ReadMatrString(m: integer): array [,] of string;
begin
result := ReadMatrString(m,m);
end;
function ReadArrArrInteger(m, n: integer): array of array of integer;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrInteger(n);
end;
function ReadArrArrReal(m, n: integer): array of array of real;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrReal(n);
end;
function ReadArrArrString(m, n: integer): array of array of string;
begin
SetLength(result, m);
for var i := 0 to m - 1 do
result[i] := ReadArrString(n);
end;
function ReadArrArrInteger(m: integer): array of array of integer := ReadArrArrInteger(m, m);
function ReadArrArrReal(m: integer): array of array of real := ReadArrArrReal(m, m);
function ReadArrArrString(m: integer): array of array of string := ReadArrArrString(m, m);
function ReadArrArrInteger: array of array of integer;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrInteger(m, n);
end;
function ReadArrArrReal: array of array of real;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrReal(m, n);
end;
function ReadArrArrString: array of array of string;
begin
var (m, n) := ReadInteger2;
result := ReadArrArrString(m, n);
end;
function ReadListInteger(n: integer): List<integer> := Range(1, n).Select(e -> GetInteger()).ToList();
function ReadListReal(n: integer): List<real> := Range(1, n).Select(e -> GetReal()).ToList();
function ReadListString(n: integer): List<string> := Range(1, n).Select(e -> GetString()).ToList();
function ReadListInteger: List<integer> := ReadListInteger(ReadInteger);
function ReadListReal: List<real> := ReadListReal(ReadInteger);
function ReadListString: List<string> := ReadListString(ReadInteger);
function ReadListListInteger(m, n: integer): List<List<integer>>;
begin
result := new List<List<integer>>(m);
loop m do
result.Add(ReadListInteger(n));
end;
function ReadListListReal(m, n: integer): List<List<real>>;
begin
result := new List<List<real>>(m);
loop m do
result.Add(ReadListReal(n));
end;
function ReadListListString(m, n: integer): List<List<string>>;
begin
result := new List<List<string>>(m);
loop m do
result.Add(ReadListString(n));
end;
function ReadListListInteger(m: integer): List<List<integer>> := ReadListListInteger(m, m);
function ReadListListReal(m: integer): List<List<real>> := ReadListListReal(m, m);
function ReadListListString(m: integer): List<List<string>> := ReadListListString(m, m);
function ReadListListInteger: List<List<integer>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListInteger(m, n);
end;
function ReadListListReal: List<List<real>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListReal(m, n);
end;
function ReadListListString: List<List<string>>;
begin
var (m, n) := ReadInteger2;
result := ReadListListString(m, n);
end;
// == Конец дополнений к версии 4.18 ==
procedure WriteMatr<T>(a: array[,] of T);
begin
for var i := 0 to a.GetLength(0)-1 do
@ -2295,7 +2734,7 @@ begin
var b := self.ToArray();
PT4.Put(b.Length);
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы последовательности
@ -2303,14 +2742,14 @@ procedure Write<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы динамического массива
procedure Write<T>(self: array of T); extensionmethod;
begin
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы матрицы
@ -2318,10 +2757,12 @@ procedure Write<T>(self: array [,] of T); extensionmethod;
begin
for var i:=0 to self.GetLength(0)-1 do
for var j:=0 to self.GetLength(1)-1 do
PT4.Put(self[i,j]);
PT4.Write(self[i,j]);
end;
// == Дополнения 2016.07
(*
// == Удалено в версии 4.18
procedure PrintMatr<T>(a: array[,] of T);
begin
@ -2343,14 +2784,14 @@ begin
for var j := 0 to a[i].Count-1 do
write(a[i][j]);
end;
*)
/// Выводит размер и элементы последовательности
procedure PrintAll<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
PT4.Put(b.Length);
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит размер и элементы динамического массива
@ -2358,7 +2799,7 @@ procedure PrintAll<T>(self: array of T); extensionmethod;
begin
PT4.Put(self.Length);
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит размер и элементы динамического массива
@ -2366,7 +2807,7 @@ procedure WriteAll<T>(self: array of T); extensionmethod;
begin
PT4.Put(self.Length);
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы последовательности
@ -2374,14 +2815,14 @@ procedure Writeln<T>(self: sequence of T); extensionmethod;
begin
var b := self.ToArray();
foreach e : T in b do
PT4.Put(e);
PT4.Write(e);
end;
/// Выводит элементы динамического массива
procedure Writeln<T>(self: array of T); extensionmethod;
begin
for var i:=0 to self.Length-1 do
PT4.Put(self[i]);
PT4.Write(self[i]);
end;
/// Выводит элементы матрицы
@ -2389,7 +2830,7 @@ procedure Writeln<T>(self: array [,] of T); extensionmethod;
begin
for var i:=0 to self.GetLength(0)-1 do
for var j:=0 to self.GetLength(1)-1 do
PT4.Put(self[i,j]);
PT4.Write(self[i,j]);
end;
// == Конец дополнений 2016.07
@ -2398,53 +2839,48 @@ end;
/// Выводит в разделе отладки окна задачника
/// комментарий cmt, размер последовательности и значения,
/// полученные из элементов последовательности
/// с помощью указанного лямбда-выражения
function Show<TSource>(self: sequence of TSource; cmt: string; selector: System.Func<TSource, string>): sequence of TSource; extensionmethod;
/// с помощью указанного лямбда-выражения.
/// После этого переходит на новую экранную строку.
function Show<TSource>(self: sequence of TSource; cmt: string; selector: System.Func<TSource, object>): sequence of TSource; extensionmethod;
begin
var b := self.Select(selector).ToArray();
PT4.Show(cmt);
PT4.Show((b.Length + ':').PadLeft(3));
foreach var e in b do
PT4.Show(e);
PT4.ShowLine();
var b := self.Select(selector);//.ToArray();
if cmt <> '' then
PT4.Show(cmt);
PT4.Show((b.Count + ':').PadLeft(3));
// foreach var e in b do
PT4.Show(b);
if not LineBreak then
PT4.ShowLine();
result := self;
end;
/// Выводит в разделе отладки окна задачника
/// размер последовательности и значения,
/// полученные из элементов последовательности
/// с помощью указанного лямбда-выражения
function Show<TSource>(Self: sequence of TSource; selector: System.Func<TSource, string>): sequence of TSource; extensionmethod;
/// с помощью указанного лямбда-выражения.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource; selector: System.Func<TSource, object>): sequence of TSource; extensionmethod;
begin
result := self.Show('', selector);
end;
/// Выводит в разделе отладки окна задачника
/// комментарий cmt, размер последовательности и ее элементы
/// комментарий cmt, размер последовательности и ее элементы.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource; cmt: string): sequence of TSource; extensionmethod;
begin
result := self;
var a := self.ToArray;
var s := '';
var t := '';
if a.Length > 0 then
t := a[0].GetType.Name;
if t = 'Double' then
if D > 0 then
s := '{0,0:f' + D + '}'
else
s := '{0,0:e}';
a.Show(cmt, e -> s = '' ? e.ToString() :
string.Format(s, e).Replace(',', '.'));
self.Show(cmt, e -> object(e));
end;
/// Выводит в разделе отладки окна задачника
/// размер последовательности и ее элементы.
/// После этого переходит на новую экранную строку.
function Show<TSource>(Self: sequence of TSource): sequence of TSource; extensionmethod;
begin
result := self.Show('');
result := self;
self.Show('', e -> e as object);
end;
// == Конец дополнений к версии 4.14 ==

Binary file not shown.