Вопрос для калькулятора времени PHP на основе расстояния

#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 минут.