情報処理概論
第１５回

情報基盤研究開発センター

演習３

谷本 輝夫

1

横の並びを全部の行でチェックj ←do j = 1, n !（前回、２に固定した部分を j に）count = 0
do i =1, m
if (board(i, j) == ball(side)) thencount = count + 1
if (count == 4) thenwrite (*,*) "won!"stop
6 [ ][ ][o][*][ ][ ][ ]end if
5 [ ][*][o][*][ ][ ][ ]else
4 [ ][o][*][o][ ][ ][ ]count = 0
end if
3 [ ][*][o][*][ ][ ][ ]end do2 [ ][o][o][o][o][ ][ ]end do1[*][o][*][o][*][ ][ ]1 2 3 4 5 6 7
2→ i

縦は？

j ←

do j = 1, m
count = 0
do i =1, nif (board(j, i) == ball(side)) thencount = count + 1
if (count == 4) thenwrite (*,*) "won!"stop
6 [ ][ ][o][*][ ][ ][ ]end if
5 [ ][*][o][*][ ][ ][ ]else
4 [ ][o][*][o][ ][ ][ ]count = 0
end if
3 [ ][*][o][*][ ][ ][ ]end do2 [ ][o][o][o][o][ ][ ]end do1[*][o][*][o][*][ ][ ]1 2 3 4 5 6 7
3→ i斜めは？(右上がり）→jdo i = 1-n+1, m
count = 0
do j = 1, n
if ((1 <= i+j-1) .and. (i+j-1 <= m)) thenif (board(i+j-1, j) == ball(side)) thencount = count+1
if (count == 4) thenwrite(*,*) 'won!'stop
end if6[ ][ ][o][*][ ][ ][ ]else
[ ][ ][*][o][*][ ][ ][ ]count = 0 5
4[ ][ ][ ][o][*][o][ ][ ][ ]end if3[ ][ ][ ][ ][*][o][*][ ][ ][ ]end if
2[ ][ ][ ][ ][ ][o][o][o][o][ ][ ]end do1 [ ][ ][ ][ ][ ][*][o][*][o][*][ ][ ]end do4-4 -3 -2 -1 0 1 2 3 4 5 6 7→ i

斜めは？(右下がり）→jdo i = 1-n+1, m
count = 0
do j = 1, n
if ((1 <= i+j-1) .and. (i+j-1 <= m)) thenif (board(i+j-1, n-j+1) == ball(side)) thencount = count+1
if (count == 4) thenwrite(*,*) 'won!'stop
end if
6 [ ][ ][ ][ ][ ][ ][ ][o][*][ ][ ][ ]else
[ ][ ][ ][ ][ ][*][o][*][ ][ ][ ]count = 0 5
4[ ][ ][ ][ ][o][*][o][ ][ ][ ]end if3[ ][ ][ ][*][o][*][ ][ ][ ]end if2[ ][ ][o][o][o][o][ ][ ]end do1[*][o][*][o][*][ ][ ]end do5-4 -3 -2 -1 0 1 2 3 4 5 6 7→ i

発展バージョン1：メインプログラム
program four
implicit none
integer, parameter :: m=7, n=6
character(len=1), dimension(m, n) :: board
integer :: step, sideboard = ' 'call show(m, n, board)
do step = 1, m*n/2
do side =1, 2
call drop(m, n, board, side)!
call show(m, n, board)!
call check(m, n, board, side)
end doend dostop
end program! dropサブルーチン中でshowもcheckも呼ぶ! コメントアウト! コメントアウト

6

発展バージョン1：サブルーチン drop
subroutine drop(m, n, board, side)
implicit none
integer, intent(IN) :: m, n, sidecharacter(len=1), dimension(m, n), intent(INOUT) :: board
integer :: x, y, done
character(len=1) :: mark!

中略call show(m, n, board, side)call check(m, n, board, side, x, y)
end subroutine

7

発展バージョン２：メインプログラム
program four
implicit none
integer, parameter :: m=7, n=6
character(len=1), dimension(m, n) :: board
integer :: step, side, x, yboard = ' 'call show(m, n, board)
do step = 1, m*n/2
do side =1, 2
call drop(m, n, board, side, x, y)call show(m, n, board)call check(m, n, board, side, x, y)
end doend dostop
end program

8

発展バージョン2：サブルーチン drop
subroutine drop(m, n, board, side, x, y)
implicit none
integer, intent(IN) :: m, n, side
integer, intent(OUT) :: x, ycharacter(len=1), dimension(m, n), intent(INOUT) :: board
integer :: done
character(len=1) :: mark!

中略end subroutine

9勝敗判定サブルーチン
subroutine check(m, n, board, side, x, y)
implicit none
character(1), dimension(m, n), intent(INOUT) :: board
integer, intent(IN) :: m, n, side, x, y
integer :: i, j, countcharacter(1), dimension(2) :: ball = (/'*', 'o'/)!横!縦!右上がり!右下がり
endsubroutine check10

勝敗判定 横!横（縦の位置はyに固定して良い）
count = 0
do i = 1, m
if (board(i, y) == ball(side)) thencount = count+1
if (count == 4) thenwrite(*,*) ball(side), ' is winner!'stop
end ifelse
count = 0
end ifend do11

レポート提出に関して
「プログラム」と「説明」はセットです。両方出ていないと採点されない場合があります。



レポート課題０１～１０

締め切り：７月３１日１３：００

レポート課題１１－１、１１－２、１３、１４


締め切り：８月１５日１３：００

１１－１、１１－２は「（新）」に提出、「（旧）」に提出した人も「（新）」に再度提出してください12

試験に関して

日時



場所


７月３１日１３：００～
この教室

内容


Linux の基本的なコマンド

Fortran プログラミングの基本

演習で扱ったプログラムに関する問題

13授業アンケート

14