C# | 1 日 90 分 × 7 日アプリ学習:初級編

Web APP C#
スポンサーリンク

3日目のゴール

初級編 3日目のテーマは
「“複数の入力”を配列とループでまとめて扱えるようになること」 です。

1日目:1つの入力
2日目:安全に入力(TryParse+while)

今日はここに、

複数の値を配列に入れる
for でまとめて処理する
合計・平均・最大・最小などの“集計”をする

という「ちょっとアプリっぽい」要素を足していきます。


まずは「固定の配列」から思い出す

配列の基本をもう一度

超初級編でやった配列を、少しだけ思い出します。

int[] scores = { 80, 90, 75, 60 };

for (int i = 0; i < scores.Length; i++)
{
    Console.WriteLine("scores[" + i + "] = " + scores[i]);
}
C#

ここでのポイントは、

int[] で「整数の配列」
scores[0], scores[1] のように「番号」でアクセス
Length で「何個入っているか」が分かる
for と組み合わせると「全部を順番に処理できる」

でした。

今日は、ここに「ユーザー入力」を組み合わせます。


「何人分の点数」を扱うかを決める

要素数を先に決めて配列を作る

まずは、人数を先に決めてしまうパターンから。

「3人分の点数を入力して、平均を出す」
というミニアプリを作ってみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("3人分の点数を入力して、平均を計算します。");

        int[] scores = new int[3];

        for (int i = 0; i < scores.Length; i++)
        {
            int number = i + 1;
            scores[i] = ReadInt(number + "人目の点数を入力してください:");
        }

        int total = 0;

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

        double average = (double)total / scores.Length;

        Console.WriteLine("合計点: " + total);
        Console.WriteLine("平均点: " + average);
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}
C#

ここで新しく出てきたのは、この一行です。

int[] scores = new int[3];
C#

これは、

「int 型の配列 scores を作る。要素数は 3。
中身は最初 0 が入っている」

という意味です。

そのあとで、for の中で scores[i] = ...; として、
1人目、2人目、3人目の点数を順番に入れていっています。


「入力 → 配列に入れる → 集計」の流れを整理する

3つのステップに分けて考える

さっきのコードは、流れとしてこうなっています。

配列を用意する(new int[3])
for で回しながら、1人ずつ点数を入力して配列に入れる
別の for で回しながら、合計を計算する
合計 ÷ 人数 で平均を出す

ここで大事なのは、

「配列は“あとでまとめて処理するための置き場”」
という感覚です。

入力した瞬間に計算してもいいのですが、
配列に入れておくことで、

あとからもう一度見返せる
最大値・最小値など、別の集計もできる

というメリットが出てきます。


最大値・最小値も出してみる

「一番高い点」「一番低い点」を求める

同じ scores 配列から、
最大値と最小値も計算してみましょう。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("3人分の点数を入力して、統計を出します。");

        int[] scores = new int[3];

        for (int i = 0; i < scores.Length; i++)
        {
            int number = i + 1;
            scores[i] = ReadInt(number + "人目の点数を入力してください:");
        }

        int total = 0;
        int max = scores[0];
        int min = scores[0];

        for (int i = 0; i < scores.Length; i++)
        {
            int s = scores[i];

            total = total + s;

            if (s > max)
            {
                max = s;
            }

            if (s < min)
            {
                min = s;
            }
        }

        double average = (double)total / scores.Length;

        Console.WriteLine("合計点: " + total);
        Console.WriteLine("平均点: " + average);
        Console.WriteLine("最高点: " + max);
        Console.WriteLine("最低点: " + min);
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}
C#

ここで深掘りしたいのは、この部分です。

int max = scores[0];
int min = scores[0];

for (int i = 0; i < scores.Length; i++)
{
    int s = scores[i];

    if (s > max)
    {
        max = s;
    }

    if (s < min)
    {
        min = s;
    }
}
C#

最初に「とりあえず 1人目の点数」を max と min に入れておく
for で全員分を見ながら、
今見ている s が max より大きければ max を更新
今見ている s が min より小さければ min を更新

この「最初の1つを基準にして、あとは比較しながら更新する」
というパターンは、最大値・最小値を求めるときの定番です。


「人数をユーザーに決めてもらう」パターン

new int[人数] で柔軟にする

今度は、「何人分入力するか」もユーザーに決めてもらいましょう。

using System;

class Program
{
    static void Main(string[] args)
    {
        int count = ReadInt("何人分の点数を入力しますか?:");

        int[] scores = new int[count];

        for (int i = 0; i < scores.Length; i++)
        {
            int number = i + 1;
            scores[i] = ReadInt(number + "人目の点数を入力してください:");
        }

        int total = 0;

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

        double average = (double)total / scores.Length;

        Console.WriteLine("人数: " + count);
        Console.WriteLine("合計点: " + total);
        Console.WriteLine("平均点: " + average);
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}
C#

ここでのポイントは、

人数を先に ReadInt で受け取る
その人数を使って new int[count] で配列を作る
あとは「配列の長さ(Length)だけ for で回す」

という流れです。

「配列の長さをコードにベタ書きしない」
というのは、とても大事な習慣です。


1週間の勉強時間を「入力版」にする

超初級編の“固定データ”を、入力に置き換える

超初級編でやった「1週間の勉強時間」を、
ユーザー入力版にしてみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("1週間の勉強時間を入力して、合計と平均を出します。");

        int days = 7;
        int[] studyMinutes = new int[days];

        for (int i = 0; i < studyMinutes.Length; i++)
        {
            int dayNumber = i + 1;
            studyMinutes[i] = ReadInt(dayNumber + "日目の勉強時間(分)を入力してください:");
        }

        int total = 0;
        int max = studyMinutes[0];
        int min = studyMinutes[0];

        for (int i = 0; i < studyMinutes.Length; i++)
        {
            int m = studyMinutes[i];

            total = total + m;

            if (m > max)
            {
                max = m;
            }

            if (m < min)
            {
                min = m;
            }
        }

        double average = (double)total / studyMinutes.Length;

        Console.WriteLine();
        Console.WriteLine("【結果】");
        Console.WriteLine("合計勉強時間: " + total + " 分");
        Console.WriteLine("平均勉強時間: " + average + " 分");
        Console.WriteLine("最も長い日: " + max + " 分");
        Console.WriteLine("最も短い日: " + min + " 分");
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}
C#

ここまで来ると、
「自分の1週間の勉強を、C# で“見える化”している」状態です。


配列+メソッドでコードをもっと整理する

集計処理をメソッドに切り出す

3日目の後半として、
配列の集計をメソッドにしてみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("1週間の勉強時間を入力して、統計を出します。");

        int days = 7;
        int[] studyMinutes = new int[days];

        for (int i = 0; i < studyMinutes.Length; i++)
        {
            int dayNumber = i + 1;
            studyMinutes[i] = ReadInt(dayNumber + "日目の勉強時間(分)を入力してください:");
        }

        int total = CalcTotal(studyMinutes);
        double average = CalcAverage(studyMinutes);
        int max = CalcMax(studyMinutes);
        int min = CalcMin(studyMinutes);

        Console.WriteLine();
        Console.WriteLine("【結果】");
        Console.WriteLine("合計勉強時間: " + total + " 分");
        Console.WriteLine("平均勉強時間: " + average + " 分");
        Console.WriteLine("最も長い日: " + max + " 分");
        Console.WriteLine("最も短い日: " + min + " 分");
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }

    static int CalcTotal(int[] values)
    {
        int sum = 0;

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

        return sum;
    }

    static double CalcAverage(int[] values)
    {
        int total = CalcTotal(values);
        double average = (double)total / values.Length;
        return average;
    }

    static int CalcMax(int[] values)
    {
        int max = values[0];

        for (int i = 0; i < values.Length; i++)
        {
            if (values[i] > max)
            {
                max = values[i];
            }
        }

        return max;
    }

    static int CalcMin(int[] values)
    {
        int min = values[0];

        for (int i = 0; i < values.Length; i++)
        {
            if (values[i] < min)
            {
                min = values[i];
            }
        }

        return min;
    }
}
C#

ここでの大事なポイントは、

Main は「アプリの流れ」だけを書く
集計ロジックは CalcTotal / CalcAverage / CalcMax / CalcMin に任せる

という役割分担です。

「配列を渡したら、合計を返してくれる」
「配列を渡したら、最大値を返してくれる」

こういう“便利メソッド”を自分で作れるようになると、
コードを書くのが一気に楽しくなります。


3日目で絶対に押さえておきたいポイント

配列+for+入力の“型”を体で覚える

今日のキモは、この3つの組み合わせです。

new int[個数] で配列を用意する
for で 0 〜 Length-1 まで回す
中で ReadInt / ReadDouble を呼んで、配列[i] に代入する

そして、集計するときは、

合計:sum を 0 で始めて、ループで足していく
最大:最初の要素を基準にして、より大きいものがあれば更新
最小:最初の要素を基準にして、より小さいものがあれば更新

このパターンが自然に書けるようになると、
「複数データを扱うアプリ」が一気に作りやすくなります。


もし余裕があればやってみてほしいこと

自分用「1週間の自己採点アプリ」を作る

例えば、

1週間分の「今日の満足度(1〜5)」を入力する
平均満足度を出す
5 が何日あったか数える
1 があったら「しんどい日もあったね」とコメントする

などを、自分で仕様を決めて作ってみてください。

やることは全部、今日やったことの組み合わせです。

配列
for
ReadInt
合計・平均・カウント・最大・最小
if


3日目のまとめ

初級編 3日目で、あなたは

「1つの入力」から
「複数の入力を配列にためて、まとめて処理する」

というステージに進みました。

入力(ReadInt / ReadDouble)
→ 配列に入れる
→ for で回して集計する
→ メソッドに分けて整理する

この流れが見えてきたら、
もう「小さなデータ分析アプリ」を自分で組み立てられるレベルです。

4日目以降は、
この「配列+メソッド」の感覚をベースに、
もう少し“アプリらしい構造”に近づけていきます。

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