Какие бывают константы в алгоритмическом языке программирования
Перейти к содержимому

Какие бывают константы в алгоритмическом языке программирования

  • автор:

Магические константы в алгоритмах

В настоящее время широко известны такие принципы написания программного кода (coding standards), которые позволяют облегчить его поддержку и развитие. Эти принципы используются многими софтверными компаниями, а средства разработки и статического анализа кода предлагают для этого разнообразную автоматизацию. В то же время инженерные задачи в программировании явно требуют расширения понятия «хороший код». Мы попробуем выйти на обсуждение «хорошего» инженерного кода через, казалось бы, весьма частный пример — через практику использования в алгоритмах константных параметров.

Сразу хочется отметить, что эта статья ставит перед собой задачу повышения самоконтроля разработчика, особенно начинающего свою карьеру. Все приведенные далее примеры нужно рассматривать как модельные ситуации, вне привязки к какой-то конкретной вычислительной задаче или какому-то конкретному алгоритму. Можно сказать, что наша цель — сформулировать некоторые паттерны качественного инженерного/алгоритмического программирования.

Давайте подумаем, режет ли нам глаз такой код:

if (abs(leftVoltage - rightVoltage - 150.7 * balanceCurrent) > 0.002) doSomethingImportant(); 

Лично мне режет очень сильно. Во-первых, совершенно непонятно, что такое 150.7?
Вполне возможно, что 150.7 — это сопротивление точного резистора, которое варьируется от одного экземпляра устройства к другому, и на самом деле должно быть считано из калибровочного файла. Что же такое 0.002? Похоже, что это некоторый экспериментальный порог, который может быть уточнен впоследствии, хотя об этом нет никакого специального комментария.

Первая кровь

Представим себе junior-программиста Алешу, которому предложили задачу по автоматизации контроля качества заклепок для космических кораблей компании Inhabited Galactic. По конвейеру поступают эти заклепки и их фотографирует цифровая камера. Алеше необходимо написать код, который анализирует фотографии этих заклепок и принимает решение о соответствии или несоответствии формы заклепки ее нормативу.

Предположим, что к удовольствию своих начальников Алеша быстро реализовал некоторый алгоритм оценки заклепок. Этот алгоритм отлично разделял изображения плохих и хороших заклепок из тестового набора, задача была решена и Алешу переключили на другой проект.

Затем произошло следующее. Заклепок пошло несколько больше, скорость конвейера возросла и инженер Боря немного укоротил выдержку камеры.
При этом поступающие с камеры изображения стали несколько темнее, хотя заклепки все еще были хорошо видны. В то же время Алешин алгоритм начал иногда ошибочно браковать качественные заклепки. Что же произошло?

Пусть это входное монохромное изображение размера с координатами и . Алеша заметил, что пискели заклепки во всех тренировочных изображениях можно было найти пороговой фильтрацией:

При этом качественную заклепку можно было найти по площади:

Итого, Алеша ввел 4 эмпирических константы , , и , по крайней мере одна из которых () потеряла актуальность после перенастройки камеры.

Немного набравшись опыта, Алеша мог бы сделать следующее: перенести значения необходимых констант в конфигурационный файл и дополнить проектную документацию методом их практического вычисления. Это было бы лучше, чем просто спрятать эти значения внутри своего кода, но возложило бы на Алешиных коллег дополнительную задачу по ручной настройке его алгоритма. Конечно, такое решение трудно назвать удовлетворительным, хотя в особенно трудных ситуациях и оно имеет право на существование.

Какое решение было бы более разумным? Параметры полосовых фильтров для яркости и площади можно было перевести в относительные величины к средней яркости и площади изображения. Например, можно было бы заменить на , где — тоже эмпирическое, но уже более инвариантное значение.

Давайте попробуем предположить, что произошло дальше на заводе космических кораблей.
Так как качество отбраковки заклепок было недостаточным, то главный технолог Виталий, далекий от тонкостей программирования, решил срочно поставить на оценочный стенд более дорогую камеру с высокой чувствительностью и вдвое большим разрешением. Закономерный результат такой командной работы — 100%-ая отбраковка, так как все заклепки стали вдвое больше по числу пикселей и ни одна из них не прошла полосовой фильтр. Возможно, что спасло бы грамотное управление проектом, но сейчас мы не об этом.

Нормализация входных данных

Многих проблем с подбором констант можно избежать приводя входные данные к единообразному виду. Изображения — к одной форме гистограммы, 3D модели — к одному разрешению, etc. Зачастую против нормализации выдвигают такой аргумент, что она приводит к потере части исходной информации. Это действительно так, но упрощение дальнейшей работы с параметрами алгоритмов зачастую перевешивают этот минус.

Сама постановка задачи о максимальной нормализации входных данных позволяет разработчику подумать о том, что будет, если изображения придут с поворотом на 90 градусов? А если размеры придут в дюймах? А если кто-то передаст на вход 3D-модель высокого разрешения, которая передает тонкую фактуру материала?

Отличный пример, когда нормализацию, тем не менее, делать не нужно — поиск засвеченных пикселей (бликов) на фотографиях. Пиксели с максимальной яркостью RGB(255, 255, 255) могут образовывать тонкие полоски, которые немного смазываются во время масштабирования картинки. При этом этого яркость засвеченных пискелей усредняется с соседними пикселями и их становится почти невозможно отличить от просто ярких точек изображения. Соответственно, не удастся точно выделить и вырезать блики из изображения.

Калибровочные константы

При обработке достаточно низкоуровневых данных возникает классическая задача калибровки. Это может быть и преобразование напряжения на каком-нибудь терморезисторе в температуру, и преобразование отклика радара в координаты наблюдаемого объекта. Все эти преобразования так или иначе определяются набором постоянных параметров, а процедура определения этих параметров и называется калибровкой.

Калибровочные параметры как правило поступают из внешних источников. Страшный грех — захардкодить эти параметры. Если такой код сразу не отсеять на code review, то он сможет долго портить поведение программного продукта в целом, оставаясь при этом вне подозрений. Система просто будет работать не совсем точно, но едва ли где-то выскочит сообщение об ошибке.

Для полноты картины, однако, необходимо отметить, что в некоторых задачах возможна автокалибровка, когда внутренние зависимости наблюдаемых величин позволяют вычислить также и калибровочные параметры. Смотрите, например, последние главы Multiple View Geometry или работы по Uncalibrated Structure from Motion, где калибровочные параметры камер определяются из набора перекрывающихся снимков с разными ракурсами.

Общие замечания

Давайте константам осмысленные имена и комментируйте их значения. Помните, что это очень хрупкая часть кода, которая не защищена типизацией языка или мудростью компилятора.

Группируйте параметры алгоритмов в структуры. Это обычно улучшает читаемость кода и позволяет не прозевать какой-нибудь важный параметр во время отладки.

Если вы знаете, что один какой-то параметр выражается через другие, обязательно отразите эту связь в коде. В противном случае кто-нибудь с самыми лучшими намерениями поменяет ваши неоптимальные, но консистентные параметры на неконсистентные. Например, вы ищете на изображении кружочки радиусом = 10 и площадью = 314. Это плохо, так как на самом деле у вас один параметр — радиус = 10, а . Код с двумя параметрами может быть легко сломан программистом, забывшим школьную математику, а код с одним параметром выглядит гораздо надежнее.

Бывает так, что в алгоритм входит какая-то неэмпирическая константа. Например, нужно оценить хвост какого-нибудь распределения. Точность такой оценки определяется в большей степени математической подготовкой автора алгоритма.
Константы-оценки иногда можно улучшать, но такое улучшение обычно является изолированной задачей. Важно прокомментировать этот факт для других разработчиков.

Резюме

  • Константы имеют осмысленные имена
  • Значения констант определяются перед логическим блоком в котором они используются
  • Крупные блоки констант организованы в структуры/классы параметров
  • Функционально-зависимые параметры вычисляются через базисные параметры
  • Входные данные нормализуются
  • Калибровочные константы явно загружаются из конфигурационных файлов, а в противном случае возвращается сообщение об ошибке

Константы и переменные

Понятия «константа» и «переменная» рассматриваются в одном разделе, потому что эти понятия очень близки по своей сущности.

Понятие константы

Константа — это составная часть программы; объект, имеющий значение.

Понятие «константа» в программе аналогично тому же понятию, используемому в математических уравнениях. Это — неизменная величина. Для более полного описания сущности константы, используемой в алгоритмическом языке, обратимся к известным физическим и математическим константам.

Человечеством открыты такие константы, значение которых от нас не зависит. К ним в физике относится, например, ускорение свободного падения, равное 9,8 м/с/с, а в математике — число пи = 3,14. Константы такого рода не могут быть признаны аналогией константы в алгоритмическом языке.

В математических уравнениях также используется понятие константы. Например, в уравнении Y = 3 * X + 7 числа 3 и 7 являются константами. Значение таких констант в полной мере зависит от воли человека, составившего уравнение. Это — ближайшая аналогия констант, используемых в программах на MQL4.

Константа (в виде значения) заносится программистом в код на этапе его создания. Константа характеризуется только своим значением, поэтому термины «константа» и «значение константы» являются полными синонимами.

Примеры констант:

37, 3.14, true, "Kazan"

Рис. 4. Константа в памяти компьютера.

Свойства констант

Свойством константы является её способность удерживать значение, заданное программистом, в течение времени работы программы и сообщать это значение программе при запросах программы (рис. 5). Для каждой константы, содержащейся в программе, компьютер отводит часть памяти необходимого размера. Значение константы не может быть изменено во время исполнения программы ни программистом, ни компьютером (рис. 6).

Значение константы всегда остаётся неизменным.

Рис. 5. Состояние ячейки памяти константы при сообщении значения программе.

Значение константы не может быть изменено в процессе работы программы.

Рис. 6. Изменение значения константы во время работы программы невозможно.

Понятие переменной

Переменная — это составная часть программы, имеющая значение и название.

Понятие переменной в языке MQL4 аналогично понятию переменной, принятому в математике. Разница между ними состоит лишь в том, что значение переменной в математике подразумевается, а значение переменной в исполняющейся программе хранится в специально отведенной для этого ячейке памяти компьютера.

Термин «идентификатор переменной» является полным синонимом терминов «имя переменной» и «название переменной». Переменная заносится создателем кода в его текст на этапе программирования в виде имени переменной. Имя переменной (идентификатор) может состоять из букв, цифр, знака подчёркивания. Однако начинаться оно должно с буквы. Язык MQL4 чувствителен к регистру букв, т.е. S и s — не одно и то же.

Примеры идентификаторов переменных: Alpha, alFa, beta, NuMbEr, Num, A_37, A37, qwerty_123
Следующие идентификаторы представляют названия разных переменных: a_22 и А_22; Massa и MASSA.
Примеры значений переменных: 37, 3.14, true, «Kazan».

Свойства переменной

Свойством переменной является её способность получать некоторое значение от программы, удерживать его в течение времени работы программы и сообщать это значение программе при запросах программы. Для каждой переменной в программе компьютер отводит часть памяти необходимого размера. Обратимся к рис. 7 и проследим, как устроены переменные.

Рис. 7. Переменная в памяти компьютера.

В ячейке памяти компьютера содержится значение переменной. Это значение может быть затребовано для обработки и изменено программой. Имя переменной никогда не изменяется. При создании кода программист может назначить переменной любое имя, но с момента, когда готовая программа запущена в работу, ни у программиста, ни у компьютера, ни у программы нет технической возможности изменить название переменной.

Если на пути выполнения программы встречается имя переменной, то программа обращается к этой переменной, чтобы получить для обработки её значение. Если программа обратилась к переменной, последняя сообщает программе своё значение. При этом значение переменной остаётся неизменным. Программа же получает в своё распоряжение копию значения, содержащегося в ячейке памяти, выделенной для этой переменной (рис. 8).

При сообщении значения переменной программе оно остаётся неизменным. Название (имя) переменной никогда не изменяется.

Рис. 8. Состояние ячейки памяти переменной при сообщении значения программе.

В течение некоторого времени переменная не имеет отношений с исполняемой программой. В это время программа может обращаться к другим переменным или производить необходимые вычисления. В период между случаями общения с программой переменная удерживает своё значение, т.е. сохраняет его неизменным.

В соответствии с выполняющимся алгоритмом, заложенным в программу, может потребоваться изменение значения переменной. В этом случае программа сообщает переменной её новое значение, а переменная получает это значение от программы. При этом в ячейке памяти производятся необходимые преобразования, в результате которых предыдущее значение переменной удаляется, а на его месте образуется новое значение переменной, сообщённое программой (рис. 9).

Значение переменной может быть изменено в результате воздействия программы. Название (имя) переменной остаётся неизменным всегда.

Рис. 9. Состояние ячейки памяти переменной при получении значения от программы.

Примеры констант и переменных в программе

В программе константы и переменные встречаются в операторах. В данном тексте программы А и В являются переменными, а 7 и 3 — константами:

A = 7; // Строка 1
B = A + 3; // Строка 2

Проследим, как программа работает с константами и переменными. Исполняя эти строки, программа выполнит следующие шаги:

  1. Константа 7 сообщает своё значение программе.
  2. Переменная А получает значение 7 от программы.
  1. Программа обнаружила выражение справа от знака равенства и стремится его вычислить.
  2. Константа 3 сообщает своё значение программе.
  3. Программа обращается к переменной А по имени.
  4. Переменная А сообщает своё значение (7) программе.
  5. Программа производит вычисления (7 + 3).
  6. Переменная В получает значение 10 от программы.

В процессе работы программы значение переменной может быть изменено. Например, в программе может встретиться строка, в которой написано следующее:

В = 33; // Строка 3

В этом случае при исполнении программы будет выполнено следующее:

  1. Константа 33 сообщает своё значение программе.
  2. Переменная В получает (новое) значение 33 от программы.

Легко заметить, что на некотором этапе выполнения программы переменная В получает значение 10, а в ходе дальнейших вычислений — значение 33. В результате этих событий название переменной В остаётся неизменным, а значение переменной изменяется.

На рис. 10 показаны константы и переменные в тексте программы:

Рис. 10. Константа и переменная в программе.

Алгоритмический язык. Запись переменных и констант. 9-11 класс

Программирование на алгоритмическом языке

1. Алгоритмический язык. Запись переменных и констант.

9-11 класс
Урок 2
Автор: Руденко Н.А.
учитель информатики
ГБОУ «Гимназия «Свиблово»

2. Переменные в алгоритмическом языке

• В математике переменная – это некая неизвестная
величина, например х.
• В информатике переменная – это область памяти,
в которой могут храниться различные значения.
Эти значения могут изменяться в ходе
выполнения программы.

3. Например:

• В памяти компьютера выделены ячейка памяти
для переменной А и ячейка памяти для
переменной В.
А
В
Изначально эти ячейки считаем пустыми.
Чтобы в этих ячейках появились значения надо
выполнить операцию присваивания :=

4. Например:

А:=3
В:=5
А:=4
В:=10
(читается: переменной А присвоено значение 3,
переменной В присвоено значение 5)
А
В
43
10
5

5. Например:

• Какие значения будут иметь переменные X, Y и Z после
выполнения программы:
X:=7
Y:=9
X:=X*2
Z:=X+Y
X
Y
7
14
9
Z
23

6. Определения

• Переменные – это величины, значения которых
могут изменяться в процессе выполнения
алгоритма или программы.
• Идентификаторы – это имена, которые
программист назначает переменным.
• Имя переменной (идентификатор) всегда
обозначается буквами латинского алфавита и
цифрами, при условии, что первой всегда стоит
буква: В1, MAX, Х4, Y и т.д.

7. Константа

• Константа – это величина, которая в ходе
выполнения алгоритма или программы всегда
имеет только одно значение и оно не может быть
изменено.
• Например: PI. При написании имени переменной
PI программа сама подставляет значение
3,1415926535 в ячейку памяти данной
переменной.

8. Запись значений переменных и констант

Значения переменных и констант могут быть
не только целыми, но и дробными. Существует 2е формы записи десятичных чисел:
1) Запись с фиксированной точкой (естественная
форма записи): 25.347
Вместо привычной , ставится десятичная .

9. Запись значений переменных и констант

2) Запись с плавающей точкой (экспоненциальная форма):
0.872Е8
• 0.872Е8 = 0.872·108 = 87200000
• Общий вид записи: ±mE ±p,
где m – мантисса числа (основа)
Е – основание системы 10
р – порядок или степень числа
Знак мантиссы определяется знаком числа, знак степени
указывает направление перемещения десятичной точки в
числе: + вправо, — влево

10. Например:

• + 7.945Е-2 = 0.07945
(точка переместилась влево)
• — 0.000523Е+4 = — 5.23
(точка перемещается вправо)
• Запишите число 0.05429 таким образом, чтобы мантисса
была целым числом
0.05429 = 5429Е-5
• Чтобы мантисса имела вид записи с сотыми долями
0.05429 = 5429Е-5 = 54.29Е-3

Школьный алгоритмический язык. Урок 2. Типы переменных

Школьный алгоритмический язык. Урок 2. Типы переменных

Чтобы объявить переменную используется синтаксис тип . Вот некоторые примеры объявления переменных:

1 2 3 4
цел per вещ ver сим str лит mng

Допустимо объявление нескольких переменных одного и того же типа в одной строке, для этого каждая из них должна быть отделена запятой.

цел i,mn,summ
Основные типы данных в Школьном алгоритмическом языке
  • цел — целочисленный тип данных.
  • вещ — тип данных с плавающей запятой.
  • сим — символьный тип данных.
  • лит — строковый тип данных.
  • лог — логический тип данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *