• 締切済み

データの数を数えるfortran プログラム

横にm個、縦にn個の実数データが整然と並んでいます。ファイルを開いて読み込むのですが、縦横に何個のデータがあるかプログラムに感知させる方法があるでしょうか。 縦にn個のデータがあることは簡単でした。しかし横にm個あることを感知させるのが難しいです。今は、とにかく全データの個数を調べて、その個数をnで割って求めています。 全データを読む方はは、1個読んで巻き戻し、2個読んで巻き戻し、3個読んで巻き戻し、.... としてデータをこれ以上読めないというところまで読んでその個数が全データということになります。この部分がかなり時間を使います。データを開いてエディタで1行目のカラム数を数えればいいわけですが、プログラム的にはどうなるでしょうか。Cだったら、改行を感知させるという方法があるかもしれません。Fortranだったらどうなるでしょうか。 ※Fotranの専門の会議室がないのかなと思っていますが。

みんなの回答

  • f272
  • ベストアンサー率46% (7972/17042)
回答No.4

#2です。 len_trimは今時のコンパイラであれば組み込み関数として認識するはずです。Fortran 77ではなく90以降として書いてください。 どうしても77として書きたいのであれば print*, "# of columns in row 1 =", len_trim(line) の代わりに do 10 i=512,1,-1 if(line(i:i).ne.' ') goto 900 10 continue 900 print*, "# of columns in row 1 =", i としてください。

回答No.3

> 改行を検出してそこで作業を止めるというのが必要かと思います。 ほんとですね。失礼しました。 方言の違いまでは把握していませんが、    CHARACTER*1 WCR,WFF,WFE    DATA WCR/Z0D/    DATA WFF/Z0C/ とかで宣言しておいてから、空白数を数えるDOループのなかで   IF (INDATA(LOOP:LOOP),EQ,WCR .OR. INDATA(LOOP:LOOP),EQ,WFF) GOTO ??? として、ループ脱出させてはどうでしょう。 それと、空白が1文字だけとは限らないなら、1文字 前が空白なら除外するように するとよいかと思います。 (もちろん、カンマ区切りのCSVだとロジック変わりますが)

  • f272
  • ベストアンサー率46% (7972/17042)
回答No.2

私ならこんな感じ。 program length_row_column character(len=512) line read(*, '(a)') line print*, "# of columns in row 1 =", len_trim(line) nrow=1 do read(*, '(a)',end=999) line nrow=nrow+1 end do 999 print*, "# of row =", nrow end program length_row_column

skmsk1941093
質問者

お礼

回答ありがとうございます。4行目のlen_trim()という関数が未定義なのですが、どのような処理になるでしょうか。 後半は行数(縦方向)を数えますが、これはわかりやすいです。前半のカラム数(横方向)を数える方が難しいと思っています。

回答No.1

> データを開いてエディタで1行目のカラム数を数えればいいわけですが これと同じことをプログラムで行えばよいのでは。 たとえば、1カラムの空白区切りなら、     CHARACTER*1024     READ(50.1000 ) INDATA 1000 FORMAT(A1024)     ICNT = 0     FOR 2000 LOOP=1,1024      IF (INDATA(LOOP:LOOP),EQ,' ') THEN       ICNT=ICNT+1      END IF 2000 CONTINUE みたいな感じで、1行目のみを数えてから ファイルをオープンし直すか、ファイル先頭に巻き戻して本番の読み込みさせるとか。 (Fortranの方言はいろいろあるので、あくまでもイメージですけど)

skmsk1941093
質問者

お礼

回答ありがとうございます。プログラムの趣旨に従って動作をさせてみました。F77で書いています。 CHARACTER*1024 INDATA open(50,file='data.txt') READ(50,1000 ) INDATA 1000 FORMAT(A1024) ! write(*,*) indata ICNT = 0 do i=1,1024 write(*,*) i,indata(i:i) ; pause IF (INDATA(i:i).EQ.' ') THEN ICNT=ICNT+1 END IF enddo close(50) write(*,*) icnt stop end 1024個を横方向に読んで、1文字1文字吟味していくということですね。 空白の数を数えるということになりますが、文字列のindataの中身はデータが終わって改行が来てもそれ以降もヌルになっているのでカウントしてしまうように思います。改行を検出してそこで作業を止めるというのが必要かと思います。すなわち、空白と改行を検知してそれに基づいてデータ数を推定するということが必要だと思いますが。改行をどうやって検知できるでしょうか。C言語の\nと思いますが。

関連するQ&A

  • fortranで疑問

    今fortranで困ったことがあります。 例えば 1 2 3 と縦に改行されているファイルを、新しいファイルに同じ数値データを写したいとき 元のデータから read(*,*)(n,i=1,3) で値を読み込み write(*,*)(n=i,3) で新しいデータに書き込み出来る と思ったのですが 3 3 3 と新しいファイルに書き込まれてしまうのです。 まず縦に改行した形で表示するにはどうしたら良いでしょうか? ちなみにdo~continue文でプログラムするとうまくいきます。

  • Fortranで/(スラッシュ)を含んだデータ

    Fortranで/(スラッシュ)を含んだ以下の日時データを読み込ませたいのですが、 DATE(←カラム) 12/08/14(←読み込ませたいデータ) 以下のプログラムでは"12"までしか読み込むことができません。 CHARACTER*8 DATE (中略) READ (3,*) DATE WRITE(*,*) DATE 何故スラッシュ以降を読み込ませられないのでしょうか。

  • Fortran90/95の出力方法について

    Fortran90/95の出力方法について Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください. 具体的には次のProgram reiを用いて質問します. program rei implicit none integer i, n read(*,*) n do i = 1, n write(*,*) i end do end このプログラムを実行させnに3を代入すると次のように表示されます. 1 2 3 しかし,私としては次のように改行せずに表示させたいのです. 1 2 3 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

  • データの読み込み方

    visualBasic.NETを使用しているのですが、データの読み方がわかりません。 縦n個、横m個のdouble型数値のカンマ区切りのテキストファイルがあります。 配列a(n,m)にそれらの数値を入れるプログラムを教えてください。 仕事で必要なのですが、手持ちの参考書には書いてありません。 配列の数と数値の長さがわかっているときの方法はわかります。 今、問題になっているのは、配列の数も数値の長さも未知のときです。 大変申し訳ありませんが、よろしくお願いします。

  • fortran:角度の範囲を限定させる

    fortranについてはほとんど素人同然なのですが。。。 角度で任意に与えた実数を0から2πの範囲に限定させて三角関数で同じ値を与える数値を出力するプログラムの書き方を教えてください! たとえば、500度は0度から360度の間に限定して三角関数で同じ値を与えるのは500-360=140(度)です。 4.5πは0radから2πradの間に限定して同じ値を与えるのは4.5π-2π×2= 0.5π(rad)です。 これと同様に任意の実数を0radから2πradの間に限定して同じ値を与えるプログラムを知りたいのです。 とりあえず考えてみたのは、 任意の実数xをまずπで割った値mとmを超えない最大の偶数nの差m-nを取ってまたπを掛ければよいのですが、nをどうやって求めればよいのかで悩んでいます。 もしかしたらほかのもっと楽な方法があるのかもしれませんが、よろしくお願いします。

  • ご指導お願い致します

    四角い箱の中に饅頭がきちんと並んで入っている。 縦に数えたら6個、横に数えたら4個。 このとき、6(個)×4(個)=24(個)と全体の個数が求められる。 しかし、長さの場合には6(m)×4(m)=24(m^2)のように、 面積の単位になるのに饅頭の場合はなぜ、個^2にならないのか。 宜しくお願い致します。

  • fortran90

    fortran90 現在 fortran90 で計算プログラムを作っております。 プログラムはかけたのですが、実行画面にエラーが出ます。 解決方法が分かりません。どなたか分かる方いらっしゃいますか。 プログラム implicit real*8 (a-h,o-z) parameter(n=900) open (1,file='004.txt',status='old') do 10 i=1,n read (1,*,end=11)xx,yy,zz,ww theta=acos(zz) phi1=acos(xx/sqrt(1-zz*zz)) phi2=asin(yy/sqrt(1-zz*zz)) write(*,*)theta,phi1,phi2 10 continue 11 end プログラム内容 あるフォルダーに保存してあるテキストファイルから4×4行列のデータを読み込み、そのデータからθの値とφ1、φ2のアタを求めるプログラムです。 実行分のエラー画面には、 acos: DOMAIN error です。

  • Fortranの並びによる出力の書式指定について

    Fortranなのですが、以下のような並びによる出力について考えます。 write(*,'( 5i2 )') (n,n=1,5) 出力結果は1 2 3 4 5 というだけのことで、2桁の整数を5個出力せよ、ということです。出力する前から5個の整数が来ることが分かっているということになります。 ところが個数が5じゃない場合、どのように書式指定すればいいでしょうか。出力する整数の個数がプログラムの実行結果によって変化する(つまり変数)ということです。よろしくお願いします。 Fortranのカテゴリがないようなので、C言語の専門家に聞くしかないと思い、こちらに上げてみました。Cだとすんなりできそうですが。

  • このプログラムはどのように作成するのでしょうか?

    プログラム作成について勉強しているのですが、分からないのでぜひ教えていただきたいです。 整数Mと初期値X(0)の値を入力し、 X(n+1)=16807X(n) をN=Mまで計算しファイルX.dataに書き出すプログラムを作成 (X(n)は倍数度実数) 分かる方、ぜひご教授ください。

  • 簡単なプログラムなんですが…

    C言語の簡単なプログラムなんですが、私のような初心者には良く分かりません… 出来るだけ詳しく教えていただけるとうれしいです。 下の2つのプログラムの作り方が理解できません。 (1)データ数nとn個のデータを入力して、その平均を求めるプログラム。 (2)(1)のプログラムに合計と標準偏差を計算して出力する機能を追加したプログラム。 C言語に詳しい方お願いします。