Я должен использовать оператор 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");
я переместил ставку = 0 туда, где я объявил переменные (я должен был включить это в код, который я опубликовал), и это решило проблему. спасибо за вашу помощь очень ценю это user16320675
Кстати, я бы добавил default к switch и сделал там сообщение об ошибке




Проблема в вашем коде связана со строкой 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
Вы даже можете использовать Character.toLowerCase(paycode), чтобы устранить необходимость в каждом случае!
Большое спасибо за ваше тщательное объяснение, Навинду, код работает, это нужно сейчас! очень признателен.
Добро пожаловать в Stack Overflow! Этот ответ, вероятно, был написан (полностью или частично) ИИ (например, ChatGPT). Предупреждение о том, что публикация контента, созданного искусственным интеллектом, здесь запрещена. Если вы использовали инструмент ИИ, чтобы помочь с каким-либо ответом, я бы посоветовал вам удалить его. Мы очень надеемся, что вы останетесь частью нашего сообщества и в будущем будете вносить свой вклад своими качественными публикациями. Спасибо! - Хороший полицейский ;-)
Читатели должны тщательно и критически рассмотреть этот ответ, поскольку информация, сгенерированная ИИ, часто содержит фундаментальные ошибки и дезинформацию. Если вы наблюдаете проблемы с качеством и/или у вас есть основания полагать, что этот ответ был сгенерирован искусственным интеллектом, пожалуйста, оставьте соответствующий отзыв.
Попробуйте так.
next(), чтобы получить следующий String, из которого вы получаете первый символ. Чтобы избежать обработки регистра в операторе switch, просто преобразуйте его в конкретный случай и используйте один оператор case для каждого.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);
}
}
(i) это не работающий код:
rate = 0не будет компилироваться; (ii) почему он пытается установитьrateна ноль? Очевидно, чтоifникогда не выполнит первый блок, так какrateвсегда устанавливается равным нулю.