7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fortranで湯婆婆を実装してみる

Posted at

0. 前書き

 @Nemesis さんのJavaで湯婆婆を実装してみるを他の言語でやってみた記事を見て、これはFortranでやらねばと思い記事にした次第です

1. 環境

以下の環境で動作確認しています
 OS:Windows10 Home

gfortran
$ gfortran --version
GNU Fortran (x86_64-posix-seh, Built by strawberryperl.com project) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Fortran環境が欲しいという方、とりあえずコンパイラ(gfortran)があればよいです1
Windows
このサイトを参考にしてください。きっと上手くいきます。試してないけど

Linux
Ubuntuでやるならこんな感じですが、お好きなパッケージマネージャでそれっぽくインストールすれば手に入ります。

Ubuntu
> sudo apt install gfortran

mac
Macは(まだ)持っていないので詳しくは分かりませんが、こちらの記事を参考にお願いします
Mac (macOS Catalina, 10.15.2)にgfortranとPGI Fortran 19.10をインストールしたときの手順

2. いきなりコード

 小細工満載ですが、以下がコードになります
ただですね、Windows環境でやる場合は、S-JISで保存してください(^q^)。
utf-8だと日本語が文字化けします(ネタではなく)。私が謝るのも変ですが、マジですみませんホントごめんなさい

yubaba.f90
program yubaba
implicit none
    real :: rand
    integer :: nRand
    character(len=50):: originName
    character(len=2):: newName

    print*, "契約書だよ、そこに名前を書きな。"

    read(*, *) originName
    print*, len_trim(trim(adjustl(originName)))

    print*, "フン。"//trim(adjustl(originName))//"というのかい。贅沢な名だねぇ。"


    call random(rand)
    nRand = 2*int(rand*len(trim(adjustl(originName)))/2) + 1
    print*, nRand
    newName = originName(nRand:nRand + 2)
    print*, "今からお前の名前は"//trim(adjustl(newName))//"だ。"
    print*, "いいかい、"//trim(adjustl(newName))//"だよ。分かったら返事をするんだ"//trim(adjustl(newName))//"!!"

contains
subroutine random(x)
    implicit none
    integer ::clock, seedsize
    integer, allocatable :: seed(:)
    real, intent(out) :: x
    
    call random_seed(size = seedsize)  !シードを格納するのに必要な配列サイズを取得.
    allocate(seed(seedsize))  ! seed の配列数を決定
    call system_clock(count=clock)  !時間を取得
    seed = clock
    call random_seed(put=seed)
    call random_number( x )

    return
end subroutine random
end program yubaba

これをコピペしてコンパイルするとa.outa.exeって実行ファイルが出来るので、そいつを実行してやれば動きます

> gfortran yubaba.f90
> ./a.out
 契約書だよ、そこに名前を書きな。
山田太郎
 フン。山田太郎というのかい。贅沢な名だねぇ。
 今からお前の名前は太だ。
 いいかい、太だよ。分かったら返事をするんだ太!!

3.解説

 ここから先は、Fortran初めてだよって方向けにソースの解説に移ります。
 coming soon!

  1. 自分の場合は、Latexの環境構築した時に入れたstrawberryperlのbuilt-inコンパイラをそのまま使ってて、Windowsでちゃんと環境構築した事ないです。。。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?