基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

23
1 基基基基基基基基基 基9基2007 基 5 基 14 基基基基基基基基基 基基基基基 基基基基基基 基基基基基基基基基基基基基 基基基基 () 基基基基基 基基基 2()

Upload: kirk-walsh

Post on 02-Jan-2016

37 views

Category:

Documents


0 download

DESCRIPTION

基礎プログラミング 第 9 回(200 7 年 5 月 14 日). 配列のコピー 配列の要素の検索と並び替え(ソート) 2次元配列(行列). 数値データと配列,多次元配列. 配列の「コピー」は=でできる??. 確認プログラム (1:~7: は行番号 ) 1: int[] orig, copy; 2: orig = new int[3]{2,3,5}; 3: copy = new int[3]; 4: copy = orig; 5: for(int i=0;i

TRANSCRIPT

Page 1: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

1

基礎プログラミング第 9 回( 2007 年 5 月 14日)数値データと配列,多次元配列

配列のコピー配列の要素の検索と並び替え(ソート)2次元配列(行列)

Page 2: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

2

配列の「コピー」は=でできる?? 確認プログラム (1:~7: は行番号 )

1: int[] orig, copy; 2: orig = new int[3]{2,3,5}; 3: copy = new int[3]; 4: copy = orig; 5: for(int i=0;i<3;i++) copy[i] *= 2; 6: foreach(int n in orig) Console.WriteLine(n); 7: foreach(int n in copy)

Console.WriteLine(n);

Page 3: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

3

1: int[] orig, copy;

int[] 型の変数 orig

0 1 2

int[] 型の変数 copy

2: orig = new int[3]{2,3,5};3: copy = new int[3];4: copy = orig;5: for(int i=0;i<3;i++) copy[i]*=2;

2 3 5

0 1 2

4 6 10

Page 4: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

4

本当に配列を「コピー」するには (1:~7: は行番号 )

1: int[] orig, copy; 2: orig = new int[3]{2,3,5}; 3: copy = new int[3]; 4: for(int i=0;i<3;i++) copy[i] = orig[i]; 5: for(int i=0;i<3;i++) copy[i] *= 2; 6: foreach(int n in orig) Console.WriteLine(n); 7: foreach(int n in copy)

Console.WriteLine(n);

Page 5: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

5

1: int[] orig, copy;

int[] 型の変数 orig

0 1 2

int[] 型の変数 copy

2: orig = new int[3]{2,3,5};3: copy = new int[3];4: for(int i=0;i<3;i++) copy[i]=orig[i];5: for(int i=0;i<3;i++) copy[i]*=2;

2 3 5

0 1 2

2 3 5

4 6 10

Page 6: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

6

Array.Copy() メソッドを使う方法(1:~7: は行番号 )

1: int[] orig, copy; 2: orig = new int[3]{2,3,5}; 3: copy = new int[3]; 4: Array.Copy(orig, copy, orig.Length); 5: for(int i=0;i<3;i++) copy[i] *= 2; 6: foreach(int n in orig) Console.WriteLine(n); 7: foreach(int n in copy)

Console.WriteLine(n);

Page 7: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

7

コピーの際の注意点3: copy = new int[3]; を忘れると,配列としての容器が準備できていないのでコピーできないコピー先配列の長さが短いと全部コピーできない

オリジナル (orig) の配列サイズが不明なときや変更される可能性がある場合は,copy = new int[3];のように「数値」で直接書かずにcopy = new int[orig.Length];のように作成したほうが変更の手間が少なくて便利

Page 8: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

8

文字列の配列のときはどうなる?

(1:~8: は行番号 )

1: String[] orig, copy; 2: orig = new String[3]

{” 守” ,” 破” ,” 離” }; 3: copy = new String [3]; 4: for(int i=0;i<3;i++) copy[i] = orig[i]; 5: String temp; 6: temp = copy[1]; 7: copy[1] = copy[2]; 8: copy[2] = temp;

Page 9: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

9

守 破 離

0 1 2

0 1 2

1: String[] orig, copy;

String[]型の変数orig

String[]型の変数copy

2: orig=new String[3]{“ 守” , “ 破” , “ 離” };3: copy = new String[3];4: for(int i=0;i<3;i++) copy[i] = orig[i];5: String temp;

String型の変数temp

6: temp = copy[1];7: copy[1] = copy[2];8: copy[2] = temp;

Page 10: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

10

配列要素の初期化を for 文で行う

インデックスと同じ値を入れるint[] a = new int[20];for(int i=0;i<a.Length;i++) a[i] = i;

インデックスの 3 倍の数値を入れるint[] a = new int[20];for(int i=0;i<a.Length;i++) a[i] = i*3;

インデックスの n 乗の数値を入れるint[] a = new int[20];for(int i=0;i<a.Length;i++) a[i] =

Math.Pow(a[i],n); //a[i] の累乗 ×a[i]^n

Page 11: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

11

フィボナッチ数列の計算★実例1★ [13fib]

f[n] = f[n-1] + f[n-2] の関係式が成り立つ数列( ダヴィンチ・コードにもでてくる有名な数列 )

double[] fib = new double[40];fib[0] = 1;fib[1] = 1;for(int i=2 ; i < fib.Length ; i++)

fib[i] = fib[i-1] + fib[i-2];(fib の中身 ) 1, 1, 2, 3, 5, 8, 13, 21, 34,

55, ...

Page 12: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

12

練習問題 9-1[13fib]  黄金比

フィボナッチ数列の隣り合う数の比は,徐々に「黄金比」に近づくことが知られています.★ 実例1★で求めた f[38] と f[39] を使って

f[39]/f[38] を計算し,上の黄金比と比べてみましょう.

★ 実例1★ では f[0] = 1, f[1] = 1 でスタートしましたが,他の数でやったらどうなるでしょうか?数列をどこまで計算すれば上の小数点以下 10 桁まで合った数値になりますか?参考:ちなみに√は, Math.Sqrt( 数値 ) で計算できます (Square root の略 ) プログラムでは使わなくてもかけますが

...6180339887.12

51

Page 13: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

13

平均値の計算double sum=0, average;double[] d = new double[10]

{7,6,5,4,6,8,3,5,9,6}; // 数字は無意味

for(int i=0 ; i<d.Length ; i++){sum += d[i];

}average = sum / d.Length;Console.WriteLine(“ 平均は

{0}”,average);

Page 14: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

14

配列のなかから一番大きい数を見つける(ただし, Array.Sort() は使わずに)★実例2★ [14sortarray]

int max = 0;int[] ary = new int[]

{7,6,5,4,6,7,8,9,6};for(int i=0; i < ary.Length ; i++){

if (max < ary[i]) max = ary[i];}Console.WriteLine(“ 最大の値は

{0}”,max);

Page 15: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

15

練習問題 9-2    ( 少し難易度の高い問題 )配列の並び替え ( ソート ) [14sortarray]

int の配列 ary に入っている正の数値を,別の int の配列 sorted に大きい順に並び替えてください (★実例2★を参考にする)ただし, Array.Sort() は使わず, ary で一番大きい数値を探し, 1つずつ順番にコピーしていってくださいコピー済みの数値は 0 以下の数(任意)に置き換えてください(配列 ary からデータを消してよい)最後に sorted の中身を表示し確認すること

Page 16: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

16

配列 ary のコピー済み数値は消す

7 6 5 4 6 7 8 9 6aryary

sorted

-198-17-1 7-1

Page 17: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

17

2次元配列2 次元配列変数の定義

int[,] matrix;配列の作成

matrix = new int[2,2];初期化

matrix[0,0] = 0;matrix[0,1] = 1;matrix[1,0] = 10;matrix[1,1] = 11;

0 1

10 11

0 1

0

1

1 つめの添字

行→

行→

2 つめの添字↓  列  ↓

0 1

10 11

Page 18: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

18

2次元配列(九九の計算)

int[,] kuku = new int[10,10]; // 都合上 10 にしておく

for(int i = 1; i <= 9 ; i++){for(int j = 1 ; j <= 9 ; j++){

kuku[ i , j ] = i * j;}

}

★ なぜ都合上 10x10 の配列にしたのだろうか?

9 でも格納できるはずなのに...

1 2 3 4

2 4 6 8

3 6 9 12

4 8 12 16

5 10 15 20

012345 :

0 1 2 3 4..

Page 19: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

19

行列計算★実例3(前半)★double[,] a = new double[3, 2]{{1, 2}, {2,

1}, {0, 1}}; // 3 行 2 列の行列

double[,] b = new double[2, 3]{{1, 2, 0}, {0, 1, 2}}; // 2 行 3 列の行列

double[,] c = new double[3, 3]; // 3 行 3 列の行列

// これから,行列を表す配列 a,b の積を計算し,配列 c に入れていきたい(次ページ)

210

252

441

210

021

10

12

21

222120

121110

020100

ccc

ccc

ccc

Page 20: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

20

行列計算★実例3(後半)★for(int i=0; i<a.GetLength(0); i++) {

// a.GetLength(0) は a の行数 (=3) を表す for(int j=0; j<b.GetLength(1); j++) {

// b.GetLength(1) は b の列数 (=3) を表す c[i, j] = 0; for(int k=0; k<a.GetLength(1); k++) {

// a.GetLength(1) は a の列数 (=2) を表す c[i, j] += a[i, k] * b[k, j]; } }}

210

252

441

210

021

10

12

21

222120

121110

020100

ccc

ccc

ccc

Page 21: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

21

練習問題 9-3行列計算 [15mulmatrix]

★ 実例3★のプログラムを入力し,(1)行列 a,b の作成と値の代入(2)行列 c の作成(3) a と b の積を c に計算

の3つの処理がどこでどのように行われているかを理解しなさい.行列 c の中身を画面に表示し,計算があっていることを確認しなさい. 自分が確認しやすいように表示を工夫するこ

と数値を替えて,試してみよう

Page 22: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

22

練習問題は,完成したらなるべく早く,必ずコミットすること(コミットメッセージは自由)できれば授業中に!!

変数,条件分岐,ループ,配列の4つに慣れてもらうためにしばらく足踏みし,次回も配列,ループに関連した話題とする

Page 23: 基礎プログラミング 第 9 回(200 7 年 5 月 14 日)

23

今後の予定( 9) 5/14 数値データと配列 / 多次元配列(10) 5/16 文字列データと配列 / 可変長配列(11) 5/21 関数(12) 5/23 関数 ( メソッド ) / オブジェクト指向(13) 5/28 オブジェクト指向 / クラス定義 継承の概念は説明しない

(14) 5/30 GUI をもつプログラムの構成法 GUI は試験範囲外

(15) 6/4 最終試験  @K12