うちのカレーにはこれが入ってる!って食材ありますか?

C Pad for Salford FTN77というコンパイラを使っております。
下記の様にOPENで開いてCLOSEでとじたTEXT文についてですが…

WRITE(*,*) '入力した数に1プラスされます。'
READ (*,*) A
B=A+1
OPEN(UNIT=10,FILE='C:\001.txt')
WRITE(10,100) '入力したのは',A
WRITE(10,100) '1たすと',B
100 FORMAT(A)
CLOSE(10)
STOP

…計算もされず、左寄せにもなりません。
仮に「100 FORMAT(A)」を消して(10,100)を(10,*)にすると左寄せにはなりませんが 計算して結果は表示されます。

計算して結果を左寄せにするにはどうすればよいでしょうか。
ご存知の方、アドバイスをお願いします。

A 回答 (4件)

私が知っているfortranは77なのでもしかすると違っているかもしれませんが、



先ず変数Aは型宣言がないので実数扱いになります。

B=A+1(正確に記述するなら1ではなく1.)
が計算されることからもそういえます。

つぎに、FORMAT(A)の中のAは文字型を出力する際にし要するものですので、変数の型が一致していません。だから出力されないのだと思います。またAの後に桁数を示す数字が必要です。

実数に対してはFORMAT(F8.1)とかFORMAT(E8.3)とかのFやEを使用する必要があります。

また数値型の場合プラスマイナスの記号が入ることから、正値の場合+記号が省略されて、代わりにブランクが出力されたと思います。すなわち1つ目はブランクになります。
FORMAT(F1.0)等とすると桁オーバーを意味する*が出力されます。

整数型にしておけば1桁の場合FORMAT(I1)としておけば、左の1桁目に数字が出ますが、2桁以上やマイナス値のある数字の場合この方法は使用できません。

ブランクを取りたい場合、文字型で出力しなければなりませんが、たしかfortranには数値型データを文字型データに変換するコマンドがありません。

他の方法もあるかもしれませんが、そこで、一度数値データとしてファイルに出力して、そのファイルから文字型データとして1文字ずつ読み取るという方法で私自身は対処していました。

たしかこんな感じでした。
CHARACTER*1 H(8) 文字型と配列宣言
WRITE (10,601) A
601 FORMAT(F8.2)
BACKSPACE(10)
READ(10,602) (H(I),I=1,8)
602 FORMAT(8A1)

この後H(I)がブランクなら出力しない、ブランクでなければ出力するという判定作業を行って、ブランク以外の値が入っているI番目から後ろの値全部を文字型出力をします。

記憶が薄いので、上のとおりしてもうまくいきませんかもしれませんが、数値データを文字型データにうまく変換してやればできると思います。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
対処方法まで教えていただきまして感謝しております。
FORMAT(A)に対する認識が甘かったようです。
文字型データへの変換に対してもう少し勉強してみます。ありがとうございました。

お礼日時:2006/08/16 10:11

ANSIのFORTRAN77の規定では(最新はわかりません)、FORMAT文では、A型は左寄せ、それ以外は右寄せとなっています。



ですから、プログラマが意識しないと(実際は文字変数に一度ENCODEして操作する)それ以外の変換は出来ません。

すでに指摘がありますが、このFORMATでは実数は出力できませんよ。F型かE型の変換を追加する必要があります。WRITE(10,*)はリスト型変換で、変数の型に従って変換するのでうまくいったのです。
あと、FORTRANには、長い歴史の中でのデファクトスタンダードがあり、UNIT=10には通常書き込みません(読み込みデータに使う)、ご自分の範囲では問題はないと思いますが、今後、実用として使う際には意識した方がよいですよ。

暗黙の型宣言には従うというのも含めて。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
いろいろ間違いがあったことに気づきました。
それとF型とE型のFORMATについて調べてみます。
ありがとうございました。

お礼日時:2006/08/16 10:34

format が write の引数より少ないときには format の先頭から繰り返したような記憶があるので, 今の例だと各 write の 2つの引数をどちらも A (文字) で出力しようとするはずです. でも, 変数の A や B は文字 (列) じゃないのでうまく出力できないんじゃないかなぁ?


ちなみに FORTRAN で左詰めをするなら, 1回は文字 (列) 変数で受けないといけないような気がします. 少なくとも Fortran ではどうしようもなかったような.
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
実際Bにあたる部分はもっと複雑な計算なので、どうしてもFORTRANでプログラムしたいのです。
引数は1つにできそうなので、もう少し自分でも考えて見ます。

お礼日時:2006/08/16 09:56

> WRITE(10,100) '入力したのは',A


> WRITE(10,100) '1たすと',B
> 100 FORMAT(A)

write で引数を二つ渡しているのに、formatの指定には引数指定は一つしかないので
計算結果が出力されていないだけではないでしょうか?

またFortranのformatでは、整数や浮動小数点数を何桁で出力するかという
指定はできても、それを左寄せにするかどうかという指定はできなかったと
思います。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
Fortranを始めたばかりの初心者ですが、とても参考になりました。

お礼日時:2006/08/16 09:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報