• 締切済み

ベーシック、循環小数プログラミング

0 !q/pを少数点表示する 1 LET X=10 2 DIM a(1 TO 100),b(0 TO 100) 3 INPUT q,p 4 LET b(0)=q 5 LET k=1 6 DO 7 LET a(k)=INT(b(k-1)*X/p) 8 LET b(k)=MOD(b(k-1)*X,p) 9 LET j=0 10 DO UNTIL j=k-1 OR b(j)=b(k) 11 LET j=j+1 12 LOOP 13 IF b(j)=b(k) THEN EXIT DO 14 LET k=k+1 15 LOOP 16 ! 結果の表示 17 PRINT "0."; 18 FOR i=1 TO j 19 PRINT a(i); 20 NEXT i 21 PRINT "{"; 22 FOR i=j+1 TO k 23 PRINT a(i); 24 NEXT i 25 PRINT "}" 26 END 上のプログラミングですが、 10~16、21~26がはっきりと理解できません。 6のdoは15のloopとつながるんですよね? q=3,p=7で考えてみたのですが、 8,9行目で a(1)=4 b(0)=3 b(1)=2 a(2)=2 b(2)=6 a(3)=8 b(3)=4 a(4)=5 b(4)=5 a(5)=7 b(5)=1 a(6)=1 b(6)=3 となり、b(0)=b(6)より、循環小数ということだと考えました。 このb(0)=b(6)の比較は10行目、13行目のどちらでしょうか? また、結果の表示で、17行~20行で、 0.a1a2a3・・と表示することはわかりましたが、循環小数のさいの{}の入れ方(21行~25行)が理解できていません。 私の理解や記入がわかりにくいかもしれませんが、 どなたか解説していただけないでしょうか。 よろしくお願いいたします。

みんなの回答

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

DO と IF について調べればどっちが何をやっているか理解できるんじゃない? 21~ は単に出力してるだけ 前述と同じくFORについて調べたら判る筈だよ。

nattin_111
質問者

お礼

返事が遅くなってしまって申し訳ありません。 b(0)=b(6)の比較は10行目、13行目は、b(0)=b(6)となったので、loopから抜けるということでよかったでしょうか。 21~は相変わらず理解できていません。 私の考えだと、 結果は、 0.428571{428571}になってしまいます。 しかし、実際にこのプログラムをすると、 0.{428571}になるのですが。 22行目 FOR i=j+1 は いわばa(7)のことではないのでしょうか? やはりあまりにも理解できていない状況でしょうか・・・

関連するQ&A

  • プログラムの意味がわからなくて困っています

    こんにちは。以下のプログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。 100 option base 0 110 dim A(1000) 120 dim R(999) 130 let N=1000 140 for I=0 to N-1 150 let R(I)=0 160 Next I 170 do 180 print"分母p="; 190 input P 200 if (P>N) then 210 print"分母は1000以下にしてください” 220 end if 230 loop while(P>N) 240 print"分子q="; 250 input Q 260 let A(0)=int(Q/P) 270 let Q=mod(Q,P) 280 let K=0 290 Do 300 let K=K+1 310 let R(Q)=K 320 let Q=Q*10 330 let A(K)=int(Q/P) 340 let Q=mod(Q,P) 350 loop while (R(Q)=0) 360 print A(0);"."; 370 for I=1 to R(Q)-1 380 print A(I); 390 next I 400 if (R(Q)<K) or (A(K)<>0) then 410 print "{"; 420 for I=R(Q) to K 430 print A(I); 440 next I 450 print"}"; 460 end if 470 end 100から160までで配列Aを1000個、配列Rを999個準備し、配列Rの中身を0にしている。 170から230で分母Pに13を入れ分母が1000以下になることを確認している。1000以上であれば、1000以下になるまでループ内を繰り返す。 240以下で分子を入れているようですが、ここからよくわからなくなってしまいました。 よろしくお願いします。  

  • プログラミング 十進BASIC

    はじめまして。 パソコン超初心者のものです。 十進BASICで10進法を16進法に変換するプログラムを以下のように作成したとき、文字の表している意味がわからず、120から表現しているようなことはわかる気がするのですがいまいちはっきりわかりません。わかるかた教えていただけないでしょうか。よろしくお願いいたします。 10  !16進法に変換する     20  DIM hex(4) 30 LET dec=65535 40 LET p=1 50 DO WHILE 16<=dec 60 LET hex(p)=MOD(dec,16) 70 LET dec=INT(dec/16) 80 LET p=p+1 90 LOOP 100 LET hex(p)=dec 110 ! hex(p) ~ hex(1) 120 FOR i=p TO 1 STEP -1 130 LET y=hex(i) 140 PRINT mid$( "0123456789ABCDEF", y+1 ,1 ); 150 NEXT i 160 END (1)「!」の意味は何ですか?日本語を入力するときに使うのかな?なんて思っていますが・・ (2)hexは何ですか。Dimは配列なのはわかります。Aとかでも問題ないのでしょうか? (3)decは何ですか。代入する数値のことだと思うのですが、nとかではダメなのでしょうか。 (4)140の意味。11をA、12をB・・と書くためのものですか? 詳しく教えていただけないでしょうか。

  • プログラミングの問題です

    このプログラムは何をするものか詳しく説明しなさい。 100 FOR x=1 TO 100 110 FOR y=x TO 100 120 LET a=x 130 LET b=y 140 DO 150 LET r=MOD(a,b) 160 IF r=0 THEN EXIT DO 170 LET a=b 180 LET b=r 190 LOOP 200 IF b=1 THEN 210 LET z=SQR(x^2+y^2) 220 IF INT(z)=z THEN PRINT x,y,z 230 END IF 240 NEXT y 250 NEXT x プログラムに関して初心者で、120~230(ほとんどですが…)の部分で何をしようとしているのかが分かりません。何か参考になるHPや考え方だけでも教えていただけないでしょうか。

  • basic プログラムです。

    100 DIM A(5) 110 FOR J=1 TO 5 120 READ A(J)   130 NEXT J   140 FOR I=1 TO 4  150 LET K=1    160 FOR J=I+1 TO 5  170 IF A(J)<A(K) THEN LET k=J  180 NEXT J    190 LET T=A(I)    200 LET A(I)=A(K)   210 LET A(K)=T    220 FOR J=1 TO 5   230 PRINT A(J);   240 NEXT J     250 PRINT      260 NEXT I     270 DATA 5,3,7,2,1,  280 END を実行すると 13725 31725 31275 71235 という数字が出てきます。 どうしてこのような結果が出るのか 解説をお願いします。

  • basicプログラムです。

    100 DIM A(5) 110 FOR J=1 TO 5 120 READ A(J)   130 NEXT J   140 FOR I=1 TO 4  150 LET K=I    160 FOR J=I+1 TO 5  170 IF A(J)<A(K) THEN LET k=J  180 NEXT J    190 LET T=A(I)    200 LET A(I)=A(K)   210 LET A(K)=T    220 FOR J=1 TO 5   230 PRINT A(J);   240 NEXT J     250 PRINT      260 NEXT I     270 DATA 5,3,7,2,1,  280 END このようなプログラムがあります。 いろいろ調べたのですがそれぞれの文の意味と 何を求めるプログラムか教えて下さい。 5つの数の組み合わせで小さい数から順番に4個 かなと思ったのですが???

  • プログラミングについて教えてください

    (仮称)十進BASICのプログラミングについて質問です nCrを求めるプログラム INPUT n.r LET p=1 FOR k=(1) TO (2) LET p=p✳︎(3)/(4) NEXT k PRINT p END (1)~(4)に入る数式や文字を2通り教 えてください

  • BASICプログラミング &の使い方

    (A)IF a>=b THEN LET x=a & & ELSE LET x=b (B)IF a>=b THEN LET x=a ELSE LET x=b 学校でもらったプリントに 「1つの文を複数行に渡って書くときは&を使うと」書いてあるのですがなぜBの文では使ってないのでしょうか? &の使い方がわからないので教えてください。

  • VB バリアント型の配列の例について

    長々と失礼します。私の使用している教科書に 「バリアント型の2次元配列」と「バリアントに2次元配列を代入」というのを組み合わると「行列i要素とする行列」たとえば 2 5 9 4 1 8 7 3 6 1 5 9 8 0 1 6を的確に表現できます。 と書いており、下のように書かれているのですが上のような配列を表示しません。どこが間違っているのでしょうか?そもそも上のように表示できるのか理解に苦しんでおります Option Base 1 Private Sub Command1_Click() Dim a(2,2) As Variant Dim c(2,2) As Integer For i = 1 To 2 For j = 1 To 2 For p = 1 To 2 For q = 1 To 2 c(p,q) = p + q + i * j Next q Next p a(i,j) Next j Next i For i = 1 To 2 For p = 1 To 2 For j = 1 To 2 For q = 1 To 2 Print a(i,j)(p,q), Next q Next j Print Next p Next i End Sub

  • 簡単なエクセルVBA

    最近エクセルのVBAを勉強し始めたのですが、 1×1=1 1×2=2 1×3=3  ・  ・ 9×9=81 と出るようにしたいのですが、 Sub kuku() Do While i < 9 i = i + 1   Do While j < 9   j = j + 1   a = i * j   Debug.Print i; "×"; j; "="; a   Loop Loop End Sub としたところ1×9=9までしかでません。 どうすれば上手くループするようになるでしょうか? お願いします。

  • プログラムの間違いを教えてください。

    VBAのFFTのプログラムをCで書き直しています。 C言語ではうまく動作しません。間違いを教えていただけないでしょうか? よろしくお願いします。 (1)動くVBAのプログラム(参照 http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html) Option Explicit Public Sub fft() Dim g, h, i, j, k, l, m, n, o, p, q As Integer i = 0 j = 0 k = 0 l = 0 p = 0 h = 0 g = 0 q = 0 'データ数nを指定(2の整数乗である必要あり) n = 1024 m = Log(n) / Log(2) 'xr,xiはデータ数以上、s,cはデータ数の半分以上を指定しておく Dim xr(1024), xi(1024), xd, s(512), c(512), a, b As Single 'データの読み込み 1列目を実数部、2列目を虚数部とする For i = 1 To n xr(i - 1) = Cells(i, 1) xi(i - 1) = Cells(i, 2) Next i 'FFTの計算 a = 0 b = 3.14159265359 * 2 / n For i = 0 To n / 2 s(i) = Sin(a) c(i) = Cos(a) a = a + b Next i l = n h = 1 For g = 1 To m l = l / 2 k = 0 For q = 1 To h p = 0 For i = k To l + k - 1 j = i + l a = xr(i) - xr(j) b = xi(i) - xi(j) xr(i) = xr(i) + xr(j) xi(i) = xi(i) + xi(j) If p = 0 Then xr(j) = a: xi(j) = b Else xr(j) = a * c(p) + b * s(p) xi(j) = b * c(p) - a * s(p) End If p = p + h Next i k = k + l + l Next q h = h + h Next g j = n / 2 For i = 1 To n - 1 k = n If j < i Then xd = xr(i) xr(i) = xr(j) xr(j) = xd xd = xi(i) xi(i) = xi(j) xi(j) = xd End If k = k / 2 Do While j >= k j = j - k k = k / 2 Loop j = j + k Next i 'データの出力 For i = 1 To n '4列目に実数部、5列目に虚数部、6列目に絶対値を表示 Cells(i, 4) = xr(i - 1) Cells(i, 5) = xi(i - 1) Cells(i, 6) = (xr(i - 1) ^ 2 + xi(i - 1) ^ 2) ^ 0.5 Next i End Sub (2)上記のプログラムの書き換えている箇所 For i = 1 To n xr(i - 1) = Cells(i, 1) xi(i - 1) = Cells(i, 2) Next i 'FFTの計算 a = 0 b = 3.14159265359 * 2 / n For i = 0 To n / 2 s(i) = Sin(a) c(i) = Cos(a) a = a + b Next i l = n h = 1 For g = 1 To m l = l / 2 k = 0 For q = 1 To h p = 0 For i = k To l + k - 1 j = i + l a = xr(i) - xr(j) b = xi(i) - xi(j) xr(i) = xr(i) + xr(j) xi(i) = xi(i) + xi(j) If p = 0 Then xr(j) = a: xi(j) = b Else xr(j) = a * c(p) + b * s(p) xi(j) = b * c(p) - a * s(p) End If p = p + h Next i k = k + l + l Next q h = h + h Next g j = n / 2 For i = 1 To n - 1 k = n If j < i Then xd = xr(i) xr(i) = xr(j) xr(j) = xd xd = xi(i) xi(i) = xi(j) xi(j) = xd End If k = k / 2 Do While j >= k j = j - k k = k / 2 Loop j = j + k Next i (3)書き換えたけど変な値が発生するプログラム #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <math.h> FILE *fp; FILE *fa; char a[100]; double b[1200]; double c[1200]; double d[1200]; double e[1200]; double f[1200]; char str[100]; char *p; double h; long i; long j; long k; long l; int m; long n; long o; int q; double x[25]; long s; double t; double u[1200]; double v[20][1200]; double v2[20][1200]; double v3[20][1200]; double w[25]; double intercept[10]; double slope[10]; double frequency[12]; double dtime; double dtime2; double theta1; double theta2; double co[1200]; double si[1200]; double xd; long l2; long l3; long n3; long h3; long g3; long m3; long k3; long p3; long q3; long i3; long j3; long x3; double y3; double a3; double b3; double c3; double d3; double f3; double w2[25]; x3=0; y3=0; i3=0; j3=0; k3=0; l3=0; p3=0; h3=0; g3=0; q3=0; a3=0; b3=0; c3=0; d3=0; theta1=0; theta2=3.14159265359*2/1024; for(l=0; l<=512; l++){ si[l]=sin(theta1); co[l]=cos(theta1); theta1=theta1+theta2; } n3=1024; m3=10; l3=n3; h3=1; for(g3=1; g3<=m3; g3++){ l3=l3/2; k3=0; for(q3=1; q3<=h3; q3++){ p3=0; for(i3=k3; i3<(l3+k3); i3++){ j3=i3+1; theta1=c[i3]-c[j3]; theta2=d[i3]-d[j3]; if(p3==0){ c[j3]=theta1; d[j3]=theta2; } else{ c[j3]=theta1*co[p3]+theta2*si[p3]; d[j3]=theta2*co[p3]-theta1*si[p3]; } p3=p3+h3; } k3=k3+l3+l3; } h3=h3+h3; } j3=n3/2; for(i3=1; i3<n; i3++){ k3=n3; if(j3<i3){ xd=c[i3]; c[i3]=c[j3]; c[j3]=xd; xd=d[i3]; d[i3]=d[j3]; d[j3]=xd; } k3=k3/2; while(j3>=k3){ j3=j3-k3; k3=k3/2; } j3=j3+k3; } for(i3=0; i3<n3; i3++){ c[i3]=c[i3]/1024; d[i3]=d[i3]/1024; } (1)中の(2)箇所を(3)のように書き換えました。 どうしてもうまく動作しません。 教えていただけないでしょうか? よろしくお願いいたします。