Reputation: 21
I got the original version of this program from a computer magazine. It asked for an Arabic number ranging from 1 to 3999 and converted it into the Roman equivalent. That worked flawlessly. Now I want to display the whole list of that range, so I've used a FOR-NEXT loop, but the program doesn't go farther than V. What is wrong with my loop?
1 REM *** ARABIC-ROMAN NUMBERS CONVERTER
2 REM *** From MegaOcio 25, p. 69
3 REM *** Last modification 11/10/23
6 REM ******************************************
8 SCREEN 0:WIDTH 80:KEY OFF:CLS
19 FOR FI=1 TO 3999
20 IF FI<4 THEN H=FI:REPE$="I":GOSUB 90:GOTO 100
25 IF FI=4 THEN TT$=TT$+"IV":GOTO 100
30 IF FI<9 THEN TT$=TT$+"V":FI=FI-5:GOTO 20
35 IF FI=9 THEN TT$=TT$+"IX":GOTO 100
40 IF FI<40 THEN H=INT(FI/10):REPE$="X":GOSUB 90:FI=FI-(H*10):GOTO 20
45 IF FI<50 THEN TT$=TT$+"XL":FI=FI-40:GOTO 20
50 IF FI<90 THEN TT$=TT$+"L":FI=FI-50:GOTO 20
55 IF FI<100 THEN TT$=TT$+"XC":FI=FI-90:GOTO 20
60 IF FI<500 THEN H=INT(FI/100):REPE$="C":GOSUB 90:FI=FI-INT(H*100):GOTO 20
65 IF FI<900 THEN TT$=TT$+"D":FI=FI-500:GOTO 20
70 IF FI<1000 THEN TT$=TT$+"CM":FI=FI-900:GOTO 20
75 IF FI=1000 THEN TT$=TT$+"M":GOTO 100
80 IF FI<4000 THEN H=INT(FI/1000):REPE$="M":GOSUB 50:FI=FI-INT(H*1000):GOTO 20
90 IF H=4 THEN TT$=TT$+"CD" ELSE TT$=TT$+STRING$(H,REPE$)
95 RETURN
100 PRINT FI;"- ";TT$;" ":TT$="":NEXT FI
110 K$=INPUT$(1):IF K$=CHR$(27) THEN PRINT:END ELSE RUN
Upvotes: 0
Views: 188
Reputation: 4689
The question failed to mention that it doesn't stop at V but it is caught in an endless loop that goes up to 4 and then to 0(!) which shouldn't happen at all. It happens because the code in the loop changes the value of the loop variable. Look at all those FI=FI-…
instances. The code needs an independent loop variable that isn't altered within the loop.
Then it hangs at value 1001. Comparing lines 40, 60, and 80 the GOSUB 50
in line 80 should have been a GOSUB 90
. Then it runs from 1 to 3999. Haven't checked the results though. 😎
1 REM *** ARABIC-ROMAN NUMBERS CONVERTER
2 REM *** From MegaOcio 25, p. 69
3 REM *** Last modification 11/10/23
6 REM ******************************************
8 SCREEN 0:WIDTH 80:KEY OFF:CLS
19 FOR I=1 TO 3999:FI=I
20 IF FI<4 THEN H=FI:REPE$="I":GOSUB 90:GOTO 100
25 IF FI=4 THEN TT$=TT$+"IV":GOTO 100
30 IF FI<9 THEN TT$=TT$+"V":FI=FI-5:GOTO 20
35 IF FI=9 THEN TT$=TT$+"IX":GOTO 100
40 IF FI<40 THEN H=INT(FI/10):REPE$="X":GOSUB 90:FI=FI-(H*10):GOTO 20
45 IF FI<50 THEN TT$=TT$+"XL":FI=FI-40:GOTO 20
50 IF FI<90 THEN TT$=TT$+"L":FI=FI-50:GOTO 20
55 IF FI<100 THEN TT$=TT$+"XC":FI=FI-90:GOTO 20
60 IF FI<500 THEN H=INT(FI/100):REPE$="C":GOSUB 90:FI=FI-INT(H*100):GOTO 20
65 IF FI<900 THEN TT$=TT$+"D":FI=FI-500:GOTO 20
70 IF FI<1000 THEN TT$=TT$+"CM":FI=FI-900:GOTO 20
75 IF FI=1000 THEN TT$=TT$+"M":GOTO 100
80 IF FI<4000 THEN H=INT(FI/1000):REPE$="M":GOSUB 90:FI=FI-INT(H*1000):GOTO 20
90 IF H=4 THEN TT$=TT$+"CD" ELSE TT$=TT$+STRING$(H,REPE$)
95 RETURN
100 PRINT I;"- ";TT$;" ":TT$="":NEXT I
110 K$=INPUT$(1):IF K$=CHR$(27) THEN PRINT:END ELSE RUN
BTW: GW-BASIC has an integer division operator (\
) and a modulo operator (MOD
) which might make the code a bit simpler/clearer.
Upvotes: 1