- 2007-06-17 日 18:27:00
- プログラミング
コンピュータの最も得意とする処理がこの繰り返し。
繰り返し処理のことをプログラミング用語で「ループ」といいます。
「無限ループ」なんて言葉もありますが、
ループを終了する処理が不完全だった為に
終わりの無い繰り返し処理に入ってしまった状態のことです。
プログラミングで「絶対やってはいけない2つ事」のうちのひとつです。
PHPならタイムアウトになったところで強制終了され
残りの処理が完了しなかった程度で済みますが
Cだとコンピュータが永遠に固まった状態になります。
そうならない為にループでは、
繰り返しを行う条件(=繰り返しを終える条件)を
しっかり念頭に置いてプログラミングしましょう。
お題
1から50まで、数をひとつずつ増やしながら足し算を行い、合計を求める。
1 + 2 + 3 + 4 + ・・・・+ 49 + 50 さて幾つ?というやつです。
1から50までならば計算式を書いてもたいしたことないけど
これが10000までだった場合は苦痛でしょう。
単純な繰り返しこそコンピュータにうってつけの処理です。
さて、このお題を要素に分解してみますと、
1から50まで1つずつ増えていく「数」、それと
足し算の結果の「合計」が存在します。
繰り返しの間、「合計」に「数」を加算してゆけば、最終的に「合計」が得られそうです。
繰り返しの条件は、「数」が50 以下であるか否かで判断できます。
ではこれを for文 を使い、日本語まじりのコードで下書きしてみます。
合計 = 0; for ( 数 = 1; 数 <= 50; 数 = 数 + 1 ) { 合計 = 合計 + 数; }
はじめ合計は、何も足されて無い状態なので 0 で初期化しておきます。
次のfor
がループの始まりの印。
括弧の中は置いといて、大括弧{}
中の式が繰り返す実行文です。
合計と数を足した値を新たな合計としています。
さて括弧の中ですが、
;
でもって3つの式に分けられていてそれぞれ役割が決まっています。
左側の式は、ループに入る前に行う前処理です。
前処理が行われるのははじめの1回だけで、
ここでは、数が1から始まるので、数を1で初期化しています。
真ん中の式は、ループを実行するか否かを判断する条件式で、
成立していれば、大括弧の中の処理を実行し、
成立しなければ、ループを終了します。
ここでは数が50以下の間、繰り返したいので 数 <= 50 としています。
右側の式は、大括弧{}の中を実行後に行う後処理です。
ここでは、数をひとつずつ増やすために、数に1を足した値を、新しい数にしています。
後処理の後は、再び条件式に戻り
条件が成立している間、繰りかえされます。
繰り返されるたびに数がひとつずつ増えていき
51 なったところで 数 <= 50 が成立しなくなるので、
合計に51が加算されることなくループは終了します。
これで最終的な合計が得られます。
for文の基本的な書き方
for ( 前処理; 条件式; 後処理 ) { 実行文; }
for文の処理の流れ
for ⇒ 前処理
⇒ 条件式
⇒ 実行文
⇒ 後処理
← ココが繰り返される
条件式・実行文・後処理の繰り返しの中で
いずれ条件が成立しなくなるよう組み立ててあれば
無限ループにはなりません。
では、下書きをちゃんと動くPHPのコードに直しましょう。
<?php // 合計を0で初期化 $total = 0; for ( $num = 1; $num <= 50; $num = $num + 1) { // 合計に数を合算 $total = $total + $num; // 途中経過がわかるよう足した数と現時点の合計を表示 echo '+', $num, ' = ', $total, '<br>'; } // 最終の合計表示 echo '合計 ', $total; ?>
書けたら、考えてた通りに動くか確かめよう。
コンピュータは、書いてある通りには動くけど、
考えた通りに書いてあるか確かめる能力は無いので
そこは人力で。
* * *
今日のfor文では真新しいものは出てこなかったけど
計算式で便利な書き方をご紹介。
後処理に使った式、 $num = $num + 1
「$num と 1 の合計を、$num に、代入する」ってことですが
「$num を1つ増やす」という書き方もあります。
$num++
;
変数に対して1を加算する場合は、
こんな風に変数の後ろにプラスを2つ続けて書くだけでOK。インクリメントと呼ばれます。
反対に「$num を1つ減らす」にはマイナスを2つ続けて書きます。
こちらはデクリメントと呼ばれます。
$num--
;
実行文につかった式、$total = $total + $num; にも、別の書き方があります。
「$total に $num を加算する」って場合ね。
$total += $num;
;
勿論減算もあります。
$total -= $num;
;
さて最後になりましたが、
プログラミングで「絶対やってはいけない2つ事」のうち
もうひとつは、 「ゼロ除算」です。
どんな数でも 0(ゼロ)で割った結果は無限大です。
これをコンピュータにやらせると、
いつまでも結果の出ない割り算を永遠やり続けることになります。
大抵の言語で強制終了するような仕様になっています。
次もループ ⇒ while 執筆中
- 新しい: 読みやすい変数ダンプ var_export
- 古い: またまた処理を分岐する switch