Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Java помогите с решением

Алексей Пахомов Ученик (131), на голосовании 9 месяцев назад
Есть такая вот задача:
Пользователь вводит одну строку, в которой должно быть записано простое арифметическое выражение вида "a <операция> b", где a и b - какие-то действительные числа, а операция - один из символов "+", "-", "*", "/". Ваша задача - выполнить вычисление, если это возможно. Гарантируется, что в введённой строке ровно 2 пробела (значение пробел значение пробел значение) В результате работы могут произойти различные ошибки. Их нужно обработать следующим образом:

Если одно из чисел не является числом, то вывести на экран "Error! Not number"
Если вместо знака операции было введено любое другое значение, то выведите "Operation Error!"
Если произошла попытка деления на ноль, то выведите на экран "Error! Division by zero"
Обрабатывать исключения необходимо в указанном выше порядке.
Решил я ее следующим образом: смотрите на скриншотахНо теперь есть следующая задача, которая связанна с этой:
Продолжите работу над проектом. Добавьте возможность считывания одной строчки из файла input.txt.
Изначально я хотел вывести считывание выражения в отдельный метод, в котором был бы выбор способа считывания. Способ был бы следующим:
  1. Пользователь вводит число
  2. Этот ввод мы помещаем в switch
  3. 1 = считывание ввода в консоли
  4. 2 = считывание с файла
Но есть в этом способе один недостаток:
Для считывания цифры (что бы выбрать способ считывания) - мы должны создать экземпляр класса Scanner, с параметром System.in . Если пользователь вводит 1 - мы спокойно используем этот же сканер для считывания, но если 2 - то, что тогда делать? Для считывания с файл надо было указывать путь в параметрах. А создавать отдельный экземпляр сканера для второго ввода - как-то не очень, на мой взгляд. От сюда вопрос: как выйти из этой ситуации? Может возможно как-нибудь System.in поменять на путь к файлу (я не знаю ничего про многопоточность и про то, как именно работает этот класс)? Или какой более удачный способ решить эту задачу? Буду благодарен всем тем, кто поможет.

P.S. ответы GPT мне не так интересны. Если вы просто отвечаете ботом - просто пропустите вопрос(
Голосование за лучший ответ
Pomogay Мудрец (15527) 10 месяцев назад
Чтобы решить вашу задачу, не обязательно менять ` System.in ` на путь к файлу. В Java вы можете использовать разные экземпляры класса `Scanner` для разных источников ввода: один для ` System.in ` (консольный ввод пользователя) и другой для чтения из файла.

Вы можете реализовать выбор способа считывания следующим образом:

1. Считать число из консоли, используя `Scanner` с ` System.in `.
2. В зависимости от введённого числа, создать новый экземпляр `Scanner` либо для чтения из файла, либо продолжить использовать уже созданный для ` System.in `.

Вот пример кода, который позволяет сделать это:

```java
import java.util.Scanner;
import java.io .File;
import java.io .FileNotFoundException;

public class Calculator {

public static void main(String[] args) {
Scanner scanner = null;
System.out.println("Enter 1 for console input or 2 for file input:");
Scanner inputChoiceScanner = new Scanner( System.in );
int inputChoice = inputChoiceScanner.nextInt();

try {
switch (inputChoice) {
case 1:
scanner = new Scanner( System.in );
break;
case 2:
scanner = new Scanner(new File("input.txt"));
break;
default:
System.out.println("Invalid input method.");
System.exit(1);
}

while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// Тут ваша логика обработки строки...
}

} catch (FileNotFoundException e) {
System.out.println("File not found.");
} finally {
if (scanner != null) {
scanner.close();
}
inputChoiceScanner.close();
}
}

// Ваши дополнительные методы...
}
```

В этом примере, если пользователь вводит `1`, программа будет ожидать ввода строки из консоли. Если пользователь вводит `2`, программа попытается считать строку из файла `input.txt`. Если файл не найден, будет выброшено исключение `FileNotFoundException`.

Это позволяет вам избежать необходимости менять ` System.in ` и делает ваш код более гибким и чистым.
Андрей Панарин Искусственный Интеллект (249285) 10 месяцев назад
Вы можете сделать основной процесс отдельным методом и подавать в него аргументом сканер - либо готовый scan с System.in , либо новый сканер с new FileInputStream("input.txt"). Только сканер файла потом нужно будет закрыть.
Похожие вопросы