import java.awt.*; import java.applet.Applet; public class calcolatrice extends Applet { Label display; // Il display Button bottoni []; // L'array dei bottoni /* Costanti per gli indici dei tasti */ static final int VIRGOLA = 10; static final int PIU = 11; static final int MENO = 12; static final int PER = 13; static final int DIVISO = 14; static final int UGUALE = 15; static final int C = 16; static final int CE = 17; double dispVal; // Il numero sul display double acc; // Il totale da elaborare /* Gestione input */ boolean decs; // E' stata premuta la virgola? double curDec; // Moltiplicatore del decimale corrente int oldOper = 0; // Operazione da eseuire (quella indicata tra gli operandi) /* Inizializzazione: crea l'interfaccia */ public void init () { int i; GridBagLayout gridbag = new GridBagLayout (); // layout manager GridBagConstraints c = new GridBagConstraints(); // 'constraints' per creare la tabella /* Inizializzazione */ dispVal = 0.0; acc = 0.0; decs = false; setLayout (gridbag); // Layout tabella flessibile display = new Label ("0.0"); // Crea il display display.setBackground (Color.white);// Sfondo display bottoni = new Button [18]; // Array dei bottoni /* Crea i dieci bottoni numerici */ for (i = 0; i < 10; i++) bottoni [i] = new Button (String.valueOf (i)); /* Bottoni con i simboli */ bottoni [VIRGOLA] = new Button (","); bottoni [PIU] = new Button ("+"); bottoni [MENO] = new Button ("-"); bottoni [PER] = new Button ("*"); bottoni [DIVISO] = new Button ("/"); bottoni [UGUALE] = new Button ("="); bottoni [C] = new Button ("C"); bottoni [CE] = new Button ("CE"); /* Inizializza i 'constraints' delle celle */ c.fill = GridBagConstraints.BOTH; // Espande in entrambe le direzioni c.weightx = 1.0; // Allarga l'elemento per riempire l'area c.weighty = 1.0; // Alza l'elemento per riempire l'area c.gridheight = 1; // Occupa una sola riga /* Prima riga - il solo display */ c.gridwidth = GridBagConstraints.REMAINDER;// E' l'ultimo della sua riga gridbag.setConstraints(display, c); // Applica i 'constraints' add(display); // Ed inserisce /* Seconda riga: ' 1 2 3 CE C ' */ c.gridwidth = 1; // Elementi che occupano una sola cella (non ultimi) gridbag.setConstraints(bottoni [1], c); // Applica i 'constraints' add(bottoni [1]); // Ed inserisce gridbag.setConstraints(bottoni [2], c); // Applica i 'constraints' add(bottoni [2]); // Ed inserisce gridbag.setConstraints(bottoni [3], c); // Applica i 'constraints' add(bottoni [3]); // Ed inserisce gridbag.setConstraints(bottoni [CE], c); // Applica i 'constraints' add(bottoni [CE]); // Ed inserisce c.gridwidth = GridBagConstraints.REMAINDER;// Ultimo elemento gridbag.setConstraints(bottoni [C], c); // Applica i 'constraints' add(bottoni [C]); // Ed inserisce /* Terza riga: ' 4 5 6 = ' */ c.gridwidth = 1; // Elementi che occupano una sola cella (non ultimi) gridbag.setConstraints(bottoni [4], c); // Applica i 'constraints' add(bottoni [4]); // Ed inserisce gridbag.setConstraints(bottoni [5], c); // Applica i 'constraints' add(bottoni [5]); // Ed inserisce gridbag.setConstraints(bottoni [6], c); // Applica i 'constraints' add(bottoni [6]); // Ed inserisce c.gridwidth = GridBagConstraints.REMAINDER;// Ultimo elemento (largo due celle) gridbag.setConstraints(bottoni [UGUALE], c);// Applica i 'constraints' add(bottoni [UGUALE]); // Ed inserisce /* Quarta riga: ' 7 8 9 + - ' */ c.gridwidth = 1; // Elementi che occupano una sola cella (non ultimi) gridbag.setConstraints(bottoni [7], c); // Applica i 'constraints' add(bottoni [7]); // Ed inserisce gridbag.setConstraints(bottoni [8], c); // Applica i 'constraints' add(bottoni [8]); // Ed inserisce gridbag.setConstraints(bottoni [9], c); // Applica i 'constraints' add(bottoni [9]); // Ed inserisce gridbag.setConstraints(bottoni [PIU], c); // Applica i 'constraints' add(bottoni [PIU]); // Ed inserisce c.gridwidth = GridBagConstraints.REMAINDER;// Ultimo elemento gridbag.setConstraints(bottoni [MENO], c); // Applica i 'constraints' add(bottoni [MENO]); // Ed inserisce /* Quinta ed ultima riga: ' , 0 * / ' */ c.gridwidth = 1; // Elementi che occupano una sola cella (non ultimi) gridbag.setConstraints(bottoni [VIRGOLA], c); // Applica i 'constraints' add(bottoni [VIRGOLA]); // Ed inserisce c.gridwidth = 2; // Elemento che occupano due celle gridbag.setConstraints(bottoni [0], c); // Applica i 'constraints' add(bottoni [0]); // Ed inserisce c.gridwidth = 1; // Elementi che occupano una sola cella (non ultimi) gridbag.setConstraints(bottoni [PER], c); // Applica i 'constraints' add(bottoni [PER]); // Ed inserisce c.gridwidth = GridBagConstraints.REMAINDER; //end row gridbag.setConstraints(bottoni [DIVISO], c); // Applica i 'constraints' add(bottoni [DIVISO]); // Ed inserisce } /* Metodo che gestisce la costruzione del numero */ private void addCifra (int cifra) { if (cifra == VIRGOLA) { // Se il tasto era ',' if (!decs) { // Se e' gia stata premuta decs=true; // Memorizza che siamo nei decimali curDec = 1.0; // Ed imposta il moltiplicatore } } else { // Altrimente erano cifre if (decs) { // Se siamo nella parte decimale curDec /= 10.0; // Prima di tutto spostiamo il decimale a destra dispVal += curDec * cifra; // Quindi aggiungiamo la cifra, moltiplicata per il peso } else { // Se invece siamo nella parte intera dispVal *= 10.0; // Spostiamo a sinistra le cifre gia' inserite dispVal += cifra; // Ed aggiungiamo la nuova cifra } } display.setText (String.valueOf (dispVal)); // Visualizza il nuovo numero } /* Merodo che esegue le operazioni */ private void oper (int op) { switch (oldOper) { // Visto che la notazione e' infissa, l'oerazione da eseguire // e' quella indicata 'la volta scorsa' case PIU : // Somma acc += dispVal; break; case MENO : // Sottrazione acc -= dispVal; break; case PER : // Moltiplicazione acc *= dispVal; break; case DIVISO : // Divisione if (dispVal != 0.0) { // (solo se il divisore e' diverso da 0) acc /= dispVal; } break; case UGUALE : // Tasto uguale (al ciclo dopo) if (dispVal != 0.0) { // Se si e' introdotta alcuna cifra (empirico) acc = dispVal; // Prendiamo il numero introdotto come primo operando } break; default : // (siamo alla prima chiamata) acc = dispVal; // Prendiamo il numero introdotto come primo operando } dispVal = 0.0; // Con ogni operazione si azzera il display decs = false; // E di conseguenza il flag della virgola display.setText (String.valueOf (acc)); // Visualizza l'accumulatore oldOper = op; // Memorizza l'operatore premuto ora, per poi } /* metodo che cancella (tasti C e CE) */ private void canc (boolean isAll) { dispVal = 0.0; // Azzera il display decs = false; // Ed il flag della virgola if (isAll) { // Se e' C (cancella tutto) acc = 0.0; // Azzera anche l'accumulatore oldOper = 0; // E l'operazione in corso } display.setText (String.valueOf (dispVal)); // Visualizza lo 0 } /* Gestisce tutti i tasti */ public boolean action(Event event, Object arg) { int i; for (i = 0; i <= VIRGOLA; i++) // Loop sui tasti numerici e ',' if (event.target == bottoni [i]) { // Se l'evento corrisponde a... addCifra (i); // Eseguo l'azione return true; } for (i = PIU; i <= UGUALE; i++) // Loop sui tasti operatore if (event.target == bottoni [i]) { // Se l'evento corrisponde a... oper (i); // Eseguo l'azione return true; } /* Tasti 'C' e 'CE' */ if (event.target == bottoni [C] || event.target == bottoni [CE]) { canc (event.target == bottoni [C]); // Esegue (parametro: "e' 'C'?") return true; } return true; } }