講座全体の概要
プログラミング基礎講座の第5回です。講座全体の概要は以下の記事ゼロから始めるプログラミング基礎講座 第1回【講座の概要・目的】をご覧ください。
プログラムの基本 反復処理とは
反復処理とは同じ処理を繰り返す、いわゆるループ処理です。
プログラミングの3大要素と言われる、順次実行、反復処理、条件分岐の内の1つで、超重要な概念です。人間が同じような計算を繰り返すことは大変ですが、コンピューターは高速かつ正確に計算できますのでこれを活かすのが反復処理です。一般的にはループと言うことが多いので、以降の記事でもループと呼ぶことにします。
今回はこのループについて学習していきます。
準備として、Visual Studio で新しいプロジェクトを作成しましょう。名前は「BasicCourse5_1」とします。プロジェクトの作成方法がわからない場合は、第2回の記事からご覧ください。
ループの必要性
「ループがなぜ必要か? どんな時にループを使うのか?」を体感してもらおうと思います。
まず、「1から10の整数を全て足した結果を画面に表示する」プログラムを作成してください。ただし、足し算以外の四則演算は使わないでください。これまでの講座で学習した内容だけで実現できますので、回答例を見る前に、過去の講座を参考に自分で考えてプログラミングしてください。
回答例 ここを押すと開閉します
public int Sum1 = 0;
public int Sum2 = 0;
public void OnGet()
{
//回答例1
Sum1 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
//回答例2
Sum2 += 1;
Sum2 += 2;
Sum2 += 3;
Sum2 += 4;
Sum2 += 5;
Sum2 += 6;
Sum2 += 7;
Sum2 += 8;
Sum2 += 9;
Sum2 += 10;
}
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1>1から10の整数の総和を求めるプログラム</h1>
<h2>回答例1の結果:@Model.Sum1</h2>
<h2>回答例2の結果:@Model.Sum2</h2>
</div>
非常にシンプルに考えてプログラミングした2種類の回答例を挙げました。結果として「55」が計算されて表示できていれば、回答例と違ってもまったく問題ありません。
さて、ここからが本題です。先ほどは「1から10」でしたが、「1から1000」だとどうでしょう。とてもじゃないけど、そんなの書きたくないですよね。また、頑張って書いてもどこかでミスする可能性が高いですよね。なんとか簡単にできないでしょうか?
次の例を見てください。
処理を共通化した例 ここを押すと開閉します
public int Sum = 0;
public void OnGet()
{
int adder = 0;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
adder += 1;
Sum += adder;
}
この例は、先ほどと同じ「1から10の整数を全て足す」プログラムですが、同じ処理の繰り返しになるように考えたものです。
整数なので足す数は1ずつ増えます。それを表しているのが以下の1文です。
adder += 1;
adderの初期値は0にしているので、10回繰り返すことで1から10に変化していきます。adderの変化のたびにSumに足すことで求める結果が得られます。
この様に、似たような処理を共通化していくことがプログラミングでは重要になります。最初は難しいと思いますが、やりたいことを少し抽象化して考えることで共通の部分が見えてきます。これからプログラミングをしていく上で、常に意識して訓練していきましょう。
さて、上の例では同じ処理を10回繰り返し記述していますが、この処理は以下の様に書き換えることができます。
ループ処理で書き換えた例 ここを押すと開閉します
public int Sum = 0;
public void OnGet()
{
int adder = 0;
for (int i = 0; i < 10; i++)
{
adder += 1;
Sum += adder;
}
}
いかがでしょうか、かなりすっきりしましたね。例を参考に自分のプログラムを変更して実行してみてください。
ここで使用しているのが、for文というループ処理の命令です。
for文の構文
for文の構文は下記の通りです。
for ([初期化式]; [条件式]; [反復式])
{
処理ブロック
}
初期化式
ループの回数を制御するための変数に初期値を設定します。この変数をループ変数と言います。ループ変数はfor文より前に宣言しておくか、ここで宣言します。変数名は慣例として「i」が用いられますが、ループ回数以外に意味がある場合は別の名前でも構いません。初期化は最初に1回だけ行われます。
なお、for文より前にループ変数を宣言し初期値を設定してある場合、初期化式は省略可能です。
条件式
ループを継続する条件を記述します。条件式を評価し、条件を満たしている時、処理ブロックを1回実行します。その後、反復式が実行され、再度条件を評価します。条件を満たしている間はこれを繰り返します。条件を満たさなかった場合、処理ブロックは実行されずにfor文は終了します。ループを終了することを、「ループを抜ける」と言ったりします。ループに限らず、「抜ける」と言われたらその部分の処理を終了することだと思ってください。
なお、条件式は省略可能ですが、省略した場合は常に条件を満たしているものとしてループします。これを無限ループと言いますが、無限ループはバグ(意図した処理と違う=不具合のことをバグと言います)の原因になりますので原則として条件式は必ず記述しましょう。
前述の例だと、
i < 10
としていますので、iが10より小さい間ループします。iの初期値を0として、次に説明する反復式で1ずつ増やしていますので、iは0から9の間の合計10回ループします。
反復式
処理ブロックが1回実行された後にループ変数の値を変更する処理を記述します。ループ変数の変更以外の処理も記述できますが、原則としてループ変数の値を変更する処理だけ記述するようにしましょう。
なお、反復式は省略可能ですが、省略した場合はループ変数が変化しないため無限ループの原因となります。原則として反復式は必ず記述しましょう。
前述の例だと、
i++
の部分ですが、これは下記を省略した書き方で、iに1を足しています。
i += 1
実はこれも下記を省略した書き方です。
i = i + 1
省略した記述の方が、プログラミングに慣れた人が見た時に直感的にわかりやすいので、可能な場合は省略して記述しましょう。また、引き算も同様の省略記法があります。
初期化式を省略した例
前述の例は、初期化式を省略して以下の様にすることもできます。
ループ処理で書き換えた例 ここを押すと開閉します
public int Sum = 0;
public void OnGet()
{
int adder = 1;
for (; adder <= 10; adder++ )
{
Sum += adder;
}
}
初期化式を省略しても「;」セミコロンは省略できません。
ループの効果を体感したところで休憩
for文を使って「1から1000の足し算」を実行してみてください。計算結果が「500500」になれば正解です。
また、奇数のみ、偶数のみの足し算もここまでの学習内容で実現できますので、ぜひチャレンジして理解を深めてください。
前半はここまでとします。後半では今回紹介したfor文とは異なるループの記述方法を学習します。
この記事へのコメントはありません。