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

このQ&Aのポイント
  • Fortran90/95の出力方法について説明します。具体的には、変数の値をwrite文で出力した後に改行しない方法について教えてください。
  • プログラムの改良方法についてお伝えします。諸事情により配列を使用しない場合にも、改行せずに変数の値を表示させる方法をご紹介します。
  • Fortran90/95を使ったプログラム実行時に、変数の値を連続して表示するための改良方法について教えてください。
回答を見る
  • ベストアンサー

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 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

質問者が選んだベストアンサー

  • ベストアンサー
  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.2

先程のURLに「18.3 数値と文字の変換を行う方法」という章がありますが。 数値を文字列に変換しても出力されませんでしょうか?

gooid_tt
質問者

お礼

YUI_AIさんの御指摘の通り,数値を文字列に変換することで出力することができました. どうもありがとうございました.

その他の回答 (2)

noname#144013
noname#144013
回答No.3

こんにちは。 既に解決されているかもしれませんが、数値のまま1行出力する例 を掲載させて頂きます。 以下の2パターンの方法により、1行出力を行うサンプルです。 1)WRITE文の出力リストで、「DO型出力リスト」を使用する。 2)WRITE文の書式指定で、「改行抑止($)」を指定する。 ※当方では、Cygwinのg95で検証してみました。 ■サンプルソース 注)インデント等のため全角スペースを入れています。   ・ご使用の際は、タブor半角スペースに置換して下さい。 ========================= !== WRITE文での1行出力テスト == PROGRAM testw2   IMPLICIT none   INTEGER i, n   CHARACTER sfmt*20   !== 個数の入力 ==   WRITE(*,fmt='(A)',advance='no') 'Number(1-99)='   READ(*,*) n   IF (n<1 .OR. n>99) THEN     PRINT *,'** Numerical range is over. **'     STOP   ENDIF   !== Test-1: DO型リストで出力(書式はデフォルト) ==   PRINT *,'== Test-1 =='   WRITE(*,*) ( i, i=1,n )   !== Test-2: DO型リストで出力(書式指定:n個×4桁) ==   PRINT *,'== Test-2 =='   WRITE(sfmt,'("(",I2,"I",I2,")")') n,4   WRITE(*,sfmt) ( i, i=1,n )   !== Test-3: 改行抑止($)で出力 ==   PRINT *,'== Test-3 =='   DO i = 1, n     WRITE(*,'(I4,$)') i   END DO   PRINT * END PROGRAM testw2 ========================= <サンプルの実行結果> Number(1-99)=10 == Test-1 == 1 2 3 4 5 6 7 8 9 10 == Test-2 ==   1  2  3  4  5  6  7  8  9 10 == Test-3 ==   1  2  3  4  5  6  7  8  9 10 ■参考サイト 配列要素を一行に出力する http://rakasaka.fc2web.com/fortran/fortran.html#output_array ↑これは上記サンプルのように配列でなくても利用できます。 WRITE文の改行を抑制する http://rakasaka.fc2web.com/fortran/fortran.html#write 以上です。

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.1

write で advance='no' と指定すれば良いみたいですよ 参考URL http://www.nag-j.co.jp/fortran/FI_18.html http://www.nag-j.co.jp/fortran/code/advance.f90

gooid_tt
質問者

補足

YUI_AIさん早速解答していただきありがとうございます。 私の説明不足だったのですが,実は質問をする前にwrite文でadvance='no'とする方法を試しました.しかし,write文でadvance='no'とする方法では文章を表示させることはできても変数を表示させることができませんでした.そこで,変数により数値を表示させつつ改行もしない方法が知りたいのです.

関連するQ&A

  • fortranで疑問

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

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

  • FORTRAN→Cに翻訳

     どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。  プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ C□LEAST SQUARE APPROXIMATION □PROGRAM MAIN9 □DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10) □WRITE(*,*) 'N ?' □READ(*,*) N □WRITE(*,*) 'x1,x2,..,xn ?' □READ(*,*) ( X(I),I=1,N ) □WRITE(*,*) 'y1,y2,..,yn ?' □READ(*,*) ( Y(I),I=1,N ) □WRITE(*,*) 'M ?' □READ(*,*) M □DO 110 K=0,M*2 □□VS=0. □□DO 100 I=1,N □100□VS=VS+X(I)**K □□S(K)=VS □110□CONTINUE □□DO 130 K=0,M □□□VS=0. □□□DO 120 I=1,N □120□VS=VS+Y(I)*X(I)**K □□□T(K)=VS □130 CONTINUE □□DO 140 I=1,M+1 □□□DO 140 J=1,M+1 □□□□K=I+J-2 □□□□SM(I,J)=S(K) □140 CONTINUE □□DO 150 I=1,M+1 □150 TV(I)=T(I-1) □□CALL SIMULE( AV, SM, TV, M+1 ) □□DO 160 I=1,M+1 □160 WRITE(*,1000) I-1,AV(I) □1000 FORMAT(1H ,'A',I1,'=',F10.5) □□STOP □□END ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  • fortran errorについて

    fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。 以下プログラム program test !ここからメインルーチン !前準備 配列の用意 implicit none integer N integer,dimension(0:N,0:N) :: A integer :: i,j,k read * ,N !初期状態の代入 do i=0,N do j=0,N A(i,j)=0 end do end do do i=N/2,N-1 A(N/2,i)=1 end do do i=N/2,N-1 A(N/2+1,i)=-1 end do !ループ 50回ループさせる do k=0,50 !状態の表示 call visualize !サブルーチン visualize subroutine visualize do i=0,N do j=0,N if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*" if(A(i,j)== 0) write(*,'(A1)',advance='NO') " " if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+" end do write(*,*) end do !end subroutine visualize call insert !サブルーチン insert subroutine insert do i=0,N do j=0,N if(A(i,j)== 1) A(i,j)=-1 if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j)) if(A(i,j)==-1) A(i,j)=0 end do end do !end subroutine insert end do end program test これでコンパイラすると In file test.f90:48 subroutine visualize 1 Error: Unclassifiable statement at (1) In file test.f90:69 subroutine insert 1 Error: Unclassifiable statement at (1) とでます いろいろ調べたのですが全くわかりませんでした できればよろしくお願いします

  • FORTRANのプログラミングについて

    たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。

  • fortranのプログラムで困っています。

    implicit real*8(a-h,o-z) dimension h(10,300) h(1,g)=1.0d0 h(2,g)=g*2.0d0 open(6, file='testes-ex.f', status='replace') do 12 n=1,2 do 11 i=1,2 g=2.0d0*i 11 write(6,*) h(n,g) 12 write(6,*) stop end として出力させると値がすべて0になってしまいます。 私としては1.0 2.0  1.0 4.0 と出力させたいのですが、 どこに問題があるのでしょうか? 当方fortran初心者ですのですごく馬鹿げた質問をしているかも しれませんが…気付くことがあればご指摘よろしくお願いします。

  • fortranでプログラムを実行するとEnd of fileと表示されてしまいます

    fortran初心者です。 以下のプログラムのコンパイルは出来るのですが、実行すると At line 9 of file ./rennsyu1.f90 Fortran runtime error: End of file というエラーがでてしまいます。 End of fileが何を意味するのか解からず対処が出来ません。 一つ言えることは、open文を使用すると必ずこのエラーが出てしまうということです。 どなたか、End of fileの意味と対処法を教えてください。 プログラム  既存のファイルxx.txtからx1とx2の値を読み取り、画面に出力させる。 program rennsyu1 implicit none real :: x(2) integer :: i open (17 , file = ' xx.txt ' ) do i = 1 , 2 read (17 , *) , x(i) write (6 , *) " x = " , x(i) end do close(17) stop end program rennsyu1

  • FORTRANの質問です

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? と質問しました。説明不足気味だったので、追加で説明させていただきます。 データの数はかわります。5個だったり、900個だったりします。 この数はわかりません。 program dat real n(10), y(10) write(*,*)'k=' read(*,*)k open(7,file='test.txt') do i=1,k read(7,*,end=200) n(i),y(i) end do 200 close(7) open(8,file='aftest1.txt') open(9,file='aftest2.txt') do j=1,k if(n(j).eq.0) then write(8,*) y(j) else if(n(j).eq.-1) then write(9,*) y(j) end if end do close(8) close(9) end と書いたのですがデータの数と繰り返しの数が一致しないと、出力されません。 いちいちファイルをみるのは面倒なので、なんとか したいのですが

  • fortran 3次元座標

    四面体の4頂点の3次元座標を設定するプログラムを例にならって以下のように書いたのですが、doループの内容がいまいちよくわかりません。p(1:3,m),p(1:3,n)が表されている値は理解できるのですが、出力されたファイルの内容が2行3列の答えが6つあって、なぜそのように答えが出てくるのかがわかりません。教えて下さい。よろしくお願いします。 rogram list2_11 implicit none integer :: m, n, fno = 10 real(8) p(3,4) call random_seed call random_number(p(1:3,1:4)) open(fno, file = 'tetra.d') do m = 1, 3 do n = m+1, 4 write(fno,*) p(1:3,m) write(fno,*) p(1:3,n) write(fno,*) '' enddo enddo close(fno) end program list2_11

専門家に質問してみよう