«Отскоки»
Задача: Материальная точка бросается на горизонтальную плоскость со скоростью [latex]V[/latex] и под углом [latex]\alpha[/latex] к ней ( плоскости ). При каждом ударе о плоскость, кинетическая энергия точи уменьшается в [latex]\beta[/latex] раз. Найти абсциссы первых [latex]n[/latex] точек касания. Сопротивлением воздуха пренебречь.
По умолчанию примем количество интересующих нас отскоков равным 3.
[latex]V[/latex](speed)[latex]m/c[/latex] | [latex]\alpha[/latex](corner) | [latex]\beta[/latex] | Первая координата | Вторая координата | Третья координата | Комментарий |
10 | 15 | 2 | 5.09858 | 7.64787 | 8.92252 | Тест пройден |
8 | 30 | 4 | 5.65184 | 7.06480 | 7.41804 | Тест пройден |
27 | 45 | 3 | 74.3373 | 99.1164 | 107.376 | Тест пройден |
17 | 35 | 3 | 27.6926 | 36.9234 | 40.0004 | Тест пройден |
13 | 0 | 5 | 0.00000 | 0.00000 | 0.00000 | Тест пройден |
Замечание:
По неизвестной мне причине (думаю на погрешность округления) [latex]sin( \pi)[/latex] при вычислениях равен 1.24879e-15.
Исходный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <iostream> #include <cmath> using namespace std; int main() { double speed, corner, twice_corner, B, Sum=0, sqrspeed; // Ввод переменных типа double. const double g=9.80665; // Ввод неизвестной компьютеру константы. int num; //Ввод числа отскоков, которые будут нас интересовать. cout <<" Первое число - это скорость," <<endl <<" второе - угол," <<endl <<" третье - коэффициент уменьшения кинетической энергии," <<endl <<" четвертое - это число точек касания с плоскостью." <<endl; cin >> speed; //Ввод значений переменных. cin >> corner; cin >> B; cin >> num; if(speed<0||corner>90||corner<0||B<=0||num<=0){ // Проверка на недопустимые ситуации cout<<" Похоже произошла ошибка."<<endl<<" Пожалуйста, введите данные повторно."<<endl; return 1; } twice_corner=2*M_PI*corner/180; // Перевод величины угла из градусов в радианы и нахождение двойного угла sqrspeed=speed*speed; // Вычисление квадрата скорости точки for(int i=1;i<=num;i++){ // Цикл: вычисление координат по формуле и вывод результатов. double x; x=sqrspeed*sin(twice_corner)/g; Sum+=x; cout<<"Координата точки номер " << i <<" = " << Sum <<endl; sqrspeed/=B; } return 0; //Конец } |
Для решения задачи необходимо вспомнить уроки физики в начале десятого класса, а именно главу о движении под углом к горизонту. Воспользуемся формулой расстояния полета материальной точки [latex]S=\frac{V^2sin(2\alpha) }{g}[/latex] . По условию задачи сказано, что кинетическая энергия уменьшается при каждом отскоке в [latex]\beta[/latex] раз. Если рассмотреть формулу кинетической энергии: [latex]E_{k}=\frac{ mV^2 }{2}[/latex]- можно заметить, что [latex] m[/latex] (масса) является константой, значит изменяться может только [latex]V^2[/latex] (скорость тела в квадрате). Если условится, что материальная точка начинает движение в начале координат, то координата первого отскока будет равна [latex]S[/latex], второй — [latex]S+S_{1}[/latex], третьей — [latex]S+S_{1}+S_{2}[/latex], n-ой — [latex]S+…+S_{n-1}[/latex].
Алгоритм:
- Объявление переменных и константы(ускорение свободного падения).
- Вывод поясняющей информации.
- Ввод значений переменных.
- Проверка недопустимых ситуаций:
- Проверка угла: значения угла выше 90 градусов или отрицательное значение противоречат условию задачи.
- Проверка скорости: отрицательное значение будет означать движение в противоположную интересующей нас сторону.
- Проверка коэффициента уменьшения кинетической энергии: это число должно быть хотя бы положительным.
- Проверка числа интересующих нас отскоков: это должно быть натуральное число.
- Вычисление вспомогательных величин (двойной угол, скорость в квадрате).
- Создание вычислительного цикла.
- Вывод значений.
- Окончание работы.