• ベストアンサー

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 です。 どうぞよろしくお願いします。

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

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

c,f,kの初期化を忘れていますね。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- implicit none real n,cx,fx,kx character*1 d,c,f,k c='c' f='f' k='k' write(*,*) '温度値、単位を表す文字を入力してください。' read(*,*)n,d if(d.eq.c)then cx=n fx=cx*(9.0/5.0)+32 kx=cx+273.15 else if(d.eq.f)then fx=n cx=(fx-32)*(5.0/9.0) kx=cx+273.15 else kx=n cx=kx-273.15 fx=cx*(9/5)+32 end if end if write(*, 50) cx,fx,kx 50 format(f9.3,'C',f9.3,'F',f9.3,'K') stop end

yuuki0117
質問者

お礼

9.0や5.0にするのを忘れていました! すっごい初心者です。。。(汗) とても参考になりました。 ありがとうございました!

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

久しぶりに Fortran を使ってみました. #3 は大正解です. 5/9 とか 9/5 じゃダメ. 5/9 は 0 だし, 9/5 は 1 でしょ? #4 の else と if については, この場合普通には if (d .eq. 'C') then ~ else if (d .eq. 'F') then ~ else ~ end if とすると思いますが, if (d .eq. 'C') then ~ else if (d .eq. 'F') then ~ else ~ end if end if でも間違いではないです. else と if を同じ行に書くか別の行に書くかで異なります.

yuuki0117
質問者

お礼

なんとか完成させることができました。 ありがとうございました。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.4

まあ、好みもありますが プロとして突っ込まして貰います dは大文字、小文字、全角などが考えられます、まあ、全角は避けても、少なくとも、dを判定するifは if((d.eq.'c') .or. (d.eq.'C')) とすべきですね、ここで余計なカッコをつけているのは、論理演算の順序を明示するためで、これは癖として付けた方が良いです。 また、else とif は改行しない方がよいでしょう。 また、implicit noneは使わない方が良いですね。暗黙の型宣言には従ってください(i-nは整数以外では使わないこと)、これだけで可読性が向上します。 キャラクタはcかs(string)で始まる変数とするのも有効です。 あと、endifが一つ多い、セマンティクスとしては問題ないけど、多分、シンタックスで通らないはず。 ひょっとして、コンパイル、リンクの方法がわからないのでしょうか。

yuuki0117
質問者

お礼

詳しいご説明をありがとうございました。 コンパイルの方法などは大学でおしえられて知っているのですが、エラーメッセージを見てもどう間違っているのかがわからなくて困ってました。 まだまだ授業があるのでまた質問するかもしれませんが、出来ればお力を貸していただければと思います。 返事が遅くなって申し訳ないです。 学校のパソコンから書き込みしていたのですが、その後書き込もうとするといっつもエラーで書き込めなかったんです。 今友達の家のパソコンを借りてやっと書き込めたところです。 本当にありがとうございました。

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

実際に動かしてみて、正しく動作するかテストしてみては。 何となくですが、絶対温度からの変換しか動かない気が。 コンパイルの仕方とかは学校の人に訊いた方が手っ取り早いかと。

noname#69788
noname#69788
回答No.1

私も大学でFORTRANを使っていましたがほとんどわすれてしまいましたが、最後の行がCONTINUEでないのはなぜですか。

関連するQ&A

  • FORTRANの課題

    大学の授業の課題で 問 摂氏(C)、華氏(F)、絶対温度(K)の間で温度換算するプログラムを作れ。ただし、入力は「温度値、単位を表す文字」とし、それを換算した2つの温度を出力するようにつくること。例えば「25.0、'F'」と入力したら華氏温度25Fを摂氏温度と絶対温度に換算したものを表示する。 *温度単位の変換式は、摂氏温度をCとしたとき、F=9C/5+32 K=C+273.1 という課題が出されたのですがよく分からないので、アドバイス、回答の方お願いします。

  • FORTRAN77

    助けてください~ --------------------------------------- 華氏゜Fが与えられた時、摂氏℃と絶対温度Zを求めよ C=(5/9)(F-32),Z=C+273.16 ここで華氏゜Fは書式カードF1.5でカードに用意されていて、数値999.9のデータを読み込んだら終わりとする。 ただし、華氏゜Fの値は、-50.0゜Fから200.0゜Fまで10.0゜Fごとに変化させる。 --------------------------------------- で、私が頑張って(っていっても教科書を見ながら)書いたのが以下です。 --------------------------------------- * write(6,200) 200 format(1h ,8x,1hf,10x,1hc, 9x,1hz) 10 read(5,100)f 100 format(f5.1) if(f.eq.999.9)stop c=(f-32.0)*5.0/9.0 z=c+273.16 write(6,201)f,c,z 201 format(1h ,3(5x,f5.1)) go to 10 end ------------------------------------- 100 formatの下からdo文を使うのが狙いかと思いますがよくわかりません。 ちなみに参考教科書は入力データが ------------------------------------- 32.5 135.5 68.3 999.9 ------------------------------------- となっていました。多分これは使わないです。 よろしくお願いします(><)

  • 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まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。

  • Fortran90についての質問です。

    Fortran90に関する問題です。 「正の整数mを正の整数nで割った余りrを求める手順を、組み込み関数MOD(m,n)を用いずに、単一の算術式で表せ」 このプログラム文を以下のように作成しました。ファイル名は「amari.f90」にしました。 INTEGER::m,n,f,r REAL::a,k PRINT*,'Input 正の整数' READ*,m,n a=REAL(m) k=a/n f=INT(k) IF(m>0,n>0) THEN r=m-(f*n) PRINT*,'余り=',r END IF END そして、Cygwin画面上で gfortran -o amari.exe amari.f90と打って、コンパイルしようとしたら以下のようなエラー文が出ました。 amari.f90:8.6: IF(m>0,n>0) THEN 1 Error: Syntax error in IF-expression at (1) amari.f90:11.3: END IF 1 Error: Expecting END PROGRAM statement at (1) プログラム文のどこの箇所が間違っているのかを教えていただけませんか?お願いします。

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

    学校で下記のカッコ内を埋めなければいけないのですが、まったく分からなくて困っています。どなたか教えてくださいませんか?下のプログラムが分かりにくくてごめんなさい。 年賀はがきの当選番号(下二ケタ)5本を配列に登録しておき、コンソールから年賀はがきの下二桁の数字を入力するたびに、あたりはずれを返すプログラムを書きなさい。 登録用当選番号 07 12 35 46 77 1.配列に登録するというのは代入しておくことです。 2.入力は下2けたのみの入力とする 3.999を入力したら終了することとする 4.あたり・はずれは画面に表示すればよい 5.入力されたデータが5つの配列と同じかどうかを 比較して、同じ場合にはあたりを表示する命令文に とぶ。 6.あたりを表示したらデータ入力にもどる 7.同じ数値が無い場合は、はずれと表示してデータ 入力にもどる プログラム integer d(5),i,j,n d(1)=7 d(2)=12 d(3)=35 d(4)=46 d(5)=77 20 ( ) ( ) go to 40 do 10 ( ) if(d(i).eq.n) then write(6,*) ( ) go to 20 end if 10 continue write(6,*) ( ) go to 20 40 stop end

  • 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) とする。」 以上の二つです。分かる方お願いします。

  • fortran77でのif文

    FORTRAN77の問題の質問です。 授業でこんな問題が出て困ってます。 あるクラスにN人います。 そのクラスの平均身長がXです。 そのN人の中で、X以上の身長の人数Aを印刷するプログラムを作れと言う問題です。 ここで、IF~THENを使いなさい。 分かる人がいたら教えてください。 PROGRAM TEST7 WRITE(*,*)\'x人分の身長データを入力 READ(5,*)x WRITE(*,*)\'身長のボーダーラインを入力\' READ(5,*)G A=A-G B=B-G C=C-G D=D-G E=E-G F=F-G IF(A.GT.0) THEN STOP END 途中までは、こんな感じかと思ったのですが、行き詰ってしまいました。

  • FORTRAN手助けを・・

    摂氏から華氏、華氏から摂氏が出るプログラムを作ろうと思っています。 具体的に言えば100.0C(摂氏)を入力すると...F(華氏)の形で表示したいのです。最後にF,Cをつけ、それによって摂氏、華氏と認識するにはどのようにしたら良いのでしょうか? 答えでなくてもかまいません。何かヒントになるようなことでもいいので教えて下さい。

  • fortranのプログラム

    fortranのプログラム 現在、fortranの勉強をしております。 そこで、質問があるのですが、 ある関数f(x,y,z)の座標(x,y,z)の値がデータとして与えられているとき、 S=10+f をfortranで計算したいと考えております。 ただ、関数fは複数(f1、f2、f3)あり、次々とfに代入してSを計算したいのですが、どのようにプログラムしたらいいか思いつきません。 どなたか、ヒントだけでもいいので、教えてください。 ちなみに、私が考えたプログラムは(下のプログラムはポイントだけ書いてあります。endやその他関係ないと思われるところは省いております。) do 100 k=1,3 S=S+fk(x,y,z) continue function f1 f1(s,t,u)=・・・ return end f2(s,t,u)=・・・ return end 使用しているバージョンは、fortran77(本当は90を使っているのですが、77だけで書いています)です。

  • fortran77教えてください

    fortran77のプログラムについての質問です。 次のプログラムを実行するとどのような結果になるか教えてください REAL A,B,C,D,E,F A=7.0 B=5.0 CALL WASA(A,B,C,D) CALL WASA(C,D,E,F) WRITE(*,*)E,F STOP END SUBROUTINE WASA(P,Q,R,S) REALP,Q,R,S R=P+Q S=P-Q RETURN END

専門家に質問してみよう