プログラミングを上達させたい

プログラミングの勉強を始めた、情報学専攻の大学院生です。モチベーション維持のため、ブログに勉強したことを書いていきます。→就職。IT全然関係ない仕事をしています

Fortranで競技プログラミング入門!その2 条件分岐(if文)、繰り返し(do文)

この記事では、プログラミング言語Fortran」で競技プログラミングに挑む、その入り口まで案内します。
色んなコンテストがありますが、ここでは「AtCoder」という日本語のサイトで行われるコンテストをターゲットに説明します。

※前の記事はコチラ
Fortranで競技プログラミング入門!(AtCoder) - プログラミングを上達させたい


前回の記事では、Fortranで日本の競技プログラミングサイトAtCoderに解答を提出するまででした。
AtCoder

今回は、プログラミングの基礎である
・条件分岐
・ループ(繰り返し)
を使った問題まで解いてみます。
また、チョイスする問題は、僕が書いた入門用の問題をまとめた下記の記事から選んでいます。
frfrfrfr.hatenablog.com

※この記事は、このサイトを参考にしました。
Fortran 入門: 条件分岐(IF 文)
Fortran 入門: 繰り返し(DO 文)




今回の流れ

Fortranにおける条件分岐の書き方

Fortranでは、条件分岐(=if文)はこう書きます。
たとえば、"aが3未満ならaに4を代入"はこうです。

  if (a < 3) then
  	a = 4
  end if

"then"とか、少し面倒ですが、そのぶん"{}"がいらないのは少し嬉しいかもですね。

また、elseも使って
"aが3以下ならaに4を代入、aが7以上ならaに6を代入、そうじゃないならaに100を代入"ならこうです。

  if (a <= 3) then
  	a = 4
  else if (a >= 7) then
  	a = 6
  else 
  	a = 100
  end if

条件分岐を使った問題を解く

この問題を解きましょう。
abc020.contest.atcoder.jp

解答の途中まではこんな感じです。
ここから一部変更して、完成させてみてください。

program atcoder
  implicit none
  integer i
  read *, i    ! 変数iに、標準入力から数字を読み込み代入する

! ここに、iが1か2かによって何を出すか変えるプログラムを書く

end program atcoder

どうでしょう?できそうでしょうか。
この記事の最後に解答を書いておきますので、分からなかった方はそちらを見て、再度自分で書いてみてください。
また、上記の問題が解けた方は、次の問題を解いてみてください。数学の問題に見えるかもしれませんが、条件分岐のみで答えられます。
A: haruki、気になります! - CODE FESTIVAL 2014チーム対抗早解きリレー | AtCoder

Fortranにおける繰り返しの書き方

繰り返し、他の言語ならよく"for"で書かれるものですね。
Fortranで、たとえば"1から10まで出力する"のはこう書きます。
より詳細に言うと、"iを1から10に変化させる、そしてiが1から順に1ずつ増えていくたびにiを値を出力する"というコードです。

  do i=1, 10
    print '(i0)', i
  end do

繰り返しを使った問題を解く

この問題を、"繰り返しを使って"解きましょう。
abc043.contest.atcoder.jp
※前の記事で扱った問題です。

この問題は、入力がnの場合、
{\frac{n * (n + 1)}{2}}
が答えとなります。
この答え方はスマートですが、せっかくプログラミングをするので、泥臭く書いてみましょう。
つまり、"本当に1からnまで足してみる"という解答です。

program atcoder
  implicit none
  integer i, n, goukei
  read *, n    ! 変数nに、標準入力から数字を読み込み代入する
  goukei = 0   ! 変数goukei を0とする

  ! do文を使ってここに"goukeiに1,2,3...,nまで足す"内容を書く

  print '(i0)', goukei
end program atcoder

いかがでしょうか?
この記事の最後に解答を書いておきますので、分からなかった方はそちらを見て、再度自分で書いてみてください。

まとめ

以上となります。
Fortranでいくつか解答を提出してみたのですが、実行速度めちゃくちゃ速いですね・・・
さすが古いながら今まで使われているだけあります。
競技プログラミング界で、情報学とは全くの分野でFortranを使っているFortranerが増えたらさらに面白くなりそうですね。


ではでは、記事内で書いた問題の解答です。

★1つめ

program atcoder
  implicit none
  integer i
  read *, i    ! 変数iに、標準入力から数字を読み込み代入する
  if (i < 2) then
  	print '(i0)', 0
  else
  	print '(i0)', 1
  end if
end program atcoder

★2つめ

program atcoder
  implicit none
  integer i, n, goukei
  read *, n    ! 変数nに、標準入力から数字を読み込み代入する
  goukei = 0
  do i = 1, n
  	goukei = goukei + i
  end do
  print '(i0)', goukei
end program atcoder