C# | 2週間で身につくアプリを作りながら学ぶC#の基本 - 6日目

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

6日目のゴールとテーマ

6日目のテーマは「メソッドでコードを“部品化”する」です。
ここまでで、入力・条件分岐・繰り返し・配列・クイズアプリの土台まで来ました。

今日はそこに「メソッド」という考え方を足して、

同じ処理を何度も使い回せるようにする
長くなってきたコードを、読みやすく分割する
「このメソッドは何をするか」を自分で設計して書けるようにする

ここを目指します。
一気に“プロっぽい書き方”に近づく日です。


メソッドとは何かをイメージでつかむ

「名前の付いた処理のまとまり」

まずはイメージからいきます。

今まで、Main メソッドの中に全部の処理を書いてきました。

static void Main(string[] args)
{
    Console.WriteLine("処理A");
    Console.WriteLine("処理B");
    Console.WriteLine("処理C");
}
C#

これが長くなってくると、どこで何をしているのか分かりにくくなります。

そこで、「処理のまとまり」に名前を付けて外に出すのがメソッドです。

static void DoSomething()
{
    Console.WriteLine("処理A");
    Console.WriteLine("処理B");
    Console.WriteLine("処理C");
}
C#

そして Main からは、こう呼び出します。

static void Main(string[] args)
{
    DoSomething();
}
C#

「DoSomething という名前の“処理の塊”を呼び出す」
これがメソッドの基本イメージです。

メソッドの基本形

いちばんシンプルなメソッドの形はこうです。

static void メソッド名()
{
    // ここにやりたい処理を書く
}
C#

static と void は、今は「おまじない」と思って構いません。
大事なのは「メソッド名」と「中身」です。


引数付きメソッドで「値を渡す」

「表示したいメッセージを渡す」メソッド

例えば、「メッセージを 1 行表示する」処理をメソッドにしたいとします。

static void PrintMessage(string message)
{
    Console.WriteLine(message);
}
C#

ここで新しく出てきたのが「引数」です。

かっこの中の string message が引数です。
「このメソッドを呼ぶときに、文字列を 1 つ渡してください」という意味になります。

Main からはこう呼びます。

static void Main(string[] args)
{
    PrintMessage("こんにちは");
    PrintMessage("C# を勉強中です");
    PrintMessage("メソッドを練習しています");
}
C#

実行すると、3 行表示されます。

ここでの重要ポイントはこうです。

呼び出し側で渡した値が、メソッド側の引数(ここでは message)に入る
メソッドの中では、その引数を普通の変数のように使える

「メソッドに値を渡す」感覚をここでつかんでください。


戻り値付きメソッドで「結果を返す」

「足し算して結果を返す」メソッド

次は、「計算して結果を返す」メソッドを作ってみます。

static int Add(int a, int b)
{
    int result = a + b;
    return result;
}
C#

ここで新しく出てきたのが「戻り値」です。

メソッド名の前の int が「戻り値の型」です。
このメソッドは「int 型の結果を返します」という宣言になっています。

return result; が「この値を呼び出し元に返す」という意味です。

Main からはこう使います。

static void Main(string[] args)
{
    int x = Add(3, 5);
    Console.WriteLine("3 + 5 = " + x);

    int y = Add(10, 20);
    Console.WriteLine("10 + 20 = " + y);
}
C#

流れを言葉で追うと、

Add(3, 5) を呼び出す
a に 3、b に 5 が入る
result に 3 + 5 が入る
return result; で 8 が返る
呼び出し側の x に 8 が入る

という感じです。

戻り値があるメソッドの基本形

形としてはこう覚えておくと楽です。

static 戻り値の型 メソッド名(引数リスト)
{
    // 何か処理をする
    return 戻したい値;
}
C#

戻り値がないときは void、あるときは intstring などの型を書きます。


クイズアプリの「1問分の処理」をメソッド化する

5日目のクイズを振り返る

昨日のクイズアプリでは、Main の中にこんな感じのコードがありました。

for (int i = 0; i < questions.Length; i++)
{
    Console.WriteLine("第 " + (i + 1) + " 問");
    Console.WriteLine(questions[i]);

    Console.WriteLine("答えを入力してください:");
    string userAnswer = Console.ReadLine();

    if (userAnswer.ToLower() == answers[i].ToLower())
    {
        Console.WriteLine("正解!");
        score = score + 1;
    }
    else
    {
        Console.WriteLine("不正解…");
        Console.WriteLine("正解は: " + answers[i]);
    }

    Console.WriteLine();
}
C#

この「1 問出して、正解かどうか判定して、スコアを増やす」部分を
メソッドに切り出してみます。

「1問出して、正解なら true を返す」メソッド

次のようなメソッドを作ります。

static bool AskQuestion(string question, string answer)
{
    Console.WriteLine(question);
    Console.WriteLine("答えを入力してください:");
    string userAnswer = Console.ReadLine();

    if (userAnswer.ToLower() == answer.ToLower())
    {
        Console.WriteLine("正解!");
        Console.WriteLine();
        return true;
    }
    else
    {
        Console.WriteLine("不正解…");
        Console.WriteLine("正解は: " + answer);
        Console.WriteLine();
        return false;
    }
}
C#

ここでのポイントはこうです。

引数として「質問」と「正解」を受け取る
中で表示と入力と判定を全部やる
正解なら true、不正解なら false を返す

Main からはこう使えます。

int score = 0;

for (int i = 0; i < questions.Length; i++)
{
    Console.WriteLine("第 " + (i + 1) + " 問");

    bool isCorrect = AskQuestion(questions[i], answers[i]);

    if (isCorrect)
    {
        score = score + 1;
    }
}

Console.WriteLine("正解数: " + score + " / " + questions.Length);
C#

「1 問分の処理」が AskQuestion にまとまったことで、
Main の中がかなりスッキリしました。


「役割ごとにメソッドを分ける」感覚をつかむ

表示用メソッドを作る

例えば、結果表示の部分もメソッドにできます。

static void ShowResult(int score, int total)
{
    Console.WriteLine("=== 結果発表 ===");
    Console.WriteLine("正解数: " + score + " / " + total);

    double rate = (double)score / total * 100;
    Console.WriteLine("正解率: " + rate + " %");

    if (rate == 100)
    {
        Console.WriteLine("完璧です!");
    }
    else if (rate >= 60)
    {
        Console.WriteLine("なかなかいい感じです。");
    }
    else
    {
        Console.WriteLine("もう少し復習してみましょう。");
    }
}
C#

Main からは最後にこう呼ぶだけです。

ShowResult(score, questions.Length);
C#

こうやって「役割ごとにメソッドを分ける」と、

Main は「全体の流れ」だけを書く場所になる
細かい処理は、それぞれのメソッドに任せられる
後から読み返したときに、どこで何をしているか分かりやすい

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


6日目の仕上げ:メソッドを使ったクイズアプリ全体像

全体のコードイメージ

ここまでの内容をまとめると、クイズアプリはこんな構成にできます。

質問と答えの配列を用意する
Main では「ループで AskQuestion を呼ぶ」「最後に ShowResult を呼ぶ」
AskQuestion は「1 問出して true/false を返す」
ShowResult は「スコアを受け取って結果を表示する」

コードのイメージは次のようになります。

static void Main(string[] args)
{
    string[] questions =
    {
        "C# はどの会社が作った言語?",
        "C# のファイル拡張子は?",
        "コンソールに出力するメソッドは?"
    };

    string[] answers =
    {
        "Microsoft",
        ".cs",
        "Console.WriteLine"
    };

    int score = 0;

    for (int i = 0; i < questions.Length; i++)
    {
        Console.WriteLine("第 " + (i + 1) + " 問");
        bool isCorrect = AskQuestion(questions[i], answers[i]);

        if (isCorrect)
        {
            score = score + 1;
        }
    }

    ShowResult(score, questions.Length);
}

static bool AskQuestion(string question, string answer)
{
    Console.WriteLine(question);
    Console.WriteLine("答えを入力してください:");
    string userAnswer = Console.ReadLine();

    if (userAnswer.ToLower() == answer.ToLower())
    {
        Console.WriteLine("正解!");
        Console.WriteLine();
        return true;
    }
    else
    {
        Console.WriteLine("不正解…");
        Console.WriteLine("正解は: " + answer);
        Console.WriteLine();
        return false;
    }
}

static void ShowResult(int score, int total)
{
    Console.WriteLine("=== 結果発表 ===");
    Console.WriteLine("正解数: " + score + " / " + total);

    double rate = (double)score / total * 100;
    Console.WriteLine("正解率: " + rate + " %");

    if (rate == 100)
    {
        Console.WriteLine("完璧です!");
    }
    else if (rate >= 60)
    {
        Console.WriteLine("なかなかいい感じです。");
    }
    else
    {
        Console.WriteLine("もう少し復習してみましょう。");
    }
}
C#

ここまで書けたら、「メソッドを使ってコードを整理する」という感覚はかなり身についています。


6日目のまとめ

今日のキーワードを整理します。

メソッド
名前の付いた処理のまとまり。何度でも呼び出せる“部品”。

引数
メソッドに渡す値。メソッド側では変数として扱える。

戻り値
メソッドから呼び出し元に返す値。型をメソッド名の前に書き、return で返す。

役割分担
Main は「全体の流れ」、メソッドは「具体的な処理」を担当させると読みやすくなる。

次の段階では、この「メソッドで部品化する」考え方が、
クラスやオブジェクト指向につながっていきます。


次回(7日目)への予告

7日目は、ここまでのコンソールアプリの知識を一度まとめて、

簡単な「ミニアプリ」を一つ完成させる日にします。
例えば、

診断アプリ
クイズアプリの強化版
メモ風のテキスト管理アプリ

などからテーマを決めて、「設計 → 実装 → 動作確認」まで通してやってみます。

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