Про "странные числа" в коде

Иногда в ваших программах вам может быть нужно использовать какие-то фиксированные числа, возникающие из смысла задачи. Например, если вы решаете задачу про часы, то, скорее всего, у вас в программе появятся числа типа 60 (минут в часах) или 24 (часов в сутках). Тогда вы прямо указываете это число в программе, как, например, в задаче "Электронные часы - 1" с уровня 1А:

b = a % 60  # питон
b := a mod 60;  // паскаль

Это абсолютно нормально. (Если вы будете потом писать серьезные большие программы, то от вас могут потребовать заводить специальные переменные-"константы" под эти числа, но сейчас речь не об этом, и в наших задачах это не обязательно.)

Но бывает так, что в программе вам нужно какое-то число, которое вы с ходу не знаете, которое вам надо как-то вычислять. Например, вам надо в программе знать, на какой угол (сколько градусов) сдвигается минутная стрелка за одну минуту. Вряд ли вы это число назовете с ходу из головы. Зато понятно, как его считать: надо полный угол (360 градусов) поделить на 12 часов и то, что получится, поделить на 60 минут.

Что вы в таком случае делаете? Вы берете калькулятор и на нем считаете, сколько будет 360/12/60. Вы получаете 0.5 и прямо так и оставляете это число (0.5) прямо в коде программы:

b = a * 0.5  # питон
b := a * 0.5;  // паскаль

Вот это уже неправильный подход.

Любой язык программирования прекрасно работает как калькулятор. Поэтому не надо использовать внешний калькулятор. Просто напишите в программе прямо полностью выражение:

b = a * 360 / 12 / 60  # питон
b := a * 360 / 12 / 60;  // паскаль

Вот так — намного лучше. Почему?

  • Во-первых, так проще. Вам не надо лезть в калькулятор, считать там что-то, и вводить результат число в программу. Вы сразу тут вводите формулу, и компьютер делает работу за вас.
  • Во-вторых, так надежнее. Вы можете случайно ввести в калькулятор не то число, или ошибиться при вводе результата в программу. Частая ситуация — если результат получается в виде длинной десятичной дроби, то вы вручную можете ввести слишком мало знаков. А компьютер посчитает за вас настолько точно, насколько он только может.
  • Наконец, так понятнее. Если вы вернетесь к своей программе через неделю, вы вряд ли сразу вспомните, что такое 0.5 и откуда вы его взяли. А если вы увидите формулу 360/12/60, все сразу станет понятнее, т.к. 360, 12 и 60 — вполне понятные в этой задаче числа, и скорее всего вы сразу вспомните, почему что и на что вы делили. Аналогично, программа будет понятнее для других людей, кто ее будет смотреть. Наконец, если у вас в формуле на самом деле ошибка (как простейший пример — вы разделили на 24 вместо 12), то заметить ее намного проще, чем если бы у вас в программе был только результат.

Аналогичные соображения относятся и к другим ситуациям. Например, вам в программе может потребоваться код символа A. Вы можете посмотреть в таблицу символов и увидеть, что это 65. А можете написать ord('A'). Вот второй вариант намного лучше первого — пусть компьютер сам за вас считает, преимущества все те же, что описаны выше. Если вам надо знать, насколько коды заглавных букв отличаются от маленьких — тоже пишите формулу. И т.д.

Вообще, общее правило:

Если вам в программе нужно использовать число, которое вы сразу называете из головы (например, количество минут в часе), то просто пишите это число. Если же вам нужно число, которые вы как-то вычисляете, то не пишите его в программе, а пишите формулу.