ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 03:43

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - N88BASICのプログラムはどうすれば動作できますか
作成者 メッセージ
  記事の件名:  位数(input "1から8程度",ct)について考察してみてください  引用付きで返信する
Const GSIZE As real = 256
GScreen(GSIZE,GSIZE)
input "1から8程度",ct
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End

Sub drawA(ct , x , y , d , lenn)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub

Sub drawB(ct, x , y , d ,lenn)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub

Sub myDrawLine(x, y, d, lenn)
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
Line(oldx, oldy)-(x, y)
End Sub

僕には手が届かないけど、
本当は、位数(ct)で正方形の大きさが変わるんですけど、
freebasicは知らないんですが、すみません。
再現されていればいいですが、
前のプログラム(ab)では、横長の長方形になってしまいます。
元のn88basicのプログラムがそうだったからかもしれませんが、すみません
TBのプログラムを参考にしてもらえれば、
正方形の大きさが変わる(位数って言うらしいんですが)
ほうが応用が利いてていいのかも、
僕自身ヒルベルト曲線について理解しているわけではなく、
直線を引く方向を再帰的に変えて(決めて)大きな正方形を描くわけですが、
こっちのほうが見ていて気持ちがいいです。
再帰は、自分自身の関数を呼び出して、なりったって、
いるというか、プログラムを読みやすくしたり、
可能にしたりしている、裏ではものすごい処理量になっている場合がある。
ので使い方に気をつけたほうがいいというところまで?です、すみません
階乗で、一杯一杯で、これは、
ヒルベルト曲線で、(階乗のように、単純でなく?(十分難しいという話もある?))
さっぱり分かりません。
直線の描画方向を、0度、90度、180度、270度の内どれかに決めて
書いていき、(すみません)わからないのでこの辺でやめときます。
毛虫のようにくねくねと線が描かれていく様子が、なんだか良いですね?
です。すみませんがfreebasicの付き合いはできないかもしれません
参考までに??????
投稿記事 Posted: 2008年12月31日(水) 17:33
  記事の件名:  FreeBASIC でも動きました。  引用付きで返信する
小修正で、FreeBASICでも動きました。

http://makotowatana.ld.infoseek.co.jp/F ... html#start
投稿記事 Posted: 2008年12月29日(月) 16:04
  記事の件名:  すみません  引用付きで返信する
すみませんでした。
親切なご回答に感謝してます。
投稿記事 Posted: 2008年12月07日(日) 04:30
  記事の件名:   引用付きで返信する
>いろいろなプログラム言語が読めるのですか?
一応、必要になったことのある言語の内大半は読める程度には理解しています。
>専門的に勉強したことはあるんですか
「専門的」の意味が掴めませんが、大学で講義を受けたことはありません。
殆ど独学のようなものですが、勉強する上で沢山の人にヒントを貰いました。

疑問文が質問形式になっているかどうか確認してから投稿したほうがいいよ。

#余分な改行が多い気が・・・
投稿記事 Posted: 2008年12月06日(土) 21:39
  記事の件名:  すみませんでした  引用付きで返信する
押し付けるような質問ですみませんでした。

ご助言ありがとうございました。

僕は変数の値を追っていくだけで精一杯なので、

ご助言より、

プログラムが動いている感じがします。

生もののようです。

正体はばれているようですんで、

もう少し言うと、いろいろなプログラム言語が読めるのですか?

VBを買ってしまい。(エクスプレスバージョン)2005

TBから入ったおかげでついていけてる気もするんですが、

分かってないなという風にも分かり、微妙です。

今は、CやC++、JAVAの勉強をしたほうがいいかもと、

柴田望洋氏の、明解を読んだりしているんですが、

専門的に勉強したことはあるんですか(失礼)

僕には努力が足りないとも思います。

本当にありがたいのですが、

掲示板チャット状態になってしまいそうですが???

よろしければご助言等いただけませんか。

以上すみませんがお願いします。
投稿記事 Posted: 2008年12月06日(土) 20:52
  記事の件名:   引用付きで返信する
GosubやReturnを機械的に関数呼び出しに置き換えて、
PushとPopがいらなくなったので削りました。
他のユーザー定義関数を呼ばない関数から動作を確認して行き、あとは気合で(ry

再帰の捕らえ方は
私はまず、意味上は自分自身を呼び出さない場合(ここではN=1)にどのような動作になるかを確認し、
それから自分自身を呼び出す場合について考えます。

他に助言があるとすれば――hideやcodeのBBCodeを是非使ってください。
或いは、掲示板へのリンクがあれば十分なので、わざわざ全文貼らないでください。
掲示板を探して会話の流れを追うまで、質問の意味もよく分かりませんでした。
#ctの値が-1になることがあるのは、コードを目で追っていっても分かると思うのですが・・・。
投稿記事 Posted: 2008年12月06日(土) 20:27
  記事の件名:  ありがとうございました  引用付きで返信する
プログラム動作確認(走りました)

再帰の所が難しいと思うんですが、

移植の際どんな風に作業されたのですか、

あと、直線の描画方向の変更等も読みこなしていくには難しいと思うんですが。

再帰的定義について、ビジュアルベーシックで、以下のプロ
グラムを実行しました。
ヒルベルト曲線を描くプログラムですが、変数ctが位数らし
いのですが、ct=1(最初は、6でした)ctと、ct-1(ct)の所
で、ctの値が、1,0、-1の順で、変わっていくのです
が、ctの値が、-1から0になるのが分かりません。
手間とは思いますが、もしよければ、ご意見いただけないで
しょうか、再帰的定義や、ぷろぐらむのながれがわかってい
ないなと、実感しました。

Public Class Form1
Dim g As Graphics
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const GSIZE As Integer = 256
Dim ct, lenn, x, y As Integer
Dim d As Integer
g = PictureBox1.CreateGraphics()
g.Clear(PictureBox1.BackColor)
ct = 1
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End Sub

Private Sub drawA(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub

Private Sub drawB(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub

Private Sub myDrawLine(ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
Dim oldx, oldy As Integer
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
g.DrawLine(Pens.Black, oldx, oldy, x, y)
End Sub
End Class

確かにタイニーベーシックで、勉強したことは、多かれ少な
かれ、生かされていると思いました。


また以下は、TB

[875] Re[874]: 再帰的定義NO.47 投稿者:takeuchi 投稿日:2007/01/16(Tue) 19:30

> 再帰的定義について、ビジュアルベーシックで、以下のプロ
> グラムを実行しました。

 このプログラムをTBで書き直してみました。殆ど同じです。

Const GSIZE As real = 256
GScreen(GSIZE,GSIZE)
input "1から8程度",ct
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End

Sub drawA(ct , x , y , d , lenn)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub

Sub drawB(ct, x , y , d ,lenn)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub

Sub myDrawLine(x, y, d, lenn)
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
Line(oldx, oldy)-(x, y)
End Sub



ご助言などありましたらお願いします。
参考にしてください。
投稿記事 Posted: 2008年12月06日(土) 19:07
  記事の件名:   引用付きで返信する
間違いなく動くコード作ったら
投稿記事 Posted: 2008年12月06日(土) 18:11
  記事の件名:   引用付きで返信する
100 ' --------------------------
110 ' * ヒルベルト曲線 *
120 ' --------------------------
130 '
140 DIM STACK(1000)
150 SP=0
160 '
170 SCREEN 3,0,0,1:CLS 3
180 POINT(240,280)
190 N=4:L=10:ANGLE=90:GOSUB *HILBERT
200 END
210 *HILBERT
220 IF N=0 THEN RETURN
230 ZDEG=ANGLE:GOSUB *TURN
240 GOSUB *PUSH
250 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
260 GOSUB *POP
270 ZLENG=L:GOSUB *MOVE
280 ZDEG=-ANGLE:GOSUB *TURN
290 GOSUB *PUSH
300 N=N-1:GOSUB *HILBERT
310 GOSUB *POP
320 ZLENG=L:GOSUB *MOVE
330 GOSUB *PUSH
340 N=N-1:GOSUB *HILBERT
350 GOSUB *POP
360 ZDEG=-ANGLE:GOSUB *TURN
370 ZLENG=L:GOSUB *MOVE
380 GOSUB *PUSH
390 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
400 GOSUB *POP
410 ZDEG=ANGLE:GOSUB *TURN
420 RETURN
430 *PUSH
440 STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2
450 RETURN
460 *POP
470 ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2
480 RETURN
490 *MOVE
500 ZX=ZLENG*COS(ZP*3.14159/180)
510 ZY=ZLENG*SIN(ZP*3.14159/180)
520 LINE -STEP(ZX,-ZY)
530 RETURN
540 *TURN
550 ZP=(ZP+ZDEG) MOD 360
560 RETURN

n88互換basic for windows95でも成功しました、
ご助言ありがとうございました。
投稿記事 Posted: 2008年12月06日(土) 16:12
  記事の件名:   引用付きで返信する
以下のプログラムで結果を見ることが出来ました、
誠にありがとうございました。
ただ本に出てた結果と違うのと、
プログラムコードが僕には強者で、
理解不能、
正方形の外観になる予定でしたが、
やはり等脚台形でした。惜しい
ただこの短時間で移植らしきことが出来たことに感謝しています。
sleep(-1)感謝!!!

#N88BASIC
Dim STACK(1000) As Double
Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double
Dim SP As Long, POINT(240,280) As Double
SP=0
PSET(240,280)
N=4:L=10:ANGLE=90:GOSUB *HILBERT
Sleep(-1)'END
*HILBERT
IF N=0 THEN RETURN
ZDEG=ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
ZDEG=-ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZDEG=-ANGLE:GOSUB *TURN
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZDEG=ANGLE:GOSUB *TURN
RETURN
*PUSH
STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2
RETURN
*POP
ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2
RETURN
*MOVE
ZX=ZLENG*Cos(ZP*3.14159/180)
ZY=ZLENG*Sin(ZP*3.14159/180)
LINE -STEP(ZX,-ZY),6
RETURN
*TURN
ZP=(ZP+ZDEG) Mod 360
RETURN
投稿記事 Posted: 2008年6月02日(月) 22:40
  記事の件名:   引用付きで返信する
AB2を使うというのはだめですか?
SCREENステートメントを削除するだけで、問題なく動きました。
ここからダウンロードできます、と書こうとしたのですが、すみません。ダウンロードページが消滅していますね……。
投稿記事 Posted: 2008年6月02日(月) 22:17
  記事の件名:  ありがとうございます  引用付きで返信する
おかげで無事成功!?とまでは行かずとも、
線の一筆書きらしきもの現れました。
ただ一瞬で終わるのと、止める場所が分からない、
正方形のような形になる予定でしたが、
等脚台形らしくて、下が長くて上が短いので、
予定外というかはっきり見てみないと分かりませんが、
たぶん失敗のうち???すみません、ありがとうございました。
はっきり見たら成功だったらいいのですけど??

以下、そのときのコードを示します。

#N88BASIC
Dim STACK(1000) As Double
Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double
Dim SP As Long, POINT(240,280) As Double
SP=0
Pset(240,280)
N=4:L=10:ANGLE=90:GOSUB *HILBERT
END
*HILBERT
IF N=0 THEN RETURN
ZDEG=ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
ZDEG=-ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZDEG=-ANGLE:GOSUB *TURN
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZDEG=ANGLE:GOSUB *TURN
RETURN
*PUSH
STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2
RETURN
*POP
ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2
RETURN
*MOVE
ZX=ZLENG*Cos(ZP*3.14159/180)
ZY=ZLENG*Sin(ZP*3.14159/180)
LINE -STEP(ZX,-ZY),6
RETURN
*TURN
ZP=(ZP+ZDEG) Mod 360
RETURN

僕はぁPOINTと、PSETが分かりません。
あとぅ、どこで止めたら実行結果が止められるか分かりません。
よければ途中の変数値の変化も分かればいいかなぁ?

以上2点、特に結果が見えてきたので止め方お教え願えませんか???

優しいご助言ありがとうございます。
投稿記事 Posted: 2008年6月02日(月) 22:16
  記事の件名:  追加で質問させてください  引用付きで返信する
POINTは座標の初期値が欲しいのだと思うのですが、
一応PSETでも実行しました。
やはり一瞬で、経過、結果とも確認できず。
ただ実行までに時間がかかり手応えあり、
2回目以降は割りと速かったです。
理由が分からないのでなんともいえないのですが。
優しいハウトゥ、待ちます。
投稿記事 Posted: 2008年6月02日(月) 21:59
  記事の件名:   引用付きで返信する
POINTAPIは構造体と言って、特殊な変数型のようなものです。

あなたが求めてるのはPSet関数かもしれません


そのLineの123の部分に来る数字は、白なら7、緑なら4などとする必要があります。
勿論123が来た場合の動作は規定されていません。(多分黒になります)

END命令語を実行すると、プログラムは終了します。
Sleep(-1)等に変更してみてください
投稿記事 Posted: 2008年6月02日(月) 21:48
  記事の件名:  以下追加のお願いです、すみませんが、  引用付きで返信する
ヘルプよりPOINTを、POINTAPIにしたけれど、無効な識別子
LINE文を、 LINE -STEP(ZX,-ZY),123
で実行、
やはり一瞬だけ、コマンドプロンプトが表示され実行経過実行結果とも確認できず。

以上2点特にお願いします。

すみません
投稿記事 Posted: 2008年6月02日(月) 21:35

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean