• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FORTRAN77のプログラム)

FORTRAN77のテスト点数を読み込み、平均点と分散を求めるプログラムの問題点とは?

このQ&Aのポイント
  • 大学のFORTRAN77の授業で、配列を使ってN人のテスト点数の平均点と分散を求める課題が出されました。
  • 提供されたプログラムでは、平均点と分散が正しく計算されず、最高点と最低点も表示されません。
  • また、コンパイル後に「ファイルのタイムスタンプが変化していません」と表示され、上書き保存の前のバージョンが実行されます。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

> コンパイル時に、「(ファイル名.exe)のタイムスタンプは変化していません」と表示されることです。 コンパイルに失敗しているためです。 例えば、今日の12:00にコンパイルしたときにはうまくいき、 実行ファイルができたとします。 すると、実行ファイルのタイムスタンプは12:00になっています。 その後、ソースコードに手を加えて、12:30にもう一度コンパイルしたところ、 コードに誤りがあってうまくいかなかったとします。 このとき、ソースコードは修正済みなのでタイムスタンプは12:30になっています。 しかし、実行ファイルのタイムスタンプは12:00のままです。 「(ファイル名.exe)のタイムスタンプは変化していません」のメッセージが出たときは、 コンパイル時のエラーメッセージの内容を確認してください。 私はFORTRANから離れて久しいため、正確なところはわかりませんが、 > IF(A(K).LT.0.0) GO TO 1 THEN この文は正しいですか?

maydraft
質問者

補足

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

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

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

maydraft
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

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

maydraft
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

> INTEGER P,Q,N,K,A(1:N) この時点ではNの値が決まっていないため、 どれだけの要素数を持つ配列Aを定義すればよいか、 コンパイラにはわからないのでありましょう。 例えば「最大100人まで対応する」という仕様にしたとすると、 A(1:100)という定義をすればよいはずです。 そして、実行時にNの値を入力させればよいでしょう。 このとき、Nが1~100の範囲になければ、再入力を促すか、 思い切ってプログラムを終了させてしまうか、でしょう。 最高点・最低点の件は、それぞれを格納するための変数を用意し、 例えば最高点を-999、最低点を999(テストの点数としてあり得ない範囲)に初期化しておきます。 そして、各人の点数を入力した直後に、  ・今入力した点数が最高点より大きければ、その点数を最高点とする  ・今入力した点数が最低点より小さければ、その点数を最低点とする という処理を加えます。 こうすれば、全員の点数を入力し終わった時点で、 最高点と最低点を正しくセットしているはずです。

maydraft
質問者

補足

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

関連するQ&A