スポンサーサイト

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

C言語で階乗計算をする。

先日はC言語で素数検出のプログラムを組みましたが、今回はもっと簡単な
階乗計算をさせてみようというのです。




関数の再帰的呼び出しでもやってみましたが、先に繰り返し構文から提示します。

C言語で階乗計算(1!?10!)(繰り返し構文による)



簡単な解説です。
4?10行目のfor構文は、『1!?10!』まで処理するためのループです。

6?8行目のfor構文は、階乗計算の処理そのものです。
変数numに元々入っている数値とiを掛け算する「乗算代入演算子」を使います。





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

 [2010.06.18追記]:以下に示す関数には欠点がありました。
(厳密には、"階乗の定義"に従っていないということ。)
詳しくは訂正版(コチラ)をご用意しましたので、よろしければご参照ください。^^;

C言語で階乗計算(1!?10!)(関数の再帰的呼び出し)



解説です。
まず、階乗計算を行う関数「fact()」を定義します。(階乗【factorial】に由来。)
引数が1なら1を返しますが、それ以外なら、『引数×fact(引数?1)』を評価します。
fact関数の中でfact関数を呼び出しています。関数内で自分自身を呼び出すことを
関数の再帰的呼び出しというようですね。
これを実行すると、最初に呼び出した関数の返り値が計算結果となるのです。
(説明があいまいでごめんなさい・・・^^;)

あとは、そのfact関数を使って階乗を求めていく・・・という形になっています。



PHPという言語でも求めてみましたのでコチラも参考に・・・。


 ※修正[2011.01.24]:main()関数の戻り値を設定しました。ご指摘に感謝します!! 
スポンサーサイト
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : C言語 /  ジャンル : コンピュータ

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やPerlでは「$num = 50;」、C言語やJavaScriptでは「num = 50;」とすると、
numという変数に50という数値を代入するということになりますよね。



今回は、この「=」ではなく、『○○代入演算子』というものについて記そうと思います。


プログラミングをやっていると、たまに次のような構文を目にすることがあります。
   【PHP・Perlで】→→ $num = $num + 50;
   【C・JavaScriptで】→ num = num + 50;

元々変数numに入っていた数値に50を加算するというものです。
しかし、変数numを2回も記述するのは面倒ですよね。そんなときは・・・
   【PHP・Perlで】→→ $num += 50;
   【C・JavaScriptで】→ num += 50;
・・・と記述しても同じ意味なのです。
この、「+=」のことを加算代入演算子と言います。


同じく、『$num = $num - 50;』を、『$num -= 50;』と書いたり(減算代入演算子)、
『$num = $num * 50;』を、『$num *-= 50;』と書いたり(乗算代入演算子)、
『$num = $num / 50;』を、『$num /= 50;』と書いたり(除算代入演算子)、
『$num = $num % 50;』を、『$num %= 50;』と書いたり(剰余代入演算子)・・・

どの場合でも簡略化して記すことができます。

ちなみに、ビット系の演算子でもこれらと同様の記述が可能なようです。
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

古本屋で購入したパソコン関連書

ここ最近、古本屋でパソコン関連書を見て回るのが好きです。

安くで自分の欲しいのがあれば最高じゃないですか(笑)

そんな発想で購入した本を紹介したいと思います。


ひとりでできるJAVA実践入門
ひとりでできるJAVA実践入門

正直、JAVAなんでやったことないですし、全然読んで理解できる気がしませんが、
いずれは勉強するだろうと思い購入。 果たして、将来役に立つのだろうか・・・
(¥105)



Cの絵本
Cの絵本

人に聞く話によれば、結構良いらしい・・・
丁寧に絵ばかりで解説が入っていて、良さそうだったので購入。(¥400)



真図解 基本情報技術者 2006春
真図解 基本情報技術者 2006春

分厚さの割に値段が安かったのでつい手を出してしまいました。
まぁ、近いうちに「基本情報技術者」の資格試験自体なくなるとかで意味ないですが(汗)
(¥105)



みなさんも古本屋にレッツゴ?!(^-^;)
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→
カテゴリー
ようこそ!
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。