無効な識別子について

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
naughtydog
記事: 2
登録日時: 2005年10月16日(日) 01:23
お住まい: Chiba

無効な識別子について

#1 投稿記事 by naughtydog »

学校の数学の課題で巨大数の約数を求めるプログラムを作りレポートを出すことになり、判定プログラムの構成に取り組んでいるのですが、どうしてもうまくいかないので質問させてください。私は当初N88互換BASICというソフトを用いてプログラムを組んでいたのですが、ActiveBasicには.exeなどの実行ファイルに変換する機能がついているとのことなので、途中からActiveBasicに切り替えました。これはN88互換BASICで作っていたデータですが、そのままだとエラーが大量に出てきてしまうので、ABで動くよう作り直したものです。

コード: 全て選択

#N88BASIC
100 PRINT "調べたい数を入力してenterを押してください。"
105 DIM A,R,N
110 N=2
120 R=A-N*INT(A/N)
130 IF R=0 THEN PRINT N : N=N+1 : GOTO 120
140 N=N+1
150 IF N<INT(SQR(A)) THEN GOTO 120
160 PRINT "入力された数値は上記の数で割り切れます。"
170 PRINT "なお、上に数が表示されていない場合、入力された数値は素数です。" : GOTO 100
これにより確かにエラーの数は減ったのですが、まだ次のようなエラーが出ています。
因数分解.BAS(5) - "INT(A/N)" 無効な識別子です
因数分解.BAS(8) - "SQR(A)" 無効な識別子です

文字式での割り算、ルートなどを認識していないのだと思い調べてみましたが、ヘルプセンター(?)では、INT・SQR両方とも(number)の場合についてしか書いておらず、例文を探しましてもINT内で割り算をしているものを見つける事が出来ませんでした。

INT(A/N)ではAをNで割り、小数点以下を切捨て
INT(SQR(A))では、ルートAの整数部分まで
と表現したかったのですが、ABではどのような表記をすればよいのでしょうか?(ちなみに、最初に利用していたN88互換Basicの方ではこのままで認識されました。)
よろしくお願いします。長文失礼しました...
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

INTとSQRをそれぞれIntとSqrに書き換えれば動きます。
ABでは関数名の大文字と小文字が区別されます。

しかし、AがDimで宣言してからいきなり120で計算に使われているので、
おそらく正しくは動いていないと思われます。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

巨大数については僕も感心があります。

#3 投稿記事 by konisi »

巨大数の扱いはFortranでも無い限り難しいものです。
暇つぶしに16桁の数値の約数を探してくれるプログラムを作ってみましたがどうでしょう?

コード: 全て選択


#N88BASIC
Dim A(1) As Long,S As Long,I As Long,B(1) As Long
Print "このプログラムでは16桁までの数について調べることが出来ます。"
Input "上8桁を入力してください。";A(0)
Input "下8桁を入力してください。";A(1)
S=1
*A
for I=0 To 1
    B(I)=A(I)
Next I
S=S+1
B(0)=B(0) Mod S
B(1)=(B(1)+B(0)*100000000) Mod S
if B(1)=0 then Print S:goto *A
if S<100000000 then goto *A
Print "以上の数で割りきれます。"
これで動くかと。
巨大数をどのように解釈させるかによって随分ソースコードに変異が見られるので、そこらへんはよろしくお願いします。僕の解釈だとこういうソースになりました。という話です。

もしループさせたいのなら2行目と3行目の間に目印(*ST等)を付けて最後の行にgoto文を置くとか
2行目と3行目の間にDo文を置いて最後の行でループさせるとか・・・。
まぁ、改造は任せます。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

16桁程度なら単にQWord型を使えば平気ですよ。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#5 投稿記事 by konisi »

> 16桁程度なら単にQWord型を使えば平気ですよ。
確かにいまはそうですがアレは確か20桁までなので(有効桁数が)、ちょっと考えれば40桁前後の計算も出来ます。割り算や掛け算の方法をちょっと工夫すれば某ソフト(十進BASIC)のように1000桁程度の計算なら簡単に出来ますよ。
まぁ、これは多倍長計算といって・・・詳しくは巨大数からもっと話題が発展した時に説明が必要なら説明しますが。
naughtydog
記事: 2
登録日時: 2005年10月16日(日) 01:23
お住まい: Chiba

言い忘れがありました...すみません

#6 投稿記事 by naughtydog »

回答ありがとうございます。SQR、INTをSqr Intと書き直したところ、これらによるエラーはなくなりました。

それと、今回のレポートで私が判定しなくてはならない数値は7桁と9桁なのですが、9桁の方は別なプログラムを用いて素数であること、また7桁の方には約数があるということを確認しました。
私はその約数が何であるかを発表中に表示させることが出来ればと考え、今回のプログラム作成に取り組んでいる次第です。このような説明は本来であれば一番最初に書くべき事だったのですが、忘れてしまいました。申し訳ありませんでした。

>イグトランス様
> しかし、AがDimで宣言してからいきなり120で計算に使われているので、
> おそらく正しくは動いていないと思われます。
仰る通りです。元々はINPUT "メッセージ";Aという一纏めにした記述をしていたのですが、PRINTとinputで分けた際に消したまま忘れてしまっていたようです。(ただひたすら数が増えるだけのプログラムになってしまっていました)

そこで、Dimを2行目に移動し、3行目PRINTの下へ
107 Input "調べたい数は",A
と入れたところ、今度は
因数分解.BAS(4) - ""調べたい数は"" 無効な識別子です
というエラーメッセージが表示されました。
これについて調べてみたところ、http://www.discoversoft.net/forum/viewtopic.php?t=326
のようなものに行き着きました。

また質問なのですが、これはメッセージ部分でエラーが出ているのだと思うのですが、メッセージを入力した後に数値入力用のボックス(変数A入力用)を出すにはこれ以外に何か特別な記述が必要なのでしょうか?
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

Re: 言い忘れがありました...すみません

#7 投稿記事 by konisi »

> そこで、Dimを2行目に移動し、3行目PRINTの下へ
> 107 Input "調べたい数は",A
> と入れたところ、今度は
> 因数分解.BAS(4) - ""調べたい数は"" 無効な識別子です
> というエラーメッセージが表示されました。
107 Input "調べたい数は";A
と直してみてください。これでうまく動かなかったら返信下さい。
返信する