Day26 ウォームアップ(10分)

広告

※10分の使い方は、「進め方(10分の使い方)」を参照
※生成AIは使いません
※全部できなくてOK
※今日のゴール目安:提出A(問題1が動く)で合格、提出B(1・2)で標準到達、提出C+発展で上位到達


今日の準備(ウォームアップの前に)

  1. Day26.cs を追加する(ソリューションエクスプローラーで、ソリューションの下にある プロジェクト「MiniPractice」を右クリック → 追加 → クラス → 名前を Day26.cs
  2. Program.cs を開き、Main 内の Day25.Run() を Day26.Run() に書き換える

最初に:コードの形を確認

今日から クラス宣言の形が変わります。次の形になっているか確認しましょう。

internal class Day26
{
    class Student
    {
        public string Name;
        public int Score;
    }

    public static void Run()
    {
        // ここに書く
    }
}
  • static class から internal class に変わります(今日から毎回この形)
  • 問題で使うクラスStudent など)は Day26 の中に nested(入れ子) で定義します
  • Run() は引き続き public static のままです
  • 問題1〜3 の処理は必ず Run() の { } の中 に書きます
  • 発展B では Run の外に private static メソッドを1つ 書いてもよいです

なぜ static class から internal class に変わるの?
Day1〜25 の static class は「フィールドやメソッドをまとめる入れ物」として最小限の形でした。internal classstatic なし)はインスタンスを作れる通常のクラスです。今日から new Student() でインスタンスを生み出す練習をするので、インスタンスを作れる形に切り替えます。Unity の MonoBehaviourや現場で書くクラスも基本的にこちらの形です。

なぜ Student を Day26 の中(nested)に書くの?
Student は今日のウォームアップ専用のクラスです。Day26 の外に書くとプロジェクト全体から見えてしまい、他の日のコードと名前が衝突しやすくなります。nested にすることで「Day26 の中だけで使う」ことを明示できます。Unity のプロジェクトでも、小さな補助クラスを同じファイル内に限定して書く場面はよくあります。


🔹 今日のルール

今日は クラスとインスタンス を初めて使います。

  • 問題1〜3 … Run メソッドの中だけで書きます
  • 発展A … List<Student> への追加と集約(Run の中で書きます)
  • 発展B … 条件判定を private static bool メソッド1つ にまとめます(Run の下に書きます)
  • 今は「new・フィールド・foreach の組み合わせを体で覚える」時間です。「なぜ new が必要?」「なぜ st.Score と書くの?」という疑問は積極的に声に出してください

🔹 出力について(教材共通)

教材では 簡潔な出力例(個数だけ・該当語のみ・数値のみなど)を載せています。条件・数え方・集約が正しければConsole.WriteLine に「合計:」などのラベルや、$"…: {値}" のような説明付きで出しても構いません。


🔹 Day25 の振り返り(1分)

  • EndsWith("e") … 文字列が "e" で終わるか。Contains / StartsWith / EndsWith の3セット。
  • && と || … 「かつ」は &&、「または」は ||
  • private static bool メソッド … 条件を1か所にまとめ、Run から呼び出す形。

🔹 今日のポイント

今日から OOP(クラス・インスタンス) フェーズに入ります。

  1. クラスを定義する … class Student の中に フィールドpublic string Name; / public int Score;)を書きます。
  2. インスタンスを作る(new … Student s = new Student(); でインスタンスを1つ作ります。
  3. フィールドに値を入れる … s.Name = "田中"; のように 変数名.フィールド名 = 値; で代入します。
  4. フィールドを読む … Console.WriteLine(s.Name); のように 変数名.フィールド名 で参照します。
  5. 配列に並べる … Student[] students = { new Student { Name = "山田", Score = 55 }, ... }; のように オブジェクト初期化子でまとめて書けます(問題2・3で使います)。

進め方(10分の使い方)

  • 最初の5分:教科書・ノート・これまで自分が書いたコードも見ずに、自分の力だけで書いてみましょう。止まっても構いません。思い出そうとする時間が大事です。
  • 後半5分:教科書・ノート・これまで自分が書いたコードを見てOKです。「どこを見ればよいか」「どう直せばよいか」を考えながら、完成に近づけましょう。

1限の過ごし方(目安)

細かい指示は Slack・スライド・口頭 に従ってください(教室のホワイトボードなどに書かれた内容があれば、それも含みます)。

時間(目安)内容
0〜15分ウォームアップ(準備・今日の課題・提出・動作確認)。課題の進め方は下の**「進め方(10分の使い方)」**のとおりです。
15〜45分学習時間これまでの Day 課題(提出コードの見直し・未完成の続き)、教科書の自習・予習など。Slack・スライド・口頭の指示を最優先)
45〜50分振り返りなど(指示に従う)
  • 提出が終わったら(ウォームアップの途中でも可)… Commit/Push と Slack「Day26 完了」は提出ルールに従い、採点を待たず次の学習に進みます。

提出ルール(重要)

  • 提出A(最低ライン):問題1だけ動けばOK
  • 提出B(標準):問題1・2まで
  • 提出C(到達):問題1・2・3(余裕があれば発展)

※今日も「全部できる」より「動く形にそろえる」が目的です。

  • 提出方法:GitHub Desktop で Commit → Push してください。1問ごとでも、まとめて1回でもOKです。
  • Slack:「Day26 完了しました」と一言送ってください。

■ 問題1(基礎)

Student クラスのインスタンスを 1つ 作り、Name と Score を表示してください。

// インスタンスの作り方の例
Student s = new Student();
s.Name = "田中";
s.Score = 85;
  • s.Name と s.Score をそれぞれ Console.WriteLine で表示してください。

メモ:問題2の配列では new Student { Name = "山田", Score = 55 } という オブジェクト初期化子 の書き方を使っています。これは「new して、フィールドをまとめて代入する」短縮形です。問題1の2行と意味は同じです。


■ 問題2(条件)

次の配列があります。

Student[] students =
{
    new Student { Name = "山田", Score = 55 },
    new Student { Name = "田中", Score = 82 },
    new Student { Name = "鈴木", Score = 70 },
    new Student { Name = "佐藤", Score = 45 },
    new Student { Name = "高橋", Score = 91 },
    new Student { Name = "伊藤", Score = 63 },
};

Score が 60 以上 の Student の Name だけを、foreach を使って1行ずつ表示してください。

ヒント:foreach (Student st in students) で回し、if (st.Score >= 60) のときに Console.WriteLine(st.Name); します。


■ 問題3(集計)

上の students 配列について、Score が 70 以上 の Student が 何人いるかを数え、個数だけを1行で表示してください。

ヒント:int count = 0; をループのに置き、条件に合うたびに count++; します。ループのに Console.WriteLine(count);を1回書きます。
条件:if (st.Score >= 70)


■ 発展A(余裕がある人)

上の students 配列について、Score が 70 以上 の Student を List<Student> に追加し、次の順序どおりに表示してください。

  1. 追加した各 Student の Name を foreach で1行ずつ表示する
  2. 追加した各 Student の Score の合計1行で表示する
  3. 続けて、Score の平均1行で表示する(整数のままでよいです。合計 ÷ list.Count
  4. 続けて、Score の最大1行で表示する(list の中だけを対象)
  5. 続けて、Score の最小1行で表示する(list の中だけを対象)

最大の求め方(例) … int max = int.MinValue; を用意し、foreach (Student st in list) で if (st.Score > max) { max = st.Score; } のように更新します。
最小の求め方(例) … int min = int.MaxValue; を用意し、foreach (Student st in list) で if (st.Score < min) { min = st.Score; } のように更新します。


■ 発展B(発展Aが動いたらチャレンジ)

発展A が動いたら、List に追加する条件(「Score が 70 以上か」)を private static bool メソッド に切り出してコードをきれいにしましょう。

  • メソッド名の例:IsHighScore
  • 引数:int score
  • 戻り値:bool
  • 中身:score >= 70 のとき true を返す

Run 内の foreach では、次のようにします(例)。

if (IsHighScore(st.Score))
{
    list.Add(st);
}

⚠️ つまずきやすい点

  • internal class と class Student の位置 … class Student は internal class Day26 のに書きます(Run の中ではありません)。
  • new Student() … new を忘れるとコンパイルエラーになります。
  • フィールドへのアクセス … s.Name のように 変数名.フィールド名 の形で書きます。Name だけでは参照できません。
  • foreach の型 … foreach (Student st in students) と書きます。int や string ではありません。
  • st.Score … st はループ変数名(自分で決めてよいです)。students.Score とは書けません。
  • count の表示 … ループのに Console.WriteLine(count); を必ず1回。
  • 発展Bのメソッド … Run の閉じ括弧の下に書きます(Run の中にネストしない)。

🎯 今日の目的

  • internal class + nested クラス の形を書ける
  • new でインスタンスを作り、フィールドに値を代入・参照できる
  • foreach (Student st in students) でクラスの配列を回せる
  • st.フィールド名 でフィールドにアクセスできる
  • 条件に合う要素を if でフィルタして表示・集計できる

次へ

次回(Day27)は、プロパティ(get; set; を使って Student クラスを書き直します。

訪問数 22 回, 今日の訪問数 1回

広告