- •Время на выполнение работы: 2 часа
- •Задача 2. Средняя скорость движения мотоциклиста
- •Задача 3. Высота орбиты спутника
- •Задача 4. Колебания маятника
- •Задача 5. Комплексные числа
- •Задача 6. Прыгающий мячик
- •Задача 9. Атака подводной лодки
- •Задание на исследование
- •Контрольные вопросы
- •Задачи для самостоятельного решения
Задача 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).
Задача 8. Решение простого уравнения
В качестве небольшой
иллюстрации применения логических
операторов приведем программу, которой
относительно переменной х
решается
уравнение вида
.
Особой интриги в этом уравнении нет.
При ненулевых значениях а
и b
решением
является x
.
Если a
= 0, то
возможны два варианта: при b
= 0
решением является любое число х,
а при
уравнение решений не имеет. Именно эти
варианты и необходимо предусмотреть в
программе. Сразу отметим, что приведенный
в листинге 8 код не является оптимальным,
это всего лишь иллюстрация: подобного
рода задачи решаются несколько иными
способами.
Листинг 8. Решение простого уравнения
В программе
используются переменные а
и b
для записи параметров уравнения, а также
логическая переменная state
для записи результатов проверки условий,
которые определяют решение уравнения.
После ввода параметров уравнения
командой state
= (a != 0) переменной
state
присваивается результат проверки
условия
.
Если условие верно, значение переменной
state
равно true,
а если условие не верно, то значение
переменной state
равно false.
При верном условии а
!= 0 в
результате выполнения команды state?
(cout<<b/a<<endl, exit(0)):state= (a==0) &&
(b==0)
отображается значение корня уравнения
b/а
и завершается работа программы (инструкция
exit(0),
нулевой аргумент функции exit()
означает, что программа завершила работу
корректно). Поскольку первый блок
тернарного оператора состоит из
нескольких выражений, они разделяются
запятой и заключаются в круглые скобки.
Если условие а
!= 0 не
выполняется (т.е. коэффициент а
нулевой),
значение переменной state
изменяется с помощью команды state
= (а==0) && (b==0).
На самом деле в данном случае хватило
бы и команды state=
(b==0),
поскольку условие равенства нулю
коэффициента а
выполняется автоматически. Такая
«неидеальная» форма оставлена скорее
для наглядности.
Далее на экран выводится результат, возвращаемый выражением state?"any number !" : "no result! ". Проверить функциональность программы самостоятельно.
