配列 (2) 2 次元配列, String http://jv2005.cis.k.hosei.c.jp/
授業の前に自己点検 配列変数に格納される配列の ID と配列の実体の区別ができていますか 配列変数の宣言と配列の実体の生成の区別ができていますか メソッドの引数に配列が渡されるとき 実際に渡されるものは何ですか このことの重要な帰結は何ですか 引数の値渡しと参照渡しということばを例を挙げて説明できますか 授業で扱う例題はすべて基本的な処理の定石です 国語や英語の勉強では暗誦すべきものに相当します 何も見なくてもすらすらと口をついて出てきますか プログラミング入門 1 第 12 回 2
配列変数の宣言 配列の実体の生成 初期化 int[] = {10, 20, 30, 40; 省略形 int[] = new int[]{10, 20, 30, 40; 変数の宣言とその初期化 配列の実体の生成とその初期化をまとめて書くと int[] ; = new int[]{10, 20, 30, 40; 配列の実体の生成とその初期化をまとめて書くと int[] ; = new int[4]; [0] = 10; [1] = 20; [2] = 30; [3] = 40; 配列の ID を格納するための変数を宣言 長さ 4 の配列の実体を生成し その ID を に格納する が指している配列本体の各要素に値を格納する 3
配列の長さ int[] = {1, 2, 3; for (int i = 0; i <.length; i++) { System.out.println([i]); 実行結果 1 2 3 擬似コードで書くと 最後の要素のインデックスは = {1, 2, 3 for i を 0 から ( 配列 の長さ - 1) まで print [i] プログラミング入門 1 第 12 回 4
配列の ID のコピー と が指し示す配列の実体 (ID=750) が同じものになってしまっている つまり の各要素に加えられた変更は の各要素にも反映してしまうことになる プログラミング入門 1 第 12 回 5
配列の実体のコピー プログラミング入門 1 第 12 回 6
配列の型はメソッドの引数 戻り値にも使用できる pulic sttic void min(string[] rgs) { int[] = cretearry();... int 配列型 pulic sttic int[] cretearry() { return new int[]{10, 20, 30, 40; pulic sttic void printarry(int[] rry) { for (int i = 0; i < rry.length; i++) { System.out.println(rry[i]); プログラミング入門 1 第 12 回 7
引数の値渡しと参照渡し int 型, doule 型は値渡し プログラミング入門 1 第 12 回 8
引数が配列型だと参照渡し コピーされるのは配列の実体の ID プログラミング入門 1 第 12 回 9
今回のテーマ 2 次元配列 2 次元の画像処理を行う場合や 行列を用いた演算をするような場面でよく利用される 配列の要素がまた配列 いろいろな型 chr 型 oolen 型 String 型 プログラミング入門 1 第 12 回 10
2 次元配列は行列を扱うのに便利 int[][] =new int[3][2]; この例では 行 3 と考えることができる 2 列の行列を 宣言している [0][0] [0][1] [1][0] [1][1] [2][0] [2][1] プログラミング入門 1 第 12 回 11
実際は下の概念図のようになっているので数学でいう行列のように長方形にデータが並んでいるのとは違う このことを意識しないといけない場面がある プログラミング入門 1 第 12 回 12
2 次元配列の変数の宣言 int [][] ; 2 次元配列の実体を指す ID を格納するための変数 を宣言する ID を書き付けた紙をしまうための箱がつくられる int [][] ; = new int[3][2]; 要素を格納する箱をつくるには int [][] = new int[3][2]; まとめて書ける 3 次の実正方行列を扱いたいのなら以下のように宣言すればよい doule [][] = new doule[3][3]; プログラミング入門 1 第 12 回 13
要素まで一度に初期化する int[][] = {{1, 2, {3, 4, {5, 6; 3 行 2 列の行列ができたことになる 1 3 5 2 4 6 プログラミング入門 1 第 12 回 14
行単位に管理されている int[][] = {{1, 2, {3, 4, {5, 6; 3 行 2 列の行列ができたことになる 1 2 [0] 3 4 5 6 [1] [2] プログラミング入門 1 第 12 回 15
2 次元配列を走査するときの書き方 int[][] = {{1,2, {3,4, {5,6; for (int i = 0; i <.length; i++) { for (int j = 0; j < [i].length; j++) { System.out.println("[" + i + "][" + j + "] = " + [i][j]);.length は行数 [i].length は第 i 行の長さ ( 列数 ) プログラミング入門 1 第 12 回 16
chr 型文字を扱う chr c = 'C'; chr spce = ' '; chr = ' あ '; chr 型の変数に文字を格納することができる chr = 'A'; System.out.println(); chr 型のデータつまり文字は println 命令や print 命令で表示することができる プログラミング入門 1 第 12 回 17
chr 型のデータの比較 chr = 'A'; if ( == 'A') {... == で等しいか判定できる chr c = 'C'; if ('A' <= c && c <= 'Z') { // 大文字のときの処理 else if ('' <= c && c <= 'z') { // 小文字のときの処理 文字には番号が振られているので大小の比較ができる chr c = 'C'; if (Chrcter.isUpperCse(c)) { // 大文字のときの処理 else if (Chrcter.isLowerCse(c)) { // 小文字のときの処理 こちらの方が読みやすい書き方 18
oolen 型 true と flse の 2 つの値だけ if ( < 0)... この式は oolen 型で 式の値は true または flse のいずれか プログラミング入門 1 第 12 回 19
oolen を戻り値にもつメソッド pulic sttic void min(string[] rgs) {... if (isequilterl(,, c)) System.out.println(" 入力された三角形は正三角形 "); else if (isisosceles(,, c)) System.out.println(" 入力された三角形は二等辺三角形 "); else System.out.println(" 入力された三角形は通常の三角形 "); pulic sttic oolen isequilterl(doule, doule, doule c) { return ( == && == c); pulic sttic oolen isisosceles(doule, doule, doule c) { return ( == == c c == ); 20
oolen 型を明示的に使う // 無限ループ while (true) {... // 探索 oolen found = flse; for (int i = 0; i < rry.length; i++) { if (rry[i] == serching) { found = true; if (found) { // 見つかった場合の処理 プログラミング入門 1 第 12 回 21
String 型文字列を扱うための型 String line = "Hello, world!"; int length = line.length(); 文字列 line の長さは line.length() で取得できる 配列 の長さは.length プログラミング入門 1 第 12 回 22
line chrat 命令 String line = "Hello, world!"; // 先頭の文字を取得 chr hed = line.chrat(0); // 末尾の文字を取得 chr til = line.chrat(line.length() - 1); line.chrat(5) H e l l o, w o r l d! line.chrat(0) line.chrat(line.length()-1) プログラミング入門 1 第 12 回 23
chrat 命令をループの中で使う String line = "Hello, world!"; for(int i = line.length() - 1; i >= 0; i--){ System.out.print(line.chrAt(i)); 出力!dlrow,olleH プログラミング入門 1 第 12 回 24
コンソールから入力された文字列 int input = Integer.prseInt(reder.redLine()); 実は 2 段階の操作をまとめて書いたものだった String line = reder.redline(); int input = Integer.prseInt(line); redline 命令が返すのは String 型のデータ つまり文字列 プログラミング入門 1 第 12 回 25
redline 命令で獲得した String を そのまま処理する pulic sttic void min(string[] rgs) throws IOException { BufferedReder reder = new BufferedReder(new InputStremReder(System.in)); String line = reder.redline(); for(int i=line.length()-1; i>=0; i--){ System.out.print(line.chrAt(i)); System.out.println(); Hello, world!!dlrow,olleh 入力 出力 プログラミング入門 1 第 12 回 26
chr[] 型と String 型 chr[] rry = new chr[10]; chr[] rry = {'H', 'e', 'l', 'l', 'o'; chr [] 型だと要素の変更ができる String は変更ができない ( その代わり便利な点もあるがここでは説明しない ) 相互の変換もできる ( 詳しくは講義資料参照 ) プログラミング入門 1 第 12 回 27
一緒にやってみよう 今回の演習で使うテストドライバをいつものように指示通り正確にインストールする テストドライバの導入に成功すると プロジェクト jv2005 の中の test というフォルダに 12 という名前のフォルダが作成される このフォルダには今週使用するテスト一式が入っている j1.lesson12 というパッケージを作成する 演習資料にある ReversePrint, MtrixAdd を擬似コードの検討から開始し 一連のテストを手順通りに実行せよ プログラミング入門 1 第 12 回 28
MtrixAdd の解説どのメソッドも責任があるプログラムは責任のネットワーク min 責任 :2 つの行列を用意し dd, printarry を起動する 行列の和を返す 2 つの行列を渡す 行列を渡す dd printarry 責任 : 行列の足し算責任 : 出力 プログラミング入門 1 第 12 回 29
dd メッソッド pulic sttic int[][] dd(int[][], int[][] ) { int[][] c = new int[.length][[0].length]; for (int i = 0; i < c.length; i++) { for (int j = 0; j < c[i].length; j++) { c[i][j] = [i][j] + [i][j]; return c; 行数 第 i 行の長さ どの行も同じ長さを想定しているので列の数と考えてよい プログラミング入門 1 第 12 回 30
printmtrix メソッド pulic sttic void printmtrix(int[][] mtrix) { for (int i = 0; i < mtrix.length; i++) { for (int j = 0; j < mtrix[i].length; j++) { System.out.print(mtrix[i][j]); System.out.print(" "); System.out.println(); 第 i 行の出力 プログラミング入門 1 第 12 回 31
課題 各自のペースで今回の課題をやってください プログラミング入門 1 第 12 回 32
ヒント : 行列の掛け算 c[0][0] = 00 10 20 01 11 21 02 12 22 00 00 + 01 10 + 00 10 20 02 20 01 11 21 02 12 22 for(int k=0; k<3; k++){ c[0][0]+=[0][k][k][0]; プログラミング入門 1 第 12 回 33
ヒント : 行列の掛け算 c[0][1] = 00 10 20 01 11 21 02 12 22 00 01 + 01 11 + 02 21 00 10 20 01 11 21 02 12 22 for(int k=0; k<3; k++){ c[0][1]+=[0][k][k][1]; プログラミング入門 1 第 12 回 34
ヒント : 行列の掛け算 c[0][2] = 00 10 20 01 11 21 02 12 22 00 02 + 01 12 + 00 10 20 01 11 21 02 12 22 02 22 for(int k=0; k<3; k++){ c[0][2]+=[0][k][k][2]; プログラミング入門 1 第 12 回 35
ヒント : 行列の掛け算 c[1][0] = 00 10 20 10 00 01 11 21 + 11 02 12 22 10 + 00 10 20 12 20 01 11 21 02 12 22 for(int k=0; k<3; k++){ c[1][0]+=[1][k][k][0]; プログラミング入門 1 第 12 回 36
ヒント : 行列の掛け算 c[i][j] = 00 10 20 01 11 21 02 12 22 + 00 10 20 + 01 11 21 i 0 0 j i 1 1 j i 2 2 j 02 12 22 C[i][j]=0; for(int k=0; k<3; k++){ c[i][j]+=[i][k][k][j]; プログラミング入門 1 第 12 回 37
ヒント : 行列の掛け算 for (int i; ; ){ for (int j; ; ){ c[i][j] の計算 プログラミング入門 1 第 12 回 38