スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

PHP練習問題集(PreAlphaVersion)


PHP練習問題集(PreAlphaVersion)

ここでは、PHP(:Hypertext Preprocessor)の練習問題を放置しています。
(※基礎的な問題は、コチラです。)
問題自体はあっても解答が無いことがありますが、許してください。(^ ^;)


◆◇ 練習編
 ■ 偶数・奇数の数列表示
 ■ 素数の数列表示
 ■ ある数の素因数分解
 ■ FizzBuzz問題 (3の倍数と5の倍数がどうのこうの)
 ■ 階乗計算

◆◇ 実践編
 ■ おみくじを作ってみよう。
 ■ 訪問時の時刻を表示してみよう。






詳しい説明としては「基礎問題集」の記事の下部に記載してある通りです。
私自身もド素人ですから、間違いがあると思います。

多少の参考になれば嬉しいなぁ・・・
・・・などと思いながら更新していますので、内容はあまり当てにしないでください。(汗)


あと、「所要時間」というものを記載していますが、あくまで目安だと思ってください。
それより早かろうが遅かろうが気にしなくても大丈夫だと思います。

どうぞごゆっくり?。m(_ _;)m
スポンサーサイト
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : PHP /  ジャンル : コンピュータ

PHP練習[5]:階乗計算


PHP練習問題[5]:階乗計算

 問題: 1?10までの階乗計算の結果を表示してください。
     (※階乗に関しては下で説明。)
(所要時間 10?20分)


 『階乗』とは何でしょうか。(知っているなら読み飛ばしてレッツ・トライ!)



とりあえず、例を示してみます。

5の階乗」と言われた場合は、次のような式を計算するのです。
   5! = 5 × 4 × 3 × 2 × 1 = 120

いきなり「!」という記号が出てきて混乱されるかもわかりませんが、
これが階乗を表す記号です。「5!」で『5の階乗』を意味します。

『ある数nの階乗』とは、
   n × (n-1) × (n-2) × ・・・ × 3 × 2 × 1
というようなものを意味します。
 要するに、ある数nから1まで、自然数を順番にかけ算をしていくものです。

これをPHPプログラムで計算してしまおうというのです。


というわけで、「1の階乗」から「10の階乗」までの結果を表示してください。



 [2010.06.18追記]:以下に示す解答には欠点がありました。
(厳密には、"階乗の定義"に従っていないということ。)
C言語版ではありますが、訂正版(コチラ)をご用意しました。
C言語とPHPは文法が非常に似ているので、一度ご覧いただければ幸いです。^^;








解答例・解説


 これには、「関数の再帰的呼び出し」というものも使えますが、
直感的に繰り返し構文でやったって構いません。


早速、解答例です。



まず、繰り返し構文を使ったものです。

3?9行目のfor構文は、「1?10」の階乗を処理するためのものです。
4行目で$numを1で初期化します。
5?7行目で、階乗を計算しています。
例えば、$cntに5が入っていた場合、$iにも5が代入されますよね。
その次に、$numと3を掛け算し、その結果を再度$numに代入しています。
その後、$iをデクリメント(1を引くこと)し、更に、$numに掛けて代入しています。
それを、$iが1になるまで処理します。
そうすると最終的に、5×4×3×2×1の結果『120』が$numに代入されます。


(※乗算代入演算子『*=』を使っていますが、意味は コチラ をご覧ください。)




続いて、関数の再帰的呼び出しを利用したものです。



この、関数の再帰的呼び出しに関しては簡単な説明だけにさせてもらいます。
だって、説明が難しいんですもん・・・(汗)



3?10行目で、新しい関数『fact( )』というものを定義しています。
これは、階乗計算の結果を戻り値(返り値)とする関数です。

(ちなみに、「fact」というのは階乗【factorial】に由来するものです。)

fact( )関数は、『引数×fact(引数?1)』を処理します。
『あれっ、fact関数内で更にfact関数を呼び出してるじゃん!』
と気付いたかもしれません。これが、関数の再帰的呼び出しなのです。
関数の中で、再度自分自身を呼び出すことをいうようです。

例えば、引数が5だったなら・・・
 fact( 5 );
=5 * fact( 4 );
=5 * ( 4 * fact( 3 ) );
=5 * ( 4 * ( 3 * fact( 2 ) ) );
=5 * ( 4 * ( 3 * ( 2 * fact( 1 ) ) ) );
=5 * ( 4 * ( 3 * ( 2 * 1 ) ) );
=120
こうやって、「120」を返すのです。

とりあえずそれを処理していくと最終的に、fact(1)を呼び出すことになりますね。
引数が1の場合は1を返すだけなので、そこで再帰的呼び出しは終わります。

あとは、元々呼び出していた関数に復帰して(戻って)いって・・・
最終的に、一番はじめに呼び出したfact関数が、階乗の結果を返すことになります。


そして11?13行目で、そのfact関数を使って「1?10までの階乗計算」を
行うのです。











関数の再帰的呼び出しは、ややこしいですが、デバッグするとよくわかります。

(今度、自分なりのデバッグ方法も紹介しようかな・・・(←独り言。))


やはり、説明が下手くそですが、こんなもんで許してください。



PHP練習問題集目次へ
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : PHP /  ジャンル : コンピュータ

PHP練習[4]:FizzBuzz問題


PHP練習問題[4]:FizzBuzz問題

 問題: 1?100までの整数を表示してください。
     ただし、3の倍数の時は「Fizz」、5の倍数の時は「Buzz」と
     表示してください。(公倍数なら「FizzBuzz」と表示すること)
(所要時間 10?20分)


 プログラミングの問題としては、あちこちで見かける「FizzBuzz問題」。

一度知ってしまえば『なんだ、そんなことかぁ』ってなるんですが、
知らないと、『えっ、どうやって求めるの・・・?』となる可能性は十分あります。

まぁ当サイトのPHP練習問題[1]とか[2]、[3]をやっていたら出来ると思いますが…


さぁて、どれくらいの時間で出来るでしょうか?






解答例・解説


 この問題で重要なキーとなるのは、やはり「剰余演算子」でしょうか。
(※剰余演算子についてはコチラをご覧ください。)


『3の倍数』の性質として、「3で割り切れる」というものがあります。
言い換えれば、「3で割ったときの余りは0である」ということです。
では、『5の倍数』は・・・  そう、「5で割り切れる」んです。
その性質を利用して処理していくのが一般的かと思われます。

では、下をご覧ください。



解説です。

1行目のfor構文は、数値の1?100を処理するための繰り返し構文です。
3?5行目のif構文は「3で割り切れたらFizzと表示する」ということです。
6?8行目のは、「5で割り切れたらBuzzと表示する」という意味です。

9?11行目は、「3でも5でも割り切れなかったら、数値自体を表示する」わけです。
ここで、条件式に注目します。
  『 ($cnt % 3) && ($cnt % 3) 』
こんなふうになっていますね。
3行目と5行目の条件式では「===」という比較演算子を使用していますが、
9行目の条件式では、これを使っていません。 条件式を直訳すると、
  『$cntを3で割ったときの余り かつ $cntを5で割ったときの余り』
ですね・・・。  こんなのは条件式とは言いづらいですよね、でも、条件式なのです。
まず、if構文では、条件式がTrueに準ずる値なら{}内を実行するんですよね?
Trueに準ずる値」って何でしょう。
もちろん真偽(論理型)のTrueのことですよね。 でも、それだけでは無いんです。
例えば、数値の1でも・・・ 何らかの文字列でも・・・  Trueと評価するんです。


   『えっ、何言ってんの? ワケワカラン・・・』

と思っても、今は「こういうものだ」と思ってください。
どうしても気になるなら、コチラをご覧ください。自信ないですけど・・・(汗)

とりあえずこの条件式の意味をわかりやすく言えば、
  『$cntが、3でも5でも割り切れなかったら』
ということなんです。


あとは、12行目で改行を挿入して繰り返す?・・・



もっと効率的なものがあると思いますが、私はバカなのでこれで勘弁してください(汗)




PHP練習問題集目次へ
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : PHP /  ジャンル : コンピュータ

PHP練習[3]:素因数分解(ある数の素因数の数列表示)


PHP練習問題[3]:素因数分解(ある数の素因数の数列表示)

 問題: 変数$int に「2600」を代入し、
      それを素因数分解して結果を表示してください。
(所要時間 20?30分)


素因数分解とは、ある正の整数を素数の積で表現することですよね?(多分…)
(※「正の整数」→1、2、3、4、5、6、7… こんな数列。0は入れない。)

例えば、「126 = 2 × 3 × 3 × 7」です。
今回は、この素因数の数列(例では、「2 3 3 7」)を表示しなければなりません。

例外処理として、「1」を素因数分解するときは、「1」と表示するようにしてください。
まぁ、$intに2600を代入している時点であり得ませんが…
(参考:Wikipedia「素因数分解」)






解答例・解説


解答例です。↓ (もちろん、これ以外の方法でも良いですよ^^)


解説です。↓
3行目で$intに「2600」を代入しています。
5行目のif構文は、指定された数値が正当かどうか判別します。
0以下、または浮動小数点数ならTrueを返し、警告文を表示します。
それ以外の場合は正常な数値として、素因数分解の処理に入ります。

9行目にfor構文が入りますが、実行式を省略しています。(理由は色々・・・)
とりあえず、$iを「2」で初期化しています。これは、『素因数は必ず2以上』だからです。
そして、条件式は「true」なので、構文内でbreakでもしない限り無限ループです。

10行目の条件式は『$int は、$i で割り切れるか否か』という意味です。
$intが$iで割り切れる場合は、そのブロック({}で囲まれた部分)内を処理します。
なので $i を表示して、$int には$int÷$iを代入します。

 『えっ、$intに$int÷$iを入れるって・・・   なんで?』 って思うかもしれませんね。

最初は「2600」を2で割り切れるか判断し、割り切れるようなので「2 」と表示します。
次に、そのまま処理すると、また『2600は2で割り切れるか』を調べることになり、
事実上、処理が進行しません。 ず?っと同じ処理をしながら無限ループです。

なので、割り切れるなら割ってしまって、その数値を次の処理に使いたいのです。
「2600は2で割り切れた」→「1300は2で割り切れた」→「650は2で・・・」・・・・
こういう風に処理することになります。


話を戻します。
10行目の条件式がFalseを返したら、次のelseの中を処理します。
なので、$i に1を足します。 そうすると、どうなるか・・・
次のループで『3で割り切れるか否か』を判断します。
割り切れたなら、3は素因数なので、画面に表示します。
割り切れなかったら、また$iに1を足して、次は『4で割り切れるか』を判断します。

こうやって処理していって、最終的に$intと$iが同じ数字になります。
(※$intは割られ続け、$iは増え続け、最終段階で同値になるはず・・・)
または、指定された値が「1」だった場合は、$intより$iの方が大きいですよね。
これらの場合は、16行目のif構文に入ります。

入るとすぐ、『$intが1かどうか』を判断します。「1」なら「1 」と表示してbreak。
「1」ではなく、$iと同じ数値だったら$iを表示してbreak。
それ以外の場合もbreak。(こんな場合があるのかな・・・?)

そして、ようやく処理が終了を迎えます。




いやぁ、長い・・・   説明文が長すぎる・・・。
もっと日本語を上手く使いたいなと思いつつ、なんの努力もしていない今日この頃…。

最後までお付き合いいただきありがとうございました。


さて、この処理がなんの役に立つんでしょうか… (それは考えてはいけませんよ^^;)



PHP練習問題集目次へ
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : PHP /  ジャンル : コンピュータ

PHP練習[2]:素数の数列表示


PHP練習問題[2]:素数の数列表示

 問題: 1?100までの範囲で、素数の数列を表示してください。
(所要時間 20?30分以内)


この問題は、人によっていろんなやり方があると思いますが実際はどうでしょう。



素数とは、『2,3,5,7,11…』という様なもので、
「1」や、それ自体の数でしか割りきれない(「2」以上の)数のことです。
(なので、実質は「2?100」の範囲での素数・・・ ってことですね。)


今回は、私のように無理矢理やってしまうのも手ですが、
6桁以上になるとかなり処理速度が落ちます・・・
(テストで1?100000までを処理すると数十秒かかりました。 ちなみに結果は、
2、3、5、7、・・・(中略)・・・、99923、99929、99961、99971、99989、99991
となりました。ホントに素数かどうかの保証もありませんが(汗))



参考としては、「エラトステネスの篩【ふるい】」のアルゴリズムを利用すれば、
効率的に出来るかもしれませんけど・・・  自信ないです。(笑?)

私は単純に「しらみつぶし」方式(仮)でやりましたよ(苦笑^^;)
下で示す解答例は、こちらの「しらみつぶし」方式(仮)です。
いずれ、「エラトステネスの篩」方式でやってみたいですが・・・  できるか不安…(- -;)







解答例・解説


どれくらいの時間がかかりましたか? ちなみに私は20分ちょっとかかりました。(汗)
下に解答例を示しますが、もちろんこれ以外の方法もOKですよ?。



解説にいってみましょっ。

まず、剰余演算子について理解してください。詳しくはコチラをご覧くだされ・・・


3?6行目は、記載の通り「2?100の数値が入っている配列変数」を作ります。
一応、解説すると・・・
3行目で、念のために配列変数を定義・初期化しています。
そしてfor構文内で、配列変数$aryに数値を代入していきます。
その値は、要素番号(キー)に2を足したものです。なので、初項は「2」です。
そして、$cntAに2を足した数値が100を超えた時点でループ脱出です。


いよいよ「素数の表示」です。
先ほど定義した2?100までの数列(配列)を、foreachで1要素ずつ取り出します。
$checkは、ここでは無視してください。
11?16行目のfor構文で、処理中の数値が素数かどうか判断しています。
例えば処理中の数値が「5」なら、2→3→4の順で割り切れるかどうか調べます。
このうち一つでも割り切れれば、if構文内を処理し、$checkに「1」を代入した上、
for構文を脱出します。(1つでも割りきれる数値があれば素数ではないから。)
どの数値でも割りきれなければ処理中の数値は素数です。

結果的に、処理中の数値が素数なら$checkは「0」、素数でなければ「1」が入ります。
よって、$checkが「0」の場合に、その数値を出力します。



おわかり頂けたでしょうか・・・
まぁこんな説明でわかる人はそうそう居ないと思いますが(汗)




もし、これらの日本語が理解できたなら、あなたは相当の力がありますよ。
どんな下手な文も読み解く国語教師が向いてるんじゃないでしょうか(笑)




冗談はさておき、最後までご覧くださってありがとうございました。
わからないことがあれば気軽に質問してください。
答えられるかどうかはわかりませんけど・・・(汗)



PHP練習問題集目次へ
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : PHP /  ジャンル : コンピュータ

カテゴリー
ようこそ!
Author: Torasuke
Profile: 地元大学の情報系学部に息をひそめる二回生。
   SA SW


ブログ内検索
最近のコメント
オススメ
京都の大学生のラボブログ
Python,Java,Objective-C,GAE,Macなど
Python独習中の大学生のブログ


ltzz.info
ここの管理者さんには謁見済み!(えっ

 Use OpenOffice.org
無補償でも良いなら、MSOfficeよりOpenOfficeで十分です。

Mozilla Firefox ブラウザ無料ダウンロード
当サイトは、Firefoxというブラウザで動作確認しています。私は以前、IE派でしたが、一度乗り換えて慣れてしまうと、Firefoxのほうが便利だということを実感しました。

是非よろしくお願いします。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。