GW-BASIC阿拉伯数字转罗马数字程序FOR-NEXT循环异常求助
阿拉伯数字转罗马数字GW-BASIC程序循环问题排查
我从计算机杂志获取了一款阿拉伯数字转罗马数字的GW-BASIC原版程序,它可将1-3999的阿拉伯数字转为对应罗马数字,运行正常。我添加FOR-NEXT循环想要输出该区间所有转换结果,但程序仅运行到罗马数字V就停止,请问循环存在什么问题?
原始代码:
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
问题根源
循环变量被直接修改
程序在转换过程中(如30、45、50等行)直接修改了循环变量FI,破坏了FOR-NEXT循环的迭代逻辑。例如处理数字5时,FI会被改为0,执行NEXT FI后FI变为1,导致程序陷入1→2→3→4→5→0→1的死循环,看起来像是运行到V就停止。子程序调用错误
第80行的GOSUB 50是错误的,50行是主程序的分支判断语句,并非处理重复字符的子程序,调用它会导致逻辑混乱,进一步加剧程序异常。
修复方案
使用临时变量承接待转换数字,避免修改循环变量,同时修正子程序调用:
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 NUM=FI:TT$="" ' 用临时变量NUM处理转换,重置结果字符串 21 IF NUM<4 THEN H=NUM:REPE$="I":GOSUB 90:GOTO 100 25 IF NUM=4 THEN TT$=TT$+"IV":GOTO 100 30 IF NUM<9 THEN TT$=TT$+"V":NUM=NUM-5:GOTO 21 35 IF NUM=9 THEN TT$=TT$+"IX":GOTO 100 40 IF NUM<40 THEN H=INT(NUM/10):REPE$="X":GOSUB 90:NUM=NUM-(H*10):GOTO 21 45 IF NUM<50 THEN TT$=TT$+"XL":NUM=NUM-40:GOTO 21 50 IF NUM<90 THEN TT$=TT$+"L":NUM=NUM-50:GOTO 21 55 IF NUM<100 THEN TT$=TT$+"XC":NUM=NUM-90:GOTO 21 60 IF NUM<500 THEN H=INT(NUM/100):REPE$="C":GOSUB 90:NUM=NUM-INT(H*100):GOTO 21 65 IF NUM<900 THEN TT$=TT$+"D":NUM=NUM-500:GOTO 21 70 IF NUM<1000 THEN TT$=TT$+"CM":NUM=NUM-900:GOTO 21 75 IF NUM=1000 THEN TT$=TT$+"M":GOTO 100 80 IF NUM<4000 THEN H=INT(NUM/1000):REPE$="M":GOSUB 90:NUM=NUM-INT(H*1000):GOTO 21 90 IF H=4 THEN TT$=TT$+"CD" ELSE TT$=TT$+STRING$(H,REPE$) 95 RETURN 100 PRINT FI;"- ";TT$;" ":NEXT FI 110 K$=INPUT$(1):IF K$=CHR$(27) THEN PRINT:END ELSE RUN
修复要点:
- 新增行20:用
NUM临时变量保存当前循环的数字FI,所有转换逻辑操作NUM而非FI,保证FOR-NEXT循环正常迭代。 - 所有跳转目标从20改为21:避开临时变量初始化行,直接进入判断逻辑。
- 修正第80行
GOSUB 50为GOSUB 90:调用正确的重复字符处理子程序。
内容的提问来源于stack exchange,提问作者AlCon
相关产品推荐
相关产品推荐

