@stalkerxxl

Правильно ли решил задачку о светофоре?

Всем добра! Потихоньку изучаю php (уже прошел операторы, константы, циклы, массивы, функции). Нашел простенькие задачки и вот решил одну из них.. Подозреваю, что решил ее очень примитивно.. Покритикуете? Может изначально - можно было по-другому подойти, более профессионально? Просьба сильно не кричать... Цель вопроса: понять "правильное русло мышления в php", чтобы не пополнять собой ряды гавнокодеров...
<?php
error_reporting	(E_ALL); // включаем лог ошибок
/*Работа светофора запрограммирована таким образом: с начала каждого часа, в течении трех минут горит зеленый сигнал, следующие две минуты горит красный, дальше в течении трех минут - зеленый и т. д. Вам нужно разработать программу, которая по введенному числу определяла какого цвета сейчас горит сигнал.*/
 
$time = date("i");  //получаем текущие минуты в формате 00 - 59

//$length = strlen($time);  получаем длину строки (не нужно уже, так как всегда две цифры..)

$lastMinute = substr($time, 1); // получаем последнюю цифру минут
/*echo $lastMinute;

echo $time;*/

function svetofor($color){
    global $time;
    if ($color == 0 or $color == 1 or $color == 2 or $color == 5 or $color == 6 or $color == 7){
        echo "Светофор - зеленый, сейчас ". $time." минута";
    }else{
         
    echo "Светофор красный, сейчас ". $time." минута";}
    }
    
svetofor($lastMinute); //вызываем функцию
?>
  • Вопрос задан
  • 2556 просмотров
Пригласить эксперта
Ответы на вопрос 4
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
<?php
/*Работа светофора запрограммирована таким образом: 
с начала каждого часа, в течении трех минут горит зеленый сигнал, 
следующие две минуты горит красный, 
дальше в течении трех минут - зеленый и т. д. 
Вам нужно разработать программу, которая по введенному числу определяла 
какого цвета сейчас горит сигнал.*/

error_reporting	(E_ALL); // включаем лог ошибок

function numTail($m) {
 switch ($m) {
  case 0:case $m%10==0:default:return '';
  case $m!=11 && $m%10==1: return 'а';
  case ($m<10 || $m>20)&&($m%10==2||$m%10==3||$m%10==4):return 'ы';
 }
}

function svetofor($m) {
  if($m%5>=1 && $m%5<=3) return "зелёный";
  else if ($m>0) return "красный";
  else return 'никакой';
}

$m = date("i"); //0-59 минуты.
$m=46; //для теста.
//Сейчас 46 минут и горит зелёный.

?>
<div>
Сейчас <?=$m?> минут<?=numTail($m)?> и горит <?=svetofor($m)?>.
</div>
Ответ написан
@mletov
$color == 0 or $color == 1 or $color == 2 or $color == 5 or $color == 6 or $color == 7


Чтобы не было таких конструкций, надо либо писать что-то типа $color>=0 && $color<=7, а если нумерация не сквозная, то пользоваться функцией in_array. Представьте, что у вас тут будет 50 or.

Название входного параметра в svetofor. Передается $lastMinute, а внутри функции переменная называется $color. Как другому программисту понять, что это, последняя цифра минут или цвет?

$lastMinute = substr($time, 1);
Лучше использвоать intval
Ответ написан
@QwaiBri
Тоже начал учить php и столкнулся с такой же задачей. Как по мне, у меня получилось очень краткое и понятное решение этой задачи)

<form action="index.php" method="post">
      Введите число от 1 до 60: <br>
      <input type="text" name="num" placeholder="number" autocomplete="off"><br>
      <input type="submit" name="submit" value="Отправить" autocomplete="off"><br>
   </form>


// создаем массив с остатками от чисел, когда горит красный свет
      $arr = array(0, 4, 5, 9);
      //Переменная, которая принимает число, которое ввел пользователь
      //Находим остаток этого числа при делении на 5
      $choice = $_POST["num"] % 5;
      //Проверяем равно ли число пользователя числу из массива
      if(in_array($choice, $arr)) {
         echo "Горит красный свет";
      } else {
         echo "Горит зеленый свет";
      }


Не уверен, понятно ли объяснил, но код работает и это главное))
Ответ написан
@Dmitry1R
Я новичок и тоже с толкнулся с этой задачей. Решил её так, возможно я сделал всё не правильно, есть знающие укажите на ошибки. (Всё вроде работает либо я не правильно понимаю). Заранее спасибо!

<?php

$green = 'GREEN';
$red = 'RED';
$minute = $_GET['min'];
if($minute[1] >= 0 && $minute[1] <= 2 or $minute[1] >= 5 && $minute[1] <= 7){

  $color = $red;

}else { $color = $green; }

echo $color;
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы