2

練習用に、簡単なFortranコードを書こうとしています。範囲内の数値を乗算することになっています。毎回、同じ数字で構成されているかどうかを確認したいので、結果の積は文字列に変換されます。

整数を文字列に変換し、文字列のコンポーネントを入力する方法をテストしたところ、すべてが正しく機能していました。次に、string(number:number)を使用する文字列のコンポーネントを比較する必要があります。しかし、これを正しく行うためのコードを取得できませんでした。

コードと出力は次のとおりです。

program test
implicit none
character(10) myString
character(1) a,b,c,d,e,f
integer::i,j,k
do i=900,901,1
        j=900
        k=i*j
        write(*,*)'k =', k
        write(myString,'(i10)') k
        write(*,*)'myString = ', myString
        a=myString(1:1)
        b=myString(2:2)
        c=myString(3:3)
        d=myString(4:4)
        e=myString(5:5)
        f=myString(6:6)
        print*,a,b,c,d,e,f
        if (d==f) then
            print*,'hobla'
        else
            print*,'fobla'
        end if
end do

stop
end program test

そこで、文字列のコンポーネントを含む文字a、b、c、d、e、fを定義しました。そして、myString(i:i)を使用して各コンポーネントを見つけ、それを文字a、b、c、d、e、fの1つに格納しました。しかし、最初の2つだけが正しく機能しているようで、残りは保存されていません。

出力:

 k =      810000
 myString =     810000
     81
 fobla
 k =      810900
 myString =     810900
     81
 fobla

81に注意してください。これは初めて810000を与えることになっていて、「hobla」を印刷します。そして、もう一度810900を与えて、「fobla」を印刷します。しかし、これは起こりませんでした!

myStringがゼロを文字として受け入れるようにする方法を誰かに教えてもらえますか?

4

2 に答える 2

5

この文

write(myString,'(i10)') k

kの値を10文字のフィールドに書き込みます。kの有効数字は6桁しかないため、の最初の4文字はmyString空白で埋められます。次に、の最初の6文字myString(つまり、4つのブランクと8と1の数字)を変数に割り当てて、a,b,c,d,e,fそれらを出力します(4つのブランクと2つの数字)。

7..10の位置にある他の文字を印刷してみてmyStringください。「欠落している」数字が表示されるはずです。

于 2012-11-09T22:10:30.487 に答える
4

さて、私は問題を理解しました。コードに次の変更を加えることを検討してください。

program test
implicit none
character(10) myString
character(1) a,b,c,d,e,f
integer::i,j,k
do i=900,901,1
   j=900
   k=i*j
   write(*,*)'k =', k
   write(myString,'(i10)') k
   write(*,*)'myString = ', myString
   a=myString(1:1)
   b=myString(2:2)
   c=myString(3:3)
   d=myString(4:4)
   e=myString(5:5)
   f=myString(6:6)
   write(*,*) a
   write(*,*) b
   write(*,*) c
   write(*,*) d
   write(*,*) e
   write(*,*) f
   if (d==f) then
       print*,'hobla'
   else
       print*,'fobla'
   end if
end do

stop
end program test

結果の出力は次のとおりです。

 k =      810000
 myString =     810000




 8
 1
 fobla
 k =      810900
 myString =     810900




 8
 1
 fobla

これはI、印刷時に数値が右揃えになるために発生します。したがって、書き込み中の文字列が 10 であるのに番号が 6 桁しかないため、先頭に空白がたくさんあります。つまり、先頭に 4 つのスペースがあります。

フォーマット文字列を変更すると、次のようになります。

write(myString,'(i10.10)') k

次に、スペースでパディングする代わりに、0 でパディングします。そうすれば、必要に応じていつでも比較する数字を保持できます。

于 2012-11-09T22:11:42.433 に答える