home *** CD-ROM | disk | FTP | other *** search
- *****************************************************************
- * * 07/09/92 CALC.PRG 06:19:39 *
- *****************************************************************
- * * Author's Name: Jeb Long *
- * * *
- * * Description: *
- * * This program simulates a simple scientific calculator. *
- * * *
- *****************************************************************
- PRIVATE talkstat, compstat, snumlock
-
- IF SET("TALK") = "ON"
- SET TALK OFF
- talkstat = "ON"
- ELSE
- talkstat = "OFF"
- ENDIF
- snumlock = NUMLOCK(.T.) && Set the NumLock mode ON
- compstat = SET("COMPATIBLE")
- SET COMPATIBLE FOXPLUS
- *
- * Window definitions
- *
- IF NOT WEXIST("calc")
- DEFINE WINDOW calc ;
- FROM INT((SROW()-20)/2),INT((SCOL()-63)/2) ;
- TO INT((SROW()-20)/2)+19,INT((SCOL()-63)/2)+62 ;
- TITLE "Scientific Calculator" ;
- FLOAT ;
- NOCLOSE ;
- MINIMIZE;
- SHADOW ;
- PANEL ;
- COLOR SCHEME 1
- ENDIF
- *****************************************************************
- * CALC Setup Code - SECTION 2
- *
- acc=0
- =RAND(-1)
- memory = 0
- results = 0
- oldOP = "+"
- Decimal = 0
- *******************************************************************
- * CALC Screen Layout
- *
- IF WVISIBLE("calc")
- ACTIVATE WINDOW calc SAME
- ELSE
- ACTIVATE WINDOW calc NOSHOW
- ENDIF
- *
- *****************************************************************
- * Initialize variables
- *
- @ 1,18 SAY "X"
- @ 2,18 SAY "Y"
- @ 3,14 SAY "Memory"
- DO ShowCalc WITH " "
- @ 11,5 GET i0 ;
- PICTURE "@*HN \<0" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 0 )
- @ 9,5 GET i1 ;
- PICTURE "@*HN \<1" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 1 )
- @ 9,12 GET i2 ;
- PICTURE "@*HN \<2" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 2 )
- @ 9,19 GET i3 ;
- PICTURE "@*HN \<3" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 3 )
- @ 7,5 GET i4 ;
- PICTURE "@*HN \<4" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 4 )
- @ 7,12 GET i5 ;
- PICTURE "@*HN \<5" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 5 )
- @ 7,19 GET i6 ;
- PICTURE "@*HN \<6" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 6 )
- @ 5,5 GET i7 ;
- PICTURE "@*HN \<7" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 7 )
- @ 5,12 GET i8 ;
- PICTURE "@*HN \<8" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 8 )
- @ 5,19 GET i9 ;
- PICTURE "@*HN \<9" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VNUMBER( 9 )
- @ 11,12 GET deci ;
- PICTURE "@*HN \<." ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VDECIMAL()
- @ 11,19 GET equals ;
- PICTURE "@*HN \<=" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VEQUAL()
- @ 5,26 GET CLEAR ;
- PICTURE "@*HN \<C" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VCLEAR()
- @ 5,33 GET ACLEAR ;
- PICTURE "@*HN \<AC" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VACLEAR("AC")
- @ 7,26 GET PLUS ;
- PICTURE "@*HN \<+" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VOP("+")
- @ 7,33 GET minus ;
- PICTURE "@*HN \<-" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VOP("-")
- @ 9,26 GET Multiply ;
- PICTURE "@*HN \<*" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VOP("*")
- @ 9,33 GET divide ;
- PICTURE "@*HN \</" ;
- SIZE 1,5,1 ;
- DEFAULT 1 ;
- VALID VOP("/")
- @ 13,5 GET invert ;
- PICTURE "@*HN 1/x" ;
- SIZE 1,7,1 ;
- DEFAULT 1 ;
- VALID VINVERT()
- @ 13,16 GET plusminus ;
- PICTURE "@*HN +/-" ;
- SIZE 1,7,1 ;
- DEFAULT 1 ;
- VALID VREVERSE()
- @ 7,41 GET xasin ;
- PICTURE "@*HN X--Y" ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VXPOSE()
- @ 11,26 GET mc ;
- PICTURE "@*HN MC" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VMC()
- @ 11,33 GET mr ;
- PICTURE "@*HN MR" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VMR()
- @ 13,26 GET MPLUS ;
- PICTURE "@*HN M+" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VMEM("+")
- @ 13,33 GET equals ;
- PICTURE "@*HN M-" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VMEM("-")
- @ 15,32 GET xint ;
- PICTURE "@*HN Int" ;
- SIZE 1,7,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Int")
- @ 15,41 GET xfactor ;
- PICTURE "@*HN X!" ;
- SIZE 1,6,1 ;
- DEFAULT 1 ;
- VALID VFACT()
- @ 5,41 GET sin ;
- PICTURE "@*HN Sin " ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Sin")
- @ 5,51 GET icos ;
- PICTURE "@*HN Cos " ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("COS")
- @ 7,51 GET xacos ;
- PICTURE "@*HN Acos" ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Acos")
- @ 9,41 GET xtan ;
- PICTURE "@*HN Tan " ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Tan")
- @ 9,51 GET xatan ;
- PICTURE "@*HN Atan" ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Atan")
- @ 11,41 GET xpi ;
- PICTURE "@*HN PI " ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VPI()
- @ 11,51 GET xlog10 ;
- PICTURE "@*HN Log10" ;
- SIZE 1,9,1 ;
- DEFAULT 1 ;
- VALID VFUNC("log10")
- @ 13,41 GET xexp ;
- PICTURE "@*HN Exp " ;
- SIZE 1,7,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Exp")
- @ 13,51 GET xlog ;
- PICTURE "@*HN ln " ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("log")
- @ 15,51 GET xsqrt ;
- PICTURE "@*HN Sqrt" ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VFUNC("Sqrt")
- @ 15,5 GET xrand ;
- PICTURE "@*HN Rand" ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VRAND()
- @ 1,51 GET quit ;
- PICTURE "@*HN \<Quit" ;
- SIZE 1,8,1 ;
- DEFAULT 1 ;
- VALID VQUIT()
-
- IF NOT WVISIBLE("calc")
- ACTIVATE WINDOW calc
- ENDIF
-
- READ CYCLE
-
- RELEASE WINDOW calc
-
- IF talkstat = "ON"
- SET TALK ON
- ENDIF
- IF compstat = "ON"
- SET COMPATIBLE ON
- ENDIF
- = numlock(snumlock)
- RETURN
-
- *****************************************************************
- * VCLEAR CLEAR VALID *
- * *
- * Function Origin: *
- * Variable: VCLEAR *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * *
- *****************************************************************
- *
- FUNCTION VCLEAR && CLEAR VALID
- = VACLEAR("C")
- Results = 0
- oldOP = "+"
- do ShowCalc with "Clear"
- return .t.
- *****************************************************************
- * VACLEAR CLEAR ACC VALID *
- * *
- * Function Origin: *
- * Variable: VACLEAR *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * *
- *****************************************************************
- *
- FUNCTION VACLEAR && CLEAR ACC VALID
- PARAMETER Msg
- Acc = 0
- Decimal = 0
- do ShowCalc with Msg
- return .T.
-
- *****************************************************************
- * VNumber # VALID *
- * Function Origin: *
- * Variable: I0-I9 *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Adds digit to accumulator *
- *****************************************************************
- FUNCTION VNumber
- PARAMETER Number
- IF Decimal = 0
- acc = acc*10 + Number
- ELSE
- acc = acc + Decimal*Number
- Decimal = Decimal/10.0
- ENDIF
- DO ShowCalc With ltrim(str(Number))
- RETURN .T.
- *****************************************************************
- * VDECIMAL . VALID *
- * Function Origin: *
- * Variable: deci *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Processes decimal point *
- *****************************************************************
- FUNCTION VDECIMAL
- DO ShowCalc WITH "."
- IF Decimal = 0
- Decimal = .1
- ELSE
- ?? chr(7) && Ring Bell
- ENDIF
- RETURN .T.
-
- *****************************************************************
- * VXPOSE X <--> Y VALID *
- * Function Origin: *
- * Variable: xtoy *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: transposes registers X and Y *
- *****************************************************************
- FUNCTION VXPOSE
- TEMP = Results
- Results = acc
-
- acc = TEMP
- DO ShowCalc WITH "X--Y"
- RETURN .T.
- *****************************************************************
- * VMEM +/- Memory VALID *
- * Function Origin: *
- * Variable: MPLUS/MMINUS *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Processes M+ and M- Keys *
- *****************************************************************
- FUNCTION VMEM
- PARAMETER MOP
- Memory = EVALUATE("Memory "+ MOP + "Results")
- DO ShowCalc WITH "M"+MOP
- RETURN .T.
- *****************************************************************
- * VMR MR VALID *
- * Function Origin: *
- * Variable: mr *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Retrieves Memory Register *
- *****************************************************************
- FUNCTION VMR
- acc = memory
- DO ShowCalc WITH "MR"
- RETURN .T.
- *****************************************************************
- * VMC MC VALID *
- * Function Origin: *
- * Variable: mc *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Clears memory register *
- *****************************************************************
- FUNCTION VMC
- memory = 0
- DO ShowCalc WITH "MC"
- RETURN .T.
- *****************************************************************
- * VReverse Reverses sign *
- * Function Origin: *
- * Variable: plusminus *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Reverses sign *
- *****************************************************************
- FUNCTION VREVERSE
- acc = - acc
- DO ShowCalc WITH "+/-"
- RETURN .T.
- *****************************************************************
- * VQUIT Quit *
- * Function Origin: *
- * Variable: quit *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Exits from Calculator *
- *****************************************************************
- FUNCTION VQUIT
- CLEAR READ
- RETURN .T.
- *****************************************************************
- * *
- * VFUNC Function VALID *
- * *
- * Function Origin: *
- * Variable: Any functions (sin, cos, rand,...*
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Evaluates function *
- *****************************************************************
- FUNCTION VFUNC
- PARAMETER Function && Name of function
- IF (Function = 'log' OR Function = 'log10') AND acc <= 0
- WAIT "Zero accumulator is not allowed for log function" WINDOW
- RETURN
- ENDIF
- Results = EVAL( Function + "(ACC)")
- = VACLEAR( Function )
- DO ShowCalc WITH Function
- RETURN .T.
- *****************************************************************
- * VOP Operator VALID *
- * Function Origin: *
- * Variable: Operator: + - * / % of function *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Evaluates function *
- *****************************************************************
- FUNCTION VOP
- PARAMETER OP && operation (+ - * / )
- Results = EVALUATE("Results " + oldOP + " acc")
- DO ShowCalc WITH OP
- =VACLEAR(OP)
- OldOp = OP
- RETURN .T.
- *****************************************************************
- * VFACT Factorial VALID *
- * Function Origin: *
- * Variable: xfactor *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Computes factorial *
- *****************************************************************
- FUNCTION VFACT
- Message = "X!"
- IF acc = 0
- Results = 1
- ELSE
- IF INT(acc) != ACC && ACC Register must be int
- Message = "Error!"
- ELSE
- Results = ACC
- IF acc > 2
- FOR TEMP = ACC-1 TO 2 STEP -1
- Results = Results*TEMP
- ENDFOR
- ENDIF
- ENDIF
- ENDIF
- =VACLEAR(Message)
- DO ShowCalc WITH Message
- RETURN .T.
- *****************************************************************
- * VRAND Rand VALID *
- * Function Origin: *
- * Variable: xrand *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Computes factorial *
- *****************************************************************
- FUNCTION VRAND
- ACC = RAND()
- DO ShowCalc WITH "Rand"
- OldOP = "+"
- RETURN .T.
- *****************************************************************
- * VPI PI VALID *
- * Function Origin: *
- * Variable: xpi *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Replaces acc register with PI *
- *****************************************************************
- PROCEDURE VPI
- acc = PI()
- DO ShowCalc WITH "PI"
- OldOP = "+"
- RETURN .T.
- *****************************************************************
- * VINVERT VINVERT VALID *
- * Function Origin: *
- * Variable: invert *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Divides 1 by the accumulator *
- *****************************************************************
- FUNCTION VINVERT
- acc = 1/ACC
- DO ShowCalc WITH "1/X"
- RETURN .T.
- *****************************************************************
- * VEQUAL Factorial VALID *
- * Function Origin: *
- * Variable: EQUALS *
- * Called By: VALID Clause *
- * Object Type: Push Button *
- * Purpose: Processes = operator *
- *****************************************************************
- FUNCTION VEQUAL
- Results = EVALUATE(" Results " + oldOP + "ACC" )
- =VACLEAR("=")
- DO ShowCalc WITH "="
- OldOP = "+"
- RETURN .T.
- *****************************************************************
- * *
- * ShowCalc Called to display registers *
- * *
- * Called By: VCLEAR, VOP, VNUMBER, VACLEAR *
- * VXPOSE, VMEM, VMR, VMC, VREVERSE *
- * VFUNC, VFACE, VRAND, VPI, VINVERT*
- * Purpose: Displays Calculator results *
- *****************************************************************
- PROCEDURE ShowCalc
- PARAMETER Comment
- @ 1,21 CLEAR TO 3,37 COLOR W+/BG
- @ 1,21 SAY ACC ;
- SIZE 1,20 ;
- PICTURE "@Z 99999999999.9999" COLOR W+/BG
- @ 2,21 SAY Results;
- SIZE 1,20 ;
- PICTURE "@Z 99999999999.9999" COLOR W+/BG
-
- @ 3,21 SAY Memory ;
- SIZE 1,20 ;
- PICTURE "@Z 99999999999.9999" COLOR W+/BG
- @ 0,0 CLEAR TO 0,10
- @ 0,0 SAY Comment
- RETURN
-