Программа исследований:
1. Формализация задачи
2. Составление алгоритма решения
3. Написание программного кода
4. Отладка и тестирование программы
Подготовка к выполнению работы:
1. Изучить материал настоящего руководства и рекомендованную литературу (структура программы на языке высокого уровня, алфавит и элементарные конструкции языка С++, переменные и константы, стандартные типы данных).
2. Практически освоить порядок работы на ПЭВМ в среде программирования Visual C++.
Материалы для подготовки к занятию:
1. Конспект лекций
2. [1] стр. 22-26
3. [2] стр. 48-91
Методические рекомендации
Задача 1. Координаты брошенного под углом тела
Рассмотрим программу, в которой вычисляются координаты тела, брошенного под углом к горизонту. Если телу в начальный момент сообщена скорость v и тело брошено под углом αк горизонту, то зависимость x -координаты от времени t дается соотношением . Для у -координаты закон движения имеет вид , где есть ускорение свободного падения. Время полета тела до падения составляет . В программе вводится значение скорости тела и угол, под которым тело брошено к горизонту. Угол вводится в градусах, поэтому вводимое значение переводится в радианы (умножается на и делится на 180). Далее вычисляется время полета тела, и пользователю предлагается ввести момент времени (не превышающий время полета тела), для которого необходимо рассчитать координаты тела. Эти координаты выводятся на экран. Код программы приведен в листинге 1.
|
|
Листинг 1. Тело брошено под углом к горизонту
Для использования встроенных математических функций в блок заголовков включена команда #include <math.h>. Результат выполнения программы может выглядеть следующим образом (жирным шрифтом выделены данные, вводимые пользователем):
В программах такого типа разумнее предусматривать возможность вычисления координат для разных моментов времени. Делается это с помощью условных операторов и операторов цикла.
Задача 2. Средняя скорость движения мотоциклиста
Решим задачу о вычислении средней скорости движения мотоциклиста на участке от пункта А до В через пункт Б, если расстояние между пунктами А и Б составляет , а расстояние между пунктами Б и В равно S2. Время движения мотоциклиста между пунктами А и Б равно , а время движения между пунктами Б и В равно Средняя скорость определяется как Параметры S1, S2, t1 и t2 вводятся пользователем с клавиатуры. Программный код приведен в листинге 2.
Листинг 2. Средняя скорость мотоциклиста
Результат выполнения программы может выглядеть следующим образом:
Выше предполагалось, что расстояние вводится в километрах, а время - в часах.
|
|
Задача 3. Высота орбиты спутника
В следующей задаче необходимо определить высоту орбиты спутника h над поверхностью Земли, если известны масса (кг) и радиус (м) Земли, масса спутника т, период его обращения Т. Масса спутника в данном случае при расчете высоты орбиты не нужна, а период обращения вводится пользователем.
При решении этой задачи воспользуемся тем, что сила гравитационного притяжения между Землей и спутником равна где (Нм2/кг2) - универсальная гравитационная постоянная. С другой стороны, эту же силу по второму закону Ньютона можно записать как где есть центростремительное ускорение, а частота связана с периодом Т соотношением . Из этих соотношений получаем , что дает . Соответствующий программный код приведен в листинге 3.
Листинг 3. Высота орбиты спутника
Продолжение листинга 3
Результат выполнения программы может выглядеть следующим образом:
В программе использована встроенная функция pow() для вычисления кубического корня. Первым аргументом функции указывается возводимое в степень выражение, второй ее аргумент - степень, в которую возводится выражение. В данном случае степень равна 1/3. Однако в силу автоматического преобразования типов при вычислении выражения 1/3 используется целочисленное деление, в результате чего получаем 0. Чтобы избежать такой неприятности, во втором аргументе функции pow() использована инструкция (double) для выполнения явного приведения типов.
Обратите внимание на способ ввода больших чисел: они вводятся в формате мантиссы и показателя степени. Например, число (литерал) вводится как 6.672Е-11, а число – как 5.96Е24.
Задача 4. Колебания маятника
Маятник совершает колебания по закону . Частота колебаний известна. Известно также, что в начальный момент координата маятника положительна и в k раз меньше амплитуды А, а в момент времени значение координаты маятника равно . Напишем программу, в которой определяется амплитуда колебаний А.
Амплитуда колебаний определяется из соотношений (что дает )и . Можно найти точное аналитическое решение, но в данном случае в этом необходимости нет. Сначала по формуле вычисляем начальную фазу , а затем по формуле вычисляем амплитуду А.
Программный код приведен в листинге 4.
Листинг 4. Амплитуда колебаний маятника
//Директивы препроцессора подключить самостоятельно
В программе для вычисления арксинуса использована встроенная функция asin(). Результат выполнения программы может иметь вид:
Задача 5. Комплексные числа
Напомним, что любое комплексное число может быть представлено в виде , где х - действительная часть комплексного числа, у - мнимая часть комплексного числа, i - мнимая единица ( ). Такое представление комплексного числа называется алгебраическим. Существует тригонометрическое представление , где модуль комплексного числа , а аргумент такой, что и .
Напишем программу, которой вычисляется целочисленная степень комплексного числа, т.е. значение выражения . При этом воспользуемся соотношением . Таким образом, действительной частью числа является , а комплексной - . Программный код, в котором реализовано вычисление степени комплексного числа, приведен в листинге 5.
Листинг 5. Степень комплексного числа
//Директивы препроцессора
В результате выполнения программы получаем, например, следующее:
В программе вводится действительная и мнимая части комплексного числа, а также целочисленная степень, в которую нужно это число возвести. От алгебраического представления числа переходим к тригонометрическому, для чего вычисляется модуль числа и аргумент. Аргумент вычисляется с помощью встроенной функции atan2(), аргументами которой передаются комплексная и действительная части комплексного числа, а результатом является аргумент (угол на соответствующую точку на плоскости). Корень квадратный при вычислении модуля вычисляется с помощью встроенной функции sqrt().
|
|
Далее вычисляется модуль и аргумент комплексного числа, которое получается возведением в указанную степень исходного комплексного числа. По модулю и аргументу вычисляется действительная и мнимая части, которые и выводятся на экран.
Задача 6. Прыгающий мячик
В рассмотренных выше задачах использовались элементарные арифметические операции. На практике в таких простых случаях применение программных средств является малоэффективным. Программы обычно создаются для того, чтобы решать сложные вычислительные задачи, с использованием алгоритмов, основанных на циклах, и проверкой всевозможных условий. Далее рассмотрим задачу, в которой для реализации точки ветвления используется тернарный оператор. Условие задачи формулируется следующим образом.
Мяч бросают без начальной скорости с высоты h. Мяч, долетая до пола, отбивается (без потери энергии) и подпрыгивает вертикально вверх, затем снова падает на пол, отбивается и т.д. Надо написать программу, которой определяется высота мячика над полом в заданный пользователем момент времени.
Программный код, которым решается эта задача, приведен в листинге 6.
Листинг 6. Прыгающий мячик
// Директивы препроцессора
...
Желающие могут самостоятельно протестировать работу программы. Параметры подобраны так, что до пола мячик долетает за 4 секунды. Такое же время уходит на подъем на максимальную высоту.
При составлении программного кода принята во внимание симметрия задачи. Совершенно очевидно, что для восстановления таких параметров мячика, как высота и скорость, в произвольный момент времени достаточно проследить динамику мячика от начала падения до отбивания от пола. После отбивания от пола до подъема на максимальную высоту (которая совпадает с начальной высотой, с которой бросают мячик) динамика мячика может быть восстановлена, если пустить время в обратном направлении: при отражении от пола мгновенно (такое используется приближение) меняется направление скорости (при этом модуль скорости не меняется). Поэтому, прокрутив картинку в обратном порядке, получим динамику мячика после отбивания от пола. В частности, если при падении мячик пребывал на некоторой высоте в момент времени t (время t отсчитывается от момента бросания мячика), то при движении вверх на этой же высоте мячик будет в момент времени Т — t (здесь время t отсчитывается от момента отбивания мячика от пола, а через Т обозначено время падения мячика).
|
|
В программе реализуется следующий алгоритм. Пользователем вводится время (переменная t), для которого необходимо рассчитать положение мячика. Затем в соответствии с формулой командой T = sqrt(2 * h/g) вычисляется время падения мячика до первого отбивания от пола. Время Т - это фактически полупериод движения мячика, поскольку за время 2T мячик оказывается в той же точке с той же скоростью.
Целочисленный параметр n, вычисляемый командой n = (int)t/T, является целой частью от деления времени t на полупериод Т. Если n - число четное, то в момент времени t-n*Т мячик был в том же месте, что и в момент времени t. Однако момент времени t-n*T однозначно попадает в интервал времени, когда мячик падал с начальной высоты до первого удара о пол. Если n - число нечетное, то мячик будет находиться в том же месте, где он находился в момент времени T - (t-n*T). Поэтому в программе переменная t переопределяется с помощью команды t=n%2? T - (t-n*T): t-n*T. Переменной t в качестве значения присваивается результат вычисления тернарного оператора. Проверяемым является условие n%2 - остаток от деления n на 2. Это число, равное 0 или 1. Напомним, что нулевое значение интерпретируется как логическое значение false, а прочие числовые значения (в том числе и 1) - как true. Если остаток от деления равен 1 (n - число нечетное), переменной t в качестве значения присваивается результат выражения T-(t-n*T). B противном случае переменной t присваивается значение t-n*T.
После выполнения тернарного оператора значение переменной t попадает во временной интервал, когда мячик падал первый раз. Высота шарика над полом вычисляется в соответствии с формулой командой x=h-g*t*t/2.
Задача 7. Умножение на два в степени
Рассмотрим простую программу, представленную в листинге 7, в которой введенное пользователем целое число умножается на 2 в целочисленной степени (показатель степени также вводится пользователем). Для выполнения умножения использован оператор побитового сдвига.
Листинг 7. Умножение на два в степени
Результат выполнения программы может выглядеть, например, так:
Для понимания работы программы нужно учесть, что побитовый сдвиг на одну позицию эквивалентен умножению соответствующего числа на 2. Поэтому сдвиг, например, на 4 позиции означает умножение числа на 16 (24 = 16).