こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

このプログラムは何をするものか詳しく説明しなさい。
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や考え方だけでも教えていただけないでしょうか。

投稿日時 - 2007-03-04 23:05:25

QNo.2803463

困ってます

質問者が選んだベストアンサー

一つずつコメントします。

120 LET a=x … xの値をaに代入する。

150 LET r=MOD(a,b) … aをbで割った余りをrに代入する

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
 …140から190まで処理するとまた140に戻る。
  rがゼロなら、200へ行く

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
 … bが1なら、210と220を処理する
   210は、斜辺がzの直角三角形で、xとyからzを算出する
   220は、zがぴったり整数になる時に、x、y、zの書く値を出力する

たぶん、N88BASICだろうと思います。
このまま、入力し実行させてみたらいかがでしょうか。

http://e-words.jp/w/N88-BASIC.html

投稿日時 - 2007-03-04 23:24:33

お礼

丁寧に説明していただきありがとうございます。とても勉強になりました。
ところで、「入力し実行させてみたらいかがでしょうか」というのはhttp://e-words.jp/w/N88-BASIC.html で出来るのでしょうか?このサイトに入ってみたのですが、分かりません。
もしよければ、そのことについても教えて下さい。

投稿日時 - 2007-03-04 23:49:45

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

このコードは相当旧いBASICの仕様(JISBASIC?)ですね。
これは教科書か情報処理の問題集回答かに乗っていたのですか。
前者なら、先生の講義説明を良く聞いてください。宿題の説明のような質問は質問規約に反するかも。
手元がエクセルが使える環境なら下記をやってみてはどうですか。
ツールーマクローVBE-挿入ー標準モジュールで出てきた画面に質問の
コードを貼り付ける。
(1)まず今のマイクロソフト系のBASICは行番号を使いません。
行番号を全て消しましょう。たまたまGOTO 行番号などがないので
消しても大丈夫。
(2)最初の行の前ににSub test01()を挿入
最後の行の後にEnd Subを挿入
(3)letを全て削除します。
(4)mod=あまりを出す関数(演算子)の書き方がms系basicと違うので r = A Mod B にする。
(5)pRINTをDebug.Printに変える
結果は
Sub test01()
For x = 1 To 100
For Y = x To 100
A = x
B = Y
Do
r = A Mod B
If r = 0 Then Exit Do
A = B
B = r
Loop
If B = 1 Then
Z = Sqr(x ^ 2 + Y ^ 2)
If Int(Z) = Z Then Debug.Print x, Y, Z
End If
Next Y
Next x
End Sub
(6)実行(f5キーを押す)する。
(7)表示ーイミディエイトウインドウ でイミディエイトウインドウが出て
3 4 5
5 12 13
7 24 25
(中略)
65 72 97
で、100までの(正整数)のピタゴラス数(注)の組み合わせが列挙されている。(注)web照会のこと
ーーー
For x = 1 To 100
Xは1から100まで作業を繰り返す。
For Y = x To 100
YはXより大きい数をとり100まで。
同じ数で重複するのは意味ないのでYは、Xより繰り返しを開始している
A = x
B = Y
新たにx、yを変数a,bに代入(セット)している。以下で加工してチェックするので、X、Yを変化させてはまずいので、別変数に初期値として代入。
DO
lOOPまで繰り返し、囲まれた中を計算する
r = A Mod B
If r = 0 Then Exit Do
aをbでわり、割り切れる場合は
--
r = A Mod B
If r = 0 Then Exit Do
A = B
B = r
Loop
If B = 1 Then
---
ここは極く基礎の整数論の知識が要るところで、
ユークリッドの互助法で最大公約数を求めていると思う。
http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95
の例参照。
そして「互いに素」かどうかを検証していると思う。
ーー
Z = Sqr(x ^ 2 + Y ^ 2)
xの2乗+Yの2条の平方根を求め、Zに入れている
Z = Sqr(x ^ 2 + Y ^ 2)
zが整数ならば印刷(表示)
Debug.Print x, Y, Z
イミディエイトウインドウ画面に、並べて表示し改行
End If
if処理の終わり
Next Y
Yが変わったときの繰り返し佐合の終わり行。
Next x 
Yが変わったときの繰り返し佐合の終わり行

投稿日時 - 2007-03-05 11:12:25

ANo.3

ぱっと見たところ
ピタゴラスの定理を満たすいっぺんが100以下の三角形の各辺の長さを求めているようです。
VB(A)に直すとこんな具合かな?

Private Sub Command1_Click()
For x = 1 To 100
For y = x To 100
a = x
b = y
Do
r = a Mod b
If r = 0 Then Exit Do
a = b
b = r
Loop
If b = 1 Then
z = Sqr(x ^ 2 + y ^ 2)
If Int(z) = z Then Debug.Print x & vbTab & y & vbTab & z
End If
Next y
Next x
End Sub

投稿日時 - 2007-03-05 08:08:47

>#1さん
当方で実験してみましたが
N88互換Basicでは文法エラーで動作しませんでした。(140と190にDO LOOP構文があるから)
http://www.vector.co.jp/soft/win95/prog/se055956.html

他でも動くかもしれないけど
とりあえず
十進Basicで動作することを確認しました
http://www.vector.co.jp/soft/dl/win95/prog/se039185.html

[実行]メニューの[ステップ実行]を見ながらやると動きがかなりわかりやすくなるかもしれません。

投稿日時 - 2007-03-05 03:02:43

あなたにオススメの質問