Примеры программирования на Java

Калькулятор
(Calculator.java)

Описание апплета
Пример работы апплета


import java.awt.*;
import java.applet.Applet;
/*
 Реализация простого калькулятора
 */
public class Calculator extends Applet 
{
   TextField txtDisp;
   public final int OP_NONE = 0;
   public final int OP_ADD = 1;
   public final int OP_SUB = 2;
   public final int OP_MUL = 3;
   public final int OP_DIV = 4;
   public final int OP_NEG = 5;
   public final int OP_SQRT = 6;
   public final int OP_EQ = 7;
   public final int OP_C = 8;
   public final int OP_AC = 9;
   public final int OP_PCT = 14;
   public final int DECSEP = -1;

   long  U;
   double V;
   String msDecimal;
   int mnOp = OP_NONE;
   boolean mbNewNumber = true;
   boolean mbDecimal = false;
   double mdReg = 0.0;
   boolean mbConstant = false;
   double mdConstant = 0.0;
   int mnConstantOp = OP_NONE;
   boolean mbPercent = false;
   double mdFirst = 0.0;
/* 
   В методе init() происходит первичная инициализация аплета
   ( описываются кнопки калькулятора, устанавливается цвет)
 */   
   public void init() 
   {
      CalcButton btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9;
      CalcButton btnDecSep, btnNeg, btnSqrt, btnPlus, btnMinus;
      CalcButton btnTimes, btnDiv, btnEqual, btnClear, btnAllClear;
      CalcButton btnPercent;

      setLayout(null); // Отключение компоновщика JAVA,
      		       // т. е. расположение кнопок будет производиться
      		       //  самим разработчиком с помощью методов add() и 
      		       //  reshape()
      
      // Установка шрифта
      setFont(new Font("Helvetica", Font.BOLD|Font.ITALIC, 12));
      
      // Установка цвета аплета, 
      // причем цвет берется из html-файла ( параметр "bgcolor"),
      //  но в случае отсутствия этого параметра устанавливается nBGColor
      int nBGColor;
      try
      {
         nBGColor = Integer.parseInt(getParameter("bgcolor").substring(1), 16); 
      }
      catch(RuntimeException e)
      {
         nBGColor = 0x990077;
      }
      setBackground(new Color(nBGColor));

 

 // Формирование кнопок калькулятора
 
      btn0 = new CalcButton("0", OP_NONE, 0);
      add(btn0);
      btn0.reshape(8, 176, 96, 24);

      btn1 = new CalcButton("1", OP_NONE, 1);
      add(btn1);
      btn1.reshape(8, 144, 40, 24);

      btn2 = new CalcButton("2", OP_NONE, 2);
      add(btn2);
      btn2.reshape(64, 144, 40, 24);

      btn3 = new CalcButton("3", OP_NONE, 3);
      add(btn3);
      btn3.reshape(120, 144, 40, 24);

      btn4 = new CalcButton("4", OP_NONE, 4);
      add(btn4);
      btn4.reshape(8, 112, 40, 24);

      btn5 = new CalcButton("5", OP_NONE, 5);
      add(btn5);
      btn5.reshape(64, 112, 40, 24);

      btn6 = new CalcButton("6", OP_NONE, 6);
      add(btn6);
      btn6.reshape(120, 112, 40, 24);

      btn7 = new CalcButton("7", OP_NONE, 7);
      add(btn7);
      btn7.reshape(8, 80, 40, 24);

      btn8 = new CalcButton("8", OP_NONE, 8);
      add(btn8);
      btn8.reshape(64, 80, 40, 24);

      btn9 = new CalcButton("9", OP_NONE, 9);
      add(btn9);
      btn9.reshape(120, 80, 40, 24);	

      btnDecSep = new CalcButton("ф", OP_NONE, DECSEP);
      add(btnDecSep);
      btnDecSep.reshape(120, 176, 40, 24);

      btnNeg = new CalcButton("+/-", OP_NEG, 0);
      add(btnNeg);
      btnNeg.reshape(8, 48, 40, 24);

      btnSqrt = new CalcButton("Sqrt", OP_SQRT, 0);
      add(btnSqrt);
      btnSqrt.reshape(64, 48, 40, 24);

      btnPlus = new CalcButton("+", OP_ADD, 0);
      add(btnPlus);
      btnPlus.reshape(176, 144, 40, 56);

      btnMinus = new CalcButton("-", OP_SUB, 0);
      add(btnMinus);
      btnMinus.reshape(176, 80, 40, 56);

      btnTimes = new CalcButton("в", OP_MUL, 0);
      add(btnTimes);
      btnTimes.reshape(232, 80, 40, 24);

      btnDiv = new CalcButton("В", OP_DIV, 0);
      add(btnDiv);
      btnDiv.reshape(232, 112, 40, 24);

      btnEqual = new CalcButton("=", OP_EQ, 0);
      add(btnEqual);
      btnEqual.reshape(232, 144, 40, 56);

      btnClear = new CalcButton("C", OP_C, 0);
      add(btnClear);
      btnClear.reshape(232, 48, 40, 24);

      btnAllClear = new CalcButton("AC", OP_AC, 0);
      add(btnAllClear);
      btnAllClear.reshape(176, 48, 40, 24);

     btnPercent = new CalcButton("%", OP_PCT, 0);
      add(btnPercent);
      btnPercent.reshape(120, 48, 40, 24);

      txtDisp = new TextField("0", 80);
      txtDisp.setEditable(false);
      add(txtDisp);
      txtDisp.reshape(4, 8, 268, 31);

     

   // Вывод на табло калькулятора десятичной точки 

   
      String sOneTenth = (new Double(0.1)).toString();
      msDecimal = sOneTenth.substring(sOneTenth.length()-2).substring(0, 1);
     }


// Формирование из цифр числа 
   public void append(int nValue)  
   {
      String sDigit;

      if(nValue == DECSEP)
         if(!mbDecimal)    // Проверка на наличие десятых долей
         {
            if(mbNewNumber)
            {
               txtDisp.setText("0");
               mbNewNumber = false;
            }
            mbDecimal = true;
            sDigit = msDecimal;
         }
         else
            return; 
      else
         sDigit = (new Integer(nValue)).toString();
      if(mbNewNumber)
      {
         txtDisp.setText(sDigit);
         if(nValue != 0)
            mbNewNumber = false;
      }
      else
   
         txtDisp.setText(txtDisp.getText() + sDigit);
      repaint();
   }


// В методе doOp() определяеся какое действие предстоит выполнить над 

// над введенными числами. И выполняются вычисления.
   public void doOp(int nNewOp)
   {
      double dDisp;

      dDisp = (new Double(txtDisp.getText())).doubleValue();
      if(mbPercent)
         if(nNewOp != OP_ADD && nNewOp != OP_SUB)
            mbPercent = false;
      if(!mbPercent)
         switch(nNewOp)
         {
         case OP_ADD:
         case OP_SUB:
         case OP_MUL:
         case OP_DIV:
            if(mbNewNumber)
            {
               if(nNewOp == mnOp && !mbConstant)
               {
                  mbConstant = true;
                  mdConstant = dDisp;
                  mnConstantOp = nNewOp;
               }
               else
                  mbConstant = false;
            }
            else
               mbConstant = false;
         case OP_EQ:
         case OP_PCT:
            if(!mbNewNumber || isEqOp(nNewOp))
            {
               if(mbConstant)
               {
                  mdReg = mdConstant;
                  mnOp = mnConstantOp;
               }
               mbPercent = nNewOp == OP_PCT;
               if(mbPercent)
                  mdFirst = mdReg;
               switch(mnOp)
               {
               case OP_ADD:
                  mdReg = mdReg + dDisp;
                  break;
               case OP_SUB:
                  mdReg = mdReg - dDisp;
                  break;
               case OP_MUL:
                  mdReg = mdReg * dDisp;
                  break;
               case OP_DIV:
                  mdReg = mdReg / dDisp;
                  break;
               case OP_EQ:
               case OP_PCT:
               case OP_NONE:
                  mdReg = dDisp;
                  break;
               }
               if(mbPercent)
                  mdReg /= 100;
                  U = ((new Double(mdReg)).longValue());
                  V = mdReg%1;
                 if ( V == 0)
             txtDisp.setText((new Long(U)).toString());
            else
               txtDisp.setText((new Double(mdReg)).toString());
            }
            mnOp = nNewOp;      // Определение нажатой не числовой  
            mbNewNumber = true; // кнопки закончено. Восстановливаются
            mbDecimal = false;  // параметры для ввода цифр
            break;
         }
      switch(nNewOp)
      {
      case OP_ADD:
         if(mbPercent)
         {
            mdReg = mdFirst + mdReg;
            txtDisp.setText((new Double(mdReg)).toString());
            mbPercent = false;
         }
         break;
      case OP_SUB:
         if(mbPercent)
         {
            mdReg = mdFirst - mdReg;
            txtDisp.setText((new Double(mdReg)).toString());
            mbPercent = false;
         }
         break;
      case OP_NEG:
         dDisp = -dDisp;
         U = ((new Double(dDisp)).longValue());
         V = dDisp%1;
         if ( V == 0)
         txtDisp.setText((new Long(U)).toString());
           else
         txtDisp.setText((new Double(dDisp)).toString());
         if(isEqOp(mnOp))
         {
            mdReg = dDisp;
         }
         break;
      case OP_SQRT:
         dDisp = Math.sqrt(dDisp);
         U = ((new Double(dDisp)).longValue());
         V = dDisp%1;
         if ( V == 0)
         txtDisp.setText((new Long(U)).toString());
           else
           txtDisp.setText((new Double(dDisp)).toString());
         if(isEqOp(mnOp))
         {
            mdReg = dDisp;
         }
         mbNewNumber = true;
         mbDecimal = false;
         break;
      case OP_C:
         dDisp = 0.0;
         txtDisp.setText("0");
         if(isEqOp(mnOp))
         {
            mdReg = dDisp;
         }
         mbNewNumber = true;
         mbDecimal = false;
         break;
      case OP_AC:
         txtDisp.setText("0");
         mnOp = OP_NONE;
         mbNewNumber = true;
         mbDecimal = false;
         mdReg = 0.0;
         mbConstant = false;
         break;
  
      }
   }

// isEqOP -- это вспомогательная функция  для алгебраических вычислений 
   private protected boolean isEqOp(int nOp)
   {
      return nOp == OP_EQ || nOp == OP_PCT;
   }

 
   public static void main(String args[]) // Организация окна 
   {
      CalcFrame frm = new CalcFrame("Calculator");
      Calculator pnl = new Calculator();
      pnl.init();
      frm.add("Center", pnl);
      frm.pack();
      frm.resize(276, 240);
      frm.show();
   }
}
// Коструктор класса CalcButton
class CalcButton extends Button
{
   int mnOp;
   int mnValue;

   CalcButton(String sText, int nOp, int nValue)
   {
      super(sText);
      mnOp = nOp;
      mnValue = nValue;   
   }

   public boolean action(Event evt, Object arg) 
   {
      Calculator par = (Calculator)getParent();

      if(mnOp == par.OP_NONE) // Если ввденный символ цифра 
         par.append(mnValue);
      else
         par.doOp(mnOp); // если не цифра
      return true;
   }
}

class CalcFrame extends Frame
{
   CalcFrame(String s)
   {
      super(s);
   }

/* handleEvent() - это обработчик событий, связанных с окном. Проверяя
поле id, можно определить какое событие произошло. В этом примере проверяется 
закрытие окна. Если  evt.id == Event.WINDOW_DESTROY, то необходимо выйти из 
среды JAVA с помощью System.exit().
*/
   public boolean handleEvent(Event evt) 
   {
      if(evt.id == Event.WINDOW_DESTROY) 
      { 
         System.exit(0);
         return true;
      } 
      else 
         return super.handleEvent(evt);
   }
}


Вступление | Примеры | Вопросы
Sun Microsystems
JavaSoft