第5章 繰り返し処理
この章の目的
Section titled “この章の目的”この章では、同じような処理を何度も実行するための 繰り返し処理 を学習します。
プログラムでは、次のような処理を頻繁に行います。
1から10までの数を順番に表示する複数件の点数を入力して合計する入力が正しくなるまで再入力させる社員一覧を1件ずつ表示する繰り返し処理を使うと、同じ処理を条件や回数に応じて自動的に繰り返せます。
この章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
while文を使って、条件が成り立つ間処理を繰り返せるfor文を使って、指定回数の繰り返し処理を書けるdo-while文を使って、最低 1 回は実行する処理を書ける- 2 重ループを使って、表形式の出力ができる
breakを使って、繰り返し処理を途中で終了できるcontinueを使って、今回の処理だけをスキップできる- 無限ループが起きる原因と止め方を説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | コンソール アプリ |
| 対象フレームワーク | .NET 8 |
| ソリューション名 | Chapter05 |
| プロジェクト名 | Ch05_Loop |
csproj の Nullable は disable に変更してください
プロジェクト作成後、
Ch05_Loop.csprojを開き、<Nullable>disable</Nullable>に変更してください。詳しい手順は、第 1 章「1-1 プロジェクトを作成する」を参照してください。
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
- Visual Studio 2022 でコンソールアプリを作成できる(不安な場合は 付録 B「VS2022 の準備と基本操作」 を参照)
- csproj の Nullable を disable に変更できる
-
Console.ReadLineで入力を受け取れる -
int.Parseで文字列を整数に変換できる -
if、else、else ifを使った条件分岐が書ける -
&&、||を使った条件式を書ける - 第 4 章の課題を Git に提出済みである
5-1 繰り返し処理とは?
Section titled “5-1 繰り返し処理とは?”同じ処理を何度も書く問題
Section titled “同じ処理を何度も書く問題”1 から 5 までの数を表示するプログラムは、次のように書けます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { Console.WriteLine(1); Console.WriteLine(2); Console.WriteLine(3); Console.WriteLine(4); Console.WriteLine(5); } }}1 から 100 まで表示したいとなると、100 行書く必要があります。これは現実的ではありません。
繰り返し処理を使う
Section titled “繰り返し処理を使う”繰り返し処理を使うと、短く書けます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { int count = 1;
while (count <= 5) { Console.WriteLine(count); count += 1; } } }}実行結果:
12345count の値を 1 ずつ増やしながら、count <= 5 が成り立つ間だけ処理を繰り返しています。
繰り返し処理の種類
Section titled “繰り返し処理の種類”C# には、主に次の繰り返し処理があります。
| 構文 | 主な使い方 |
|---|---|
while 文 | 条件が成り立つ間、繰り返す |
for 文 | 指定回数だけ繰り返す |
do-while 文 | 最低 1 回は実行してから、条件を確認する |
foreach 文 | 配列やリストの要素を 1 つずつ取り出す |
この章では、while、for、do-while を中心に扱います。foreach は配列を学ぶ章で詳しく扱います。
5-2 while 文
Section titled “5-2 while 文”while 文の基本形
Section titled “while 文の基本形”while 文は、条件が成り立つ間、処理を繰り返します。
while (条件式){ 繰り返したい処理}条件式が true の間、{ } の中の処理が繰り返されます。条件式が false になった時点で、繰り返しを終了します。
1 から 5 まで表示する
Section titled “1 から 5 まで表示する”次のコードを入力して実行してください。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { int count = 1;
while (count <= 5) { Console.WriteLine(count); count += 1; } } }}実行結果:
12345while 文の流れ
Section titled “while 文の流れ”このコードの動きを順に追うと、次のようになります。
| ステップ | count の値 | count <= 5 | 実行内容 |
|---|---|---|---|
| 開始 | 1 | true | 1 を表示、count を 2 にする |
| 2 周目 | 2 | true | 2 を表示、count を 3 にする |
| 3 周目 | 3 | true | 3 を表示、count を 4 にする |
| 4 周目 | 4 | true | 4 を表示、count を 5 にする |
| 5 周目 | 5 | true | 5 を表示、count を 6 にする |
| 6 周目確認 | 6 | false | 繰り返し終了 |
count += 1; がないと count の値が変わらないため、繰り返しが終わらなくなります。
無限ループに注意する
Section titled “無限ループに注意する”次のコードは、繰り返しが終わりません。
int count = 1;
while (count <= 5){ Console.WriteLine(count); // count += 1; が抜けている}count の値が変わらないため、いつまでも count <= 5 が成り立ち続けます。これを 無限ループ と呼びます。
無限ループになってしまったら
Visual Studio のツールバーにある ■(停止)ボタンをクリックして停止できます。 コンソールウィンドウが前面にある場合は
Ctrl + Cでも停止できます。
while文では、繰り返しの中で条件に関係する値を変化させているか、必ず確認してください。
入力が正しくなるまで繰り返す
Section titled “入力が正しくなるまで繰り返す”while 文は、入力チェックにもよく使われます。
次のコードでは、1 から 3 の番号が入力されるまで、入力を繰り返します。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { int menu = 0;
while (menu < 1 || menu > 3) { Console.WriteLine("メニュー番号を入力してください。"); Console.WriteLine("1: 登録"); Console.WriteLine("2: 検索"); Console.WriteLine("3: 終了");
string input = Console.ReadLine(); menu = int.Parse(input); }
Console.WriteLine($"選択された番号:{menu}"); } }}実行例:
メニュー番号を入力してください。1: 登録2: 検索3: 終了5メニュー番号を入力してください。1: 登録2: 検索3: 終了2選択された番号:2条件式 menu < 1 || menu > 3 は「1 より小さい、または 3 より大きい間は繰り返す」という意味です。つまり、1〜3 以外が入力されている間は再入力させます。
5-3 for 文
Section titled “5-3 for 文”for 文の基本形
Section titled “for 文の基本形”for 文は、指定回数だけ処理を繰り返したいときによく使います。
for (初期化; 条件式; 更新){ 繰り返したい処理}1 から 5 まで表示する
Section titled “1 から 5 まで表示する”次のコードを入力して実行してください。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int i = 1; i <= 5; i++) { Console.WriteLine(i); } } }}実行結果:
12345for 文の 3 つの部分
Section titled “for 文の 3 つの部分”for (int i = 1; i <= 5; i++)| 部分 | 意味 |
|---|---|
int i = 1 | 繰り返し用の変数 i を 1 で始める(最初に 1 回だけ実行) |
i <= 5 | i が 5 以下の間、繰り返す(毎回確認) |
i++ | 1 回繰り返すたびに i を 1 増やす(毎回最後に実行) |
i++ は i += 1 と同じ意味です。++ は インクリメント演算子 と呼ばれ、変数の値を 1 増やします(第 3 章で予告した演算子です)。
補足:ループカウンタの名前
for文の繰り返し用変数には、慣習的にi、j、kが使われます。多重ループの場合、外側から順にi→j→kと命名することが多いです。ただし、業務的に意味がある繰り返しでは、
year、row、col、employeeIdのように意味のある名前を付けたほうが読みやすくなります。「単なるカウンタ」ならi、「業務的な意味がある」なら意味ある名前、と使い分けてください。
補足:
++iとi++の違い
++は変数の前にも後ろにも付けられます。
i++(後置):式全体としては「元の値」を返してから 1 増やす++i(前置):「1 増やした値」を返すint i = 5;int a = i++; // a = 5、その後 i = 6int b = ++i; // i = 7 になり、b = 7ただし、
for文の更新部分のように 値を使わずに「ただ 1 増やすだけ」 の場面では、i++と++iのどちらでも結果は同じです。慣習としてforではi++が多く使われます。
--(デクリメント演算子、1 減らす)にも同じ前置/後置の関係があります。
for 文の流れ
Section titled “for 文の流れ”for (int i = 1; i <= 5; i++)このコードは、次のように動きます。
| ステップ | i の値 | i <= 5 | 実行内容 |
|---|---|---|---|
| 初期化 | 1 | - | int i = 1 を実行 |
| 1 周目 | 1 | true | 1 を表示、i++ で i を 2 にする |
| 2 周目 | 2 | true | 2 を表示、i++ で i を 3 にする |
| 3 周目 | 3 | true | 3 を表示、i++ で i を 4 にする |
| 4 周目 | 4 | true | 4 を表示、i++ で i を 5 にする |
| 5 周目 | 5 | true | 5 を表示、i++ で i を 6 にする |
| 6 周目確認 | 6 | false | 繰り返し終了 |
0 から始まる for 文
Section titled “0 から始まる for 文”プログラムでは、0 から数え始めることがよくあります。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int i = 0; i < 5; i++) { Console.WriteLine($"i = {i}"); } } }}実行結果:
i = 0i = 1i = 2i = 3i = 4i < 5 なので、i が 5 になる前に終了します。この書き方は、後の章で配列を扱うときによく出てきます。
合計を求める
Section titled “合計を求める”次のコードでは、1 から 10 までの合計を求めます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { int total = 0;
for (int i = 1; i <= 10; i++) { total += i; }
Console.WriteLine($"合計:{total}"); } }}実行結果:
合計:55total += i; によって、i の値を順番に加算しています(1 + 2 + 3 + … + 10 = 55)。
指定された人数分の点数を入力する
Section titled “指定された人数分の点数を入力する”次のコードでは、3 人分の点数を入力し、合計と平均を求めます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { int total = 0;
for (int i = 1; i <= 3; i++) { Console.WriteLine($"{i}人目の点数を入力してください。");
string input = Console.ReadLine(); int score = int.Parse(input);
total += score; }
double average = (double)total / 3;
Console.WriteLine($"合計点:{total}"); Console.WriteLine($"平均点:{average}"); } }}実行例:
1人目の点数を入力してください。802人目の点数を入力してください。753人目の点数を入力してください。90合計点:245平均点:81.66666666666667回数が決まっている繰り返しには for 文が向いています。
逆順に繰り返す
Section titled “逆順に繰り返す”for 文は、減算で逆順に繰り返すこともできます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int i = 5; i >= 1; i--) { Console.WriteLine(i); } } }}実行結果:
54321ポイントは次の 3 つです。
- 初期化は最大値
5から始める - 条件式は
i >= 1(まだ最小値以上なら続ける) - 更新は
i--(1 減らすデクリメント演算子)
カウントダウンや「最新から古い順に表示」など、逆順で処理したい場面で使います。
while 文と for 文の使い分け
Section titled “while 文と for 文の使い分け”| 構文 | 向いている場面 |
|---|---|
while 文 | 回数が決まっていない。条件が満たされるまで繰り返す |
for 文 | 回数が決まっている繰り返し |
第 6 章で学ぶ 配列 と組み合わせる場合は、for 文または foreach 文(後で紹介)がよく使われます。
5-4 do-while 文
Section titled “5-4 do-while 文”do-while 文の基本形
Section titled “do-while 文の基本形”do-while 文は、処理を 1 回実行した後に条件を確認する繰り返しです。
do{ 繰り返したい処理} while (条件式);while 文と do-while 文の違いを比べると、次の通りです。
| 構文 | 条件確認のタイミング | 最低実行回数 |
|---|---|---|
while | 処理の前(先に確認) | 0 回(最初から false なら実行されない) |
do-while | 処理の後(後で確認) | 1 回(必ず 1 回は実行される) |
入力が空でないか確認する
Section titled “入力が空でないか確認する”次のコードでは、名前が入力されるまで繰り返します。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { string name;
do { Console.WriteLine("社員名を入力してください。"); name = Console.ReadLine(); } while (name == "");
Console.WriteLine($"{name}さん、こんにちは。"); } }}実行例:
社員名を入力してください。
社員名を入力してください。山田二郎山田二郎さん、こんにちは。1 回目に何も入力せず Enter を押した場合、name == "" が成り立つため、再入力になります。
「まず入力させてから確認する」という流れが自然な場面では do-while が使いやすいです。
エラーになりやすい例:最後のセミコロン忘れ
Section titled “エラーになりやすい例:最後のセミコロン忘れ”do-while 文では、最後に ; が必要です。
// 正しいdo{ name = Console.ReadLine();} while (name == "");
// エラー(; が抜けている)do{ name = Console.ReadLine();} while (name == "")5-5 2 重ループ
Section titled “5-5 2 重ループ”2 重ループとは
Section titled “2 重ループとは”繰り返し処理の中に、さらに繰り返し処理を書くことを 2 重ループ といいます。
外側のループが 1 回進むごとに、内側のループが最初から最後まで実行されます。
四角形を表示する
Section titled “四角形を表示する”次のコードを入力して実行してください。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int row = 1; row <= 3; row++) { for (int col = 1; col <= 5; col++) { Console.Write("*"); }
Console.WriteLine(); } } }}実行結果:
***************Console.Write と Console.WriteLine の使い分けは次の通りです。
| 命令 | 動作 |
|---|---|
Console.Write | 改行せずに表示する |
Console.WriteLine | 表示後に改行する |
内側のループで * を横に並べ、内側が終わったら Console.WriteLine() で改行します。
行番号と列番号を表示する
Section titled “行番号と列番号を表示する”次のコードでは、行番号と列番号の組み合わせを表示します。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int row = 1; row <= 3; row++) { for (int col = 1; col <= 4; col++) { Console.Write($"({row},{col}) "); }
Console.WriteLine(); } } }}実行結果:
(1,1) (1,2) (1,3) (1,4)(2,1) (2,2) (2,3) (2,4)(3,1) (3,2) (3,3) (3,4)外側の row が同じ間、内側の col が 1 から 4 まで動いていることが分かります。
掛け算表を表示する
Section titled “掛け算表を表示する”次のコードでは、5 × 5 の掛け算表を表示します。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int row = 1; row <= 5; row++) { for (int col = 1; col <= 5; col++) { int result = row * col; Console.Write($"{result}\t"); }
Console.WriteLine(); } } }}実行結果:
1 2 3 4 52 4 6 8 103 6 9 12 154 8 12 16 205 10 15 20 25\t はタブ文字を表します。表のように横方向の間隔を空けたいときに使います。
5-6 break 文
Section titled “5-6 break 文”break 文とは
Section titled “break 文とは”break 文は、繰り返し処理を途中で終了するために使います。
条件に合うデータが見つかった時点で繰り返しを終了したい場合などに使います。
break はすべての繰り返し文で使える
Section titled “break はすべての繰り返し文で使える”break は while 文・for 文・do-while 文のいずれでも使えます。どの繰り返しでも「実行中のループを途中で抜ける」という同じ動作になります。
while(true) と break を組み合わせる(よく使うイディオム)
Section titled “while(true) と break を組み合わせる(よく使うイディオム)”while (true) は条件が常に true なので、そのままでは無限ループです。break でループを抜ける条件を明示することで、意図した出口だけを持つ繰り返し として使えます。
この書き方は、次のような場面でよく使われます。
- 「終了入力があるまで処理を続ける」(コマンド入力ループ)
- 「条件成立で抜けたい場面で、
whileの条件式に押し込むと複雑になるとき」 - 「ループの先頭ではなく中程で抜けたいとき」
次のコードでは、空文字が入力されるまでメッセージを受け付けます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { while (true) { Console.WriteLine("メッセージを入力してください。空のままEnterで終了します。");
string message = Console.ReadLine();
if (message == "") { break; }
Console.WriteLine($"入力内容:{message}"); }
Console.WriteLine("入力を終了しました。"); } }}実行例:
メッセージを入力してください。空のままEnterで終了します。おはよう入力内容:おはようメッセージを入力してください。空のままEnterで終了します。こんにちは入力内容:こんにちはメッセージを入力してください。空のままEnterで終了します。
入力を終了しました。条件に合う値を探して終了する
Section titled “条件に合う値を探して終了する”次のコードでは、1 から 20 までの数の中から、7 で割り切れる最初の数を探します。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int number = 1; number <= 20; number++) { if (number % 7 == 0) { Console.WriteLine($"最初に7で割り切れる数:{number}"); break; } } } }}実行結果:
最初に7で割り切れる数:7break が実行されると、for 文全体が終了します。
2 重ループ内の break
Section titled “2 重ループ内の break”2 重ループの内側で break を使うと、内側のループだけを抜けます。外側のループは続きます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int row = 1; row <= 3; row++) { for (int col = 1; col <= 5; col++) { if (col == 3) { break; }
Console.Write($"({row},{col}) "); }
Console.WriteLine(); } } }}実行結果:
(1,1) (1,2)(2,1) (2,2)(3,1) (3,2)5-7 continue 文
Section titled “5-7 continue 文”continue 文とは
Section titled “continue 文とは”continue 文は、現在の繰り返しの残りの処理をスキップし、次の繰り返しに進みます。
| 文 | 動作 |
|---|---|
break | 繰り返し全体を終了する |
continue | 今回だけスキップして次の繰り返しに進む |
continue も break と同様、while 文・for 文・do-while 文のいずれでも使えます。
偶数だけ表示する
Section titled “偶数だけ表示する”次のコードでは、1 から 10 までのうち、偶数だけを表示します。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int number = 1; number <= 10; number++) { if (number % 2 != 0) { continue; }
Console.WriteLine(number); } } }}実行結果:
246810number % 2 != 0(奇数)のときは continue によって Console.WriteLine をスキップし、次の繰り返しに進みます。
特定のデータをスキップするイメージ
Section titled “特定のデータをスキップするイメージ”業務アプリでは、削除済みのデータを一覧に表示しない、という処理があります。continue はそのような「処理対象外のデータを飛ばす」場面で使えます。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { for (int employeeId = 1001; employeeId <= 1005; employeeId++) { bool isDeleted = employeeId == 1003;
if (isDeleted) { continue; }
Console.WriteLine($"社員ID:{employeeId}"); } } }}実行結果:
社員ID:1001社員ID:1002社員ID:1004社員ID:1005社員 ID 1003 は削除済みとみなし、表示をスキップしています。
5-8 複数の要素を組み合わせたコードを読む
Section titled “5-8 複数の要素を組み合わせたコードを読む”コードを読む練習
Section titled “コードを読む練習”繰り返し処理では、自分でコードを書く力と同じくらい、他の人が書いたコードを読む力も重要です。
次のコードは、初期売上から毎年増加していき、目標金額を達成した年で終了するプログラムです。
namespace Ch05_Loop{ internal class Program { static void Main(string[] args) { int sales = 100000; int target = 150000;
for (int year = 1; year <= 10; year++) { sales += 8000;
Console.WriteLine($"{year}年目:{sales}円");
if (sales >= target) { Console.WriteLine($"{year}年目に目標を達成しました。"); break; } }
Console.WriteLine("確認を終了します。"); } }}実行結果:
1年目:108000円2年目:116000円3年目:124000円4年目:132000円5年目:140000円6年目:148000円7年目:156000円7年目に目標を達成しました。確認を終了します。読むときの確認ポイント
Section titled “読むときの確認ポイント”複雑な繰り返し処理を読むときは、次の点を確認します。
| 確認ポイント | このコードの場合 |
|---|---|
| 最大何回繰り返すか | 最大 10 回(year <= 10) |
| 繰り返しのたびに変化する変数 | year、sales |
| どの条件で終了するか | sales >= target で break |
break しなかった場合 | 10 年目まで続いて終了 |
デバッグで確認する
Section titled “デバッグで確認する”繰り返し処理の動きが分からなくなったときは、デバッグが有効です。
次の行にブレークポイントを設定してください。
sales += 8000;F10 で 1 行ずつ実行し、year・sales・target の値がどう変化するかを確認します。
繰り返し処理は、目で読むだけでなく、実際に 1 行ずつ動かして確認することが理解を深める近道です。
デバッグ操作の詳しい使い方は、第 21 章「作って覚えるで学ぶデバッグ操作と GUI アプリの確認」 で改めて学習します。この章では「ブレークポイントで止める」「
F10で 1 行進める」だけ覚えておけば十分です。
よくあるつまずき
Section titled “よくあるつまずき”| つまずき | 原因 | 対応 |
|---|---|---|
| 繰り返しが終わらない | 条件に関係する値を変更していない | count += 1 などの更新処理を確認する |
| 繰り返し中に止まらなくなった | 無限ループ | VS の停止ボタンか Ctrl + C で止める |
| 1 回多く繰り返される | <= と < の使い分けを間違えている | 開始値・終了条件・更新処理を表で確認する |
| 1 回も実行されない | 最初から条件式が false | 初期値と条件式を確認する |
i++ の意味が分からない | インクリメント演算子を知らない | i += 1 と同じ意味と覚える |
do-while の最後でエラーになる | 最後の ; を忘れている | } while (条件式); の形を確認する |
| 2 重ループの動きが分からない | 外側と内側の役割が混ざっている | 外側は行・内側は列と考える |
break と continue を混同する | どちらも繰り返し制御に使う | break は終了・continue は今回だけスキップ |
学んだことチェック
Section titled “学んだことチェック”-
while文の基本形を書ける - 無限ループが起きる原因と止め方を説明できる
-
for文の基本形を書ける -
for文の初期化・条件式・更新の役割を説明できる -
i++がi += 1と同じ意味であることを説明できる -
++iとi++の違いをおおまかに説明できる - ループカウンタに
i、j、kを使う慣習を知っている -
for文で逆順に繰り返すことができる(i--) -
while文とfor文の使い分けを説明できる -
do-while文が最低 1 回実行されることを説明できる - 2 重ループの外側と内側の役割を説明できる
-
Console.WriteとConsole.WriteLineの違いを説明できる -
breakとcontinueの違いを説明できる -
while(true) + breakのイディオムが何を実現するか説明できる
while文とfor文は、それぞれどのような場面に向いていますか。- 無限ループはなぜ起きますか。止めるにはどうすればいいですか。
do-whileとwhileの違いは何ですか。breakとcontinueの違いは何ですか。- 2 重ループでは、外側と内側のループはそれぞれ何を担当しますか。
for文の更新部分でi++と++iのどちらを書いても結果が同じになる理由は何ですか。while(true) + breakのイディオムは、どのような状況で便利ですか。
この章の演習課題に取り組みます。
本章では タイマー方式 を試験導入します。次の 2 段階で進めてください。
| 段階 | 時間 | 内容 |
|---|---|---|
| ① ソロ作業 | 30 分(タイマーで計測) | 一人で課題に取り組む。タイマーが鳴ったら、完成・未完成にかかわらず作業を止めて Git に提出する |
| ② チーム時間 | 講師が指定する発表開始時刻まで | チーム内でコードレビューを行い、発表者を決める。実装の続行も可。時間配分はチームで管理する |
評価対象はタイマー時点で提出されたコードです(タイマー後に書き足した分は評価には含まれません)。 発表開始時刻は厳守 です。チーム時間中も、その時刻が来たら全員手を止めて発表に移ります。
演習の進め方の詳細は、付録A「演習の進め方」 を参照してください。
この章の演習の進め方
Section titled “この章の演習の進め方”課題はソリューション Kadai05 の中に作成してください。
各課題のプロジェクト名は次の通りです。
| 課題 | プロジェクト名 |
|---|---|
| 課題5-1 | Kd05_01_ForBasic |
| 課題5-2 | Kd05_02_ScoreTotal |
| 課題5-3 | Kd05_03_MenuInput |
| 課題5-4(発展) | Kd05_04_MultiplicationTable |
| 課題5-5(発展) | Kd05_05_SalesTarget |
| 課題5-6(発展) | Kd05_06_FooBar |
| 課題5-7(発展) | Kd05_07_GuessNumber |
補足:ソリューションに複数のプロジェクトを追加する方法
最初の課題で
Kadai05ソリューションとKd05_01_ForBasicプロジェクトを同時に作成します。2 つ目以降の課題は、ソリューションエクスプローラーで
Kadai05を右クリックし、追加→新しいプロジェクトから追加します。
演習の共通ルール
Section titled “演習の共通ルール”以下は、本章のすべての課題に共通する作業です。各課題の本文には繰り返し書きません。
| 作業 | 内容 | 参照 |
|---|---|---|
| プロジェクト作成時の設定 | 「最上位レベルのステートメントを使用しない」にチェック | 第 1 章 1-1 |
| csproj の編集 | <Nullable>disable</Nullable> に変更 | 第 1 章 1-1 |
| コードを書く場所 | Main メソッドの中(本章 5-2 などのサンプル形式と同じ) | 5-2 |
| ファイルを保存して実行 | Ctrl + S で保存 → F5 で実行 | 第 1 章 1-2 |
特に 2 つ目以降のプロジェクト(Kd05_02_ScoreTotal など)も、新規追加するたびに csproj の Nullable を disable に変更する 必要があります。忘れると警告が出やすくなります。
演習課題のコードは、本文と同じ namespace + class Program + Main の枠組みの中に書きます。
提出ルール(タイマー方式)
- 演習スタートと同時に、30 分のタイマー をセットします
- タイマーが鳴ったら、完成・未完成にかかわらず手を止め、その場で
git add→git commit→git pushを行います- これがこの演習の 唯一の提出 です。タイマー後も実装を続けて構いませんが、書き足した分は評価対象には含まれません
コミットメッセージの形式:
Chapter05 タイマー提出: <どの課題まで完成> / <詰まったポイント>例:
Chapter05 タイマー提出: 5-1〜5-2完成、5-3は途中 / 5-3 の for の更新式で詰まっているChapter05 タイマー提出: 5-1〜5-3全て完成、発展未着手 / 特になしChapter05 タイマー提出: 5-1の途中まで / while の条件式の書き方が分からない「どこまでできたか」「詰まったポイント」は短くて構いません。順調なときも「特になし」と明示 してください(順調さの証拠になります)。
タイマー後のチーム時間の使い方
タイマー後、講師が指定する 発表開始時刻 までがチーム時間です。チーム内で次の 3 つを自由に管理してください。
- コードレビュー:他のメンバーの commit を読んで、気づいたことを共有する
- 発表者の選出:発表開始時刻に、チームから 1 人が要点を発表できるよう、誰が話すかを決めておく
- 実装の続行(任意):途中だった課題を続けても構いません(提出後の追加分は評価対象外ですが、理解を深める意義はあります)
どの順番で進めるか、何分ずつ使うかはチームの判断です。ただし 発表開始時刻は厳守 です。その時刻までにレビューと発表者選出を必ず終わらせてください。
課題5-1 for 文で 1 から 10 まで表示する
Section titled “課題5-1 for 文で 1 から 10 まで表示する”for 文を使って、1 から 10 までの数値を 1 行ずつ表示してください。
実行結果:
12345678910条件:
for文を使う- カウンタ変数を使う
課題5-2 N 人分の点数を入力して合計・平均を表示する
Section titled “課題5-2 N 人分の点数を入力して合計・平均を表示する”何人分の点数を入力するかをキーボードから入力し、その人数分の点数を入力して合計と平均を表示してください。
実行例:
何人分の点数を入力しますか。31人目の点数を入力してください。802人目の点数を入力してください。753人目の点数を入力してください。90合計点:245平均点:81.66666666666667条件:
for文を使う- 人数をキーボードから入力する
- 合計を
int型で管理する - 平均は小数で表示する(キャストを使う)
課題5-3 有効なメニュー番号が入力されるまで再入力させる
Section titled “課題5-3 有効なメニュー番号が入力されるまで再入力させる”1 から 3 のメニュー番号が入力されるまで、入力を繰り返してください。
実行例:
メニュー番号を入力してください。1: 登録2: 検索3: 終了5メニュー番号を入力してください。1: 登録2: 検索3: 終了2選択された番号:2条件:
while文を使う- 1〜3 以外が入力された場合は再入力させる
- 正しい番号が入力されたら繰り返しを終了する
課題5-4 5 × 5 の掛け算表を表示する
Section titled “課題5-4 5 × 5 の掛け算表を表示する”2 重ループを使って、5 × 5 の掛け算表を表示してください。
実行結果:
1 2 3 4 52 4 6 8 103 6 9 12 154 8 12 16 205 10 15 20 25条件:
- 2 重ループを使う(外側が行、内側が列)
Console.WriteとConsole.WriteLineを使い分ける\t(タブ)で列を区切る
課題5-5 売上が目標に到達する年数を求める
Section titled “課題5-5 売上が目標に到達する年数を求める”初期売上 100000 円、毎年 12000 円ずつ増えるとして、売上が 180000 円以上になるのは何年目かを表示してください。
実行結果例:
1年目:112000円2年目:124000円3年目:136000円4年目:148000円5年目:160000円6年目:172000円7年目:184000円7年目に目標を達成しました。条件:
for文またはwhile文を使う- 目標に到達したら
breakで終了する - 各年の売上を表示する
課題5-6 FooBar
Section titled “課題5-6 FooBar”1 から 30 までの数字を順に表示してください。ただし、次のルールに従って表示します。
| 条件 | 表示する内容 |
|---|---|
| 3 の倍数(かつ 5 の倍数でない) | Foo |
| 5 の倍数(かつ 3 の倍数でない) | Bar |
| 3 と 5 の両方の倍数(= 15 の倍数) | FooBar |
| それ以外 | 数字そのもの |
実行結果(抜粋):
12Foo4BarFoo78FooBar11Foo1314FooBar16...29FooBar条件:
for文を 1 つ使う(1 〜 30)- 余り演算子
%(第 3 章)で割り切れるかを判定する - 判定の 順番に注意(15 の倍数を先に判定する、または
else ifで分岐する)
ヒント:なぜ判定順序が大事か
「3 の倍数なら Foo」を先に書くと、15 のときも
Fooだけが表示されてしまいます。15のときはFooBarと表示したいので、最初に「3 と 5 両方の倍数」をチェック するか、else ifで順に分岐します。
課題5-7 数当てゲーム
Section titled “課題5-7 数当てゲーム”1 〜 100 のランダムな数字をコンピューターが用意します。 プレイヤーがキーボードから数字を入力し、当たるまで繰り返し入力します。 入力ごとに、大きい/小さい のヒントを表示し、当たったら 何回目で当てたか も表示します。
実行例:
1〜100 の数字を当ててください。数字を入力してください:50もっと小さい数です。数字を入力してください:25もっと大きい数です。数字を入力してください:37もっと大きい数です。数字を入力してください:42正解! 4 回で当てました。条件:
while文を使って、当たるまで繰り返す- 入力値が答えより大きい/小さい/等しいを判定してヒントを表示する
- 当たった回数(試行回数)を表示する
ヒント:乱数の作り方
1 〜 100 のランダムな整数は、次の 2 行で作れます(
Randomの詳細は第 8 章で学びますが、ここでは使い方だけ覚えておけば十分です)。Random random = new Random();int answer = random.Next(1, 101); // 1 以上 101 未満 = 1〜100入力された文字列を整数に変換するには
int.Parse(Console.ReadLine())を使います(第 3 章で学習済み)。 ループの書き方は、本章で学んだwhile (true) { ... break; }のイディオムが便利です。
提出前チェックリスト
Section titled “提出前チェックリスト”- プログラムを Visual Studio から実行できる
-
while文またはfor文を使っている - 無限ループになっていない
- カウンタ変数の初期値・条件式・更新処理を確認した
- 合計用の変数を正しく初期化している
-
breakまたはcontinueの動きを説明できる - インデントが整っている
- Git に commit している
- Git に push している
Git への提出
Section titled “Git への提出”タイマーが鳴ったら、第 5 章の課題プロジェクト群(Kadai05 ソリューション)をその場で Git に提出します。
git statusgit add .git commit -m "Chapter05 タイマー提出: <どこまで完成> / <詰まったポイント>"git push実行例:
git commit -m "Chapter05 タイマー提出: 5-1〜5-2完成、5-3は途中 / 5-3 の for の更新式で悩んだ"Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。
コミットメッセージの形式は、本章冒頭「演習課題 > 提出ルール(タイマー方式)」を参照してください。
この章のまとめ
Section titled “この章のまとめ”この章で学んだ主な内容は次の通りです。
while文は条件が成り立つ間、処理を繰り返す- 無限ループになったら VS の停止ボタンか
Ctrl + Cで止める for文は初期化・条件式・更新の 3 つで構成されるi++はi += 1と同じ意味(インクリメント演算子)++iとi++は、値を使わない場面では同じ結果になる- ループカウンタには慣習的に
i、j、kが使われる(業務的な意味がある場面では意味のある名前を) for文はi--で逆順にも繰り返せるdo-while文は最低 1 回は処理を実行する- 2 重ループを使うと行と列のような構造を表現できる
breakは繰り返し処理を途中で終了するcontinueは今回の処理だけをスキップして次の繰り返しに進むbreak/continueはwhile/for/do-whileのいずれでも使えるwhile(true) + breakは「明示的に出口を作るループ」のイディオム- デバッグで変数の変化を確認すると、繰り返し処理の動きを理解しやすい
次章では、配列 を学習します。
配列を使うと、複数の値を 1 つのまとまりとして管理できます。繰り返し処理と配列を組み合わせることで、複数件のデータを効率よく処理できるようになります。