/*
* Файл: RadixIO.java
* Назначение: Класс для управления вводом/выводом в консоль и для управления самой программой, проверки введённых данных. Основа программы.
*/
package radixarithmetic; // класс содержится в пакете radixarithmetic
import java.io.BufferedReader; // подключаем класс для чтения буфера данных
import java.io.InputStreamReader; // подключаем класс для чтения потока ввода(input) данных
import java.io.IOException; // подключаем класс для управления исключительными ситуациями ввода/вывода
public class RadixIO { // объявление класса RadixIO
RadixIO() { // конструктор класса
System.out.println("--- RadixArithmetic ---\n"); // System.out.println - вывод строки в консоль с переносом строки в конце, \n - перенос строки
System.out.println("Введите 'q' в любое поле для ввода и нажмите <Enter> для выхода\n----------");
this.process(); // вызываем метод process текущего класса
}
private void process() {
BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); // читаем буфер данных из System.in (input поток)
String one_dix = null, two_dix = null, result_dix = null; // переменные для хранения систем счисления первого и второго числа, а так же системы счисления результата
String one_num = null, two_num = null, operation = null; // для хранения первого, второго числа и операции
RadixCore core = new RadixCore();
String yn = null; // завершить или продолжать работу программы
do {
do {
System.out.print("Система счисления первого числа(2, 8, 16): "); // System.out.print - вывод строки в консоль без переноса строки в конце
try { // try-catch предназначен для проверки кода на наличие исключительных ситуаций
one_dix = read.readLine(); // BufferedReader.readLine() - читает строку из буффера данных
}catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
this.checkExit(one_dix); // проверяем нужно ли выйти
if(this.checkRadix(one_dix)) // если система счисления поддерживается
break; // тогда продолжаем
else // иначе
System.out.println("Неверная система счисления. Поддерживаются: 2, 8, 16");
} while(true); // бесконечный цикл (для проверки введённых данных)
do {
System.out.print("Система счисления второго числа(2, 8, 16): ");
try {
two_dix = read.readLine();
}catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
this.checkExit(two_dix);
if(this.checkRadix(two_dix))
break;
else
System.out.println("Неверная система счисления. Поддерживаются: 2, 8, 16");
} while(true);
do {
System.out.print("Система счисления результата(2, 8, 16): ");
try {
result_dix = read.readLine();
}catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
this.checkExit(result_dix);
if(this.checkRadix(result_dix))
break;
else
System.out.println("Неверная система счисления. Поддерживаются: 2, 8, 16");
} while(true);
do {
System.out.print("Первое число (" + (one_dix.equals("2") ? "двоичная" : (one_dix.equals("8") ? "восьмеричная" : "шестнадцатиричная")) + " система): ");
try {
one_num = read.readLine();
}catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
this.checkExit(one_num);
if(one_dix.equals("2") ? core.checkBinary(one_num) : (one_dix.equals("8") ? core.checkOctal(one_num) : core.checkHex(one_num)))
break;
else
System.out.println("Число не соответствует формату заданной системы счисления!");
} while(true);
do {
System.out.print("Второе число (" + (two_dix.equals("2") ? "двоичная" : (two_dix.equals("8") ? "восьмеричная" : "шестнадцатиричная")) + " система): ");
try {
two_num = read.readLine();
}catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
this.checkExit(two_num);
if(two_dix.equals("2") ? core.checkBinary(two_num) : (two_dix.equals("8") ? core.checkOctal(two_num) : core.checkHex(two_num)))
break;
else
System.out.println("Число не соответствует формату заданной системы счисления!");
} while(true);
do {
System.out.print("Операция (+,-,*,/): ");
try {
operation = read.readLine();
}catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
this.checkExit(operation);
if(operation.equals("+") || operation.equals("-") || operation.equals("*") || operation.equals("/"))
break;
else
System.out.println("Неподдерживаемая операция над числами!");
} while(true);
System.out.println("----------");
String result_dex = Integer.toString(operation.equals("+") ? Integer.parseInt(core.converter(one_num, one_dix, "10")) + Integer.parseInt(core.converter(two_num, two_dix, "10")) : (operation.equals("-") ? Integer.parseInt(core.converter(one_num, one_dix, "10")) - Integer.parseInt(core.converter(two_num, two_dix, "10")) : (operation.equals("*") ? Integer.parseInt(core.converter(one_num, one_dix, "10")) * Integer.parseInt(core.converter(two_num, two_dix, "10")) : Integer.parseInt(Integer.toString(Integer.parseInt(core.converter(one_num, one_dix, "10")) / Integer.parseInt(core.converter(two_num, two_dix, "10"))))))); //результат в десятичной системе счисления
String result = core.converter(result_dex, "10", result_dix); // результат в нужной системе счисления
System.out.println(one_num + " " + operation + " " + two_num + " = " + result_dex + "(в десятичной системе) = " + result);
System.out.print("----------\nЖелаете выполнить ещё одну операцию? y/n: ");
try {
yn = read.readLine();
} catch(IOException io) {
System.out.println("Ошибка ввода/вывода.");
}
} while(yn.equalsIgnoreCase("y"));
System.out.println("\nСпасибо за использование программы ;-)");
}
private void checkExit(String str) { // проверка выхода из программы
if(str.equalsIgnoreCase("q")) // str1.equalsIgnoreCase(String two) - сравнение строк str1 и two c игнорированием регистра
System.exit(0); // завершение работы программы
}
private boolean checkRadix(String dix) { // проверка системы счисления
return dix.equals("2") || dix.equals("8") || dix.equals("16");
}
}