import java.lang.*; //import java.io.*; import java.awt.*; class Taschenrechner extends Thread { private String key; private boolean keyResolved = true; private boolean Error = false; private boolean keyProcessed = false; // Wird bei Bedarf benoetigt, um festzustellen, ob eine Taste(nfolge) verarbeitet wurde private double Memory; private huetr myFather; private keybox myKBox; private displaybox myDBox; public Taschenrechner(huetr vater) { myFather = vater; } private void setDisplay (double Display, String indent) { synchronized(myFather.display) { myFather.displayBuffer.display = Display; myFather.displayBuffer.memFlag = (Memory != 0); myFather.displayBuffer.errFlag = Error; } myFather.handleEvent(new Event(this, 1, this)); } private synchronized void getKey () { if (keyResolved) { while (!myFather.keyBuffer.used) { try {this.wait();} catch(InterruptedException e) {}; synchronized(myFather.keyBuffer) { if (myFather.keyBuffer.used) { key = new String(myFather.keyBuffer.key); myFather.keyBuffer.used = false; keyResolved = false; return; } } } } } public void run() { double accu = 0; while (true) { setDisplay(accu, "s"); accu = readSumHierarchy(accu); getKey(); if ("AC".equals(key)) {accu = 0; Memory = 0; keyResolved = true; Error = false;} else if ("CE".equals(key)) {accu = 0; keyResolved = true; Error = false;} else if ("=".equals(key)) {keyResolved = true;} else { System.err.println("Unknown Key: "+key+"!"); setDisplay(accu, "u"); accu = 0; Memory = 0; keyResolved = true; Error = false; }; }; } private double readSumHierarchy(double accu){ double buffer; int sumMode = 0; // Sum: 1 / Sub: -1 / undef., d.h. Neustart: 0 boolean cont = true; // Falls noch weitere Summanden eingelesen werden sollen boolean myKeyProcessed = false; boolean firstArg = true; accu = readMultHierarchy(accu); myKeyProcessed = keyProcessed; while (cont) { cont = false; getKey(); if ("+".equals(key)) {setDisplay(accu, "d"); sumMode = 1; cont = true; keyResolved = true; myKeyProcessed = true;} else if ("-".equals(key)) {setDisplay(accu, "d"); sumMode = -1; cont = true; keyResolved = true; myKeyProcessed = true;} else if ("CE".equals(key) && firstArg == false) { setDisplay(0, "d"); sumMode = 0; cont = true; keyResolved = true; myKeyProcessed = false; accu = 0; } else { keyProcessed = false; buffer = readMultHierarchy(accu); // Kann vielleicht eine hoehere Hierarchie diese Taste(nfolge) verarbeiten? firstArg = false; if (keyProcessed) { // wurde mind. eine Taste verarbeitet? if ("%".equals(key)) {myKeyProcessed = true; keyResolved = true; setDisplay(accu*buffer*0.01, "+%"); buffer = readMultHierarchy(accu*buffer*0.01);}; myKeyProcessed = true; if (sumMode == 0) accu = buffer; else accu = accu + sumMode*buffer; cont = true; } else // Nein? Dann zurueckgeben cont = false; }; } keyProcessed = myKeyProcessed; return accu; } private double readMultHierarchy(double accu){ double buffer; int multMode = 0; // Mult: 1 / Div: -1 / undef., d.h. Neustart: 0 boolean cont = true; // Falls noch weitere Multiplikanden eingelesen werden sollen boolean myKeyProcessed = false; boolean firstArg = true; accu = readInstantFunc(accu); myKeyProcessed = keyProcessed; while (cont) { cont = false; getKey(); if ("*".equals(key)) {setDisplay(accu, "c"); multMode = 1; cont = true; keyResolved = true; myKeyProcessed = true;} else if ("/".equals(key)) {setDisplay(accu, "c"); multMode = -1; cont = true; keyResolved = true; myKeyProcessed = true;} else if ("CE".equals(key) && firstArg == false) { setDisplay(0, "c"); multMode = 0; cont = true; keyResolved = true; myKeyProcessed = false; accu = 0; } else { keyProcessed = false; buffer = readInstantFunc(accu); // Kann vielleicht eine hoehere Hierarchie diese Taste(nfolge) verarbeiten? firstArg = false; if (keyProcessed) { // wurde mind. eine Taste verarbeitet? if ("%".equals(key)) {keyResolved = true; myKeyProcessed = true; setDisplay(buffer*0.01, "*%"); buffer = readInstantFunc(buffer * 0.01);} myKeyProcessed = true; if (multMode == 1) accu = accu * buffer; else if (multMode == -1) accu = accu / buffer; else accu = buffer; cont = true; } else // Nein? Dann zurueckgeben cont = false; }; } keyProcessed = myKeyProcessed; return accu; } private double readInstantFunc(double accu){ accu = readStdNumber(accu); double arg_2; while (true) { getKey(); if ("SIN".equals(key)) {accu = Math.sin(accu); keyResolved = true;} else if ("COS".equals(key)) {accu = Math.cos(accu); keyResolved = true;} else if ("TAN".equals(key)) {accu = Math.tan(accu); keyResolved = true;} else if ("SQRT".equals(key)) {accu = Math.sqrt(accu); keyResolved = true;} else if ("LN".equals(key)) {accu = Math.log(accu); keyResolved = true;} else if ("EXP".equals(key)) {accu = Math.exp(accu); keyResolved = true;} else if ("LG".equals(key)) {accu = Math.log(accu)/Math.log(10); keyResolved = true;} else if ("ASIN".equals(key)) {accu = Math.asin(accu); keyResolved = true;} else if ("ACOS".equals(key)) {accu = Math.acos(accu); keyResolved = true;} else if ("ATAN".equals(key)) {accu = Math.atan(accu); keyResolved = true;} else if ("1/X".equals(key)) {accu = 1/accu; keyResolved = true;} else if ("SQR".equals(key)) {accu = accu * accu; keyResolved = true;} else if ("X^Y".equals(key)) {keyResolved = true; arg_2 = readInstantFunc(accu); accu = Math.pow (accu, arg_2);} else if ("SUM".equals(key)) {Memory += accu; keyResolved = true; return accu;} else if ("STO".equals(key)) {Memory = accu; keyResolved = true; return accu;} else if ("RCL".equals(key)) {accu = Memory; keyProcessed = true; setDisplay(accu, "MR"); keyResolved = true; return accu;} else return accu; keyProcessed = true; // Hierhin kommt man nur, wenn mind. eine Taste (ausser Memory) verarbeitet wurde. setDisplay(accu, "b"); } } private double readStdNumber(double accu){ // Spezialfall geklammert boolean firstKey = true; boolean gotPoint = false; boolean enableNumKey = true; double Exponent = 1; int keyValue = 0; while(true) { getKey(); if ("(".equals(key)) { keyResolved = true; if (firstKey) { firstKey = false; setDisplay(0, "(a)"); accu = readSumHierarchy(0); keyProcessed = true; getKey(); if (")".equals(key)) {setDisplay(accu, "(a)"); keyResolved = true;} return accu; } } else if ("PI".equals(key)) {accu = Math.PI; keyResolved = true;} else if ("E".equals(key)) {accu = Math.E; keyResolved = true;} else if ("+/-".equals(key)) {accu *= -1; keyResolved = true;} else if ("CE".equals(key)) if (firstKey) { keyResolved = false; return 0; } else { enableNumKey = true; firstKey = true; accu = 0; Exponent = 1; gotPoint = false; keyValue = 0; keyResolved = true; } else if (enableNumKey) { if ("0".equals(key)) keyValue = 0; else if ("1".equals(key)) keyValue = 1; else if ("2".equals(key)) keyValue = 2; else if ("3".equals(key)) keyValue = 3; else if ("4".equals(key)) keyValue = 4; else if ("5".equals(key)) keyValue = 5; else if ("6".equals(key)) keyValue = 6; else if ("7".equals(key)) keyValue = 7; else if ("8".equals(key)) keyValue = 8; else if ("9".equals(key)) keyValue = 9; else if (".".equals(key)) {keyValue = 0; Exponent *= 10; gotPoint = true;} else return accu; // Hier kommt man nur hin, wenn eine Zahltaste gedrueckt wurde if (firstKey) { accu = 0; firstKey = false; }; if (gotPoint) Exponent /= 10; else accu *= 10; if (accu >= 0) accu += keyValue*Exponent; else accu -= keyValue*Exponent; keyResolved = true; } else return accu; keyProcessed = true; // Hierhin kommt man nur, wenn mind. eine Taste verarbeitet wurde. setDisplay(accu, "a"); } } }