プログラム基礎 ~配列について(C#)~

プログラム基礎

ご覧いただきありがとうございます。

配列についての重要な点は以下になります。

  • 配列変数を宣言し、new 演算子を使って配列を作成できる
  • 配列変数を使って要素を代入できる
  • 配列の添え字は、0 から始まり、最大番号は「要素数 – 1」となる
  • { }を使って、配列を初期化できる
  • 配列変数間で代入すると、複数の配列変数が同じ配列を参照することになる
  • 「.Length」をつけて、配列の長さを調べることができる
  • 多次元配列という多段階構造の配列を利用できる
  • foreach 文を利用すると、配列要素の取り出しが簡素に記述でき

ここでは、配列の基本と処理の流れについて解説していきます。

配列とは

配列とは、「複数個の値をまとめて保存できる変数」です。

変数は1個の値のみ保存できますが、配列の場合は複数の値を保存することができます。

配列は複数個の値を扱うプログラムでよく利用されます。

たくさんの値を扱いたい場合、変数のみですと変数宣言を複数個各必要があります。

極端な話ですが、変数を1000個用意しないといけない場合、変数を1000個書くのは手間ですよね・・・

そして、各変数の管理が非常に煩雑となり、可読性が低いプログラムとなります。

そこで、配列の出番です。

値をまとめて保存しておくことで、管理すべき変数が一つになり変数の管理がしやすく、可読性の高いプログラムとなります。

配列の宣言と要素数確保

配列を使うには、大きく二つの処理が必要です。

  1. 配列の変数を宣言
  2. 配列の要素を確保

では、実際にコードを書きながら解説していきます。

型名[] 配列変数名;               //1. 配列の変数を宣言
配列変数名 = new 型名[要素数]    //2. 配列の要素数を確保

手順1 : 配列の変数を宣言

int[] nums;

配列の参照情報を保存するための専用の型である、「配列型」と呼ばれる配列変数を宣言します。

変数の型の右側に「[]」をつけて型を指定してください。

上記のコードのように「int[]」と記述すると、int型の値を保存できる配列を参照できる変数が宣言されたことになります。

手順2 : 配列の要素を確保

nums = new int[5];

宣言された配列変数に対して、「=」で右辺の情報を記述します。

「new 」は、「new 演算子」と呼ばれ、[ ]内で指定された個数の要素からなる配列を作成します。

要素の個数のことを要素数と呼びます。上記のサンプルコードでは、要素数5の配列を作成して
います。

そして、「[]」の左側には型を記述します。

この型には配列変数で指定された型と同じものを指定しましょう。型が配列変数の型と異なる場合、ビルドエラーとなります。

また、「配列の変数を宣言」と「配列の要素を確保」をまとめて記述することも、以下のように可能です。

int[] nums = new int[5];

配列への代入の注意点

配列変数の中に配列そのものが代入されているわけではありませんので、注意が必要です。

配列変数に代入される情報は「参照」と呼ばれるものです。

参照には「データがメモリ中のどこに保存されているのか」という情報が含まれています。

プログラム中では、配列変数中の参照を利用して(参照して)、実体となる要素を呼出し、複数個
の値の代入や取得が行われます。

要素の呼び出し

配列の要素は配列変数を使って、呼び出すことができます。

配列変数名[添字]
nums[0]
nums[1]
nums[2]
nums[3]
nums[4]

配列の要素は区別できるように先頭から順番に「0」から始まる連番が割り当てられています。

この連番は「添字(インデックス、要素番号)」と呼ばれます。

[]内に添字を記述することで、配列中の特定の要素に値を代入できます。逆に、取り出すことも可能です。

配列の添字は、0番からスタートするので、要素数が5の場合は添字の最大値は4になります。「要素数 – 1」ってことですね。

最後に、添字を指定する際の注意点です。

配列から存在しない要素を参照できません。

5つの要素からなる配列に対して、nums[5]のように存在しない 6 番目の要素を指定しようとすると、プログラム実行時にエラーが発生します。

ビルドエラーはでないので、気づかないケースもあるので注意が必要です。

配列への値の代入

配列からの参照ができれば、逆に代入も可能です。

配列変数名[添字] = 式;

実際のコードは以下になります。

int[] nums = new int[5];

nums[0] = 5;
nums[1] = 10;
nums[2] = 15;
nums[3] = 20;
nums[4] = 25;

Console.WriteLine($"1番目の要素は{nums[0]}です。");

出力結果は以下になります。

1番目の要素は5です。

配列の初期化

配列の初期化とは、「配列変数の宣言」と「配列要素の確保」、「値の代入」をまとめて記述すること。

また、配列の初期化の記述方法には2種類あります。

初期化方法1

型名[] 配列変数名 = new 型名[ ] {値 1, 値 2, 値 3, ………};

初期化方法2

型名[] 配列変数名 = {値 1, 値 2, 値 3, ………};

実際のコードは以下になります。

int[] nums = new int[] {5, 10, 15, 20, 25};
int[] nums = {5, 10, 15, 20, 25};

※以下のコードと同じ意味になります。

int[] nums = new int[5];
nums[0] = 5;
nums[1] = 10;
nums[2] = 15;
nums[3] = 20;
nums[4] = 25;

配列の長さの取得

配列の要素数のことを配列の長さと呼びます。

配列の長さは以下の記述で取得できます。

配列変数名.Length

実際のコードは以下になります。

int[] nums = new int[] {5, 10, 15, 20, 25};

Console.WriteLine($"配列の長さは{nums.Length}です。");

出力結果は以下になります。

配列の長さは5です。

配列の長さの利用方法

配列は繰り返し処理のfor文と非常に相性が良いです。

例えば、以下のように配列の中身を全て出力するコードだと、配列の要素数分のConsole.WriteLineを記述しないといけません。

極端な話ですが、1000個の要素すうがあったら、Console.WriteLineを1000回書かないといけません・・・

int[] heights = {158, 171, 149, 183, 165};
System.Console.WriteLine($"1人目の身長は{heights[0]}cmです。");
System.Console.WriteLine($"2人目の身長は{heights[1]}cmです。");
System.Console.WriteLine($"3人目の身長は{heights[2]}cmです。");
System.Console.WriteLine($"4人目の身長は{heights[3]}cmです。");
System.Console.WriteLine($"4人目の身長は{heights[4]}cmです。");

このコードをfor文と組み合わせることで以下のように記述できます。

int[] heights = {158, 171, 149, 183, 165};

for (int i = 0; i < height.Length; i++)
{
  Console.WriteLine($"{i + 1}人目の身長は{height[i]}cmです。");
}

for文を使用したコードも、使用していないコードでも、出力結果は同じです。

1人目の身長は158cmです。
2人目の身長は171cmです。
3人目の身長は149cmです。
4人目の身長は183cmです。
5人目の身長は165cmです。

※for文との組み合わせでも、i の値に注意しましょう。配列変数名[i]で指定する際に、存在しない要素を指定するとエラーになります。

foreach文

foreach 文とは、配列の要素を先頭から順番に取り出す処理のことです。

foreach(型 変数名 in 配列変数名)
{
  繰り返し処理;
}

実際のコードは以下になります。

int[] nums = new int[] {5, 10, 15, 20, 25};

foreach (int num in nums)
{
  Console.WriteLine(num);
}

出力結果は以下になります。

5
10
15
20
25

foreach 文では、1 回目の繰り返しでは添字 0 番の要素の値を取り出し、2 回目の繰り返しでは添字 1 番の要素の値を取り出し、「in」の左側で宣言した変数に代入します。

そして、その変数はブロック内でのみ使用できます。

for 文とは異なり、foreach 文はループカウンタや添字の指定が不要なのが特徴です。

同じ出力結果のfor文のコードの記述は以下になります。

int[] nums = new int[] {5, 10, 15, 20, 25};

for(int i = 0; i < nums.Length; i++)
{
  Console.WriteLine(nums[i]);
}

配列の要素の並べ替え

foreach 文と配列に加えて、Array.Sort()メソッドという処理を組み合わせると、昇順に要素を並び替えることができます。

並び替える処理のことをソートと呼びます。

Array.Sort(配列変数名);    //昇順(小さい方から大きい方へ)に並び替え
Array.Reverse(配列変数名);  //降順(大きい方から小さい方へ)に並べ替え

※Array.Reverseを使用する際は、先にArray.Sortで昇順にソートする必要があるので注意。

実際のコードは以下になります。

int[] numbers = { 3, 4, 2, 1, 5 };

// 配列をソートする
Array.Sort(numbers);

foreach (int value in numbers)
{
  Console.WriteLine(value);
}

出力結果は以下になります。

1
2
3
4
5

多次元配列とは

多次元配列は、配列の応用編です。

多次元配列は、1つの配列の要素のなかに複数の値を持つことが可能です。

ようは、配列の中に配列が入っているんです。

そして、今まで解説してきた配列のことを1次元配列と呼びます。

1次元配列のイメージ

2次元配列のイメージ

多次元配列は、配列が別の配列を参照した構造となっており、1 次元目の配列の各要素には 2 次元目の配列の参照が保存されています。

そして、最下層の次元の配列に値が代入されます。

注意点として、多次元配列は2次元でも3次元でも作ることはできますが、構造が複雑になり直感的ではないので、把握だけに時間と労力がかかり非効率なため、推奨しません。

個人的には2次元配列までにとどめておくとよいと思います。

多次元配列の宣言と要素数確保

ここでは、2次元配列を例にだして解説していこうと思います。

2次元配列の書き方は以下になります。

型名[,] 配列変数名;  //配列変数の宣言
配列変数名 = new 型名[1次元目の要素数, 2次元目の要素数];  //配列要素の確保

1次元配列の違いとしては、「 [] 」内の書き方が異なります。

2次元の場合は、「[]」の間にカンマを1ついれて、2つの配列が入れれるように表現していきます。

3次元の場合は、「[,,]」のように3つに区切るようにして記述していきます。

実際のコードは以下になります。

int[,] nums = new int[2,3];

※2次元配列においても、1文に纏めて記述できます。

多次元配列の要素の呼出し

多次元配列の要素を呼び出して値を代入・取得したい場合の書き方について解説していきます。

配列変数名[1 次元目の添字,2 次元目の添字]

配列変数名の後ろに続く角かっこの 1 つ目数字で、1 次元目の配列の添字を記述して、その下の次元にあるどの配列を参照するかを指定します。

例えば、2 次元配列 height において、1 次元目が添字 0 番、2 次元目が添字 1 番の要素に値を代入したい場合は下記のように記述します。

多次元配列への代入のコードは以下になります。

nums[0,1] = 5;

多次元配列の初期化

多次元配列もで1次元配列同様に初期化が可能です。

int[,] nums = {{5, 10, 15},{5, 10, 15}};

多次元配列の場合は、「{}」を入れ子形式で記述します。1 番外側の「{}」が 1 次元目の配列、その内側の「{}」が 2 次元目の配列を指しています。

、1 次元目の配列内に「,」区切りで「{}」が 2 つ記述されており、これは「1次元目の配列の要素数が 2 である」ことを指定しています。

そして、2 次元目の配列はそれぞれ「要素数が 3 である」ことを指定しており、2 次元目の各配列内には「,」区切りで指定された値が左側から順番に代入されます。

多次元配列の配列要素の数を指定して、初期化することもできます。

int[,] nums = new int[2, 3]{{5, 10, 15},{5, 10, 15}};

多次元配列の長さ

多次元配列では、それぞれの次元ごとに配列の長さを取得することができます。

・多次元配列の全体の要素数

配列変数名.Length

・多次元配列の1次元目の長さ

配列変数名.GetLength(0)

・多次元配列の2次元目の長さ

配列変数名.GetLength(1)

多次元配列の利用

2次元配列で代表的な九九のコードは以下になります。

int[,] nums = new int[9,9];

for (int i = 0; i < nums.GetLength(0); i++)
{
    for (int j = 0; j < nums.GetLength(1); j++)
    {
        nums[i,j] = (i + 1) * (j + 1);
    }
}

for (int i = 0; i < nums.GetLength(0); i++)
{
    for (int j = 0; j < nums.GetLength(1); j++)
    {
        Console.Write(nums[i,j] + " ");
    }

    Console.WriteLine();
}

出力結果は以下になります。

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

コメント

タイトルとURLをコピーしました