こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

fortranで・・・

実行の画面に数字を入力すると、
英語の文章と
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
です。

投稿日時 - 2004-12-15 15:39:02

QNo.1128186

すぐに回答ほしいです

質問者が選んだベストアンサー

> 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 などが余分です)。

投稿日時 - 2004-12-16 17:44:19

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

> 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

とするつもりだったのでしょうか。
(でもそれだとゼロで除算してしまいますけど。)

投稿日時 - 2004-12-15 21:26:02

お礼

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

投稿日時 - 2004-12-16 13:43:25

ANo.1

実は良く解らないのですがREAD(5,50) Aの意味は
装置番号5のデータAを行番号50のフォーマットに
従って読めという意味です。

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

**はべき乗を意味します。
1Hは今で言うcharみたいです。

投稿日時 - 2004-12-15 20:16:54

お礼

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

投稿日時 - 2004-12-16 13:46:20