計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
モーフィング 繰り返しをする タートル0は円の一部を描く タートル9は星形の一部を描く タートルkはタートル0とタートル9の位置を k : (9-k) に内分する点に 移動する Turtle m0 = new Turtle(); Turtle m1 = new Turtle(); … Turtle m9 = new Turtle(); for (int i = 0; i < steps; i++) { m0とm9を移動 int x0 = m0.getX(), y0 = m0.getY(); int x9 = m9.getX(), y9 = m9.getY(); m1.moveTo(1*(x9-x0)/9+x0,1*(y9-y0)/9+y0,0); m2.moveTo(2*(x9-x0)/9+x0,2*(y9-y0)/9+y0,0); m3.moveTo(3*(x9-x0)/9+x0,3*(y9-y0)/9+y0,0); } 計算機プログラミングI (増原) 2003年度
モーフィング 繰り返しをする 同じ種類の変数が 繰り返し現われる 配列 タートル0は円の一部を描く タートル9は星形の一部を描く タートルkはタートル0とタートル9の位置を k : (9-k) に内分する点に 移動する Turtle m0 = new Turtle(); Turtle m1 = new Turtle(); … Turtle m9 = new Turtle(); for (int i = 0; i < steps; i++) { m0とm9を移動 int x0 = m0.getX(), y0 = m0.getY(); int x9 = m9.getX(), y9 = m9.getY(); m1.moveTo(1*(x9-x0)/9+x0,1*(y9-y0)/9+y0,0); m2.moveTo(2*(x9-x0)/9+x0,2*(y9-y0)/9+y0,0); m3.moveTo(3*(x9-x0)/9+x0,3*(y9-y0)/9+y0,0); } 計算機プログラミングI (増原) 2003年度
配列とは何か 変数の列を1つにまとめたオブジェクト (cf. ベクトル・数列) 例 整数10個の 配列 Turtle型 オブジェクト 10個の配列 3 1 9 11 8 4 5 17 24 hm = marks = 計算機プログラミングI (増原) 2003年度
配列の使い方 配列「型」 配列を作る 10個のタートルを しまうための配列を作り、それぞれの 要素にタートルを作ってしまう public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 10個のタートルを しまうための配列を作り、それぞれの 要素にタートルを作ってしまう 配列のi番目を とり出す 配列のi番目に 代入する 計算機プログラミングI (増原) 2003年度
配列の使い方 配列をしまうための変数ができる hm public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 配列をしまうための変数ができる hm 計算機プログラミングI (増原) 2003年度
配列の使い方 タートルを10個しまうための変数ができる hm public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 タートルを10個しまうための変数ができる hm 計算機プログラミングI (増原) 2003年度
配列の使い方 hmに配列が しまわれる 最初は全ての hm 中身がnull (空) public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 hmに配列が しまわれる hm 最初は全ての 中身がnull (空) 計算機プログラミングI (増原) 2003年度
配列の使い方 Turtleオブジェクトができる hm Turtle public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 hm Turtleオブジェクトができる Turtle 計算機プログラミングI (増原) 2003年度
配列の使い方 このときのiは 0なので0番目 配列の0番目に オブジェクトが hm しまわれる Turtle public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 このときのiは 0なので0番目 配列の0番目に オブジェクトが しまわれる hm Turtle 計算機プログラミングI (増原) 2003年度
配列の0番目の オブジェクトが とり出されて フレームに追加される 配列の使い方 public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 配列の0番目の オブジェクトが とり出されて フレームに追加される hm Turtle 計算機プログラミングI (増原) 2003年度
配列の使い方 i=0, i=1の繰り返しが 終った後 hm Turtle Turtle public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 i=0, i=1の繰り返しが 終った後 hm Turtle Turtle 計算機プログラミングI (増原) 2003年度
配列の使い方 繰り返しが終った後 hm Turtle Turtle Turtle Turtle Turtle Turtle Turtle public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 繰り返しが終った後 hm Turtle Turtle Turtle Turtle Turtle Turtle Turtle Turtle Turtle Turtle 計算機プログラミングI (増原) 2003年度
配列のまとめ “int[ ] marks;” や “Turtle[ ] hm;” のように配列型の変数を宣言する 配列をしまうための変数が作られる。配列ができるのではない。 “marks = new int[10];” “hm = new Turtle[10];” のように配列を作って変数に代入する “[ ]”の中は個数。数式でもよい “marks[3] = 123;” や “hm[i] = new Turtle();” のように値を代入する “marksの3番目”に代入せよ、という意味 番号は0から始まる。数式でもよい “sum = sum + marks[i];” や “hm[k/3].fd(100);” のように値を参照する “i < makrs.length” のように長さを求める 計算機プログラミングI (増原) 2003年度
多次元の配列 Turtle [ ] [ ] hm = new Turtle[3][4]; hm[1][2] hm → Turtle 計算機プログラミングI (増原) 2003年度
多次元の配列 Turtle [ ] [ ] hm = new Turtle[3][4]; hm[1][2] hm → 計算機プログラミングI (増原) 2003年度
文字列(Stringクラス)(5.4) Java言語では文字列は String クラスのオブジェクトとして表わされる 文字列を作る 引用符記号「”」で囲んで固定した内容を表現 (eg. System.out.println(“Hello”); ) 文字列化メソッドを呼び出して値を文字列に変換 (eg. Turtle m = new Turtle(); System.out.println(m.toString()); System.out.println(new Integer(10).toString()); ) 文字列と値を結合して自動的に変換 (eg. int n = 2; System.out.println(“You’re no.“ + n);) 文字列を使う Stringクラスのメソッドを使って大文字・小文字変換・一部をとり出す・ つなげる等々 (eg. System.out.println(“wonderful”.toUpper());) 文字列から数に変換する (eg. int x = Integer.parseInt(“123”); int y = Double.parseDouble(“3.14”);) 漢字コードに注意が必要 javac –enocding euc-jp Hello.java javac –encoding shift_jis Hello.java 計算機プログラミングI (増原) 2003年度
mainの引数 (5.5) 実はここにも配列が使われている public class T51 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 実はここにも配列が使われている 意味: プログラムを実行したときの コマンドラインの引数が順に配列に しまわれている 例: “java T51 123 ok” のように実行をした場合、 args[0] には “123” が args[1] には “ok” がしまわれている 計算機プログラミングI (増原) 2003年度
mainの引数 (5.5) 整数に変換 一番目の引数 (文字列) java T51 12 のように実行すると、12匹のタートルが作られる public class T51 { public static void main(String[] args){ int numTurtles = Integer.parseInt(args[0]); TurtleFrame f = new TurtleFrame(600,300); Turtle[ ] hm = new Turtle[numTurtles]; for(int i = 0 ; i < numTurtles; i++){ hm[i] = new Turtle(i * 50 + 25,150,0); f.add(hm[i]); } //略 一番目の引数 (文字列) java T51 12 のように実行すると、12匹のタートルが作られる コンパイルし直さずともプログラムの動きを変えられる 計算機プログラミングI (増原) 2003年度
配列を利用したプログラム(1) 滑らかな曲線 3点 p0, p1, p2 を滑らかにつなぐ曲線の1つは次の方程式で与えられる: p(t) = (1-t)2p0+2(1-t)tp1+t2p2 (0 t 1) プログラム: 3点をクリックして入力 タートルを最初の点に移動 t を 0 から 1 まで 1/n きざみで変化 X成分,Y成分を上式に従って計算 タートルを移動 長い曲線を描くには p0, p1, p2, … pN を入力 i を0からN-3まで変化さ せて pi, pi+1, pi+2 を曲線でつなぐ 計算機プログラミングI (増原) 2003年度
配列を利用したプログラム(2) モーフィング 同じ種類の変数が 繰り返し現われる 配列 繰り返しをする タートル0は円の一部を描く タートル9は星形の一部を描く タートルkはタートル0とタートル9の位置を k : (9-k) に内分する点に 移動する Turtle m0 = new Turtle(); Turtle m1 = new Turtle(); … Turtle m9 = new Turtle(); for (int i = 0; i < steps; i++) { m0とm9を移動 int x0 = m0.getX(), y0 = m0.getY(); int x9 = m9.getX(), y9 = m9.getY(); m1.moveTo(1*(x9-x0)/9+x0,1*(y9-y0)/9+y0,0); m2.moveTo(2*(x9-x0)/9+x0,2*(y9-y0)/9+y0,0); m3.moveTo(3*(x9-x0)/9+x0,3*(y9-y0)/9+y0,0); } 計算機プログラミングI (増原) 2003年度
配列を利用したプログラム(3) 手描きの絵の繰り返し 手順 1. 画面上を何回かクリックさせ、 その位置を順に覚える 2. (円周の各点に移動して) 覚えた位置に順に移動してゆく ポイント: 縮小・回転が簡単にできるように 距離と角度を覚える 移動の際に距離を半分等にすることで 縮小した図を描く 計算機プログラミングI (増原) 2003年度
配列を利用したプログラム(3) 手描きの絵の繰り返し q1 直前の位置 (x1,y1) angles[0]=q 0, angles[1]= q 1, … distances[0]=l0, distances[1]=l1, … となるように覚える q (dx,dy) q = atan(dx/dy) (ラジアン) (y>0) q 0 l1 l0 (x0,y0) (x2,y2) 新しい位置 計算機プログラミングI (増原) 2003年度
配列を利用したプログラム(4) 記憶力テスト 手順: N匹のタートルを配置 大きさMの整数の配列pを作り、そこに 0~(N-1)の乱数をしまう iを0からM-1まで変化させ、順に p[i]番目のタートルを回転 iを0からM-1まで変化させ、 クリックされた場所から番号を求め p[i]と照合、一致していれば回転 一致していなければ中断 計算機プログラミングI (増原) 2003年度
配列を利用したプログラム(5) 細胞状自動機械(cellular automata) ある時点のタートルの配置が あったときに、次の時点では 周囲に3匹のタートルがいれば 空のマスにタートルが生まれる 周囲に2or3匹のタートルが いれば、そのタートルは生き 残る 「現在の配置」「次の配置」 をそれぞれ2次元のタートル 型の配列で表わす 計算機プログラミングI (増原) 2003年度