くだすれFORTRAN(超 ..
494:デフォルトの名無しさん
06/06/16 13:46:56
>>493
>read(*,*)X
>として、小数点がつかない
>5
>などを読み込んだとき、Xにとんでもない値が入ってしまうのを
>回避する方法はあるでしょうか?
自由書式の場合は問題ない。
FORMATを与えていた場合に問題が生ずることがある。
小数点があれば与えたFORMATよりも、入力の小数点が優先されるが、
小数点がないと与えたFORMATの桁数にしたがって小数点位置が決められる。
>>491の安易な解決法は:を、に置換して自由書式で読み出すことだw
>>491の問題は>>492の方法で解決できるが、Fortran90以降を使うと
文字列関数が豊富な分やりやすい。ただし77の範囲でも実現は可能。
だらだらと書くもよし、:までを切り出した後、文字変数に右詰に
して返す関数を作るもよし。
内部ファイルと外部ファイルの違う点は、ファイルの読み込み位置が
毎回先頭に戻ってしまう事で、これがちょっとうざい。
外部ファイルとなんでも一緒のつもりで行って昔ちょっとはまったw
495:デフォルトの名無しさん
06/06/16 23:07:38
文字列の配列ってできますか?
character*50 c(10)
みたいな感じで。
496:495
06/06/17 00:01:25
あっ、できました。
また質問いたします。
integer i
character*50 c
do i=1,4
write(c,'(i4)')i
end
みたいな感じにして、
cに「1234」のような文字列が入るようにしたいのですが、
上手くいきません。
どうすればよろしいのでしょうか?
497:デフォルトの名無しさん
06/06/17 12:03:21
>>496
integer i
character*50 c
write(c,'(4(I1))') (i, i=1,4)
write(*,*) c
end
498:デフォルトの名無しさん
06/06/17 12:30:04
>>496
別解
DO i = 1, 4
WRITE(c(i:i), '(i1)') i
END DO
499:495
06/06/17 17:53:25
>>497
>>498
どうもサンクス
もう一個、
読み込んだファイルの全行数を知ることはできませんか?
500:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/06/17 18:50:57
>>500
あ、できました。どうもありがとう
READ(9,*, iostat = io)
ですね
502:デフォルトの名無しさん
06/06/20 23:21:38
今一番新しいfortranの規格ってfortran2003ってやつですか?
これ普及すんのかなぁ
503:デフォルトの名無しさん
06/06/21 00:32:08
>>502
する!
まだ実装したコンパイラないけどなw
504:デフォルトの名無しさん
06/06/21 09:50:12
マジスカ
まだ77でさえしぶとく残ってるのにね…
505:デフォルトの名無しさん
06/06/21 11:51:22
>>504
66だってまだまだ健在だぜ!
90で書いてるって言ってる奴も、珍妙な77や66の入り混じったハイブリットだったりするし。
506:デフォルトの名無しさん
06/06/21 12:00:43
そこまでいくとカコイイなw
507:デフォルトの名無しさん
06/06/21 18:54:00
fortran90で
n個の配列を準備してRANDOM_NUMBER関数を用いて
ランダムな値を配列に代入する。
ばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、
そのサブルーチンをcallする。
結果を出力する。
でばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、
そのサブルーチンをcallする。
というところがさっぱりわかりません。
どうすればいいでしょうか??
508:デフォルトの名無しさん
06/06/21 21:06:27
>>507
とりあえず、「ソート アルゴリズム」でググれば
いろいろとソート(並び替え)の方法が出てくるよ。
あとはそのうち簡単なものを選んで実装するのみ。
509:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/06/22 13:17:26
>>509
おまいFortranプログラマーでないだろうw
行内複数命令、暗黙の型からの逸脱、再帰関数・・・・・
他の言語だと推奨されるところだが、Fortranでは嫌われるものばかりw
育ちが分かるぜw うっしっしw
511:デフォルトの名無しさん
06/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
06/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:デフォルトの名無しさん
06/06/23 15:25:04
>>512
x(i:i+1)=(/x(i+1),x(i)/)
うわ! こういうswap tips があったのか。
514:デフォルトの名無しさん
06/06/23 16:04:06
>>513
隣接で良ければ x(i:i+1) = x(i+1:i:-1) という手もあるな.
515:デフォルトの名無しさん
06/06/23 16:59:24
>>514
Fortran 90 以降の並列型配列処理の強力さが全開!!
516:デフォルトの名無しさん
06/06/23 17:15:11
>>515
強力なんだが、暗黙の内にテンポラリ配列に展開するので、
超巨大配列に適用すると、すゲー時間がかかったりメモリーを食ったりする。
サブルーチンに渡すときに77の時のつもりで先頭要素のアドレスだけ渡している気になると
実はテンポラリにコピー、引き渡し、受け取り、テンポラリから元の配列へコピーとやってたりするw
517:デフォルトの名無しさん
06/06/26 18:15:09
すいません、くそ初心者なんですが文の途中に改行するときに
入れる記号を教えてください!
518:デフォルトの名無しさん
06/06/26 18:45:14
>>517
すいません、くそ初心者なんですが文の途中に改行するときに &
入れる記号を教えてください!
519:デフォルトの名無しさん
06/06/26 20:03:11
>>517
Fortran90なら>>518にあるように & を尻に付ける.
FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
520:デフォルトの名無しさん
06/06/26 20:45:54
>519
> FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
カーニハン、プローガー、プログラム書法、第2版、木村泉訳、共立出版、p.21では、
継続行を表すのに$が使われています。
その理由が次のとおり書かれています。
(ここで継続行をあらわすのに「$」を使っているのは、「$」がFortranの規格上
公式に認められている文字のうち、構文上特別の意味を持たないただ一つの
ものであることによる。こうすれば混乱が生ずる機会を最小にすることができる
とともに、欄をまちがったときにそれに気づく可能性が大きい。)
521:デフォルトの名無しさん
06/06/26 21:14:41
なるほど…
90でも$にしたほうがいいの
522:デフォルトの名無しさん
06/06/26 23:20:08
主プログラムの中で配列の番号指定して
それをfunctionに渡してやりたいんだけど・・・うまく渡せないんだけど・・・
どうしたらいいの?(><)
program UNKO
real chinko(10) ←ファイルから読み込ませる
i=5
なんちゃらかんちゃら
function sex(ぱらめーた)
sex=chinko(i)*manko
chinko(i)がゼロになるw
523:デフォルトの名無しさん
06/06/26 23:21:53
>>520
そういえばプログラム書法にはそうあったような気がするな。
漏れはACOSっ子だったので&を6カラム目に置かされていたwwww
数字を使う人たちは1,2,3,4・・と行が継続行の数だけ数字を増やして行く流派の人たちだった。
+は昔のFORTRANのテキストに多かった気がする。
>>521
90では前の行の尻に&だ。&以外は許されない。
続いた行頭においてもよかったはずだが。
90で固定カラムというのならまぁ$でもいいがwwww
524:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/06/26 23:29:07
下品すぎます
526:デフォルトの名無しさん
06/06/26 23:45:31
下品ですいません(><)
一瞬で答えが出ましたねすごいですw
必要な要素だけを渡す場合にchinko(5)のところはchinko(i)でもいいんですか?
具体的には主プログラム中の繰り返し回数iによってfunction中の値も変えたいんです(><)
527:デフォルトの名無しさん
06/06/26 23:54:08
>>526
OK
DO impo = 1, 69
anal = sex( chinpo(i) , ....... )
.......
END DO
528:518
06/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:デフォルトの名無しさん
06/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
06/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:デフォルトの名無しさん
06/06/27 23:30:54
すいません、教科書見ながらやってみたのですが全く手に負えません。
この課題お願いします。
m行n列の行列(実数)A,Bをキーボードから読み込んで、
行列の積C=ABを計算し、結果を画面に表示させなさい。
序盤からなかなかうまいことがいかず・・・お願いします。
532:デフォルトの名無しさん
06/06/27 23:57:19
>>531
m≠n のときはどうするんだw
533:デフォルトの名無しさん
06/06/28 00:39:57
>>531
Fortran90ならMATMUL という組み込み関数があるぞw
534:531
06/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:デフォルトの名無しさん
06/06/28 01:30:42
>>534
助けてやってもよいが、行列の積を考えると m*n と m*n の積は取れないと
>>532は言っている。
m’ * n と n * m のように 積をとる部分では次元がそろってないといけない。
もう少し問題文を正確に教えてくれ。
536:デフォルトの名無しさん
06/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
06/06/28 02:36:30
>>535
m行n列のAとn行m列のBということだと思われます。
>>536
ありがとうございます。
理解してみようと思います。
538:デフォルトの名無しさん
06/06/28 03:17:43
宿題ではないのですが、
WINDOWSのスタートアップに入れておいて、
PC起動してから約1時間後に勝手に計算を始めるFORTRANのプログラムをつくりたいのです。
そこで、以下のような概略を考えました。
・スタートアップでプログラムスタート
・現在時刻を取得して格納・DOループスタート。
このループ中で時刻取得を繰り返し、上で取得した最初の時刻の1時間後過ぎになったらループ終了
・やりたい計算を実行
・プログラム終了
と、こんな感じで考えたのですが、PC起動後ずっと時刻取得のループをまわし続けるのが
どうも無駄のような気がします。
こういう場合、どういうやり方が上手なんでしょうか
539:デフォルトの名無しさん
06/06/28 08:52:40
>>538
・案1
Windows のタスク機能を使う。
[スタート] ボタンをクリックし、[プログラム]、[アクセサリ]、[システム ツール] の順に
ポイントし、[タスク] をクリックします。
・案2 MS/DEC/Compaq/HP/INTEL FORTRAN の場合
SLEEP 関数を呼んで眠っていてもらう。
540:デフォルトの名無しさん
06/06/28 17:01:19
行列テラウザス
541:デフォルトの名無しさん
06/06/28 18:30:52
>>540
Fortran90なら行列気持ちよくいじれる.オナニーできるくらい.
542:デフォルトの名無しさん
06/06/28 19:14:22
いいなー。ところで、
Gauss-Jordanのピボット選択ってどうやるんですか
絶対値が最大のと0になるところを入れ換える。。
バカなんでさっぱりわからん。。
543:デフォルトの名無しさん
06/06/28 19:30:15
>>542
最低限度で良ければ,0が出た時に,そこから未処理分の列の係数をみていって
絶対値最大の行と入れ替えればいいだけだろう。
Ax=b
のbの対応行も入れ替え。
入れ替えた行を覚えておいて元に戻すのがめんどいかな。
544:デフォルトの名無しさん
06/06/28 22:53:56
課題が出たのですが、まったくわかりません。
助けてください。
m行n列の2つの実行れい、A、Bをキーボードから読み込んで
行列の席C=ABを計算し、結果を画面に出力しなさい。
留意点
汎用性のあるプログラムを設計すること。
出力設計については結果が見やすいことが肝心である。
問題の分析、再定義が必要(特に配列の扱いについて)
行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。
と書いてありますが、まったくわかりません。
お願いします。
545:デフォルトの名無しさん
06/06/28 23:05:25
>>544 昨日の>>531とは別人か?
FORTRAN77とFortran90でどっちがいいね?
その問題は設定が悪いw M*Nのサイズがあいまい。
>>536を見て、もっと詳しい要望を出せ。出力FormatをF4.1に変えればおk。
>行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。
これは整数と小数の言葉を間違って使っているw
546:デフォルトの名無しさん
06/06/28 23:20:42
あぁー ホント行列わかんねぇよ
考えてんだけど・・ Doループで頭がクルクルパー・・
>>543の入れ替えた行を覚えておいて元に戻すのがめんどいかな
って具体的にどうするの?
547:デフォルトの名無しさん
06/06/29 00:48:44
すいません>>536についてですが
c(i, j) = 0.0
というのはCの初期値ということでよろしいのでしょうか?
548:デフォルトの名無しさん
06/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
06/06/29 08:46:21
>>545FORTRAN77です。
L*N行列のものと、N*M行列のものの積で汎用性を持たせろということなので
10*6と6*9や3*3と3*3もできなければならないものと思いました。
>>548ググってみましたがサンプルプログラムが汎用性があるのがわかりません_| ̄|○
汎用性…
550:デフォルトの名無しさん
06/06/29 10:48:31
>>549
まず『汎用性』というものを具体的に定義しなければいけない。
FORTRAN77での汎用性であるから『行列の大きさを自由に変えられる
サブルーチン形式』と解釈しておけばいい。
以下例・・・
551:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
06/06/29 11:40:01
ホントは整合配列をきっちりしてやんなきゃないが、面倒なのでいんちきしたw
すぐ直せるから調べて直してくれw
色々エラーチェックとかも適当w
じゃあ
554:544
06/06/29 14:22:42
かなり難しいですね。。
わからない部分がほとんどですが、1つずつわからないところを
つぶしていきたいと思います。
わからなくなったら聞きますのでよろしくお願いします。
ありがとうございました。
555:デフォルトの名無しさん
06/06/29 15:03:41
サイズも渡せばいいだけじゃね?
556:デフォルトの名無しさん
06/06/29 16:48:13
>>555
うみゅ。
渡す配列毎に、使用した縦・横方向と、定義した縦方向の大きさが必要。
557:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/06/30 02:08:56
どなたか、VB.NETでビリヤード程度のゲームのソースを
お持ちの方、またサイトを知っておられる方
教えていただけませんか??
561:1/3
06/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
06/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
06/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:デフォルトの名無しさん
06/06/30 10:01:15
>>560-563 UZEEEEEEEEEEEEeeeeeeeeeeeeeeeeeewwwwwwwwwww
565:デフォルトの名無しさん
06/06/30 17:45:48
やっとこさコンパイルできたと思ったら実効できない・・・。
run-time error
error format/data mismatch
00401000 MAIN# [+03e4]
これはどういうエラー??
566:デフォルトの名無しさん
06/06/30 18:28:15
>>565
FORMAT文のエラーでないかな。
オプションをつけるとソース行が出ることがある。
トレースバック というデバッグオプションをオンにしてみそ。
デバッグオプションがわかんない場合は、
1)近くのわかっている人に聞くか、
2)あきらめて、プログラムにPRINT *、’unko 1’ 等のPRINT文をバラまいてエラー行を特定せよw
567:デフォルトの名無しさん
06/06/30 20:46:43
すいません、real*8の変数がNaN(Not a Number)になったとき、プログラムを
終了させるにはどうしたらいいですか・
568:デフォルトの名無しさん
06/06/30 20:51:28
Gauss Jordan法を用いて逆行列を求めなさい
ピボット選択:i行以降の行j=i〜nでa(j,i)の絶対値が最大である行を捜し
その行とi行の入れ替えを行う。
よろしくお願いします(TT)
569:デフォルトの名無しさん
06/06/30 21:12:49
>>567
Fortran2003にならないと標準命令ではできない。
ベンダー拡張でできる場合もある。
IEEEのFormatを知っていれば自分でBITを調べる関数は作れる。
またランタイムのデバッグオプションで何とかなる処理系もある。
一般的にはNaNが出るのは配列のはみ出し等なので、まずはバグをなくせ!w
570:567
06/06/30 22:02:57
>>569
そうなんすか、どうもっす!
571:デフォルトの名無しさん
06/06/30 22:04:23
NaN は、負数の sqrt でよく出てくるな。
数値誤差でギリギリ負になる場合ってのもあるから、
式上は非負でも安心できない事が。
負なら 0 とする関数を作っておく必要がある。
572:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
06/07/01 11:32:30
質問が、関数ポインターで引数リストも渡したい、というものならFortranではできない。
Fortran2003を待つしかない。
>>572のプログラム自体は、externalで関数を渡しているので問題ない。
ただ、EXTERNALは関数ポインタではないので、引数の数(形式)までは渡せない。
固定の引数の形式(引数リスト?)をもったものを渡せるだけ。
575:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/01 18:24:39
ウンコでゴメンw
でもうごかなかったんだよ・・・
も一度確認してみるね(・∀・)
普通3連コンボとかこういう風にやるもんなの?
もっとスマートな方法とかあるの?
でも関数の中に関数が定義できないってのがしょぼくね?fortran
580:デフォルトの名無しさん
06/07/01 18:50:34
もちろん、しょぼい。
581:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/03 13:54:35
>>582
ネタでなかったらそんな聞き方はしない筈
584:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/04 14:06:28
ども
access violationとかでる(><)
変数宣言の順番変えたらうまくいったりする場合もあったり・・
これってバグってやつ?
f90でやったほうがいいの?それともCってやつのほうがいいの?
fortran以外だとdelphi pascalしかしらない・・・
586:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/04 14:22:14
あ これじゃだめかU=Un(Ko)とかにしないとだめなんだな
588:デフォルトの名無しさん
06/07/04 14:45:26
fortranまじしょぼいwwwwwwwwwwwwwwwwwwwwwww
引数の順序変えたらまともに動かなくなったり動くようになったりwww
なんでこんなに不安定なの?
使い物にならないジャン?
589:デフォルトの名無しさん
06/07/04 15:05:57
>>588
しょぼいのはFORTRANではない、お前だwww
単に使い方を誤解しているだけだ。
引数の順番を変えてうまく行ったり行かなかったりするというのは、
じつはどっちにしろうまく行ってないということだw
PASCALができるなら、F90の方が向いている。Module言語的になっているから。
しかし、書き込みを見ている限りPASCALで出来るとも思われぬがwうひょwww
590:デフォルトの名無しさん
06/07/04 18:06:51
ごめんやっぱしょぼいのおれだったwwww
ってか72文字しかかけないんだって?
だったら72文字以上書いた時点でエラー出せよw
コンパイルスンナw
しかも変数の宣言間違ってたらエラー出せよw
591:デフォルトの名無しさん
06/07/04 18:21:33
まあ、F77 がしょぼいのは確かだけどな。
592:デフォルトの名無しさん
06/07/04 18:45:36
>>590
FORTRAN77には予約語とかはないし、空白とかをトークンとして区切るわけでもない。
コンパイラはまず空白を削除して頭から解釈してゆく。
したがって72文字より先の部分が切り捨てられても、解釈が通ればエラーにはならない。
大体、コンパイラが厳しければ厳しいで文句を言うんだから、ゆるいのを喜べ!
FORTRAN66なんかDO LOOPから飛び出して、なんかやった後またそのLOOPの中に
戻っていけんるんだぞ!こんなことできる言語はなかなかないぜ!
593:デフォルトの名無しさん
06/07/04 19:02:38
それは利点じゃねーw
594:デフォルトの名無しさん
06/07/04 20:10:31
>>590
下品でない変数名にしようよ。
貴婦人が見ているかもしれないんだから。
595:デフォルトの名無しさん
06/07/05 03:24:52
>>594
KISS MY ASS! F*CK U!
FORTRANの変数名が6文字の制限下では、Four Letter Words がぴったりだぜ!
596:デフォルトの名無しさん
06/07/05 05:08:37
さぁテポドンの弾道をFORTRANで計算しろ!
597:デフォルトの名無しさん
06/07/05 07:31:54
>>596
do i=1.10
宇宙の果てまで、ちゅぼーん
598:デフォルトの名無しさん
06/07/05 14:07:32
>>597
ほんとに10発撃ったらしいぞw 4発は不発だったらしいがwww
599:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/05 19:26:34
>>599
function ではなく SUBROUTINE だべw
配列引数のサイズを、固定長で与えては一般性のあるプログラムにならない。
(これを次元の宣言と割り切る、はみ出し無視のFORTRAN66時代の猛者なら別だがwww)
あとは、まぁまぁ大丈夫でないの?
70番が2回出てくる上に、妙なところにend文が割り込んで理解に苦しむが、
こぴぺ時の間違いとみなしておくw
603:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/05 20:19:03
>>603
おまw
90でやったらわざわざMATMUL相当のサブルーチン作る意味無いw
ついでに77でも作ってやれw
605:デフォルトの名無しさん
06/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歳)
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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歳)
06/07/06 03:22:58
>>607-608
ありがとうございます!
出来ました。
610:デフォルトの名無しさん
06/07/07 11:11:35
fortranでC言語の#defineみたいに、プリプロセッサで定数指定できるのってありますか?
611:デフォルトの名無しさん
06/07/07 13:02:41
拡張子を .F にしたらプリプロセッサを解析してくれるコンパイラも多い。
612:610
06/07/07 13:35:41
>>611
返信どうもっす。じゃあ、fortranの標準では#defineみたいなのないんですね?
613:デフォルトの名無しさん
06/07/07 13:56:35
>>611
標準では存在しない。
#define は、便利な反面、批判も多いのでたぶん意図的に新しい規格でも不採用とおもわれ。
ただ問題点を無くした条件コンパイルなどのプリプロセッサへの対応は論じつづけられている。
614:610
06/07/07 18:17:48
>>613
なるほど、納得いたしました。どうもありがとうございます!
615:デフォルトの名無しさん
06/07/07 20:37:06
定数は parameter だな。
616:デフォルトの名無しさん
06/07/11 19:31:21
学校の課題をやっていただきたいのですが、、、
次の数列の和を求めよ。(DO文)
1/1+x=1-x+x**2-x**3+x**4-x**5・・・
打ち切り条件 1.0*10**-6
提出明日です。よろしくおねがいします。
617:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
06/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
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4325日前に更新/404 KB
担当:undef