PHP講座#12

今回の記事もPHP講座です!いつも通り手を動かしながら勉強していきましょう。

前回の復習

 前回はfor文について学びました。for文の基本形を覚えたり、処理の順番を確認したりでいっぱいいっぱいだった人もいるかと思います。^^;
 初学者がつまづきやすい項目の1つなので理解しづらい部分ではありますが、これから何度も登場する構文なので、たくさん書いて慣れていきましょう!

前回の練習問題の解答

1問目

12, 14, 13, 65, 173, 21, 16, 11, 12, 14, 64, 90, 17, 4, 103, 192
 上記の値を持つ配列を作成し、sort関数を用いて並べ替えて、配列の各要素を出力するプログラムを書いてください。



解答

<?php
define("NUMBER_OF_VALUES", 16);
$number = array(12, 14, 13, 65, 173, 21, 16, 11, 12, 14, 64, 90, 17, 4, 103, 192);
sort($number);
for($i = 0; $i < NUMBER_OF_VALUES; $i++) {
  echo $number[$i] . "<br>";
}
?>

2問目

 半径が1, 2, 3, 4のそれぞれの場合について、球の表面積を求めてください。ただし円周率は3.1415とする。

表面積の求め方
(表面積) = 4 * (半径) * (半径) * (円周率)



解答

<?php
define("PI", 3.1415);
for($radius = 1; $radius <= 4; $radius++) {
  $area = 4 * $radius * $radius * PI;
  echo $area . "<br>";
}
?>

3問目

 100以下の自然数の和を求めてください。



解答

<?php
$sum = 0;
for($number = 1; $number <= 100; $number++) {
  $sum += $number;
}
echo $sum . "<br>";
?>

4問目(ちょい難)

 100以下の素数の個数を求めてください。



解答

<?php
$count = 0;
$value = array_fill(2, 100, 0);
for($number = 2; $number * $number <= 100; $number++) {
  if($value[$number] == 0) {
    $temp = 0;
    $count++;
    for($temp = $number; $temp <= 100; $ temp += $number) {
      $value[$temp] = 1;
    }
  }
}
echo $count . "<br>";
?>

今回の学習内容

 今回からは繰り返し構文の入れ子構造について学んでいきます。
 
 前回学んだfor文というのは繰り返し処理を行うものでしたよね。ある処理を繰り返し実行することができるんでしたよね。
 そこで、今回は繰り返し処理の部分(ある処理の部分)に繰り返し処理を書いたソースコードを紹介していきます。

 for文の構文の復習を兼ねて次のソースコードを見ていきましょう。

<?php
for($i = 1; $i <= 9; $i++) {
  echo $i * 1 . " ";
  echo $i * 2 . " ";
  echo $i * 3 . " ";
  echo $i * 4 . " ";
  echo $i * 5 . " ";
  echo $i * 6 . " ";
  echo $i * 7 . " ";
  echo $i * 8 . " ";
  echo $i * 9 . " ";
  echo "<br>";
}
?>

 このソースコードは九九の表を作成しています。
 for文の( ) *1の中の条件式部分が成り立っている限り、{ }*2の中の処理が実行されます。

 しかし、このコードをよく見てみるとなんだか、for文の{ }の中の処理が似たような処理になっていますよね? このだらだら書いてある部分をうまくひとまとめにして扱えないかと考えてみると次のようにかけることがわかると思います。

for($number = 1; $number <= 9; $number++) {
 $i * $number . " ";
}
echo "<br>";
 中身の部分は変数$iに、1~9の整数をかけて計算したものを表示する処理をしていたので、for文で処理をまとめました。前回の記事で出てきたソースコードに似ているので、この部分が理解できない人は第11回目の記事を横に並べて確認してみてください。

 改良したソースコードはこのようになります。

<?php
for($i = 1; $i <= 9; $i++) {
  for($j = 1; $j <= 9; $j++) {
    echo $i * $j . " ";
  }
  echo "<br>";
}
?>

 for文の{ }の中にfor文が入っています。これが入れ子構造です。
 入れ子構造は既出の知識だけで書けますが、初学者の人でこれを自力でコーディング出来る人はあまりいないと思うのでひとつの記事にして扱いました。普段はこの入れ子構造のことをfor文の中にfor文が入っていることから、二重ループと呼ばれることが多いです。自分一人で勉強する際は他人と意思疎通を図ることが少ないので言葉より構文の方が大切になってきますが、チームで開発をおこなったり、他の記事・文献を読み理解したりする際にはどうしても言葉(専門単語)を知らないとコミュニケーションが取れなくなってしまうので、余裕がある人は、言葉にも気を配ってみてくださいね!

まとめ

 今回は、入れ子構造のfor文について学びました。for文の中にfor文が入っていると考えると厄介に感じるかもしれませんが、for文の中で実行するある処理がたまたまfor文で書かれていた(書けるものだった)と考えると、『なんだ普通のfor文の応用か』ぐらいの気持ちで乗り越えられます!
 このfor文の使い方をマスター出来れば、時間と根気と最強のパズル脳があれば、理論上どんなプログラムでもかけるようになります!←こう言われると夢が膨らみませんか?

練習問題

1問目

1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11 12 13
5 6 7 8 9 10 11 12 13 14
6 7 8 9 10 11 12 13 14 15
7 8 9 10 11 12 13 14 15 16
8 9 10 11 12 13 14 15 16 17
9 10 11 12 13 14 15 16 17 18
10 11 12 13 14 15 16 17 18 19
 上記のように表示するプログラムを本記事中のソースコードを参考にしながら書いてください。

2問目

 x-y平面上に3つの点を取り三角形を作ります。一つの点を原点にし、残りの2つの点を0≦x≦10かつ0≦y≦10の範囲内に取ります。また点のx座標とy座標は整数値であるとします。この時、面積が13となる三角形が作れるかどうかを判定するプログラムを作成してください。

原点と2つの点からなる三角形の面積Sの求め方は、2つの点の座標を(a, b)と(c, d)とすると
S = 1/2 |ad - bc|
で求められる。(プログラムにコピペできる形式で書いていないので注意!)


最後まで見ていただきありがとうございます。また別の記事でお会いできることを祈っております。



www.iwachoco-blog.com


*1:丸い括弧

*2:波括弧