Dragonsmoke
Positive, Negative or Zero
by Bob Albrtcht and George FiredrakeDragonSmoke poses problems for you to ponder, questions for you to answer, programs for you to write, and whatever other mischief we might cunningly contrive. As time goes on, and as issue follows issue, we will answer some of the problems we create. Better yet, you answer.
Positive, Negative, Or Zero
An easy problem. All we want is a program that asks for a number, then tells you something about the number.If you enter a positive number, the computer tells you: YOUR NUMBER IS POSITIVE
If you enter a negative number, the computer tells you: YOUR NUMBER IS NEGATIVE
If you enter the number zero (0), the computer tells you: YOUR NUMBER IS ZERO
A RUN might go like this:
ENTER A NUMBER AND I'LL TELL YOU WHETHER YOUR NUMBER IS POSITIVE, NEGATIVE OR ZERO
YOUR NUMBER? 2
YOUR NUMBER IS POSITIVE
YOUR NUMBER? -7
YOUR NUMBER IS NEGATIVE
YOUR NUMBER? 0 YOUR NUMBER IS ZERO
YOUR NUMBER ? and so on
We know at least seven ways to write this program. Here is an obvious way.
100 REM ** POSITIVE, NEGATIVE, OR ZERO
110 DIM YN$(15), N$(8), Z$(4), P$(8)
120 YN$ = "YOUR NUMBER IS "
130 N$ = "NEGATIVE"
140 Z$ = "ZERO"
150 P$ = "POSITIVE"
200 REM ** TELL WHAT TO DO
210 PRINT CHR$(125)
220 PRINT "ENTER A NUMBER AND I'LL TELL"
230 PRINT "YOU WHETHER YOUR NUMBER IS"
240 PRINT "POSITIVE, NEGATIVE, OR ZERO."
300 REM ** ASK FOR A NUMBER
310 PRINT
320 PRINT "YOUR NUMBER";: INPUT X
400 REM **TELL ABOUT NUMBER
410 IF X< 0 THEN PRINT YN$;N$
420 IF X = 0 THEN PRINT YN$; Z$
430 IF X > 0 THEN PRINT YN$; P$
500 REM ** GO FOR ANOTHER NUMBER 510 GOTO 310
Well, that's one way. We challenge you to write the program without using IF statements. Then write the program in yet another way, and another, and so on. How many different ways can you invent?
String Squeezer
Do this one. You will find it useful in future problems. We want a subroutine to squeeze the blanks (spaces) out of a string.
BEFORE SQUEEZING-->AFTER SQUEEZING
THE FORCE IS WITH YOU->THEFORCEISWITHYOU
3 D 6->3D6
NEVER ODD OR EVEN->NEVERODDOREVEN
SOUTH DAKOTA-->SOUTHDAKOTA
Think of your subroutine as a "black box" which accepts a string ZZ$, squeezes out the spaces, and returns the squeezed string ZZ$.
ZZ$ = "A B C" --> STRING SQUEEZER SUBROUTINE --> ZZ$ = "ABC"
Complete the following program by writing the STRING SQUEEZER SUBROUTINE.
100 REM ** STRING SQUEEZER
110 DIM A$(50), ZZ$(50)
120 PRINT CHR$(125)
200 REM ** GET STRING & SQUEEZE
210 PRINT
220 PRINT "YOUR STRING";: INPUT A$
230 ZZ$ = A$: GOSUB 910
240 PRINT ZZ$
250 GOTO 210
900 REM ** STRING SQUEEZER SUBROUTINE
Here is a sample RUN of our program.
YOUR STRING? THE FORCE IS WITH YOU
THEFORCEISWITHYOU
YOUR STRING? 3 D 6
3D6
YOUR STRING? and so on.
TWO-DIGIT NUMBER SPLITTER
A two-digit number is a whole number in the range 10 to 99, inclusive. A two-digit number has a tens digit and a ones digit.
Write a program to "split" a two-digit number and print the digits separately, line this:
TWO-DIGIT NUMBER, PLEASE? 10
TENS DIGIT = 1
ONES DIGIT = 0
TWO-DIGIT NUMBER, PLEASE? 23
TENS DIGIT = 2
ONES DIGIT = 3
TWO-DIGIT NUMBER, PLEASE? 07
MUST BE A WHOLE NUMBER, 10 TO 99
TWO-DIGIT NUMBER, PLEASE? 123
MUST BE A WHOLE NUMBER, 10 TO 99
TWO-DIGIT NUMBER, PLEASE? 1.2
MUST BE A WHOLE NUMBER, 10 TO 99
TWO-DIGIT NUMBER, PLEASE?
And so on. Accept only whole numbers, 10 to 99.
The Digit Factory
In the Digit Factory, the raw materials are the numbers 1,2, 3, 4, and 5; the BASIC operations +, -, *, and /; and parentheses ().The finished products are the decimal digits a, 1, 2,3,4, 5, 6, 7, 8, and 9.
You are the digit maker. For each decimal digit, 0 through 9, write a BASIC expression whose value is equal to the digit. In any such expression:
Use each number (1,2,3,4,5) once and only once.
Use each BASIC operation (+,-,*./) once and only once. No other BASIC operations may be used.
Use as many parentheses as you wish.
For example, here are three BASIC expressions for the digit 5.
2*3/1 + 4 - 5
(3+2-1)*5/4
(3 + 2)/(1*5-4)
Write BASIC expressions for each digit, 0 through 9. Try to write expressions for which one or more of the following is true.
The numbers 1, 2, 3, 4, and 5 appear in increasing order from left to right.
The numbers are in decreasing order (5, 4, 3, 2, 1).
The operations appear in the order +, -, *, / from left to right.
The operations appear in the order /, *, -, + from left to right.
May your factory prosper. Send us some interesting solutions.
Game Master's Apprentice
Last time, we encouraged you to write a program to roll and display the seven basic characteristics for a character in a fantasy role playing game. Here is our program.
100 REM ** ROLL A CHARACTER
110 PRINT CHR$(125)
300 REM * ROLL & DISPLAY CHARACTERISTICS
310 GOSUB 910: PRINT "STR", DICE
320 GOSUB 910: PRINT "CON", DICE
330 GOSUB 910: PRINT "SIZ", DICE
340 GOSUB 910: PRINT "INT", DICE
350 GOSUB 910: PRINT "POW", DICE
360 GOSUB 910: PRINT "DEX", DICE
370 GOSUB 910: PRINT "CHA", DICE
500 REM ** TELL HOW TO DO AGAIN
510 PRINT
520 PRINT "TO DO AGAIN, PRESS SPACE BAR"
530 OPEN #1, 4, 0, "K:"
540 GET #1, KEY
550 IF KEY < > ASC(" ") THEN 540
560 CLOSE #1
570 GOTO 110
900 REM ** DICE SUBROUTINE
910 D1 = INT(6*RND(0))
920 D2 = INT(6*RND(0))
930 D3 = INT(6*RND(0))
940 DICE = D1 +D2 + D3
950 RETURN
We entered the program and typed RUN. Here is our first character.
STR 11 This is Bridla. Here name is
CON 12 Gaelic and means "strong friend."
SIZ 10 She is very intelligent (INT 15)
INT 15 and persuasive (CHA 16).
POW 6
DEX 11
CHA 16
TO DO AGAIN, PRESS SPACE BAR
After recording the above information, we pressed the space bar. The computer immediately rolled another character.
STR 10
CON 11 Meet Aloysious Anonymous,
SIZ 10 who is average or near near
INT 12 average in every characteristic.
POW 10
DEX 12
CHA 9
TO DO AGAIN, PRESS SPACE BAR
Aloysious, Bridla, Barostan and Joleen (whom you met last time) are all 16 years old and live in villages near them called Triford in Wundervale. They are characters in a book-in-progress called Adventurer's Handbook: A Beginner's Guide to Role Playing Games.
Our program rolls a number from 3 to 18 for each characteristic. Alas, a character with STR 4, SIZ 13, and DEX 5 will never make it in the GAME MASTER s world.
So, your turn. Replace the DICE SUBROUTINE with any of the following, allowed by a compassionate GM (GAME MASTER). Each of these is a simulation (imitation) of what might happen in an actual game.
Roll 3D6. If DICE is less than 6, assign 6 as the value. The value of DICE will be a number from 6 to 18.
This GM is even more generous. If DICE is less than 6, add 3.
Some GMs allow plays to roll 4D6 and take the best 3D6. That is, if you roll one, three, five, five, you can discard the one and take the other three for a total of 13.
A Book We Wish We had Written
As perennial beginners, we find the Atari 400/800 BASIC Reference Manual virtually incomprehensible. Fortunately, however, we found a book that, so far, has told us everything we want to know. Here it is:Your Atari Computer by Lon Poole with Martin McNiff & Steven Cook. Published by Osborne/McGrawHill, 630 Bancroft Way, Berkeley, CA 94710
Thanks, Lon, Martin, and Steve!
Your Turn
What would you like to see in DragonSrnoke? Would you like to see solutions in both Atari BASIC and Atari Microsoft BASIC? Send requests to George & Bob, P.O. Box 310, Menlo Park, CA 94025.If you want a reply, enclosed a Self-Addressed, Stamped Envelope.