Fortranのプログラミングについて

このQ&Aのポイント
  • Fortranのプログラミングについて質問させていただきます
  • 順位と値のデータがあり、値が同じ場合に順位を平均したものを割り振りたいです
  • プログラムを組み立てる方法が分かりません。教えてください
回答を見る
  • ベストアンサー

Fortranのプログラミングについて

Fortranのプログラミングについて分からない事があり、質問させていただきます。ご回答いただければ幸いです。 現在、 R = 1 2 3 4 5 6 ・・・ 30 T = n1 n2 n3 n4 n5 n6 ・・・ n30 n1≦n2≦n3≦n4≦n5≦n6≦・・・≦n30 順位(R)と、順位に対応する値(T)のデータがあるのですが、値が同じ場合には 其々の順位を平均したものを割り振りたいと考えています。 例えば、 3位と4位と5位の値が同じ場合には、全てを4位として扱い、10位と11位の値が同じであればそれぞれを10.5位 とする様なプログラムを組み立てたいのですが、どの様にすればよいのか分かりません。 どなたか、お教えいただけないでしょうか?

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

## fortranとはまた懐かしい。 ## 私は、Fortran80~Fortran77くらいの頃しかさわっていないので ## 文法がもうあやふやなので、主として方針だけ。 まず、Tをすべて読み込んで配列Tに格納します。 次に、Rをすべて読み込んで配列Rに格納します。 配列Tを2番目から順番に処理していきます。(1番目は比較対象になるだけ) integer i integer j integer wk integer totalR wk = 1 do i = 2,30 if (配列T(i).NE. 配列T(i - 1)) then * 値が一致していない時、その直前までを平均する。 * 注:wkからi-1までの配列が同じ値となっている。 totalR = 0 do j = wk,i-1 totalR = totalR + R(j) end do j do j = wk,i-1 R(j) = totalR / (i - 1 - wk + 1) end do j wk = i end if end do i * 途中から最後まで等しかったときに平均処理がされないので totalR = 0 do j = wk,30 totalR = totalR + R(j) end do j do j = wk,30 R(j) = totalR / (i - 1 - wk + 1) end do j 後は、配列Rと配列Tを出力する。 とこんな感じ。 ## Fortran80ではブロックIF文ってなかったなあ~。 ## Do loopもこんな書き方できるのか、といいつつ。 (文法は以下のサイトを参考にしています。) http://www-het.ph.tsukuba.ac.jp/~ishizuka/Link/F90/sec0.html

gelgel0965
質問者

お礼

 機器の不具合で返信ができず、遅くなりました。 素人の私でも分かりやすいプログラム内容で大変ありがたいです。 自分でも一応は書いてみたのですが、こちらのほうが数倍スマートでしたので 教えていただいた方法で行いたいと思います。 プログラムにもセンスが求められるんですね。 ありがとうございました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

こんなのとか。 http://www.ideone.com/H48Ol

gelgel0965
質問者

お礼

回答していただきました事、感謝いたします。 はやくに回答していただいたのですが、自分にも流れが追いやすい方を 選ばせていただきました。 すみません。

関連するQ&A

  • FORTRAN77でプログラミング

    今年、大学の授業でFORTRAN77を使ったプログラミングを勉強することになりました。 今で3回授業が終わったところなのですが、いきなりつまずいてしまい皆さんの知恵をお借りしたいと思います。。 作るプログラムは 問:摂氏(C)、華氏(F)、絶対温度(K)のいずれかの値を { xx(温度の数値),yy(CかFかK) }のように入力したときに、入力した値以外の単位での温度値が表示されるプログラムを作れ。 自分なりに作ってみたのが下のプログラムです。 全く論外なプログラミングをしているかもしれませんが…。 (自作) c234567 implicit none real n,cx,fx,kx character*1 d,c,f,k c n:入力値 d:入力された温度の値 C:摂氏 F:華氏 K:絶対温度 write(*,*) '温度値、単位を表す文字を入力してください。' read(*,*)n,d if(d.eq.c)then cx=n fx=cx*(9/5)+32 kx=cx+273.15 else if(d.eq.f)then fx=n cx=(fx-32)*(5/9) kx=cx+273.15 else kx=n cx=kx-273.15 fx=cx*(9/5)+32 end if end if write(*,50) cx,'C',fx,'F',kx,'K' 50 format(' ',f7.3,a3,f7.3,a3,f7.3,a3) stop end これをどうしたらいいのでしょうか。 ちなみに、使用しているFORTRAN77は Compaq Visual Fortran Optimizing Compiler Version 6.1 です。 どうぞよろしくお願いします。

  • プログラミングなのですが

     n個の値 a〔0〕、a〔1〕、・・・、a〔n-1〕が与えられている時、 a〔i〕の順位rを求めるプログラミングなのですが、順位は自分より大きいものの個数+1ということです。お願いします。

  • FORTRAN77のプログラミングについて教えてください。

    ・学校の課題で任意の数値の平均と、入力した数の個数を出力するプログラムを作 りなさいという課題が出たのですがうまくいきません。次にあげるプログラムの 中で修正する部分を教えてください。 *課題2 平均値 integer N real X,T1,M * 初期値 N=0 T1=0 * 累積 10 read(5,*,end=20) X N=N+1 T1=T1+X go to 10 * まとめ 20 if(N.GE.2) then M=T1/N write(6,*) '総数は' ,N, '平均は',M ELSE IF(N.EQ.1) THEN WRITE(6,*) '総数は',N, '平均は',T1 ELSE WRITE(6,*) '数値がない' END IF END IF END ・この問題は最初からよくわかりません。教えてください。  「3つの数a,b,cを読み込む。a,b,cを三角形の3辺の長さとしたとき三角形にな  るかを判定しなさい。三角形にならない場合はその面積をヘロンの公式を求め  て表示する。     s=(a+b+c)/2 , ss=s(s-a)(s-b)(s-c) として       S=sqrt(ss) とする。」 以上の二つです。分かる方お願いします。

  • Fortran90 プログラミング

    プログラミング初心者です。Fortran90を使って、次の機能を持つプログラムを作成し、ソースと実行結果を示していただけませんか? 「半径rを入力すると、そのrを半径とする円の面積、球の体積、球の表面積を表示する。」

  • Fortranによるオブジェく志向プログラミング

    私は、ずっと、手続き型のプログラミングをやってきて、言語はFortranであり、そのプログラミングの内容は四則計算、ループ、分岐、ファイル入出力みたいなものに限定されていました。 ところが、最近はじめて知ったのですが、Fortranの2003ぐらいになるとオブジェクト指向プログラミングに対応していてクラス、メソッド、インスタンスなどのような概念が出てきたようです(だいぶ前からあったのかもですが、最近まで知りませんでした)。 そこで2つ質問なのですが、従来使っていた手続き型のプログラムはすべて原理的にオブジェクト指向プログラムに移行可能なのでしょうか。無理に移行しなくてもいいとは思いますが、そういう越境のようなことができるのかということですが(手間だけかかって時間の無駄かもしれませんが、訓練という価値はあります)。そして、最終的にはプログラミングというものがすべてオブジェクト指向に収斂してしまうということになるのでしょうか。 もう1つはFortranでオブジェクト指向プログラムができるという場合、バージョンとかそれに応じた仕様とかでその度合いに違いがあるのでしょうか。今までFortranで手続き型のプログラミング(四則計算等)をやっていたのでコンパイラの選択による違いに大差ないという感じでした(あまり方言がないとか)。オブジェクト指向ということになると”これはできるけど、あれはできない”とか際どい問題があるように思います。C++とかJavaの参考書に載っていたようなことがFortranで本当にどこまでできるのかという疑問です。これが明確にならないとただでさえ難しいオブジェクト指向プログラムで私のアルゴリズムにミスがあるのか、アルゴリズムは問題ないけどコンパイラがそれに対応してないという問題の区別がつかなくなると思うのですが。 Fortranのオブジェクト指向の解説本を見たことがないのでお尋ねしました。よろしくお願いします。

  • FORTRAN77のプログラミングを教えて下さい。

    FORTRAN77のプログラミングを教えて下さい。 九州・沖縄8件の名前kenと面積(km2)menと人口(人)jinが書かれたファイル'kyusyu.txt'がある。これを読み、面積、人口、人口密度(人/km2)mituの大きい順に県名と値を書き出すプログラムを完成させよ。(型宣言も必要) 主プログラムは、数、名前、値を与えるのみで、作業本体はサブルーチン副プログラムjunに任せる事とする。副プログラムは論理型変数を使う手法。

  • fortranで疑問

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

  • プログラミングの問題です。

    プログラミングの問題です。 C++です、教えてください。 n番目の「トリボナッチ数」Tnを以下で再帰的に定義する。 T(0)=0, T(1)=0, T(2)=1, T(n+3)=T(n+2)+T(n+1)+T(n) (n≧0) 2以上の整数 をscanfで入力し、それがn番目のトリボナッチ数T(n)と等しい場合はnを表示し、どのトリボナッチ数とも一致しない場合はNOとprintfで表示するプログラムを書け。

  • FORTRANの絶対値についてです。

    FORTRANでの絶対値はabsでできますよね。それなんですが、使い方が調べてもよくわかりません。 t=|xの平均-yの平均|をプログラムにするならば t=abs(xの平均-yの平均)とすればいいのですか? よくわからないので教えてください。

  • 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 です。

専門家に質問してみよう