2016-01-25 142 views
1

我试图将程序的坐标输出打印到文本文件以便在另一个程序中使用它,但我对GWBASIC和其第一次没有任何了解使用MS-DOS。我需要它打开一个名为plot.txt的文本文件,并在那里打印输出并保存,而不需要在GWBASIC上绘图。这是我在一本旧杂志中找到的节目。如何将.bas文件的输出打印为文本

810 REM MAKE A GLOBULAR 
12 REM 
14 R0=20: R2=R0*R0: R3=R2*R0 
16 P1=3.14159265# 
18 C0=P1*P1*R3/4 
20 R1=R0/SQR(2) 
22 XM=512: YM=512 
24 X2=XM/2: Y2=YM/2: S=5 
26 INPUT "HOW MANY STARS ";T 
27 RANDOMIZE TIMER 
28 CLS: REM CLEAR SCREEN 
30 FOR I=1 TO T 
32 C=C0*RND: R=R1 
34 REM 
36 REM NOW FIND R 
38 FOR K=1 TO 5 
40 GOSUB 100 
42 R=R+(C-C1)/D 
44 NEXT K 
46 REM 3-DIMENSIONAL PLACE 
48 X=RND-.5 
50 Y=RND-.5 
52 Z=RND-.5 
54 S1=SQR(X*X+Y*Y+Z*Z) 
56 IF S1>.5 THEN GOTO 48 
58 REM POINT IS NOW IN SPHERE 
60 R=R*S1: X=X*R: Y=Y*R: Z=Z*R 
62 GOSUB 200 
64 NEXT I 
66 END 
68 REM 
100 REM NEWTON-RAPHSON ITERATION 
105 A=R/R0 
110 C1=ATN(A)*.5*R3 
115 A=1+A*A 
120 C1=C1+R*.5*R2/A 
125 C1=P1*(C1-R*R2/(A*A)) 
130 D=4*P1*R*R/(A*A*A) 
135 RETURN 
140 REM 
200 REM 2-DIMENSIONAL PLOT 
203 SCREEN 9 
205 X=X*S+X2: Y=Y*S+Y2 
210 IF X<0 OR Y<0 THEN 225 
215 IF X>=XM OR Y>=YM THEN 225 
220 PSET(X,Y) 
225 RETURN 
230 REM ------------------------ 
240 REM APPEARED IN ASTRONOMICAL 
250 REM COMPUTING, SKY & TELE- 
260 REM SCOPE, APRIL, 1986 
270 REM ------------------------ 
+0

这个问题相当广泛 –

+0

打开输出AS#1的“plot.txt”:print#1,“whatever” – Marged

+0

只是出于好奇:你为什么要使用dos和basic?你使用哪个版本,因为更多的当前版本支持qbasic – Marged

回答

1

这里是一个Python 3意译:

#globular.py 
#Python paraphrase of model.bas from 
#http://www.skyandtelescope.com/wp-content/uploads/model.bas 

from math import pi, sqrt, atan 
from random import uniform, random 

#Global variables: 

r0 = 20.0 
r2 = r0**2 
r3 = r0**3 
c0 = pi**2*r3/4 
r1 = r0/sqrt(2) 

def NRI(c,r): 
    #Newton-Raphson Iteration 
    a = r/r0 
    c1 = atan(a)*0.5*r3 
    a = 1+a**2 
    c1 += r*0.5*r2/a 
    c1 = pi*(c1-r*r2/a**2) 
    d = 4*pi*r**2/a**3 
    return (c1,d) 

def makeStars(t): 
    stars = [] 
    for i in range(t): 
     c = c0*random() 
     r = r1 
     for k in range(5): 
      c1,d = NRI(c,r) 
      r += (c-c1)/d 
     while True: 
      x = uniform(-0.5,0.5) 
      y = uniform(-0.5,0.5) 
      z = uniform(-0.5,0.5) 
      s1 = sqrt(x**2 + y**2 + z**2) 
      if s1 <= 0.5: break 
     r *= s1 
     x *= r 
     y *= r 
     z *= r 
     stars.append((x,y,z)) 
    return stars 

def starsToFile(t,fname): 
    stars = makeStars(t) 
    f = open(fname,'w') 
    for star in stars: 
     print(*star, sep = ', ',file = f) 
    f.close() 

我跳过了部分有关打印xy,而是写了一个函数makeStars返回的(x,y,z)元组的列表,以及相关的功能它接受这样的输出并将其发送到文本文件。最后一个函数是使用Python 3而不是Python 2的唯一函数。如果您使用Python 2,则可以从将来导入Python 3的打印函数。

在Python shell中键入starsToFile(100,'stars.txt')给了我这开头的文本文件:

-0.32838465248713156, -0.3294895266926551, -1.2963580524762535 
14.20224408569865, 1.4434961933043464, 6.450969593697097 
1.6525937589658193, -0.24447292610082685, 1.0543647986350608 
1.5707528567123823, 5.190972598268825, -2.0054790217091134 

我没有很好的3-d散点图在我的指尖绘制图形,但这里的屏幕截图由函数生成的50个点,并使用一种称为导出计算机代数系统绘制:

enter image description here

最终备注:我不知道是否有在源代码中的拼写错误。该生产线

C0=P1*P1*R3/4 

令我怀疑,因为它是在数学pi出现平方相当罕见的 - 尽管它发生。也许在那里应该只有一个因子pi(这样会产生与半径为R0的球体的体积成比例的C0)的效果。另一方面,我不确切知道这里发生了什么,所以我把它留下了。如果结果看起来有问题,你可以试试这条线。

+0

令我印象深刻!有时我错过了以KB为单位测量主内存的时间...... – Marged

1

如果你想算出坐标的副本只需添加这些行:

1 OPEN "PLOT.TXT" FOR OUTPUT AS #1 
65 CLOSE #1 
221 PRINT #1, X + "," + Y 

该计划将作为之前,但除了这一点,输出坐标到一个名为plot.txt

文件

将它们放入尺寸为640x350的图像(该尺寸需要SCREEN 9),并获得相同的结果。

+0

不错。你知道有什么方法可以在现代版本的Windows上运行这样的程序吗? –

+0

如果你仍然使用32位版本的Windows,那么旧的qbasic/gwbasic应该可以工作。另一种方法是使用dosbox.exe,它甚至可以在64位版本的Windows上运行。据说Qb64支持Windows,Linux,Android和MaxOSX上的旧的基本程序,但我没有尝试过。在虚拟机中运行Dos也可以工作,但有点夸张;-) – Marged

相关问题