You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 

问题根源

  1. 循环变量被直接修改
    程序在转换过程中(如30、45、50等行)直接修改了循环变量FI,破坏了FOR-NEXT循环的迭代逻辑。例如处理数字5时,FI会被改为0,执行NEXT FI后FI变为1,导致程序陷入1→2→3→4→5→0→1的死循环,看起来像是运行到V就停止。

  2. 子程序调用错误
    第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:00:09