Upload
kirk-walsh
View
37
Download
0
Embed Size (px)
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
Citation preview
1
基礎プログラミング第 9 回( 2007 年 5 月 14日)数値データと配列,多次元配列
配列のコピー配列の要素の検索と並び替え(ソート)2次元配列(行列)
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);
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
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);
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
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);
7
コピーの際の注意点3: copy = new int[3]; を忘れると,配列としての容器が準備できていないのでコピーできないコピー先配列の長さが短いと全部コピーできない
オリジナル (orig) の配列サイズが不明なときや変更される可能性がある場合は,copy = new int[3];のように「数値」で直接書かずにcopy = new int[orig.Length];のように作成したほうが変更の手間が少なくて便利
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;
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;
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
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, ...
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
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);
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);
15
練習問題 9-2 ( 少し難易度の高い問題 )配列の並び替え ( ソート ) [14sortarray]
int の配列 ary に入っている正の数値を,別の int の配列 sorted に大きい順に並び替えてください (★実例2★を参考にする)ただし, Array.Sort() は使わず, ary で一番大きい数値を探し, 1つずつ順番にコピーしていってくださいコピー済みの数値は 0 以下の数(任意)に置き換えてください(配列 ary からデータを消してよい)最後に sorted の中身を表示し確認すること
16
配列 ary のコピー済み数値は消す
7 6 5 4 6 7 8 9 6aryary
sorted
-198-17-1 7-1
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
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..
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
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
21
練習問題 9-3行列計算 [15mulmatrix]
★ 実例3★のプログラムを入力し,(1)行列 a,b の作成と値の代入(2)行列 c の作成(3) a と b の積を c に計算
の3つの処理がどこでどのように行われているかを理解しなさい.行列 c の中身を画面に表示し,計算があっていることを確認しなさい. 自分が確認しやすいように表示を工夫するこ
と数値を替えて,試してみよう
22
練習問題は,完成したらなるべく早く,必ずコミットすること(コミットメッセージは自由)できれば授業中に!!
変数,条件分岐,ループ,配列の4つに慣れてもらうためにしばらく足踏みし,次回も配列,ループに関連した話題とする
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