whileを用いて、同じ操作をを繰り返し行うことができます。構文は上の通りです。 { }で囲まれた部分をブロックといいます。 これは次のような繰り返しを行います:まずAの部分の真偽値を調べます。 もし「偽False」であればこの繰り返しを終了し、次に進みます。 もし「真True」であれば続くブロックを実行し、再度 Aの真偽値を調べ、同じことを繰り返します。 つまりAの部分が真である間中ずっとBを繰り返し実行するわけです (While A is true, do B )。ここで「真偽値」ということばが出てきました。前回にも簡単に説明しましたが、 以下のものは「偽False」です:
このほかは「真True」です。特に数値1は最も代表的な「真」の値です。 例えばprint関数は出力に成功した場合、戻り値1を返します。
- 数値 0
- 空文字列''
- 空リスト()
- 未定義値
さて、次のようなスクリプトを作りnm006.plという名前で保存してください。
1: $sum = 0; 2: $i = 1; 3: 4: while($i <= 10000) { 5: $sum = $sum + $i; 6: $i++; 7: } 8: 9: print "1 + 2 + ... + 10000 = $sum\n";ここでは2つのスカラー変数 $sum と $i が使われています。 「=」は上でも出てきた代入演算子です。 1行目では$sumという変数に0という数値が代入されています。 2行目では$iという変数に1という数値が代入されています。 4行目のかっこの中に「<=」 という記号がありますが、これは比較演算子のひとつで 「左辺≦右辺」が成り立つとき真の値をとります。 ですからこのwhile文は$iの値が10000以下である間、続くブロックを 実行しつづけます。
まず1回目では$iの値が1で、10000以下ですから、 5行目が実行されます。右辺は0+1で1になりますが、その値が$sumに 代入されます。続いて6行目が実行されます。 「++」はインクリメント演算子で、 値を1だけ増やします。この場合は$iの値が1から2に増えます。
2回目には$iの値が2でやはり10000以下ですから、ブロックが実行され、 $sum に2が加えられ、$iが3になります。
これを繰り返してk回目(k ≦10000)の繰り返しが終わった段階で、 $sum の値は 1+2+...+k、 $i の値は k+1 になっています。
10000回目の繰り返しが終わったとき$iの値が10001になり、 条件式がみたされなくなり、繰り返しが終了します。したがって 最終的な$sumの値は1から10000までの自然数の総和となります。 なお、前の例でも述べましたが、 2重引用符号で囲まれた文字列の中の変数はその値で置き換えられます (1重引用符号で囲まれている場合はそのままの文字列となります)。 実際にこのスクリプトを実行してみてください。
作業:
各自の学籍番号の下4桁を n とします。 例えば M04123 なら n = 4123 です。
和 12 + 22 + 32 + ... + n2 を計算するスクリプトnm007.plを作り そのスクリプトと実行結果を自分のホームページに載せましょう。
期限は、11月25日(木)午後5時とします。
おまけ:無限ループ
次のようなスクリプトはどういう動作をするか予想してみてください:
1: while(1){ print "私は数学が好きだ。\n"; }実際に実行してみればわかりますが、永遠に同じ文字列を出力しつづけます。 というのは( )の中の値が常に1で「真」であるため、これに 続くブロックが無限に繰り返されてしまうのです(無限ループ)。 うっかり実行してしまった人はCTRL+Cで終了させてください。