PABCSystem - RandomReal(a,b,digits)

LightPT - CancelMessagesIfInitial
This commit is contained in:
Mikhalkovich Stanislav 2023-07-02 14:43:39 +03:00
parent 0d85e872d3
commit 4ef03daa3d
2 changed files with 36 additions and 2 deletions

View file

@ -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<System.Type>;
/// Ссылка на основную процедуру проверки в модуле 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);

View file

@ -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);