RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1148930
Accepted
AlexPopov
AlexPopov
Asked:2020-07-04 23:28:35 +0000 UTC2020-07-04 23:28:35 +0000 UTC 2020-07-04 23:28:35 +0000 UTC

计算器的表达式(+ 和 -)输出不正确(java,简单的罗马数字)

  • 772

计算器的本质是执行从 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);
    }
}
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Дмитрий
    2020-07-05T02:18:24Z2020-07-05T02:18:24Z

    我稍微调整了代码,试试这个:

    import java.io.IOException;
    import java.util.Scanner;
    
    public class Start {
    
        public static void main(String[] args) throws IOException {
    
            System.out.println("Введите выражение. Аргументы и знак должны быть разделены пробелом");
            System.out.println("Программа принимает арабские и римские числа");
            System.out.println("Числа от 0 до 10 включительно и от I до X включительно");
    
            try (Scanner sc = new Scanner(System.in)) {
                String result = new Calculator().calculate(sc.nextLine().trim().split(" "));
                System.out.println(result);
            } catch (Exception e) {
                System.out.println("Введены неверные данные");
            }
    
        }
        
    }
    
    public class Calculator {
        
        private final Converter converter;
    
        public Calculator() {
            this.converter = new Converter();
        }
    
        public String calculate(String [] args) {
            if (args.length!=3) throw new IllegalArgumentException();
            try {
                int result = calculate(Integer.parseInt(args[0]), Integer.parseInt(args[2]), args[1]);
                return String.valueOf(result);
            } catch (NumberFormatException e) {
                    int result = calculate (converter.toArabic(args[0]), converter.toArabic(args[2]), args[1]);
                    return converter.toRoman(result);
            }
        }
        
        private int calculate(int first, int second, String arithmetic) {
            if (first < 1 || first > 10 || second < 1 || second > 10) throw new IllegalArgumentException();
            switch (arithmetic) {
                case "+": return first + second;
                case "/": return first / second;
                case "*": return first * second;
                case "-": return first - second;
                default: throw new IllegalArgumentException();
            }
        }
        
    }
    
    import java.util.Map;
    import java.util.TreeMap;
    import java.util.HashMap;
    
    public class Converter {
    
        private static final TreeMap<Integer, String> ARABIC = new TreeMap<>();
        static {
            ARABIC.put(100, "C");
            ARABIC.put(90, "XC");
            ARABIC.put(50, "L");
            ARABIC.put(40, "XL");
            ARABIC.put(10, "X");
            ARABIC.put(9, "IX");
            ARABIC.put(5, "V");
            ARABIC.put(4, "IV");
            ARABIC.put(1, "I");
        }
    
        private static final Map<String, Integer> ROMAN = new HashMap<>();
        static {
            ROMAN.put("I",1);
            ROMAN.put("II",2);
            ROMAN.put("III",3);
            ROMAN.put("IV",4);
            ROMAN.put("V",5);
            ROMAN.put("VI",6);
            ROMAN.put("VII",7);
            ROMAN.put("VIII",8);
            ROMAN.put("IX",9);
            ROMAN.put("X",10);
        }
    
        public String toRoman(int number) {        
            int n = ARABIC.floorKey(number);
            return number == n ? ARABIC.get(number) : ARABIC.get(n) + toRoman(number - n);
        }
    
        public int toArabic(String number) {
            return ROMAN.get(number);
        }
        
    }
    
    • 0

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5