#php #forms
#php #формы
Вопрос:
Я работаю над проектом, в котором мне нужно рассчитать часы и минуты, которые займет поездка на поезде, исходя из расстояния (в милях / час), сделанных остановок (добавлено 5 минут на остановку) и погоды (в хорошую погоду скорость поезда составляет 50 миль в час, в плохую погоду — 40 миль в час).). Я получаю правильный результат, когда запускаю его при хорошей погоде, но когда я набираю 50 миль, 2 остановки, плохая погода, я получаю 1 час и 20 минут, когда я должен получить 1 час и 25 минут. Вот мой полный код формы:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Passenger Train</title>
</head>
<header>
</header>
<body>
<h1>Passenger Train</h1>
<hr>
<p>Enter the distance and number of stops and specify if the weather is good or bad.</p>
<form method="POST" action="PassengerTrain.php">
<input type="text" name="distance" /> Distance (in miles)<br />
<input type="text" name="stops" /> Number of Stops<br />
<input type="radio" name="weather" id="goodWeather" value="goodWeather">
<label for="goodWeather">Weather is Good</label><br />
<input type="radio" name="weather" id="badWeather" value="badWeather">
<label for="badWeather">Weather is Bad</label><br />
<input type="submit" name="submit" value="Calc. Travel Time" />
</form>
<?php
if(isset($_POST['submit'])) {
if(is_numeric($_POST['distance']) amp;amp; is_numeric($_POST['stops'])) {
if($_POST['weather'] == "badWeather") {
$speed = 40;
}
else {
$speed = 50;
}
$distance = $_POST['distance'];
$stops = $_POST['stops'];
$hours = intval($distance / $speed);
$minutes = $distance % $speed;
$extraTime = $stops * 5;
$minutes = $extraTime;
if ($minutes > 60) {
$minutes = $minutes - 60;
$hours = $hours 1;
}
echo "Based on the information given your trip will take " . $hours . " hours and " .
$minutes . " minutes.";
}
else {
echo "You must enter numeric values for distance and number of stops.";
}
}
?>
</body>
</html>
Где я мог бы исправить эту проблему или что я сделал не так?
Ответ №1:
Это уравнение неверно:
$minutes = $distance % $speed;
Рассмотрим несколько примеров входных данных:
50 / 40 = 1 remainder 10
60 / 40 = 1 remainder 20
70 / 40 = 1 remainder 30
80 / 40 = 2 remainder 0
Еще яснее, представьте скорость 70:
135 / 70 = 1 remainder 65
Остаток здесь не представляет минуты, которые должны варьироваться от 0 до 59. Чтобы получить это, вам нужно что-то сделать, чтобы изменить делитель скорости на фиксированные 60 минут в час, например
$minutes = ($distance % $speed) / $speed * 60;
Или:
$minutes = (($distance / $speed) - $hours) * 60;
Или работайте в минутах и рассчитывайте часы в конце:
$minutes = $distance / $speed * 60;
while ($minutes > 60) {
$minutes = $minutes - 60;
$hours = $hours 1;
}
Или без цикла:
$hours = intdiv($minutes, 60);
$minutes -= ($hours * 60);
(Я не тестировал их, поэтому, возможно, допустил ошибку; будьте внимательны)
Комментарии:
1. Приятно, это на самом деле лучше, чем моя идея. РЕДАКТИРОВАТЬ: О, я на самом деле написал то же самое, что и предыдущий, он просто хорошо отформатирован.
Ответ №2:
Как указывалось, проблема в том, что вы не вычисляете минуты как минуты.
Чтобы сократить основное вычисление до 1 шага, вы можете добавить остановки ко времени, затраченному на скорость и расстояние, разделив общее время остановок (остановок * 5) на 60 (чтобы перевести его в десятичную дробь, представляющую части часа). Затем разделите это на часы и минуты без необходимости каких-либо дальнейших корректировок…
$time = $distance / $speed ($stops * 5) / 60;
$hours = intval($time);
$minutes = ($time - $hours) * 60;
который с вашими значениями даст…
Based on the information given your trip will take 1 hours and 25 minutes.
Ответ №3:
$minutes = $distance % $speed;
В случае расстояния 50 со скоростью 40 результат будет 10, а не 10 минут. А затем вы добавляете еще 2 * 5 к времени в минутах, давая конечный результат 20.
Лично я бы использовал минуты для вычисления расстояния и только в самом конце изменил его на часы минуты. Будьте осторожны, так как 40/50 даст 1,25 часа, что составляет 1 час 15 минут, а затем вы добавляете оставшиеся 10 минут, подсчитывая последние 1 час 25 минут.