fortranでのプログラム作成について

このQ&Aのポイント
  • fortranでのプログラム作成についてのアドバイスをください
  • 乱数xより小さい値を持つt(t1)を求める方法を教えてください
  • 線上の・・の部分でt1を求める方法を教えてください
回答を見る
  • ベストアンサー

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が求められるのかがわかりません。アドバイスをいただけませんか?

  • dis-k
  • お礼率76% (79/103)

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

1-at を「1 から変数 at を引いた値」と解釈すると, かっこ内の「a は小数」が無意味になります. それでいいのでしょうか? で, この解釈では「外の DO ループでまわるごとに x を (乱数で) 定める」ということになるのですが, それはどこで行われているのでしょうか? 内側の DO ループで再度 t を制御変数に使うのは危険な気がするので, ここは変える方がいいような気がします. つまり内側の DO ループを DO t1=t, 100 のようにしてしまうってことですね. なお, このループだと「最小の t」ということにならないので, END IF の前に「外の DO ループから脱出する」という文を書く必要があります.

dis-k
質問者

お礼

非常に参考になりました.ありがとうございました

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「1-at(aは少数)が乱数xより小さくなったときのt(t1)」の意味がわかりません. 最後の t(t1) の意味を「そのような t を t1 とおく」と読んだとしても, 「最小の t」かどうかによってあとが変わる可能性があります. また, 1-at というのは Fortran では「1 から変数 at を引いた値」の意味ですが, その意味で解釈していいですか?

dis-k
質問者

お礼

質問べたで申し訳ありませんでした.ありがとうございました

dis-k
質問者

補足

質問下手で申し訳ありません。最小のtで、1-atもその解釈でお願いします

関連するQ&A

  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。

  • FORTRANのプログラム

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? program dat real x(10), y(10) open(7,file='test.txt') do i=1,10 read(7,*,end=200) x(i),y(i) end do do j=1,10 if(x(j).eq.0.0) then open(8,file='aftest1.txt') write(8,*) y(j) else open(9,file='aftest2.txt') write(9,*) y(j) end do close(8) close(9) 200 close(7) end

  • fortran  繰り返しループから抜きたい

    10 continue   :   :   :  do 100 i=1,10 if (abs(x (i)-y(i)) .lt. 1.0) then r= r + dr goto 100 else goto 1000 end if 100 continue :   : : 1000 contiue end   すべての条件(i=1~10)が満足されたら、ループから抜きたいのですが、出来ませんでした。   教えて頂けませんでしょうか?よろしくお願しますね!*<>*!

  • 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 ------------------------------

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

  • 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) プログラム文のどこの箇所が間違っているのかを教えていただけませんか?お願いします。

  • fortran

    do I = 1,40 do F = 1,4 do L = 1,100 if (I == 1. .OR. L == 1.) then A (I,F,L) = 3. else A (I,F,L) = 3.* B (I-1,F,L) end if end do end do do F = 1,4 do L = 1,100 do M = 1,100 B (I,F,L) = B (I,F,L) + C (I,F,M,L) end do end do end do end do 簡素化したプログラムなので、わかりにくいと思うのですが、後で計算するB(I,F,L)をA(I,F,L)のDOループに最初に持ってくると、I=1orL=1のときは正しい計算をしてくれるのですが、そのほかのときはB(I-1,F,L)に値が入らないのです。ちなみにC(I,F,M,L)はA(I,F,L)のループの後に計算しましたが、省略しました。 ご回答よろしくお願いします。

  • 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の動的割り当てについて

    今、FORTRANでg95でプログラムを作っているのですが、動的割り当てで理解出来ない現象が起きたので質問させていただきます。 real(8),dimension(:,:,:),allocatable :: a と三次元の動的配列aを定義し allocate(a(0:10,0:10,0:10)) としています。 ここで、外部のファイルから各成分0~10の配列の所に値を読み込ませます。 私の理解では、これは0~10の添字までしか扱えないものと思っていたのですが、write文でa(11,11,11)という要素を書かせてみると、実際に値が出力されてしまいます。動的割り当てとはそういうものなのでしょうか。 また現在作っているプログラムではこれが値を持っているとまずいので、doループで11の値のところだけをif文で0にしようと試みたのですが、そのif文を反映してくれません。 (つまり do i=0.11 do j=0,11 do k=0,11 if (i==11.or.j==11.or.k==11) then .・・・ の時、・・・のところで0にしようしてもそれが反映されない) 始めはコードが間違っているのかと思いましたが、doループの10の値のところを同様に0にしてみたら成り立っていました。 (つまり do i=0,10 do j=0,10 do k=0,10 if (i==10.or.j==10.or.k==10) then ・・・ の時、・・・のところで0にしようとするとそれが反映される) これはやはり定義してないa(11,11,11)が出力されることと関係があるのでしょうか。 初歩的な質問かもしれませんが、よろしくお願い致します。

  • fortran errorについて

    fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。 以下プログラム program test !ここからメインルーチン !前準備 配列の用意 implicit none integer N integer,dimension(0:N,0:N) :: A integer :: i,j,k read * ,N !初期状態の代入 do i=0,N do j=0,N A(i,j)=0 end do end do do i=N/2,N-1 A(N/2,i)=1 end do do i=N/2,N-1 A(N/2+1,i)=-1 end do !ループ 50回ループさせる do k=0,50 !状態の表示 call visualize !サブルーチン visualize subroutine visualize do i=0,N do j=0,N if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*" if(A(i,j)== 0) write(*,'(A1)',advance='NO') " " if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+" end do write(*,*) end do !end subroutine visualize call insert !サブルーチン insert subroutine insert do i=0,N do j=0,N if(A(i,j)== 1) A(i,j)=-1 if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j)) if(A(i,j)==-1) A(i,j)=0 end do end do !end subroutine insert end do end program test これでコンパイラすると In file test.f90:48 subroutine visualize 1 Error: Unclassifiable statement at (1) In file test.f90:69 subroutine insert 1 Error: Unclassifiable statement at (1) とでます いろいろ調べたのですが全くわかりませんでした できればよろしくお願いします