Задача: Определить время, через которое встретятся два тела, равноускоренно движущиеся навстречу друг другу, если известны их начальные скорости,ускорения и начальное расстояние между ними.
[latex]a_1[/latex] | [latex]a_2[/latex] | [latex]V_{01}[/latex] | [latex]V_{02}[/latex] | [latex]S[/latex] | [latex] t[/latex] | Комментарий |
1 | 1 | 1 | 1 | 1 | 0.41 | Пройден |
3.2 | 2.1 | 3 | 7.5 | 20.8 | 1.45 | Пройден |
0 | 0 | 4 | 1 | 8 | 1.6 | Пройден |
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 |
import java.util.*; import java.lang.*; import java.io.*; class Depo { public static void main (String[] args) throws java.lang.Exception { double a1, a2, v01, v02, s, t, a, b, D; Scanner in = new Scanner(System.in); a1= in.nextDouble(); a2= in.nextDouble(); v01= in.nextDouble(); v02= in.nextDouble(); s= in.nextDouble(); a= (a1 + a2)/2; b= v01 + v02; if(a == 0) t= s / b; else{ D= b*b + 4*a*s; t=(-b + Math.sqrt(D))/(2*a); } System.out.println(t); } } |
Для решения этой задачи использовались формулы:
[latex]S=V_0t+\frac{at^2}{2}[/latex]Так как расстояние делится на две части, то получаем:
[latex]S=V_{01}t+\frac{a_1t^2}{2}[/latex], [latex]S=S_0 — V_{02}t+\frac{a_2t^2}{2}[/latex]Значит [latex]S_0=V_{01}t+\frac{a_1t^2}{2}+V_{02}t+\frac{a_2t^2}{2}[/latex]. Получаем уравнение времени:
[latex]t^2(\frac{a_1+a_2}{2})+t(V_{01}+V_{02})-S_0=0[/latex]Упрощаем коэффициенты уравнения :
[latex]a=\frac{a_1+a_2}{2}[/latex], [latex]b=V_{01}+V_{02}[/latex], [latex]at^2+bt-S_0=0[/latex]Если [latex]a=0[/latex], находим корень уравнения по формуле [latex]t=\frac{S_0}{b}[/latex]. Если же [latex]a[/latex] не равняется нулю, находим дискриминант по формуле [latex]D=b^2+4aS[/latex], дискриминант в данной задаче всегда положителен. Нет смысла находить время по формуле [latex]t=\frac{b^2-\sqrt{D}}{2a}[/latex], так как время не может быть отрицательным, остается использовать [latex]t=\frac{b^2+\sqrt{D}}{2a}[/latex] — это и будет искомое время.
Код для Java
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 |
import java.util.*; import java.lang.*; import java.io.*; class Depo { public static void main (String[] args) throws java.lang.Exception { double a1, a2, v01, v02, s, t, a, b, D; Scanner in = new Scanner(System.in); a1= in.nextDouble(); a2= in.nextDouble(); v01= in.nextDouble(); v02= in.nextDouble(); s= in.nextDouble(); a= (a1 + a2)/2; b= v01 + v02; if(a == 0) t= s / b; else{ D= b*b + 4*a*s; t=(-b + Math.sqrt(D))/(2*a); } System.out.println(t); } } |
1. Оформление. В тексте условия задачи сделаны 3 абзаца прямо в середине предложений. Так нельзя. Удалите лишние переводы строки. Переход на новую строку осуществляется автоматически в зависимости то ширины окна и величины шрифта. вам нужно заботиться только об абзацах. Весь текст немотивированно «украшен» пустыми строками. Уберите их, пожалуйста. В тексте «Присваиваем коэффициентам a и b » a и b тоже формулы.
2. Обозначение для начальных скоростей выбраны неудачно. Опустите второй индекс вниз. Иначе он выглядит как сомножитель — v_{01}
3. Как Вы разбираетесь со знаками корней? Опишите. Какими они могут быть?
— Формулы перед «Значит…» нужно разделить запятыми иначе они сливаются.
— В формуле после «Значит…» потеряны «попаламы» у ускорений.
— Дальше «попаламы» не появились, зато путь удвоился. Так можно, но тогда нужно и сумму скоростей удвоить.
Саша! Тесты пишутся именно для того, чтобы проверить правильность решения. Нужен тест, который Вы можете просчитать в уме или на бумаге. Например, 0 0 1 1 2. Ускорений нет, скорости 1, расстояние 2. Через сколько встретятся? Через 1.
Что пишет Ваша программа — через 0 секунд. Ну, ежу ясно, что где-то ошибка.
Не будете писать тесты, оценка будет ниже, чем вы можете получить. Мне будет обидно. Поверьте, если бы тесты в реале были не нужны, Вам бы про них ничего не говорили. Но мы с коллегами немного понимаем в «промышленном программировании». Уж, поверьте.
Код изменен. Нашел ошибку в выведении формулы. Отчет изменен под новый код. Тесты проверены.
Вот зачем врать? Честные тесты с ненулевым ускорением и близко не проходят.
Теперь Вы саму формулу равноускоренного движения неправильно записали — квадрат у времени, а не у ускорения.
Саша, я попытался убедить Вас в важности «ручного» составления разумных тестов. Видимо не смог. Вы продолжаете упрямиться и вынуждаете меня проверять сырой код, который сами не тестировали всерьёз. В оформлении кода даже отступов нет.
— Формулы после “Упрощаем коэффициенты уравнения” нужно разделить запятыми иначе они сливаются.
— В Вашей версии «уравнение времени» имеет 4-ю степень. Коэффициентами называются ЧИСЛА при переменной. Коэффициенты не могут зависеть от самой переменной. Странно, что вы не можете привести подобные и вынести за скобки.
— Поставьте правильные отступы в программе
— Уберите 10 пустых строк в конце текста
— Почему среднеарифметическое модулей корней даёт ответ на вопрос задачи?
— Вы заметили, что по Вашим формулам оба объекта начинают движение из одной и той же точки. А по условию — из разных.
Не хотите подумать? Это простенькая школьная задача. Может Вам рисунок сделать?
Молодец! Засчитываю с одним условием.
Можете расставить сдвиги строк как положено?
А почему строка D= b*b + 4*a*s; не в условном операторе? Она имеет смысл при a равном нулю?
В С++ версии она у Вас в условном операторе…
Теперь засчитываю, 10 баллов.