>>6 それだと出力してない。 OPEN と CLOSE の間で出力する。 ただ一度に欲張らず、まず固定された入力ファイルと出力ファイルで ちゃんと計算できるプログラムをつくって確認しておくべき。 その後、色々ループさせたり、ファイル名を変えたり出来るようにすべき。 ものには順番があり、近くから遠くへ及ぼすべしとは、四書のはじめ大学にも書いてあるw
8 :
これまでの教えていただいたプログラムが下記になります。 program test implicit none integer, parameter :: ndata = 400 real :: a(18, ndata), x(3, ndata), y(3, ndata) real :: s, sx, sy, tx(ndata), ty(ndata) integer :: i, j, icol character (len = 20) :: filenm write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm open(11,file= TRIM(filenm) ) open(12, file = 'input2.txt') open(13, file = 'input3.txt') ! do i = 1, 6 ! skip 6 lines read(11, *) end do do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do ! exel data x do i = 1, ndata read(12, *) (x(j, i), j = 1, 3) end do
9 :
! exel data y do i = 1, ndata read(12, *) (y(j, i), j = 1, 3) end do ! do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do print *, 'input column ' read *, icol sx = sum( tx * a(icol, :) ) sy = sum( ty * a(icol, :) ) s = sx / sy write(*,'(a,$)') 'File Name : ' stop end program test
10 :
write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm open(14,file=filenm) write(*,*) 'result=', s ! <--だから結果を書きだせってw
close(14)
11 :
write(14,*) 'result=', s ! <--だから結果を書きだせってw 思わず間違えたwwww
12 :
>>10>>11 アドバイスありがとうございます。とろいのですいません。 出力文 write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm open(14,file=filenm) write(14,*) 'result=', s ! <--結果を書き出すプログラム。 close(14) こういうことでしょうか?
最後にプログラム全体を書き込ませてください。 program test implicit none integer, parameter :: ndata = 400 real :: a(18, ndata), x(3, ndata), y(3, ndata) real :: s, sx, sy, tx(ndata), ty(ndata) integer :: i, j, icol character (len = 20) :: filenm_in, filenm_out write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_in open(11,file= TRIM(filenm_in) ) open(12, file = 'input2.txt') open(13, file = 'input3.txt') ! do i = 1, 6 ! skip 6 lines read(11, *) end do do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do ! exel data x do i = 1, ndata read(12, *) (x(j, i), j = 1, 3) end do ! exel data y do i = 1, ndata read(12, *) (y(j, i), j = 1, 3) end do
18 :
! do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do print *, 'input column ' read *, icol sx = sum( tx * a(icol, :) ) sy = sum( ty * a(icol, :) ) s = sx / sy write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_out open(14,file=trim(filenm_out)) write(14, *) 'input file name', filenm_in write(14, *) 'column no.', icol write(14,*) 'result=', s ! <--結果を書き出すプログラム。 close(14) stop end program test
19 :
本日もどうもありがとうございました。 お先に失礼します。
20 :
わからないので教えてください。 メモ帳(a.txt)のなかにデータがあります。 A B C D 1 1 1 1 2 2 2 2 ‥‥‥‥ 100 100 100 100 みたいな感じでデ−タがあるのですが、 B列の1行から100行まで D列の1行から100行までのデータを取り出して 計算(B*D)する際に連動させたいのですが どのようにプログラミングしたらいいでしょうか。 連動というのは、B列10行の時にD列10行の値を使うということです。 上手く説明できませんがお願いします。
21 :
program test implicit none integer, parameter :: ndat = 100 real :: x(4, ndat), y(ndat) open(10, file = 'a.txt', status = old) do i = 1, ndat read(10, *) x(:, i) end do y = x(2, :) * x(4, :) ! B * D print *, y stop end program test
do i = 1, 6 ! skip 6 lines read(11, *) end do do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do !ここはclose(11)とか不要でしょうか? ! exel data x do i = 1, ndata read(12, *) (x(j, i), j = 1, 3) end do ! exel data y do i = 1, ndata read(13, *) (y(j, i), j = 1, 3) end do do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do print *, 'input column ' !ここの読み込み時に3,6,9,12,15,18列を同時に読み込み計算させたいと考えています。 read *, icol sx = sum( tx * a(icol, :) ) sy = sum( ty * a(icol, :) ) s = sx / sy write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_out open(14,file=filenm_out) write(14, *) 'input file name', filenm_in write(14, *) 'column no.', icol write(14,*) 'result=', s ! <--結果を書き出すプログラム。 close(14) stop
>>20 Fortran で i は整数だぞ。聞き間違いか、そのおっさんがアホかどっちかだ。 後者の場合、かなりキているwww すぐ学生相談所に駆け込んで指導教官を変える実績作りを始めるべきw close は、プログラムが終われば自動で閉じられるので、今の場合 たいした問題じゃない。 TRIMに関しては、コンパイラが手元にないのでよく分からんが、 エラーが出るとは思えない。まぁそれで動くというならよし、 文字列の尻に空白がついて困るというなら、なんとか考えるべしw データを一度に計算したいというなら、大した計算量ではないので 計算は全データについて実行して、出力の所で選択するようにすればよい。 そのために、配列を拡張しておく必要がある。s, sx, sy program test implicit none integer, parameter :: ncolumn = 18, ndata = 400 real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata) real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata) integer :: i, j, icol
27 :
! exel data y <----EXCELな do i = 1, ndata read(13, *) (y(j, i), j = 1, 3) end do close(11) close(12) close(13) do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do do i = 1, ncolumn sx(i) = sum( tx * a(i, :) ) sy(i) = sum( ty * a(i, :) ) end do s = sx / sy write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_out open(14,file=filenm_out) write(14, *) 'input file name', filenm_in write(14, *) 'column no.', icol write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。 close(14) stop end program test
28 :
> i do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do ↑強いて言えばこの実数計算に i が入ることが気に入らないんじゃないか 整数*実数は実数計算になるはずなので的外れだが。 > エクセルデータxを組み込んだ計算式:sx=s+(real(i)*50.0-25.0)*?*x3 > エクセルデータyを組み込んだ計算式:sy=s+(real(i)*50.0-25.0)*?*y3 -----------------------------------↑ この s って sx か sy の誤記?それとも別の変数?
29 :
>>27>>28 返信遅くなってすみません。家の方で一週間以上経っても書き込み規制が解除されないみたいで、 またネカフェからです。月曜日に現状の報告会があったので、準備やらなんやらで閲覧が 遅れてしまい、申し訳ありません。 毎回教えていただきありがとうございます。 >この s って sx か sy の誤記?それとも別の変数? この質問なんですが、私の持っているfortranの本にシグマ(Σ)を使った合計値の算出のプログラム例に記されていたので そのまま作ったものです。ですので、この形で載っていただけので、そのまま使っています。sは一応s=s+1みたいな感じで s=1とすると右辺に数値が代入され、左辺にs=2と計算させるような感じで入力した値を表現したつもりです。
30 :
以下に順序を変更してみたプログラムデータをコピペします。 program test implicit none integer, parameter :: ncolumn = 18, ndata = 400 real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata) real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata) integer :: i, j, icol character (len = 20) :: filenm_in, filenm_out write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_in open(11,file= filenm_in) do i = 1, 6 ! skip 6 lines read(11, *) end do do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do close(11) open(12, file = 'mydata1.csv') ! excel data x do i = 1, ndata read(12, *) (x(j, i), j = 1, 3) end do close(12)
31 :
! excel data y open(13, file = 'mydata2.csv') do i = 1, ndata read(13, *) (y(j, i), j = 1, 3) end do close(13) do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do do i = 1, ncolumn sx(i) = sum( tx * a(i, :) ) sy(i) = sum( ty * a(i, :) ) end do s = sx / sy write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_out open(14,file=filenm_out) write(14, *) 'input file name', filenm_in write(14, *) 'column no.', icol write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。 close(14) stop end program test こういう順序の違いで計算結果って違ってきますか? あと、最近ビルドした後コンパイルエラーばかり出てしまいますが、workplaceは一回ごとにこちらもcloseしないと 前のデータが残ってしまい、正しい計算ができない原因と考えられますか? すみません、どんなことでも結構なので教えていただけると幸いです。よろしくお願いします。
32 :
program test implicit none integer, parameter :: ncolumn = 18, ndata = 400 real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata) real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata) integer :: i, j, icol character (len = 20) :: filenm_in, filenm_out write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_in open(11,file= filenm_in) open(12, file = 'mydata1.csv') open(13, file = 'mydata2.csv') !メモ帳 do i = 1, 6 ! skip 6 lines read(11, *) end do do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do ! ! exel data x do i = 1, ndata read(12, *) (x(j, i), j = 1, 3) end do
33 :
! excel data y do i = 1, ndata read(13, *) (y(j, i), j = 1, 3) end do close(11) close(12) close(13) do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do do i = 1, ncolumn sx(i) = sum( tx * a(i, :) ) sy(i) = sum( ty * a(i, :) ) end do s = sx / sy write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_out open(14,file=filenm_out) write(14, *) 'input file name', filenm_in write(14, *) 'column no.', icol write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。 close(14) stop end program test
34 :
上記で試してみたのですが、以下のようなエラーが起きてしまいました。(泣) mydata1,2は自分で読み込みたいファイルを書いたのですが、、、 -------------------Configuration: 2012 - Win32 Debug-------------------- Compiling Fortran... E:\2012.f90 E:\2012.f90(22): error FOR2934: lexical error: Invalid character E:\2012.f90(22): error FOR3852: syntax error E:\2012.f90(22): error FOR2934: lexical error: Invalid character E:\2012.f90(22): error FOR2934: lexical error: Invalid character E:\2012.f90(22): error FOR2934: lexical error: Invalid character E:\2012.f90(22): error FOR2934: lexical error: Invalid character E:\2012.f90(22): error FOR2934: lexical error: Invalid character E:\2012.f90(24): error FOR3541: duplicated DO index variable - I E:\2012.f90(29): error FOR3541: duplicated DO index variable - I E:\2012.f90(36): error FOR3541: duplicated DO index variable - I E:\2012.f90(41): error FOR3541: duplicated DO index variable - I E:\2012.f90(55): error FOR3596: missing END DO statement E:\2012.f90(55): warning FOR4265: symbol ICOL referenced but not set Error executing fl32.exe. 012.exe - 12 error(s), 1 warning(s)
35 :
>>34 do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do ! ↑ ここに全角文字の空白が入っている。それでエラーが出ている。 削れ。 残りのエラーは、それを直せば消える。 あんま全角文字は使わない方がいい。
36 :
lexical error: Invalid character エラーメッセージの意味を調べておくといいよ
37 :
program test implicit none integer, parameter :: ncolumn = 18, ndata = 400 real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata) real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata) integer :: i, j character (len = 20) :: filenm_in, filenm_out write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_in open(11,file= filenm_in) open(12, file = 'waterdata.csv') open(13, file = 'polystyrene.csv') !メモ帳 do i = 1, 6 ! skip 6 lines read(11, *) end do do i = 1, ndata read(11, *) (a(j, i), j = 1, 18) end do ! exel data x do i = 1, ndata read(12, *) (x(j, i), j = 1, 3) end do
38 :
! excel data y do i = 1, ndata read(13, *) (y(j, i), j = 1, 3) end do close(11) close(12) close(13) do i = 1, ndata tx(i) = (i * 50.0 - 25.0) * x(3, i) ty(i) = (i * 50.0 - 25.0) * y(3, i) end do do i = 1, ncolumn sx(i) = sum( tx * a(i, :) ) sy(i) = sum( ty * a(i, :) ) end do s = sx / sy write(*,'(a,$)') 'File Name : ' read(*,'(a)') filenm_out open(14,file=filenm_out) write(14, *) 'input file name', filenm_in write(14, *) 'column no.' write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。 close(14) stop end
>>78 思いつくものを挙げてみると... write(filenumber, '(a, i0, a)') 'plot "output[', i, '].txt" u 1:2' write(filenumber, '(a, i0, a)') "plot ""output[", i, "].txt"" u 1:2" write(filenumber, '(a, i0, a)') "plot " // char(34) // "output[", i, "].txt" // char(34) // " u 1:2" write(filenumber, '(a, a1, a, i0, a, a1, a)') "plot ", 34, "output[", i, "].txt", 34, " u 1:2" write(filenumber, '(13hplot "output[, i0, 12h].txt" u 1:2)') i
85 :
バッチファイルをそのまま生成させるって頭いいな
86 :
質問です。 配列を引数にする関数を定義したいのですが、 やり方がよくわかりません。 function FD(w) implicit none integer :: i integer,parameter :: n = 10 real(8) :: w(0:n),FD(0:n) do i = 0, n FD(i) = exp( - w(i)) enddo end function FD が関数で、これをメインプログラムで使いたいのですが、 x = FD(w) のような省略形だとちゃんと計算できるんですけど、 do i = 0, m x(i) = FD(w(i)) enddo みたいに配列を明示しようとすると 配列の形状が準拠していません。 とエラーが出ます。 ()を省略しないで書く方法はないですか?
87 :
>>86 w(i)は配列ではなく配列の要素(1個の変数)ですので 当然エラーとなります。 do i = 0, m x(i) = FD(w(i)) enddo の3行を、 x(:) = FD(w(:)) にすれば()付きの書き方にはなります。
88 :
>>87 回答ありがとうございます。 まだ、違いがよくわからないのですが 例えば、 do i = 0, m x(i) = FD(w(i)) + y(i+1) enddo とか do i = 0, m/2 x(i) = FD(w(i)) enddo do i = m/2, m y(i) = FD(w(i)) enddo のようなことは関数の場合、出来ないのですか? (:)だと出来ることが制限されてしまうような気がするんです。
fortran95 以降になるが、ELEMENTAL属性を使えばできる。 これはスカラーに対して定義しておくと、配列も受け付けるというもの。 ただし副作用のない PURE な副プログラムな必要がある。 elemental pure real(8) function FD(w) implicit none integer :: i real(8), intent(in) :: w FD = exp( - w ) end function FD これでメインルーチン側で x = FD( w ) と呼んでも do i = 1, 10 x(i) = FD( w(i) ) end do と呼んでもよろしい。 PURE が何かはマニュアルを見るか、鋼鉄天使くるみPUREを見る事。 シスタープリンセスREPUREでもいい。