计算器的本质是执行从 1 到 10 的数字表达式,包括罗马数字和阿拉伯数字。
问题是在执行加减法表达式时,带有罗马数字的表达式表现得非常奇怪,而乘法和除法似乎可以工作。例如,表达式 I + V 输出 VV 而不是 VI。减法通常取决于“不正确的数据”。
我是一名初学者程序员,因此我可能会错过一些要点,显然我做到了。我请求你的帮助。
链接到 gits - https://gist.github.com/relizerel/5d55212b8e39a78b54d158661f3dbf51(最底部有 4 个 java 文件)
计算器_src_Arithmetic.java
public class Arithmetic {
public static int addition(int first, int second) {
return first + second;
}
public static int division(int first, int second) {
return first / second;
}
public static int multiplication(int first, int second) {
return first * second;
}
public static int substraction(int first, int second) {
return first - second;
}
}
计算器_src_Converter.java
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
public class Converter {
private static final TreeMap<Integer, String> map = new TreeMap<Integer, String>();
static {
map.put(100, "C");
map.put(90, "XC");
map.put(50, "L");
map.put(40, "XL");
map.put(10, "X");
map.put(9, "IX");
map.put(5, "V");
map.put(4, "IV");
map.put(1, "I");
}
private static final List<String> roman = new ArrayList<String>();
static {
roman.add("Пустое значение");
roman.add("I");
roman.add("II");
roman.add("III");
roman.add("IV");
roman.add("V");
roman.add("VI");
roman.add("VII");
roman.add("VIII");
roman.add("IX");
roman.add("X");
}
public static String toRoman(int number) {
int l = map.floorKey(number);
if (number == l) {
return map.get(number);
}
return map.get(l) + toRoman(number - 1);
}
public static int toArabic(String number) {
return roman.indexOf(number);
}
}
计算器_src_Logic.java
public class Logic {
public static void logic(String firstString, String arithmetic, String secondString) {
int first = 0;
int second = 0;
int result = 0;
boolean flag = false;
try {
first = Integer.parseInt(firstString);
second = Integer.parseInt(secondString);
} catch (Exception e) {
try {
first = Converter.toArabic(firstString);
second = Converter.toArabic(secondString);
flag = true;
} catch (Exception el) {
System.out.println("Введены неверные данные");
}
}
if (first < 1 || first > 10 || second < 1 || second > 10) {
System.out.println("Введены неверные данные");
System.exit(0);
}
if (arithmetic.equals("+")) {
result = Arithmetic.addition(first, second);
}
if (arithmetic.equals("/")) {
result = Arithmetic.division(first, second);
}
if (arithmetic.equals("*")) {
result = Arithmetic.multiplication(first, second);
}
if (arithmetic.equals("-")) {
result = Arithmetic.substraction(first, second);
}
if (flag) {
String roman = Converter.toRoman(result);
System.out.println(roman);
} else {
System.out.println(result);
}
}
}
计算器_src_Start.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Start {
public static void main(String[] args) throws IOException {
System.out.println("Введите выражение. Аргументы и знак должны быть разделены пробелом");
System.out.println("Программа принимает арабские и римские числа");
System.out.println("Числа от 0 до 10 включительно и от I до X включительно");
List<String> list = new ArrayList<String>();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.readLine();
try {
Collections.addAll(list, input.split(" ", 50));
Logic.logic(list.get(0), list.get(1), list.get(2));
} catch (Exception e) {
System.out.println("Введены неверные данные");
}
System.exit(0);
}
}
我稍微调整了代码,试试这个: