Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаборат работа 1_15 (программирование).docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
253 Кб
Скачать
☆

Задача 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! ". Проверить функциональность программы самостоятельно.