11165:
Re: MOD と ¥ の有効範囲
投稿者:
konno 2024/03/18(月) 00:36
11161 番 konno さんへのコメント
MOD と \ の有効範囲テストを NP2 でやってみました。
結果は 32767 を超えると オーバーフローエラーになりました。
また、N88BASICでは行番号が必要で、タブは使えなかったので
以下のようにプログラムを修正しました。
10 'N88mod.bas
14 print " input ";
20 input a '
30 OPEN "mod.dat" FOR append AS#1 'ファイル出力
40 print " a MOD i ","2bytes "," Froat "," a / i"
50 for i=2 to 5
60 bb=int((a/i-int(a/i))*i+.5) ' MOD 代替式
70 print a;"mod";i,
72 if a>32767 then print "over! ", else print a mod i, '32767 over
74 print bb,a/i
80 print#1, a;"mod";i,
82 if a>32767 then print#1,"over! ", else print#1, a mod i, ' 32767 over
84 print#1, bb,a/i '
90 next i
100 print " a \ i","2bytes "," Froat "," a / i"
110 for i=2 to 5
120 cc=int(a/i) ' \ 代替式
130 print a;" \ ";i,
132 if a>32767 then print "over! ", else print a \ i, ' 32767 over
134 print cc,a/i '
140 print#1,a;" \ ";i,
142 if a>32767 then print#1,"over! ", else print#1, a \ i, ' 32767 over
144 print#1,cc,a/i '
150 next i
160 PRINT#1,""
170 CLOSE#1
180 '入力待ち
190 print " push eny key ";
200 a$=input$(1)
210 if a$="" then 180
220 end
エラーになるのと不正な結果になるのとどっちが良いかはともかく
MOD と \ の有効範囲は 普通は 32767 までのようですね。
だから素数のような桁数が多くなる計算は UBASIC などを使うのが良いのでしょうね。
- No.11165 - [コメント元:11161] [リストへもどる ] pre
11164:
Re^6: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
としき 2024/03/17(日) 17:26
参照先:http://toshiki.la.coocan.jp/
11160 番 としき さんへのコメント
> マジでN88-BASICに移植することを考えています。
> で、まだ逐語的な変換には手をつけていないのですが。
ぼちぼち、移植を始めています。
・コマンドラインオプションは取得できないので、プログラム冒頭で入力するように
した
・まず真っ先にやったのは、locateのxとyの総入れ替え
・N88-BASICでは、実数型も倍精度型も扱える上限は 1.7*10^38 で差がないため、
変数は全て単精度実数に変更
→実は覚えていなかったけど、FOR文のカウントに使うループ変数に倍精度型は
使えないのだとか。マニュアルに明記してあった
・私の趣味でファイル番号指定の「#1」の前には全て半角空白を入れた
(たぶん、文法的には不要だと思うけど覚えていない)
・#11160で私が指摘した謎の2つのif文はdsp=1のほうだけ残した
・ファイル出力の際に、ループ内でいちいちOPEN/CLOSEするのは非効率的だと思う
ので、最初で開いて最後に閉じるだけにした
今の所はそんな感じ。
とりあえず、机上デバッグでどこまでできるか。
忘れていることが多すぎるなぁ。
- No.11164 - [コメント元:11160] [リストへもどる ] soft
11163:
Re^2: オリジナルの prime.bas のソース
投稿者:
としき 2024/03/17(日) 17:09
参照先:http://toshiki.la.coocan.jp/
11156 番 としき さんへのコメント
お彼岸の墓参りの相談で実家に顔を出してきました。
その折に、30分ほどですが、PC-98に触れて。
> これをそのままN88-BASICに移植すると、こんな感じかなぁ。
> 実行していないので、そのまま動くかどうかはわかりません。
動きました。
細かくはチェックしていませんが、概ね、一発完動。
一発完動教徒なら、このくらい当たり前、というかもしれませんけどね。
> ・110行目のTHENの行番号は省略できたかもしれない。
> つまり、NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。
あ、ここが省略できるかは確認してこなかった。
次に行ったときには確認してこよう。といいつつ、忘れそうだけど。
次の週末、金曜日から土曜日にかけて実家に泊まることになったので、それまでには
prime2.basのN88-BASICへの移植を終わらせたいなぁ。
- No.11163 - [コメント元:11156] [リストへもどる ] soft
11162:
Re^6: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
konno 2024/03/12(火) 23:45
11160 番 としき さんへのコメント
> マジでN88-BASICに移植することを考えています。
> で、まだ逐語的な変換には手をつけていないのですが。
私も気になったので、NP2 でやってみました。(^^;
N88BASIC.EXE は画面がピンクになって動かないみたいです。(>_<)
BASIC.COM がコンパイラなんですね。無事コンパイルしたのを実行したら、
入力した数字が素数かどうかを表示するのですね。(^^;
> 気になったのがここ。
> if dsp=1 then print#1,"":gosub 1010
> if n>2000 then gosub 1000 'output
> dsp=1 かつ n>2000 のときは2回出力されるようなんですが、これって仕様的に
> なんとなく妙な気がします。これで正しいのですよね?
もちろんまずいです。(^^; いい加減なだけでした。
> あと、変数 j2 と j3 も、何をやっているのかよくわからない。
> この2つを足し算しているところもあるし。
これですね。
810 if i<j2 then return 'dsp2でカウント表示
j2=j2+j3
820 LOCATE 5,1:PRINT i; '
j2 は表示するまでのカウント数かな?
j3 はオプションの数字で、カウントがこの数字以上になったら次の数字ぶん表示しない
という感じですかね。ほとんど意味がないようですが。(^^;
- No.11162 - [コメント元:11160] [リストへもどる ] pre
11161:
MOD と ¥ の有効範囲
投稿者:
konno 2024/03/12(火) 22:45
11159 番 としき さんへのコメント コメント数 1
> オリジナルの prime.bas では関数になっていますよね。
> ということは、十進BASICでは関数である、ということだと思いますが?
> もしかしたら演算子にもあるかもしれませんけどね。
あうう、キチンと読んでいませんでした。
てっきり私がまた間違った言い方をしてしまったのかと。(^^;
> > > TurboBasicって、MOD関数またはMOD演算子ってないんですか?
> > もちろんありますが、32767以上は駄目みたいです。
> N88-BASICのリファレンスでは、演算前に小数点以下は切り捨てられるとはあります
> が、上限については記載がありません。試してみたいところではあります。
十進BASICで関数を使っているのは、MOD に制限があるからかも。
思いついて TurboBasicでテストプログラムを作ってみました。
'tmod.bas
screen 0
print " input ";:input a '
OPEN "mod.dat" FOR append AS#1 'ファイル出力
print " a MOD i ","2bytes "," Froat "," a / i"
for i=2 to 5
bb=int((a/i-int(a/i))*i+.5) ' MOD 代替式
print a;"mod";i,a mod i,bb,a/i
print#1, a;"mod";i,a mod i,bb,a/i '
next
print " a \ i","2bytes "," Froat "," a / i"
for i=2 to 5
cc=int(a/i) ' \ 代替式
print a;" \ ";i,a \ i,cc,a/i '
print#1,a;" \ ";i,a \ i,cc,a/i '
next
PRINT#1,""
CLOSE#1
100 '入力待ち
print " push eny key ";
a$=input$(1)
if a$="" then 100
end
結果
a MOD/\ i 2bytes Froat a / i"
32767 mod 2 1 1 16383.5
32767 mod 3 1 1 10922.33333333333
32767 mod 4 3 3 8191.75
32767 mod 5 2 2 6553.4
32767 \ 2 16383 16383 16383.5
32767 \ 3 10922 10922 10922.33333333333
32767 \ 4 8191 8191 8191.75
32767 \ 5 6553 6553 6553.4
32768 mod 2 0 0 16384
32768 mod 3 -2 2 10922.66666666667
32768 mod 4 0 0 8192
32768 mod 5 -3 3 6553.6
32768 \ 2 -16384 16384 16384
32768 \ 3 -10922 10922 10922.66666666667
32768 \ 4 -8192 8192 8192
32768 \ 5 -6553 6553 6553.6
32769 mod 2 0 1 16384.5
32769 mod 3 -2 0 10923
32769 mod 4 0 1 8192.25
32769 mod 5 -3 4 6553.8
32769 \ 2 -16384 16384 16384.5
32769 \ 3 -10922 10923 10923
32769 \ 4 -8192 8192 8192.25
32769 \ 5 -6553 6553 6553.8
これを見るとやはり 32768 以上では MOD も ¥ も使えないようですね。
実は今 STIME のタイマーで計算がバグって困ってたんですが、これが原因だったようです。
テストプログラム作成は無駄ではなかった。(~~;
- No.11161 - [コメント元:11159] [リストへもどる ] pre
11160:
Re^5: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
としき 2024/03/12(火) 12:32
参照先:http://toshiki.la.coocan.jp/
11149 番 konno さんへのコメント コメント数 2
> これですね、Prime Number が同じということでお察しください。(^^;
> 手抜きの残骸だったのかなんなのか、今はもうわからないです。(^^;
いや、konnoさんがわからないくらいですから、私にも察することはできません。
それはさておき。
マジでN88-BASICに移植することを考えています。
で、まだ逐語的な変換には手をつけていないのですが。
気になったのがここ。
if dsp=1 then print#1,"":gosub 1010
if n>2000 then gosub 1000 'output
dsp=1 かつ n>2000 のときは2回出力されるようなんですが、これって仕様的に
なんとなく妙な気がします。これで正しいのですよね?
あと、変数 j2 と j3 も、何をやっているのかよくわからない。
この2つを足し算しているところもあるし。
- No.11160 - [コメント元:11149] [リストへもどる ] pre
11159:
Re^3: オリジナルの prime.bas のソース
投稿者:
としき 2024/03/12(火) 02:16
参照先:http://toshiki.la.coocan.jp/
11158 番 konno さんへのコメント コメント数 1
> あう、MOD は演算子でしたね、失礼しました。
???
オリジナルの prime.bas では関数になっていますよね。
ということは、十進BASICでは関数である、ということだと思いますが?
もしかしたら演算子にもあるかもしれませんけどね。
> > TurboBasicって、MOD関数またはMOD演算子ってないんですか?
> もちろんありますが、32767以上は駄目みたいです。
N88-BASICのリファレンスでは、演算前に小数点以下は切り捨てられるとはあります
が、上限については記載がありません。試してみたいところではあります。
- No.11159 - [コメント元:11158] [リストへもどる ] soft
11158:
Re^2: オリジナルの prime.bas のソース
投稿者:
konno 2024/03/11(月) 00:45
11156 番 としき さんへのコメント コメント数 1
> なるほど、MODって関数なんですね。
> N88-BASICでは演算子なんですけどね。
あう、MOD は演算子でしたね、失礼しました。
> これをそのままN88-BASICに移植すると、こんな感じかなぁ。
> 実行していないので、そのまま動くかどうかはわかりません。
> TurboBasicって、MOD関数またはMOD演算子ってないんですか?
もちろんありますが、32767以上は駄目みたいです。
> あと、NEXTの後ろの変数って省略できないんですか?
> でもコンパイラ言語だからあんまり関係ないのか。
省略できると思います。指定した方がわかりやすいと思うので。
> 8ビットのBASICのころは、NEXTの後ろの変数を省略するとマイクロ秒の単位で速く
> なると信じられていて、だから私も省略するのが癖になっているのですよ。
コンパイラ言語ではあんまり関係ないのかもしれないなと思います。
> 高速化といえば、最初のFORの直下のIF文。
> これはループの中に入れておくのはもったいない。
> だって、1回しか比較する必要がないものを何回も比較することになるわけだから。
これはその通りですね、最初の FOR文はいらなかったですね。
うっかりしていました。(^^;
SOSU のソースから切り貼りしたのをそのまま残してしまったのかなぁ。(^^;
- No.11158 - [コメント元:11156] [リストへもどる ] pre
11157:
Re^15: プログラムの作り方
投稿者:
konno 2024/03/11(月) 00:19
11155 番 としき さんへのコメント
> いいかげん、タイトルを変えるべきだということに遅まきながら気がつきました。
私も途中で思ったのですが、まあいいかと。(^^;
> 類似したプログラムが見つからないとき、というのも私の場合はたまにある。
> ん〜、最近はあんまりそういうこともありませんが。
> 例えば、野ざらし言#569 からのツリーで作ったマクロ。
> こういう案件、konnoさんはあまり手を出さないということでしょうか。
そういう案件も多いと思います。その場合でも入出力など使えるルーチンは切り貼りで済まします。
そういえばテレビドラマ「ガリレオ」の教授は思いついたらいきなり数式を書きなぐっていましたね。
そういうやり方ができるのは、c.mosさんくらいではないかと。
> 私も最近はそういうことがなくなったということは、年をとったせいかも。
私も年を取って、昔のやり方でしか出来なくなったような気がします。
BASICのソースは普通大文字で書きますが、最近小文字の行を混在させてますよね。
そこは、自分で一から書いているよという自己主張なのかもしれません。(^^;
- No.11157 - [コメント元:11155] [リストへもどる ] soft
11156:
Re: オリジナルの prime.bas のソース
投稿者:
としき 2024/03/10(日) 18:50
参照先:http://toshiki.la.coocan.jp/
11150 番 konno さんへのコメント コメント数 2
> オリジナルの prime.bas のソースはこれだけです。
なるほど、MODって関数なんですね。
N88-BASICでは演算子なんですけどね。
> INPUT n
> IF MOD(n,2)=0 THEN
> IF n=2 THEN PRINT "素数" ELSE PRINT "合成数"
> ELSE
> FOR i=3 TO SQR(n) STEP 2
> IF MOD(n,i)=0 THEN EXIT FOR
> NEXT i
> IF i<=SQR(n) THEN PRINT "合成数" ELSE PRINT "素数"
> END IF
> END
これをそのままN88-BASICに移植すると、こんな感じかなぁ。
実行していないので、そのまま動くかどうかはわかりません。
100 INPUT N
110 IF N MOD 2=0 THEN 120 ELSE *ELSE1
120 IF N=2 THEN PRINT "素数" ELSE PRINT "合成数"
130 GOTO *ENDIF1
140 *ELSE1
150 I=3
160 WHILE (I<=SQR(N)) AND (N MOD I<>0)
170 I=I+2
180 WEND
190 IF I<=SQR(N) THEN PRINT "合成数" ELSE PRINT "素数"
200 *ENDIF1
210 END
解説すると
・MODは演算子に変更した。
・110行目のTHENの行番号は省略できたかもしれない。
つまり、NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。
・ループの脱出条件が複数あるので、FORループからWHILEループに変更した。
> TurboBasic で同じやり方はわからなかったので、自分なりに改造したのが以下
TurboBasicって、MOD関数またはMOD演算子ってないんですか?
あと、NEXTの後ろの変数って省略できないんですか?
でもコンパイラ言語だからあんまり関係ないのか。
8ビットのBASICのころは、NEXTの後ろの変数を省略するとマイクロ秒の単位で速く
なると信じられていて、だから私も省略するのが癖になっているのですよ。
高速化といえば、最初のFORの直下のIF文。
これはループの中に入れておくのはもったいない。
だって、1回しか比較する必要がないものを何回も比較することになるわけだから。
> i=2:gosub PRINT i;:c=c+1 ' 2 素数
> FOR i=3 TO n
こんな感じで十分だと思う。
- No.11156 - [コメント元:11150] [リストへもどる ] pre
11155:
Re^14: プログラムの作り方
投稿者:
としき 2024/03/10(日) 13:59
参照先:http://toshiki.la.coocan.jp/
11154 番 konno さんへのコメント コメント数 1
いいかげん、タイトルを変えるべきだということに遅まきながら気がつきました。
いまさら、という気も大いにしますが。
そして、たいそうな内容を書くわけでもない。
> ここ、私なら始めに類似したプログラムを探してそれを修正して使おうとします。
> ゼロから書き始めるなんて面倒だと思うので私はほとんどやったことがないのですよ。
類似したプログラムが見つからないとき、というのも私の場合はたまにある。
ん〜、最近はあんまりそういうこともありませんが。
例えば、野ざらし言#569 からのツリーで作ったマクロ。
こういう案件、konnoさんはあまり手を出さないということでしょうか。
私も最近はそういうことがなくなったということは、年をとったせいかも。
いかんなぁ。
- No.11155 - [コメント元:11154] [リストへもどる ] soft
11154:
Re^13: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/09(土) 23:45
11153 番 としき さんへのコメント コメント数 1
> 私はアイディアをコードではなく日本語で考えている、ということ。
> だから、日本語でメモをしている。
> 逆に言うと、ナイスなコードを思いつく、ということはあんまりなさそうです。
うーむ、私もアイデアが浮かんだ時点では、コードではなく日本語な気もしますが
コード的な、パズルのピース的な漠然としたイメージなのかもしれませんね。
> このときの薄らぼんやりとした記憶では、私、サブルーチンから書き始めるのでは
> なく、全体の大枠から書き始める、という意味でEmmettさんと同じだな、と感じた
> ように覚えています。
> 確かにこの部分、解釈によってはいろいろと怪しいかもしれない。
普通、枝葉であるサブルーチンから書き始める人はいませんよね。(^^;
私も Emmettさんの書き込みを読み直したら、何か違う気がしてきました。
> 》 いつでもいきなり、グローバルの1行目から、じかに書き始めます。
ここ、私なら始めに類似したプログラムを探してそれを修正して使おうとします。
ゼロから書き始めるなんて面倒だと思うので私はほとんどやったことがないのですよ。
# それが改造人間の定めなのさ・・・・ ルルルー・・・
- No.11154 - [コメント元:11153] [リストへもどる ] soft
11153:
Re^12: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/09(土) 11:17
参照先:http://toshiki.la.coocan.jp/
11152 番 konno さんへのコメント コメント数 1
多分、最大というか基本的な違いはここ。
> それよりも早く頭の中のアイデアをコードにしたいという欲求が強いのでしょう。(^^;
> # そうしないとアイデアが消えてしまいそうだから。(^^;;
私はアイディアをコードではなく日本語で考えている、ということ。
だから、日本語でメモをしている。
逆に言うと、ナイスなコードを思いつく、ということはあんまりなさそうです。
あと、前述のEmmettさんとの対話の部分、読み直して、もしかしたら私に誤解が
あったかもしれないというのがkonnoさんの指摘で気がついた。
> > 》 僕は、アルゴリズムを最初にどこかにメモしておいて、それに従ってプログラム
> > 》 を組んで行くということはやったことがありません。いつでもいきなり、グロー
> > 》 バルの1行目から、じかに書き始めます。
>
> > あぁ、なるほど、やっと Emmett さんのマクロ作法がわかったような気がします。
> > 基本的な考え方としては、私も Emmett さんとほとんど変わりません。
> > とっても安心しました。
>
> このように同意していますが、その後に
このときの薄らぼんやりとした記憶では、私、サブルーチンから書き始めるのでは
なく、全体の大枠から書き始める、という意味でEmmettさんと同じだな、と感じた
ように覚えています。
確かにこの部分、解釈によってはいろいろと怪しいかもしれない。
- No.11153 - [コメント元:11152] [リストへもどる ] soft
11152:
Re^11: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/09(土) 01:38
11151 番 としき さんへのコメント コメント数 1
> BASICもそうですが、先日お送りいただいたperlのコードも含めて、です。
そうでした、直してもらったばかりなのに perl のことを忘れていました。m(__)m
> 私のような横着な人間はどうするかというと、プログラムを作る前に、日本語で
> 設計します。そして、その設計をそのままコードの中にコメントとして残しておく。
> 例えば、今回のkonnoさんのprime2.basを作ろうとするなら、私の書きそうな設計
> は以下のような感じ。
なるほど、これをそのまま各ルーチンのタイトルに使うのですね。
私は手を付けてからどうするか考える癖があるみたいで、
今すぐこのスタイルに切り替えるのは難しそうです。(^^;
でも参考になりました。やってみたいと思います。
> そういえば昔、どこかに似たようなことも書いた気が、と思って検索したら。
> nifty:FGALDC/MES/15/#19030
> に似たようなことを書いていた。
> そうか、ikubohさんではなくてEmmettさんのマクロで勉強したのか。
そうでしたか、実は私も「コメントの多いマクロ」で Emmettさんを思い出してました。(^^;
その Emmettさんの発言を見ると
> 》 僕は、マクロを書く時はとりあえずグローバルマクロからとにかく書き始めます。
> 》 僕は、アルゴリズムを最初にどこかにメモしておいて、それに従ってプログラム
> 》 を組んで行くということはやったことがありません。いつでもいきなり、グロー
> 》 バルの1行目から、じかに書き始めます。
私とおんなじですね。(^^;
それに対してとしきさんも
> あぁ、なるほど、やっと Emmett さんのマクロ作法がわかったような気がします。
> 基本的な考え方としては、私も Emmett さんとほとんど変わりません。
> とっても安心しました。
このように同意していますが、その後に
> でも、大きく異なるところは、私の場合、仮想プログラム言語というかメタ言語
> というか、まぁ日本語のようなもので書いているのです。で、大体まとまったら
> マクロに翻訳する、と。
こう書いていますね。やっぱりスタイルが違うと感じます。(^^;
もちろん、としきさんの方が正統派だと思います。
> いろいろなことを書きましたが。
> 結論は、楽をしましょうよ、ということに尽きるわけで。
楽をする、という意味では、としきさんのような正統派のやりかたが良いと思います。
それが出来ない私は、やっぱり楽をしようと思っていないのかもですね。(^^;
それよりも早く頭の中のアイデアをコードにしたいという欲求が強いのでしょう。(^^;
# そうしないとアイデアが消えてしまいそうだから。(^^;;
- No.11152 - [コメント元:11151] [リストへもどる ] soft
11151:
Re^10: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/08(金) 01:08
参照先:http://toshiki.la.coocan.jp/
11148 番 konno さんへのコメント コメント数 1
> > 要は、konnoさんのコードの場合、有効な情報が全くないのがイマイチ。
> うう、これは BASIC コードのことを言っているのですよね。
BASICもそうですが、先日お送りいただいたperlのコードも含めて、です。
> ということで、今はサブルーチンのタイトルや説明、各行のコメントを
> なるべく入れるようにやっている最中です。(^^;
うん、まぁ、最終的な完成品を作るにあたってそういうことは必要ですけどね。
私のような横着な人間はどうするかというと、プログラムを作る前に、日本語で
設計します。そして、その設計をそのままコードの中にコメントとして残しておく。
例えば、今回のkonnoさんのprime2.basを作ろうとするなら、私の書きそうな設計
は以下のような感じ。
初期設定
求める素数上限入力
メインルーチン(サンプルコードを最大限流用)
終了処理(キー入力待ち必須)
出力サブルーチン
ファイル出力
エラー終了ルーチン(自作の××からコピペ)
タイマールーチン(自作の○○からコピペ)
こんな感じで設計ができたら、あとは切った貼った、コピペできないところは仕方
ない作るか。
という風にするわけです。
そうすれば、わざわざコメントを書くということはなくなります。
その上、設計をじっと見つめて、例えば、出力部分はもうちょっと整理できそうだ、
とか、エラーのルーチンはそのままコピペだとイマイチかも、みたいなことも考え
付いたりするわけですよ。
そういえば昔、どこかに似たようなことも書いた気が、と思って検索したら。
nifty:FGALDC/MES/15/#19030
に似たようなことを書いていた。
そうか、ikubohさんではなくてEmmettさんのマクロで勉強したのか。
いろいろなことを書きましたが。
結論は、楽をしましょうよ、ということに尽きるわけで。
- No.11151 - [コメント元:11148] [リストへもどる ] soft
11150:
オリジナルの prime.bas のソース
投稿者:
konno 2024/03/07(木) 22:43
11135 番 konno さんへのコメント コメント数 1
オリジナルの prime.bas のソースはこれだけです。
INPUT n
IF MOD(n,2)=0 THEN
IF n=2 THEN PRINT "素数" ELSE PRINT "合成数"
ELSE
FOR i=3 TO SQR(n) STEP 2
IF MOD(n,i)=0 THEN EXIT FOR
NEXT i
IF i<=SQR(n) THEN PRINT "合成数" ELSE PRINT "素数"
END IF
END
IF 〜 ELSE 〜 END IF をうまく使ってシンプルでエレガントですね。
TurboBasic で同じやり方はわからなかったので、自分なりに改造したのが以下
FOR i=2 TO n
IF i=2 THEN gosub PRINT i;:c=c+1 ' 2 素数
i2=i/2:i3=int(i/2):IF i2=i3 THEN goto EXIT2 ' 合成数
FOR j=3 TO SQR(i) STEP 2 ' 偶数をスキップ
i2=i/j:i3=int(i/j):IF i2=i3 THEN goto EXIT1 ' 合成数
NEXT j
EXIT1:
IF j>SQR(i) THEN gosub PRINT i;:c=c+1 ' 素数
EXIT2:
NEXT i:i=i-1
としきさんにループの抜け方が強引と言われたけど、うーむ・・・
IF MOD(n,i)=0 THEN EXIT FOR
ここは
i2=i/j:i3=int(i/j):IF i2=i3 THEN goto EXIT1 ' 合成数
↓
i2=i/j:i3=int(i/j):IF i2=i3 THEN i=i+1 ' 合成数
にすればよかったのかな。
つい、EXIT という構文に引っ張られたような・・・(^^;
- No.11150 - [コメント元:11135] [リストへもどる ] pre
11149:
Re^4: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
konno 2024/03/07(木) 22:28
11147 番 としき さんへのコメント コメント数 1
> だって、#11135で
> > ・起動時オプション 1 で P000.DAT に素数を出力します。
> > ・起動時オプション 2 で 表示もファイル出力もしません。カウントのみ
> とはあったけど、起動時オプション 0 があるとは書いてなかったもので。
お察しの通りオプション 0 はありません。(^^;
あ、P000.DAT も S000.DAT の間違いですね。P000 は PRIME2 の方でした。(>_<)
> 例えば、表示する素数の数の入力を求めるプロンプト、日本語の部分がコメント
> になっていますが、これはなぜそうしているのか、とか。
最初日本語で書いたけどUSモードだと表示しないとか色々面倒なのでコメントにしてしまい
そのまま放置してました。(^^;
> メインというか j のループからは結構強引な脱出をしているな、とか。
これは良くない抜け方でしたね、気が向けば直します。(^^;
> そのループのコメントの「i;:c=c+1」っていったいなんだろう、とか。
これは元は PRINT文だったのを、PRINT1: というサブルーチンに変更したので
IF j>SQR(i) THEN gosub PRINT1 i;:c=c+1 ' 素数
↓
IF j>SQR(i) THEN gosub PRINT1 'i;:c=c+1 ' 素数
こういうように、コメントで手抜きをしてました。(^^;
まあ、飛び先でやってることをコメントに残したとも言えなくもないし。(^^;
> outputのコメント、なんで素数が1個でも10000000個でも時間が同じなのかな、
> とか。もしかしたら違うのかもしれないけど、この表現ではそれ以外の意図は
> 読み取れない。
'Number.1 0: 0' 4 Prime Number = 9592
'Number.10000000 0: 0' 4 Prime Number = 9592
これですね、Prime Number が同じということでお察しください。(^^;
手抜きの残骸だったのかなんなのか、今はもうわからないです。(^^;
> タイマーのサブルーチンの冒頭、謎のif文がコメントアウトされているけど、
> これはいったいなんだろう、とか。
これも借り物のルーチンの残骸ですね。他人に見せることは全く意識してないのです。
> 一般にコードの概要をつかむにはコメント文が有効のはずなんだけど、全く有効に
> 見えない気がする。
私のソースはこんなのばっかりなので、元々は公開する気も無かったんですがねぇ。(^^;
出来る範囲で改善するようにします。m(__)m
- No.11149 - [コメント元:11147] [リストへもどる ] pre
11148:
Re^9: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/07(木) 22:04
11146 番 としき さんへのコメント コメント数 1
> このコードを書いた人は、プログラムの完成を見ることなく、永遠にデバッグのぬるま湯に
> 浸かっていたいのか。
> と、誤解してしまいそうなわけですよ。誤解ですよね?
> #本心だったらいやすぎ
もちろん誤解ですよ。(^^; ただ世の中変人が多いのでそういう人もいるかも。(いねえよ)
> コメントが多いというのは、決して悪くはないんですよ。
> 問題は、それが何を意味しているかがわからないこと。
超絶ハイテク技などはそういうコメントが欲しいものですね。
> 要は、konnoさんのコードの場合、有効な情報が全くないのがイマイチ。
うう、これは BASIC コードのことを言っているのですよね。
アセンブラやVZマクロにはかなりコメントを入れているつもりです。(^^;
> ということで、次善の策。コメントだけを追いかけることで、そのコードが何をやって
> いるかがわかるようにする。
これは上で書きましたが、BASICは自分で読めるものだからあまりコメントを入れないのですね。
でも後で読むと何をやっているのかわからなくなってしまっています。(>_<)
ということで、今はサブルーチンのタイトルや説明、各行のコメントを
なるべく入れるようにやっている最中です。(^^;
達人のコードにコメントが無いのは必要を感じないからなんでしょうね。
> 私も、Vzのマクロを勉強するとき、ikubohさんだったかな、もう忘れましたが、誰かの
> マクロコードのコメントを見て勉強した記憶があります。
> ということで、必要なコメントはバシバシ入れましょう、ということでした。
ikubohさんなど達人のマクロはコメントがないと何をやっているのか全く分からないレベルですからね。
私もこれからは他人が読むことを念頭に入れてコメントを入れるようにします。
# 昨日の自分は他人と言いますからね。(゚゜)☆\(--#) それはおのれじゃ
- No.11148 - [コメント元:11146] [リストへもどる ] soft
11147:
Re^3: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
としき 2024/03/07(木) 02:18
参照先:http://toshiki.la.coocan.jp/
11140 番 konno さんへのコメント コメント数 1
> コメントの間違いにコメントするなんて、鬼畜ですぅ。(;_;)
いや、なんとなく間違っていそうだとは思ったけど、確信がもてなかったのですよ。
だって、#11135で
> ・起動時オプション 1 で P000.DAT に素数を出力します。
> ・起動時オプション 2 で 表示もファイル出力もしません。カウントのみ
とはあったけど、起動時オプション 0 があるとは書いてなかったもので。
> 日付や指定範囲などもおかしいような気がするけど気にしない。(^^;
日付や範囲指定については、まだ見てもいない。
それより気になった部分がいくつかあって。
例えば、表示する素数の数の入力を求めるプロンプト、日本語の部分がコメント
になっていますが、これはなぜそうしているのか、とか。
メインというか j のループからは結構強引な脱出をしているな、とか。
そのループのコメントの「i;:c=c+1」っていったいなんだろう、とか。
outputのコメント、なんで素数が1個でも10000000個でも時間が同じなのかな、
とか。もしかしたら違うのかもしれないけど、この表現ではそれ以外の意図は
読み取れない。
タイマーのサブルーチンの冒頭、謎のif文がコメントアウトされているけど、
これはいったいなんだろう、とか。
一般にコードの概要をつかむにはコメント文が有効のはずなんだけど、全く有効に
見えない気がする。
- No.11147 - [コメント元:11140] [リストへもどる ] soft
11146:
Re^8: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/07(木) 02:17
参照先:http://toshiki.la.coocan.jp/
11144 番 konno さんへのコメント コメント数 1
> それで上側も修正したら、キチンとツリー表示出来ました。\(^^)/ ヤッタ-
無事に正常表示になりましたね。よかったよかった。
> 今見たら私のバグバグなトンでもコードのコメントがそのまま大量に残っていますね。(^^;
> よくこの状態で修正できたと感心します。いや、ありがたいです。
だから前にも言ったけど、ほとんど迷彩のような。
あたかも、プログラムからバグを除去することを拒むかのような。
このコードを書いた人は、プログラムの完成を見ることなく、永遠にデバッグのぬるま湯に
浸かっていたいのか。
と、誤解してしまいそうなわけですよ。誤解ですよね?
#本心だったらいやすぎ
コメントが多いというのは、決して悪くはないんですよ。
問題は、それが何を意味しているかがわからないこと。
例えば、コードの右側のほうに
「この行のコメントをはずすと××になる」
とか
「※参考 ○○氏のコード」
などときちんと記載されていればいいのですよ。
あるいは、ymfcstなんかでも採用されているような感じで
「★マークの5行のコメントをはずすとほにゃらら」
みたいなものとか。
要は、konnoさんのコードの場合、有効な情報が全くないのがイマイチ。
プログラムにおけるコメントって、コンピュータではなく人間に対して書くものですから、
人間に対して意味のない情報は少ないほうがいい。
私も、プロの書いたコードなんてあんまり見たことがありませんが、まずは目標として
コードだけで、つまりコメント全くなしで、ここは何をやっているかがわかるような
ものを目指すらしい。そうすれば、そもそもコメントを入れなくてすむから。
おおむね、人はみな横着ですからね。コメントを考える手間も省きたいわけですよ。
ただ、それはある種の理想。そんなものが実現することはまずない。
ということで、次善の策。コメントだけを追いかけることで、そのコードが何をやって
いるかがわかるようにする。
つまり、それなりにプログラムを読んできた経験のある人の場合、初めて触れる言語で
あっても、コメントのあるコードであれば、まずコメントを読む。
私も、Vzのマクロを勉強するとき、ikubohさんだったかな、もう忘れましたが、誰かの
マクロコードのコメントを見て勉強した記憶があります。
ということで、必要なコメントはバシバシ入れましょう、ということでした。
- No.11146 - [コメント元:11144] [リストへもどる ] soft
11145:
Re^6: SOSU6 素数を表示、カウントするテスト6
投稿者:
konno 2024/03/05(火) 23:15
11143 番 としき さんへのコメント
> 値を省略するとカーソルオフなんですかね。
> N88だと、最後のパラメータなんでよく省略されていましたが、省略時は単にそれ以前
> の値を引き継いでいました。
試しに
LOCATE 1, 26, ,10
にして実行してみたら、カーソル高さが半分くらいになっていました。
省略時はそれ以前の値を引き継ぐようですね。
> コンパイル型言語なら大丈夫なんじゃないかなぁ。
> ただ、ループをまわす回数が増えても問題がないのに、ループの回数そのものが少ない
> にもかかわらず、そのループを呼び出す回数が増えると問題が出るという、謎の不具合
> につながることがあって。
> 苦労させられた人はそれなりにいるはず。
やっぱりむやみにループを抜けるのは避けた方が良さそうですね。
> ところで、それよりも、変なことに気がつきました。
> #11097によると
> > 最も素朴な方法は、2 から √n 以下の素数まで順番に割っていく
> とあるのですが、コードの中にSQRT関係の関数がないようです。
気が付いてしまいましたか、そうです、私はWikiを見ないで自分で考えたのです。
素数を調べるには確定した素数で割ればいいんじゃないかと思ったのです。
それで配列に確定した素数を入れたのですが、数字が大きくなると割る回数が増えるので
時間が掛かったのでした。
> これ、本当にこのアルゴリズムであっていますかね。
PRIME2.EXE は、SQR関数を使っているので、これが本来のアルゴリズムなのでしょうね。
でも結果は一致していたので、考え方はあながち間違ってはいなかったかなと思います。
> 例えば、23が素数であるかを確認するためには√23以下の素数、つまり2と3で確認
> すれば事足りるわけです。
> コードを追いかけていませんが、まさか、5とか7でも割っているから余計に時間が
> かかっている、ということはないでしょうか。
その通りですね、ですから、SOSUシリーズは私の個人的仮説の実験だったのです。(^^;
PRIME.BAS のサンプルは学校でも使える模範的コードなのだと思います。
- No.11145 - [コメント元:11143] [リストへもどる ] soft
11144:
Re^7: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/05(火) 20:04
11142 番 としき さんへのコメント コメント数 1
> あるいは、konnoさんがご自分でコードをきれいにしようとして失敗したとか。
私は頂いたソースをそのまま張り付けただけだったと思います。(^^;
今見たら私のバグバグなトンでもコードのコメントがそのまま大量に残っていますね。(^^;
よくこの状態で修正できたと感心します。いや、ありがたいです。
> msgviewの中で「┗」「┣」が表示されるルーチンは以下のような感じ。
> if ($tx[$lx] == 0 && $lx != 0) { print "┗"; }
ここは探してみたところ、以下のようになっていましたが修正しました。
# if ($tx[$lx] == 0 && $lx != 0) { print "┗"; }
if ( $tx[$lx] != 0 ) { print "┣"; }
↓
if ( $tx[$lx] == 0 ) { print "┗"; }
elsif ($lx != 0 ) { print "┗"; }
↓
else { print "┗"; }
最初下の1行だけ修正しましたが変わりませんでした。
それで上側も修正したら、キチンとツリー表示出来ました。\(^^)/ ヤッタ-
> もうkonnoさんのところでも不要なコメントは全部落としているでしょうから、場所は
> すぐに見つかることでしょう。
不要なコメントはまだそのままですが、これを機に削除しようと思います。(^^;
本当にありがとうございました。m(__)m
- No.11144 - [コメント元:11142] [リストへもどる ] pre
11143:
Re^5: SOSU6 素数を表示、カウントするテスト6
投稿者:
としき 2024/03/05(火) 17:58
参照先:http://toshiki.la.coocan.jp/
11141 番 konno さんへのコメント コメント数 1
> これも元は何かのサンプルソースで
> LOCATE 1, 26, ,1 '%CursorOff
> 多分これが元だと思います。
> TBasicのマニュアルでは、終了位置を省略すると開始位置と同じ数値が入るらしいですが
> このコメントでは、カーソルオフになっていますね? わからん。
値を省略するとカーソルオフなんですかね。
N88だと、最後のパラメータなんでよく省略されていましたが、省略時は単にそれ以前
の値を引き継いでいました。
> カーソルの高さ指定だと思います。TBasicでは、0が上で 15が下みたいです。
あ、横方向ではなく、1つの文字の中の縦方向でしたか。
ということは、開始位置が0、終了位置を1と指定すると、アッパーラインのような感じ
になるということですね。これはVzのCiとCoみたいに変更できるということですから、
使い方によっては便利かもしれない。
> > FORのループを完了させずに途中で脱出すると、スタックにデータが詰みあがった
> > ままになってしまうのだそうで。
> うげ、これは知らなかったです。ヤバイかも・・・(>_<)
いや、昔のインタプリタの時代の話ですから。
コンパイル型言語なら大丈夫なんじゃないかなぁ。
ただ、ループをまわす回数が増えても問題がないのに、ループの回数そのものが少ない
にもかかわらず、そのループを呼び出す回数が増えると問題が出るという、謎の不具合
につながることがあって。
苦労させられた人はそれなりにいるはず。
ところで、それよりも、変なことに気がつきました。
#11097によると
> 最も素朴な方法は、2 から √n 以下の素数まで順番に割っていく
とあるのですが、コードの中にSQRT関係の関数がないようです。
これ、本当にこのアルゴリズムであっていますかね。
例えば、23が素数であるかを確認するためには√23以下の素数、つまり2と3で確認
すれば事足りるわけです。
コードを追いかけていませんが、まさか、5とか7でも割っているから余計に時間が
かかっている、ということはないでしょうか。
- No.11143 - [コメント元:11141] [リストへもどる ] pre
11142:
Re^6: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/05(火) 17:24
参照先:http://toshiki.la.coocan.jp/
11139 番 konno さんへのコメント コメント数 1
> 何が悪いのかはわかりません。m(__)m
私にも何が悪いのか、今のところは全くわかっていません。
一応、1月にkonnoさんにお送りしたコードを再び引っ張り出してみました。
そして、うちの板塀の現行ログを表示してみたのですが、全て正常な表示に見える
のですよ。かなり複雑そうなツリーであっても。
う〜ん、まさかデータというかログファイルのほうに原因があるのか?
それとも、私がkonnoさん的なコードに転記する際にどこかを誤ったとか。
いささか複雑というか統一性に欠けたコーディングスタイルでしたから。
あるいは、konnoさんがご自分でコードをきれいにしようとして失敗したとか。
一応、ざっくりみたところ。
msgviewの中で「┗」「┣」が表示されるルーチンは以下のような感じ。
if ($tx[$lx] == 0 && $lx != 0) { print "┗"; }
else {
$jj=1;
while ( $tlx[$j+$jj] > 0 ) {
if ( $tlx[$j] == $tlx[$j+$jj] ) { $jj=0; last; }
if ( $tlx[$j] > $tlx[$j+$jj] ) { $jj=1; last; }
$jj++;
}
if ( $jj == 0 ) { print "┣"; }
elsif ($lx != 0 ) { print "┗"; }
}
一方で、正しく表示される一括表示のツリー表示部分は以下のような感じ。
if ( $tx[$lx] == 0 ) { print "┗"; }
else {
$jj=1;
while ( $tlx[$j+$jj] > 0 ) {
if ( $tlx[$j] == $tlx[$j+$jj] ) { $jj=0; last; }
if ( $tlx[$j] > $tlx[$j+$jj] ) { $jj=1; last; }
$jj++;
}
if ( $jj == 0 ) { print "┣"; }
else { print "┗"; }
}
条件式が違うじゃない。
何でこんなところを見落としたんだろう。
テストデータというか板塀のデータで正常に表示されていたからだろうなぁ。
ということで、もしかしたらこれでうまくいくかも。
もうkonnoさんのところでも不要なコメントは全部落としているでしょうから、場所は
すぐに見つかることでしょう。
とりあえず試してみてください。
- No.11142 - [コメント元:11139] [リストへもどる ] pre
11141:
Re^4: SOSU6 素数を表示、カウントするテスト6
投稿者:
konno 2024/03/05(火) 16:55
11138 番 としき さんへのコメント コメント数 1
> > LOCATE 縦位置,横位置,カーソル表示スイッチ,カーソル開始位置,カーソル終了位置
見直したらおかしなところに気が付きました。
LOCATE 1, 26, ,1
とありますが、おしりの1はカーソル開始位置なので、終了位置が無い?
これも元は何かのサンプルソースで
LOCATE 1, 26, ,1 '%CursorOff
多分これが元だと思います。
TBasicのマニュアルでは、終了位置を省略すると開始位置と同じ数値が入るらしいですが
このコメントでは、カーソルオフになっていますね? わからん。
サンプルが間違えているかもですね。(^^;
> えと、LOCATEが縦、横の順というのは、Turbo Basic と TBasic の両方ですか?
両方です。TBasicはもろMS系だと思いますが、TurboBasicもMS系準拠ということですかね。
> カーソルの開始位置、終了位置ってなんだろう。
カーソルの高さ指定だと思います。TBasicでは、0が上で 15が下みたいです。
> FORのループを完了させずに途中で脱出すると、スタックにデータが詰みあがった
> ままになってしまうのだそうで。
うげ、これは知らなかったです。ヤバイかも・・・(>_<)
STIME でたまに問題が出るのはこれかもしれないですね。
> FOR II!=1 TO CO!-1
> IF INT(I!/CO1%(II!))=I!/CO1%(II!) THEN NOFLG=1:II!=CO!-1
> NEXT
> こんな感じで無理やり強制的にループの制御変数の値を書き換えてしまう、という
> ワザが使われていました。
これも良くやっていますが、これからはループを抜ける時は気を付けます。
- No.11141 - [コメント元:11138] [リストへもどる ] pre
11140:
Re^2: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
konno 2024/03/05(火) 15:56
11137 番 としき さんへのコメント コメント数 1
> ソースリスト冒頭のコメントで
> ' IF DSP=1 THEN print '画面出力
> ' IF DSP=1 THEN print out dat 'ファイル出力
> ' IF DSP=2 THEN no print 'カウントのみ
> となっているのですが、これはコメントが間違っているのかな。
コメントの間違いにコメントするなんて、鬼畜ですぅ。(;_;)
もちろん1行目は ゼロのつもりだったんですぅ。
日付や指定範囲などもおかしいような気がするけど気にしない。(^^;
- No.11140 - [コメント元:11137] [リストへもどる ] pre
11139:
Re^5: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/05(火) 15:24
11136 番 としき さんへのコメント コメント数 1
> たとえば、#11097から始まるツリーの#11117とか#11126が、本来は「┗」でなければ
> いけないけれど「┣」になっているように見えます。
あうう、リンク先をそのまま見ていました。頭が他に行っていたみたいです。(>_<)
msgview のツリーは「┣」になっていますね。失礼しました。m(__)m
何が悪いのかはわかりません。m(__)m
- No.11139 - [コメント元:11136] [リストへもどる ] soft
11138:
Re^3: SOSU6 素数を表示、カウントするテスト6
投稿者:
としき 2024/03/05(火) 14:12
参照先:http://toshiki.la.coocan.jp/
11133 番 konno さんへのコメント コメント数 1
LOCATEなんていう、割と基本的なところからして違うものなのですね。
> LOCATE 縦位置,横位置,カーソル表示スイッチ,カーソル開始位置,カーソル終了位置
>
> 私がN88系と違うと思ったのは、縦と横が逆なところです。
> 他の構文は、横、縦なので、間違えやすいですね。MS系の歴史でしょうか。
えと、LOCATEが縦、横の順というのは、Turbo Basic と TBasic の両方ですか?
それともどちらかだけ?
ちなみに、N88の場合は
LOCATE 横位置,縦位置,カーソル表示スイッチ
だけです。
カーソルの開始位置、終了位置ってなんだろう。
横長のカーソルを表示できるのかな。
それとも、その制限の範囲にカーソルがこない場合は表示されない、とか。
> 移植するなら、他の素数プログラムが良いと思います。
konnoさんの新しいのもリリースされたし、そっちを狙おうかな。
とりあえず、SOSU6の方を移植するとなると気になる部分がひとつ。
もしかしたら16ビットのBASICでは改善されているかもしれませんが。
loop2: ' 数値を確定した素数で割り切れれば合成数
for ii!=1 to co!-1
b!=int(i!/co1%(ii!)):if b!=i!/co1%(ii!) then noflg=1:goto lpend2
next ii!
lpend2:
8ビット時代のBASICでは、こういうループの脱出方法をは推奨されなかった。
FORのループを完了させずに途中で脱出すると、スタックにデータが詰みあがった
ままになってしまうのだそうで。
たしか、新しくRUNするとクリアされるのだったかなぁ。
もしかしたら、明示的にCLEARというコードを書かないとクリアされなかったかも
しれない。
この辺は処理系によって違うかもしれないし、当時のBASICのリストを見ると、DEFINT
と同様、ソースの先頭でおまじないのようにCLEARを入れているものが多かったので、
この辺で混同している部分もあるかもしれない。
で、結局どうするのがよいかというと
*LOOP2
FOR II!=1 TO CO!-1
IF INT(I!/CO1%(II!))=I!/CO1%(II!) THEN NOFLG=1:II!=CO!-1
NEXT
こんな感じで無理やり強制的にループの制御変数の値を書き換えてしまう、という
ワザが使われていました。
- No.11138 - [コメント元:11133] [リストへもどる ] pre
11137:
Re: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
としき 2024/03/05(火) 13:22
参照先:http://toshiki.la.coocan.jp/
11135 番 konno さんへのコメント コメント数 1
> 自己流で改造したので間違いがある可能性はあります。
プログラムの中身はぜんぜん読めていませんが。
> ・起動時オプション 1 で P000.DAT に素数を出力します。
> ・起動時オプション 2 で 表示もファイル出力もしません。カウントのみ。
ソースリスト冒頭のコメントで
' IF DSP=1 THEN print '画面出力
' IF DSP=1 THEN print out dat 'ファイル出力
' IF DSP=2 THEN no print 'カウントのみ
となっているのですが、これはコメントが間違っているのかな。
- No.11137 - [コメント元:11135] [リストへもどる ] pre
11136:
Re^4: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/05(火) 12:06
参照先:http://toshiki.la.coocan.jp/
11134 番 konno さんへのコメント コメント数 1
> 見てみましたが、これは正しいツリーだと私は思います。
あれ?
うちとkonnoさんのところでは、表示のされ方が違うのかな?
そんなことはないと思うけど。
たとえば、#11097から始まるツリーの#11117とか#11126が、本来は「┗」でなければ
いけないけれど「┣」になっているように見えます。
これ、konnoさんのところでは正しく「┗」になっているのか。
それとも私の勘違いで「┣」が正しいのか。
ちょっと混乱しています。
- No.11136 - [コメント元:11134] [リストへもどる ] soft
11135:
TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
konno 2024/03/05(火) 00:40
コメント数 2
TurboBasicで素数を表示、カウントするプログラム PRIME2.EXE です。
元にしたのは、十進BASIC に入っていた サンプルソースです。
https://hp.vector.co.jp/authors/VA008683/
ここのダウンロードページの Windowsアーカイブ版の中の
BASIC7868.zip (1,292,876バイト)を落として展開すると
Mathフォルダがあり、その中にある
PRIME.BAS 319bytes
を Turbo Basic で動くように改造しました。
特徴は、処理が非常に速く、桁数の制限がほぼ無いことです。
DOSVAXJ3 や MS-DOS Player の JP モードで動きます。
自己流で改造したので間違いがある可能性はあります。
指定範囲は20から 1億までにしました。
起動時オプションで動作変更できます。
PRIME.ZIP サイズ 30299bytes 24-03-01 new!
PRIME2.EXE Ver.240301
・DOSVAXJ3 の VGAで動く 素数表示テストです。
・DOSVAXJ3 を起動したら、chev jp でVGAモードにして、PRIME2.EXE を起動してください。
・MS-DOS Player では、chej jp でVGAモードにすれば動作します。
・VTDOS では動作しません。
・ソースも付けます。
・20000000までは実行できると思います。
・数字や時間情報を SOSU.DAT に追加出力します。
・起動時オプション 1 で P000.DAT に素数を出力します。
・起動時オプション 2 で 表示もファイル出力もしません。カウントのみ。
・起動時オプション 100以上で 指定した数字で間欠カウント表示。若干速くなるかも。
・数字が大きくなると時間が掛かるので、初めは 1000くらいから始めてください。
・更新履歴
2024-03-03 V2 バグ取りやファイル出力やオプション追加など。
2024-02-27 V1 とりあえず作成
動作保証はでき無いので実行は自己責任で。
http://tamaneko.world.coocan.jp/execom.htm
- No.11135 - [リストへもどる ] soft
11134:
Re^3: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/05(火) 00:07
11132 番 としき さんへのコメント コメント数 1
> #11097とか#11098からのツリーの、本来「┗」でなければいけないところがいくつか
> 「┣」になっていますね。
見てみましたが、これは正しいツリーだと私は思います。
うちのツリーは横幅を狭くしたくて見た目がいまいちなのです。(^^;
- No.11134 - [コメント元:11132] [リストへもどる ] soft
11133:
Re^2: SOSU6 素数を表示、カウントするテスト6
投稿者:
konno 2024/03/05(火) 00:03
11131 番 としき さんへのコメント コメント数 1
> 上のほうから見ていって、まず気がついたのがLOCATE文。
> LOCATE 1, 26, ,1
> というのがありましたが、N88では引数は3つまで。
> つまり、カンマの数は2つまででした。
Turbo Basic と TBasic のマニュアルが腐海から救い出せました。
思いもよらぬところの奥底に沈んでいました。(^^;
それによると、LOCATE 文の引数は 5個まであります。
LOCATE 縦位置,横位置,カーソル表示スイッチ,カーソル開始位置,カーソル終了位置
私がN88系と違うと思ったのは、縦と横が逆なところです。
他の構文は、横、縦なので、間違えやすいですね。MS系の歴史でしょうか。
> 次がCOLOR文。
> COLOR 14, 0
> とありますが、N88では最初の引数は0から7までだけでした。
> 2番目と4番目の引数なら14も使えるようです。
これもMS系と大きく違うところですね。
詳しくは以下略。(^^;
> あ、なんか、消し忘れのようなもの見つけてしまった。
> a!=0
> ってあるんですが、この変数、他では使われていないっぽい。
う、消し忘れてましたね。(^^;
> あ〜、なんか、N88-BASIICに移植したくなってきた。
> といっても、動作環境は手元にはない。
> 実家にはDOS BASICはあるはずだけど、DOS BASICとDISK BASICって何が違っていたか
> もう思い出せない。
> ちょっと無謀だな。
ネットには、N88系準拠のフリーなBASICもありそうです。
移植するなら、他の素数プログラムが良いと思います。
私のは全く実用的でないので。(^^;
これからアップしますね。
- No.11133 - [コメント元:11131] [リストへもどる ] pre
11132:
Re^2: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/04(月) 23:32
参照先:http://toshiki.la.coocan.jp/
11053 番 としき さんへのコメント コメント数 1
> どんなチェック漏れがあるやら、想像もつきません。
いやぁ、やっぱりまだ何かおかしいですね。
#11097とか#11098からのツリーの、本来「┗」でなければいけないところがいくつか
「┣」になっていますね。
OKなところとNGなところの条件から追いかけてみましょう。
とはいえ、今日はもう終わり。
明日以降でね。
- No.11132 - [コメント元:11053] [リストへもどる ] soft
11131:
Re: SOSU6 素数を表示、カウントするテスト6
投稿者:
としき 2024/03/04(月) 23:23
参照先:http://toshiki.la.coocan.jp/
11128 番 konno さんへのコメント コメント数 1
> TurboBasicで素数を表示、カウントするプログラム SOSU5 に更新しました。
N88-BASICもあらかた忘れ始めているので手元のDISK BASICのリファレンスを見ながら
ですが、TurboBasicはやっぱりかなり違うようです。
上のほうから見ていって、まず気がついたのがLOCATE文。
LOCATE 1, 26, ,1
というのがありましたが、N88では引数は3つまで。
つまり、カンマの数は2つまででした。
次がCOLOR文。
COLOR 14, 0
とありますが、N88では最初の引数は0から7までだけでした。
2番目と4番目の引数なら14も使えるようです。
あ、なんか、消し忘れのようなもの見つけてしまった。
a!=0
ってあるんですが、この変数、他では使われていないっぽい。
あ〜、なんか、N88-BASIICに移植したくなってきた。
といっても、動作環境は手元にはない。
実家にはDOS BASICはあるはずだけど、DOS BASICとDISK BASICって何が違っていたか
もう思い出せない。
ちょっと無謀だな。
- No.11131 - [コメント元:11128] [リストへもどる ] soft