Linux版Decimal Basicに付いて

 投稿者:came_tongue  投稿日:2020年 7月29日(水)22時46分35秒
  Linux版Decimal Basic(gtk版)を使用してみました。
JIS FullBASICの仕様書と格闘してたんですが、分からないところがあるので質問させて下さい。

1. IF 条件 THEN 単純実行文 ELSE 単純実行文 END IFについて。

どうも仕様書見てみても「単純実行」の定義を見つけられなかったんですが、これは「一つの式」ないしは文しか実行出来ない、って事でしょうか。
例えば、

IF 条件 THEN
 何か実行1
 何か実行2
ELSE
 ....

と言う形式は認められていない、と言う事なのでしょうか。

2. プログラムを書いてみたけど条件分岐が上手く行かない。

ヘッタクソなプログラムですが、次のようなモノを書いてみました。

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の計算で上手く分岐出来ません。
実行はしてくれるんですが、計算結果が望まれたものと違います。
何か文法的に間違ってるのでしょうか。
(例えばNUM = A(n)と言うのが一回使われたらGCが回収に来る、とか)
 

Re: Linux版Decimal Basicに付いて

 投稿者:SHIRAISHI Kazuo  投稿日:2020年 7月30日(木)11時34分34秒
  > No.4862[元記事へ]

単純実行文の完全な定義は,JIS Full BASIC 付属書E(生成規則一覧)にあります。

単純実行文
= ask文|break文|call文|cause-exception文|chain文|
clear文|close文|debug文|delete文|draw文|erase文|
exit-do文|exit-for文|exit-function文|exit-handler文|
exit-picture文|exit-sub文|gosub文|goto文|input文|
let文|line-input文|mat文|mat-input文|mat-line-input文|
mat-print文|mat-read文|mat-rewrite文|mat-write文|
open文|print文|randomize文|read文|restore文|
return文|rewrite文|set文|stop文|trace文|write文|
数値関数定義let文|図形出力文|図形入力文|
変形指示mat文|文字列関数定義let文|例外処理区戻り文

簡単にいうと,実行文のうち,構造文でないもののことです。

IF文には,一行に書くタイプと構造IF文(IF~END IF)の2タイプがあります。
一行に書く形のIF文には単純実行文を一つ(ELSE部にも1つ,計2つ)しか書けません。

IF 条件 THEN
 何か実行1
 何か実行2
ELSE
  ・・・
  ・・・
END IF
の形のIF文はIF行とELSE行,ELSE行とEND IF行の間に構造文も含めて複数行書くことができます。






 

Re: Linux版Decimal Basicに付いて

 投稿者: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は整数として精度が保証される最大数ではありません。



 

Re: Linux版Decimal Basicに付いて

 投稿者:came_tongue  投稿日:2020年 7月30日(木)15時54分24秒
  > No.4864[元記事へ]

SHIRAISHI Kazuoさんへのお返事です。

すみません。そもそもMAXNUMが何を返すか見てなかったこちらの失敗です(何らかのconcreteな整数を返すと思い込んでいました)。
それに、単純に10のべき乗を使っても、処理系が返す浮動小数点の桁数以上だったらおかしな結果になりますよね・・・・・。
そっちに気づかないで、条件節の書き方が悪かったのか、とコードを差し替え差し替えハマっていました。

ご助言、ありがとうございます。

もう一つ質問なんですが、古いBASIC(例えばHP BASICとか)で書かれたソースコードをFull BASICに移植する際の注意事項なんかはあるでしょうか?
「こういう辺りで良くハマる」
と言うような助言があれば嬉しいのですが。
 

Re: Linux版Decimal 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
 

Re: Linux版Decimal Basicに付いて

 投稿者: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

って書くべきなのでしょうか。
 

Re: Linux版Decimal Basicに付いて

 投稿者: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$


 

Re: Linux版Decimal Basicに付いて

 投稿者:came_tongue  投稿日:2020年 8月 1日(土)23時45分44秒
  > No.4869[元記事へ]

SHIRAISHI Kazuoさんへのお返事です。

色々と教えてもらってありがとうございました。
 

戻る