Новые версии PT4.pas и pt4pabc.dll
This commit is contained in:
parent
fd1f257d68
commit
3720c90d15
Binary file not shown.
|
|
@ -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 ==
|
||||
|
|
|
|||
|
|
@ -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 ==
|
||||
|
|
|
|||
602
bin/Lib/PT4.pas
602
bin/Lib/PT4.pas
|
|
@ -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.
Loading…
Reference in a new issue