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

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

7日目のゴール

7日目のテーマは
「ここまで学んだ全部を使って、“ちゃんとした1つのミニアプリ”を完成させること」 です。

使う要素は、全部おなじみのものです。

変数
if 文(条件分岐)
for / while(繰り返し)
配列
メソッド

今日は「バラバラのテクニック」ではなく、
それらを組み合わせて「1つの流れのあるアプリ」にします。


作るもの:1週間の勉強管理ミニアプリ

アプリのイメージを言葉で決める

まずは、コードを書く前に「何を作るか」を日本語で整理します。

1週間分(7日分)の勉強時間(分)をあらかじめ配列に入れておく
合計勉強時間を計算する
平均勉強時間を計算する
1日でも 0 分の日があれば「サボり日あり」と表示する
平均が 30 分以上なら「よく頑張りました!」、それ未満なら「もう少し頑張ろう」

これを、
配列+for+if+メソッドで組み立てていきます。


全体のコードを先に見てみる

完成形(あとで分解して説明します)

using System;

class Program
{
    static void Main(string[] args)
    {
        PrintTitle();

        int[] studyMinutes = { 30, 45, 0, 60, 20, 0, 50 };

        PrintDaily(studyMinutes);

        int total = CalcTotal(studyMinutes);
        double average = CalcAverage(studyMinutes);
        bool hasZeroDay = HasZeroDay(studyMinutes);

        Console.WriteLine();
        Console.WriteLine("【集計結果】");
        Console.WriteLine("合計勉強時間: " + total + " 分");
        Console.WriteLine("平均勉強時間: " + average + " 分");

        if (hasZeroDay)
        {
            Console.WriteLine("※ 1日以上、勉強 0 分の日があります");
        }
        else
        {
            Console.WriteLine("毎日少しずつ勉強できています!");
        }

        PrintComment(average);
    }

    static void PrintTitle()
    {
        Console.WriteLine("================================");
        Console.WriteLine("  1週間 勉強時間チェッカー");
        Console.WriteLine("================================");
        Console.WriteLine();
    }

    static void PrintDaily(int[] minutes)
    {
        Console.WriteLine("【日別の勉強時間】");

        for (int i = 0; i < minutes.Length; i++)
        {
            int dayNumber = i + 1;
            Console.WriteLine(dayNumber + "日目: " + minutes[i] + " 分");
        }
    }

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

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

        return sum;
    }

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

    static bool HasZeroDay(int[] minutes)
    {
        for (int i = 0; i < minutes.Length; i++)
        {
            if (minutes[i] == 0)
            {
                return true;
            }
        }

        return false;
    }

    static void PrintComment(double average)
    {
        Console.WriteLine();
        Console.WriteLine("【コメント】");

        if (average >= 60)
        {
            Console.WriteLine("素晴らしい!1日平均 1 時間以上勉強できています!");
        }
        else if (average >= 30)
        {
            Console.WriteLine("いいペースです。この調子で続けましょう。");
        }
        else if (average > 0)
        {
            Console.WriteLine("少しずつ習慣はできています。もう 10 分だけ増やしてみませんか?");
        }
        else
        {
            Console.WriteLine("まずは 1 日 5 分からでも始めてみましょう。");
        }
    }
}
C#

ここから、パーツごとに分解していきます。


メインの流れを読む:Main メソッド

「アプリのストーリー」が書いてある場所

static void Main(string[] args)
{
    PrintTitle();

    int[] studyMinutes = { 30, 45, 0, 60, 20, 0, 50 };

    PrintDaily(studyMinutes);

    int total = CalcTotal(studyMinutes);
    double average = CalcAverage(studyMinutes);
    bool hasZeroDay = HasZeroDay(studyMinutes);

    Console.WriteLine();
    Console.WriteLine("【集計結果】");
    Console.WriteLine("合計勉強時間: " + total + " 分");
    Console.WriteLine("平均勉強時間: " + average + " 分");

    if (hasZeroDay)
    {
        Console.WriteLine("※ 1日以上、勉強 0 分の日があります");
    }
    else
    {
        Console.WriteLine("毎日少しずつ勉強できています!");
    }

    PrintComment(average);
}
C#

ここは「アプリ全体の流れ」を書く場所です。

タイトルを表示する(PrintTitle)
1週間の勉強時間データを用意する(studyMinutes 配列)
日別の勉強時間を表示する(PrintDaily)
合計・平均・0分の日があるかどうかを計算する(CalcTotal / CalcAverage / HasZeroDay)
集計結果を表示する
平均に応じたコメントを出す(PrintComment)

細かい計算や表示のロジックは、
それぞれ専用のメソッドに任せています。

Main は「ストーリーの台本」、
他のメソッドは「具体的なシーンの中身」
というイメージです。


表示系メソッド:PrintTitle と PrintDaily

タイトル表示をひとかたまりにする

static void PrintTitle()
{
    Console.WriteLine("================================");
    Console.WriteLine("  1週間 勉強時間チェッカー");
    Console.WriteLine("================================");
    Console.WriteLine();
}
C#

ここは「見た目だけ」の処理です。
Main の中に直接書いても動きますが、
メソッドにしておくと、

Main がスッキリする
あとでタイトルを変えたくなったとき、ここだけ直せばいい

というメリットがあります。

日別の勉強時間を for で表示する

static void PrintDaily(int[] minutes)
{
    Console.WriteLine("【日別の勉強時間】");

    for (int i = 0; i < minutes.Length; i++)
    {
        int dayNumber = i + 1;
        Console.WriteLine(dayNumber + "日目: " + minutes[i] + " 分");
    }
}
C#

ここでは、

int[] minutes
…「勉強時間の配列」を引数として受け取る

for 文
… 配列の要素数(Length)だけループする

i + 1 を dayNumber にしているのは、
「0日目」ではなく「1日目」と表示したいからです。

配列のインデックスは 0 始まり
人間向けの日数は 1 始まり

このギャップを、i + 1 で埋めています。


計算系メソッド:CalcTotal と CalcAverage

合計を出すメソッド

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

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

    return sum;
}
C#

ここは、5日目でやった「配列の合計」の完全な応用です。

sum を 0 でスタート
for の中で sum = sum + minutes[i];
最後に sum を return

Main から見ると、

int total = CalcTotal(studyMinutes);
C#

と書くだけで、
「この配列の合計が total に入る」と読めます。

平均を出すメソッド

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

ここでのポイントは二つです。

合計の計算を、もう一度書かずに CalcTotal に任せている
(double)total / minutes.Length で、小数の平均を出している

「すでにあるメソッドを、別のメソッドの中から使う」
というのは、とても大事な感覚です。

「合計を出すロジック」は CalcTotal に集約しておく
→ 他の場所では「合計が欲しければ CalcTotal を呼ぶ」だけ

こうしておくと、
もし合計の計算方法を変えたくなっても、
CalcTotal だけ直せば済みます。


判定系メソッド:HasZeroDay と PrintComment

0分の日があるかどうかを調べる

static bool HasZeroDay(int[] minutes)
{
    for (int i = 0; i < minutes.Length; i++)
    {
        if (minutes[i] == 0)
        {
            return true;
        }
    }

    return false;
}
C#

ここでの流れはこうです。

配列を先頭から順に見ていく
どこかで 0 を見つけたら、その場で true を返して終了
最後まで見ても 0 がなければ false を返す

return は「メソッドをそこで終わらせて、値を返す」命令です。

このメソッドのおかげで、Main では

bool hasZeroDay = HasZeroDay(studyMinutes);

if (hasZeroDay)
{
    ...
}
C#

と、とても自然な日本語に近い形で書けています。

平均に応じてコメントを変える

static void PrintComment(double average)
{
    Console.WriteLine();
    Console.WriteLine("【コメント】");

    if (average >= 60)
    {
        Console.WriteLine("素晴らしい!1日平均 1 時間以上勉強できています!");
    }
    else if (average >= 30)
    {
        Console.WriteLine("いいペースです。この調子で続けましょう。");
    }
    else if (average > 0)
    {
        Console.WriteLine("少しずつ習慣はできています。もう 10 分だけ増やしてみませんか?");
    }
    else
    {
        Console.WriteLine("まずは 1 日 5 分からでも始めてみましょう。");
    }
}
C#

ここは、3日目の if 〜 else if 〜 else の応用です。

average が 60 以上
→ 一番上の if が true になり、それ以降はスキップ

average が 30 以上 60 未満
→ 最初の if は false、次の else if が true

average が 0 より大きく 30 未満
→ 上の2つは false、3つ目の else if が true

average が 0
→ どれも当てはまらず、最後の else

「条件を上から順にチェックして、最初に当てはまったところだけ実行する」
という if の性質が、そのまま使われています。


7日目で押さえておきたい“全体像”

ここまでの 6 日間がどうつながっているか

このミニアプリには、これまでの要素が全部入っています。

変数
… total, average, hasZeroDay, sum, i など

if 文
… hasZeroDay の判定、コメントの分岐

for 文
… 日別表示、合計計算、0分の日チェック

配列
… studyMinutes 配列で 1週間分のデータを管理

メソッド
… PrintTitle, PrintDaily, CalcTotal, CalcAverage, HasZeroDay, PrintComment

そして何より大事なのは、
「Main から読むと、アプリの流れが自然に追える」
という構造になっていることです。


もし余裕があればやってみてほしいアレンジ

自分仕様に変えてみる

例えば、こんなアレンジができます。

studyMinutes の中身を、自分の実際の勉強時間に変えてみる
「目標平均時間」を決めて、それを超えたかどうかも表示する
0 分の日が 2 日以上あったら、メッセージを少し厳しめにする

どれも、
配列の中身を変える
if の条件を増やす
メソッドを1つ足す

といったレベルの変更で実現できます。


7日目のまとめ

7日間で、あなたは C# の「超初級」を一周しました。

Console.WriteLine で結果を出し
変数で値を覚え
演算で計算し
if で分岐し
for / while で繰り返し
配列でデータをまとめ
メソッドで処理をまとめる

今日のミニアプリは、
それらを「バラバラの知識」ではなく
「1つの流れのあるプログラム」として組み立てたものです。

ここから先は、
入力を受け取ったり
ファイルを扱ったり
画面付きのアプリにしたり

いくらでも広げていけます。

でも土台は、今日までにやったこの7日分です。
「このくらいなら自分で組み立てられる」
そう感じられていたら、もう十分に“次のステップに進める人”です。

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