PABCSystem - RandomReal(a,b,digits)
LightPT - CancelMessagesIfInitial
This commit is contained in:
parent
0d85e872d3
commit
4ef03daa3d
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue