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

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

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

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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% (2126/6288)
回答No.4

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

maydraft
質問者

お礼

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

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

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

maydraft
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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

  • Fortran77のプログラム実行時にエラー

    Windows98でCPad for Salford FTN77というソフトを使って、Fortran77のプログラミングをしています。そこで学校での課題で、下のようなプログラムを作ったのですが、実行すると次のようなエラーがでます。 The insrtuction at address 0373f5b0 attempted to read from an illegal location 0373f5b0 routine at address 373F5B0 [+0000] 00401000 main [+074f] で、ファイルに書き込めてるかどうかチェックすると、何も書き込めていません。どうすれば、ちゃんと動くのでしょうか。どなたか分かる方、宜しくお願いします。 プログラム↓ *生徒50人の成績を読み込み平均点などを計算し、ファイルに書き込む PROGRAM GOKAMOKU HEIKIN INTEGER N(1:50),EP(1:50),MP(1:50),JP(1:50),SP(1:50),CP(1:50) INTEGER SUM(1:50),K,I,L,J,M,Q REAL PAV(1:50),PVX(1:50),PSD(1:50),EAV,ESD,MAV,MSD,JAV,JSD REAL SAV,SSD,CAV,CSD CHARACTER FNAME*30,SHUTURYOKU*20,CN*50,SHUTURYOKU2*20 READ(5,*)FNAME READ(5,*)SHUTURYOKU OPEN(1,FILE=FNAME) DO 10 K=1,50 READ(1,*)N(K),EP(K),MP(K),JP(K),SP(K),CP(K) 10 CONTINUE CLOSE(1) *英語の平均点、標準偏差の計算 OPEN(2,FILE=SHUTURYOKU) CALL AVEETC(EP,EAV,ESD) WRITE(2,*)'英語の平均点・標準偏差' WRITE(2,300) EAV,ESD 300 FORMAT(2F6.2) *数学の平均点、標準偏差の計算 CALL AVEETC(MP,MAV,MSD) WRITE(2,*)'数学の平均点・標準偏差' WRITE(2,300) MAV,MSD *国語の平均点、標準偏差の計算 CALL AVEETC(JP,JAV,JSD) WRITE(2,*)'国語の平均点・標準偏差' WRITE(2,300) JAV,JSD *理科の平均点、標準偏差の計算 CALL AVEETC(SP,SAV,SSD) WRITE(2,*)'理科の平均点・標準偏差' WRITE(2,300) SAV,SSD *社会の平均点、標準偏差の計算 CALL AVEETC(CP,CAV,CSD) WRITE(2,*)'社会の平均点・標準偏差' WRITE(2,300) CAV,CSD *各生徒の合計点、平均点、標準偏差の計算 DO 50 K=1,50 SUM(K)=EP(K)+MP(K)+JP(K)+SP(K)+CP(K) PVX(K)=EP(K)**2+MP(K)**2+JP(K)**2+SP(K)**2+CP(K)**2 PAV(K)=REAL(SUM(K))/5.0 PSD(K)=SQRT(PVX(K)/5.0-PAV(K)**2) 50 CONTINUE WRITE(2,*)'各生徒の合計点、平均点、標準偏差' WRITE(2,*)'番号 合計 平均点 標準偏差' DO 60 K=1,50 WRITE(2,200)K,SUM(K),PAV(K),PSD(K) 60 CONTINUE 200 FORMAT(I3,I5,2F10.2) *合計点のヒストグラムを書く DO 70 J=0,9 JL=10*J JH=JL+9 CALL STR(SUM(J),CN) WRITE(2,400)JL,JH,CN 70 CONTINUE 400 FORMAT(1X,I2,'-',I2,'I',A50) *英語の点数順に並べ変え DO 20 L=1,49 DO 30 I=L+1,50 IF(EP(L).LT.EP(I)) THEN M=EP(I) EP(I)=EP(L) EP(L)=M Q=N(I) N(I)=N(L) N(L)=Q END IF 30 CONTINUE 20 CONTINUE *表示 WRITE(2,*)'英語の成績高い順' WRITE(2,*)'番号 点数' DO 40 J=1,50 WRITE(2,100)N(J),EP(J) 40 CONTINUE 100 FORMAT(I2,I3) END SUBROUTINE AVEETC(P,AV,SD) REAL AV,SD INTEGER P(1:50) WX=0.0 VX=0.0 DO 10 K=1,50 WX=WX+P(K) VX=VX+P(K)*P(K) 10 CONTINUE AV=REAL(WX)/50.0 SD=SQRT(REAL(VX)/50.0-AV**2) END SUBROUTINE STR(SUM,C) INTEGER SUM CHARACTER C*50 DO 10 K=1,50 IF(K.LE.SUM(K))THEN C(K:K)='*' ELSE C(K:K)=' ' END IF 10 CONTINUE END

  • FORTRAN…これってどんなプログラムになりますか??

    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,B1,B2 50 FORMAT(A12,3F8.1,3F7.1) X=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 L(J)=(-NINT(B1(J)*10.0/B2(J))) Y1=Y1+X**L(J) Y2=Y2+L(J)*X**(L(J)-1) 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 D=D+P(J)*ALOG(P(J)/C(J)) 16 CONTINUE E=0.0 DO 17 J=1,3 E=E+(B1(J)/B2(J)*P(J)) 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

  • 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 です。

  • FORTRAN→Cに翻訳

     どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。  プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ C□LEAST SQUARE APPROXIMATION □PROGRAM MAIN9 □DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10) □WRITE(*,*) 'N ?' □READ(*,*) N □WRITE(*,*) 'x1,x2,..,xn ?' □READ(*,*) ( X(I),I=1,N ) □WRITE(*,*) 'y1,y2,..,yn ?' □READ(*,*) ( Y(I),I=1,N ) □WRITE(*,*) 'M ?' □READ(*,*) M □DO 110 K=0,M*2 □□VS=0. □□DO 100 I=1,N □100□VS=VS+X(I)**K □□S(K)=VS □110□CONTINUE □□DO 130 K=0,M □□□VS=0. □□□DO 120 I=1,N □120□VS=VS+Y(I)*X(I)**K □□□T(K)=VS □130 CONTINUE □□DO 140 I=1,M+1 □□□DO 140 J=1,M+1 □□□□K=I+J-2 □□□□SM(I,J)=S(K) □140 CONTINUE □□DO 150 I=1,M+1 □150 TV(I)=T(I-1) □□CALL SIMULE( AV, SM, TV, M+1 ) □□DO 160 I=1,M+1 □160 WRITE(*,1000) I-1,AV(I) □1000 FORMAT(1H ,'A',I1,'=',F10.5) □□STOP □□END ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  • FORTRANの出力データの左寄せができません。

    素数を一万個見つけてそれを規定のフォーマットでTXTファイル出力しなければいけないのですがRANGEの右側の列をハイフンのすぐ隣に左寄せしてファイルに出力したいのですがどうしてもよくわかりません。FやE使って試しましたがエラーが出てコンパイルできなかったです。左寄せ以外にももっと効率のいいコーディングありましたらアドバイスいただけませんか? FORMAT110の真ん中のI6なんですけどこの値が右寄せでTXTファイルに残ります。最初のI6が右寄せでハイフンはさんで二個目のI6が同じ右寄せだとみっともないのです。 110 FORMAT(I6, 1X, ('-'), 1X, I6, T17, 12(2X, I6)) S = 1  L = 12 WRITE (15,110) S, L, P(S:L) DO 60 S = S + 12,10000,12 L = L + 12 IF ( S .EQ. 9985 .AND. L .EQ. 9996) THEN A = S + 12 B = L + 4 WRITE (15,110) A, B, P(A:B) GO TO 99 ELSE WRITE (15,110) S, L, P(S:L) END IF 60 CONTINUE C END IF 99 CLOSE (15) END

  • 統計学の問題

    統計学の問題です。どなたか回答を教えてください。 よろしくお願い致します。 Q3. 確率変数Xは平均510、標準偏差370の正規分布に従うとする。つぎの確率,あるいは確率点を求めなさい。 (1) P(X>860)= (2) P(450<X<1150)= (3) P(X>k)=0.025となるkを求めなさい。 k= Q4. Q3の正規分布を母集団として,そこから抽出したn=25個の無作為抽出標本の標本平均をMとおく。標本平均Mの分布について答えなさい。 (1) P(M<570)= (2) P( 350<M<710)= (3) P(M<k)=0.05となるkを求めなさい。 k= Q5. 表が出る確率が(U2/700)である(いかさま)コインをについて以下では答えなさい。 (1) このコインをU1回投げたとき,表が出る回数をXとおく。確率変数Xの分布に関して,その平均と分散を答えなさい。 (2) 同じコインを今度は200回投げたときに表が出る回数をYとする。 a.このとき平均E(Y)よりも,10回以上表が多く出る確率を求めなさい。 P{Y≧E(Y)+10}= b.P(Y<k)=0.025となるkを求めなさい。 k= よろしくお願い致します。

  • 統計学 確率分布の問題

    こんにちは。統計学を勉強している者ですが、 次の問題が解けずに困っています。  n個の確率変数 X1, X2, … Xnが、  次の母集団分布からのランダム標本であるとする。  P(X=1)=p , P(X=0)=1-p=q  このとき、Y=X1+X2+…+Xnの確率分布を求めよ。  また、Yの平均と分散を求めよ。 という問題です。 Yの確率分布は、P(X=1)が選ばれる回数をkとすると nCk * p^k * q^(n-k) になると思うのですが…。 確率分布と言われると、どう答えてよいのかわかりません。 平均と分散は、この確率分布の答えをもとにして 出せばいいのですか? kやnをどう駆使して算出すればよいのでしょう? 答えの分かる方、詳しく解説してもらえると助かります。

  • fortranエラーに・・・なってしまいます

    DIMENSION B1(3),B2(3),C(3),L(3),P(3),AS(3,7),X(7),HSI(3) CHARACTER A*12 READ(5,50)A 50 FORMAT(A12) READ(5,100)B1,B2 100 FORMAT(3F8.1,3F7.1) Z=1.0 DO 11 K=1,300 Y1=(-1.0) Y2=0.0 DO 12 J=1,3 L(J)=(-NINT(B1(J)/B2(J))) S1=Y1+Z**L(J) S2=Y2+L(J)*Z**(L(J)-1) Y1=S1 Y2=S2 12 CONTINUE W=Z-Y1/Y2 IF(ABS(W-Z).LT.1E-10) GO TO 13 Z=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 P(1)=B2(1)/R1 P(2)=B2(2)/R1 P(3)=B2(3)/R1 AS(1,1)=1.0 AS(1,2)=0.0 AS(1,3)=0.0 AS(2,1)=0.0 AS(2,2)=1.0 AS(2,3)=0.0 AS(3,1)=0.0 AS(3,2)=0.0 AS(3,3)=1.0 AS(1,6)=0.0 AS(1,7)=C(1) AS(2,5)=0.0 AS(2,7)=C(2) AS(3,4)=0.0 AS(3,7)=C(3) CALL SUB2(B1(1),B2(1),B1(2),B2(2),AS(1,4),AS(2,4)) CALL SUB2(B1(1),B2(1),B1(3),B2(3),AS(1,5),AS(3,5)) CALL SUB2(B1(2),B2(2),B1(3),B2(3),AS(1,6),AS(3,6)) DO 17 J=1,7 X(J)=0.1428

  • FORTRAN90

    fortran90で、ファイル出力をフォーマット付きで行いたいのですが、 write(unit,****) のような文で、****の部分のフォーマット指定を マニュアルで入力するのではなく、その場に応じた形で 指定する方法はありますでしょうか? character変数の文字にフォーマット指定の文字列、例えば六つの実数を横一列に書き出す場合を想定して write(char,"(A,I1,A)")"'(",Int,"D13.5)'" とし、 write(unit,char)x,y,z,w,s,t などとするのはできませんでした。 ここでいうintの部分を自動的に変えれるようにしたいのですが 何か策はありますでしょうか? わかりにくい説明ですみませんが宜しくおねがいします。

  • fortran77教えてください

    fortran77のプログラムについての質問です。 次のプログラムを実行するとどのような結果になるか教えてください REAL A,B,C,D,E,F A=7.0 B=5.0 CALL WASA(A,B,C,D) CALL WASA(C,D,E,F) WRITE(*,*)E,F STOP END SUBROUTINE WASA(P,Q,R,S) REALP,Q,R,S R=P+Q S=P-Q RETURN END