Root /ArchiveAbout
()

Попадает ли число в заданный интервал?

Попадает ли число в заданный интервал?

На этой странице дано решение и разбор задач boolean4 - boolean7 из задачника Абрамяна, в которых мы рассмотрим проверку простейших неравенств и взаимное расположение трех чисел.

Boolean4. Даны два целых числа: A, B. Проверить истинность высказывания: «Справедливы неравенства A > 2 и B ≤ 3».

Для одновременного выполнения нескольких условий используется логическое "и" — and. Таким образом можно "связать" любое количество условий, которые должны выполняться одновременно. В данной задаче необходимо проверить истинность двух неравенств: (A > 2) и (B ≤ 3). Если они оба выполняются, то оператор write выведет True. В случае невыполнения хотя б одного из условий мы получим False.

var
  A, B: Integer;

begin
  write('A = ');
  readln(A);
  write('B = ');
  readln(B);
  writeln;
  { and - логический аналог "и": }
  writeln((A > 2) and (B <= 3));
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Поэкспериментируйте немного: попробуйте ввести несколько пар чисел А и В. Если А будет больше 2, а В не больше 3 (одновременно), то вы всегда получите True, в противном случае - False. Очевидно, что число 3 будет единственным, удовлетворяющим вышеуказанное условие.

Boolean5. Даны два целых числа: A, B. Проверить истинность высказывания: «Справедливы неравенства A ≥ 0 или B < −2».

Для выполнения хотя б одного из нескольких условий используется логическое "или" — or. В этой задаче необходимо проверить истинность одного из двух неравенств: (A ≥ 0) или (B < -2). Если хотя бы одно условие выполняется, то оператор write выведет True, в противном случае (при ложности обоих неравенств) — False.

var
  A, B: Integer;

begin
  write('A = ');
  readln(A);
  write('B = ');
  readln(B);
  writeln;
  { or - логический аналог "или". Это означает, что 
  результат True мы получим в случае, если хотя бы 
  одно из условий (A≥0) или (B<−2) выполняется: }
  writeln((A >= 0) or (B < -2));
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Boolean6. Даны три целых числа: A, B, C. Проверить истинность высказывания: «Справедливо двойное неравенство A < B < C».

Двойное неравенство A < B < C распадается на два: (A < B) и (B < C). А дальше аналогично решению задачи Boolean4.

var
  A, B, C: integer;

begin
  writeln('Введите целые числа A, B, C:');
  readln(A, B, C);
  writeln;
  { Двойное неравенство A < B < C истинно тогда и только 
  тогда, когда истинны два неравенства (A<B) и (B<C): }
  writeln(' ', (A < B) and (B < C));
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Boolean7. Даны три целых числа: A, B, C. Проверить истинность высказывания: «Число B находится между числами A и C».

Рассмотрим высказывание "Число B находится между числами A и C". Во-первых, возможны два варианта: A < C и C < A (равенство не учитывается, поскольку в этом случае между A и C ничего нет). При A < C оно превратится в логический эквивалент (A < B)**and**(B < C), а в случае C < A получим (C < B)**and**(B < A).

А во-вторых, поскольку мы имеем два взяимоисключающих варианта (условия A<C и C<A не могут выполнятся одновременно), то указанные условия объединим оператором or (логическое "или"): (A<B)**and**(B<C) **or** (C<B)**and**(B<A).

var
  A, B, C: integer;

begin
  writeln('Введите числа A, B и C:');
  readln(A, B, C);
  writeln;
  { Число B находится между A и C в таких случаях:
    1)Если A < C, то (B > A) и (B < C);
    2)Если C < A, то (B > C) и (B < A): }
  writeln(' ', ((B > A)and(B < C))or((B > C)and(B < A)));
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Возможен и другой вариант решения задачи Boolean7. Если B лежит между A и C, то при A<C имеем В-А>0 и C-B>0, а при C<A соответственно В-А<0 и C-B<0. То есть в любом случае числа B-A и C-B одного знака, а это значит, что их произведение положительно: (B-A)·(C-B)>0. Этим и воспользуемся в программе ниже:

var
  A, B, C: integer;

begin
  writeln('Введите числа A, B и C:');
  readln(A, B, C);
  writeln;
  { Число B находится между A и C тогда 
  и только тогда, если (B-A)·(C-B)>0: }
  writeln(' ', (B-A)*(C-B)>0);
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Но здесь нужно быть осторожным. Поскольку мы вычисляем произведение (B-A)·(C-B), то оно может выйти за пределы типа Integer, – в таком случае мы можем получить неверный результат, так как данное произведение может оказаться отрицательным даже при В, размещенном между А и С. Получается это потому, то выходящие за пределы целого типа числа заменяются остатками, которые могут оказаться отрицательными, поскольку данный тип содержит отрицательные числа.

Так, запустите вышеприведенную программу и вместо А, В, С введите числа: 1 1000000001 2000000001 – в результате получите False, хотя 1 < 1000000001 < 2000000001. Поэтому лучше пользоваться первым вариантом решения задачи Boolean7.