Fortran90で正の整数を割った余りを求める手順を表すプログラムでエラーが発生する

このQ&Aのポイント
  • Fortran90で正の整数を割った余りを求める手順を表すプログラムを作成したが、コンパイル時にエラーが発生した。
  • エラーメッセージによると、IF文の構文が間違っているようだ。
  • プログラムのどこが間違っているのか、教えていただきたい。
回答を見る
  • ベストアンサー

Fortran90についての質問です。

Fortran90に関する問題です。 「正の整数mを正の整数nで割った余りrを求める手順を、組み込み関数MOD(m,n)を用いずに、単一の算術式で表せ」 このプログラム文を以下のように作成しました。ファイル名は「amari.f90」にしました。 INTEGER::m,n,f,r REAL::a,k PRINT*,'Input 正の整数' READ*,m,n a=REAL(m) k=a/n f=INT(k) IF(m>0,n>0) THEN r=m-(f*n) PRINT*,'余り=',r END IF END そして、Cygwin画面上で gfortran -o amari.exe amari.f90と打って、コンパイルしようとしたら以下のようなエラー文が出ました。 amari.f90:8.6: IF(m>0,n>0) THEN 1 Error: Syntax error in IF-expression at (1) amari.f90:11.3: END IF 1 Error: Expecting END PROGRAM statement at (1) プログラム文のどこの箇所が間違っているのかを教えていただけませんか?お願いします。

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

  • ベストアンサー
  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.1

FORTRAN77で終わってしまったものなので、FORTRAN90仁対しては不正確な知識で回答しますが IF(m>0,n>0) THEN この文、比較式の結合条件がわかりませんね、m>0かつn>0なのか、m>0またはn>0んのかコンパイラは判断できません。 普通は、if(m>0 .and. n>0)など、論理演算子を使って条件式を結合するように書きます。 ところで、このプログラム、ちゃんと動きませんよ、nに0がセットされたら、k=a/nで除算例外が発生します。 それに、わざわざrealに変換する意味が不明(というより不要)です。すべて、整数の演算で処理すればいいはずです。

u260926i
質問者

お礼

言われたとおりに以下のように訂正したら、上手くいきました。 ありがとうございました。 INTEGER::m,n,k,r PRINT*,'Input 正の整数' READ*,m,n k=m/n IF(m>0.AND.n>0) THEN r=m-(k*n) PRINT*,'余り=',r END IF END

関連するQ&A

  • 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 よろしくおねがいします

  • FORTRANの質問です

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? と質問しました。説明不足気味だったので、追加で説明させていただきます。 データの数はかわります。5個だったり、900個だったりします。 この数はわかりません。 program dat real n(10), y(10) write(*,*)'k=' read(*,*)k open(7,file='test.txt') do i=1,k read(7,*,end=200) n(i),y(i) end do 200 close(7) open(8,file='aftest1.txt') open(9,file='aftest2.txt') do j=1,k if(n(j).eq.0) then write(8,*) y(j) else if(n(j).eq.-1) then write(9,*) y(j) end if end do close(8) close(9) end と書いたのですがデータの数と繰り返しの数が一致しないと、出力されません。 いちいちファイルをみるのは面倒なので、なんとか したいのですが

  • 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 です。 どうぞよろしくお願いします。

  • 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 おそらく二重解法のエラー

    以下のようなプログラム(速度ベレル法による時間発展)を書いたのですが,エラーがでてしまいます. どこが悪いのかを教えていただけたらと思います. PROGRAM verlet implicit none integer::i,n,p real(8)::dt,k,m,ratio,ti real(8),allocatable::x(:),v(:),f(:) allocate(x(0:n)) allocate(v(0:n)) allocate(f(0:n)) dt=0.01d0 n=1000 k=1.0d0 m=1.0d0 ratio=k/m p=4 ti=0.0d0 x(0)=0.0d0 v(0)=1.0d0 f(0)=-k*(x(0))**(p-1) do i=0,45 x(i+1)=x(i)+dt*v(i)+f(i)/(2.0d0*m)*dt**2.0d0 f(i+1)=-k*(x(i+1))**(p-1) v(i+1)=v(i)+dt*(f(i)+f(i+1))/(2.0d0*m) end do do i=0,n ti=i*dt write(6,*) ti,x(i),v(i) end do deallocate(x) deallocate(v) deallocate(f) END PROGRAM verlet

  • 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でのプログラム作成について

    DO t=0,100   k(t)=0   IF (0<x<=1-at)then   k(t)=k(t)+1    cycle   ELSE IF (1-at<x<=1)then     ・     ・   ---------------------------------    DO t=t1,100      ・      ・    END DO   END IF END DO 上記のプログラムをある目的で作っていて、線上の・・の部分で、1-at(aは少数)が乱数xより小さくなったときのt(t1)(tは整数)を求めて、線以下の・・でt1を用いたループを作りたいのですが、線上の・・の部分をどうすればt1が求められるのかがわかりません。アドバイスをいただけませんか?

  • 二分法(FORTRAN)

    大学の情報処理演習で、FORTRANのプログラミングをやっています。 で、二分法の問題なんですが、X^3-X-1の解で、[0.2] にあるものを計算するプログラムを作る課題が出されたのですが、うまくいきません。 そこで、自分の作ったプログラムを添削してください。 program nibunnhou1 c real x1,x2,c,x,f,r f(x)=x**3-x-1 c x1=0.000 x2=2.000 r=f(x1) c write(6,*)'start' c do n=1,100 c=(x1+x2)/2 if(r*f(c).gt.0) then x1=c else x2=c end if c if(f(c).lt.0.0000) go to 1 continue end do c 1 write(6,*)'ans=' write(6,*) c c stop end です。これだと、答えが「1.」とかになってしまいます。 お願いします。

  • fortran77のend ifの個数について質問です。

    他人が作ったfortran 77のプログラムを使うことになったのですが、if文の数とend if文の数が合わずに混乱しています。コンパイルも実行も出来るのですが自分の中では納得いきません。具体的に言うと、 =============== if (aa.gt.bb) then  計算 if (cc.gt.dd) then  計算 else  計算 end if  計算 if (ee.gt.ff) then  計算 end if =============== と言った具合です。この場合1つめのif文に対応するend ifがないと思うのですが…なぜコンパイルがうまくいくのか教えてください。

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------