fortran66のブログ

fortran について書きます。

FizzBuss Fortran

文字型変数と他の型の変数の変換には内部ファイルへの READ/WRITE を用います。内部ファイルへの I/O があった場合、pure 性が保たれるのか気になったので試してみました。結論からいうと pure でした。
内部ファイルの I/O は型変換の代入に近いので、もっともな仕様だと思います。66 時代には ENCODE/DECODE 関数で型変換してわけだし。
pure で elemental な関数は気持ちよいものなのでありがたいです。試しとして、FizzBuzz を作ってみました。Fortran 的には、非伝統的な問題で、いまいち何が面白いのか分からないんですけど、許してください。(西洋の宴会芸の一種のようです。)

実行結果

ソース・コード

Fortran2003 以降の機能を使って書いてみました。g0 format はFortran2008 で導入された機能です。
elemental な関数が文字配列を返す状況では、出力の文字列長がすべて同じ長さになってなければいけないようなので、文字長を 8 文字固定にしました。8 桁の数字までしか扱えませんが十分でしょう。
なおスカラー呼び出しの場合は、関数返り値の定義を文字列長が可変になるように allocable なスカラー文字変数にしてやれば、異なる長さで返すことができます。

module m_fb
  implicit none
contains
  pure elemental character(8) function fb(i)
    integer, intent(in) :: i
    write(fb, '(g0)') i
    if (mod(i,  3) == 0) fb = 'fizz'
    if (mod(i,  5) == 0) fb = 'buzz'
    if (mod(i, 15) == 0) fb = 'fizzbuzz'
    return
  end function fb
end module m_fb
    
program fizzbuzz
  use m_fb
  implicit none
  print '(15(g0))', fb([1:100])
  stop
end program fizzbuzz