Мы с вами, уважаемые подписчики, продолжаем подготовку к изучению методов и средств программирования разветвлений.
Именно для этого нам пригодится умение строить алгоритмы и подпрограммы с результатами логического типа.
ДРУГИЕ АЛГОРИТМЫ С РЕЗУЛЬТАТАМИ ЛОГИЧЕСКОГО ТИПА
1. Решение задачи “Точный квадрат”.
Задача L.2.4. “Точный квадрат”. Дано натуральное число X. Построить алгоритм и подпрограмму для определения
того, является ли это число точным квадратом.
Известно, что точным квадратом называется неотрицательное целое число, равное квадрату некоторого другого целого числа. Иначе говоря, если неотрицательное целое X – точный квадрат, то обязательно найдётся такое целое Z, что
X = Z2. И теперь может показаться, что путь решения нашей задачи ясен. Сначала извлекаем из X квадратный корень и получаем значение Z. Проверяем его: если значение Z оказалось целым,
то значит X – точный квадрат. К сожалению, не всё так просто, как может показаться, например, математикам.
Дело в том, что результатом извлечения квадратного корня в Паскале всегда будет вещественное число (так сказано в материалах занятия 5). А это значит, что при извлечении квадратного корня, например, из целого числа 25 мы получим не целое 5, а вещественное 5.0. А если вспомнить, что вещественные числа представляются в компьютере приближённо, то станет ясно, что мы совсем не застрахованы от получения
5.000001 или 4.999999.
И какой же выход? Выход один: преобразовать результат извлечения корня к целому типу. Причём сделать это нужно будет не с помощью функции Trunc, которая просто отбросит дробную часть (и тогда мы можем получить неоднозначный результат, например, 5 или 4). Сделать это нужно будет с помощью функции Round, которая округлит результат извлечения корня (тогда мы получим только
5).
И что же дальше? Проверять, целое ли число – результат извлечения корня, теперь стало бессмысленным. Ведь теперь результат извлечения корня из любого числа вседа будет целым числом. А мы и не будем этого делать! Мы проверим другое.
Результат извлечения корня из данного неотрицательного целого числа X, преобразованный к целому типу посредством округления до ближайшего целого, возведём в квадрат. И если результат возведения в квадрат совпадёт с исходным числом X, то значит X – точный квадрат. В этом нам поможет логическое выражение в виде отношения Z * Z = X.
Теперь можно построить алгоритм решения поставленной задачи в виде функции логического типа, принимающей истинное значение только в том случае, если результат извлечения корня из данного неотрицательного целого числа X, преобразованный к целому типу посредством округления до ближайшего целого Z и возведённый затем в квадрат, совпадает с исходным числом X. Это будет значить, что X – точный квадрат.
Алгоритм и его перевод на Паскаль выглядят следующим образом:
алг Точный_квадрат ( X: нат ): лог дано произвольное натуральное число
X надоДА при X – точный квадрат начZ: нат Z := Round ( Sqrt ( X ) ); Точный_квадрат := Z * Z = X кон
Function Exact_Square ( X: LongInt ): Boolean; Var Z: LongInt; Begin Z := Round (Sqrt(X)); Exact_Square := Z * Z = X End;
2. Решение задачи “Високосный год”.
Задача L.2.3. “Високосный год”. Задан год, выраженный некоторымнатуральным числом R. Построить алгоритм и подпрограмму для определения того, является ли этот год високосным.
Известно, что високосные годы содержат по 366 суток, в отличие от простых лет, содержащих по 365 суток. Лишний день в високосном году добавляется к февралю месяцу, продолжительность которого становится равной тогда не 28, а 29 дням. Високосные годы вводят для устранения расхождения календаря со счётом солнечных лет. Календарь начинается с года R =1.
Правило для определения високосного года содержит основной признак и исключение.
Основной признак состоит в том, что год является високосным, если число делится на 4 без остатка. Например, 1996 год високосный, так как 1996 mod 4= 0, а 2001 год – невисокосный, так как 2001 mod4=1, то есть остаток от деления на 4 не равен нулю. В виде логического выражения основной признак может быть записан как Rmod4 = 0. Если Rкратно 4, то это логическое выражение истинно, в противном
случае – ложно.
Исключение состоит в том, что год, число которого удовлетворяет основному признаку, всё же не является високосным, если это число делится без остатка на 100, но не делится без остатка на 400. Иначе говоря, среди лет, оканчивающихся двумя нулями, невисокосными будут все, кроме
тех, которые без остатка делятся на 400. Например, 1800 и 1900 годы – невисокосные, а 2000 год – високосный. В виде логического выражения исключение может быть записано как (Rmod100 = 0)и(Rmod400 <> 0). Чтобы год не был високосным, нужно, чтобы число оканчивалось двумя нулями (первая часть выражения), и при этом не делилось без остатка
на 400 (вторая часть выражения).
Общий результат, учитывающий и основной признак, и исключение, состоит в том, что год будет високосным, если число удовлетворяет основному признаку, но при этом не является исключением. Иначе говоря, если предположить, что значение основного признака представлено логической переменной
a, значение исключения – логической переменной b, то общий результат может быть вычислен с помощью логического выражения aинеb. Это выражение будет истинным только в том случае, если год является високосным.
Теперь можно построить алгоритм решения поставленной задачи в виде функции логического типа, принимающей истинное значение только в том случае, если заданный год является високосным.
Алгоритм и его перевод на Паскаль выглядят следующим образом:
алг ВГод ( R: нат ): лог дано число года R>0 надоДА, если год високосный начa,b: лог a := R mod 4 = 0; b := (R mod 100 = 0) And ( R mod 400 <> 0); ВГод := aинеb кон
Function Leap_Year ( R: Word ): Boolean; Var a,b: Boolean; Begin a := R mod 4 = 0; b := (R mod 100 = 0) And (R mod 400 <> 0); Leap_Year := a And Not b End;
В заключение отметим, что естественное ограничение на аргумент R >0.
Решение обеих задач в виде программ запишите самостоятельно.
Таким образом, мы с вами, уважаемые подписчики, продолжаем учиться составлять простейшие алгоритмы с результатами логического типа, переводить их на Паскаль и реализовывать в виде программ.
Уважаемые подписчики!При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru