[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 12:09 / Filesize : 350 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その2



1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/

●関連スレ
FORTRAN W
pc8.2ch.net/test/read.cgi/tech/1163319215/


253 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 14:10:47 ]


254 名前:デフォルトの名無しさん [2007/02/07(水) 20:01:12 ]
まず、最初に規定の値(xとここではする)を決める。
そのxに乱数によって導き出された数y(計算方法は下記に記す)を引いていく。
これをz回(zはあらかじめ決めておく)繰り返す。
そのとき、計算過程がマイナス、または0になったとき、「miss」という項目に+1し、
xの値を初期値に戻す。というものです。

たぶんわかりにくいと思うので具体例を挙げて説明します。

(例) 各々の初期値を
x=7
y=int(rand()*10) ※この場合計算結果が3だったとします。
z=10
miss=0
とします。

このとき、x-y(以降、仕事と呼ぶ)をz回繰り返します。

@7-3=4
A4-3=1

1-3=miss
miss=0+1
ここで、xの値を7に戻す。

B7-3=4
C4-3=1


という感じで、missになる仕事以外の回数をz回繰り返します。
missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
よろしくお願いします。


255 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:18:47 ]
>>254
>missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
繰り返し処理に入る前に x の初期値を適当な変数に保存しておく。
missに +1するところで保存しておいた値を x に代入する。

256 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:45:13 ]
>>254
その日本語の解説どおりにFortranで書けばOKだ。
ほとんど完成している。


257 名前:デフォルトの名無しさん [2007/02/08(木) 18:22:36 ]
「miss」か「Z=今までの仕事回数+1」

の判断はif文で分岐させればいいんですよね?

258 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 18:42:46 ]
そのためにあるのがIF文です。

259 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 23:45:42 ]
副作用のないLispで、変数の型に制約がつけられる、という理解でいいか?

参照透明性とはチューリング機械で言うと内部状態を持たないということか?

260 名前:254 [2007/02/10(土) 20:21:30 ]
今自宅なので、実際にプログラムを起動させて確認を取ることができないので、
構文だけここに記入します。間違いなどを指摘してくだされば幸いです。

※xfirstはxの初期値とする。

program main

integer x,z,xfirst,miss
real y

x=7
xfirst=7
y=int(rand()*10)
z=10
miss=0

do 20 z=1,10

x-y=x
if(x .gt. 0) then
z=z+1

else

miss=miss+1
x=xfirst

end if

20 continue

261 名前:デフォルトの名無しさん [2007/02/10(土) 21:47:13 ]
FORTRAN77です
ビルドしたら<静的変数の合計の大きさまたは共通ブロックの大きさが、許容量を超えました>
というエラーがでたのですが、プログラムを分割するしかないのでしょうか?



262 名前:デフォルトの名無しさん [2007/02/10(土) 23:16:50 ]
>>261
OSの制限なら分割するしかない。

32BitOSだと1配列やコモンブロックあたり2Gバイトまでというのはよくある。
(符号付32ビット整数の正の最大値=2G)

そうではなくて、コンパイラのデフォールトの制限でエラーが出ることもある。
その場合はマニュアルを見て、リンカーのオプションを変えればOSの制限値までは増やせるだろう。


263 名前:261 [2007/02/11(日) 02:00:00 ]
>>262
アドヴァイスありがとうございます

264 名前:デフォルトの名無しさん [2007/02/11(日) 02:06:56 ]
>>260
文法のチェックだけでよければ
www.lahey.com/check.htm
ここでWEB上でチェックできる。


内容は見ていないが、ざっと見た範囲では
x-y=x
これがおかしい。あと末尾に END が必要。


265 名前:デフォルトの名無しさん [2007/02/12(月) 15:32:45 ]
>>264


アドバイスありがとうございます。

x-y=x
というのは、x-yという演算を行い、そのときに出た結果を表現したつもりです。

例文でいうところの、7-3=4、4-3=1…と、4や1にあたる表現をしたいのですが、
なかなかうまいこといかないんです…
このような計算を行う場合、たとえばどのように計算してやればいいですかね?

266 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 16:54:45 ]
>>265
x = x - y
向きが逆


267 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 21:08:29 ]
>>265
266で言われてますが、=は左の変数に
右の計算結果を代入するものです。

268 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:52:49 ]
>>265
初心者の頃の俺と同じことやってるw
= は変数の値を左右が釣り合うようにするワケじゃなくて
= の右側の結果を左側の変数に入れるものだよ。

「←」の代わりだと思えば良いかな。

269 名前:デフォルトの名無しさん [2007/02/13(火) 01:20:57 ]
do i=1,10
うんこ
if (i.eq.1)then
なんちゃら
else if(i.eq.2)then
なんちゃらちゃら
 endif
enddo
なんか一気に何ちゃらちゃらまでまわっちゃうんです><
うんこ→なんちゃら→うんこ→なんちゃらちゃら の順番になるはずですよね?
というかなんちゃらでエラーが出てます><これが原因でしょうか?
このエラーなおしたらちゃんとまわるようになるんでしょうか?まずはえらー直すことが先だと思うんですけど
構造的にはあってますよね??

270 名前:254 [2007/02/13(火) 02:04:09 ]
>>264であるサイトいったんですけど、errorってでてダウンロードできなかった…orz
構文はあってますかね?

271 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 02:29:37 ]
>>270
ダウンロードするのではなく、自分の書いたソースをアップロードするのだ。

で、>>260をそのままチェックした結果:

Diagnostic messages: program name(main)
1026-S: "SOURCE.F90", line 1: Corresponding END statement missing.
2004-I: "SOURCE.F90", line 8: 'y' is set but never used.
1302-S: "SOURCE.F90", line 14: Not a valid Fortran statement.
1635-S: "SOURCE.F90", line 16, column 7: DO variable 'z' cannot be redefined in range of DO construct.

上から
・ENDがない
・8行目(y=int(rand()*10))で y に値が代入されているが使われていない(これは次のエラーと関連している)
・14行目(x-y=x)の文が変
・16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。

構文的におかしいのはこんなところ。
>>254の題意からすると、zの使われ方が少しおかしい。



272 名前:254 [2007/02/13(火) 15:36:17 ]
>>271

zの使い方がおかしいとありますがどのようにおかしいのですか?
z=10とdo文の前で定義しているのがおかしいということですか?

do 20 z=1,10
で、仕事回数zの表現をしたかったんですが…


273 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:51:51 ]
>>272
もしかして日本語を理解できない人?
> 16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。
DOループの中でそのDOループのiteratorであるzをz=z+1という文で変更しようとしているが、
それはコンパイラとしては許せないことであると言われている。

274 名前:254 [2007/02/13(火) 15:57:26 ]
では、このような表現ではだめでしょうか?
work(10)は10回までの仕事を表現します。
work(z)というように表現し、do変数zで表現したいと思います。
このプログラムの最終目的は、missの回数をエクセルに出力して、グラフを作成することなんです。
そのために、結果を出力したいとおもっています。

以下に構文を示します。

program main
integer x,z,xfirst,miss,work(10)
real y

x=7
xfirst=7
y=int(rand()*10)
miss=0

do 20 z=1,10
x-y=x

if(x .gt. 0) then
write work(z)   →※何回目の仕事かどうか、演算結果を表示したい。
else
miss=miss+1
x=xfirst
end if
end

20 continue


275 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 16:31:29 ]
あーダメだ x-y=xを見て諦めた
宿題スレじゃないしこっちは考えるヒントだけ出して自分で完成することで
プログラミングの達成感が味わえれば少しはプログラミングが面白くなるかもとか一瞬思ったが
散々言われてたx-y=xを直す気もなさそうだし相手にするだけ無駄っぽい

276 名前:254 [2007/02/13(火) 18:40:47 ]
>>275

あ、すいません…

間違ったソースコードをコピペしてしまったんで…
いまエラーを一個ずつ直してますが、確かに直っていくと面白いですね。


277 名前:254 [2007/02/13(火) 20:41:21 ]
理解力がなくてすいません。これが最後の質問です。

program main

integer x,z,xfirst,miss,work(10)
real y

x=7
xfirst=7
y=int(rand()*10)
miss=0

do 20 z=1,10

x=x-y
if(x .gt. 0) then

write(*,*) work(z)

else

miss=miss+1
x=xfirst


end if


20 continue


end

278 名前:254 [2007/02/13(火) 20:51:19 ]
上記のような構文を作ってコンパイルしたら、error 0 warning 0となっているのに、
題意のような結果がうまく表示されません。

おそらく、>>271で指摘されている
・8行目で y に値が代入されているが使われていない という点が原因だと思います。

しかし、ここがイマイチよく理解できません。

とありますが、yは、y=int(rand()*10で値が決定されていますよね?
ここで乱数計算によって、たとえばy=3という結果が出た場合、以後のプログラム内における
yという値は全て3というように決定されるんじゃないんですか?

x=x-yという式によって、yという変数はプログラム内で使われているのではないんですか?
この点がイマイチよく理解できないんです。

ドシロートですいません。


279 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:19:35 ]
>>277
>・8行目(y=int(rand()*10))で y に値が代入されているが使われていない
というのは
x-y=x とやってた為にコンパイラが

「x-y=x」は不正な文だからとりあえず無視
 → 他に y を参照している箇所がない
 → 「yが使われていない」と警告

として出てきたものだ。x-y=xを正しく書き直せば出なくなし、結果がおかしいのとは関係ない。

y=3でテストしたければ「y=int(rand()*10」の後ろに「y=3」と書いて走らせてみたらいい。

ところで、work(z)にはどんな値が入っているかわかるかな?

280 名前:254 [2007/02/13(火) 21:42:46 ]
>>279

仕事回数z、つまりそのときの仕事の結果を表示していくつもりで書いたんです。
zが3回目の仕事のときに、3回目の仕事の結果を出す、というようにしたんですが、
間違ってますかね?


281 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:45:08 ]
workに何も代入してないじゃん。



282 名前:254 [2007/02/13(火) 22:01:02 ]
>>281

つまり、work(1)〜(10)までを定義してやる必要があるということですよね?
(1)〜(10)を「どのように求めるつもりなのか」を明記するってことですか?

この場合だと、x-yでいいのかな?

283 名前:デフォルトの名無しさん [2007/02/13(火) 22:15:46 ]
彼が何をしたいかわからない俺は馬鹿

284 名前:254 [2007/02/13(火) 22:36:55 ]
>>283

バカですんません。
とりあえず、やりたいことというのは、

@定められた仕事回数の分の仕事(x-y)をdo loopで行う。
Ax-yを実行する度に、仕事回数zの数を増やす

※x-yがマイナスに達した時、xの値を初期設定の値に戻す。仕事回数zに+1する代わりに、
その後、missの項目に+1する。

B仕事回数が規定に達したらそこでプログラム終了。

何故、こんな意味のわからないプログラムを組むのかというと高校の卒業課題で使うためです。
これによってある計算をしなければならないので…(詳細はここでは書けませんが)

とりあえず、x-yの計算結果と、missの回数すら出力できてないので、僕は非常に混乱しています…
バカでほんとうにすいませんorz

285 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 23:50:05 ]
>>284
卒業課題って今年度の?
今の状態で行き当たりばったりにプログラム書くより、教科書なり参考書なりをよく読んで
もう一度基本的な文法を覚えなおした方がいいよ。

それからパソコン持ってるなら家でも予習復習できるように処理系の1つも入れておけ。
Windowsで学校の課題程度ならこれくらいで十分
ttp://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran.htm
他は本スレ参照のこと
pc10.2ch.net/test/read.cgi/tech/1163319215/2

286 名前:デフォルトの名無しさん [2007/02/14(水) 21:38:36 ]
構造格子上の3次元の温度データから等数値面をつくり、
その面に沿って面積分を行いたいのですが、うまくいきません。
 そもそも曲面の求め方が悪いのか(勾配から法線ベクトルを出し格子内
で面を張っているだけ)チェック用に完全な球を作り、
面積分を行っても球の表面積と桁が違うような結果になってしまいます。
 曲面の作成と面積分のやり方、あるいはfortranのサンプルプログラム等
に関してご存知でしたら教えてもらえませんか?

287 名前:デフォルトの名無しさん [2007/02/15(木) 21:46:19 ]
倍精度複素数型 cKappa には,
純虚数 か 実数 かの何れかが格納されています.

つまり,cKappaを2乗すると必ず実数になるのですが,
この値を倍精度実数型 dE に代入したいときは,

dE = cKappa * cKappa

で問題ないのでしょうか?

288 名前:デフォルトの名無しさん [2007/02/17(土) 01:12:06 ]
初心者でもぅさっぱり分かりません。
VS2005を入れてSilverfrostのftn95をインストールしてVSでftn95を選択。
一番簡単な
PROGRAM MainProgram
write(*,*) 'TEST'
END
を打ちデバッガ実行するとLINKエラーになります。このLINKエラーって何でしょうか?


289 名前:デフォルトの名無しさん [2007/02/17(土) 01:21:03 ]
288です。失礼
------ Build started: Project: FortranApplication2, Configuration: Debug .NET ------
Building project FortranApplication2...
Updating References...
Linking...
LINK : error - File not found: C:\Documents and Settings\.dbk
こんなエラーです。

290 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 01:50:41 ]
>>288
VS2002だが、うまく行っている。
エラーメッセージを見る限り、ファイルそのものが見つかっていないような。
まず単独でビルドしてみたら?


Building project FortranApplication1...
Updating References...
Compiling file: FreeFormat1.f95
Linking...
Assembly file Debug\NET\FortranApplication1.exe for .NET 1.1 produced
Build log saved at: "file://C:\Documents and Settings\All Users\Documents\FORTRAN\FortranApplication1\Debug\NET\buildlog.txt"
FortranApplication1 build succeeded.


291 名前:デフォルトの名無しさん [2007/02/18(日) 01:07:44 ]
>>まず単独でビルドしてみたら?
時間がなく、余り調べていないのですが、自分はVSが初心者です。
コマンドプロンプトからはexeを生成し、実行まで出来るのですが、VSだと・・・orz
上記の「単独でビルド」とは何の作業をさすのでしょうか?



292 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 14:19:54 ]
>>291
エラーメッセージから見ると、ソースファイルをプロジェクトに登録していないように見えるんだが。
New で作ったならそういう事は起きないが既存ソースなら登録がうまく言ってないのかも?

293 名前:デフォルトの名無しさん [2007/02/25(日) 14:25:10 ]
s = a**b

の計算が必要なときは

s = exp(b*log(a))

と書いた方が計算が速いと聞いたのですが,本当でしょうか?

294 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:37:12 ]
>>293
自分でベンチマーク作って確かめろw

どっちにしろ一般のべき乗はexp log で計算しているはずなので、
8087のようにハードウェア的に実装されたexpを利用したかしないかの違いだろう。


295 名前:293 mailto:sage [2007/02/27(火) 10:33:43 ]
>>294
うちのPCではどうやら後者の方が2割程度早いようです.
コンパイラはIntel Visual Fortran 9.1です.

それでこれからは全てexp logで計算しようと思ったのですが,
問題が発生しました.

次のような,モジュールで変数を共有する仕様の
プログラムを書いたのですが,コメントしているように,
共有用モジュールの変数を介して値を渡した場合と
直接値を代入した場合で結果が異なってしまいます.

ちなみにb**bで計算した場合はどちらも同じ結果を出力します.

b=0の場合を除いて演算してもいいのですが,
NaNになる原因が分からないので何とも怖くて使えません.

何かアドバイスあったらお願いします..



296 名前:293:プログラムリスト mailto:sage [2007/02/27(火) 10:34:24 ]
module commons
implicit none
real(8) a(1:10)
end module commons

program main
use commons
implicit none
a(1)=0.d0
call sub
end program main

subroutine sub
use commons
implicit none
real(8) b

!こちらを使うと出力は NaN
b=a(1)

!こちらを使うと出力は 1
b=0.d0

write(6,*) exp(b*log(b))
return
end subroutine sub

297 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 21:19:52 ]
>>295
組み込み関数 LOG(X) はXが実数の場合、Xは正(X>0)でなければならない。

IVFでは -∞ を返しているが、b * log(b) = 0 * -∞ = NaN となるので、
exp(b * log(b)) = exp(NaN) = NaN となる。

b=0.d0 の時に 1 と出力されるのは、コンパイル時に bの値が既知の定数(=0)なので
最適化によりプログラム中で b*log(b) が計算されず、直接 exp0.0D0) を求めてるため。
最適化なし(-Od)でコンパイルすると両方とも NaN になる。

298 名前:293 mailto:sage [2007/02/27(火) 21:35:35 ]
>>297
おおー!確かにそうなります!

実にすっきりしました.
どうもありがとうございます.

299 名前:293 mailto:sage [2007/02/27(火) 21:39:28 ]
途中で書き込んでしまいました.

あまりに訳が分からないので
さっきVinu Linuxをわざわざインストールしてgfortranでも
同じことをしたんですが,こちらは b=0.d0 と書いても b=a(1) で渡しても
NaNとなりました.

今まで最適化で問題が発生したことが無かったこともあって,
原因がコンパイラの最適化にあったとは全然気がつきませんでした.

300 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:39:40 ]
Xが0以下の実数の場合、LOG(X) の結果は処理系依存になるので
実行時エラーを出してプログラムを止める処理系もある。

301 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 00:44:46 ]
最近の処理系はIEEE準拠になって途中で実行時エラーで止まることが少なくなってありがたい。

せっかくIF文で例外を排除しているのに、コンパイラが最適化して勝手に投機的実行をして、
挙句に0割とかで実行時エラーを起こしてとまるとか、ウンコのようなことが昔はよくあったwwww





302 名前:デフォルトの名無しさん [2007/02/28(水) 04:01:39 ]
学校で今週までの課題で
『n元連立一次方程式をガウス・ザイデル法を利用して解くプログラムを作成し、テストを行え』
という課題がだされたのですが、全くわかりません(;_;)
頑張って本を読んでみたのですが理解できなくて(;_;)
最終手段として、ここに来ました(>_<)
どなたか、ご教授下されば幸いです(;O;)
初めての書き込みなので粗相があったらすみませんm(__)m
ちなみに学校で使っているのはフォートラン77です。

303 名前:デフォルトの名無しさん [2007/02/28(水) 12:05:08 ]
またガウス・ザイデル法かw

こんなの教科書にも載りまくりだろう。

誰かFAQにでも入れておけ。


304 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 23:14:14 ]
>>302
IMPLICIT REAL*8(A-H, O-Z)
PARAMETER (NMAX=99, LMAX=100, EPS=1.D-10)
REAL*8 A(NMAX,NMAX), B(NMAX), X(NMAX)
OPEN(10, FILE='DATA.TXT', STATUS='OLD')
READ(10,*) N
DO 100 I = 1,N
READ(10,*) (A(I,J), J=1,N), B(I)
100 X(I) = 1.
DO 110 I = 1,N
110 WRITE(*,'(1X,100F12.6)') (A(I,J), J=1,N), B(I)
CLOSE(11)
DO 220 L = 1,LMAX
ERR = 0.
DO 210 I = 1,N
TX=B(I)
DO 200 J = 1,N
200 IF (I .NE. J) TX = TX - A(I,J)*X(J)
TX = TX / A(I,I)
ERR = ERR + ABS(TX - X(I))
210 X(I) = TX
220 IF (ERR .LT. EPS) GOTO 299
STOP
299 WRITE(*,'(1X,F12.6)') (X(I), I=1,N)
STOP
END


305 名前:デフォルトの名無しさん [2007/03/03(土) 12:26:05 ]
まだ77教えてるところなんてあるんだな。センセたちも古い規格しか知らなく
て「古い古い」言ってんだから世話ないな。


306 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 13:21:34 ]
古いからこそ実績や信頼性の有るコードが多い。
研究室に入った学生が真っ先にする仕事は古いFORTRANコードのメンテだ。
FORTRAN77を学ぶことは、まだまだ有益なのだ。



決して、ン十年前の講義ノートを使い回しているだけじゃありませ(ry


307 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 16:07:37 ]
古いと、妙な手あかがつきまくって、
難解で珍妙なコードになってることもあるぜ。

FORTRAN は言語的にバグを出しにくくするサポートが未熟で
デバッグしづらくて困る。

308 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 20:10:54 ]
>>305
コンピュータ言語の教育という面ではF77は切り捨てたほうがいいのだが、
現実にメンテさせられるコードは77以前なのだから実用性からはそれもありかなとw

まぁクイズとか解いてりゃいい新型言語とは違うしw



309 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 20:32:13 ]


310 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 20:35:33 ]
fcpadでftn77を使っているのですが、あるプログラムをコンパイルして実行
しても結果が一瞬表示されて消えてしまいます。どうしたらいい?

311 名前:デフォルトの名無しさん [2007/03/03(土) 20:42:35 ]
>>310
pause文を入れろ




312 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 20:50:36 ]
>>311
これってもしかしosのてシステム上の問題?
xpつかってるからセキュリティのservice pack2が問題かもしれん。
コマンドプロンプトからプログラム名を指定して実行したら成功しますた

313 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 21:34:50 ]
>>312
コンソールアプリはそれが普通。
処理を停めなければDOS窓はすぐに消える。
それが嫌ならpauseで停めろ。
それより結果はファイルに出した方が良いぞ。

314 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 21:42:27 ]
>>313
ということはつまり結果をテキストファイルみたいにしてだすわけですね?
OPEN文つかうんですよね?

ご指導ありがとうございます

315 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 22:45:09 ]
DOS 窓開いてから実行すればいい

316 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 23:44:05 ]
ありがっと

317 名前:デフォルトの名無しさん [2007/03/04(日) 19:02:27 ]
OPEN文でファイルからデータを読ませようとしてるんですけど「ファイルがない」って
エラーが出ます。あるのに。


なぜですか

318 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 19:16:03 ]
事故解決しました。
UNIT=1にするとエラー
UNIT=2にするとコンパイルはできるが入力データに上書きされてしまう
UNIT=3にするとコンソール画面に結果がでてウマー

319 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 23:12:07 ]
CSQRTって使えるの?

320 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 23:49:23 ]
>>319
FTN77で。

321 名前:デフォルトの名無しさん [2007/03/05(月) 00:06:07 ]
>>317
一桁目は歴史的な理由から予約されていることが多い。
処理系によっては90番台も予約されていたりする。

特に理由が無ければ避けるのがよろし。


>>320
たしか、77の規格には無かったはず。
EXPを使って解け。




322 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 00:44:52 ]
>>320
こんなとき(だけ)役に立つ、岩波FORTRAN辞典〜♪
によるとFORTRAN77でもSQRTの引数複素数時の個別名はCSQRTだ。よかったな。

だが、総称名使え。

323 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 06:01:36 ]
>>321
一桁目ってunit=1から9のことdふぇすか?


複素数のはびっくりした。ああなるほどっておもた。オイラーの公式だね

exp(iθ)=cosθ+i sinθ

>>322
ということは、たとえばD=B**2-4*A*Cという式があって、REAL Dとしているとき、
sqrt(D)を計算しようとしますよね。BとAの与え方によってはD<0となり複素数と
なりますよね。そのときCSQRT(D)とすればいいのですか?

324 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 06:13:49 ]
ま、あれですかね。複素数ってプログラムで扱うもんじゃないんですかね

325 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 06:51:59 ]
>>323
CSQRTの引数は複素数型。
そしてFORTRANではC言語などの様に引数の型を(関数宣言に合わせて)自動変換したりはしない。

326 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 07:51:42 ]
ということは

あらかじめ変数宣言でCOMPLEX Dとしていて
CSQRT(D)ならばありってことですか?

327 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 22:05:32 ]
>>326
文法的にはあり

だがまあその場合、SQRT(D)としとけば内部的にCSQRTを呼んでくれるので
わざわざCSQRT(D)とする必要はないけどな。

328 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 11:59:22 ]
>まぁクイズとか解いてりゃいい新型言語とは違うし

かっこいいな


329 名前:デフォルトの名無しさん [2007/03/09(金) 19:51:16 ]
ちょっとしつもんです。

txtファイルで
0 0.1 3.2 
6.3
1 2.1 5.6 
5.9
・・・

のようにちょっとずれたテーブルがあるんすけどこれを次のようにグラフ化できるように
整理できるプログラムって作れますか?
0, 0.1 ,3. ,6.3
1, 2.1, 5.6, 5.9
・・・

条件は入力がtxtファイルで出力もtxtファイルかcvsファイルにするものです。


330 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 20:14:07 ]
作れるけど、わざわざ FORTRAN で作るもんでもないと思われ。

331 名前:デフォルトの名無しさん [2007/03/09(金) 20:54:43 ]
>>330
おしえてくださいませんか?また、フォトラン使わないならば何を使うのか教えてください。
お願いします先生



332 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:29:25 ]
awk がちょうどいいんでない?

333 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:38:15 ]
じゃあawkで

#! /bin/gawk -f
BEGIN { NMAX = 4; n = 0 }

{
for(i=1; i<=NF; i++) { a[n++] = $i; if (n >= NMAX) { putn(a, n); n = 0; } }
}

END { if (n>0) printn(a, n) }

function putn(a, n, i) {
for(i=0; i<n-1; i++) printf("%4.1f, ", a[i])
printf("%4.1f\n", a[i])
}

もっと簡単に書けるかもしれないけど、こんな感じで。

334 名前:デフォルトの名無しさん [2007/03/10(土) 11:17:50 ]
awkってなんですか

335 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:35:44 ]
awkは語るまい。

336 名前:デフォルトの名無しさん [2007/03/10(土) 11:56:57 ]
awk というのは、加齢臭の漂うおっさんスクリプト言語。

パソコンの処理能力が上がって、データ後処理がパソコンで実用的にできるようになった頃に
流行っていたスクリプト言語がawkだった。あの頃はperlも何も無かった。

大型計算機のFORTRAN出力をパソコンに落として、awkで整形処理、xyプロットソフトで描く。
という流れが80年代末から90年代初頭に流行った。

そういうわけでロートルはawkが使える。


337 名前:デフォルトの名無しさん [2007/03/10(土) 13:10:53 ]
じゃぴったりなわけだ。

awkってコマンドプロンプトさえあればできるんですよね?

338 名前:デフォルトの名無しさん [2007/03/10(土) 14:16:18 ]
"フォトラン"ってなんかカワイイ

339 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:11:24 ]
フォトラン20 平成20年バジョン

340 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:24:56 ]
>>337
基本的にコマンドラインでスクリプト・ファイルを指定したり、直接コマンドを書き込んだりして使う。

Linuxには大抵、最初から入ってる。
Windows用のもググれば色々見つかる。

341 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:54:03 ]
にゃるほどシグウィンにするかな。いろいろありがとうごzぁいましゅ



342 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 18:12:56 ]
すげーすげーすげー
オークすげー

ここの人のおかげで先ほどのデータ並べ替えができるようになりました。
ありがとうございました。
オークの勉強もフォトランと一緒にしようとおもいます

343 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 22:35:19 ]
>>329
もしFORTRANでやるならどうしますか

344 名前:@がばい佐賀 mailto:sage [2007/03/10(土) 23:17:15 ]
先ほどからしつこくてすみません。テキストデータの並べ替えを質問してAWKに感動したものです。
実はフォートランでもプログラムを組んでみました。

REAL A,B,C,D
C 読み込みファイル指定(既存)
OPEN(UNIT=3,FILE='data.TXT',STATUS='OLD')

DO 20 I=1,4
READ(3,*) A,B,C,D

WRITE(*,100) A,B,C,D
C 書き出しのフォーマットを指定
100 FORMAT(F6.3,',',F6.3,',',F6.3,',',F6.3)
20 CONTINUE
C 開けたファイルは閉じましょう
CLOSE(UNIT=3)

END

こんなぐあいでやったらコンパイルはちゃんと通ってデータも並びなおしてました。

でも、ちょっと腑に落ちないところがあります。
DO文のところです。俺は、なんとなくI=1,4として「これで1行から4行まで勝手に読み込んでくれるだろ」
という乗りでやったのですが実際のどげんですか?
このI=1,4はA,B,C,Dを読み込むのを4回やれということになりますか?
それとも1行目から4行目までA,B,C,Dを読むのを繰り返せというような行数を表すのですか?

普通、DO文でI=なんとかとしたら
処理のところにA=A+IとかIの入った式を書いたりするじゃないですか。でもこの問題の場合
Iを処理の回数として勝手に認識してくれているのであれば私のプログラムに間違いはない
ですよね


345 名前:デフォルトの名無しさん [2007/03/10(土) 23:51:46 ]
>>343
AWKは最近流行らないから、本とかも無いだろ。
今更感が無きにしも非ずだがFORTRAN界では大丈夫かw

PROGRAM test
IMPLICIT NONE
REAL :: a(4)
INTEGER :: i, ip
DO
READ(9, *, END = 999) a
WRITE(*, '(3(f10.4, ","), f10.4)') a
END DO
999 STOP
END PROGRAM test


>>344
あぁ、もう自作したかw

FORTRANでは歴史的な事情により、指定しない限りフォーマット付きI/Oでは、
入力データの空白は0として扱われる。(FORMAT文のNB/NZオプションあたりの説明嫁)

しかし*での自由書式だと空白が区切り記号として解釈される。
また今の場合のようにデータが足りないと改行して読んでくれる。

大昔は容量を節約するため出力データは空白を開けないで続けて書いたりしていたw

質問の解答は『A,B,C,Dを読み込むのを4回やれ』ということになる。
ところがFORMATを指定した場合はこうはならない。
/などで明示的に改行してやらないといかん。

細部は漏れも忘れたので文法書でFortmatのところ嫁。

346 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:58:03 ]
うわーありがとうございます!

347 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 01:04:48 ]
ところでおすすめの書ありますか?

348 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 05:38:38 ]
>>345

。・゚・(ノд`)・゚・。
そりゃあ流行じゃないし、数もそれほどじゃないけど絶版になってないのもあるよ
オライリーのとか。


349 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 11:08:55 ]
>>336
うちの研究室では awk を教えられたぞ。

350 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 13:00:33 ]
ホムペじゃあまだオークを語ってるところもあるね

351 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:39:20 ]
FORTRAN よりは若い言語だよな。



352 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:32:57 ]
>>351
そりゃFORTRANと比べたら……

353 名前:デフォルトの名無しさん [2007/03/11(日) 18:52:48 ]
どなたかご教授下さい!!

FTN95とfcpadの組み合わせで使いたいのですが、
fcpadでコンパイラのパスを「C:\Program Files\Silverfrost\FTN95\ftn95.exe」
として、いざf95のソースファイルをコンパイルすると
[FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006]
*** Invalid executable file suffix - only .EXE is permitted
と出てコンパイルできません。ファイルの拡張子を.fにしても駄目でした。

どうしたらFTN95+fcpadでコンパイルできるのでしょうか!?
おとなしくplato3を使うしかないのでしょうか・・・






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<350KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef