-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCalculation.java
More file actions
170 lines (138 loc) · 8.65 KB
/
Copy pathCalculation.java
File metadata and controls
170 lines (138 loc) · 8.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import java.util.Arrays;
import java.util.Scanner;
/*
Задача: программа “Калькулятор”
Описание:
Создайте консольное приложение “Калькулятор”.
Приложение должно читать из консоли введенные пользователем арифметические операции и выводить в консоль результат их выполнения.
Требования:
Калькулятор умеет выполнять операции сложения, вычитания, умножения и деления с двумя числами: a + b, a - b, a * b, a / b.
Данные передаются в одну строку (смотрите пример)!
Решения, в которых каждое число и арифмитеческая операция передаются с новой строки считаются неверными.
Калькулятор умеет работать как с арабскими (1,2,3,4,5…), так и с римскими (I,II,III,IV,V…) числа.
Калькулятор должен принимать на вход числа от 1 до 10 включительно, не более.
На выходе числа не ограничиваются по величине и могут быть любыми.
Калькулятор умеет работать только с целыми числами.
Калькулятор умеет работать только с арабскими или римскими цифрами одновременно,
при вводе пользователем строки вроде 3 + II калькулятор должен выбросить исключение и прекратить свою работу.
При вводе пользователем неподходящих чисел приложение выбрасывает исключение и завершает свою работу.
При вводе пользователем строки не соответствующей одной из вышеописанных арифметических операций приложение выбрасывает исключение и завершает свою работу.
Пример работы программы:
Input:
1 + 2
Output:
3
Input:
VI / III
Output:
II
Принципы оценки работы:
Обратите внимание на принципы ООП, постарайтесь разбить программу на логические классы.
Решения, в которых весь код программы находится в одном классе будут низко оценены.
Продемонстрируйте своё умение в работе с разными синтаксическими конструкциями,
не забудьте про исключительные ситуации,
при которых выполнение программы невозможно из-за некорректных входных данных.
*/
public class Calculation {
public static void main(String[] args) throws Exception {
System.out.println(" Начало работы программы \"Калькулятор\" ");
System.out.println(" Программа работает одновременно только с арабскими или только с римскими цифрами ");
System.out.println(" Введите выражение для вычисления в одном из следующих форматов: a + b, a - b, a * b, a / b.");
Scanner in = new Scanner (System.in);
String calculation = in.nextLine();
// решил убрать лишние пробелы в начале и в конце. соответственно, не будет сообщения о такой ошибке.
calculation = calculation.trim();
String[] blocks = calculation.split(" ");
try {
if (arabicNumbers.isInputValueIsNumber(blocks[0]) && arabicNumbers.isInputValueIsNumber(blocks[2]) && operations.isInputOperationIsCorrect(blocks[1])) {
//System.out.print(blocks[0] + " " + blocks[1] + " " + blocks[2] + " = ");
System.out.println(arabicNumbers.calculateArabicNumber(blocks[0], blocks[2], blocks[1]));
} else if (romanNumbers.isInputValueIsNumber(blocks[0]) && romanNumbers.isInputValueIsNumber(blocks[2]) && operations.isInputOperationIsCorrect(blocks[1])) {
//System.out.print(blocks[0] + " " + blocks[1] + " " + blocks[2] + " = ");
if (romanNumbers.calculateRomanNumbers(blocks[0], blocks[2], blocks[1]) != null)
System.out.println(romanNumbers.calculateRomanNumbers(blocks[0], blocks[2], blocks[1]));
}
else throw new Exception();
}
catch (Exception e) {
System.out.println("Ошибка! Проверьте правильность введенных данных"); // e.printStackTrace();
}
finally {
System.out.println(" Конец работы.");
}
in.close();
}
static class arabicNumbers {
static String[] arabicNums = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
static boolean isInputValueIsNumber (String value)
{
return Arrays.asList(arabicNums).contains(value);
}
public static int calculateArabicNumber (String value1, String value2, String operator)
{
int num1 = Integer.parseInt(value1);
char operation = operator.charAt(0);
int num2 = Integer.parseInt(value2);
int resultat = 0;
switch(operation)
{
case '+' : resultat = num1 + num2;
break;
case '-' : resultat = num1 - num2;
break;
case '*' : resultat = num1 * num2;
break;
case '/' : resultat = num1 / num2;
}
return resultat;
}
}
static class romanNumbers extends arabicNumbers {
// предусмотреть ошибку если нацело не делится. или вывести отдельное сообщение.
static String[] romanNums = new String [] {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"};
static String[] romanNumsDec = new String [] {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C"};
static int lenNums = romanNums.length;
static int lenDec= romanNumsDec.length;
static int lenAll = lenDec*lenNums;
static String[] romanNumsAll = new String [lenAll];
static boolean isInputValueIsNumber (String value)
{
return Arrays.asList(romanNums).contains(value);
}
static String calculateRomanNumbers (String value1, String value2, String operator) {
for (int j = 0; j < lenDec - 1; j++) {
for (int i = 0; i < lenNums; i++) {
if (i == 9) romanNumsAll[j * 10 + i] = romanNumsDec[j + 1];
else romanNumsAll[j * 10 + i] = romanNumsDec[j] + romanNums[i];
}
}
String value1toArabic = Integer.toString(Arrays.binarySearch(romanNums, value1) + 1);
String value2toArabic = Integer.toString(Arrays.binarySearch(romanNums, value2) + 1);
int resultatArabic = arabicNumbers.calculateArabicNumber(value1toArabic, value2toArabic, operator);
String resultat = null;
try {
resultat = romanNumsAll[resultatArabic - 1];
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("\n Римское число не может быть меньше единицы.");
}
return resultat;
}
public static int findIndex(String[] list, String value)
{
int len = list.length;
int index = 0;
for (int i=0; i < len; i++) {
if (list[i].equals(value))
index = i;
}
return index;
}
}
static class operations{
public static String[] operations = {"+", "-", "*", "/"};
public static boolean isInputOperationIsCorrect (String value)
{
return Arrays.asList(operations).contains(value);
}
}
}