Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288

Написать консольный калькулятор используя паттерны проектирования

28.07.2016, 11:54. Показов 8919. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно было написать калькулятор, который реализует стандартные операции "+,-,*,/". И выбрать какой-нить паттерн проектирования.
Я выбрал фабричный метод. Вроде все работает, но с костылями. особенно это касается исключительных ситуация(try...catch)
никак не могу выловить деление на ноль, IDE, как и положено, выдает infinity, но я подозреваю, что должно быть как с некоректным вводом(когда буквы ввожу). Также хотят, чтобы код был очень гибким, т.е. если кто-то захочет добавить функцию возведения в степень, то нужно всего в одном месте написать метод и все будет хорошо работать.предлагали это сделать через Class.forName(). , я почитал, понял как работает, но не знаю как в java это прилепить(опыта мало) и правильный ли паттерн я выбрал для реализации задачи?
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package consolecalculator;
 
import java.util.Scanner;
 
/* Основной CalculatorFabrika (запускаемый) класс программы должен создать экземпляр класса
   MyOpFactory, создать экземпляр класса Calculator, передав ему в качестве 
   параметра объект MyOpFactory и выполнить метод exec созданного объекта
   Calculator.
 */
public class CalculatorFabrika {
    public static void main(String[]args){
        //  Создаем экземпляр класса MyOpFactory
        MyOpFactory myOpFactory = new MyOpFactory();
        //  Создаем экземпляр класса Calculator 
        //  с агрументом в виде объекта MyOpFactory
        //  СОЗДАЕТ КАЛЬКУЛЯТОР
        Calculator calc = new Calculator(myOpFactory);
        //  Выполняем метод exec для объекта Calculator
        //  ЗАПУСКАЕМ КАЛЬКУЛЯТОР
        calc.exec();
    }
}
/*
   Интерфейс Operation олицетворяет классы, выполняющие некую операцию над
   двумя аргументами.
 */  
interface Operation{
     double exec( double valueOne, double valueTwo );
   } 
/*
   Создайте реализации интерфейса Operation для операций сложения, вычитания,
   умножения, деления (OpPlus, OpMinus, OpMul, OpDiv соответственно). 
 */
//  Операция СУММИРОВАНИЯ
class OpPlus implements Operation{
 
    @Override
    public double exec(double valueOne, double valueTwo ) {
        return (valueOne + valueTwo );
    }
}
//  Операция ВЫЧИТАНИЯ
class OpMinus implements Operation{
 
    @Override
    public double exec(double valueOne, double valueTwo ) {
        return (valueOne - valueTwo );
    }
}
//  Операция УМНОЖЕНИЯ
class OpMultiply implements Operation{
 
    @Override
    public double exec(double valueOne, double valueTwo ) {
        return (valueOne * valueTwo );
    }
}
//  Операция ДЕЛЕНИЯ
class OpDivision implements Operation{
    @Override
    public double exec(double valueOne, double valueTwo ) {
        try{
            double p = valueOne / valueTwo;
        }catch(ArithmeticException e){
            System.out.println(e + " арифметичесская ошибка");
        }
        return (valueOne / valueTwo );
    }
}
/*
   Интерфейс OperationFactory - это шаблон класса, который
   по коду операции способен создать экземпляр класса, реализующего интерфейс
   Operation и созданного специально для выполнения операции с указанным кодом.
   Если передан некорректный код операции, метод getOpInstance возвращает null.
   
   Создайте реализацию интерфейса OperationFactory, создающую перечисленные выше
   объекты (MyOpFactory). 
 */
interface OperationFactory
   {
     Operation getOpInstance( int op );
   } 
// Фабрика операций
class MyOpFactory implements OperationFactory{
 
    int operationCode;
    private Operation operation;
    
    @Override
    //  Получает код операции, по которому
    //  создает соответствующий объект операции
    public Operation getOpInstance(int op) {
        this.operationCode = op;
        switch (operationCode){
            case 0:{
                operation = new OpPlus();
                break;
            }
            case 1:{
                operation = new OpMinus();
                break;
            }
            case 2:{
                operation = new OpMultiply();
                break;
            }
            case 3:{
                operation = new OpDivision();
                break;
            }
            default:{
                operation = null;
            }
        }
        return operation;
    }
}
/* Создайте класс Calculator, который принимает в качестве аргумента конструктора
   экземпляр класса, реализующего интерфейс OperationFactory. Класс Calculator
   должен содержать метод exec, который обеспечивает цикл ввода оргументов и кода
   операции, выполнение операции путем получения соответствующего объекта через
   OperationFactory и вывод результата.
 */
class Calculator {
    
    MyOpFactory myOpFactory;
    
    public Calculator(MyOpFactory myOpFactory){
        this.myOpFactory = myOpFactory;
    }
    //  Обеспечивает цикл ввода аргументов и вида операции 
    //  и вывод результата операции
    public void exec(){
                
        boolean nextStep = true;                //  Условие выхода из цикла
        boolean p = true;
        double buf = 0;
        Scanner in = new Scanner(System.in);    //  Объявление потока ввода
        do {            
            //  Ввод превого аргумента
            double arg1;
            arg1 = buf;   
            if(p){        
                System.out.println("Введите первый аргумент");
                try{
                if(!in.hasNextDouble()) {
                    throw new NumberFormatException();
                    } else 
                        arg1 = in.nextDouble(); //  Ввод числа с клавиатуры                                                       
                }catch(NumberFormatException e){
                    System.out.println(e);   
                    break;                  
                }                    
            }            
            //  Ввод операции
            System.out.println("Выберите операцию:");
            System.out.print("0 - сумма\t");  
            System.out.print("1 - разность\t");
            System.out.print("2 - уменожение\t");
            System.out.print("3 - деление");
            System.out.println();
            int operation = in.nextInt();
            
            //  Ввод второго агрумента
            System.out.println("Введите второй аргумент");
            double arg2 = in.nextDouble();
 
            //  Обработка операций над аргемунтами
            System.out.print("Результат равен:\t");
            Operation op = myOpFactory.getOpInstance(operation);
            if (op != null){
                System.out.println(op.exec(arg1, arg2));
                buf = (int) op.exec(arg1, arg2);
            }
            else System.out.println("Недопустимая операция!!!");
            
            System.out.println("Хотите использовать результат как первый аргумент ?");
            System.out.print("1 - Да\t");
            System.out.println("2 - Нет");
            int what = in.nextInt();
            if (what == 1){
                p = false;
                continue;
            }
            else p = true;
            
           // Проверка на выход из цикла
            System.out.println("Хотите продолжить?");
            System.out.print("1 - Продолжить\t");
            System.out.println("2 - Выйти");
            int whatDo = in.nextInt();
            if (whatDo == 2) 
                nextStep = false;
        } while (nextStep);
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2016, 11:54
Ответы с готовыми решениями:

Паттерны проектирования Composite и Builder
Вводим строку в командной строке, представляющую собой путь к файлу/каталогу. Надо построить дерево соответствующих объектов в памяти, а...

Консольный калькулятор
Я понимаю что таких тем уже вагоны, но помогите новичку, хотел сделать свой калькулятор консольный, не на столько примитивный как...

Консольный калькулятор
Необходимо сделать консольный калькулятор, в котором происходит ввод с клавиатуры и имеется поддержка стандартных операций. Как делал...

1
20 / 20 / 9
Регистрация: 23.09.2013
Сообщений: 329
29.07.2016, 18:46
ну вот речь идет чтоб в случае добавления операции - модифицировался один метод. а тут надо и гетопсинстанс модифицировать и новый класс создавать...я понимаю тут фабрика, но имхо - оверхед какой то.

так бы был один метод со свитчем - в котором в зависимости от типа операции, свой кейс выполняет. нужно стало новая операция - добавили новый кейс в свитч - просто и понятно. на счет паттерна. опять же использовать считаю нужно там где без них никак. ну вот с калькулятором например. был консольный калькулятор. стал нужен с гуи. не писать же новый. можно взять старый класс и его передавать в новый класс который с гуи умеет работать. вообщем что то типа адаптера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2016, 18:46
Помогаю со студенческими работами здесь

Консольный калькулятор - Не удается найти указанный файл
Начал делать консольный калькулятор, в котором каждая операция представляет собой отдельный класс. В идеале список классов задается в...

накидал тут консольный калькулятор. Но вот беда - при компиляции он запрашивает значения целочисленных перемен
Доброго времени суток. Я новичок (естественно =) ) и накидал тут консольный калькулятор. Но вот беда - при компиляции он запрашивает...

Написать консольный калькулятор
Здравствуйте, дорогие)Я студент 1 курса. Нужна помощь с расчетно-графической работой. Написать в Delphi. В консольном приложении. Вот...

Написать консольный калькулятор (разрядность чисел - 12)
подскажите, пожалуйста, как написать калькулятор (разрядность чисел - 12) на Си или Си++

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru