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日分です。
「このくらいなら自分で組み立てられる」
そう感じられていたら、もう十分に“次のステップに進める人”です。
