[表示 : 全て 最新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の布教と初心者の救済をお願いします。 


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 ]
>>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






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

前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