Переключиться с оператором if/else

Я должен использовать оператор switch, позволяющий пользователю использовать прописные или строчные буквы для кодов оплаты, сохраняя при этом оператор if/else для ставки, программа запускается, но я всегда получаю «незаконный выбор». Я не понять, почему это происходит

    char paycode;
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter hours:  ");
    hours = sc.nextDouble();
    System.out.println("M = $12 per hour, L = $10, W = $8, T = $6");
    System.out.print("Enter pay code:  ");
    paycode = (char)System.in.read();
    switch(paycode)
    {
        case 'M': case 'm':
            rate = 12;
            break;
        case 'L': case 'l':
            rate = 10;
            break;
        case 'W': case 'w':
            rate = 8;
            break;
        case 'T': case 't':
            rate = 6;
            break;
    }
    rate = 0
    if (rate != 0)
    {
        pay = hours * rate;
        System.out.printf("Weekly pay is %.2f\n", pay);
    }
    else
        System.out.println("Illegal choice");

(i) это не работающий код: rate = 0 не будет компилироваться; (ii) почему он пытается установить rate на ноль? Очевидно, что if никогда не выполнит первый блок, так как rate всегда устанавливается равным нулю.

user16320675 01.07.2023 21:17

я переместил ставку = 0 туда, где я объявил переменные (я должен был включить это в код, который я опубликовал), и это решило проблему. спасибо за вашу помощь очень ценю это user16320675

Chepe 01.07.2023 21:49

Кстати, я бы добавил default к switch и сделал там сообщение об ошибке

user16320675 02.07.2023 16:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в вашем коде связана со строкой paycode = (char)System.in.read();. Метод System.in.read() считывает один символ как целочисленное значение из входного потока. Приведение его к char напрямую может не дать ожидаемого результата.

Чтобы устранить эту проблему, вы можете изменить свой код, чтобы вместо этого использовать класс Scanner для чтения входных данных.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        double hours, rate = 0, pay;
        char paycode;

        Scanner sc = new Scanner(System.in);
        System.out.print("Enter hours: ");
        hours = sc.nextDouble();
        System.out.println("M = $12 per hour, L = $10, W = $8, T = $6");
        System.out.print("Enter pay code: ");
        paycode = sc.next().charAt(0);

        switch (paycode) {
            case 'M':
            case 'm':
                rate = 12;
                break;
            case 'L':
            case 'l':
                rate = 10;
                break;
            case 'W':
            case 'w':
                rate = 8;
                break;
            case 'T':
            case 't':
                rate = 6;
                break;
        }

        if (rate != 0) {
            pay = hours * rate;
            System.out.printf("Weekly pay is %.2f\n", pay);
        } else {
            System.out.println("Illegal choice");
        }
    }
}

В этой обновленной версии мы используем sc.next().charAt(0) для чтения первого символа ввода как char. Это гарантирует, что вы можете вводить прописные или строчные буквы для кода оплаты, и оператор switch будет работать правильно.

проблема НЕ в приведении к char (хотя я согласен с тем, что использование Scanner более правильно, поскольку оно уже используется) - это должно работать правильно (по крайней мере, для символов ASCII). Я думаю, что проблема rate = 0 сделана до if

user16320675 01.07.2023 21:18

Вы даже можете использовать Character.toLowerCase(paycode), чтобы устранить необходимость в каждом случае!

Reilas 01.07.2023 21:26

Большое спасибо за ваше тщательное объяснение, Навинду, код работает, это нужно сейчас! очень признателен.

Chepe 01.07.2023 21:44

Добро пожаловать в Stack Overflow! Этот ответ, вероятно, был написан (полностью или частично) ИИ (например, ChatGPT). Предупреждение о том, что публикация контента, созданного искусственным интеллектом, здесь запрещена. Если вы использовали инструмент ИИ, чтобы помочь с каким-либо ответом, я бы посоветовал вам удалить его. Мы очень надеемся, что вы останетесь частью нашего сообщества и в будущем будете вносить свой вклад своими качественными публикациями. Спасибо! - Хороший полицейский ;-)

NotTheDr01ds 01.07.2023 22:04

Читатели должны тщательно и критически рассмотреть этот ответ, поскольку информация, сгенерированная ИИ, часто содержит фундаментальные ошибки и дезинформацию. Если вы наблюдаете проблемы с качеством и/или у вас есть основания полагать, что этот ответ был сгенерирован искусственным интеллектом, пожалуйста, оставьте соответствующий отзыв.

NotTheDr01ds 01.07.2023 22:04

Попробуйте так.

  • во-первых, сначала объявите все свои локальные переменные и назначьте любые значения по умолчанию.
  • используйте next(), чтобы получить следующий String, из которого вы получаете первый символ. Чтобы избежать обработки регистра в операторе switch, просто преобразуйте его в конкретный случай и используйте один оператор case для каждого.
  • и нет необходимости предварительно определять и проверять скорость на недопустимый ввод. Просто используйте регистр по умолчанию в операторе switch. Распечатайте там сообщение об ошибке и вернитесь.
import java.util.Scanner;

public class SwitchDemo {

    public static void main(String[] args) {
        char paycode;
        double hours, pay, rate;
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter hours:  ");
        hours = sc.nextDouble();
        System.out.println("M = $12 per hour, L = $10, W = $8, T = $6");
        System.out.print("Enter pay code:  ");
        paycode = Character.toLowerCase(sc.next().charAt(0));
        switch(paycode) {
            case 'm':
                rate = 12;
                break;
            case 'l':
                rate = 10;
                break;
            case 'w':
                rate = 8;
                break;
            case 't':
                rate = 6;
                break;
             default: System.out.println("Illegal choice");
                return;
        } 
        pay = hours * rate;
        System.out.printf("Weekly pay is %.2f\n", pay);
       
    }
}

Другие вопросы по теме