Jonathan E. Sisk's
Pick/BASIC: A Programmer's Guide
Chapter 5 - Calculations and the Principle of Precedence
In program example 3 the principle of precedence is discussed and several of the intrinsic functions related to numbers are covered. This program also includes a simple guessing game, which further illustrates the principle of decision points and branching within a program. Topics, statements, and functions covered include precedence, RND and REM.
Enter Program Example 3 (Fig. 5-1).
Fig, 5-1. Program Example 3.
001 * EX.003
002 * PRECEDENCE OF MATH OPERATIONS AND A FEW MATH FUNCTIONS
003 * mm/dd/yy: date last modified
004 * JES: author's initials
006 PROMPT ":"
008 * SHOW THE EXPRESSION WITHOUT PARENTHESES
011 PRINT "HERE IS WHAT HAPPENS WHEN WE RELY ON PRECEDENCE "
013 PRINT "10 + 20 * 5 - 12 / 3 =" : 10 + 20 * 5 - 12 / 3
015 * NOW SHOW IT WITH PARENTHESES
018 PRINT "HERE IS WHAT HAPPENS WHEN WE PARENTHESIZE EXPRESSIONS : "
020 PRINT "((((10 + 20) * 5) - 12) / 3) =": ((((10+20) * 5) - 12)/3)
022 * GET NUMBERS FOR DIVISION TEST
025 PRINT "ENTER A NUMBER TO DIVIDE" :
026 INPUT NUMERATOR
027 IF NUMERATOR = "QUIT" THEN STOP
029 PRINT "ENTER NUMBER TO DIVIDE BY" :
030 INPUT DENOMINATOR
031 IF DENOMINATOR = "QUIT" THEN STOP
034 PRINT NUMERATOR: "DIVIDED BY" : DENOMINATOR:
035 PRINT "LEAVES A REMAINDER OF" : REM(NUMERATOR,DENOMINATOR)
037 * NOW, LET'S PLAY GUESSING GAME...
039 MY.NUMBER = RND(10) + 1 ; * GENERATE THE RANDOM NUMBER
041 PRINT "I HAVE A NUMBER BETWEEN ONE AND 10"
042 PRINT "TRY TO GUESS WHAT IT IS"
044 * MAKE USER GUESS NUMBER
047 PRINT "ENTER YOUR GUESS" :
048 INPUT GUESS
049 IF GUESS = "QUIT" THEN STOP ;* MUST HAVE GIVEN UP
050 UNTIL GUESS = MY.NUMBER DO
051 PRINT "SORRY. THAT'S NOT IT. TRY AGAIN"
056 PRINT "CONGRATULATIONS. YOU GOT IT"
ARITHMETIC OPERATIONS AND PRECEDENCE
Expressions are evaluated in a program in accordance with the rules of precedence. The highest precedence is parentheses. When parentheses are present in an expression, operations within the innermost set of parentheses have the highest precedence. The second highest priority is exponentiation. Multiplication and division both comprise the third level.
When two functions of the same level of precedence occur in an expression, they are evaluated from left to right. The fourth level is addition and subtraction (with the same left-to-right evaluation scheme). Level five in the Pick System, is "print masking," followed on level six by concatenation. Level seven is for relational operators (such as ">" for "greater than' '), and finally, on level eight, are the logical operators AND and OR.
Two operators may not be used in succession unless they are separated by parentheses. For example, the expression:
will not even compile, much less work. It must be written as:
x ^ (-Y)
Use the higher precedence of parentheses to overcome situations where two operations of the same level, such as multiplication and division, occur in an expression. Table 5-1 summarizes the precedence of operations in Pick.
On line 13 of the example, the result of the calculation is printed. This results in the answer "106." Line 20 provides the result "46" because precedence has been altered through the use of parentheses.
013 PRINT "10 + 20 * 5 - 12 / 3 =": 10 + 20*5 - 12/3
As a matter of style, and to ensure accuracy in mathematical expression, use parentheses when more than one arithmetic operator appears in an expression.
Table 5-1, Precedence of Mathematical Expressions
Operator Operation Sample in Pick/BASIC ^ Exponentiation X ^ Y * Multiplication X * Y / Division X / Y + Addition X + Y - Subtraction X - Y print masking PRINT X "L#25" : Concatenation X : Y = Relational X = Y >, < Relational X > Y >=, <= Relational X >= Y #, <>, Relational X # Y >< Relational X >< Y AND / OR Logical X < Y AND Z > 0
THE REM FUNCTION
The REM function returns the remainder of a numeric expression divided by a second numeric expression:
035 PRINT "LEAVES A REMAINDER OF " : REM(NUMERATOR,DENOMINATOR)
REM also happens to be one of the few functions in PICK/BASIC where there is potential ambiguity. This is due to the fact that there is also a REM statement, which is an alternate means of declaring a REMark statement.
When the REM appears as the beginning of a statement, the compiler interprets it as a remark statement, the same as the * and ! characters. For example:
REM Get user response and determine if valid
Otherwise, it is interpreted as a remainder function. For example:
ANSWER = REM(SUB.TOTAL,BALANCE)
THE RND FUNCTION
The RND function generates a random integer number whose value is between zero and the numeric expression in the parentheses, minus 1.
039 MY.NUMBER = RND(10) + 1; * GENERATE THE RANDOM NUMBER
In line 39, the RND function would first generate a random number between 0 and 9 (which is 10 minus 1); then 1 is added to the random number, and the result is then stored in the variable MY.NUMBER. This means that MY.NUMBER is now a number between 1 and 10, inclusively.
The RND function is particularly useful for determining amounts of salary increases.
Note that the guessing game program in the example is extremely forgiving. It keeps prompting until you provide either the correct answer or QUIT.
REVIEW QUIZ 3
1) Why is precedence important?
2) What is the difference between the REM statement and the REM function?
3) What does the RND function do?
4) What is wrong with the following program samples and how may they be corrected?
a) IF ANS = "Y" THEN PRINT "YES" END ELSE PRINT "NO" b) IF ANSWER > 0 THEN PRINT "ANSWER IS > 0" ELSE PRINT "ANSWER IS < 0" END c) IF ANSWER = "N" THEN PRINT "ENTER ALTERNATE VALUE" : INPUT ALTERNATE.VALUE IF ALTERNATE.VALUE = "" OR ALTERNATE.VALUE <= 0 THEN PRINT "MUST BE A NUMBER OR POSITIVE !" END