変数だけを使ったコードから配列を使ったコードへ変更するメリット

変数だけ使ったコードのサンプル

C#学びはじめでは、変数を使った計算をしたことがあると思います。
まず、整数型で宣言して、それぞれの変数に値を代入して・・

変数の宣言と代入

int number1 = 1;
int number2 = 5;
int number3 = 6;
int number4 = 3;
int number5 = 9;

こんな感じでしょうか?

演算子を使った計算

次にすべてを足してみましょう・・・となります。

int sum = number1 + number2 + number3 + number4 + number5;

こんな感じですね。

結果の確認(表示)

Console.WriteLine($"合計 {sum}");

// 結果
// 合計 24

全てのコードは、このようになります。

static void Main()
{
    int number1 = 1;
    int number2 = 5;
    int number3 = 6;
    int number4 = 3;
    int number5 = 9;

    int sum = number1 + number2 + number3 + number4 + number5;

    Console.WriteLine($"合計 {sum}");
}

メソッドの作成

あまりメリットをかんじされないでしょうが、足し算と結果の表示部分をメソッドにしてみましょう。
メインメソッドは、Calcメソッドの呼び出しだけで、Calcメソッドには、足し算の計算と表示を担当させています。

static void Main()
{
    int number1 = 1;
    int number2 = 5;
    int number3 = 6;
    int number4 = 3;
    int number5 = 9;

    Calc(number1, number2, number3, number4, number5);
}

static void Calc(int n1, int n2, int n3, int n4, int n5)
{
    int sum = n1 + n2 + n3 + n4 + n5 ;
    Console.WriteLine($"合計 {sum}");
}

平均も作ってみる

平均の場合は、小数点も出ることが考え枯れますので、float型に結果を代入しておくことにします。

float ave = (n1 + n2 + n3 + n4 + n5) / 5.0f;
Console.WriteLine($"平均 {ave}");

これをCalcメソッドに含めると

static void Main()
{
    int number1 = 1;
    int number2 = 5;
    int number3 = 6;
    int number4 = 3;
    int number5 = 9;

    Calc(number1, number2, number3, number4, number5);
}
static void Calc(int n1, int n2, int n3, int n4, int n5)
{
    int sum = n1 + n2 + n3 + n4 + n5;
    Console.WriteLine($"合計 {sum}");

    float ave = (n1 + n2 + n3 + n4 + n5) / 5.0f;
    Console.WriteLine($"平均 {ave}");
}

メインメソッドは、そのままで、Calcメソッドの内容によって処理できることを増やすことができました。
メソッドを作っていないと、このようになります。

  • 処理を増やすと、どんどんメインメソッドが膨れていくことになる
  • 色々な処理がメインメソッドの中でごちゃごちゃしてくる。

データの数を増やす場合

では、データ数を10にしてみましょう。

static void Main()
{
    int number1 = 1;
    int number2 = 5;
    int number3 = 6;
    int number4 = 3;
    int number5 = 9;
    int number6 = 1;
    int number7 = 5;
    int number8 = 6;
    int number9 = 3;
    int number10 = 9;

    Calc(number1, number2, number3, number4, number5, number6, number7, number8, number9, number10);
}

static void Calc(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, int n10)
{
    int sum = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10;
    Console.WriteLine($"合計 {sum}");

    float ave = (n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10) / 10.0f;
    Console.WriteLine($"平均 {ave}");
}

// 結果
// 合計 48
// 平均 4.8

もっとたくさんのデータを処理したい時、大変になりますよね。いくつまで耐えられますか?

配列を使ったコードのサンプル(単純に置き換え)

変数の宣言と代入

変更前

int number1 = 1;
int number2 = 5;
int number3 = 6;
int number4 = 3;
int number5 = 9;
int number6 = 1;
int number7 = 5;
int number8 = 6;
int number9 = 3;
int number10 = 9;

変更後

変数の宣言は、 型 変数名 の順で記述します。
int型の変数は、int[]型になります。
int[] numbers
次に箱の数を指定します。
new int[10]

順番に代入するには、
numbers[箱の番号] = 代入したい整数
となりますので、

// int型の10個の箱を用意
int[] numbers = new int[10];

// 代入していく(プログラムでは箱の番号は0から始まるので)
numbers[0] = 1;
numbers[1] = 5;
numbers[2] = 6;
numbers[3] = 3;
numbers[4] = 9;
numbers[5] = 1;
numbers[6] = 5;
numbers[7] = 6;
numbers[8] = 3;
numbers[9] = 9;

まだ、冗長ですね。次のように変えることもできます。

// int型の10個の箱を用意、値の代入
int[] numbers = { 1, 5, 6, 3, 9, 1, 5, 6, 3, 9 };

これだけでも、随分スッキリしました。

メソッドの呼び出し

変更前

Calc(number1, number2, number3, number4, number5, number6, number7, number8, number9, number10);

変更後

変数の部分を配列名にそのまま置き換えてみます。
見にくいですね。

Calc(numbers[1], numbers[2], numbers[3], numbers[4], numbers[5], numbers[6], numbers[7], numbers[8], numbers[9]);

Calcメソッド

変更前

static void Calc(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, int n10)
{
    int sum = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10;
    Console.WriteLine($"合計 {sum}");

    float ave = (n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10) / 10.0f;
    Console.WriteLine($"平均 {ave}");
}

変更後

基本的に変える必要なし!!
便宜上、0から始めたいので 0-9までには変更していますが、特にそのままでも動作します。
これは、n1とかがメソッド内でしか使わない変数のためです。(ローカル変数といい、他のメソッドへの影響はありません)

static void Calc(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9)
{
    int sum = n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9;
    Console.WriteLine($"合計 {sum}");

    float ave = (n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9) / 10.0f;
    Console.WriteLine($"平均 {ave}");
}

配列を使ったコードのサンプル(メソッドに引数として配列を渡す)

メソッドの呼び出し

変更前

Calc(numbers[1], numbers[2], numbers[3], numbers[4], numbers[5], numbers[6], numbers[7], numbers[8], numbers[9]);

変更後

配列そのものを渡すには、配列の名前で渡せばいいです。(引数)

Calc(numbers);

スッキリしました。

Calcメソッド

変更前

static void Calc(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9)
{
    int sum = n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9;
    Console.WriteLine($"合計 {sum}");

    float ave = (n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9) / 10.0f;
    Console.WriteLine($"平均 {ave}");
}

変更後

渡される型がint型配列のため、引数部分の型としてint[]とし、このメソッドの中だけで使える名前として、memsとして記述しておきます。また、計算するときは、一つずつ取り出して計算します。

static void Calc(int[] mems)
{
    int sum = mems[0] + mems[1] + mems[2] + mems[3] + mems[4] + mems[5] + mems[6] + mems[7] + mems[8] + mems[9];
    Console.WriteLine($"合計 {sum}");

    float ave = (mems[0] + mems[1] + mems[2] + mems[3] + mems[4] + mems[5] + mems[6] + mems[7] + mems[8] + mems[9]) / 10.0f;
    Console.WriteLine($"平均 {ave}");
}

繰り返し文を使った計算

配列で渡されていますので、[]内の番号(要素番号)を順番に増やしてそれを足し込んでいく方法が取れます。
また、要素数(箱の数)は、配列名.Lengthで取得することができます。

static void Calc(int[] mems)
{
    int sum = 0;

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

    // Lengthはint型のため、float型にキャスト(変換)
    float ave = sum / (float)mems.Length;

    Console.WriteLine($"合計 {sum}");
    Console.WriteLine($"平均 {ave}");
}

このように短縮することができるのも配列を使うメリットになります。

LINQを使った計算

コードの先頭部分に

using System.Linq;

を追加するとLINQの機能が使えます。

int sum = 0;
// LINQのSum()メソッドを使う
sum = mems.Sum();

// Lengthはint型のため、float型にキャスト(変換)
float ave = sum / (float)mems.Length;

Console.WriteLine($"合計 {sum}");
Console.WriteLine($"平均 {ave}");

また、足し算の結果がない場合でも、平均値が出せるようにAverage()メソッドも用意されています。

// LINQのSum()メソッドを使う
int sum = mems.Sum();

// Lengthはint型のため、float型にキャスト(変換)
float ave = (float)mems.Average();

Console.WriteLine($"合計 {sum}");
Console.WriteLine($"平均 {ave}");

計算内容を一気にWriteLineに記述することもできます。(時と場合によります)

最終的なコード

以上の変化を使ってコードを変更したら次のようになります。
配列の数を増やしても減らしてもCalcメソッドは、変更する必要がありません。
配列内容、数の変更は、メインメソッドの1行目だけ変更すればいいです。

配列を使ってみたいと思うようになりましたか?

static void Main()
{
    // int型の10個の箱を用意
    int[] numbers = { 1, 5, 6, 3, 9, 1, 5, 6, 3, 9 };

    Calc(numbers);
}

static void Calc(int[] mems)
{
    Console.WriteLine($"合計 {mems.Sum()}");
    Console.WriteLine($"平均 {mems.Average()}");
}

C#,入門

Posted by hidepon