Моделирование работы калькулятора на Java
Целью данной статьи является описание работы простейшего калькулятора на языке Java. Задача состоит в построении модели простейшего калькулятора на Java, выполняющего операции сложения, умножения, вычитания и деления.
Проект super.jpx состоит из двух файлов:
- основного файла soop.java содержащего код самой программы;
- файла soop.html – в котором производится вызов апплета, а также описываются его параметры.
code = "supe.soop.class"
name = "TestApplet"
width = "400"
height = "300"
В java - файле soop.java производится импортирование стандартных пакетов java.awt.*; java.awt.event.*; java.applet.*, а также вводится класс soop, декларированный как public.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class soop extends Applet implements ActionListener{
}
Класс soop является наследником класса Applet, о чем говорит строка объявления soop extends Applet. Класс soop также связан с интерфейсом ActionListener который позволяет нам обрабатывать события происходящие с объектами Button.
Каждый апплет должен быть проинициализирован это делается следующим образом
public void init(){
}
Далее приводятся описания переменных и массивов, используемых в программе.
Определяются и объявляются переменная num, означающая первое число, переменная buf, означающая второе число, переменная code, означающая код операции, строковая переменная str, а также переменная point, означающая наличие или отсутствие десятичной точки.
Определяется массив из 17 элементов Button but[]. Создание объекта класса происходит при помощи констуктора new:
But = new Button[17].
Далее создается панель для размещения кнопок
Panel pn = new Panel(new GridLayout(5,4,2,2));
Кнопки располагаются по четыре в четыре ряда, одна кнопка располагается в пятом ряду, поэтому GridLayout имеет разметы 5*4, каждая кнопка размером 2*2.
Создание кнопки происходит следующим образом: cначала с помощью конструктора new создается объект класса Button but[i], где i изменяется от 0 до 16.
but[0]=new Button("0");
Далее созданный при помощи конструктора new объект класса Button присоединяется к интерфейсу ActionListener, который в данном случае работает как метод с аргументом this.
but[0].addActionListener(this);
Далее происходит добавление объекта but[0] к панели.
pn.add(but[0]);
Аналогичные действия производятся с остальными элементами массива Button but[i], где i изменяется от 0 до 16.
Затем работает метод add(pn), добавляющий панель к пользовательскому интерфейсу. Аргументом метода add(pn) является созданная панель кнопок pn.
add(pn);
Далее работает метод paint(Graphics gr) с аргументом gr типа Graphics. Этот метод рисует строку размером 10*15 с помощью метода drawString.
public void paint(Graphics gr){
gr.drawString(str,10,15);
}
Далее работает метод actionPerformed(ActionEvent e) с аргументом e типа ActionEvent.
Метод actionPerformed( ) связан с интерфейсом ActionListener.
public void actionPerformed(ActionEvent e){
}
Метод actionPerformed( ) осуществляет операции, связанные с кнопками.
Переменная num определяет первое число, с которым производятся действия. Это число есть объект класса Float, создаваемый с помощью конструктора new
num=new Float(str).floatValue();
Переменная num есть число с плавающей точкой. Метод floatValue() переводит аргумент, находящийся в скобках - строковую переменную, в число с плавающей точкой.
Следующие строки Java – кода показывают, как обрабатываются объекты класса Button – элементы массива but[i], где i изменяется от 0 до 16, при нажатии на соответствующую кнопку. Метод e.getSource() означает нажатие на кнопку, оператор if(e.getSource() и идущая далее в этой же строке операция логического сравнения == означает проверку, на какую кнопку производится нажатие.
if(e.getSource()==but[0])zero();
if(e.getSource()==but[1])chislo("1");
if(e.getSource()==but[2])chislo("2");
if(e.getSource()==but[3])chislo("3");
if(e.getSource()==but[4])chislo("4");
if(e.getSource()==but[5])chislo("5");
if(e.getSource()==but[6])chislo("6");
if(e.getSource()==but[7])chislo("7");
if(e.getSource()==but[8])chislo("8");
if(e.getSource()==but[9])chislo("9");
Далее происходит проверка, не является ли кнопка, на которую производится нажатие, кодом операций вычитания (1), сложения (2), умножения (*), деления (/).
if(e.getSource()==but[10]){code=1;buf=num;str="0";}// -1
if(e.getSource()==but[11]){code=2;buf=num;str="0";}// +2
if(e.getSource()==but[14]){code=3;buf=num;str="0";}// *3
if(e.getSource()==but[15]){code=4;buf=num;str="0";}// /4
Далее производится проверка, не является ли кнопка, на которую производится нажатие, десятичной точкой, операций сброса, оператора равно.
if(e.getSource()==but[12])pnt();
if(e.getSource()==but[16])sbros();
if(e.getSource()==but[13])result();
На этом метод actionPerformed( ) завершает свою работу.
Далее работает метод result(), в котором выполняются операции вычитания, сложения, умножения и деления. При этом производится проверка num!=0 для избежания ситуации деления на ноль.
private void result(){
num=new Float(str).floatValue();
if(code==1)num=buf-num;
if(code==2)num=buf+num;
if(code==3)num=buf*num;
if(code==4 && num!=0)num=buf/num;
else str="delenie na nol - nelzya";
Далее производится перевод полученного при вычислениях значения переменной num из числа с плавающей точкой в строковую переменную с помощью метода valueOf(num) с аргументом num:
str=str.valueOf(num);
Метод repaint() снова прорисовывает полученную строковую переменную.
repaint();
На этом метод result() завершает свою работу.
Метод sbros() выполняет функции сброса, то есть прорисовывает нуль на месте предыдущей строковой переменной:
private void sbros(){
num=0;
buf=0;
code=0;
str="0";
point=false;
repaint();
}
Метод zero() работает с ненулевой строкой. Если строка не является нулевой (str!="0"), то к строковой переменной str добавляется строковая константа "0". Полученная строка снова прорисовывается с помощью метода repaint().
private void zero(){
if(str!="0")str=str+"0";
repaint();
}
Метод chislo() работает с нулевой строкой. Если строка является нулевой (str=="0"), то к строковой переменной str добавляется строковая переменная s. Полученная строка снова прорисовывается с помощью метода repaint().
private void chislo(String s){
if(str=="0")str=s;
else str=str+s;
repaint();
}
Метод pnt() работает с десятичной точкой. Если строка не содержит десятичной точки (point == false), то к строковой переменной str добавляется строковая десятичная точка ".". Логической переменной point присваивается значение true. Полученная строка снова прорисовывается с помощью метода repaint().
private void pnt(){
if(point == false)str=str+".";
point=true;
repaint();
}