Kalkulator w Javie

update 16-03-04

//Kalkulator2.java

/** cos co ma udawac profesjonalny kalkulator

*@author Jaroslaw Czarniak

*@version 2.11

*@since 16-03-2004

*/

import java.awt.*;

import java.awt.event.*;

import java.lang.Math;

public class Kalkulator2 extends Frame

{

private TextField wyswietlacz;

/*

utworzenie pol

poczatkowy argument to 0

poczatkowy operator mat. to =

nic nie ma na wyswietlaczu

*/

private double argument = 0;

private String operator = "=";

private boolean start = true;

private String ostatni_kl = "";

private double pamiec = 0;

private String tmp = "";

/**Inicjalizacja GUI*/

public static void main(String arguments[])

{

new Kalkulator2();

}

/**konstruktor, utworzenie GUI*/

public Kalkulator2()

{

addWindowListener(new WindowHandler());

Panel zero = new Panel ();

zero.setLayout (new GridLayout(1,1));

wyswietlacz = new TextField("0",35);

wyswietlacz.setEditable(false);

zero.add(wyswietlacz);

add("North", zero);

Panel dwa = new Panel();

dwa.setLayout (new GridLayout(1,5));

dwa.add(new Button("M+"));

dwa.add(new Button("M-"));

dwa.add(new Button("MR"));

dwa.add(new Button("MC"));

dwa.add(new Button("CE"));

//dwa.add(new Button("check"));

add("Center", dwa);

Panel jeden = new Panel();

jeden.setLayout (new GridLayout(5,4));

jeden.add(new Button("+/-"));

jeden.add(new Button("Sqr"));

jeden.add(new Button("<="));

jeden.add(new Button("x*x"));

jeden.add(new Button("7"));

jeden.add(new Button("8"));

jeden.add(new Button("9"));

jeden.add(new Button("/"));

jeden.add(new Button("4"));

jeden.add(new Button("5"));

jeden.add(new Button("6"));

jeden.add(new Button("*"));

jeden.add(new Button("1"));

jeden.add(new Button("2"));

jeden.add(new Button("3"));

jeden.add(new Button("-"));

jeden.add(new Button("0"));

jeden.add(new Button("."));

jeden.add(new Button("="));

jeden.add(new Button("+"));

add("South", jeden);

pack();

setSize(200,240);

setResizable(false);

setTitle("Kalkulator v.2.1");

setVisible(true);

}

/**odpalane po kliknieciu, na caly kalkulator ustawiamy wychwytywanie zdarzen*/

public boolean action(Event zdarzenie, Object argument)

{

//przepisuje zawartosc 'argument' do zmiennej 'tmp' typu string

tmp = (String) argument;

if (tmp == "Sqr")

{

wyswietlacz.setText(Double.toString(Math.sqrt(Double.parseDouble(wyswietlacz.getText()))));

ostatni_kl = "";

start = false;

return true;

}

if (tmp == "x*x")

{

wyswietlacz.setText(Float.toString(Float.parseFloat(wyswietlacz.getText())*Float.parseFloat(wyswietlacz.getText())));

ostatni_kl = "";

start = false;

return true;

}

char znak = tmp.charAt(0);

//uniemozliwienie wywolania wiecej niz raz tego samego znaku

//zapobiega sytuacji kiedy java bedzie probowac wykonac przykladowo

//takie dzialanie '10' + '+'*/

if (ostatni_kl == tmp) return true;

if (tmp == "CE")

{

czysc();

start = true;

//zakoncz zdarzenie, nie kontynuuj

return true;

}

if (tmp == "M+")

{

pamiec_p();

return true;

}

if (tmp == "M-")

{

pamiec_m();

return true;

}

if (tmp == "MC")

{

pamiec_c();

return true;

}

if (tmp == "MR")

{

pamiec_r();

return true;

}

// jesli zmiana znaku

if (tmp == "+/-")

{

//jesli wyswietlacz nie jest pusty

if (!start)

{

//jesli na poczatku jest minus

if (wyswietlacz.getText().charAt(0) == '-')

{

wyswietlacz.setText(" "+wyswietlacz.getText().substring(1,wyswietlacz.getText().length()));

start = false;

}

//jesli na poczatku jest spacja

else if (wyswietlacz.getText().charAt(0) == ' ')

{

wyswietlacz.setText("-"+wyswietlacz.getText().substring(1,wyswietlacz.getText().length()));

start = false;

}

//jesli jeszcze nie byl zmieniany znak

else

{

wyswietlacz.setText("-"+wyswietlacz.getText().substring(0,wyswietlacz.getText().length()));

start = false;

}

}

return true;

}

//jesli cofniecie znaku

if (tmp == "<=")

{

//jesli jest cos na wyswietlaczu

if (!start)

{

wyswietlacz.setText(wyswietlacz.getText().substring(0,wyswietlacz.getText().length() -1));

System.out.println("dlugosc="+wyswietlacz.getText().length());

//jesli juz na wyswietlaczu nic nie ma

if (wyswietlacz.getText().length() <= 0)

{

wyswietlacz.setText("X");

start = true;

}

return true;

}

}

//jesli cyfra lub kropka

if ('0' <= znak && znak <= '9' || znak == '.')

{

//czy na wyswietlaczu cos juz jest

if (start)

{

//jesli nic nie ma na wyswietlaczu (poczatek)

wyswietlacz.setText(tmp);

ostatni_kl = "";

}

else

{

//jesli cos juz mamy na wyswietlaczu

wyswietlacz.setText(wyswietlacz.getText() + tmp);

ostatni_kl = "";

}

start = false;

}

//jesli znak operacji matematycznej

else

{

//jesli nic nie ma na wyswietlaczu (poczatek)

if (start)

{

operator = tmp;

ostatni_kl = tmp;

}

//jesli cos juz mamy na wyswietlaczu

else

{

//zapobiega wykonaniu obliczenia jesli klawisz znaku

//zostal zmieniony

if (ostatni_kl == "")

{

//wywoluje procedure obliczen

oblicz(Double.parseDouble(wyswietlacz.getText()));

//przepisuje znak jako aktualnie obowiazujaca do

//wykonania operacja

operator = tmp;

ostatni_kl = tmp;

start = true;

}

}

}

//kontrola();

return true;

}

/**czysci wyswietlacz, argument do obliczen, ustawia

*zmienna sygnalizujaca poczatek obliczen*/

public void czysc()

{

wyswietlacz.setText ("0");

argument = 0;

start = true;

operator = "=";

ostatni_kl = "";

//pamiec = 0;

tmp = "";

//kontrola();

}

/**dodanie wartosci do pamieci*/

public void pamiec_p()

{

pamiec += Double.parseDouble(wyswietlacz.getText());

System.out.println("M = "+pamiec);

}

/**odjecie wartosci z pamieci*/

public void pamiec_m()

{

pamiec -= (Double.parseDouble(wyswietlacz.getText()));

System.out.println("M = "+pamiec);

}

/**kasowanie pamieci*/

public void pamiec_c()

{

pamiec = 0;

System.out.println("M = "+pamiec);

}

/**odczytanie pamieci*/

public void pamiec_r()

{

wyswietlacz.setText(Double.toString(pamiec));

ostatni_kl = "";

start = false;

}

/** przekazana wartosc (n) to ostatnia wpisana wartosc*/

public void oblicz(double n)

{

//do poprzedniej wartosci ktora jest niejako w pamieci ('argument')

//musimy +,-,/,* przekazana wartosc

if (operator == "+") argument += n;

else if (operator == "-") argument -= n;

else if (operator == "*") argument *= n;

else if (operator == "/") argument /= n;

else if (operator == "=") argument = n;

//wywalamy to na ekran

wyswietlacz.setText("" + argument);

}

/* public void kontrola()

{

System.out.println("argument = "+ argument);

System.out.println("operator = '"+ operator+"'");

System.out.println("start = "+ start);

System.out.println("ostatni_kl = '"+ostatni_kl+"'");

System.out.println("pamiec = "+pamiec);

System.out.println("tmp = '"+tmp+"'");

System.out.println("");

}*/

}

/**obsluga zamkniecia okna*/

class WindowHandler implements WindowListener

{

public void windowClosing(WindowEvent event)

{

System.exit(0);

}

public void windowClosed(WindowEvent event)

{

}

public void windowOpened(WindowEvent event)

{

}

public void windowIconified(WindowEvent event)

{

}

public void windowDeiconified(WindowEvent event)

{

}

public void windowActivated(WindowEvent event)

{

}

public void windowDeactivated(WindowEvent event)

{

}

}