スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

プログラミングの繰り返し文(ループ文)の書き方と考え方

303, 2020-02-21

目次

プログラミングの繰り返し(ループ)

プログラミングをやっていると必ず出てくるのが繰り返し文(ループ文)です。
この記事では具体的に繰り返し文について解説しています。

要点は↓の通りです。

  • 繰り返し文の考え方
  • 繰り返し文の構成
  • 色んなコードの実例

繰り返し文の考え方

まず最初に繰り返し文の基本的な考え方についてです。
プログラミング言語はたくさんあって、プログラミング言語ごとに繰り返し文は書き方が違うこともありますが、基本的な考え方は同じです。
つまり、この考え方さえつかんでいればいろんな言語の繰り返し文について怖くないということになります。

最初にこの考え方を身体や脳に浸透させるようにしておきましょう。

繰り返し文が必要になるとき

繰り返し文が必要になる時はどんな時か考えてみます。

プログラミングは、パソコンへの命令を書くことです。
コードというパソコンへの命令を、パソコンに与えることで、パソコンはその通りに仕事をします。

繰り返し文はコードの一種です。
そして繰り返し文がパソコンに与える命令とは、「指定回数だけ処理を繰り返せ」ということです。

  • 指定回数だけ処理を繰り返せ

たとえば蔵書を管理する蔵書プログラムを作っていたとします。
蔵書が1冊2冊なら繰り返し文を使う必要は無いかもしれませんが、これが100冊とかになったら繰り返し文の出番です。
その蔵書プログラムで全ての蔵書のページ数を合計したいとます。
実装の仕方はいろいろありますが、一番手っ取り早いのが「すべての蔵書のページ数を参照していって、そのページ数を変数に足していく」という方法です。
このとき、愚直にコードを書くと↓のような疑似コードになります。

ページ数合計 += 蔵書1.ページ数
ページ数合計 += 蔵書2.ページ数
ページ数合計 += 蔵書3.ページ数
...

しかし、↑のようにコードを書いていたのでは蔵書が増減したときに対応できませんし、なにより面倒です。
こういう時に繰り返し文を使います。
繰り返し文を使えば、先ほどの疑似コードは↓のように書き直すことが出来ます。

for (i = 0; i < 蔵書数; i++) {
    ページ数合計 += 蔵書i.ページ数
}

↑のように書けば蔵書が増減したときもコードを書き直さなくて済みます。
このように繰り返し文は「大量にあるデータを効率よく参照できる」という特徴を持っています。

  • 繰り返し文は大量にあるデータを効率よく参照できる

繰り返し文の構成

繰り返し文はどんな構成をしているのでしょうか?
繰り返し文の基本的な構成は↓のようになっています。

  • 初期化
  • 終了判定
  • 処理
  • 更新

繰り返し文の書き方が言語によって異なっていることもありますが、この基本的な構成は変わりません。
疑似コードで表現すると各構成は↓のように配置されます。

for (初期化; 終了判定; 更新) {
    処理
}

まず初期化について見てみましょう。

繰り返し文の初期化

繰り返し文の中で最初に実行されるのが、この繰り返し文の初期化です。
繰り返し文の初期化では、繰り返し文で使う変数などのデータを初期化します。

「これから処理を繰り返すぞ!」というときに「その前に初期化だけさせてね」というのが繰り返し文の初期化です。

「初期化」というと難しい言葉に聞こえますが、言い換えればただの「リセット」と同じです。
繰り返し文で使うデータをリセットして、最初から繰り返せるように準備しているのです。

たとえば先ほどの疑似コードでは↓の「初期化」の部分が最初に実行されます。

for (初期化 ← ここ; 終了判定; 更新) {
    処理
}

初期化は繰り返し文が開始される最初の時だけ実行されるので、それ以降は実行されることはありません。
つまり、初期化が実行されるのは繰り返し文では必ず1回だけとなります。

繰り返し文の終了判定

初期化の次と、処理が1回終わるごとに実行されるのが繰り返し文の終了判定です。
終了判定の所にはループが継続する条件を書きます。
この終了判定は一言で言ってしまうと、つまり↓のような意味です。

人生続けますか? それともやめますか?

すみません、間違えました。↓のような意味になります。

「ループ続けますか? それともやめますか?」

繰り返し文の終了判定のところに来ると、条件文などで判定され、値が偽(false)だとループが終了し、値が真(true)だとループが継続します。

先ほどの疑似コードを見てみましょう。

for (初期化; 終了判定 ← ここ; 更新) {
    処理
}

繰り返し文が呼ばれると最初に「初期化」に移り、その次に「終了判定」に移ります。
この終了判定で条件が偽ならループが終了し、真なら「処理」に移ります。
「処理」が終わると今度は「更新」に移り、そのあとに再び「終了判定」に移ります。

  • 初期化
  • 終了判定
  • 処理
  • 更新
  • 終了判定
  • 処理
  • ...

つまり、終了判定は「ループを終了させるかおうかがいを立てる」役割なんですね。
なので合間合間に呼ばれます。

終了してもよろしいですか?

だめです

ひぇ・・・

繰り返し文の処理

繰り返し文で実際に繰り返して実行されるのが繰り返し文の処理です。

for (初期化; 終了判定; 更新) {
    処理 ← ここ
}

ここはループが終了しなければ延々と実行されます。
終了しないというのは、つまり終了判定が偽にならないということですね。
先ほどの蔵書プログラムを見てみましょう。

for (i = 0; i < 蔵書数; i++) {
    ページ数合計 += 蔵書i.ページ数
}

↑の例ではカウント変数i蔵書数より低い間、ループが終了しません。
ループが終了しない間、「ページ数合計 += 蔵書i.ページ数」という処理が繰り返し実行されます。

この処理にはもちろん複数行書くことも出来ます。例えば↓のようにです。

for (i = 0; i < 蔵書数; i++) {
    ページ数合計 += 蔵書i.ページ数
    読んだ回数合計 += 蔵書i.読んだ回数
    値段合計 += 蔵書i.値段
}

繰り返し文の更新

繰り返し文の処理の後に実行されるのが繰り返し文の更新です。

for (初期化; 終了判定; 更新 ← ここ) {
    処理
}

この更新は、処理が最後まで完了した後に実行されます。

for (初期化; 終了判定; 更新 ← ここに移る) {
    処理
    処理
    処理 ← これが終了した後に
}

先ほどの蔵書プログラムを見てみましょう。

for (i = 0; i < 蔵書数; i++) {
    ページ数合計 += 蔵書i.ページ数
}

ページ数合計 += 蔵書i.ページ数」という処理が完了したらi++という処理が実行されます。
これによってカウント変数i1増加します。
更新が実行されると再び終了判定に移り、ループを継続するか判定されます。

  • 初期化
  • 終了判定
  • 処理
  • 更新 ← ここ
  • 終了判定
  • 処理
  • 更新 ← ここ
  • 終了判定

カウント変数iは更新で1増加していますので、終了判定で参照されるi1増加しています。
このように更新が実行されたあとは、終了判定に使われる変数などが更新されている場合が多いです。

色んなコードの実例

ここで実際に存在するプログラミング言語の繰り返し文を見てみましょう。

C

C言語は古くからある言語なので、繰り返し文の原型のようなfor文を持っています。
今回の解説で馴染みのある形ですね。

for (int i = 0; i < 10; i++) {
    printf("カウント変数は%dです\n", i);
}

JavaScript

JavaScriptのfor文も同じ形をしています。

for (let i = 0; i < 10; i++) {
    console.log(`カウント変数は${i}です`)
}

Python

Pythonは変わった形のfor文になりますが、基本的な考えは今回解説した内容と同じです。

for i in range(10):
    print(f'カウント変数は{i}です')

おわりに

いかがでしたでしょうか。
繰り返し文の基本的な考え方は各言語で共通しているので、一度覚えてしまえばほかの言語でも融通が利きます。
これを機会に覚えてしまってもいいかもしれません。

繰り返しの日常の中の小さな幸せ

おしまい

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク