• 締切済み

fortran77でのif文

FORTRAN77の問題の質問です。 授業でこんな問題が出て困ってます。 あるクラスにN人います。 そのクラスの平均身長がXです。 そのN人の中で、X以上の身長の人数Aを印刷するプログラムを作れと言う問題です。 ここで、IF~THENを使いなさい。 分かる人がいたら教えてください。 PROGRAM TEST7 WRITE(*,*)\'x人分の身長データを入力 READ(5,*)x WRITE(*,*)\'身長のボーダーラインを入力\' READ(5,*)G A=A-G B=B-G C=C-G D=D-G E=E-G F=F-G IF(A.GT.0) THEN STOP END 途中までは、こんな感じかと思ったのですが、行き詰ってしまいました。

みんなの回答

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.3

時間が無かったので適当に1文字変数を使用しましたが、意味の分かる変数名を付けるのが正しいやり方です。 適当にやった為に、[人数]と[ボーダーライン以上の人数のカウンタ]の両方にNを使ってしまいました。別の変数を割り当ててください。 ロジックを日本語で説明しますので説明とプログラムが合っているかは自分で確認してください。[名称]を適当な変数に置き換えて考えてください。 10 [人数]を入力する 20 [身長のボーダーライン]を入力する 30 [ボーダーライン以上の人数のカウンタ]を0に初期化 40 [入力した人数のカウンタ]を0に初期化 50 [入力した人数のカウンタ]を+1 60 [身長]を入力 70 IF [身長]≧[身長のボーダーライン] THEN [ボーダーライン以上の人数のカウンタ]を+1 80 IF [入力した人数のカウンタ] < [人数] THEN 60行に戻る 90 [ボーダーライン以上の人数のカウンタ] を出力 100 STOP 110 END

kojiandkoj
質問者

補足

解答ありがとうございます。 早速、やってみた結果が以下のプログラムになりました。 PROGRAM TEST7 WRITE(*,*)'A人分の身長データを入力 READ(5,*)A WRITE(*,*)'身長のボーダーラインBを入力' READ(5,*)B D=0 C=0 10 C=C+1 WRITE(*,*)'各々の身長のデータを入力' READ(5,*)M IF (M.GE.A) THEN D=D+1 IF (C.LT.A) THEN GO TO 10 WRITE(*,*)N STOP END これでも、コンパイルに失敗するのですが、どこが間違っているか 教えて欲しいのですが… *よく、IF文の終わりに、endifを書いてるのを見るのですが  この場合には必要ないのでしょうか?

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

ロジック自体は何言語で書いても変わりませんので適宜修正してください。 1) X以上の身長の人数Aを印刷する  -> 人数が分かればよく、詳細を出せとは書いてない。 2) IF~THENを使えって事ですが  -> 問題レベルからして配列やDO文が使用されるとは思えない 以上を踏まえて次のように解釈しました。 ※ところでFORTRANだよね?変数規約(整数型は宣言しない場合はI~Nで始まる変数)は有効だよね? ※最後に使ったのが…年前だから細かいことは忘れた。 ※チビが寝よう寝ようってうるさいので文法を確認する時間がありません。 PROGRAM TEST7   WRITE(*,*)\'x人分の身長データを入力   READ(5,*)N   WRITE(*,*)\'身長のボーダーラインを入力\'   READ(5,*)L   N=0   I=0 10 I=I+1   READ(5,*)M   IF (M.GE.L) THEN N=N+1   IF (I.LT.N) THEN GOTO 10   WRITE(*,*)N   STOP   END

kojiandkoj
質問者

補足

早速の解答ありがとうございます。 *Fortranで、変数規約は有効です。 このプログラムをコンパイルしたところ出来ませんでした。 ここで、このように変えたのですが PROGRAM TEST7 WRITE(*,*)'N人分の身長データを入力 READ(5,*)N WRITE(*,*)'身長のボーダーラインLを入力' READ(5,*)L N=0 I=0 10 I=I+1 READ(5,*)M IF(M.GE.L) THEN N=N+1 IF(I.LT.N) THEN GOTO 10 WRITE(*,*)N STOP END Nとは人数のことですよね? READ(5,*)M とは、生徒のデータを入れるんえしょうか? IF (I.LT.N) THEN GOTO 10 の文は必要なんでしょうか? すみませんが、よければ教えてもらえると助かります。

  • uen_sap
  • ベストアンサー率16% (67/407)
回答No.1

これが fortran ?? logic が読めない??

kojiandkoj
質問者

補足

すみません。 まだ、習ったばかりでlogicが分かりません。 よければ、問題だけを見て、これを解くプログラムを 教えてくれると助かります。

関連するQ&A

  • fortran if文

    以下のコードで、xとthetaに5,5と入力しても、出力が5となってしまいます。500になってほしかったんですが・・・ どこが悪いのか教えて下さい。 ----------------------------------------------- read(5,*)x,theta if(0.0d0.LE.x.LE.4.0d0) then eta=theta go to 20 else if(4.0d0.LT.x.LT.7.0d0) then eta=100.0d0*theta go to 20 else if(7.0d0.LE.x.LE.10.0d0) then eta=sqrt(3.0d0*sqrt(2.0d0))*theta go to 20 end if 20 write(6,30) eta 30 format(F10.5) stop end -----------------------------------

  • fortran if文

    fortranのif文で、以下の様に場合わけしてプログラムしたのですが、 このようなエラー文が出ます。どう対処したらいいのか教えて下さい。 Error: An unterminated block exists. プログラム↓ if(-0.5d0.LE.theta.LE.0.0d0) then eta=2 if(0.0d0.LT.theta.LT.0.5d0) then eta=5 if(0.5.LE.theta.LE.1.0d0) then eta=3 場合わけの範囲指定の仕方が不味いのではないかと思っていますが、 どうしていいものかわからず・・ 皆様のお力を貸して下さい。

  • if文の中のif文・・・について

    質問させていただきます。 if文の中のif文の記述の仕方について質問があります。 例えば if ( x > 0 ){ a = b+c; if ( a > 1) d = e+f; ・・・1 if ( a < 1) d = e-f; ・・・2 if ( a = 1 ) d = 1-g; ・・・3 } h = d + i; aが1より大きい場合は、1の処理を、aが1より小さい場合は2の処理を、aが1と同じであった場合、3の処理をして最終的に、h = d + i;の式の d に代入して h を求めたいと思っているのですが、うまくゆきません。 if文の中のif文の記述はどのようにすればよいのでしょうか? よろしければご教示よろしくお願いします。

  • FORTRAN77でプログラミング

    今年、大学の授業でFORTRAN77を使ったプログラミングを勉強することになりました。 今で3回授業が終わったところなのですが、いきなりつまずいてしまい皆さんの知恵をお借りしたいと思います。。 作るプログラムは 問:摂氏(C)、華氏(F)、絶対温度(K)のいずれかの値を { xx(温度の数値),yy(CかFかK) }のように入力したときに、入力した値以外の単位での温度値が表示されるプログラムを作れ。 自分なりに作ってみたのが下のプログラムです。 全く論外なプログラミングをしているかもしれませんが…。 (自作) c234567 implicit none real n,cx,fx,kx character*1 d,c,f,k c n:入力値 d:入力された温度の値 C:摂氏 F:華氏 K:絶対温度 write(*,*) '温度値、単位を表す文字を入力してください。' read(*,*)n,d if(d.eq.c)then cx=n fx=cx*(9/5)+32 kx=cx+273.15 else if(d.eq.f)then fx=n cx=(fx-32)*(5/9) kx=cx+273.15 else kx=n cx=kx-273.15 fx=cx*(9/5)+32 end if end if write(*,50) cx,'C',fx,'F',kx,'K' 50 format(' ',f7.3,a3,f7.3,a3,f7.3,a3) stop end これをどうしたらいいのでしょうか。 ちなみに、使用しているFORTRAN77は Compaq Visual Fortran Optimizing Compiler Version 6.1 です。 どうぞよろしくお願いします。

  • fortranのif文で・・・

    フォートランの if文で IF(M-1) 15,15,12 ってのがあるんですが,これはどういう意味を表しているのでしょうか ? IF(R.LE.0.D0) THEN ・・・・ ならRが0より小さいときは・・・・しなさい.って命令ですよね. でもうえのは,カッコの中がいったいどういうときならってのを表してるのかも分からないし,15,15,12 ってのも意味がわかりません. 基本的なことかもしれませんが,よろしくお願いします. 一応その部分のプログラムも載せておきます. X(N+1)=X(1) Y(N+1)=Y(1) DO 10 I=1,N XM(I)=(X(I)+X(I+1))/2 10 YM(I)=(Y(I)+Y(I+1))/2 IF(M-1)15,15,12 12 XM(NC(1))=(X(NC(1))+X(1))/2 YM(NC(1))=(Y(NC(1))+Y(1))/2 DO 13 K=2,M XM(NC(K))=(X(NC(K))+X(NC(K-1)+1))/2 13 YM(NC(K))=(Y(NC(K))+Y(NC(K-1)+1))/2 15 CONTINUE

  • FORTRAN77のプログラミングについて教えてください。

    ・学校の課題で任意の数値の平均と、入力した数の個数を出力するプログラムを作 りなさいという課題が出たのですがうまくいきません。次にあげるプログラムの 中で修正する部分を教えてください。 *課題2 平均値 integer N real X,T1,M * 初期値 N=0 T1=0 * 累積 10 read(5,*,end=20) X N=N+1 T1=T1+X go to 10 * まとめ 20 if(N.GE.2) then M=T1/N write(6,*) '総数は' ,N, '平均は',M ELSE IF(N.EQ.1) THEN WRITE(6,*) '総数は',N, '平均は',T1 ELSE WRITE(6,*) '数値がない' END IF END IF END ・この問題は最初からよくわかりません。教えてください。  「3つの数a,b,cを読み込む。a,b,cを三角形の3辺の長さとしたとき三角形にな  るかを判定しなさい。三角形にならない場合はその面積をヘロンの公式を求め  て表示する。     s=(a+b+c)/2 , ss=s(s-a)(s-b)(s-c) として       S=sqrt(ss) とする。」 以上の二つです。分かる方お願いします。

  • fortran 固有値を求めるプログラム

    2x2の実行列の固有値を求めるモジュール関数の中で、d > 0 のときに出てくる sign(squt(d), -b)の値が示す意味と eval(2) = cmplx(c/e,0.0d0) でなぜ c/eの値が入るのかがわかりません。教えて下さい。よろしくお願いします。 プログラム module subprogs implicit none contains function eval2x2mat(a) result(eval) real(8), intent(in) :: a(:,:) complex(8) eval(2) real(8) b, c, d, e if (size(a,1) /= size(a,2)) stop ' not square ' if (size(a,1) /= 2) stop ' not 2x2 matrix ' b = -0.5d0*(a(1,1)+a(2,2)) c = a(1,1)*a(2,2)-a(1,2)*a(2,1) d = b**2-c if ( d < 0.0d0 ) then eval(1) = cmplx(-b,sqrt(-d)) eval(2) = conjg(eval(1)) else if ( d > 0.0d0 ) then e = -b+sign(sqrt(d),-b) ←ここの部分 eval(1) = cmplx(e,0.0d0) eval(2) = cmplx(c/e,0.0d0) else          ↑ここの部分 eval(1) = cmplx(-b,0.0d0) eval(2) = eval(1) endif end function eval2x2mat end module subprogs program main use subprogs implicit none real(8), allocatable :: a(:,:) integer :: n = 2 allocate(a(n,n)) a(1,1:2) = (/-1,1/) a(2,1:2) = (/-1,-1/) write(*,*) a(:,:), eval2x2mat(a) end program main

  • 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

  • Fortranの問題3問目です。急いでます><

    以下のプログラムを実行すると結果がNAN(数値エラー)となり、表示されない。 これは、ガウスの消去法における、ある問題に起因する。 正しい結果がでるようにするには、どうしたらよいか? 答えが正しく表示されない原因を究明し、正しい結果を表示する、 修正済みソースコードを提出しなさい。 ヒント: 一般に、どのような行列でも計算できるプログラムにするためには、 「ピボット」と呼ばれる操作を行う必要があるが、 今回は、ピボットをあらかじめ人間が行うことで回避してよい. プログラムの処理内容(アルゴリズム)を修正する必要はない。 program gauss implicit none c aは係数行列(4x3)、xは解、w は一時変数 double precision a(5,4),x(4),w integer i,j,k c キーボードから読み込む場合 write(6,*) 'input a(5,4)' c read(5,*) a c data文で一括初期化(代入)する方法 data a / & 0d0, 3d0, 7d0, 2d0, 65d0, & 2d0, 8d0, 5d0, 1d0, 65.4d0, & 5d0, 3d0,-5d0, 2d0, 3.8d0, & -2d0, 4d0, 0d0, -6d0, -35.6d0 & / write(6,*) 'データの確認表示' write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a c 前進消去 do k=1,3 do j=k+1,4 w = -a(k,j)/a(k,k) write(6,*) w,'*行',k,'を、行',j,'に足すと' do i=1,5 a(i,j) = a(i,j) + w*a(i,k) end do write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a write(6,*) '' end do end do write(6,*) '前進消去 終了' write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a c 後退代入 do k=4,1,-1 x(k) = a(5,k) do i=k+1,4 c 注:k=3のとき, do i=4,3 となるためループ内は1回も実行しない c k=2のとき, do i=3,3 となり、ループ内はi=3 で1回だけ実行 x(k) = x(k) - a(i,k)*x(i) end do x(k) = x(k) / a(k,k) end do c 解を表示 write(6,*) 'x = ',x stop end

  • fortran 途中まで考えたのですが。。。。

    エラトステネスのふるい(素数の倍数を除いていって残ったのが素数)で3桁の素数を求めて表示したいです。 私が考えたのは、 1・2~99までの数を素数かどうか調べて、素数を配列に入れていく 2・100~999まで素数の配列の中の数で割って、割り切れたらおしまい。割り切れなかったら表示していく ということです。 しかし下のプログラムではうまく素数配列ができていないようなのです。 ここまでかなり時間がかかったのでこのプログラムに手をいれて これ以外におかしくなるところもどこを直せばいいのか教えてくださるとうれしいです。 C C q223.f C PROGRAM q223 C IMPLICIT NONE C INTEGER N,i,K,s,l REAL a(99),b(99),c(99),X,Y C real M C a(1)=2 a(2)=3 l=2 C DO N=2,99,1 M=N**(0.5) S=M DO i=2,S,1 K=MOD(N,i) IF(K ==0)THEN exit ELSE IF(K /=0)THEN l=l+1 a(l)=N ENDIF ENDDO ENDDO C do N=100,999 do l=1,99 X=a(l) Y=N/X if(Y==0)then exit else if(Y/=0)then write(*,*)N end if end do end do c end よろしくおねがいします

専門家に質問してみよう