From 4ef03daa3df2c26c5dd2d46bd78c5d36d4924d99 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Sun, 2 Jul 2023 14:43:39 +0300 Subject: [PATCH] PABCSystem - RandomReal(a,b,digits) LightPT - CancelMessagesIfInitial --- bin/Lib/LightPT.pas | 13 +++++++++++-- bin/Lib/PABCSystem.pas | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/bin/Lib/LightPT.pas b/bin/Lib/LightPT.pas index b908ad779..e103c834d 100644 --- a/bin/Lib/LightPT.pas +++ b/bin/Lib/LightPT.pas @@ -129,8 +129,10 @@ procedure Print(c: char); { Сервисные процедуры } {=========================================================================} +// Вывести цветовое сообщение в окно вывода procedure ColoredMessage(msg: string; color: MessageColorT); +// Вывести сообщение красным цветом в окно вывода procedure ColoredMessage(msg: string); {=========================================================================} @@ -392,6 +394,8 @@ var InitialInputList := new List; /// Ссылка на основную процедуру проверки в модуле Task CheckTask: procedure(name: string); + /// Погасить сообщения о неверном вводе-выводе если задача содержит только начальный ввод-вывод + CancelMessagesIfInitial := True; /// Целый тип для проверки ввода-вывода function cInt: System.Type; @@ -1511,11 +1515,14 @@ begin end; // Добавим сюда проверку типов RuntimeType +// Выдавать ли сообщение о дальнейшем вводе-выводе если у нас InitialTask? +// Сделаем глобальную настройку CancelMessagesIfInitial и по умолчанию присвоим ей False procedure CheckOutput(params arr: array of object); begin // TaskResult = InitialTask - ничего выводить не надо // TaskResult = BadInitialTask - потом будет выведено исключение, что часть изначальных данных удалена - if (TaskResult = InitialTask) or (TaskResult = BadInitialTask) then + if (TaskResult = InitialTask) and CancelMessagesIfInitial + or (TaskResult = BadInitialTask) then exit; var mn := Min(arr.Length, OutputList.Count); @@ -1563,8 +1570,10 @@ end; procedure CheckOutputAfterInitial(params arr: array of object); begin - if (TaskResult = InitialTask) or (TaskResult = BadInitialTask) then + if (TaskResult = InitialTask) and CancelMessagesIfInitial + or (TaskResult = BadInitialTask) then exit; + // Если мы попали сюда, то OutputList.Count >= InitialOutputList.Count var mn := Min(arr.Length, OutputList.Count - InitialOutputList.Count); diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index a05dd9ffe..d5c1f0ece 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1700,6 +1700,8 @@ function Random(maxValue: real): real; function Random(a, b: integer): integer; /// Возвращает случайное вещественное в диапазоне [a,b) function Random(a, b: real): real; +/// Возвращает случайное вещественное в диапазоне [a,b] c количеством значащих цифр после точки, равным digits +function RandomReal(a, b: real; digits: integer := 1): real; /// Возвращает случайный символ в диапазоне от a до b function Random(a, b: char): char; /// Возвращает случайное целое в диапазоне @@ -8509,6 +8511,29 @@ begin Result := a + Random()*(b-a); end; +function RandomReal(a, b: real; digits: integer): real; +begin + if digits<0 then + Result := Random(a,b) + else begin + // Бывают некорректные данные. Например, найти точку с 2 знаками на [2.736, 2.737]. Тогда возвращать a скажем + var step := 1/10**digits; + Result := Round(Random(a,b),digits); + if Result < a then + begin + Result += step; + if Result > b then + Result := b + end + else if Result > b then + begin + Result -= step; + if Result < a then + Result := a; + end; + end; +end; + function Random(diap: IntRange): integer := Random(diap.Low,diap.High); function Random(diap: RealRange): real := Random(diap.Low,diap.High); function Random(diap: CharRange): char := Random(diap.Low,diap.High);