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

解決済みの質問

FORTRAN77のプログラム

大学で、FORTRAN77のプログラミング授業で
「配列を用いてN人のテストの点数を読み込み、その平均点と分散を求めなさい。またその最高点と最低点を表示しなさい。ただし、負の点数の入力で計算をストップさせることにする。」
という課題がでました。自分なりにプリントなどを見つつ、以下のようにプログラミングしたのですが、平均点も分散も変な値がでます。また、最高点、最低点は表示されません。どこがおかしいのでしょうか?分かる方いらっしゃいましたら教えて下さい。
ちなみに分散は、(ΣXi^2)/N-(平均点)^2です。
あと気になる事は、コンパイル時に、「(ファイル名.exe)のタイムスタンプは変化していません」と表示されることです。そのあともう一度コンパイル&実行をすると、プログラムは動くのですが、上書き保存する前の動きをするので、どうしたものかと困っています。

プログラム↓
PROGRAM HAIRETU HEIKINTEN
INTEGER P,Q,N,K,A(1:N)
REAL WX,VX,AV,SD,M
WRITE(*,*)'負の点数を入力すると終了します'
WX=0.0
VX=0.0
DO 10 K=1,N
WRITE(*,*)'番号',K,'の点数は?'
READ(*,*) A(K)
IF(A(K).LT.0.0) GO TO 1 THEN
WX=WX+A(K)
VX=VX+(A(K)**2)
10 CONTINUE
1 AV=WX/REAL(K-1)
SD=VX/REAL(K-1)-AV*AV
DO 20 P=1,K-2
DO 30 Q=P+1,K-1
IF(A(P).GT.A(Q))THEN
M=A(Q)
A(Q)=A(P)
A(P)=M
END IF
30 CONTINUE
20 CONTINUE
WRITE(*,100) AV
WRITE(*,200) SD
WRITE(*,300) K-1
WRITE(*,400) A(K-1)
WRITE(*,500) A(1)
100 FORMAT(5X,'平均点=',F5.1)
200 FORMAT(5X,'分散=',F5.1)
300 FORMAT(5X,'生徒数=',I5)
400 FORMAT(5X,'最高点=',F5.1)
500 FORMAT(5x,'最低点=',F5.1)
END

投稿日時 - 2007-06-09 13:37:26

QNo.3069488

すぐに回答ほしいです

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

> コンパイル時に、「(ファイル名.exe)のタイムスタンプは変化していません」と表示されることです。

コンパイルに失敗しているためです。
例えば、今日の12:00にコンパイルしたときにはうまくいき、
実行ファイルができたとします。
すると、実行ファイルのタイムスタンプは12:00になっています。
その後、ソースコードに手を加えて、12:30にもう一度コンパイルしたところ、
コードに誤りがあってうまくいかなかったとします。
このとき、ソースコードは修正済みなのでタイムスタンプは12:30になっています。
しかし、実行ファイルのタイムスタンプは12:00のままです。

「(ファイル名.exe)のタイムスタンプは変化していません」のメッセージが出たときは、
コンパイル時のエラーメッセージの内容を確認してください。

私はFORTRANから離れて久しいため、正確なところはわかりませんが、

> IF(A(K).LT.0.0) GO TO 1 THEN

この文は正しいですか?

投稿日時 - 2007-06-09 14:16:25

補足

確認したら、エラーメッセージがでていました。ご指摘ありがとうございます。
とりあえず
>IF(A(K).LT.0.0) GO TO 1 THEN
のところのTHENをとってみたら、エラーが2から1に減りました。
あとは
>INTEGER ~,A(1:N)
というところがダメみたいです。
Nのところを数字にしなくてはいけないのでしょうか?でも、課題では「N人の」となっているのでどうしたらいいのでしょうか。とりあえずそこの所を
INTEGER ~,A(1:10000)
としたら、平均点、分散、生徒数はうまくでました。(5人でためしました)
ただ、最高点と最低点がうまくでません。どなたか分かる方、よろしくお願いします。

投稿日時 - 2007-06-09 14:40:23

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

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

回答(4)

ANo.4

> 400 FORMAT(5X,'最高点=',F5.1)
> 500 FORMAT(5x,'最低点=',F5.1)

もしかして、INTEGER型の最高点・最低点をF5.1の書式で
出力しようとしているために、エラーが出ているのではありませんか?
I5あたりに修正してみると、どうなるでしょうか?

投稿日時 - 2007-06-09 16:01:54

お礼

そのとおりでした。お答えありがとうございました。

投稿日時 - 2007-06-09 16:04:26

ANo.3

> 点数を「-6」などと入力すると終わるしくみにしなければいけません。

この仕様を見落としていました。申し訳ありません。
ところで、最高点・最低点のところで出るメッセージとはどういった内容ですか?
単に「エラーが出ます」だけですと、こちらに状況が正しく伝わってこないのです。

投稿日時 - 2007-06-09 15:56:33

お礼

よくみたら、最高点、最低点を表示するFORMAT文が間違っていたので、エラーがでたようです。訂正して確かめてみたところ、ちゃんとできました。丁寧にお答えいただきありがとうございました。本当に助かりました。

投稿日時 - 2007-06-09 16:03:15

ANo.2

> INTEGER P,Q,N,K,A(1:N)

この時点ではNの値が決まっていないため、
どれだけの要素数を持つ配列Aを定義すればよいか、
コンパイラにはわからないのでありましょう。

例えば「最大100人まで対応する」という仕様にしたとすると、
A(1:100)という定義をすればよいはずです。
そして、実行時にNの値を入力させればよいでしょう。
このとき、Nが1~100の範囲になければ、再入力を促すか、
思い切ってプログラムを終了させてしまうか、でしょう。

最高点・最低点の件は、それぞれを格納するための変数を用意し、
例えば最高点を-999、最低点を999(テストの点数としてあり得ない範囲)に初期化しておきます。
そして、各人の点数を入力した直後に、
 ・今入力した点数が最高点より大きければ、その点数を最高点とする
 ・今入力した点数が最低点より小さければ、その点数を最低点とする
という処理を加えます。
こうすれば、全員の点数を入力し終わった時点で、
最高点と最低点を正しくセットしているはずです。

投稿日時 - 2007-06-09 15:14:17

補足

Nを入力させたいところなのですが、課題が、「負の点数の入力で計算をストップさせること」、となっているので、たとえば、点数を「-6」などと入力すると終わるしくみにしなければいけません。最高点と最低点は、ご指摘通り、以下のようにプログラミングしてみたのですが、プログラムを実行させ、平均点などを出す段階になると、平均点、分散、生徒数は表示してくれるのですが、最高点、最低点は、エラーメッセージがでて、値を表示してくれません。これは、ソフトがだめなのでしょうか?それともプログラムがいけないのでしょうか?どなたか分かる方よろしくお願いします。

プログラム↓
PROGRAM HAIRETU HEIKINTEN
INTEGER A(1:10000)
INTEGER N,K,M,L
REAL WX,VX,AV,SD
WRITE(*,*)'負の点数を入力すると終了します'
WX=0.0
VX=0.0
DO 10 K=1,N
WRITE(*,*)'番号',K,'の点数は?'
READ(*,*) A(K)
IF(A(K).LT.0.0) GO TO 1
M=-999
L=999
IF(A(K).GT.M) M=A(K)
IF(A(K).LT.L) L=A(K)
WX=WX+A(K)
VX=VX+(A(K)**2)
10 CONTINUE
1 AV=WX/REAL(K-1)
SD=VX/REAL(K-1)-AV*AV
WRITE(*,100) AV
WRITE(*,200) SD
WRITE(*,300) K-1
WRITE(*,400) M
WRITE(*,500) L
100 FORMAT(5X,'平均点=',F5.1)
200 FORMAT(5X,'分散=',F5.1)
300 FORMAT(5X,'生徒数=',I5)
400 FORMAT(5X,'最高点=',F5.1)
500 FORMAT(5x,'最低点=',F5.1)
END

投稿日時 - 2007-06-09 15:39:02

あなたにオススメの質問