プロが教える店舗&オフィスのセキュリティ対策術

実行の画面に数字を入力すると、
英語の文章と
0.0 0.0 0.0
-NaN -NaN -NaN
という文字が出てくるだけなんですが、これはプログラムが組めていないということなのでしょうか?
ちなみに、打ったプログラムは、
C 判別関数
WRITE(*,100)
100 FORMAT(1H1/22X,'判別関数モデル'//19X,'消費量',3X,'消費比率'//19X,
+'清酒',5X,'焼酎',5X,'ビール',7X,'清酒',6X,'ビール',7X,'M'10X,'D'/
+/)
DO 10 I=1,47
CALL SUB1
10 CONTINUE
STOP
END
SUBROUTINE SUB1
DIMENSION B1(3),B2(3),C(3),L(3),P(3)
CHARACTER*12 A
READ(5,50) A
50 FORMAT(3F8.1,3F7.1)
X=1.0
DO 11 K=1,300
Y1=(-1.0)
Y2=0.0
DO 12 J=1,3
B2=0.0
B1=0.0
L(J)=(-NINT(B1(J)*10.0/B2(J)))
S1=Y1+X**L(J)
S2=Y2+L(J)*X**(L(J)-1)
Y1=S1
Y2=S2
12 CONTINUE
W=X-Y1/Y2
IF(ABS(W-X).LT.1E-10) GO TO 13
X=W
11 CONTINUE
13 WO=W
DO 14 J=1,3
C(J)=WO**L(J)
14 CONTINUE
R1=0.0
DO 15 J=1,3
R2=R1+B2(J)
R1=R2
15 CONTINUE
D=0.0
DO 16 J=1,3
P(J)=B2(J)/R1
DO=D+P(J)*ALOG(P(J)/C(J))
D=DO
16 CONTINUE
E=0.0
DO 17 J=1,3
EO=E+(B1(J)/B2(J)*P(J))
E=EO
17 CONTINUE
WRITE(*,200) A,B2,P,E,D
200 FORMAT(1H,2X,A12,3X,3(F7.1,2X),4X,3(F9.6,X),4X,F9.6,2X,F9.6)
RETURN
END
です。

A 回答 (3件)

> B1(J), B2(J) に値が代入される前に参照していますね。


と書いてしまいましたが、ちょっと勘違いで、
B1 = 0.0
で B(1)~B(3) のすべてに 0 が格納されるのでした(少なくともFortran90では)。
でも、やっぱり 0 での除算が起こりますが。

まず、ソース全体を載せただけではよく分からないので、何がしたいのかを書くべきです。できれば、入力としてどのようなデータをどのような形式で入力し、どのような計算方法を用いて何を計算し、結果をどのような形式で出力するかを示してください。

エラーになる原因ですが、入力部分

> READ(5,50) A
> 50 FORMAT(3F8.1,3F7.1)

に問題があるようです。おそらく入力は「文字列(12文字)と6個の実数値」で1行を構成していて、それが47行並んでいるのではないかと思われます。おそらく

READ(5,50) A,B1,B2
50 FORMAT(A12,3F8.1,3F7.1)

のようなことがしたいのでしょうか。こうすると、1行のデータが変数 A, B1(1)~B1(3), B2(1)~B2(3) に代入されます。で、B1, B2 には値が格納されたので、後ろの

> B2=0.0
> B1=0.0

は削除します。これでとりあえず、何らかの値は計算されるとおもいます(入力があってれば、多分)。何を計算しているのかは分かりませんが。

あと、たびたび

> DO 17 J=1,3
> EO=E+(B1(J)/B2(J)*P(J))
> E=EO
> 17 CONTINUE

のような表現が見られますが、

DO 17 J=1,3
E=E+(B1(J)/B2(J)*P(J))
17 CONTINUE

でいけますので(変数 EO などが余分です)。
    • good
    • 0

> READ(5,50) A


> 50 FORMAT(3F8.1,3F7.1)

これも問題ですが、それ以外に23行目

> L(J)=(-NINT(B1(J)*10.0/B2(J)))

で、B1(J), B2(J) に値が代入される前に参照していますね。
直前の行で

B2(J)=0.0
B1(J)=0.0

とするつもりだったのでしょうか。
(でもそれだとゼロで除算してしまいますけど。)
    • good
    • 0
この回答へのお礼

ありがとうございます。
では、B2(J)=0.0 B1(J)=0.0 となおせばいいということなのでしょうか??すいません、、初心者なもので・・・

お礼日時:2004/12/16 13:43

実は良く解らないのですがREAD(5,50) Aの意味は


装置番号5のデータAを行番号50のフォーマットに
従って読めという意味です。

3F8.1は 小数点以下1位で整数部分は6桁のデータ
が三個で3F7.1は同様に整数部分は5桁小数点1位の
データが三個ある。というので入力データがカード
リーダーより合計6個有ることになりますね。

**はべき乗を意味します。
1Hは今で言うcharみたいです。
    • good
    • 0
この回答へのお礼

早くに返事をくださってありがとうございます。。
ということは、プログラムがまだ成立していないということなのでしょうか?翻訳できたので、通ったつもりでいたのですが・・・

お礼日時:2004/12/16 13:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!