・p.137「2次元配列」から
p.137 2次元配列
・2つの添字を用いる配列を2次元配列という
・C#には2種類の2次元配列があり、通常型の2次元配列は●×■の積の要素を持つ構造。
・例えば、2クラスに各5人の生徒の成績なら、2×5=10要素の2次元配列になる
・宣言の書式: 型[,] 配列名;
・生成の書式: 配列名 = new 型[要素数①, 要素数②];
・1次元配列と同様に、宣言と生成はまとめて行える
例: int[,] point = new int[2, 5]; //2×5=10要素の2次元配列の宣言と生成
・1次元配列と同様に、初期化も可能で、2重繰返し構造を{{},…}で示す
例: int[,] point = {{10,20,30,40,50}, {11,22,33,44,55}}; //2×5=10要素の2次元配列の宣言と生成
・要素には「配列名[添字①, 添字②]」でアクセスできる
アレンジ演習:p.138 array01.cs
・forのカウンタ用変数をfor文の中で宣言しよう ・2次元配列の要素に値を代入する処理を表示とは別の2重繰り返しで行うようにしよう
作成例その1
//アレンジ演習:p.138 array01.cs
using System;
class array01
{
public static void Main()
{
int[,] MyArray = new int[2,3];
//MyArray[0, 0] = 1;
//MyArray[0, 1] = 2;
//MyArray[0, 2] = 3;
//MyArray[1, 0] = 4;
//MyArray[1, 1] = 5;
//MyArray[1, 2] = 6;
for (int i = 0; i < 2; i++) { //【以下追加】
for (int j = 0; j < 3; j++) {
MyArray[i, j] = i * 3 + j + 1;
}
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);
}
}
}
}
作成例その2
//アレンジ演習:p.138 array01.cs
using System;
class array01
{
public static void Main()
{
int[,] MyArray = new int[2,3];
int s = 0; //【追加】
for (int i = 0; i < 2; i++) { //【以下追加】
for (int j = 0; j < 3; j++) {
MyArray[i, j] = ++s; //1,2,3,4,…を順に代入
}
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);
}
}
}
}
p.139 12行目正誤
・誤: 全部の要素の初期値を書く必要はありません。初期値が指定されていない要素は0で初期化されます ・正: 指定された要素数と、初期値の数が一致しないとエラーになります(p.135参照)
アレンジ演習:p.139 array02.cs
・2次元配列の初期値を「{{0,1,2,3},{0,4,5,6}}」に変更しても動作することを確認しよう
作成例
//アレンジ演習:p.139 array02.cs
using System;
class array02 {
public static void Main() {
int[,] MyArray = {{0, 1, 2, 3}, {0, 4, 5, 6}}; //【変更】配列の初期化
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]); //6要素のみ表示
}
}
}
}
アレンジ演習:p.140 array03.cs
・現状では何も入力しないでEnterを押すと異常終了してしまう ・2箇所ある「if (●.Length >= 2)」を「if (●.Length != 1)」に書き換えて解決しよう
作成例
//アレンジ演習:p.140 array03.cs
using System;
class array03 {
public static void Main() {
string[,] Name = new string[2, 5] {
{"田中六郎", "吉田一郎", "太田太郎", "粂井康孝", "岡田三郎"},
{"横田芳子", "池田和子", "目黒貴和子", "武田信子", "園田淳子"}
};
int MyClass, No;
string strClass, strNo;
while (true) { //無限ループ
Console.Write("クラスは---");
strClass = Console.ReadLine();
if (strClass.Length != 1) { //【変更】
Console.WriteLine("入力は1桁のみです");
continue; //以降をスキップして次の繰返しへ(つまり、やりなおし)
}
if (Char.IsNumber(strClass, 0) != true) {
Console.WriteLine("数字を入力してください");
continue; //以降をスキップして次の繰返しへ(つまり、やりなおし)
}
MyClass = Int32.Parse(strClass);
if (MyClass <= 0 || MyClass >= 3) {
Console.WriteLine("クラスは1組か2組です");
continue; //以降をスキップして次の繰返しへ(つまり、やりなおし)
}
break; //全チェックOKなので繰返しを抜ける
}
while (true) { //無限ループ
Console.Write("出席番号は---");
strNo = Console.ReadLine();
if (strClass.Length != 1) { //【変更】
Console.WriteLine("入力は1桁のみです");
continue; //以降をスキップして次の繰返しへ(つまり、やりなおし)
}
if (Char.IsNumber(strNo, 0) != true) {
Console.WriteLine("数字を入力してください");
continue; //以降をスキップして次の繰返しへ(つまり、やりなおし)
}
No = Int32.Parse(strNo);
if (No <= 0 || No >= 6) {
Console.WriteLine("出席番号は1番から5番までです");
continue; //以降をスキップして次の繰返しへ(つまり、やりなおし)
}
break; //全チェックOKなので繰返しを抜ける
}
Console.WriteLine("{0}クラスの出席番号{1}番は{2}さんです", strClass, strNo, Name[MyClass - 1, No - 1]);
}
}
p.142 3次元以上の配列
・C#の配列では次元数の宣言はある
・ただし次元ごとの要素数の積で増えるので、メモリの占有などに注意すること
・たとえば、利用しない領域ができてしまう場合は、配列を分割して定義することなどを検討すると良い
以下は3次元の場合:
・宣言の書式: 型[,,] 配列名;
・生成の書式: 配列名 = new 型[要素数①, 要素数②, 要素数③];
・宣言と生成の例: int[,,] point = new int[2, 5, 3]; //2×5×3=30要素の3次元配列の宣言と生成
・初期化も可能で、3重繰返し構造を{{{},…}, …}で示す
例: int[,,] p = {{{1, 2, 3},{4, 5, 6}},{{1, 2, 3},{4, 5, 6}}}; //2×2×3=12要素の3次元配列の宣言と生成
・要素には「配列名[添字①, 添字②, 添字③]」でアクセスできる
例: p[0, 0, 0] は 1、p[0, 0, 1] は 2、p[1, 1, 2] は 6
・なお、配列の次元数はRankプロパティを用いて「配列名.Rank」で得られる
・また、配列の全要素数はLengthプロパティを用いて「配列名.Length」で得られる
※ C#では、Lengthで通常の配列の次元ごとの要素数を得ることはできない
アレンジ演習:p.143 Array4.cs
・全要素の合計値も表示しよう
作成例
//アレンジ演習:p.143 Array4.cs
using System;
class array04 {
public static void Main() {
int[,,] ar = new int[2, 2, 3] { {
{0, 1, 2}, //順に[0,0,0][0,0,1][0,0,2]
{3, 4, 5} }, //順に[0,1,0][0,1,1][0,1,2]
{
{6, 7, 8}, //順に[1,0,0][1,0,1][1,0,2]
{9, 10, 11} } //順に[1,1,0][1,1,1][1,1,2]
};
Console.WriteLine("配列の次元 = {0}", ar.Rank); //次元数を表示
Console.WriteLine("arの個数 = {0}", ar.Length); //要素数を表示
int sum = 0; //【追加】合計用
for (int i = 0; i < 2; i++) { //1番目の添字
for (int j = 0; j < 2; j++) { //2番目の添字
for (int k = 0; k < 3; k++) { //3番目の添字
Console.Write("{0}, ", ar[i, j, k]); //順に表示
sum += ar[i, j, k]; //【追加】合計に加算
}
}
}
Console.WriteLine("合計:{0}", sum); //【変更】
}
}