• 締切済み

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)が満足されたら、ループから抜きたいのですが、出来ませんでした。   教えて頂けませんでしょうか?よろしくお願しますね!*<>*!

みんなの回答

  • usokoku
  • ベストアンサー率29% (744/2561)
回答No.4

こんなときには、自分でループを作ってしまいます。 なお、行番号の付けかたは、私の使っている慣習で処理させていただきます。 DIMENSION LoopCount(10) LoopCount(1)=0 (中略) LoopCount(10)=0 10 (適当な処理) IF ??? .eq. ??? then LoopCount(1)=1 (適当な処理) * LoopCount() の合計を求めて10ならばすべての処理が終わったと解釈する IB=0 Do 11 IA=1,10 IB=IB+LoopCount(IA) loop if IB.ne.10 goto 10 end 最後に、この手のループの場合、比較的簡単に暴走します。無限ループに入ります。 普通100回か1000回ループ内を回ったらば、条件が適合しなくても異常終了させるルーチン(適当なカウンター)を入れてください。 ICount = 0 10 continu ICount=Icount+1 IF Icount.gt.1000 then stop (今のコンヒューターならば、STOPと表示して正常終了するはずです。私の場合、END を正常終了、STOP をユーザーレベルの異常終了としています) (適当な処理) IF (終了条件が成立しない) goto 10 end ここ10年ぐらいBasic しかいじっていないので、文法を忘れている可能性があります。 Basic の文法で書かれていたら、Fotran に直してください。

wonwon99
質問者

お礼

早速教えていただきまして、どうも有り難うございました。 少し整理してから、また、お願するかもしれませんね。 どうも、どうも!!<::>

  • kyo-mogu
  • ベストアンサー率22% (3398/15359)
回答No.3

 部分的に抜き出されても分かりません。懐かしいフォートランだなぁと。    でも、これでは回答できません。条件が分かりません。何をしたいのでしょうか?  闇雲にプログラムしても解決出来ません。変数がどうなっていくのか。どうしたいのか?  処理はどのようにしたいのか。  あなたが作成したプログラムをみて、プログラムを実行させないで頭の中で数字を入れて、どのようになっていくのか考えて見てください。 紙の上で実行させていくのです。  順番に変数がどうなっているのか横に書いていきます。それを色んなパターンでしていくことで、何が条件で足りないかが分かってくると思います。    どうしてもプログラムを動かして検証したいのなら、途中にチェック用のプログラムを入れます。  変数を表示して確認してから次の動作にいくなどのプログラムを組み入れます。必要でなくなったらコメント文にして残しておきます。  それと上手に段落を付けることで処理の流れが分かりやすくなりますし、可能な限りあちらこちらに飛ばないように工夫して下さい。

wonwon99
質問者

お礼

いいコメントですね!! 有り難う、有り難う!! もう一寸整理してから、また質問したいのね! 宜しく、宜しくね<**>、(・・¥・・)

  • funoe
  • ベストアンサー率46% (222/475)
回答No.2

「すべての条件(i=1~10)が満足されたら、ループから抜きたい」という 表現と、 「else goto 1000」 から、 「10個の条件が全部満足のときに1000に行きたい」と解釈しました。 また、その条件は、 「abs(x (i)-y(i)) .ge. 1.0」ですね。  (abs(x (i)-y(i)) .lt. 1.0 のelseだから) しかし、もとのプログラムでは、どれか一つでも else があったら goto1000 になってしまうので、うまくないですね。 -- 「10個の条件が全部満足のときに1000に行きたい」に加えて、 「そうでないとき、500にいく」を考えればうまくいきます。  (500に行った後どうするかは決めてください)  do 100 i=1,10 if (成立してほしい条件) then 成立しているときにするアクション goto 100 else goto 500 end if 100 continue 1000 continue  ←doループの直後に記述:無事10回まわったときここに来る  10個の条件が成立しているときのアクション   :   : 500 continue  10個の条件のいずれかが成り立っていないときのアクション   :   :

wonwon99
質問者

お礼

大変参考になります。 これから、整理しながら、実行してみたいね! 早速の回答で、何度も有り難う、有り難う、お礼を申し上げたいね! <^^> (○○)!

  • info22_
  • ベストアンサー率67% (2650/3922)
回答No.1

お書きのプログラムの部分で何をしたいのか、お書き願います。 r,drを使っているにもかかわらず初期値が与えられていないし、その説明もない。 全ての条件とはなんですか? 条件を満足するとはどういうことですか? (abs(x (i)-y(i)) .lt. 1.0) が全てのiについて成り立つことが条件を満足すると言うことですか? 全てのiについて成り立たないことが条件を満足するということですか? 補足にお書き下さい。

関連するQ&A

  • fortran 繰り返し計算の問題

    皆様、先日、色々教えていただきまして、どうも有り難うございました。特にfunoe様からのお答えがとても助かりました。ただし、どうも一つの条件だけが満足されると、計算が終了に行ってしまいました。 再度問題を整理したうえで、質問させて頂けませんでしょうか。 (例えば、電気回路の例) do j=1, n  Ra(j),Qi(j) !予めある回路に初期の抵抗値と得たい電流値を与える end do Tr=1.0 / / / 10 continue / do j=1,n Vi(j)=V/Ra(j) !Vを一定値とする / do 100 j=1, n if (abs(Vi(j)-Qi(j)) > 0.1) then Ra(j)= Ra(j)+ Tr goto 100 !nまで繰り返し else goto 500 !終了する end if 100 continue 1000 continue goto 10 !戻り、再計算 500 continue stop end ***************************************** 例えば(n=10),予め与えた10本の回路のQi値がすべて同じな場合には、上記のプログラムでは、うまく行っていますが、10本回路のQi値が違い場合には、そのうち1本回路の値が満足されると、終了していしまいました。  また、elseの前に、 「elseif (Vi(j)-Qi(j) <= 0.1) then Ra(j)= Ra(j) 」 を追加すると、ループから抜き出せなくなりました。  また、初期条件としては、始めに小さいRaを与えて、最初計算したViがQiより大きくして、それから、Raを増やして、ViをQiに近づけるように考えていますが、なかなかうまく行っていないのです。また、回路ですので、一箇所のRaを変更すると、当然他の値にも影響を与えます、ここには難しくと思っております。  皆さまに、教えていただければ、幸いなことと思います。よろしくお願い致します!<!!^!!)。

  • 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)のループの後に計算しましたが、省略しました。 ご回答よろしくお願いします。

  • 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

  • Matlabについて質問2

    二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 y=-x^2+5x+2 (以下のページ http://www8.plala.or.jp/uemura/sim2.html を参照しています。) (二分法) DOUBLE PRECISION X,AX,X1,X2,Y1,Y2,YA,Y X=1 H=0.1 X1=0 !低い方のxの初期値 X2=5 !高い方のxの初期値 100 AX = (X1 + X2) / 2 !2つの初期値の平均 Y1 = Y(X1) Y2 = Y(X2) YA = Y(AX) IF (YA.EQ.Y1.AND.YA.EQ.Y2) GOTO 200 IF (Y1.GE.Y2) THEN  X2 = AX  GOTO 100 END IF IF (Y2.GE.Y1) THEN  X1 = AX  GOTO 100 END IF 200 WRITE(*,*) 'X*= ', X1 WRITE(*,*) 'Y*= ', Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END これを実行すると以下のようになる。 X*= 2.499999981373549 Y*= 8.250000000000000 (ニュートン法) DOUBLE PRECISION X,H,DY1,DY2,DY3,Y1,Y,DY X=1 !xの初期値 H=0.1 !ステップ幅の初期値 100 DY1 = DY(X) DY2 = DY(X + H) DY3 = DY(X - H) IF (ABS(DY1).LT..000001) GOTO 200 !収束判定 IF (ABS(DY2).LT.ABS(DY1).AND.ABS(DY2).LT.ABS(DY3)) THEN  X = X + H  GOTO 100 END IF IF (ABS(DY3).LT.ABS(DY1).AND.ABS(DY3).LT.ABS(DY2)) THEN  X = X - H  GOTO 100 END IF IF (ABS(DY1).LE.ABS(DY2).AND.ABS(DY1).LE.ABS(DY3)) THEN  H = H / 10  GOTO 100 END IF 200 Y1 = Y(X) WRITE(*,*) 'X*= ',X WRITE(*,*) 'Y*= ',Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END DOUBLE PRECISION FUNCTION DY(X) !微分式の定義 DOUBLE PRECISION X DY=-2*X+5 END これを実行すれば以下のようになる。 X*= 2.500000022351742 Y*= 8.250000000000000

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

    実行の画面に数字を入力すると、 英語の文章と 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のプログラム

    今、実験の解析を行っています。 読み込みたいテキストファイルには -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の質問です

    今、実験の解析を行っています。 読み込みたいテキストファイルには -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 と書いたのですがデータの数と繰り返しの数が一致しないと、出力されません。 いちいちファイルをみるのは面倒なので、なんとか したいのですが

  • エクセルのマクロでループ処理

    エクセルのマクロで、ループを使っています 下の様な感じです。 sub TEST() a: re=re+1 if ○○=○▲ THEN GOTO b: 処理・・・ goto a: b: end sub() ですが、これの書き方はDo WhileやDo Untilを使った方が 早く処理できるのでしょうか? また、書き方等もお教え下されば助かります。

  • fortran ニュートン法

    program main real*8 x,xold,y,yold,func,dfunc,dx real*8 eps integer nmax nmax=100 eps=1.0d-9 *initial xold=2.0 do n=1,max yold=xold**2-2 x=xold-yold/xold*2 err=abs(x-xold) if(0.01>err)then write(6,*)x stop'Ended with succes' else y=x**2-2 xold=y end if end do write(6,*)x end を実行すると 4.94065645841246544E-324 という結果になってしまいます。 1.41421356 という解がほしいのに、、 ずっと考えたのですがどこがおかしいかわかりません お願いします、どうすれば正しい解が得られますか?