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


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

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



1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、 
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 
FORTRAN使いが優しくコメントを返しますが、 
お礼はFORTRANの布教と初心者の救済をお願いします。 


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 ]
>>545FORTRAN77です。
L*N行列のものと、N*M行列のものの積で汎用性を持たせろということなので
10*6と6*9や3*3と3*3もできなければならないものと思いました。
>>548ググってみましたがサンプルプログラムが汎用性があるのがわかりません_| ̄|○
汎用性…

550 名前:デフォルトの名無しさん [2006/06/29(木) 10:48:31 ]
>>549
まず『汎用性』というものを具体的に定義しなければいけない。
FORTRAN77での汎用性であるから『行列の大きさを自由に変えられる
サブルーチン形式』と解釈しておけばいい。

以下例・・・

551 名前:デフォルトの名無しさん [2006/06/29(木) 11:29:38 ]
PROGRAM matrix
PARAMETER (nmax = 40)
REAL a(nmax, nmax), b(nmax, nmax), c(nmax, nmax)
CALL inpmat(nmax, nra, nca, a)
CALL inpmat(nmax, nrb, ncb, b)
IF (nca .NE. nrb) STOP 'matrix size mismatch'
CALL matmlt(nmax, nra, nca, ncb, a, b, c)
CALL primat(nmax, nra, ncb, c)
STOP
END
C==== C = A * B ==============================================================
SUBROUTINE matmlt(nmax, n, m, l, a, b, c)
REAL a(nmax, m), b(nmax, l), c(nmax, l)
DO 10 i = 1, n
DO 20 j = 1, l
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
RETURN
END
>>551

552 名前:デフォルトの名無しさん [2006/06/29(木) 11:37:24 ]
C=====================================================================
SUBROUTINE inpmat(nmax, nrow, ncol, a)
REAL a(nmax, nmax)
WRITE(*, *) 'input Matrix Size ( row & col ).'
READ(*, *) nrow, ncol
IF (nrow .GT. nmax .OR. ncol .GT. nmax) THEN
WRITE(*, *) 'matrix size must be smaller than', nmax, '.'
STOP 'Increase nmax!'
END IF
DO 10 irow = 1, nrow
WRITE(*, *) 'input Matrix element of ', irow, ' th row.'
READ(*, *) (a(irow, icol), icol = 1, ncol)
10 CONTINUE
RETURN
END
C=====================================================================
SUBROUTINE primat(nmax, nrow, ncol, a)
REAL a(nmax, nmax)
WRITE(*, *)
DO 10 irow = 1, nrow
WRITE(*, '(1x, 40F5.1)') ( a(irow, icol), icol = 1, ncol )
10 CONTINUE
RETURN
END
>>552

553 名前:550 [2006/06/29(木) 11:40:01 ]
ホントは整合配列をきっちりしてやんなきゃないが、面倒なのでいんちきしたw
すぐ直せるから調べて直してくれw

色々エラーチェックとかも適当w
じゃあ

554 名前:544 mailto:sage [2006/06/29(木) 14:22:42 ]
かなり難しいですね。。
わからない部分がほとんどですが、1つずつわからないところを
つぶしていきたいと思います。
わからなくなったら聞きますのでよろしくお願いします。
ありがとうございました。

555 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:03:41 ]
サイズも渡せばいいだけじゃね?



556 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:48:13 ]
>>555
うみゅ。
渡す配列毎に、使用した縦・横方向と、定義した縦方向の大きさが必要。

557 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:01:54 ]
FORTRAN77流にお行儀悪くやってみたお

PROGRAM HOGE
DIMENSION A(100), B(100), C(100)
WRITE(*,*) 'INPUT L, N, M:'
READ(*,*) L, N, M
WRITE(*,*) 'INPUT A(',L, '*', N, '):'
CALL MTINP(A, L,N)
WRITE(*,*) 'INPUT B(', N, '*', M, '):'
CALL MTINP(B, N,M)
CALL MTMUL(A, B, C, L, N, M)
WRITE(*,*) 'C ='
CALL MTPRT(C, L,M)
STOP
END


558 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:02:47 ]
>>557の続きだお

SUBROUTINE MTINP(A, M, N)
DIMENSION A(M,N)
READ(*,*) ((A(I,J), J=1,N), I=1,M)
END
C
SUBROUTINE MTPRT(A, M, N)
DIMENSION A(M,N)
CHARACTER F*20
WRITE(F,'(''(1X,'',I3,''F7.1)'')') N
WRITE(*,F) ((A(I,J), J=1,N), I=1,M)
END
C
SUBROUTINE MTMUL(A, B, C, L, N, M)
DIMENSION A(L,N), B(N,M), C(L,M)
DO 10 J=1, M
DO 20 I=1, L
C(I,J) = 0.
DO 30 K=1, N
C(I,J) = C(I,J) + A(I,K) * B(K,J)
30 CONTINUE
20 CONTINUE
10 CONTINUE
END


559 名前:デフォルトの名無しさん [2006/06/29(木) 23:19:03 ]
>>554は、たぶん配列の添え字と縦横の関係も分かっていないと思われw

Fortranでは、第一添え字が縦方向、第二添え字が横方向を指定する。

たとえば3*3の場合

A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
A(3,1) A(3,2) A(3,3)

という並びになっている。これはC言語とは逆でFortran型のほうが数学記号と合う。

また『行 (row ロウ)』というのは、こういう横方向の並びをいう。
A(1,1) A(1,2) A(1,3)

こういう縦方向の並びは『列 (column カラム)』という。
A(1,1)
A(2,1)
A(3,1)

■やや高度な話題
Fortranでは、2次元の配列は、メモリー上ででは、1列づつ縦書きで日本語とは逆に
左から右へ読む形で1次元に並んでいる。つまり、

A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(1,3) A(2,3) A(3,3)

これはサブルーチンに配列を渡すときに知っていると役に立つ。

ただしFortran90以降では、分散メモリー型の並列機に配慮したせいか、
規格上ではこの種の並びが保障されなくなった。とはいえ、まず信じて大丈夫ww



560 名前:デフォルトの名無しさん [2006/06/30(金) 02:08:56 ]
どなたか、VB.NETでビリヤード程度のゲームのソースを
お持ちの方、またサイトを知っておられる方
教えていただけませんか??

561 名前:1/3 [2006/06/30(金) 04:06:33 ]
どなたか↓をC言語にしてもらえませんか?F2C: FORTRAN to C Translator
を使いこなせなくて・・・。よろしくお願いします。

C***  report2
C***  gakusekibangou
DIMENSION YA(30),VA(30),YS(30),VS(30),YR(30),VR(30)
OPEN(UNIT=16,FILE="dy.d")
OPEN(UNIT=17,FILE="dv.d")
G=9.8
R=0.3
CANALYTIC SOL.
DO 10 K=1,30
T=K
EP=EXP(-R*T)
VA(K)=G/R*(1.0-EP)
YA(K)=G/R*T-G/R/R*(1.0-EP)
10CONTINUE
YS0=0.0
YS1=0.0
YS0=0.0
VS0=0.0
YR0=0.0
VR0=0.0
H=0.01
DO 20 K=1,3000

562 名前:2/3 [2006/06/30(金) 04:07:25 ]
CSABUN
T=0.01*K
YS2=2.0*YS1-YS0+G*H*H-R*(YS1-YS0)*H
VS2=(YS2-YS1)/H
CRUNGE-KUTTA
BK1=VR0
BM1=G-R*VR0
BK2=VR0+H*BM1/2.0
BM2=G-R*(VR0+H*BM1/2.0)
BK3=VR0+H*BM2/2.0
BM3=G-R*(VR0+H*BM2/2.0)
BK4=VR0+H*BM3
BM4=G-R*(VR0+H*BM3)
YR1=YR0+H*(BK1+2.0*BK2+2.0*BK3+BK4)/6.0
YR1=YR0+H*(BM1+2.0*BM2+2.0*BM3+BM4)/6.0
IF(MOD(K,100).NE.0) GO TO 30
KK=K/100
YS(KK)=YS2
VS(KK)=VS2
YR(KK)=YR1
VR(KK)=VR1
30 YS0=YS1
YS1=YS2
VS0=VS0
VS1=VS2
YR0=YR1
VR0=VR1

563 名前:3/3 [2006/06/30(金) 04:08:26 ]
20 CONTINUE
WRITE(17,100)
DO 40 K=1,30
WRITE(17,150) K,VA(K),YS(K),VR(K)
40 CONTINUE
WRITE(16,200)
DO 50 K=1,30
WRITE(16,150) K,YA(K),YS(K),YR(K)
50 CONTINUE
100 FORMAT(5X,"T",5X,"VA",11X,"VS",11X,"VR")
150 FORMAT(2X,T3,3X,F10.5,3X,F10.5,3X,F10.5)
200 FORMAT(5X,"T",5X,"YA",11X,"YS",11X,"YR")

STOP
END

564 名前:デフォルトの名無しさん [2006/06/30(金) 10:01:15 ]
>>560-563 UZEEEEEEEEEEEEeeeeeeeeeeeeeeeeeewwwwwwwwwww


565 名前:デフォルトの名無しさん [2006/06/30(金) 17:45:48 ]
やっとこさコンパイルできたと思ったら実効できない・・・。

run-time error
error format/data mismatch
00401000 MAIN# [+03e4]

これはどういうエラー??



566 名前:デフォルトの名無しさん [2006/06/30(金) 18:28:15 ]
>>565
FORMAT文のエラーでないかな。

オプションをつけるとソース行が出ることがある。
トレースバック というデバッグオプションをオンにしてみそ。

デバッグオプションがわかんない場合は、
1)近くのわかっている人に聞くか、
2)あきらめて、プログラムにPRINT *、’unko 1’ 等のPRINT文をバラまいてエラー行を特定せよw


567 名前:デフォルトの名無しさん [2006/06/30(金) 20:46:43 ]
すいません、real*8の変数がNaN(Not a Number)になったとき、プログラムを
終了させるにはどうしたらいいですか・

568 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 20:51:28 ]
Gauss Jordan法を用いて逆行列を求めなさい
ピボット選択:i行以降の行j=i〜nでa(j,i)の絶対値が最大である行を捜し
       その行とi行の入れ替えを行う。

 よろしくお願いします(TT)


569 名前:デフォルトの名無しさん [2006/06/30(金) 21:12:49 ]
>>567
Fortran2003にならないと標準命令ではできない。
ベンダー拡張でできる場合もある。
IEEEのFormatを知っていれば自分でBITを調べる関数は作れる。

またランタイムのデバッグオプションで何とかなる処理系もある。


一般的にはNaNが出るのは配列のはみ出し等なので、まずはバグをなくせ!w

570 名前:567 mailto:sage [2006/06/30(金) 22:02:57 ]
>>569
そうなんすか、どうもっす!

571 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 22:04:23 ]
NaN は、負数の sqrt でよく出てくるな。
数値誤差でギリギリ負になる場合ってのもあるから、
式上は非負でも安心できない事が。
負なら 0 とする関数を作っておく必要がある。

572 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 10:54:35 ]
functionの引数にfunctionの値入れるにはどうしたら良いの?
f(x)=3x+g(x)+a+b
g(x)=x**2+c

program test
real x,a,b,c
external g

S=f(3,g,4,4,4)

function f(x,g,a,b,c)
xeternal g
f=3x+g(x,c)+a+b
return
end

function g(x,c)
g=x**2+c
return
end


いちおこれでいけたんだけど
g(x)=(x,h(x),d,e)

とかって3連コンボにするとうまくいかないんです(><)

function hの引数をgやfの引数いれたらいいんだよね?
つまりfの引数が一番多くなるってことでいいんだよね?
でもできないんです(><)

やりかたおしえて♪

573 名前:デフォルトの名無しさん [2006/07/01(土) 11:27:14 ]
>>572
いまいち質問がはっきりしないので外しているかもしれないが・・・

この種の問題は他の言語から来た人などがよく出会う問題だ。
FORTRANでfunctionを引数とすることには、規格上のあいまいさの問題が
あることを知っておくとよい。

FORTRANでは副プログラムに変数を引き渡すとき、参照渡し(アドレス渡し、CallByReference)
になっている。一方、関数自体は値を値として持っているのかどうか規格で定められていない。
C言語やPASCALなんかでは値を返していると思う。(たしか、そうだったと、思うw)

だから、引数に関数を置いたときの挙動は処理系に依存している。
大昔では、HITAC暴走、FACOMコンパイラエラー、ACOS、VAXはOKだったか?

また、値が返ってくるような引数に(F90のINTENT(INOUT)やINTENT(OUT))
のような関数を置くのは明らかにおかしい。
======================================================================
さて、>>572のプログラムは、つづり等の間違いを除けば一応正しい。
ただ、引数の型をきっちり合わせていないとうまくいかない可能性がある。
つまり S=f(3.0,g,4.0,4.0,4.0) 

また g(x,h(x),d,e) こういう形にしたい場合は、第二引数は普通の変数として
定義しておけばいいはず。 F90以降ならINTENT(IN)属性を付けておけば
コンパイラも多分おこらないだろう。

ま、一番確かなのはコンパイラのマニュアルを読むことだw

574 名前:573 [2006/07/01(土) 11:32:30 ]
質問が、関数ポインターで引数リストも渡したい、というものならFortranではできない。
Fortran2003を待つしかない。

>>572のプログラム自体は、externalで関数を渡しているので問題ない。
ただ、EXTERNALは関数ポインタではないので、引数の数(形式)までは渡せない。

固定の引数の形式(引数リスト?)をもったものを渡せるだけ。

575 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:30:05 ]
難しい解説ありがとうございますw
でもちんぷんかんぷんです^^;
f(x)=3x+g(x)+a+b
g(x)=x**2+h(x)+c
h(x)=4x+d
こういうのをやりたいってことなんです(><)

解説がよくわからないんですがCOMMONでa,b,c,dを定義しないとだめってことですか?




576 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:41:27 ]
S=f(3,g,4,4,4,)

function f(x,g,a,b,c,d)
xeternal g
f=3x+g(x,h,c,d)+a+b

function g(x,h,c,d)
external h
g=x**2+h(x,d)+c

function h(x,d)
h=4x+d
これじゃぁダメだったんです(><)

577 名前:573 [2006/07/01(土) 12:57:19 ]
>>575
たとえば、これならうまくいくはず。

program test
external g

S = f(3.0, g, 4.0, 4.0, 4.0)
PRINT *, S
END

function f(x,g,a,b,c)
external g
f=3+x+g(x,c)+a+b
print *, x, g(x, c), a,b,c
return
end

function g(x,c)
g=x**2+c
return
end

578 名前:デフォルトの名無しさん [2006/07/01(土) 17:52:52 ]
>>575
質問がうんこだと、回答もウンコしかもらえないよw

とりあえず、これがやりたいことか?動くよ。
program test
external g, h
S = f(3.0, g, h, 4.0, 4.0, 4.0, 1.0)
PRINT *, S
END

function f(x, g, h, a, b, c, d)
external g, h
f = 3.0 * x + g(x, h, c, d) + a + b
return
end

function g(x, h, c, d)
external h
g = x**2 + h(x, d) + c
end

function h(x, d)
h = 4.0 * x + d
end


579 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:24:39 ]
ウンコでゴメンw
でもうごかなかったんだよ・・・
も一度確認してみるね(・∀・)
普通3連コンボとかこういう風にやるもんなの?
もっとスマートな方法とかあるの?
でも関数の中に関数が定義できないってのがしょぼくね?fortran

580 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:50:34 ]
もちろん、しょぼい。


581 名前:デフォルトの名無しさん [2006/07/01(土) 19:14:04 ]
>>579
関数の中に関数は定義できる。
引数の形が任意の関数を渡すことはできない。
数学でいう汎関数のようなものはできない。

できないのは、ほとんど必要とされていないから。

普通は、以下のようにサブルーチンは固定のままで話が済む。
program test
S = f(3.0, 4.0, 4.0, 4.0, 1.0)
END

function f(x, a, b, c, d)
f = 3.0 * x + g(x, c, d) + a + b
return
end

function g(x, c, d)
g = x**2 + h(x, d) + c
end

function h(x, d)
h = 4.0 * x + d
end


582 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:36:18 ]
どもできましたw
function fの引数にhを入れるのを忘れてましたw
でもひとつうんこなしつもんなんだけどぉ
functionの中に配列渡すにはどうしたら良いの?

real Un(100)
integer Ko
Ko=36
X=UNK(Un,Ko)
end

function UNK(Un,Ko)
real Un
integer Ko
UNK=Un(Ko)
end

583 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:54:35 ]
>>582
ネタでなかったらそんな聞き方はしない筈

584 名前:デフォルトの名無しさん [2006/07/03(月) 14:19:38 ]
>>582
少しは前レス嫁ww いいけどなww

受け取る側で配列であることを示せばいい。
function UNK(Un,Ko)
real Un(*)
UNK=Un(Ko)
end
たとえば、こういうの。配列の最後の次元については、*で示してもいい。

ただ、普通はもう少し上品に配列の定義長を渡す。
多次元の場合は最後の次元以外でどうしても必要になる。
real Un(100)
Ko=36
X=UNK(100,Un,Ko)
end

function UNK(Mn, Un, Ko)
real Un(Mn)
UNK=Un(Ko)
end

FORTRAN77では配列の先頭要素のアドレスしか渡しておらず、配列のサイズに関する情報は
別個に明示的に渡さないといけない。いろいろ便利だが、バグの原因にもなるので、やれるなら
F90で書いてきっちりやったほうがいい。

けど、好きにやればいいさw

585 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:06:28 ]
ども
access violationとかでる(><)
変数宣言の順番変えたらうまくいったりする場合もあったり・・
これってバグってやつ?
f90でやったほうがいいの?それともCってやつのほうがいいの?
fortran以外だとdelphi pascalしかしらない・・・



586 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:19:48 ]
つまり配列を渡す場合にはいったん外部で配列の値を入力した変数を渡してやれば良いってことジャン??
めんどくせーーw
こんなところで10時間近く悩んでたなんてあほだなwwwwwww
fortranってしょぼくね?w

real Un(100)
integer Ko
Ko=36
Un=Un(ko)
X=UNK(Un)
end

function UNK(Un)
real Un
UNK=Un

587 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:22:14 ]
あ これじゃだめかU=Un(Ko)とかにしないとだめなんだな

588 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:45:26 ]
fortranまじしょぼいwwwwwwwwwwwwwwwwwwwwwww
引数の順序変えたらまともに動かなくなったり動くようになったりwww
なんでこんなに不安定なの?
使い物にならないジャン?

589 名前:デフォルトの名無しさん [2006/07/04(火) 15:05:57 ]
>>588
しょぼいのはFORTRANではない、お前だwww

単に使い方を誤解しているだけだ。

引数の順番を変えてうまく行ったり行かなかったりするというのは、
じつはどっちにしろうまく行ってないということだw

PASCALができるなら、F90の方が向いている。Module言語的になっているから。

しかし、書き込みを見ている限りPASCALで出来るとも思われぬがwうひょwww


590 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:06:51 ]
ごめんやっぱしょぼいのおれだったwwww
ってか72文字しかかけないんだって?
だったら72文字以上書いた時点でエラー出せよw
コンパイルスンナw
しかも変数の宣言間違ってたらエラー出せよw

591 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:21:33 ]
まあ、F77 がしょぼいのは確かだけどな。

592 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:45:36 ]
>>590
FORTRAN77には予約語とかはないし、空白とかをトークンとして区切るわけでもない。
コンパイラはまず空白を削除して頭から解釈してゆく。
したがって72文字より先の部分が切り捨てられても、解釈が通ればエラーにはならない。

大体、コンパイラが厳しければ厳しいで文句を言うんだから、ゆるいのを喜べ!
FORTRAN66なんかDO LOOPから飛び出して、なんかやった後またそのLOOPの中に
戻っていけんるんだぞ!こんなことできる言語はなかなかないぜ!


593 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 19:02:38 ]
それは利点じゃねーw

594 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 20:10:31 ]
>>590
下品でない変数名にしようよ。
貴婦人が見ているかもしれないんだから。

595 名前:デフォルトの名無しさん [2006/07/05(水) 03:24:52 ]
>>594
KISS MY ASS! F*CK U!

FORTRANの変数名が6文字の制限下では、Four Letter Words がぴったりだぜ!



596 名前:デフォルトの名無しさん [2006/07/05(水) 05:08:37 ]
さぁテポドンの弾道をFORTRANで計算しろ!



597 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 07:31:54 ]
>>596
do i=1.10
宇宙の果てまで、ちゅぼーん

598 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 14:07:32 ]
>>597
ほんとに10発撃ったらしいぞw 4発は不発だったらしいがwww



599 名前:デフォルトの名無しさん [2006/07/05(水) 19:01:15 ]
問題:L行M列とM行N列の行列の積を計算するサブルーチン副プログラムを作れ。
サブルーチン副プログラムを呼び出す主プログラムも作成し、結果を出力すること。
主プログラムでは二つの行列のデータ読み込みと結果の出力を行うこととする。
(この後プログラムが正しく動作することを確認するための例題が続きます
途中の文章をいれたプリント文はそれを入力させるためのものです)
real function SEKI(A,B,C,J,K,L)
real A(2,2),B(2,3),C(2,3)
c
do 30 I=1,L
do 20 J=1,N
C(I,J)=0
do 10 K=1,M
C(I,J)=C(I,J)+A(I,K)*B(K,J)
10 continue
20 continue
30 continue
c
return
end

600 名前:デフォルトの名無しさん [2006/07/05(水) 19:02:58 ]
c
do 70 K=1,N
print*,C(1,K)
70 continue
do 80 K=1,N
print*,C(2,K)
80 continue
end
c
print*,'1,-2,3,0,4,-1,2,1,0,-3を入力して下さい'
do 50 I=1,L
do 40 K=1,M
read*,A(I,K)
40 continue
50 continue

601 名前:デフォルトの名無しさん [2006/07/05(水) 19:03:53 ]
do 70 K=1,M
do 60 J=1,N
read*,B(K,J)
60 continue
70 continue
c
end

エラーが出るんですがもうどこが間違ってるのか全然わかりません。お手上げです。
誰か分かる方、ご教授願います。


602 名前:デフォルトの名無しさん [2006/07/05(水) 19:26:34 ]
>>599
function ではなく SUBROUTINE だべw
配列引数のサイズを、固定長で与えては一般性のあるプログラムにならない。
(これを次元の宣言と割り切る、はみ出し無視のFORTRAN66時代の猛者なら別だがwww)

あとは、まぁまぁ大丈夫でないの? 
70番が2回出てくる上に、妙なところにend文が割り込んで理解に苦しむが、
こぴぺ時の間違いとみなしておくw

603 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:05:21 ]
できたおw

program hoge
implicit none
real, allocatable :: A(:,:), B(:,:), C(:,:)
integer :: i,j, l,m,n
read *, l, m, n
allocate(A(l,m), B(m,n), C(l,n))
read *, ((A(i,j), j=1,m), i=1,l)
read *, ((B(i,j), j=1,n), i=1,m)
call seki(A, B, C, l, m, n)
do i=1,l
print *, (C(i,j), j=1,n)
end do
deallocate(A, B, C)
stop
contains
subroutine seki(A,B,C, l,m,n)
integer, intent(in) :: l,m,n
real, intent(in) :: A(1:l,1:m), B(1:m,1:n)
real, intent(out) :: C(1:l,1:n)
C = MATMUL(A, B)
end subroutine seki
end program hoge

604 名前:デフォルトの名無しさん [2006/07/05(水) 20:19:03 ]
>>603
おまw 
90でやったらわざわざMATMUL相当のサブルーチン作る意味無いw

ついでに77でも作ってやれw

605 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:53:04 ]
77だとこんな感じだお

SUBROUTINE SEKI(A,B,C,L,M,N)
REAL A(L,M), B(M,N), C(L,N)
DO 30 I=1,L
DO 20 J=1,N
C(I,J) = 0.
DO 10 K=1,M
C(I,J) = C(I,J) + A(I,K)*B(K,J)
10 CONTINUE
20 CONTINUE
30 CONTINUE
RETURN
END
C
PROGRAM HOGE
REAL A(3,3), B(3,2), C(3,2)
L=3
M=3
N=2
READ(*,*) ((A(I,J), J=1,M), I=1,L)
READ(*,*) ((B(I,J), J=1,N), I=1,M)
CALL SEKI(A,B,C, L,M,N)
DO 10 I=1,L
WRITE(*,*) (C(I,J), J=1,N)
10 CONTINUE
STOP
END




606 名前:学生(アホ16歳) mailto:hage [2006/07/05(水) 23:57:31 ]
以下の課題についてですが…
【自然対数 e は,1 + (1)-1 + (2*1)-1 + (3*2*1)-1 + ・・・ + (10*9*8*・・・・*2*1)-1 というように近似することができます.この値をディスプレイに表示するプログラムを作成しなさい.】

ちなみに77で書かないと点くれないそうで…(苦笑

77で階乗計算って…どうすればいいのですか?

607 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 00:30:23 ]
>>606
1! = 0!*1 = 1*1 = 1
2! = 1!*2 = 1*2 = 2
3! = 2!*3 = 2*3 = 6
4! = 3!*4 = 6*4 = 24
  :
n! = (n-1)! * n

k = 1
do 10 n=1, 10
k = n * k
write(*,*) 'n = ',n, ', n! =', k
10 continue
end


608 名前:デフォルトの名無しさん [2006/07/06(木) 01:18:11 ]
>>606
階乗は>>607でいいが、1項毎に定義どうりに計算するのではなく
一つ前の項に違いだけ掛ければいい。
y=1, y = y*x/1, y = y*x/2, y = y * x/3 ..............

が、さらに順を変えて尻から進めるほうがもっといい。
1 + x (1 + x(1 + x/3) / 2 ) / 1

609 名前:学生(アホ16歳) mailto:hage [2006/07/06(木) 03:22:58 ]
>>607-608
ありがとうございます!
出来ました。

610 名前:デフォルトの名無しさん [2006/07/07(金) 11:11:35 ]
fortranでC言語の#defineみたいに、プリプロセッサで定数指定できるのってありますか?

611 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 13:02:41 ]
拡張子を .F にしたらプリプロセッサを解析してくれるコンパイラも多い。

612 名前:610 [2006/07/07(金) 13:35:41 ]
>>611
返信どうもっす。じゃあ、fortranの標準では#defineみたいなのないんですね?

613 名前:デフォルトの名無しさん [2006/07/07(金) 13:56:35 ]
>>611
標準では存在しない。

#define は、便利な反面、批判も多いのでたぶん意図的に新しい規格でも不採用とおもわれ。
ただ問題点を無くした条件コンパイルなどのプリプロセッサへの対応は論じつづけられている。


614 名前:610 [2006/07/07(金) 18:17:48 ]
>>613

なるほど、納得いたしました。どうもありがとうございます!


615 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 20:37:06 ]
定数は parameter だな。



616 名前:デフォルトの名無しさん [2006/07/11(火) 19:31:21 ]
学校の課題をやっていただきたいのですが、、、
次の数列の和を求めよ。(DO文)
1/1+x=1-x+x**2-x**3+x**4-x**5・・・
打ち切り条件 1.0*10**-6
提出明日です。よろしくおねがいします。

617 名前:デフォルトの名無しさん mailto:sage [2006/07/11(火) 22:20:20 ]
割り込みすいません…
分数の足し算プログラムですが、
どこが違うかわからないので教えてくださいませんか?
PROGRAM FRACTION
INTEGER I,J,K,L,M,N
READ(*,*) I,J,K,L
CALL TUUBUN(I,J,K,L)
WRITE(*,*)M,N
CALL REDUCTION(M,N)
M=M/A
N=N/A
WRITE(*,*)M,'/',N
END

SUBROUTINE TUUBUN(A,B,C,D)
INTEGER A,B,C,D
M=A*D+B*C
N=C*D
RETURN
END

618 名前:デフォルトの名無しさん [2006/07/11(火) 22:24:36 ]
>>616
FORTRAN77で適当に作った。適当に直してくれ。
数学的には -1<x<1 で収束する式だが、1に近づくにつれて収束が遅くなる。
つまり、たくさんの項の和を取らねばならない。しかし、延々とやると数値誤差が
たまるので意味がなくなる。ゆえに適当なところであきらめて打ち切る。

PROGRAM VIP
PARAMETER (eps = 1.0e-6)
WRITE(6, *) 'INPUT x (-1 < x < 1)'
READ(5, *) x
s = 1.0
t = 1.0
DO 10 i = 1, 10000
t = - t * x
s = s + t
IF (ABS(t) .LT. eps) GOTO 999
10 CONTINUE
STOP 'NOT CONVERGED'
999 WRITE(6, *) ' sum =', s, ' iteration', i
WRITE(6, *) ' 1/(1+x) =', 1.0 / (1.0 + x)
STOP
END

619 名前:デフォルトの名無しさん [2006/07/11(火) 22:32:24 ]
>>617
サブルーチンの変数の範囲について根本的に誤解している。

メインプログラムとサブルーチンでは変数はお互いに見えない。

ゆえに、通分した分子と分母はM、Nはサブルーチンの引数で返す必要がある。

CALL TUUBUN(I,J,K,L, m, n)

SUBROUTINE TUUBUN(iA,iB,iC,iD, m, n)
M=iA*iD+iB*iC
N=iC*iD
RETURN
END


あと、暗黙の型は死んでも守るべし。周りがなんと言おうと守るべし。
かっぱに尻子玉を抜かれそうになっても寧ろ暗黙の型守るべし。

620 名前:617 mailto:sage [2006/07/12(水) 10:25:30 ]
>>619
途中からなくなっていたので、
もう一度直して
PROGRAM FRACTION
INTEGER I,J,K,L,M,N
READ(*,*) I,J,K,L
CALL TUUBUN(I,J,K,L)
CALL REDUCTION(M,N)
M=M/A N=N/A
WRITE(*,*)M,'/',N
END

SUBROUTINE TUUBUN(iA,iB,iC,iD)
INTEGER iA,iB,iC,iD
M=iA*iD+iB*iC
N=iC*iD
RETURN
END

621 名前:617 mailto:sage [2006/07/12(水) 10:26:19 ]
>>620
SUBROUTINE REDUCTION(P,Q)
INTEGER P,Q,X,Y
X=P
Y=Q
10 IF(X.EQ.Y) THEN GO TO 20
ELSE IF(X.GT.Y)
THEN X=X-Y
ELSE Y=Y-X
END IF
END IF GO TO 10
20 CONTINUE
A=X
RETURN
END

622 名前:デフォルトの名無しさん [2006/07/12(水) 14:25:40 ]
>>621
PROGRAM FRACTION
READ(*,*) I, J, K, L
CALL TUUBUN(I, J, K, L, M, N)
CALL REDUCTION(M, N, IA)
M = M / IA
N = N / IA
WRITE(*,*) M, '/', N
END
SUBROUTINE TUUBUN(N1, N2, ID1, ID2, NUMERA, IDENOM)
NUMERA = N1 * ID2 + N2 * ID1
IDENOM = ID1 * ID2
RETURN
END
SUBROUTINE REDUCTION(NUMERA, IDENOM, IGCD)
IX = NUMERA
IY = IDENOM
10 IF(IX .EQ. IY) THEN
GO TO 20
ELSE IF (IX .GT. IY) THEN
IX = IX - IY
ELSE
IY = IY - IX
END IF
GO TO 10
20 CONTINUE
IGCD = IX
RETURN
END
>>622

623 名前:さおり [2006/07/12(水) 16:17:47 ]
すいません!無理を承知でカキコします。
私は今理系で某国立大学に通ってるんですけど、水商売のバイトにハマってしまって全然授業についていってない状態なんです。
それでプログラミングの授業があるんですけど課題が出て「放物の運動(空気抵抗を考慮する)」のプログラムをfortranで作れって課題が出たんです。。
初速度と投げる角度を入力して一定時間ごと(1秒ごととか)の物体の位置をxとyで出すらしいんです。
私、授業にほとんど出てなくて本当にまったくわかってない状態なんです。
少し真面目な大学なんで私みたいな子は浮いてしまって、学校には助けてくれる友達もいないんです。
誰かプログラム作ってください。お願いします。この授業を落としてしまうと本当に留年なんです。おねがいします!!

624 名前:デフォルトの名無しさん [2006/07/12(水) 16:43:42 ]
>>623
まずはおっぱいうp汁

625 名前:デフォルトの名無しさん mailto:sage [2006/07/12(水) 21:23:23 ]
>>623
担当教官をお店で接待すれば優もらえるおw



626 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 00:14:44 ]
金があるなら留年しろ。

627 名前:デフォルトの名無しさん [2006/07/13(木) 01:04:04 ]
俺は少年なら助けてやるのだが・・・・女は興味ないwww

628 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 07:18:28 ]
>>623
課題だけ書く方が答えが得られるすれのようです。

629 名前:さおり [2006/07/13(木) 10:47:04 ]
本当にお願いします!
いろいろ事情があって留年できないんです。

630 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:22:06 ]
>>629
課題は省略しないで出題されたまま提示するべき
ヒントになるかどうか知らん
ttp://www12.plala.or.jp/ksp/mechanics/resistdown/

631 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:26:25 ]
>>623
空気定数って物体のサイズによって二通りの計算方法があるけど、どっちを使うの?

632 名前:631 mailto:sage [2006/07/13(木) 12:29:35 ]
>>629
>>630 のヒントの方の計算方法だと楽でいいよね。さあどっちだろうか?

633 名前:631 mailto:sage [2006/07/13(木) 16:25:24 ]
>>631
×空気定数→○空気抵抗

634 名前:さおり [2006/07/13(木) 21:43:35 ]
えーっと空気抵抗が速度の2乗に比例する場合らしいです。本当にありがとうございます。

635 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 22:08:31 ]
解決したみたいだから、次の宿題。



636 名前:デフォルトの名無しさん [2006/07/13(木) 22:56:22 ]
これから宿題をストーリーつきで頼む人は、

『ボク宿題が解けなくて困ってるんだ。
お兄ちゃん様に一緒に解いてほしいなぁ〜。云々』

という、もっとやる気を出させるストーリーを考えること!

637 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:00:37 ]
>>634
ああ、めんどくさい方ね。
それ、解析的に解が求まらないから、微分方程式出して数値解析するしかないかな?
一応、微分方程式を立ててみるけど、チェックしてみて
vx, vy を速度の x,y 成分として、物体の質量を m 、重力定数を g、空気抵抗の
係数を k とすると

m dvx/dt = -k vx √(vx^2+vy^2)
m dvy/dt = -k vy √(vx^2+vy^2) - mg

となるかな?あとは、授業で習った数値解析で vx, vy をまず求めるのだが……

638 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:19:43 ]
>>636
兄貴ぃ〜!
俺、宿題分かんないッス!!
徹夜で手取り足取り教えて欲しいッス!!

639 名前:デフォルトの名無しさん [2006/07/14(金) 00:15:18 ]
>>638
サブ! 手取り腰取り教えてやるぜ!!

640 名前:デフォルトの名無しさん [2006/07/14(金) 01:05:54 ]
>>637
最後まで解けよw

641 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 02:10:46 ]
>>637
言いだしっぺのh(ry

642 名前:641 mailto:sage [2006/07/14(金) 02:11:58 ]
間違った
637でなくて>>640

643 名前:637 mailto:sage [2006/07/14(金) 10:13:37 ]
>>640
そうじゃなくて、学校で習った数値解析法で解かないと
合格になる気がしないんですけど。XX法とか言ってもらえれば
続きも出来るのですが……

644 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 11:08:41 ]
>>634の書き込みを見ると、「らしい」なんて書いているから、課題の正確な内容を
把握してなさそう。仮に折角>>637が解いたところで「やっぱり違った」とかで別解を
要求してきそうだ。


645 名前:デフォルトの名無しさん [2006/07/14(金) 13:55:36 ]
C++スレ見たいに宿題依頼のテンプレが必要なんでね?

見たところ、宿題はいまだF77中心のようだし。f90かf77かも選択してもらわないと。



646 名前:さおり [2006/07/14(金) 16:17:43 ]
そんなこと絶対しません。よろしくおねがいします。

647 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 18:27:20 ]
つーことで、さおりタンの仕事は
1. 微分方程式の確認
2. 授業でならった微分方程式の数値解析法の(せめて)名前の確認
だね。






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

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

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