1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
401 名前:デフォルトの名無しさん [2006/06/07(水) 15:16:53 ] Evca(Ω,x)を求めるプログラムを作りたいのですが教えてください。 Evca(Ω,x)=Ei(Ω,x)+E0(Ω,x)+E1(Ω,x)+E2(Ω,x) Ei(Ω,x)=-1.79186*Z**(5/3)/r E0(Ω,x)=Z(2.21/r**2-0.916/r+Ecorr) Ecorr=-(0.115-0.031logr) E1(Ω,x)=2πZe**2((1-X)Z**Cs*(Rm**Cs)**2(1+2/3*u**Cs)+xZ**K(Rm**k)**2(1+2/3u**K)) E2(Ω,x)=1/2(4πe**2/ΩG**2)**-1(V(G))**2*1/(1-f(G))*(1/ε(G)-1) 狽ヘG/=0 Gは逆格子ベクトルG(n1,n2,n3) V(q)=(1-x)V**Cs+xV**k(q) Vi(q)=-4πZe**2/Ωq**2((1+u)cos(qRm**i)-usin(qRm**i)/qRm) (i=Cs,K) u=qRmcos(qRm)/sin(qRm)-qRmcos(qRm) わからない値は後から自分で入れるので教えてください 状態方程式の計算をするらしいです
402 名前:デフォルトの名無しさん [2006/06/07(水) 15:24:39 ] E2(Ω,x)=1/2(4πε**2/ΩG**2)**-1(V(G))**2(1/(1-f(G)))(1/ε(G)-1) 狽ヘG/=0です Gは逆格子ベクトルです。G(n1,n2,n3) これを求めるプログラムはどうしたらいいか教えてください わからない値は自分でいれます。お願いします。
403 名前:デフォルトの名無しさん [2006/06/07(水) 17:42:42 ] >>401 質問が曖昧すぎるぞい!w もう少しうまく質問しないと助けたくとも助けられないw 見た感じ結晶の電子相関込みの凝集エネルギーかなんかを計算しているようだが, どの辺のなにがわからんのか,求めたいものは何なのか,もうちょっと他人が分かる 質問をしろwwww これだけで答えられる奴はいねーよw 丸投げしたいなら持ってる情報を全部出せ!w 誰かが回答するかどうかは別としてw
404 名前:デフォルトの名無しさん [2006/06/07(水) 17:50:46 ] >>401-402 セシウムとカリウムのアルカリ金属合金の凝集エネルギーを求めて なにかしたいようであることは分かった. まずは欲張らずに単体のアルカリ金属の凝集エネルギーは求めろよw そしたら,x=1.0または0.0の時の極限にも対応するので あとからチェックにも使える. 一体どの辺が,どのくらいわかんないのよw
405 名前:401 [2006/06/08(木) 11:05:05 ] すいません。あほなんで基本的には全然わかりません。 状態方程式のPを求めるためにやってると思うんですけど。 圧力Pは結晶エネルギーEvca(Ω,x)の体積Ωに関係する微係数で与えられるらしいのです。 a=5.225A A=10**-8 Ω=(a**3)/2 rs=(9π/4)**(1/3)/Kf Ef=h**2*Kf**2/2m c=2(1+0.0155π/Kf)**-1 f(q)=q**2/2(Q**2+cKf**2) ε(q)=1+(1-f(q))*(4πZe**2/Ωq**2)*(3/2Ef)*(1/2+((4Kf**2-q**2)/8Kfq)*log(2Kf+q/2Kf-q)) CsのH近似の場合Rmは4.610 uは-0.9605 KのH近似の場合Rmは3.019 uは-0.5682 せめて濡/=0 のGベクトルが0以外の時を全部足す方法が知りたいです。 お願いします。
406 名前:401 [2006/06/08(木) 13:57:06 ] k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk)) k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk))
407 名前:401 [2006/06/08(木) 13:58:08 ] あとはE2(Ω,x)=1/2(4πe**2/oG**2)**-1(V(G))**2*1/(1-f(G))*(1/ε(G)-1) 狽ヘG/=0 を数値微分して全部足すと出るんですけどここがわからないです。 G=2π/a(n1*n1+n2*n2+n3*n3) 収束すると思うのである程度までの結果を出していきたいです。 n1=n2=n3/=0の時以外を計算させる方法がわかりません。数値微分もわかりません。 V(G)=-4*Z*2/oG**2((1+uk)cos(G*Rmk)-uk*sin(G*Rm)/G*Rm) ε(G)=1+(1-f(G))*(4*3.14*z*2/o*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/(8*Kf*G)*log((2*Kf+G)/2*Kf-G) f(G)=G**2/4*(G**2+c*Kf**2)+G**2/4*c*Kf**2 です。
408 名前:デフォルトの名無しさん [2006/06/08(木) 15:28:18 ] >>405 OK エネルギーを体積で微分すれば圧力になるのは熱力学の帰結だ. しかしこれはFORTRANというより物理の質問だなw >せめて濡/=0 のGベクトルが0以外の時を全部足す方法が知りたいです。 FORTRANスレ的には,これは3次元逆格子ベクトルに関する和なので, もっとも素朴には3重のDO LOOPを回せばよいとい答えになる. DO n1 = -n, n DO n2 = -n, n DO n2 = -n, n IF(n1==0 .and. n2==0 .and. n3==0) CYCLE 云々 END DO END DO END DO 実際は結晶の対象性があるので,このループの1/8〜1/24位回せばいいはず. 実際の計算には逆格子ベクトルを求める必要がある.これは結晶構造に依存する. もし今アルカリ金属が対象ならbcc構造ということになるだろう. その逆格子ベクトルはfccと同じものになる. これは固体物理の教科書に載っているから,一般式をつくるか, 手で求めて表を配列に入れることになる. DO LOOPの中にn1,n2,n3の組み合わせが逆格子ベクトルにふさわしいかどうかを 判別する式を,G=0を飛ばすのと同じように,いれてやればいい.
409 名前:デフォルトの名無しさん [2006/06/08(木) 17:39:27 ] >>407 Gは逆格子ベクトルそのものではなくて、その長さだから(ルート忘れてるみたいだが) たんに逆格子点に相当するn1,n2,n3が分かっていればいい。 後は式の通りに書いて、逆格子点について足せばいい。 FORTRANの疑問ではないので、ここで聞く前に周囲の人に聞いた方が早いと思う。 数値微分は単に、格子間距離aを、特定のaとa+daに取ったときに計算して 差分をdaでわればいい。daは小さい数だ。
410 名前:デフォルトの名無しさん [2006/06/09(金) 00:56:50 ] fortran90で、数式が二行に渡るとエラーがでるのですが、 どうしたらいいですか?
411 名前:デフォルトの名無しさん [2006/06/09(金) 01:58:42 ] >>410 一行目のしりに&をつけろ。 C言語やPASCALと違って、FORTRANは終端文字(;)が不要なかわり行センシティブ。 ゆえに継続行の記号を明示する必要がある。 漏れはFortran方式が好き。
412 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 02:43:29 ] Ruby や Haskell のような方式もあるぞい
413 名前:401 [2006/06/09(金) 13:33:05 ] >>408 >>409 わざわざありがとうございます。物理の質問でしたねw CYCLEとはどういう意味ですか? 結果にNaNとでるのはどういうことですか? お願いします。
414 名前:デフォルトの名無しさん [2006/06/09(金) 14:08:18 ] >>413 CYCLEというのはFortran90で導入された命令で,DO文の中で使う. それ以降の文を実行すると無くDO行へ戻る. つまり,次のループ計算を実行する. これと類するものにEXIT命令があって,これはEND DOの次の行に飛んで DO LOOPを脱する. NaNとは数値に非ず.Not A Numberの略号だ.配列がはみ出してとんでもない値を 書いているか,オーバーフロー等を起こしている. SUBCHKなどのデバッグオプションをつけてみそ.
415 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 17:47:49 ] オーバーフローだと普通は ±inf じゃない? NaN は実数での負値の平方根とか、未定義の演算結果かな。
416 名前:414 [2006/06/09(金) 21:27:34 ] >オーバーフローだと普通は ±inf じゃない? おっしゃるとおり.漏れの間違いだ. 負の平方根とか関数の定義域外呼び出しでもでるね. 漏れが出会うNaNは,ゼロ割か,配列はみ出しでとんでもないメモリー領域の アクセスしたときが多いかな.個人的にはゼロ割で実行停止しなくなったのでとても助かる. NaNを厳密に追求したければ,IEEE745の浮動小数点の定義を調べればいいが気力那須ww
417 名前:初心者 [2006/06/09(金) 22:20:13 ] 最近、大学でFortranの授業が始まりました。 今日で授業が三回目だったのですが次のような課題がだされました。 おそらく基礎中の基礎だと思うのですが、授業はプリントに書かれた プログラムを説明もなくそのままうつして実行させるような授業ですので この課題を読んだ時日本語かどうかすら疑いました。 いろいろと調べているのですがなかなかよくわかりません。よろしければ どなたかこの課題について解答していただけませんか? あと、本当に自分勝手で申し訳ないのですが、少しでいいので解説もして いただけたらとても嬉しいです。よろしくお願いします。 (1)subroutineを呼ぶときの、変数の引き渡し方について説明せよ。 特に、配列変数を引き渡す方法についてプログラム名をあげて説明せよ。 (2)Fortranで文字列を取り扱うにはどうすればいいか調べて、プログ ラム例をあげて説明せよ。 (3)READ文やWRITE文のI,E,F,A形式について調べて 解説せよ。またプログラム例と印字例を示せ。
418 名前:初心者 [2006/06/09(金) 22:24:14 ] すいません。(1)のなかのプログラム名は間違いでプログラム例でした。
419 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 23:56:51 ] 調べてって書いてるんだから、調べれば? プリントか教科書あるんじゃないの?
420 名前:初心者 [2006/06/10(土) 00:12:18 ] プリントは説明がなくて・・・教科書もないんです・・・やっぱりちょっと 調べればわかることみたいですね。
421 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:20:38 ] FORTRAN で検索したら色々出てくるよ。
422 名前:初心者 [2006/06/10(土) 00:23:04 ] ありがとうございます!いろいろ調べて自分なりの解答作ってまた書き込み にくるんでよかったらみてください。
423 名前:デフォルトの名無しさん [2006/06/10(土) 00:29:05 ] 本物のプログラマって現存しますか?
424 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:34:05 ] あれは最初からジョークだからw 色々示唆には富んでるけどね。
425 名前:デフォルトの名無しさん [2006/06/10(土) 00:44:15 ] >>419 教えてやれよw (1)なんて、参照渡しと値渡しの説明を求められていたら初心者には大変だぜ! しかし、配列の先頭要素のアドレスしか渡していないことを知らないと77では 実戦的なプログラムは書けない。 (2)はFORTRAN77以降ならCHARACTERがあるが、FORTRAN66だと整数型に ENCODE/DECODE文で文字列突っ込んだりしてるし。 (3)FORMAT書式は初心者がつまづく、難所中の難所だろう。 と、>>417 をびびらせることを書いてみたりしてw うふw
426 名前:デフォルトの名無しさん [2006/06/10(土) 03:03:51 ] data init/'12345'X,'23456'X,'34567'X,'45678'X/ ↑ '整数'X が何を意味するのか分かりません。 よろしくお願いいたします。
427 名前:デフォルトの名無しさん [2006/06/10(土) 03:50:05 ] '整数'Xは16進数を表すものでした。 お手数をかけました。
428 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 10:51:20 ] >>417 大阪大学工学部応用理工学科二回生乙。
429 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:02:15 ] これが噂に聞いた「ソシャる」というやつか
430 名前:デフォルトの名無しさん [2006/06/10(土) 17:30:31 ] >>422 臆せずに書き込むように。 みんなの勉強になる。
431 名前:デフォルトの名無しさん [2006/06/11(日) 13:31:23 ] 次の宿題もってこいや!!
432 名前:364 [2006/06/11(日) 16:21:12 ] >>392 を使わせてもらったんですけど、実行できませんでした。 cygwinを起動してコンパイルするとこまでは行けたんですけど(g77 report.f)、 ./a.exewoをしてもcommand not found になります。どこかエラーがあるのでしょうか?
433 名前:364 [2006/06/11(日) 16:22:43 ] ./a.exewo→./a.exeの間違いです。
434 名前:デフォルトの名無しさん [2006/06/11(日) 16:40:56 ] >>432 command not found ということは、a,exeが見つからないということなので、コンパイルに失敗している。 それ以前に何かエラーメッセージが出ていないか見て味噌。 まずはlsしてa.exeができているか見て味噌。
435 名前:ケロ [2006/06/11(日) 23:33:31 ] どなたか、教えてください;:il:il|;l|;il:i(-ω-`;)ll|l|il|;:il|! マジでなやんでます…。 1/√(π)exp(-x^2) 中央値0 偏差1 の正規分布表をあたえる。 [−1.1]および[−2.2]の範囲に存在する確立はいくらか? で台形法で解けと…。 プログラムがわかんないです…。 たすけてください…
436 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 23:40:51 ] >>435 >>364
437 名前:ケロ [2006/06/11(日) 23:43:29 ] 一緒だ…。
438 名前:ケロ [2006/06/12(月) 00:02:52 ] なんとなく、わかりました。ありがとーございます<(_ _)>
439 名前:364 [2006/06/12(月) 00:09:02 ] >>434 ありがと。もっかいやってみます。Invalid first character at (^)とか出るんですよね・・・。 >>438 同じ授業を受けてる気がする・・・。特定はやめてね・・・
440 名前:ケロ [2006/06/12(月) 00:12:48 ] >>439 それ、思った…。
441 名前:364 [2006/06/12(月) 00:28:30 ] >>440 ここでもその名前でお願い ex11.2ch.net/test/read.cgi/campus/1149336703/
442 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 00:35:20 ] >>439 もしかしてプログラムを「1桁目から」書いてないか? 2chの表示の都合上、ここではプログラムが行の先頭から書かれているように見えるが 実際のFORTRAN77のソースは行の各桁に何を書くかも文法上で決まっている。 そこら辺は初歩の初歩でどんな入門書にも載っているようなことなので 少しは教科書なりWeb上の入門記事なりを読んで勉強してくれ。
443 名前:364 [2006/06/12(月) 00:46:43 ] >>442 Σ(゚Д゚)!すいません、そのままコピペしてました。
444 名前:デフォルトの名無しさん [2006/06/12(月) 02:21:28 ] >>443 君は2ch専用ブラウザを使ってるかい? 使っているなら>>392 の引用符を見れば一応ある程度インデントが効いて 本来の姿に近くなる。 >>392 の中で自分を引用しているのは、そうやって見るためだ。 もうちょっと最小限のところは勉強しろwwwwww 他のスレならぶちキレられてるぞwwwwww このスレはVIPレベルなのでOKだがな(^ω^;) >>435 のケロも遠慮せずに書き込めよw
445 名前:401 [2006/06/12(月) 13:09:42 ] >>414 わかりました。ありがとうございます。 一応作ってみたのですがエラーがでてコンパイルできません。 初めて作るのでめちゃくちゃかもしれませんがおかしいところを教えてください。 お願いします。 k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2*(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk)) E2 = 0 E4 = 0 da = 0.001
446 名前:401 [2006/06/12(月) 13:12:03 ] WRITE(*,*)'(n4)' READ(*,*) n4 DO 10 n1= -n4 , n4 DO 10 n2= -n4 , n4 DO 10 n3= -n4 , n4 IF(n1==0.and.n2==0.and.n3==0) CYCLE G=2*3.14/a*(n1*n1+n2*n2+n3*n3) f=G**2/4*(G**2+c*Kf**2)+G**2/4*c*Kf**2 e=1+(1-f)*(4*3.14*z*2/o*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/ &(8*Kf*G))*log(2*Kf+G/2*Kf-G) V=(-4*Z*2/oG**2)*((1+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/G*Rmk) E3=(4*3.14*2/o*G**2)**-1*V**2*(1/(1-f))*(1/e-1) E2 = E2 + E3 V1=(-4*Z*2/(o+da)G**2)*((1+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/G*Rmk) e1=1+(1-f)*(4*3.14*z*2/(o+da)*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/ &(8*Kf*G))*log(2*Kf+G/2*Kf-G) E5 =(4*3.14*2/(o+da)*G**2)**-1*V1**2*(1/(1-f))*(1/e1-1) E4 = E4 + E5 10 CONTINUE E6 = E2/2 E7 = E4/2 E8 = (E7-E6)/da P=Ei+E0+E1+E8
447 名前:401 [2006/06/12(月) 13:14:02 ] WRITE(6,601) P 601 FORMAT(1H , F15.8) STOP END エラー fortcom: Error: Illegal character in statement label field [| fortcom: Error: Illegal character in statement label field [・ fortcom: Error: keita.f, line 55: Syntax error, found END-OF-FILE when expecting one of: <LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE CHARACTER ... . ^ compilation aborted for keita.f (code 1) あほすぎて迷惑かけます。
448 名前:素人 [2006/06/12(月) 14:38:08 ] -1以上1以下の値xを入力してe^xの近似式を出力するプログラム。e^xの近似式はe^x=1+x+x^2/2!+x^3/3!+..+x^n/n!を利用。 (最後の項に絶対値が0.00001より大きい間、項を増やして足し続ける)また、適正なxの値が入力される限り、何度もこの計算ができるようにすること。って課題が出されたんですけどまったく分かりません。誰か助けてください!
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)