Skip to content

第5章 繰り返し処理

この章では、同じような処理を何度も実行するための 繰り返し処理 を学習します。

プログラムでは、次のような処理を頻繁に行います。

1から10までの数を順番に表示する
複数件の点数を入力して合計する
入力が正しくなるまで再入力させる
社員一覧を1件ずつ表示する

繰り返し処理を使うと、同じ処理を条件や回数に応じて自動的に繰り返せます。


この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • while 文を使って、条件が成り立つ間処理を繰り返せる
  • for 文を使って、指定回数の繰り返し処理を書ける
  • do-while 文を使って、最低 1 回は実行する処理を書ける
  • 2 重ループを使って、表形式の出力ができる
  • break を使って、繰り返し処理を途中で終了できる
  • continue を使って、今回の処理だけをスキップできる
  • 無限ループが起きる原因と止め方を説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類コンソール アプリ
対象フレームワーク.NET 8
ソリューション名Chapter05
プロジェクト名Ch05_Loop

csproj の Nullable は disable に変更してください

プロジェクト作成後、Ch05_Loop.csproj を開き、<Nullable>disable</Nullable> に変更してください。

詳しい手順は、第 1 章「1-1 プロジェクトを作成する」を参照してください。


作業を始める前に、次の内容を確認してください。

  • Visual Studio 2022 でコンソールアプリを作成できる(不安な場合は 付録 B「VS2022 の準備と基本操作」 を参照)
  • csproj の Nullable を disable に変更できる
  • Console.ReadLine で入力を受け取れる
  • int.Parse で文字列を整数に変換できる
  • ifelseelse if を使った条件分岐が書ける
  • &&|| を使った条件式を書ける
  • 第 4 章の課題を Git に提出済みである

1 から 5 までの数を表示するプログラムは、次のように書けます。

Program.cs
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 行書く必要があります。これは現実的ではありません。


繰り返し処理を使うと、短く書けます。

Program.cs
namespace Ch05_Loop
{
internal class Program
{
static void Main(string[] args)
{
int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count += 1;
}
}
}
}

実行結果:

1
2
3
4
5

count の値を 1 ずつ増やしながら、count <= 5 が成り立つ間だけ処理を繰り返しています。


C# には、主に次の繰り返し処理があります。

構文主な使い方
while条件が成り立つ間、繰り返す
for指定回数だけ繰り返す
do-while最低 1 回は実行してから、条件を確認する
foreach配列やリストの要素を 1 つずつ取り出す

この章では、whilefordo-while を中心に扱います。foreach は配列を学ぶ章で詳しく扱います。


while 文は、条件が成り立つ間、処理を繰り返します。

while (条件式)
{
繰り返したい処理
}

条件式が true の間、{ } の中の処理が繰り返されます。条件式が false になった時点で、繰り返しを終了します。


次のコードを入力して実行してください。

Program.cs
namespace Ch05_Loop
{
internal class Program
{
static void Main(string[] args)
{
int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count += 1;
}
}
}
}

実行結果:

1
2
3
4
5

このコードの動きを順に追うと、次のようになります。

ステップcount の値count <= 5実行内容
開始1true1 を表示、count を 2 にする
2 周目2true2 を表示、count を 3 にする
3 周目3true3 を表示、count を 4 にする
4 周目4true4 を表示、count を 5 にする
5 周目5true5 を表示、count を 6 にする
6 周目確認6false繰り返し終了

count += 1; がないと count の値が変わらないため、繰り返しが終わらなくなります。


次のコードは、繰り返しが終わりません。

int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
// count += 1; が抜けている
}

count の値が変わらないため、いつまでも count <= 5 が成り立ち続けます。これを 無限ループ と呼びます。

無限ループになってしまったら

Visual Studio のツールバーにある ■(停止)ボタンをクリックして停止できます。 コンソールウィンドウが前面にある場合は Ctrl + C でも停止できます。

while 文では、繰り返しの中で条件に関係する値を変化させているか、必ず確認してください。


入力が正しくなるまで繰り返す

Section titled “入力が正しくなるまで繰り返す”

while 文は、入力チェックにもよく使われます。

次のコードでは、1 から 3 の番号が入力されるまで、入力を繰り返します。

Program.cs
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 以外が入力されている間は再入力させます。


for 文は、指定回数だけ処理を繰り返したいときによく使います。

for (初期化; 条件式; 更新)
{
繰り返したい処理
}

次のコードを入力して実行してください。

Program.cs
namespace Ch05_Loop
{
internal class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
}
}
}

実行結果:

1
2
3
4
5

for (int i = 1; i <= 5; i++)
部分意味
int i = 1繰り返し用の変数 i を 1 で始める(最初に 1 回だけ実行)
i <= 5i が 5 以下の間、繰り返す(毎回確認)
i++1 回繰り返すたびに i を 1 増やす(毎回最後に実行)

i++i += 1 と同じ意味です。++インクリメント演算子 と呼ばれ、変数の値を 1 増やします(第 3 章で予告した演算子です)。

補足:ループカウンタの名前

for 文の繰り返し用変数には、慣習的に ijk が使われます。多重ループの場合、外側から順に ijk と命名することが多いです。

ただし、業務的に意味がある繰り返しでは、yearrowcolemployeeId のように意味のある名前を付けたほうが読みやすくなります。「単なるカウンタ」なら i、「業務的な意味がある」なら意味ある名前、と使い分けてください。

補足:++ii++ の違い

++ は変数の前にも後ろにも付けられます。

  • i++(後置):式全体としては「元の値」を返してから 1 増やす
  • ++i(前置):「1 増やした値」を返す
int i = 5;
int a = i++; // a = 5、その後 i = 6
int b = ++i; // i = 7 になり、b = 7

ただし、for 文の更新部分のように 値を使わずに「ただ 1 増やすだけ」 の場面では、i++++i のどちらでも結果は同じです。慣習として for では i++ が多く使われます。

--(デクリメント演算子、1 減らす)にも同じ前置/後置の関係があります。


for (int i = 1; i <= 5; i++)

このコードは、次のように動きます。

ステップi の値i <= 5実行内容
初期化1-int i = 1 を実行
1 周目1true1 を表示、i++ で i を 2 にする
2 周目2true2 を表示、i++ で i を 3 にする
3 周目3true3 を表示、i++ で i を 4 にする
4 周目4true4 を表示、i++ で i を 5 にする
5 周目5true5 を表示、i++ で i を 6 にする
6 周目確認6false繰り返し終了

プログラムでは、0 から数え始めることがよくあります。

Program.cs
namespace Ch05_Loop
{
internal class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"i = {i}");
}
}
}
}

実行結果:

i = 0
i = 1
i = 2
i = 3
i = 4

i < 5 なので、i5 になる前に終了します。この書き方は、後の章で配列を扱うときによく出てきます。


次のコードでは、1 から 10 までの合計を求めます。

Program.cs
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}");
}
}
}

実行結果:

合計:55

total += i; によって、i の値を順番に加算しています(1 + 2 + 3 + … + 10 = 55)。


指定された人数分の点数を入力する

Section titled “指定された人数分の点数を入力する”

次のコードでは、3 人分の点数を入力し、合計と平均を求めます。

Program.cs
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人目の点数を入力してください。
80
2人目の点数を入力してください。
75
3人目の点数を入力してください。
90
合計点:245
平均点:81.66666666666667

回数が決まっている繰り返しには for 文が向いています。


for 文は、減算で逆順に繰り返すこともできます。

Program.cs
namespace Ch05_Loop
{
internal class Program
{
static void Main(string[] args)
{
for (int i = 5; i >= 1; i--)
{
Console.WriteLine(i);
}
}
}
}

実行結果:

5
4
3
2
1

ポイントは次の 3 つです。

  • 初期化は最大値 5 から始める
  • 条件式は i >= 1(まだ最小値以上なら続ける)
  • 更新は i--(1 減らすデクリメント演算子)

カウントダウンや「最新から古い順に表示」など、逆順で処理したい場面で使います。


構文向いている場面
while回数が決まっていない。条件が満たされるまで繰り返す
for回数が決まっている繰り返し

第 6 章で学ぶ 配列 と組み合わせる場合は、for 文または foreach 文(後で紹介)がよく使われます。


do-while 文は、処理を 1 回実行した後に条件を確認する繰り返しです。

do
{
繰り返したい処理
} while (条件式);

while 文と do-while 文の違いを比べると、次の通りです。

構文条件確認のタイミング最低実行回数
while処理の前(先に確認)0 回(最初から false なら実行されない)
do-while処理の後(後で確認)1 回(必ず 1 回は実行される)

次のコードでは、名前が入力されるまで繰り返します。

Program.cs
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 == "")

繰り返し処理の中に、さらに繰り返し処理を書くことを 2 重ループ といいます。

外側のループが 1 回進むごとに、内側のループが最初から最後まで実行されます。


次のコードを入力して実行してください。

Program.cs
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.WriteConsole.WriteLine の使い分けは次の通りです。

命令動作
Console.Write改行せずに表示する
Console.WriteLine表示後に改行する

内側のループで * を横に並べ、内側が終わったら Console.WriteLine() で改行します。


次のコードでは、行番号と列番号の組み合わせを表示します。

Program.cs
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 まで動いていることが分かります。


次のコードでは、5 × 5 の掛け算表を表示します。

Program.cs
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 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

\t はタブ文字を表します。表のように横方向の間隔を空けたいときに使います。


break 文は、繰り返し処理を途中で終了するために使います。

条件に合うデータが見つかった時点で繰り返しを終了したい場合などに使います。


break はすべての繰り返し文で使える

Section titled “break はすべての繰り返し文で使える”

breakwhile 文・for 文・do-while 文のいずれでも使えます。どの繰り返しでも「実行中のループを途中で抜ける」という同じ動作になります。


while(true) と break を組み合わせる(よく使うイディオム)

Section titled “while(true) と break を組み合わせる(よく使うイディオム)”

while (true) は条件が常に true なので、そのままでは無限ループです。break でループを抜ける条件を明示することで、意図した出口だけを持つ繰り返し として使えます。

この書き方は、次のような場面でよく使われます。

  • 「終了入力があるまで処理を続ける」(コマンド入力ループ)
  • 「条件成立で抜けたい場面で、while の条件式に押し込むと複雑になるとき」
  • 「ループの先頭ではなく中程で抜けたいとき」

次のコードでは、空文字が入力されるまでメッセージを受け付けます。

Program.cs
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 で割り切れる最初の数を探します。

Program.cs
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で割り切れる数:7

break が実行されると、for 文全体が終了します。


2 重ループの内側で break を使うと、内側のループだけを抜けます。外側のループは続きます。

Program.cs
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)

continue 文は、現在の繰り返しの残りの処理をスキップし、次の繰り返しに進みます。

動作
break繰り返し全体を終了する
continue今回だけスキップして次の繰り返しに進む

continuebreak と同様、while 文・for 文・do-while 文のいずれでも使えます。


次のコードでは、1 から 10 までのうち、偶数だけを表示します。

Program.cs
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);
}
}
}
}

実行結果:

2
4
6
8
10

number % 2 != 0(奇数)のときは continue によって Console.WriteLine をスキップし、次の繰り返しに進みます。


特定のデータをスキップするイメージ

Section titled “特定のデータをスキップするイメージ”

業務アプリでは、削除済みのデータを一覧に表示しない、という処理があります。continue はそのような「処理対象外のデータを飛ばす」場面で使えます。

Program.cs
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 複数の要素を組み合わせたコードを読む”

繰り返し処理では、自分でコードを書く力と同じくらい、他の人が書いたコードを読む力も重要です。

次のコードは、初期売上から毎年増加していき、目標金額を達成した年で終了するプログラムです。

Program.cs
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年目に目標を達成しました。
確認を終了します。

複雑な繰り返し処理を読むときは、次の点を確認します。

確認ポイントこのコードの場合
最大何回繰り返すか最大 10 回(year <= 10
繰り返しのたびに変化する変数yearsales
どの条件で終了するかsales >= targetbreak
break しなかった場合10 年目まで続いて終了

繰り返し処理の動きが分からなくなったときは、デバッグが有効です。

次の行にブレークポイントを設定してください。

sales += 8000;

F10 で 1 行ずつ実行し、yearsalestarget の値がどう変化するかを確認します。

繰り返し処理は、目で読むだけでなく、実際に 1 行ずつ動かして確認することが理解を深める近道です。

デバッグ操作の詳しい使い方は、第 21 章「作って覚えるで学ぶデバッグ操作と GUI アプリの確認」 で改めて学習します。この章では「ブレークポイントで止める」「F10 で 1 行進める」だけ覚えておけば十分です。


つまずき原因対応
繰り返しが終わらない条件に関係する値を変更していないcount += 1 などの更新処理を確認する
繰り返し中に止まらなくなった無限ループVS の停止ボタンか Ctrl + C で止める
1 回多く繰り返される<=< の使い分けを間違えている開始値・終了条件・更新処理を表で確認する
1 回も実行されない最初から条件式が false初期値と条件式を確認する
i++ の意味が分からないインクリメント演算子を知らないi += 1 と同じ意味と覚える
do-while の最後でエラーになる最後の ; を忘れている} while (条件式); の形を確認する
2 重ループの動きが分からない外側と内側の役割が混ざっている外側は行・内側は列と考える
breakcontinue を混同するどちらも繰り返し制御に使うbreak は終了・continue は今回だけスキップ

  • while 文の基本形を書ける
  • 無限ループが起きる原因と止め方を説明できる
  • for 文の基本形を書ける
  • for 文の初期化・条件式・更新の役割を説明できる
  • i++i += 1 と同じ意味であることを説明できる
  • ++ii++ の違いをおおまかに説明できる
  • ループカウンタに ijk を使う慣習を知っている
  • for 文で逆順に繰り返すことができる(i--)
  • while 文と for 文の使い分けを説明できる
  • do-while 文が最低 1 回実行されることを説明できる
  • 2 重ループの外側と内側の役割を説明できる
  • Console.WriteConsole.WriteLine の違いを説明できる
  • breakcontinue の違いを説明できる
  • while(true) + break のイディオムが何を実現するか説明できる

  1. while 文と for 文は、それぞれどのような場面に向いていますか。
  2. 無限ループはなぜ起きますか。止めるにはどうすればいいですか。
  3. do-whilewhile の違いは何ですか。
  4. breakcontinue の違いは何ですか。
  5. 2 重ループでは、外側と内側のループはそれぞれ何を担当しますか。
  6. for 文の更新部分で i++++i のどちらを書いても結果が同じになる理由は何ですか。
  7. while(true) + break のイディオムは、どのような状況で便利ですか。

この章の演習課題に取り組みます。

本章では タイマー方式 を試験導入します。次の 2 段階で進めてください。

段階時間内容
① ソロ作業30 分(タイマーで計測)一人で課題に取り組む。タイマーが鳴ったら、完成・未完成にかかわらず作業を止めて Git に提出する
② チーム時間講師が指定する発表開始時刻までチーム内でコードレビューを行い、発表者を決める。実装の続行も可。時間配分はチームで管理する

評価対象はタイマー時点で提出されたコードです(タイマー後に書き足した分は評価には含まれません)。 発表開始時刻は厳守 です。チーム時間中も、その時刻が来たら全員手を止めて発表に移ります。

演習の進め方の詳細は、付録A「演習の進め方」 を参照してください。


課題はソリューション Kadai05 の中に作成してください。

各課題のプロジェクト名は次の通りです。

課題プロジェクト名
課題5-1Kd05_01_ForBasic
課題5-2Kd05_02_ScoreTotal
課題5-3Kd05_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 を右クリックし、追加新しいプロジェクト から追加します。


以下は、本章のすべての課題に共通する作業です。各課題の本文には繰り返し書きません。

作業内容参照
プロジェクト作成時の設定最上位レベルのステートメントを使用しない」にチェック第 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 addgit commitgit 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 行ずつ表示してください。

実行結果:

1
2
3
4
5
6
7
8
9
10

条件:

  • for 文を使う
  • カウンタ変数を使う

課題5-2 N 人分の点数を入力して合計・平均を表示する

Section titled “課題5-2 N 人分の点数を入力して合計・平均を表示する”

何人分の点数を入力するかをキーボードから入力し、その人数分の点数を入力して合計と平均を表示してください。

実行例:

何人分の点数を入力しますか。
3
1人目の点数を入力してください。
80
2人目の点数を入力してください。
75
3人目の点数を入力してください。
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 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

条件:

  • 2 重ループを使う(外側が行、内側が列)
  • Console.WriteConsole.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 で終了する
  • 各年の売上を表示する

1 から 30 までの数字を順に表示してください。ただし、次のルールに従って表示します。

条件表示する内容
3 の倍数(かつ 5 の倍数でない)Foo
5 の倍数(かつ 3 の倍数でない)Bar
3 と 5 の両方の倍数(= 15 の倍数)FooBar
それ以外数字そのもの

実行結果(抜粋):

1
2
Foo
4
Bar
Foo
7
8
Foo
Bar
11
Foo
13
14
FooBar
16
...
29
FooBar

条件:

  • for 文を 1 つ使う(1 〜 30)
  • 余り演算子 %(第 3 章)で割り切れるかを判定する
  • 判定の 順番に注意(15 の倍数を先に判定する、または else if で分岐する)

ヒント:なぜ判定順序が大事か

「3 の倍数なら Foo」を先に書くと、15 のときも Foo だけが表示されてしまいます。 15 のときは FooBar と表示したいので、最初に「3 と 5 両方の倍数」をチェック するか、else if で順に分岐します。


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; } のイディオムが便利です。


  • プログラムを Visual Studio から実行できる
  • while 文または for 文を使っている
  • 無限ループになっていない
  • カウンタ変数の初期値・条件式・更新処理を確認した
  • 合計用の変数を正しく初期化している
  • break または continue の動きを説明できる
  • インデントが整っている
  • Git に commit している
  • Git に push している

タイマーが鳴ったら、第 5 章の課題プロジェクト群(Kadai05 ソリューション)をその場で Git に提出します。

Terminal window
git status
git add .
git commit -m "Chapter05 タイマー提出: <どこまで完成> / <詰まったポイント>"
git push

実行例:

Terminal window
git commit -m "Chapter05 タイマー提出: 5-1〜5-2完成、5-3は途中 / 5-3 の for の更新式で悩んだ"

Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。

コミットメッセージの形式は、本章冒頭「演習課題 > 提出ルール(タイマー方式)」を参照してください。


この章で学んだ主な内容は次の通りです。

  • while 文は条件が成り立つ間、処理を繰り返す
  • 無限ループになったら VS の停止ボタンか Ctrl + C で止める
  • for 文は初期化・条件式・更新の 3 つで構成される
  • i++i += 1 と同じ意味(インクリメント演算子)
  • ++ii++ は、値を使わない場面では同じ結果になる
  • ループカウンタには慣習的に ijk が使われる(業務的な意味がある場面では意味のある名前を)
  • for 文は i-- で逆順にも繰り返せる
  • do-while 文は最低 1 回は処理を実行する
  • 2 重ループを使うと行と列のような構造を表現できる
  • break は繰り返し処理を途中で終了する
  • continue は今回の処理だけをスキップして次の繰り返しに進む
  • break/continuewhile/for/do-while のいずれでも使える
  • while(true) + break は「明示的に出口を作るループ」のイディオム
  • デバッグで変数の変化を確認すると、繰り返し処理の動きを理解しやすい

次章では、配列 を学習します。

配列を使うと、複数の値を 1 つのまとまりとして管理できます。繰り返し処理と配列を組み合わせることで、複数件のデータを効率よく処理できるようになります。