Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/259: Рейтинг темы: голосов - 259, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
1

Калькулятор с вводом выражения в одну строку и умеющий работать с римскими и арабскими цифрами

10.11.2019, 16:48. Показов 51072. Ответов 28

Author24 — интернет-сервис помощи студентам
Люди!!! Помогите, плз. Уже всю голову себе сломала... Одно делаю, второе ломается. Второе чиню - третье отключается... В общем, калькулятор. Умеет работать с римскими и арабскими. Данные вводятся в одну строку. Если просто с арабскими, проблем нет. А вот с римскими не складывается. Посмотрите, плз, что не так с кодом...

Java
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
public class Main {
    private static final char exitCharacter = '!';
 
    public static void main(String[] args) {
        DataReader reader = new DataReader(exitCharacter);
        while (true) {
            try {
                reader.read();
            } catch (RuntimeException e) {
                System.err.println(e.getMessage());
                continue;
            }
            if (reader.isExitFlag()) {
                System.out.println("В выражении пристутствует знак выхода: " + exitCharacter);
                System.out.println("Завершение программы.");
                break;
            }
            double result = Calculator.calculate(reader.getVar1(), reader.getVar2(), reader.getOper());
            System.out.println(result);
        }
    }
}
 
 
import java.util.Scanner;
 
public class DataReader {
 
    private int number1;
    private int number2;
    private char operation;
    private boolean exitFlag;
    private char exitCharacter;
    private char resultChar;
 
    public DataReader(char exitCharacter) {
        this.exitCharacter = exitCharacter;
        this.resultChar = '=';
    }
 
 
    public void read() {
 
        Integer[] arabic = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
        String[] roman = {"X", "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I"};
 
        System.out.println("Введите выражение, состоящее из двух целых чисел от 0 до 10, знака операции и знака равно (напр. 2+2=): ");
        Scanner scanner = new Scanner(System.in);
        //StringBuilder builder = new StringBuilder();
        String text = scanner.nextLine();
        if (text.indexOf(exitCharacter) != -1) {
            exitFlag = true;
            return;
        }
 
        try {
            if ((text.charAt(text.length() - 1) != resultChar)) {
                throw new RuntimeException();
            }
 
            text = text.substring(0, text.length() - 1);
            String[] blocks = text.split("[+-/*]");
 
            // проверяем, входит ли строка blocks[0] в массив строк массива "roman"
            boolean flag = false;
            for (int i = 0; i < roman.length; i++){
                if (roman[i].equals(blocks[0]) || roman[i].equals(blocks[1])){
                    flag = true;
                }
                //flag = true, значит будем иметь дело с римскими обозначениями
                if(flag){
                    number1 = romanToNumber(blocks[0]);
                    number2 = romanToNumber(blocks[1]);
                } else {
                    number1 = Integer.parseInt(blocks[0]);
                    operation = text.charAt(blocks[0].length());
                    number2 = Integer.parseInt(blocks[1]);
 
                }
            }
            if ((number1 > 10 || number1 < 0) || (number2 > 10 || number2 < 0)) {
                throw new IllegalArgumentException();
            }
        } catch (RuntimeException e) {
            throw new IllegalArgumentException("Неверный формат данных");
        }
    }
 
    private static int romanToNumber(String roman) {
        if (roman.equals("I")) {
            return 1;
        } else if (roman.equals("II")) {
            return 2;
        } else if (roman.equals("III")) {
            return 3;
        } else if (roman.equals("IV")) {
            return 4;
        } else if (roman.equals("V")) {
            return 5;
        } else if (roman.equals("VI")) {
            return 6;
        } else if (roman.equals("VII")) {
            return 7;
        } else if (roman.equals("VIII")) {
            return 8;
        } else if (roman.equals("IX")) {
            return 9;
        } else if (roman.equals("X")) {
            return 10;
        } else {
            return -1;
        }
    }
 
    public int getVar1() {
        return number1;
    }
 
    public int getVar2() {
        return number2;
    }
 
    public char getOper() {
        return operation;
    }
 
    public boolean isExitFlag() {
        return exitFlag;
    }
}
 
public class Calculator {
    private Calculator(){}
 
    public static double calculate(int number1, int number2, char operation){
        int result = 0;
        switch (operation){
            case '+': result = number1 + number2; break;
            case '-': result = number1 - number2; break;
            case '*': result = number1 * number2; break;
            case '/': result = number1 / number2; break;
            default:throw  new IllegalArgumentException("Не верный знак операции");
        }
        return result;
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2019, 16:48
Ответы с готовыми решениями:

Напечатать число в интервале от 1 до 999, заданное арабскими цифрами, римскими цифрами
Напечатать число в интервале от 1 до 999, заданное арабскими цифрами, римскими цифрами.

Пусть число записано римскими цифрами, выведите его запись арабскими цифрами
Помогите сделать, пожалуйста)!!! 1) Пусть число записано римскими цифрами: М — 1000, D — 500, С —...

Запись любого данного числа n (n <3999 ) арабскими цифрами перевести в запись римскими цифрами
Нужна помощь в решении програмы на С !!(Пожалуйста) Для записи римскими цифрами...

Является ли текст правильной записью римскими цифрами целого числа от 1 до 999, и, если является, распечатать это число арабскими цифрами
1) алг Дума (цел n,k) арг k рез n нач цел i n:=0 i:=0 нц пока i&lt;k n:=n+2*i+1 i:=i+1 кц

28
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
10.11.2019, 16:57 2
Цитата Сообщение от Alka09 Посмотреть сообщение
10
уверен?
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 17:01  [ТС] 3
? это ты о чем?
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
10.11.2019, 17:08 4
что ты сможешь записать, скажем, 54, римскими, в твоей ассоциации
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 17:28 5
Alka09, ох сколько же у вас там лишних действий происходит...
66 строчка - Выведите проверку флага после цикла, а не ввнутри.
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 17:36  [ТС] 6
Мне нужно только от 0 до 10..

Добавлено через 3 минуты
Вот этот кусок?
Java
1
2
3
4
5
            boolean flag = false;
            for (int i = 0; i < roman.length; i++){
                if (roman[i].equals(blocks[0]) || roman[i].equals(blocks[1])){
                    flag = true;
                }
так здесь я хотела как раз циклом проверить, встречается ли эта буква в строке....
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 17:38 7
Alka09,
Java
1
2
3
4
5
6
7
8
9
if(flag){
                    number1 = romanToNumber(blocks[0]);
                    number2 = romanToNumber(blocks[1]);
                } else {
                    number1 = Integer.parseInt(blocks[0]);
                    operation = text.charAt(blocks[0].length());
                    number2 = Integer.parseInt(blocks[1]);
 
                }
1
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 17:42  [ТС] 8
я java только начала изучать. Думала, по аналогии с php щас как все напишу... и тут запуталась совершенно сначала в классах и файлах, вроде распуталась, теперь вот с этим куском.... Просто калькулятор с арабскими цифрами получается без особых проблем, а вот сделать так, чтоб он сначала конвертировал римские в арабские, считал, а потом обратно в римские - тут я что-то заблудилась... Java на разные мои варианты чаще всего ругается, что я пытаюсь в int сохранить String и наоборот... в общем, помощь очень нужна... спасибо, что откликаетесь))

Добавлено через 1 минуту
Цитата Сообщение от sdasdaw Посмотреть сообщение
Alka09,
Java
1
2
3
4
5
6
7
8
9
if(flag){
                    number1 = romanToNumber(blocks[0]);
                    number2 = romanToNumber(blocks[1]);
                } else {
                    number1 = Integer.parseInt(blocks[0]);
                    operation = text.charAt(blocks[0].length());
                    number2 = Integer.parseInt(blocks[1]);
 
                }
а где же здесь проверка на совпадение из строки???
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 17:44 9
Цитата Сообщение от Alka09 Посмотреть сообщение
а где же здесь проверка на совпадение из строки???
?
flag указывает на результат ведь
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 17:49  [ТС] 10
моя логика. Есть массив. Я прохожу по нему и ищу совпадения, если нахожу - методом romanToNumber присваиваю переменной соответствующее значение. флаг как раз указывает на то, что есть совпадение с элементом массива. А если я не указывают массив и не прохожу по нему, откуда тогда и буду брать это совпадение?
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 18:02 11
Alka09, все правильно, просто проверку флага делайте в конце цикла.

если в цикле, встретится roman, то флаг будет true?
в конце цикла, проверяем flag true - значит цифры записаны в формате roman, если нет, то arabic.
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
10.11.2019, 18:03 12
Цитата Сообщение от Alka09 Посмотреть сообщение
откуда
отсюда https://www.cyberforum.ru/java/ поиск поможет)) несколько десятков решений есть.
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 18:03  [ТС] 13
Цитата Сообщение от sdasdaw Посмотреть сообщение
если в цикле, встретится roman, то флаг будет true?
в конце цикла, проверяем flag true - значит цифры записаны в формате roman, если нет, то arabic.
ок, спасибо, попробую так. В любом случае, моих проблем с римскими цифрами это не решает...
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 18:08 14
Alka09, теперь просто присвойте знак операции
Java
1
2
3
4
5
6
7
8
if(flag){
    number1 = romanToNumber(blocks[0]);
    number2 = romanToNumber(blocks[1]);
} else {
    number1 = Integer.parseInt(blocks[0]);
    number2 = Integer.parseInt(blocks[1]);
}
operation = text.charAt(blocks[0].length());
1
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 18:36  [ТС] 15
Цитата Сообщение от sdasdaw Посмотреть сообщение
Alka09, теперь просто присвойте знак операции
Java
1
2
3
4
5
6
7
8
if(flag){
    number1 = romanToNumber(blocks[0]);
    number2 = romanToNumber(blocks[1]);
} else {
    number1 = Integer.parseInt(blocks[0]);
    number2 = Integer.parseInt(blocks[1]);
}
operation = text.charAt(blocks[0].length());
да, это я так и сделала )
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 18:49 16
Alka09, все получилось?
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 19:14  [ТС] 17
Цитата Сообщение от Aviz__ Посмотреть сообщение
отсюда https://www.cyberforum.ru/java/ поиск поможет)) несколько десятков решений есть.
Честное слово, искала. Чтоб искать, нужно уметь правильно сформулировать вопрос. А чтоб правильно сформулировать вопрос, нужно хорошо знать тему, связанную с твоим вопросом. А чтоб хорошо знать тему, надо изучать. Чтоб изучать, нужно искать и спрашивать... И так далее, по кругу. А бывает, что новичок топчется где-то рядом с ответом, и если ему кто-то поможет, то он дальше сам разберется, и не будет никого больше задалбывать вопросами... Я же не прошу вас написать за меня код. Я попросила прокомментировать, если есть желание помочь, мой код, направить может быть в нужную сторону. А советы со смысловой нагрузкой "поиск рулит" не несет никакой вообще информации. Выбешивает только. Уж извините...

Добавлено через 17 минут
Цитата Сообщение от sdasdaw Посмотреть сообщение
Alka09, все получилось?
Да, спасибо большое, с этим куском разобралась. В принципе, логику всего кода понимаю, как и что сделать, но блин, то, что в java нельзя в одну переменную сохранять разные форматы данных, очень непривычно... Но понемногу разбираюсь. Я только пару дней java смотрю..
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
10.11.2019, 19:15 18
Цитата Сообщение от Alka09 Посмотреть сообщение
правильно сформулировать вопрос.
в твоем случае, это одно слово "римские")). уж прости, но твой код читать слишком тяжело (скажем мягко).
тебе нужно, как мне видеться, определять какими цифрами введен пример, такими и выводить. перевод римских в арабские найдешь см. выше, затем решаешь его и переводишь обратно, в римские.
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
10.11.2019, 19:18 19
Цитата Сообщение от Alka09 Посмотреть сообщение
в java нельзя в одну переменную сохранять разные форматы данных
можно использовать var начиная с java 9 или использовать библиотеку lombok, в которой также реализована переменная var
она хранит любой тип данных, только переназначать в другой тип во время выполнения нельзя вроде.
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 13
10.11.2019, 19:35  [ТС] 20
Цитата Сообщение от sdasdaw Посмотреть сообщение
можно использовать var начиная с java 9 или использовать библиотеку lombok, в которой также реализована переменная var
она хранит любой тип данных, только переназначать в другой тип во время выполнения нельзя вроде.
)) я пока до такого не дошла). Да я когда села код писать, была уверена, что это задание на пару часов, ну чем там таким может java от php отличаться... самоуверенная ээээ... не буду себя обзывать... Буду учиться лучше)

Добавлено через 10 минут
Цитата Сообщение от Aviz__ Посмотреть сообщение
в твоем случае, это одно слово "римские")). уж прости, но твой код читать слишком тяжело (скажем мягко).
тебе нужно, как мне видеться, определять какими цифрами введен пример, такими и выводить. перевод римских в арабские найдешь см. выше, затем решаешь его и переводишь обратно, в римские.
собственно, как раз это у меня и не получается сделать, выводить ответ такими же цифрами, какими введен. Да, надо правильно вопросы задавать. Перевод из римских в арабские и наоборот как сделать знаю.

Добавлено через 1 минуту
думаю, мой код читать так же тяжело, как тяжело было читать твой код,когда ты начинал. В любом случае, спасибо за ответы, никаких претензий с моей стороны, просто все же когда-то начинали... или прям сразу вместо азбуки код?))
0
10.11.2019, 19:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2019, 19:35
Помогаю со студенческими работами здесь

Запись числа арабскими цифрами перевести в запись римскими цифрами
Для записи римскими цифрами используются символы I, V, X, L, C, D, M, обозначающие соответственно...

Консольный калькулятор в одну строку (парсинг выражения)
Товарищи программисты, помогите реализовать задачу. Вводится в консоли арифметическое выражение в...

Вывести римское число арабскими цифрами
Доброго времени суток! есть две задачки с цифрами: 1. дана строка из букв и цифр. нужно вывести...

Удалить из строки все символы, которые не являются арабскими цифрами.
Заданая строка, котороя состоит из слов, розделенными одним или несколькими пропусками.Удалить из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru