Обсуждается учебная программа по программированию на С++ для студентов, обучающихся в геодезическом вузе. Данная программа предназначена для изучения таких понятий языка программирования С/С++ как типы переменных, объявление и инициализация переменных, использование арифметических операторов. Нашей целью является разработка набора типовых учебных задач с геодезическим содержанием [1–18], которые могут использоваться преподавателями и студентами, обучающимися по специальностям картографии и геодезии в качестве домашних заданий и при выполнении учебного практикума. Задача данной работы заключалась в разработке программы, иллюстрирующей определение высотной отметки по карте, на примере точки, лежащей между горизонталями с разными высотами.
Сделаем замечание, касающееся вопроса наименования переменных. Конечно, удобно, если имя переменной несет смысловую нагрузку, которое раскрывает ее назначение в программе. Например, в разработанной программе используются переменные с именами verticalInterval, contourInterval, когда речь идет о высоте сечения рельефа горизонталями и о кратчайшем расстоянии между горизонталями. Другими содержательными именами переменных являются следующие: переменная с именем lowerContourLine, используется для хранения отметки младшей горизонтали, переменная greaterContourLine – для хранения отметки старшей горизонтали. Еще две переменные distanceToLowerContourLine и distanceToGreaterContourLine предназначены для хранения значения расстояния от младшей горизонтали до выбранной точки и значения расстояния от старшей горизонтали до этой точки.
Рассмотрим геодезическую постановку задачи. Определение высоты точки по карте – часто встречающаяся задача при работе с топографическими картами. Как известно, если точка лежит между двумя горизонталями, то ее отметка определяется интерполированием. Для этого через интересующую точку проводят линию между двумя смежными горизонталями, называемую «заложением» и определяют расстояние от меньшей горизонтали до точки и для контроля расстояние от точки до большей горизонтали. Затем вычисляют высоту точки по формулам:
где Hmin и Hmах – отметки меньшей и большей горизонталей; h – высота сечения рельефа горизонталями; d – заложение горизонталей; a – расстояние от точки до меньшей горизонтали; b – расстояние от точки до большей горизонтали; Hср – среднее значение высоты искомой точки.
Программа, представленная ниже, иллюстрирует расчет среднего значения высоты точки в задаче определения отметок точек местности по топографической карте. Пусть, например искомая точка находится между младшей горизонталью lowerContourLine со значением 222 м и старшей горизонталью greaterContourLine со значением 224 м и пусть далее заложение горизонталей contourInterval = 5.0 мм, расстояние от точки до меньшей горизонтали distanceToLowerContourLine = 1.0 мм, расстояние от точки до большей горизонтали distanceToGreaterContourLine = 4.0 мм.
Рассмотрим код программы. В программе используется переменные, как с плавающей точкой, так и целочисленные. В строке 06 переменные типа int lowerContourLine и greaterContourLine инициализируются значением 222 и 224 соответственно. В строке 07 объявляется переменная verticalInterval типа int для хранения значения сечения рельефа. В строках 08 переменная contourInterval типа float инициализируются начальным значением 5,0 мм. Далее в строках 09–10 переменная distanceToLowerContourLine инициализируется значением 1,0 мм, а переменная distanceToGreaterContourLine значением 4,0 мм. Данные величины определяются на карте с помощью линейки и представляются в миллиметрах возможно с дробной частью, поэтому тип переменных для них определен как float. Поскольку значение высоты точки может быть дробным числом, поэтому переменные pointHeight_1, pointHeight_2 и pointHeight имеют тип float. В строке 14 вычисляется высота сечения рельефа, переменной verticalInterval присваивается значение выражения greaterContourLine – lowerContourLine. Затем в строке 16 вычисляется высота точки pointHeight_1 от младшей горизонтали и для контроля в строке 17 высота точки pointHeight_2 от старшей горизонтали. Выражения в строках 16 и 17 компилятор читает слева направо и поскольку арифметический оператор «сложение» имеет меньший приоритет по сравнению с арифметическими операторами «умножения» и «деления», то вначале выполняется умножение и деление, а потом сложение или вычитание.
Обратим внимание на особенность оператора деления, которая имеется в С/С++. Например, выполнив в программе такую арифметическую операцию как 9/4 мы не получим ожидаемый результат 2.25, вместо этого результатом будет целое число 2. Этот пример иллюстрирует целочисленное деление, такое деление, при котором отбрасывается дробная часть результата. Чтобы получить результат с дробной частью, об этом надо сообщить компилятору. Для этого делимое или делитель (либо и то и другое) должно быть представлено числом с дробной частью, в результате ответ также представляется числом с дробной частью. Если и делимое, и делитель представлено целым числом, то в результате получается целое число. В приведенном выше примере можно использовать запись 9./4, которая «говорит» компилятору, что число 9.0 является числом с плавающей точкой, тогда результатом деления тоже будет число с плавающей точкой. Можно более наглядно указать тот факт, что делимое принадлежит к вещественным числам, записав его в виде 9.0.
Поскольку все арифметические операторы, в том числе «умножить» и «разделить» выполняются над однотипными операндами, то в выражении verticalInterval*distanceToLowerContourLine вначале происходит выравнивание типов. Компилятор С++ сначала преобразует операнд к типу большого операнда, в нашем случае к типу float, и только потом выполняется арифметическая операция. Таким образом, сначала значение переменной verticalInterval преобразуется в тип float, затем выполняется умножение, и результат умножения verticalInterval*distanceToLowerContourLine дает число с плавающей точкой. Далее выполняется «без проблем» деление, так как и делимое и делитель имеют тип float. И наконец, в строке 16 выполняется сложение, причем значение переменной lowerContourLine тоже расширяется до типа float. Аналогичным образом происходит расширение значения переменных в строке 17. Далее в строке 19 вычисляется высота точки, как среднее значение двух измерений и полученный результат – отметка точки pointHeight выводится на экран. Если вы откомпилируете и запустите данную программу, на экране компьютера появится следующий фраза: «Высота точки 222.4 м».
Выводы
Разработана учебная программа на языке С++ для студентов, обучающихся в геодезическом вузе. В программе демонстрируется вычисление средней высоты точки в задаче определения отметки точки местности по топографической карте. Данная программа иллюстрирует структурное программирование на примере вычисления высоты точки, лежащей между двумя разноименными горизонталями.