JavaRush
Акция
Университет
Java FullStack
Python FullStack
new
Web FullStack
new
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/Даже кастую в int, но валидацию не проходит
Artem Maliuga
15 уровень
  • 30.10.2018
  • 863просмотров
  • 16комментариев

Даже кастую в int, но валидацию не проходит

Вопрос по задаче Переходим дорогу вслепую
Java Syntax,  4 уровень,  4 лекция
Архивный

Работа светофора для пешеходов запрограммирована следующим образом:
в начале каждого часа в течение трех минут горит зелёный сигнал,
затем в течение одной минуты - жёлтый,
а потом в течение одной минуты - красный,
затем опять зелёный горит три минуты и т. д.
Ввести с клавиатуры вещественное число t, означающее время в минутах, прошедшее с начала очередного часа.
Определить, сигнал какого цвета горит для пешеходов в этот момент.
Результат вывести на экран в следующем виде:
"зелёный" - если горит зелёный цвет,
"жёлтый" - если горит жёлтый цвет,
"красный" - если горит красный цвет.

Пример для числа 2.5:
зелёный

Пример для числа 3:
жёлтый

Пример для числа 4:
красный

Пример для числа 5:
зелёный

Требования:
  • Программа должна считывать вещественное число c клавиатуры.
  • Программа должна выводить текст на экран.
  • Если горит зелёный цвет, необходимо вывести текст: "зелёный"
  • Если горит жёлтый цвет, необходимо вывести текст: "жёлтый"
  • Если горит красный цвет, необходимо вывести текст: "красный"
package com.javarush.task.task04.task0416; /* Переходим дорогу вслепую */ import java.util.Scanner; public class Solution { public static void main(String[] args) throws Exception { double t = new Scanner(System.in).nextDouble(); if ((int )t % 4 == 0) { System.out.println("красный"); } else if ((int)t % 4 == 3) { System.out.println("жёлтый"); } else { System.out.println("зелёный"); } } }
0
Комментарии (16)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Алексей
Уровень 41
30 октября 2018, 11:45
Не совсем понял, зачем сначала делать ввод дробного числа, а потом менять его на целое? Если по условиям ввод дробного, и в примере есть дробное, значит логично работать именно с этим типом. Необходимо разобрать случаи с дробными промежутками, где 0-2.99 это зеленый, а 3 это уже желтый. подсказка (<3 - зеленый), (>=3&&<4 - желтый).
0
hidden #1911629
Уровень 24
30 октября 2018, 11:50
Потому что в условии прописано, как программа должна отвечать при вводе 2.5. Если поменять на nextInt, то будет брошено исключение и программа свернется. В условиях проверки валидатора именно это значение и передается в программу.
0
Алексей
Уровень 41
30 октября 2018, 11:58
Если я правильно понимаю много не понятных слов, то вы согласны с тем, что это бессмысленное действие, т.к. 2,5 должно пройти проверку и выдать зеленый, а не быть исключением? Вопрос был для автора данного комментария, чтобы он задумался над своими действиями....или я что-то не то сказал?
0
hidden #1911629
Уровень 24
30 октября 2018, 12:00
Совсем не то сказал.)
Пример для числа 2.5:
зелёный
В программе стоит условие, что вывод при вводе 2,5 должен быть зеленый. Если он будет считывать целочисленный тип с ввода, то получит ошибку и завершение программы. Потому он считывает дробный тип с ввода, а потом пытается привести его в целочисленный. Всё верно, кроме способа приведения. Если простым языком, то когда ты вводишь 2,5 и пытаешься считать оттуда 2, то в строке остается ,5, программа пугается неожиданному результату и выключается. Нужно считать 2,5, потом превратить это внутри кода в 2 и с этим числом уже работать.
0
Алексей
Уровень 41
30 октября 2018, 12:28
Все равно не понимаю. В программе нет требования, чтобы число было целочисленным. Мы изначально ввели дробное число, что нам мешает и дальше его использовать, если нам необходимо учитывать 2,5, как отличное от 3? В своем решении, я прописал код без использования целочисленных и прошел проверку по всем параметрам.
+1
Алексей
Уровень 41
30 октября 2018, 12:31
Так, кажется я нашел проблему. Он вводит переменную, которая уже является остатком, а я вводил переменную и искал остаток от ее деления. От сюда весь сыр бор. (в том решении, которое он выдал в конце)
0
hidden #1911629
Уровень 24
30 октября 2018, 12:36
Нет требования, но с целочисленными работать проще. Я свой вариант ниже привел.
0
hidden #1911629
Уровень 24
30 октября 2018, 11:30
Дело не в касте. Что код выдаст, если я введу 0, например? Или 7? А если 9 введу? Даю сразу подсказку. Выводы некорректны ни для одного из перечисленных мною вариантов.
0
Artem Maliuga
Уровень 15
30 октября 2018, 11:35
Про 0 нет требований( писать что-то в стиле if (t > 0 && t<61)?? Я себе рассписал алгоритм и 7 = желтый, а 9 = зеленый, что кажись верно
0
hidden #1911629
Уровень 24
30 октября 2018, 11:35
Нет, не верно. Алгоритм простой. У нас имеется цикл работы сфетофора 5 минут, когда 5 минут проходят, запускается 0 минута нового цикла. Получается, что 5 = 0, а 6 = 1. 7, следуя логике, будет равно 2, т.е. должно выдавать зеленый. Ты же сам вводишь дробное число. Если человек вводит 0,5, то следует интерпретировать это как "уже 30 секунд горит зеленый", т.е. 0 является тем моментом, когда включается зеленый, а все значения от 0 до 2,99 являются зелеными.
0
Artem Maliuga
Уровень 15
30 октября 2018, 11:43
Добавил еще один иф опираясь на 0 if ((int) t == 0) { System.out.println("зелёный");} Здесь либо менять логику с остатком от деления на 5, либо понять что в этом примере не так (если не брать 0 значение), так как остальные данные кастуються в инт и кажись выдают все верно. Пока понять не могу в чем проблем с конкретно этими остатками от деления
0
hidden #1911629
Уровень 24
30 октября 2018, 11:44
С этими остатками от деления проблема в том, что они некорректно интерпретируются. Я дал явную подсказку, что светофор работает по циклу из 5 значений. Почему вы считаете остаток от деления на 4?
0
Artem Maliuga
Уровень 15
30 октября 2018, 12:27решение
public static void main(String[] args) {
        double t = new Scanner(System.in).nextDouble() % 5;
        if (t >= 0 && t < 3) {
            System.out.println("зелёный");
        } else if (t >= 3 && t < 4) {
            System.out.println("жёлтый");
        } else {
            System.out.println("красный");
        }
    }
Спасибо за намеки про цикличность, но честно мне мое решение казалось более красивым и тоже выполняло поставленные условия (не считая нуля правда)
+1
hidden #1911629
Уровень 24
30 октября 2018, 12:35решение
int lightColor = (int) Double.parseDouble(reader.readLine()) % 5;
        if (lightColor >= 0) {
            if (lightColor < 3) System.out.println("зелёный");
            if (lightColor == 3) System.out.println("жёлтый");
            if (lightColor == 4) System.out.println("красный");
        }
+2
Artem Maliuga
Уровень 15
30 октября 2018, 12:37
лучше без кастования сделай, так православней будет :D
0
hidden #1911629
Уровень 24
30 октября 2018, 12:38
Мы пишем код для людей. Компьютер и так поймёт. Потому нужно сразу привыкать писать всё явно и очевидно.
0
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush