1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
449 名前:デフォルトの名無しさん [2006/06/12(月) 15:27:53 ] >>445 我慢して聞いてくれw 基礎が全くなっていないので,ちょっと見ただけでもまともに動くとは思われない. 周りに聞く人がいるなら聞いた方がいい.掲示板で説明出来る範囲を超えているwwww 1.まず変数の型がむちゃくちゃ.第一行目から,整数型のKに実数を入れている. 式の途中に(1/3)みたいなのがいっぱいあるが,整数の場合はこれは0になる. ようするに型に関する認識が全くなってないw 整数と実数は違うものだと思った方がいい. 実数に整数を代入する方は,一応型の変換が自動でなされるが,明示的に実数にしておいた ほうがいい. 2.有効桁に関する認識もなってない.円周率を3.14で入れているが,これでは有効桁が 小数点以下2桁になってしまう.そもそも常数は,PIとかちゃんとした名前の付いた変数 ないしパラメータ変数にすべきもの. 3.式も所々演算子が抜けているし,演算子の優先度に関して間違っているとしか 思えないところがある(割り算の分母). 4.微分を取りにゆくときのセンスも悪い.まず特定の格子間距離に対してエネルギーを 求めるサブルーチンをつくって,それを2回異なる格子間距離について呼ぶべき. とにかく,なんというか,プログラミングの基本的センスがなっていないし, 問題自体に対する理解もなってないようなので, 今のままでは他者からのかなりの助けがないと完成はおぼつかない. 周りに聞く人がいれば,頭を下げて一から教えてもらえ. とにかく道はティッペラリーより遙かかなただw
450 名前:デフォルトの名無しさん [2006/06/12(月) 15:46:19 ] >>448 ほれ、77形式で昔のテキスト風に芋くさく書いておいたぞい。 PROGRAM VIPPER 1 WRITE(*, *) 'INPUT x (-1.0<= x <= 1.0)' READ (*, *) x IF (ABS(x) > 1.0) STOP e = 1.0 f = x i = 1 10 CONTINUE e = e + f IF (ABS(f) < 0.00001) GOTO 999 i = i + 1 f = f * x / REAL(i) GOTO 10 999 CONTINUE WRITE(*, '( 2(a, f8.5) )') 'EXP(', x, ')', e WRITE(*, *) EXP(x) GOTO 1 END
451 名前:450 mailto:sage [2006/06/12(月) 15:48:58 ] すまんw ついうっかりFortran90の癖を出してしまった。 77としては以下の部分を置き換えておいてくれw IF (ABS(x) .GT. 1.0) STOP IF (ABS(f) .LT. 0.00001) GOTO 999
452 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 16:38:20 ] 大学はいってから、別にプログラム関係の学部でもないのに fortranをやらされ、まったくわからない… なんか時分秒の引き算のプログラムを作らなければいけない。 開始時刻と終了時刻を指定すると、経過時間 を計算し端末に表示するプログラムをつくりなさい。 時刻はhh:mm:ssの形式で指定されるものとする。 終了時刻が開始時刻より早い場合には、その旨を画面に 表示して、再入力させること。 だそうだ。 PRPGRAM TIME REAL A,B,C,D,E,F,G,H,I READ(*,*)A,B,C,D,E,F X=A*60*60+B*60+C Y=D*60*60+E*60+F IF(X.GT.Y)THEN Z=Y-X G=Z/60/60 M=Z-G*60*60 H=M/60 I=M-H*60 WRITE(*,*)G,H,I ELSE WRITE(*,*)'ERROR' END IF STOP END
453 名前:452 mailto:sage [2006/06/12(月) 16:39:06 ] こんなのが限界で、hh:mm:ssと入力できないし、出力もできない。 24時間以降もERRORにしなければならないが、どうやるかわからない。 ;←を打つには書式を変えろって言われたけど習ってないし、 教えてもくれなかった_| ̄|○ 助けてください。こんな簡単なことを聞いてすいません…
454 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 17:19:38 ] >>453 ほれ、出来るだけ藻舞のオリジナルを尊重しつつ77で作った。 変数は整数型にしないといかんべ。 MODは余りを求める関数だ。マニュアルみそ。 入力をhh:mm:ssの形式にしたければ、入力エラーは無いことを仮定すれば、 WRITE文のFORMATをちょっと直してREAD文の方にも書いてやればいい。 PROGRAM TIME INTEGER IH0, IH2, IM0, IM1, IS0, IS1, IT0, IT1 INTEGER IH, IM, IS, IT 1 READ(*, *) IH0, IM0, IS0, IH1, IM1, IS1 IT0 = IH0 * 60 * 60 + IM0 * 60 + IS0 IT1 = IH1 * 60 * 60 + IM1 * 60 + IS1 IF(IT1 .GT. IT0)THEN IT = IT1 - IT0 IH = IT / (60 * 60) IT = MOD(IT, 60 * 60) IM = IT / 60 IS = MOD(IT, 60) WRITE(*, '( I2.2, A1, I2.2, A1, I2.2 )' ) IH, ':', IM, ':', IS ELSE WRITE(*,*)'ERROR' GOTO 1 END IF STOP END >>454
455 名前:454 [2006/06/12(月) 17:41:03 ] 24時間がどうのこうの謂う所は自分でやってちょw IF文で飛ばすだけだし、>>452 を見る限り自力で出来る感じがするw
456 名前:410 [2006/06/12(月) 18:10:46 ] >>411 遅レスですいません!たすかります、どうもっす!
457 名前:デフォルトの名無しさん [2006/06/12(月) 18:11:27 ] >>452 >大学はいってから、別にプログラム関係の学部でもないのに >fortranをやらされ、まったくわからない… 来るべき21世紀の脱工業化社会には、電子計算機の知識が欠かせないのだ。 計算機言語のサンスクリット語たるFORTRANを学べることを誇りに思って励め!
458 名前:452 mailto:sage [2006/06/12(月) 20:07:13 ] >>457 電子計算機の基礎ですよね…がんばらなきゃ(;゜〇゜) >>454 すいませんが、( I2.2, A1, I2.2, A1, I2.2 )の.2って何ですか? I2は2行表示で、A1は…?教科書はめちゃくちゃ高いのに ぜんぜん詳しく書いてない( ̄Д ̄) 教わってる教授の本だからしょうがないか…_| ̄|○
459 名前:デフォルトの名無しさん [2006/06/12(月) 20:31:51 ] >>458 I2 と I2.2 の違いは,桁が余ったときの処理の違い. 後者は余ったところを0で埋める. 時計で言えば,1時8分8秒を前者で出すと 1: 8: 8となる, 後者で出すと01:08:08となる.
460 名前:デフォルトの名無しさん [2006/06/12(月) 20:33:35 ] リターンしちまったw A1の方は文字1桁ということ,今の場合は1文字. 数字を省略すると,文字列長に自動的に合わさる.
461 名前:452 mailto:sage [2006/06/12(月) 21:05:52 ] そうなんですか わかりました。 入力をhh:mm:ssの形式にするには READ(*,*)を READ(*,10) 10 FORMAT(I2,':',I2,':',I2) って変ですか?わからない… なんかだめな気がするので、助言お願いします。
462 名前:デフォルトの名無しさん [2006/06/12(月) 23:01:31 ] >>461 1 WRITE(*, *) 'INPUT START TIME hh:mm:ss ' READ(*, '(I2, 1X, I2, 1X, I2)') IH0, IM0, IS0 WRITE(*, *) 'INPUT END TIME hh:mm:ss ' READ(*, '(I2, 1X, I2, 1X, I2)') IH1, IM1, IS1 たとえばこんな感じにできる。1Xというのは1文字分飛ばせということなので、 実際は : の代わりに空白でも何でもいい。とにかく無視される。 ちゃんと : を認識して処理したければ、CHRACATER型の変数に読んでチェック すればいいのだが、その場合時分秒がちゃんと0〜24、0〜60に入っているかを チェックするほうが常識的に先になる。
463 名前:擬似乱数のチェック [2006/06/13(火) 01:15:24 ] (0,1)の擬似乱数をMT19937で発生させて、 その平均値と標準偏差が0.5と0.25になるのを確認しようとしました。 平均値は0.5にかなり近づくんですが、標準偏差が0.28程度になります。 乱数の個数を増やしていくと、0.28程度で収束しているように見えます。 octaveでもやってみたんですが、0.25程度に収束しません。 適合度検定にパスするとは思うのですが。 擬似乱数はばらつき具合はうまく表現できないのでしょうか? よろしくお願いします。
464 名前:デフォルトの名無しさん [2006/06/13(火) 01:22:23 ] >>463 漏れはシミュレーションとかやらないので乱数知らないのだが、 擬似乱数って用途によってアルゴリズムを選べと言われていたはず。 乱数マニアのサイトを覗くと粘着した情報が得られると思うww ものによって最初の数万個は捨てろとか色々個別の事情があるようだ。
465 名前:擬似乱数のチェック [2006/06/13(火) 02:43:29 ] 返事ありがとうございます。 乱数マニアのサイトをもう少し見てみます。
466 名前:452 mailto:sage [2006/06/13(火) 08:37:34 ] 1文字分飛ばせばいいんですね! ちゃんと : を認識して処理したければ、CHRACATER型の変数に読んでチェック って言うのは…? もっと勉強したいと思います。 時分秒がちゃんと0〜24、0〜60に入っているかを チェックするのは、IF文で0〜24、0〜60じゃなければERRORにすればいいですよね。
467 名前:デフォルトの名無しさん [2006/06/13(火) 12:44:42 ] >>466 ういうい。 CHARACTER DUMMY1*1, DUMMY2*1 READ(*, '(I2, A1, I2, A1, I2)') IH, DUMMY1, IM, DUMMY2, IS IF (DUMMY1 .NE. ':') STOP 'ERROR' ・・・・・・・・ IF (IH .GT. 24 .OR. IH .LT. 0) STOP 'ERROR' 云々 まあ、いきなりストップせず、WRITE 文で入力値を出力して、 どこがおかしいのか書いたほうが親切ではある。
468 名前:デフォルトの名無しさん [2006/06/13(火) 13:25:31 ] alpha 10.0 beta 0.00 .... gamma 4E-3 ↑という感じのファイルを読み込みたいのですけど、 一行に文字と色々なフォーマットの数字が並んでるんですけど、 できますか? 文字は20文字固定で、余りは半角で埋めようと思っています。
469 名前:デフォルトの名無しさん [2006/06/13(火) 16:37:03 ] >>468 できる。 もし文字と数値の間に必ず空白が空いているなら簡単。 CHARACTER NAME*20, TEXT*100 READ(9, '(a)') TEXT IPOS = INDEX(TEXT,' ') NAME = TEXT(1:IPOS - 1) READ(TEXT(IPOS + 1:IPOS + 20), '(F20.0)') VALUE こんな感じで、一度1行全体を文字列として読み、名前と値の境目を見つけたら そこより前は文字変数に突っ込み、境目から後ろは文字列を内部ファイルとして もちいて、数値として数値変数に読み出せばいい。 (ここでは20桁の数値を仮定した。F20.0にしたので小数点がないと とんでもない値になるが、この辺もINDEXで尻を見つけるとか、 FORTRAN90でいいならTRIMや何やらを使えば回避できる。)
470 名前:擬似乱数のチェック [2006/06/13(火) 16:55:21 ] [0,1]の一様乱数の標準偏差は0.28...で、0.25ではありませんでした。 お手数をかけました。
471 名前:素人 [2006/06/13(火) 18:03:12 ] -1以上1以下の値xを入力してe^xの近似式を出力するプログラム。e^xの近似式はe^x=1+x+x^2/2!+x^3/3!+..+x^n/n!を利用。 (最後の項に絶対値が0.00001より大きい間、項を増やして足し続ける)また、適正なxの値が入力される限り、何度もこの計算ができるようにすること。って課題が出されたんですけどまったく分かりません。誰か助けてください! って昨日打ったんですけどc++でお願いします!!
472 名前:デフォルトの名無しさん [2006/06/13(火) 19:15:56 ] >>471 ちょwww おまwwww Fortranスレに聞くなよw >>450 を自分で直せwwww
473 名前:デフォルトの名無しさん [2006/06/13(火) 21:04:58 ] テキストファイルから読み込んだ値を変数に代入したいのですが、 テキストの値の書式が 1,22.489,445,67888,23 のようにカンマ区切りの場合、どのように読み込むのが良いでしょうか?
474 名前:デフォルトの名無しさん [2006/06/13(火) 21:09:33 ] >>473 書式無しの自由書式。この場合コンマで区切って読んでくれる。 それで問題がある場合は、文字列として読んで、自分でコンマのところで切って 文字列を内部ファイルとして数値に変換する。
475 名前:473 [2006/06/13(火) 21:29:10 ] >>474 integer i,j,k,l,m real r open(10,file='hoge.txt') read(10,*)i,r,j,k,l,m のような感じで良いのでしょうか??
476 名前:474 mailto:sage [2006/06/13(火) 21:39:44 ] >>475 いいはず
477 名前:473 [2006/06/13(火) 22:00:59 ] >>476 ありがとう
478 名前:デフォルトの名無しさん [2006/06/14(水) 06:18:06 ] c言語にはfortranでいうcycle機能ってあるの?
479 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 06:43:18 ] continue;
480 名前:デフォルトの名無しさん [2006/06/14(水) 12:09:22 ] すいません。昨日からはじめた超初心者です。 初心者用のサイトを見ながらやってますが、 書いてある通りに行かないので質問させてください。 FTN95でコンパイルする際、 「ftn95.exe プログラムのファイル名.for95」と入れれば.exeファイルができる と説明してあるのですが、 上のように入力しても、「.exe」ではなく「.obj」ファイルになってしまいます。 どうすれば.exeになるのでしょうか?
481 名前:デフォルトの名無しさん [2006/06/14(水) 12:12:35 ] >>480 コンパイル時に/linkオプション。つまり ftn95.exe プログラムのファイル名.for95 /link
482 名前:デフォルトの名無しさん [2006/06/14(水) 12:20:59 ] >>481 ありがとうございます。 出来ました。
483 名前:452 mailto:sage [2006/06/14(水) 21:43:11 ] >>467 ありがとうございました。
484 名前:デフォルトの名無しさん [2006/06/15(木) 21:53:09 ] real X read(*,*)X として、小数点がつかない 5 などを読み込んだとき、Xにとんでもない値が入ってしまうのを 回避する方法はあるでしょうか?
485 名前:デフォルトの名無しさん [2006/06/15(木) 23:11:09 ] 行き詰ってしまっているので、失礼します 1行に (整数):(整数)(3文字の文字列)(8ケタの整数)(17文字の文字列)(空白1)(14文字の文字列) というデータが並び、これが何百行と続くデータを読みこみ、 (8ケタの整数)というもののみを、他ファイルに出力したいと思います。 (整数)というのはケタ数が決まっていません。これがエラーでコンパイルできません。ご指導お願いします program read implicit none integer::i,j,k,l open(unit=11,file='input.dat') open(unit=22,file='output.txt') do l=1,100 read(11,'(I8,1X,I15,3X,I8,32X)i,j,k write(22,*)k end do close(11) close(22) end program read
486 名前:デフォルトの名無しさん [2006/06/15(木) 23:13:19 ] l=1,100 となっているのは、100行読み取りたいとき、ということにしてます 修正です read(11,'(I8,1X,I15,3X,I8,32X)')i,j,k でお願いします
487 名前:デフォルトの名無しさん [2006/06/15(木) 23:18:46 ] また失礼します。コンパイルはできるのですが、実行ができないのでした・・ fmt: read unexpected character apparent state: unit 11 named input.dat last format: (I8,1X,I15,3X,I8,32X) lately reading sequential formatted external IO aborted (core dumped) と表示されます。環境はcygwinで、g77でコンパイルをしています。ぐだぐだと失礼しました
488 名前:デフォルトの名無しさん [2006/06/16(金) 00:06:33 ] 事故解決しました。すみません
489 名前:デフォルトの名無しさん [2006/06/16(金) 00:30:48 ] >>484 おながいいたします あと、"を文字として書くときってどうすれば良いでしょうか
490 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 00:48:22 ] >>484 普通の処理系なら read(*,*) X に対して 5 と入力した場合、小数部を省略したとみなして X は 5. となるはずだが? >>489 >"を文字として書くとき print *, '"' print *, """" print *, 1H"
491 名前:デフォルトの名無しさん [2006/06/16(金) 00:52:39 ] 4:345:23:346543 346:344:4:455 のような、ケタ数が一致しない複数の数値が:で区切られた値を読み取るにはどうしたら良いのでしょうか
492 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 01:59:52 ] >>491 各行に含まれる数値の数が一定なら、以下のように一旦文字列として 読み込んで加工し、内部ファイルを使えば良い。 program hoge implicit none integer i, k,l,m,n, ios character*80 str open(11,file='data.dat',status='OLD') 100 continue read(11, fmt='(A)', iostat=ios) str if (ios .ne. 0) goto 999 do 200 i=1, len(str) if (str(i:i) .eq. ':') str(i:i) = ',' 200 continue read(str,*) k,l,m,n write(*,*) k,l,m,n goto 100 999 continue close(11) stop end
493 名前:デフォルトの名無しさん [2006/06/16(金) 02:03:36 ] >>492 ありがとうございます。内部ファイル・・? これを参考にして頑張ります
494 名前:デフォルトの名無しさん [2006/06/16(金) 13:46:56 ] >>493 >read(*,*)X >として、小数点がつかない >5 >などを読み込んだとき、Xにとんでもない値が入ってしまうのを >回避する方法はあるでしょうか? 自由書式の場合は問題ない。 FORMATを与えていた場合に問題が生ずることがある。 小数点があれば与えたFORMATよりも、入力の小数点が優先されるが、 小数点がないと与えたFORMATの桁数にしたがって小数点位置が決められる。 >>491 の安易な解決法は:を、に置換して自由書式で読み出すことだw >>491 の問題は>>492 の方法で解決できるが、Fortran90以降を使うと 文字列関数が豊富な分やりやすい。ただし77の範囲でも実現は可能。 だらだらと書くもよし、:までを切り出した後、文字変数に右詰に して返す関数を作るもよし。 内部ファイルと外部ファイルの違う点は、ファイルの読み込み位置が 毎回先頭に戻ってしまう事で、これがちょっとうざい。 外部ファイルとなんでも一緒のつもりで行って昔ちょっとはまったw
495 名前:デフォルトの名無しさん [2006/06/16(金) 23:07:38 ] 文字列の配列ってできますか? character*50 c(10) みたいな感じで。
496 名前:495 [2006/06/17(土) 00:01:25 ] あっ、できました。 また質問いたします。 integer i character*50 c do i=1,4 write(c,'(i4)')i end みたいな感じにして、 cに「1234」のような文字列が入るようにしたいのですが、 上手くいきません。 どうすればよろしいのでしょうか?
497 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 12:03:21 ] >>496 integer i character*50 c write(c,'(4(I1))') (i, i=1,4) write(*,*) c end
498 名前:デフォルトの名無しさん [2006/06/17(土) 12:30:04 ] >>496 別解 DO i = 1, 4 WRITE(c(i:i), '(i1)') i END DO
499 名前:495 [2006/06/17(土) 17:53:25 ] >>497 >>498 どうもサンクス もう一個、 読み込んだファイルの全行数を知ることはできませんか?
500 名前:デフォルトの名無しさん [2006/06/17(土) 18:02:08 ] >>499 多分1回1行づつ数えるしかないと思うのだが。ほかに方法あるのかな? iline = 0 DO READ(9, iostat = io, *) IF (io < 0) EXIT iline = iline + 1 END DO こうかな? 巻き戻し REWIND(9)
501 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 18:50:57 ] >>500 あ、できました。どうもありがとう READ(9,*, iostat = io) ですね
502 名前:デフォルトの名無しさん mailto:sage [2006/06/20(火) 23:21:38 ] 今一番新しいfortranの規格ってfortran2003ってやつですか? これ普及すんのかなぁ
503 名前:デフォルトの名無しさん [2006/06/21(水) 00:32:08 ] >>502 する! まだ実装したコンパイラないけどなw
504 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 09:50:12 ] マジスカ まだ77でさえしぶとく残ってるのにね…
505 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 11:51:22 ] >>504 66だってまだまだ健在だぜ! 90で書いてるって言ってる奴も、珍妙な77や66の入り混じったハイブリットだったりするし。
506 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 12:00:43 ] そこまでいくとカコイイなw
507 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 18:54:00 ] fortran90で n個の配列を準備してRANDOM_NUMBER関数を用いて ランダムな値を配列に代入する。 ばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、 そのサブルーチンをcallする。 結果を出力する。 でばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、 そのサブルーチンをcallする。 というところがさっぱりわかりません。 どうすればいいでしょうか??
508 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 21:06:27 ] >>507 とりあえず、「ソート アルゴリズム」でググれば いろいろとソート(並び替え)の方法が出てくるよ。 あとはそのうち簡単なものを選んで実装するのみ。
509 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 09:08:07 ] >>507 作ってみた program rndm real,dimension(:),allocatable :: x; integer :: i,n,stat read(*,*) n allocate(x(n),stat=stat) if(stat/=0) stop "could not allocate x" do i=1,n call random_number(x(i)) enddo print *,"before sort"; call printx(x) call srt(x) print *,"after sort"; call printx(x) deallocate(x) contains subroutine printx(x) real,dimension(:) :: x; integer :: i do i=1,size(x); print *,x(i); enddo end subroutine printx recursive subroutine srt(x) integer :: i,iflag; real :: tmp real,dimension(:) :: x iflag=0 do i=1,size(x)-1 if(x(i)>x(i+1)) then iflag=1; tmp=x(i); x(i)=x(i+1); x(i+1)=tmp endif enddo if(iflag/=0) call srt(x) end subroutine srt end program rndm
510 名前:デフォルトの名無しさん [2006/06/22(木) 13:17:26 ] >>509 おまいFortranプログラマーでないだろうw 行内複数命令、暗黙の型からの逸脱、再帰関数・・・・・ 他の言語だと推奨されるところだが、Fortranでは嫌われるものばかりw 育ちが分かるぜw うっしっしw
511 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 13:34:23 ] >>510 一応77育ちで最近90に手を出したところ。 行内複数命令はやりたくなかったけど、「改行が多過ぎます」の 書き込みエラーが出たのを回避するため。行数を減らす時に 「implicit none」を消してしまった。 >>507 がfortran90と書いていたので、90で取り込まれた仕様を 使ってみた。call random_number(x(i))のところはdoループに しないでcall random_number(x)でも良かったみたい。
512 名前:509,511 mailto:sage [2006/06/23(金) 09:49:52 ] 行内複数命令を使わずに出来るだけ短くしてみた program rndm real,dimension(:),allocatable :: x read(*,*) n allocate(x(n)) call random_number(x) print *,"before sort" print *,x call srt(x) print *,"after sort" print *,x deallocate(x) contains recursive subroutine srt(x) real,dimension(:) :: x iflag=0 do i=1,size(x)-1 if(x(i)>x(i+1)) then iflag=1 x(i:i+1)=(/x(i+1),x(i)/) endif enddo if(iflag/=0) call srt(x) end subroutine srt end program rndm
513 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 15:25:04 ] >>512 x(i:i+1)=(/x(i+1),x(i)/) うわ! こういうswap tips があったのか。
514 名前:デフォルトの名無しさん [2006/06/23(金) 16:04:06 ] >>513 隣接で良ければ x(i:i+1) = x(i+1:i:-1) という手もあるな.
515 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 16:59:24 ] >>514 Fortran 90 以降の並列型配列処理の強力さが全開!!
516 名前:デフォルトの名無しさん [2006/06/23(金) 17:15:11 ] >>515 強力なんだが、暗黙の内にテンポラリ配列に展開するので、 超巨大配列に適用すると、すゲー時間がかかったりメモリーを食ったりする。 サブルーチンに渡すときに77の時のつもりで先頭要素のアドレスだけ渡している気になると 実はテンポラリにコピー、引き渡し、受け取り、テンポラリから元の配列へコピーとやってたりするw
517 名前:デフォルトの名無しさん [2006/06/26(月) 18:15:09 ] すいません、くそ初心者なんですが文の途中に改行するときに 入れる記号を教えてください!
518 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 18:45:14 ] >>517 すいません、くそ初心者なんですが文の途中に改行するときに & 入れる記号を教えてください!
519 名前:デフォルトの名無しさん [2006/06/26(月) 20:03:11 ] >>517 Fortran90なら>>518 にあるように & を尻に付ける. FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
520 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 20:45:54 ] >519 > FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな. カーニハン、プローガー、プログラム書法、第2版、木村泉訳、共立出版、p.21では、 継続行を表すのに$が使われています。 その理由が次のとおり書かれています。 (ここで継続行をあらわすのに「$」を使っているのは、「$」がFortranの規格上 公式に認められている文字のうち、構文上特別の意味を持たないただ一つの ものであることによる。こうすれば混乱が生ずる機会を最小にすることができる とともに、欄をまちがったときにそれに気づく可能性が大きい。)
521 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 21:14:41 ] なるほど… 90でも$にしたほうがいいの
522 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:20:08 ] 主プログラムの中で配列の番号指定して それをfunctionに渡してやりたいんだけど・・・うまく渡せないんだけど・・・ どうしたらいいの?(><) program UNKO real chinko(10) ←ファイルから読み込ませる i=5 なんちゃらかんちゃら function sex(ぱらめーた) sex=chinko(i)*manko chinko(i)がゼロになるw
523 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:21:53 ] >>520 そういえばプログラム書法にはそうあったような気がするな。 漏れはACOSっ子だったので&を6カラム目に置かされていたwwww 数字を使う人たちは1,2,3,4・・と行が継続行の数だけ数字を増やして行く流派の人たちだった。 +は昔のFORTRANのテキストに多かった気がする。 >>521 90では前の行の尻に&だ。&以外は許されない。 続いた行頭においてもよかったはずだが。 90で固定カラムというのならまぁ$でもいいがwwww
524 名前:デフォルトの名無しさん [2006/06/26(月) 23:27:57 ] >>522 いくつかやり方がある。 い)必要な要素だけを渡す。 program UNKO real chinko(10) ←ファイルから読み込ませる anal = sex( chinko(5)、ぱらめーた ) function sex(chinpo, ぱらめーた) sex=chinpo*manko ろ)配列全部渡す。 program UNKO real chinko(10) ←ファイルから読み込ませる anal = sex( chinko、ぱらめーた ) ■77式 甲 function sex(chinpo, ぱらめーた) real chinpo(10) i = 5 sex=chinpo(i)*manko ■77式 乙 function sex(chinpo, ぱらめーた) real chinpo(*) i = 5 sex=chinpo(i)*manko ■90式 function sex(chinpo, ぱらめーた) real, intent(in) :: chinpo(:) i = 5 sex=chinpo(i)*manko
525 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:29:07 ] 下品すぎます
526 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:45:31 ] 下品ですいません(><) 一瞬で答えが出ましたねすごいですw 必要な要素だけを渡す場合にchinko(5)のところはchinko(i)でもいいんですか? 具体的には主プログラム中の繰り返し回数iによってfunction中の値も変えたいんです(><)
527 名前:デフォルトの名無しさん [2006/06/26(月) 23:54:08 ] >>526 OK DO impo = 1, 69 anal = sex( chinpo(i) , ....... ) ....... END DO
528 名前:518 [2006/06/27(火) 11:40:59 ] やっぱりわかりません泣 どこが違うのでしょうか? H1 = 0.0639 H2 = 0.0001 PAI = 3.14159 T = 0.0164 OMG = 2.0 * PAI / T D = 0.5 V = 20.0 WRITE(12,10) 10 FORMAT(' T X1(t) X2(T)') DO 100 N=0,300,1 X = FLOAT(N) / 200.0 Y1 = EXP(-H1 * OMG * X) * (D * COS(SQRT(1.0 - H1**2) * OMG * X) $ + (D * H1 + V / OMG) / SQRT(1.0 - H1**2) $ * SIN(SQRT(1.0 - H1**2) * OMG * X) * EXP(-H1 * OMG * X) Y2 = EXP(-H2 * OMG * X) * COS(SQRT(1.0 - H2**2) * OMG * X) WRITE(12,20) X,Y1,Y2 20 FORMAT(3F7.3) 100 CONTINUE
529 名前:デフォルトの名無しさん [2006/06/27(火) 13:59:36 ] >>528 Y1 = EXP(-H1 * OMG * X) * (D * COS(SQRT(1.0 - H1**2) * OMG * X) この行のDの前の括弧 ( に対応する 閉じ括弧がないから叱られている. 継続行の問題ではない.もしくは,継続行にしているうちに壊してしまったのだろう. >>524 への追加だが, FORTRAN77での配列の渡し方としては,配列の大きさを渡すのが一番一般的だと思う. 数学ライブラリのたぐいはみんなこうだろう. ■77式 丙 anal = sex( n, chinko, ..... ) function sex( n, chinko, ..... ) real chinko(n) .......
530 名前:529 mailto:sage [2006/06/27(火) 14:27:48 ] ついでながら, PAI = 3.14159 これだと,単精度の有効桁にちょっと足りない.6〜7桁はあるのでもう1,2数字つけておくと安心だ. まぁ,本来的には他の数字の有効桁にもよるのだが,常数だからギリギリまで正確に与えた方がいい. PAI = 4.0 * ATAN(1.0) 倍精度なら PAI = 4.0d0 * ATAN(1.0d0) がよく使われる.これだと,機械によらずに有効な桁まで数値が与えられる. 倍精度の時にπを与えるのがかったるいので便利である.
531 名前:デフォルトの名無しさん [2006/06/27(火) 23:30:54 ] すいません、教科書見ながらやってみたのですが全く手に負えません。 この課題お願いします。 m行n列の行列(実数)A,Bをキーボードから読み込んで、 行列の積C=ABを計算し、結果を画面に表示させなさい。 序盤からなかなかうまいことがいかず・・・お願いします。
532 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 23:57:19 ] >>531 m≠n のときはどうするんだw
533 名前:デフォルトの名無しさん [2006/06/28(水) 00:39:57 ] >>531 Fortran90ならMATMUL という組み込み関数があるぞw
534 名前:531 [2006/06/28(水) 01:06:04 ] >>532 m≠nのときも考えるのだと思います。 一応はいりだけですが・・ DIMENSION A(M,N) WRITE(*,*) 'M,N=' READ(*,*) M,N DO 1 I=1,M DO 2 J=1,N WRITE(*,*) I,J, '要素を入力' READ(*,*) A(I,J) 2CONTINUE 1CONTINUE (つД`)たすけて〜
535 名前:デフォルトの名無しさん [2006/06/28(水) 01:30:42 ] >>534 助けてやってもよいが、行列の積を考えると m*n と m*n の積は取れないと >>532 は言っている。 m’ * n と n * m のように 積をとる部分では次元がそろってないといけない。 もう少し問題文を正確に教えてくれ。
536 名前:デフォルトの名無しさん [2006/06/28(水) 01:53:09 ] >>534 一応FORTRAN77で作ってみた。若干中級レベルの技法を使っている。 まぁ、素直に多重DO LOOPをまわすのもよし。 FORTRAN77では行列の大きさを実行時に決められない。Fortran90ならできる。 PROGRAM matrix PARAMETER (m = 2, n = 3) REAL a(n, m), b(m, n), c(n, n) C input A WRITE(*, *) ' input Matrix A ' WRITE(*, *) ' size =', n, ' * ', m READ(*, *) ((a(i, j), j = 1, m), i = 1, n) C input B WRITE(*, *) ' input Matrix B ' WRITE(*, *) ' size =', m, ' * ', n READ(*, *) ((b(i, j), j = 1, n), i = 1, m) C C = A * B DO 10 i = 1, n DO 20 j = 1, n c(i, j) = 0.0 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE 20 CONTINUE 10 CONTINUE C print C DO 40 i = 1, n WRITE(*, '(9F8.4)') ( c(i, j), j = 1, n ) 40 END DO STOP END >>536
537 名前:534 [2006/06/28(水) 02:36:30 ] >>535 m行n列のAとn行m列のBということだと思われます。 >>536 ありがとうございます。 理解してみようと思います。
538 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 03:17:43 ] 宿題ではないのですが、 WINDOWSのスタートアップに入れておいて、 PC起動してから約1時間後に勝手に計算を始めるFORTRANのプログラムをつくりたいのです。 そこで、以下のような概略を考えました。 ・スタートアップでプログラムスタート ・現在時刻を取得して格納・DOループスタート。 このループ中で時刻取得を繰り返し、上で取得した最初の時刻の1時間後過ぎになったらループ終了 ・やりたい計算を実行 ・プログラム終了 と、こんな感じで考えたのですが、PC起動後ずっと時刻取得のループをまわし続けるのが どうも無駄のような気がします。 こういう場合、どういうやり方が上手なんでしょうか
539 名前:デフォルトの名無しさん [2006/06/28(水) 08:52:40 ] >>538 ・案1 Windows のタスク機能を使う。 [スタート] ボタンをクリックし、[プログラム]、[アクセサリ]、[システム ツール] の順に ポイントし、[タスク] をクリックします。 ・案2 MS/DEC/Compaq/HP/INTEL FORTRAN の場合 SLEEP 関数を呼んで眠っていてもらう。
540 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:01:19 ] 行列テラウザス
541 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:30:52 ] >>540 Fortran90なら行列気持ちよくいじれる.オナニーできるくらい.
542 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 19:14:22 ] いいなー。ところで、 Gauss-Jordanのピボット選択ってどうやるんですか 絶対値が最大のと0になるところを入れ換える。。 バカなんでさっぱりわからん。。
543 名前:デフォルトの名無しさん [2006/06/28(水) 19:30:15 ] >>542 最低限度で良ければ,0が出た時に,そこから未処理分の列の係数をみていって 絶対値最大の行と入れ替えればいいだけだろう。 Ax=b のbの対応行も入れ替え。 入れ替えた行を覚えておいて元に戻すのがめんどいかな。
544 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 22:53:56 ] 課題が出たのですが、まったくわかりません。 助けてください。 m行n列の2つの実行れい、A、Bをキーボードから読み込んで 行列の席C=ABを計算し、結果を画面に出力しなさい。 留意点 汎用性のあるプログラムを設計すること。 出力設計については結果が見やすいことが肝心である。 問題の分析、再定義が必要(特に配列の扱いについて) 行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。 と書いてありますが、まったくわかりません。 お願いします。
545 名前:デフォルトの名無しさん [2006/06/28(水) 23:05:25 ] >>544 昨日の>>531 とは別人か? FORTRAN77とFortran90でどっちがいいね? その問題は設定が悪いw M*Nのサイズがあいまい。 >>536 を見て、もっと詳しい要望を出せ。出力FormatをF4.1に変えればおk。 >行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。 これは整数と小数の言葉を間違って使っているw
546 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 23:20:42 ] あぁー ホント行列わかんねぇよ 考えてんだけど・・ Doループで頭がクルクルパー・・ >>543 の入れ替えた行を覚えておいて元に戻すのがめんどいかな って具体的にどうするの?
547 名前:デフォルトの名無しさん [2006/06/29(木) 00:48:44 ] すいません>>536 についてですが c(i, j) = 0.0 というのはCの初期値ということでよろしいのでしょうか?
548 名前:デフォルトの名無しさん [2006/06/29(木) 01:10:31 ] >>546 ググルと色々サンプルプログラムが出てくるので参照してみたらいかがかな。 ピボッティングだったら教科書の類にもよく出てきているので、他人のプログラムを 読んでみるといいと思うんこ。 >>547 このループでc(i,j)に次々足してゆくわけだが、一番最初に0.0になっていないと困る。 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE Fortranでは変数の初期値は不定なのでごみが入っていることがある。 最近のコンパイラ(というか正確にはローダーだが)変数をゼロに初期化してくれることが 多いが、これを期待してはいかんざき。変数はみんな初期化する癖を付けるのがよろしいアル カイダ。
549 名前:544 mailto:sage [2006/06/29(木) 08:46:21 ] >>545 FORTRAN77です。 L*N行列のものと、N*M行列のものの積で汎用性を持たせろということなので 10*6と6*9や3*3と3*3もできなければならないものと思いました。 >>548 ググってみましたがサンプルプログラムが汎用性があるのがわかりません_| ̄|○ 汎用性…