投稿者:SHIRAISHI Kazuo
投稿日:2020年 7月30日(木)11時40分34秒
|
|
|
> No.4862[元記事へ]
> DIM A(100)
> RANDOMIZE
> FOR n = 1 TO 100
> LET A(n)=INT(RND*MAXNUM/100 + 1)
> NEXT n
> LET SUM = 0
> LET EVEN = 0
> LET S_EVEN = 0
> LET ODD = 0
> LET S_ODD = 0
> LET NUM = 0
> FOR n = 1 TO 100
> LET NUM = A(n)
> LET SUM = SUM + NUM
> IF MOD(NUM,2)=0 THEN
> LET EVEN = EVEN + NUM
> ELSE
> LET ODD = ODD + NUM
> END IF
> NEXT n
> FOR n = 1 TO 100
> LET NUM = A(n)
> IF MOD(NUM,2)=0 THEN
> LET S_EVEN = S_EVEN + 1
> ELSE
> LET S_ODD = S_ODD + 1
> END IF
> NEXT n
> PRINT "SUM ", SUM
> PRINT "EVEN ", EVEN
> PRINT "#EVEN ", S_EVEN
> PRINT "ODD ", ODD
> PRINT "#ODD ", S_ODD
> END
>
> ところがMODの計算で上手く分岐出来ません。
> 実行はしてくれるんですが、計算結果が望まれたものと違います。
> 何か文法的に間違ってるのでしょうか。
A(n)に代入された数値がMAXNUM/100の倍数なので,数値変数の精度の範囲でいうと全部偶数です。
10進1000桁モードで実行してみると,違う結果が得られると思います。
MAXNUMの意味を誤解しているのかもしれません。MAXNUMは整数として精度が保証される最大数ではありません。
|
|
投稿者:came_tongue
投稿日:2020年 7月30日(木)15時54分24秒
|
|
|
> No.4864[元記事へ]
SHIRAISHI Kazuoさんへのお返事です。
すみません。そもそもMAXNUMが何を返すか見てなかったこちらの失敗です(何らかのconcreteな整数を返すと思い込んでいました)。
それに、単純に10のべき乗を使っても、処理系が返す浮動小数点の桁数以上だったらおかしな結果になりますよね・・・・・。
そっちに気づかないで、条件節の書き方が悪かったのか、とコードを差し替え差し替えハマっていました。
ご助言、ありがとうございます。
もう一つ質問なんですが、古いBASIC(例えばHP BASICとか)で書かれたソースコードをFull BASICに移植する際の注意事項なんかはあるでしょうか?
「こういう辺りで良くハマる」
と言うような助言があれば嬉しいのですが。
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 7月30日(木)16時18分28秒
|
|
|
> No.4865[元記事へ]
came_tongueさんへのお返事です。
> SHIRAISHI Kazuoさんへのお返事です。
>
> すみません。そもそもMAXNUMが何を返すか見てなかったこちらの失敗です(何らかのconcreteな整数を返すと思い込んでいました)。
> それに、単純に10のべき乗を使っても、処理系が返す浮動小数点の桁数以上だったらおかしな結果になりますよね・・・・・。
> そっちに気づかないで、条件節の書き方が悪かったのか、とコードを差し替え差し替えハマっていました。
>
> ご助言、ありがとうございます。
>
> もう一つ質問なんですが、古いBASIC(例えばHP BASICとか)で書かれたソースコードをFull BASICに移植する際の注意事項なんかはあるでしょうか?
> 「こういう辺りで良くハマる」
> と言うような助言があれば嬉しいのですが。
Full BASICに
ON ・・・ GOTO
ON ・・・ GOSUB
の構文がありますが,・・・に書けるのは数値式のみです。たとえば
ON ERROR GOSUB
を書いても文法誤りになりませんが,ERRORは単なる数値変数です。
https://hp.vector.co.jp/authors/VA008683/FAQ_OnError.htm
|
|
|
投稿者:came_tongue
投稿日:2020年 7月30日(木)18時26分37秒
|
|
|
> No.4866[元記事へ]
SHIRAISHI Kazuoさんへのお返事です。
>
> Full BASICに
> ON ・・・ GOTO
> ON ・・・ GOSUB
> の構文がありますが,・・・に書けるのは数値式のみです。たとえば
> ON ERROR GOSUB
> を書いても文法誤りになりませんが,ERRORは単なる数値変数です。
> https://hp.vector.co.jp/authors/VA008683/FAQ_OnError.htm
>
ありがとうございます。
あと、古いBASICで
PRINT: PRINT: PRINT: PRINT: PRINT:
等を良く見かけるんですが(Cで言うprintf("\n\n\n\n\n");ですよね)、これに類する書き方、と言うのはFull BASICに存在するのでしょうか。
あるいは単に、正攻法で
PRINT
PRINT
PRINT
PRINT
PRINT
って書くべきなのでしょうか。
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 7月31日(金)08時07分51秒
|
|
|
> No.4867[元記事へ]
came_tongueさんへのお返事です。
> SHIRAISHI Kazuoさんへのお返事です。
>
>
> >
> > Full BASICに
> > ON ・・・ GOTO
> > ON ・・・ GOSUB
> > の構文がありますが,・・・に書けるのは数値式のみです。たとえば
> > ON ERROR GOSUB
> > を書いても文法誤りになりませんが,ERRORは単なる数値変数です。
> > https://hp.vector.co.jp/authors/VA008683/FAQ_OnError.htm
> >
>
> ありがとうございます。
> あと、古いBASICで
>
> PRINT: PRINT: PRINT: PRINT: PRINT:
>
> 等を良く見かけるんですが(Cで言うprintf("\n\n\n\n\n");ですよね)、これに類する書き方、と言うのはFull BASICに存在するのでしょうか。
> あるいは単に、正攻法で
>
> PRINT
> PRINT
> PRINT
> PRINT
> PRINT
>
> って書くべきなのでしょうか。
Cのprintf("\n\n\n\n\n");に相当することをLinux上で行いたければ
LET n$=CHR$(10)
PRINT n$;n$;n$;n$;n$
です。Windowsだと
LET n$=CHR$(13)&CHR$(10)
PRINT n$;n$;n$;n$;n$
|
|
|
投稿者:came_tongue
投稿日:2020年 8月 1日(土)23時45分44秒
|
|
|
戻る
|