Go 言語で「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみる-No.59「行列の和」
はじめに
「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみます。
取り扱う問題は以下のサイトを引用させていただきました。
検証環境
$ uname -moi
x86_64 unknown GNU/Linux
$ head -n 2 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
$ go version | head -n 1
go version go1.16.3 linux/amd64
問題
No. 59 行列の和
3x3 行列の和を求めて表示するプログラムを作成せよ。行列の値は 2 次元配列で表現し、繰り返しを使って計算すること。
3x3 行列とは縦 3 つ、横 3 つの 9 つの要素(値)をひとまとめにして扱うものである。2 つの 3x3 行列の和は次式のように、それぞれ同じ位置にある値を足したものとして計算できる。
例えば a12 という要素は、1 行目 2 列目の要素という意味である。それぞれ同じ位置にある要素を足せばよい。
なお、入力値は 1 行ずつ 3 つの値をスペースで区切って入力するようにするとよい。このためには、scanf("%d %d %d", &a[0][0], &a[0][1], &a[0][2]);のように書く(No. 57 参照)。
# 【実行例、下線部は入力例】
$ ./knock59
1つめの行列
1 2 3
4 5 6
7 8 9
1つめの行列
2 3 4
5 6 7
8 9 1
和
3 5 7
9 11 13
15 17 10
$
※おそらく上記の実行例のメッセージは一部誤りかと思われる。「1 つめの行列」のメッセージが 2 回繰り返されているが、2 回目は「2 つめの行列」というメッセージが正しいと思われる。
回答
knock59.go
package main
import (
"fmt"
)
func main() {
matrixes := [][][]int{
make([][]int, 3),
make([][]int, 3),
}
for mtx := 0; mtx < len(matrixes); mtx++ {
fmt.Printf("%dつめの行列\n", (mtx + 1))
for row := 0; row < len(matrixes[mtx]); row++ {
columns := make([]int, 3)
fmt.Scanf("%d %d %d", &columns[0], &columns[1], &columns[2])
matrixes[mtx][row] = columns
}
}
fmt.Println("和")
for row := 0; row < len(matrixes[0]); row++ {
fmt.Printf(
"%d\t%d\t%d\n",
matrixes[0][row][0]+matrixes[1][row][0],
matrixes[0][row][1]+matrixes[1][row][1],
matrixes[0][row][2]+matrixes[1][row][2],
)
}
}
実行
$ go run knock59.go
1つめの行列
1 2 3
4 5 6
7 8 9
2つめの行列
2 3 4
5 6 7
8 9 1
和
3 5 7
9 11 13
15 17 10
ひとこと
多次元配列を使い始めるとコドが読みにくくなってきますね。
ディスカッション
コメント一覧
まだ、コメントがありません