Annotation of Examples/AppKit/CalculatorLab++/CalcEngine.C, revision 1.1.1.1

1.1       root        1: //
                      2: //     CalcEngine -- mem
                      3: //     A general C++ class that directly supports a calculator interface
                      4: //
                      5: //     You may freely copy, distribute and reuse the code in this example.
                      6: //     NeXT disclaims any warranty of any kind, expressed or implied, as to
                      7: //     its fitness for any particular use.
                      8: //
                      9: //     Created 8-21-90
                     10: //
                     11: extern "Objective-C"
                     12: {
                     13: #import <objc/error.h>
                     14: }
                     15: 
                     16: #import "CalcEngine.h"
                     17: 
                     18: // Create an instance of the class and initialize flags for start-up
                     19: CalcEngine::CalcEngine()
                     20: {      
                     21:     //the buffer that holds the first number entered
                     22:     accumulator = 0;
                     23:        
                     24:     //the current operator
                     25:     op = 0;
                     26: }
                     27: 
                     28: // Clear the state of the calculator engine.
                     29: void CalcEngine::clear()
                     30: {
                     31:     setOperation(0);
                     32:     accumulator = 0;
                     33: }
                     34: 
                     35: // Set the current operation (+ - * / ),  0 is no operation.
                     36: void CalcEngine::setOperation(int whichOp)
                     37: {
                     38:     op = whichOp;
                     39: }
                     40: 
                     41: // Called when one of the operation keys is pressed.
                     42: double CalcEngine::operationKeys(int whichOp, double firstNum)
                     43: {
                     44:     double result;
                     45: 
                     46:     switch(whichOp){
                     47:        case DIVIDE:            // Indicates a series of numbers and
                     48:        case MULTIPLY:          // operations.  For example: 1 + 2 + 3 + ...
                     49:        case SUBTRACT:
                     50:        case ADD:
                     51:        {
                     52:            if (op)
                     53:                result = equalsKey(firstNum);
                     54:            else
                     55:                result = firstNum;
                     56:            setOperation(whichOp);
                     57:            accumulator = result;
                     58:            break;
                     59:        }
                     60:        default:                // Indicates first number has just been
                     61:        {                       // entered.
                     62:            result = 0;
                     63:            break;
                     64:        }
                     65:     }
                     66:     return result;
                     67: }
                     68: 
                     69: // Do the actual calculation.  This is called when the equals key is pressed or
                     70: // when an operation key is pressed in a series of numbers.
                     71: double CalcEngine::equalsKey(double secondNum)
                     72: {
                     73:     double result;
                     74: 
                     75:     switch(op){
                     76:        case DIVIDE:
                     77:        {
                     78:            if(secondNum == 0) {
                     79:                clear();
                     80:                NX_RAISE(0, "divideByZero", 0);
                     81:            }
                     82:            result = accumulator / secondNum;
                     83:            break;
                     84:        }
                     85:        case MULTIPLY:
                     86:        {
                     87:            result = accumulator * secondNum;
                     88:            break;
                     89:        }
                     90:        case SUBTRACT:
                     91:        {
                     92:            result = accumulator - secondNum;
                     93:            break;
                     94:        }
                     95:        case ADD:
                     96:        {
                     97:            result = accumulator + secondNum;
                     98:            break;
                     99:        }
                    100:        default:{
                    101:            result = secondNum;
                    102:            break;
                    103:        }
                    104:     }
                    105:     clear();
                    106:     return result;
                    107: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.