<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="../../../../../css/rss/feedRss2.xsl" media="screen" type="text/xsl"?>

<rss version="2.0"> 
  <channel> 
    <title>テン＊シー＊シー</title>  
    <link>http://ameblo.jp/xcc/</link>  
    <description>　</description>  
    <language>ja</language>  
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="self" href="http://feedblog.ameba.jp/rss/ameblo/xcc/rss20.xml" type="application/rss+xml"/>  
    <item> 
      <title>ブートキャンプ（8）文字列の加工 1/2</title>  
      <description><![CDATA[<p>
 <div class="c_g"><strong>ブートキャンプ目次</strong><br /><a href="http://ameblo.jp/xcc/entry-11082999260.html" target="_blank">（1）iPhone/iPadアプリケーションを作るには？</a><br />　　<a href="http://ameblo.jp/xcc/entry-11084017360.html" target="_blank">→無料開発者登録</a><br /><a href="http://ameblo.jp/xcc/entry-11126502451.html" target="_blank">（2）プログラミング言語とは何か？</a><br /><a href="http://ameblo.jp/xcc/entry-11132725235.html" target="_blank">（3）Xcodeを使ったC言語の学習</a><br /><a href="http://ameblo.jp/xcc/entry-11137416003.html" target="_blank">（4）C言語ソースの解析1/2</a><br /><a href="http://ameblo.jp/xcc/entry-11137453749.html" target="_blank">（5）C言語ソースの解析2/2</a><br /><a href="http://ameblo.jp/xcc/entry-11138951293.html" target="_blank">（6）自分で関数を作り、利用する1/2</a><br /><a href="http://ameblo.jp/xcc/entry-11138951293.html" target="_blank">（7）自分で関数を作り、利用する2/2</a></div><br /><font color="#00BFFF">パート4：文字列の加工</font><br />　今度は文字列を加工してみます。与えられた文字列をアルファベットを3つずらす手法で暗号化します。例えば<br /><div class="c_g">CALL</div><br />　なら暗号化後の文字列は<br /><div class="c_g">FDOO</div><br />　となります。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/73/14/j/o0122020211782651709.jpg"  alt="テン＊シー＊シー-1" border="0" /><br /> 　シーザー暗号というローマ時代からある暗号法です。<br /><br /><font color="#00BFFF">配列変数</font><br />　まず、暗号化した文字列を記憶するためのメモリ区画確保ですが、これには配列変数を使います。main関数の引数で説明した配列です。<br />　変数宣言時に、変数名の後ろに[]（ブラケット）で囲んだ要素数を付ける事で、その要素数分の配列が確保されます。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/02/f4/j/o0572034511782651662.jpg"  alt="テン＊シー＊シー-2" border="0" /><br />　次に、const char*型の変数targetを宣言して、"HELLO WORLD"の先頭番地を代入します。<br /><div class="s1">   char result[100];<br />   const char* target = "HELLO WORLD";</div><br />　const char*型の変数と文字列リテラルを「=」で結ぶ事は、C文字列先頭番地の代入を意味します。<br /><div class="c_g">　余談ですが、文字列リテラルの他に、「’」（シングルクォーテーション）で囲んだ1文字は文字コード表の対応する数値を意味するというルールもあります。<br /><div class="s1">char a = 65;	　どちらもchar型変数aに文字Aを設定する事になるが、<br />char a = 'A';	後者の方が目的が明確になる。</div></div><br />　あとはtargetが示す番地の内容を1文字ずつ読み取り、resultの要素にコピーします。<br /><div class="s1">    for (int i = 0; i < 100; i++) {<br />        result[i] = *target;	<font color="#00BFFF">←　1文字コピーする。</font><br />        if (*target == 0) {<br />            break;      		<font color="#00BFFF">←　文字は0だったので、ここでループを強制終了する。</font><br />        }<br />        target++;       	<font color="#00BFFF">←　次の文字にすすめる。</font><br />    }</div><br />　forループは前のパートで説明したとおりです。int型変数iを0から99になるまで繰り返すループになっています。<br /><br /><font color="#00BFFF">配列の要素の指定</font><br />　ループ中でおこなっている 処理は、1文字のコピー処理です。<br />　代入される側はresult配列のi番目の要素を指定しています。以前説明したように、[]内に添字を指定する事で、配列の要素を指定できるわけですが、添字には変数も使えます。<br /><div class="c_g">result[i]</div><br /><br /><font color="#00BFFF">ポインタ型変数の使い方</font><br />　そして、右側のポインタ型変数targetの前に「*」（アスタリスク）を付ける事で、targetが指し示す番地の内容を読み取ることが出来ます。<br /><div class="c_g">*target</div><br />　あとは = で代入する事で1文字コピーが完了です。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/c4/cd/j/o0544044811782651660.jpg"  alt="テン＊シー＊シー-3" border="0" /><br />　そして、ポインタ型にも四則演算や++、--が適用できます。<br /><div class="c_g">target++</div><br />　この場合、番地が加算されたり、減算されたりするわけですが、int型と違い、ポインタ型はchar*型なら1バイト、int*型なら4バイトといったように、アスタリスクの付いた型の大きさ単位で変化します。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/1f/5c/j/o0577029711782651661.jpg"  alt="テン＊シー＊シー-4" border="0" /><br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/63/e7/j/o0562031211782651673.jpg"  alt="テン＊シー＊シー-5" border="0" /><br /><br />　たえず、型の切れ目に移動するようになっているわけです。例えばint*型の変数targetに対し<br /><div class="c_g">*(target + 2)</div><br />　と記述すると、targetが示す番地からint型の占有バイト数である4バイトの2個分で8バイトずれた番地の内容をint型の値として読み取れる事になります。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/98/b2/j/o0529041311782653208.jpg"  alt="テン＊シー＊シー-6" border="0" /><br /><font color="#00BFFF">ループの強制終了</font><br />　resultには最大100文字までコピーできるわけですが、C文字列の終端である0にぶつかれば、それ以上コピーする必要はありません。そのため<br /><div class="c_g">break</div><br />　を使い、ループを強制的に終わらせています。この命令はdo～while、while、forループで利用できます。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/3c/ea/j/o0271028111782653210.jpg"  alt="テン＊シー＊シー-7" border="0" /><br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/a4/71/j/o0413016511782653209.jpg"  alt="テン＊シー＊シー-8" border="0" /><br />　これだけだと、ただの文字列コピーなので、resultにはそのまま代入せず、*targetに3を加えたものを代入します。<br /><div class="s1">        result[i] = *target + 3; </div><br />　これで暗号化完了です。<br /><div class="c_g">　厳格にシーザー暗号をまねるなら、最後のXYZはABCに戻る必要がありますが、ここでは単純に文字数値に +3 しています。</div><br /><div class="c_g"><font color="#00BFFF">continue</font><br />　breakの他に、continueという、記述された場所から後のループ内処理は省略し、ループ終了/継続決定処理まで進むというものもあります。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/30/e6/j/o0513040411782653211.jpg"  alt="テン＊シー＊シー-9" border="0" /><br />　continueの場合、ループを続けるかどうかはチェックされる事に注意してください。</div><br />　実際のソースは以下のようになります。終端の0まで+3してしまっては、終端の意味が無くなるので、その対応も追加します。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/41/92/j/o0531031811782653212.jpg"  alt="テン＊シー＊シー-10" border="0" /><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-15-cipher.zip" target="_blank">study-15-cipher.zip</a><br /><br /><font color="#00BFFF">#define</font><br />　100のかわりにMAX_LENとしている事に注目してください。<br />　以下の記述で、MAX_LENと書く事は100と書いたのと同じ事になります。<br /><div class="c_g">#define MAX_LEN 100	プリプロセス指令なので「;」（セミコロン）は付けない</div><br />　#defineは以前説明した#includeと同じく、プリプロセス指令です。<br /><img src="http://stat.ameba.jp/user_images/20120208/22/xcc/88/37/j/o0472017011782655142.jpg"  alt="テン＊シー＊シー-11" border="0" /><br />　このようにする事で、100とそのまま記述するより、目的が明確になりプログラムの意味が捉えやすくなります。<br />　Runするとコンソールには<br /><div class="s1">cipher =KHOOR#ZRUOG<br />Program ended with exit code: 0</div><br />　と出力されます。<br />　"KHOOR#ZRUOG"が、正しく暗号化されたものなら、暗号を解いて"HELLO WORLD"に戻せるはずです。以下のようにして暗号化したresultを解いてみましょう。<br /><div class="s1">int main (int argc, const char * argv[])<br />{<br />	<font color="#00BFFF">・・・　"HELLO WORLD"を暗号化してresultに保存。<br />    ↓暗号を解く</font><br />    for (int i = 0; i < MAX_LEN; i++) {<br />        if (result[i] == 0) {<br />            break;     			<font color="#00BFFF">←文字は0だったので、ここでループを強制終了する。</font><br />        }<br />        result[i] = result[i] - 3;    	<font color="#00BFFF">←1文字、暗号を解く。</font><br />    }<br />    printf("decipher =%s\n", result);<br />    return 0;<br />}</div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-16-cipher-2.zip" target="_blank">study-16-cipher-2.zip</a><br /><br />　Runするとコンソールには<br /><div class="s1">cipher =KHOOR#ZRUOG<br />decipher =HELLO WORLD<br />Program ended with exit code: 0</div><br />　と出力されます。正しく暗号化できているようです。<br /><br /><font color="#00BFFF">暗号化、暗号解凍関数の用意</font><br />　今度は、暗号化、暗号解凍、それぞれの処理を関数にしてみます。<br /><div class="c_g"><font color="#00BFFF">暗号化関数：受け取ったplain_text文字列を暗号化してciphered_textに入れる。</font><br />void cipher(const char * plain_text, char * ciphered_text);<br /><br /><font color="#00BFFF">暗号解凍関数：受け取ったciphered_text暗号を解凍してplain_textに入れる。</font><br />void decipher(const char * ciphered_text, char * plain_text);</div><br />　先のループ処理でわかるように、文字列の先頭番地を受け取りさえすれば、文字列全体を加工可能です。そのため関数の引数には<br /><div class="c_g">char*型</div><br />　を使うわけです。<br />　また、暗号化関数cipherでは、元にするplain_text文字列のメモリ区画は読み取りだけで変更はしません。参照だけして書き込んだりはしない事を意思表示するためにconstを付けています。<br /><div class="c_g">const char*型</div><br />　これで、関数を使う者に、この関数がplain_text引数に渡した文字列は変更される事はないと伝えられます。<br /><div class="s1">#define MAX_LEN 100<br />void cipher(const char * plain_text, char* ciphered_text)<br />{<br />   <font color="#00BFFF"> ↓  最大MAX_LEN文字（ただし終端は0）までの文字をコピーするループ</font><br />    for (int i = 0; i < MAX_LEN; i++) {<br />        ciphered_text[i] = *plain_text + 3;    	<font color="#00BFFF">← 1文字暗号化する。</font><br />        if (*plain_text == 0) {<br />            ciphered_text[i] = 0;               		<font color="#00BFFF">← 暗号化のせいで終端まで3になっているのを修正。</font><br />            break;                              		<font color="#00BFFF">← 文字は0だったので、ここでループを強制終了する。</font><br />        }<br />        plain_text++;                           		<font color="#00BFFF">← 次の文字にすすめる。</font><br />    }<br />}<br />void decipher(const char * ciphered_text, char * plain_text)<br />{<br />  <font color="#00BFFF">↓ 暗号を解く</font><br />    for (int i = 0; i < MAX_LEN; i++) {<br />        if (ciphered_text[i] == 0) {<br />            plain_text[i] = 0;                 		<font color="#00BFFF">← 終端は 0　のままでよい。</font><br />            break;                             		<font color="#00BFFF">← 文字は0だったので、ここでループを強制終了する。</font><br />        }<br />        plain_text[i] = ciphered_text[i] - 3;   	<font color="#00BFFF">← 1文字、暗号を解く。</font><br />    }<br />}</div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-17-cipher-func.zip" target="_blank">study-17-cipher-func.zip</a><br /><br />　ポインタ型引数に対して、配列引数のような扱いをしている事に注目してください。<br /><div class="s1">void cipher(const char * plain_text<font color="#00BFFF">, char * ciphered_text</font>)<br />	・・・<br />        <font color="#00BFFF">ciphered_text[i] </font>= *plain_text + 3; </div><br />　このようにポインタ型は配列のようにも扱えます。<br />　もちろんポインタ型本来の<br /><div class="s1">        <font color="#00BFFF">*(ciphered_text + i) </font>= *plain_text + 3; </div><br />　という書き方でもかまいませんし、iを使わずに<br /><div class="s1">        <font color="#00BFFF">*ciphered_text</font> = *plain_text + 3; <br />        if (*plain_text == 0) {<br />            <font color="#00BFFF">*ciphered_text</font> = 0;  <br />            break;  <br />        }<br />        plain_text++; <br />        <font color="#00BFFF">ciphered_text++;</font><br /></div><br />　と書いてもかまいません。<br /><div class="c_g">　いろいろな記述法があるので、わかりやすい記述法を選ぶといいでしょう。それぞれの記述法で多少の処理速度の違いも発生しますが、それよりはわかりやすい記述法をこころがけてください。</div><br />　逆に引数の方を以下のように書いても問題ありません。<br /><div class="s1">void cipher(const char * plain_text, <font color="#00BFFF">char ciphered_text[]</font>)</div><br />　main関数で体験済みですが、引数では[]の中の要素数を省略できます。<br /><div class="s1">void cipher(const char * plain_text, char ciphered_text[<font color="#00BFFF">MAX_LEN</font>])</div><br />　と書いてもかまいませんが、XcodeのC言語コンパイラは要素数の違いを気にしないので、あまり意味がありません。以下のように要素数を1にしてcipher関数に渡してもコンパイラは注意してきません。<br /><div class="s1">int main (int argc, const char * argv[])<br />{<br />    char result[1];     <br />    cipher("HELLO WORLD", result);    </div><br />　"HELLO WORLD"は11文字と0終端で、合計12個のchar型配列要素が必要なので、結果、resultでメモリに確保した配列エリアをはみ出した領域に、暗号化された文字列が書き出される事になります。<br />　この場合、アプリケーションは最悪、機能停止（そのまま普通に実行される場合もあるので、なおやっかいです。実行できたとしても、それはけっして正常な状態ではありません）します。<br /><div class="c_g">　そういう点では、この2つの関数は少し危険な部分が残っているわけです。<br />　本来なら、これを防止するために、最大要素数を引数に受け取るなりして、配列の大きさをチェックしながら処理するべきですが、ここではC言語の学習が目的なので省略しています。</div><br /><br />つづく<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11159283909.html</link>  
      <pubDate>Thu, 09 Feb 2012 09:00:04 +0900</pubDate> 
    </item>  
    <item>
      <title><![CDATA[PR: パナセンスでWiMAXが格安！キャンペーン実施中]]></title>
      <link>http://rss.rssad.jp/rss/ad/VLf9GzHs1fvD/FIiunShOpT.6?type=2&amp;ent=be823cd7ac3a87ac62c9a6b0a5ad71ad</link>
      <description><![CDATA[<table cellspacing="0" cellpadding="0"><tbody><tr><td align="left" valign="center"><a href="http://rss.rssad.jp/rss/ad/VLf9GzHs1fvD/FIiunShOpT.6?type=2" target="_blank"><img alt="" style="border: 0;" border="0" src="http://rss.rssad.jp/rss/img/VLf9GzHs1fvD/FIiunShOpT.6?type=3&ent=be823cd7ac3a87ac62c9a6b0a5ad71ad"/></a></td></tr><tr><td align="left" valign="top" > パナソニック公式直販サイトで先着3000名様初期費０円、キャッシュバック実施中 </td></tr></tbody></table><div style="font-size:10px;"><span style="padding-top:5px;"><br style="display:none"/><a href="http://www.rssad.jp/trendmatch/trendmatch.html">Ads by Trend Match</a></span><br/></div>]]></description>
      <pubDate>Thu, 09 Feb 2012 09:00:04 +0900</pubDate>
    </item>
    <item> 
      <title>スイム2.0km</title>  
      <description><![CDATA[<p>
 　クロールをだらだらと500m、ブレスをだらだらと500m、クロールをだらだらと500m、ブレスをだらだらと500m。<br /><br />現在 <br />　体重：61.7kg　体脂肪：19.8%<br /><br />目標 <br />　体重：59.5kg　体脂肪：15.1%
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11159276604.html</link>  
      <pubDate>Wed, 08 Feb 2012 22:18:00 +0900</pubDate> 
    </item>  
    <item> 
      <title>ラン10.0km</title>  
      <description><![CDATA[<p>
 　ラン10.0km/60分。<br /><br />現在 <br />　体重：未測定　体脂肪：未測定<br /><br />目標 <br />　体重：59.5kg　体脂肪：15.1%
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11158428714.html</link>  
      <pubDate>Tue, 07 Feb 2012 23:21:35 +0900</pubDate> 
    </item>  
    <item>
      <title><![CDATA[PR: パナセンスでWiMAXが格安！キャンペーン実施中]]></title>
      <link>http://rss.rssad.jp/rss/ad/VLf9GzHs1fvD/LHV.dQI2VDIe?type=2&amp;ent=4ba0b088089f465cd8753bad678f77ef</link>
      <description><![CDATA[<table cellspacing="0" cellpadding="0"><tbody><tr><td align="left" valign="center"><a href="http://rss.rssad.jp/rss/ad/VLf9GzHs1fvD/LHV.dQI2VDIe?type=2" target="_blank"><img alt="" style="border: 0;" border="0" src="http://rss.rssad.jp/rss/img/VLf9GzHs1fvD/LHV.dQI2VDIe?type=3&ent=4ba0b088089f465cd8753bad678f77ef"/></a></td></tr><tr><td align="left" valign="top" > パナソニック公式直販サイトで先着3000名様初期費０円、キャッシュバック実施中 </td></tr></tbody></table><div style="font-size:10px;"><span style="padding-top:5px;"><br style="display:none"/><a href="http://www.rssad.jp/trendmatch/trendmatch.html">Ads by Trend Match</a></span><br/></div>]]></description>
      <pubDate>Tue, 07 Feb 2012 23:21:35 +0900</pubDate>
    </item>
    <item> 
      <title>ついてこれるンなら、ついてきてミロヤァアああああ</title>  
      <description><![CDATA[<p>
 　ようやくredline観ました。<br />　TSUTAYA、DVDしか置いてないでやんのよ。<br />　「おもしれ～じゃねえか。」ブルーレー買うしかないですな。コレクターズ・エディションを。<br /><br />　スーパーボインズのおねーちゃん達最高。<br />　マジンガー軍団のローリーとロールだよね？<br />　デイズナ弟は、ぜってー、アイアンカイザー。リンチマンはX-Menからエリック・ザ・レッド。<br />　それで、いいよね？<br />　それで決定な。<br /><br /><iframe width="560" height="315" src="http://www.youtube.com/embed/xmbW6WXLeW4" frameborder="0" allowfullscreen></iframe><br /><br />　チキチキマシン猛レース開催なりよ。<br />　観るべし！<br /><br /><br /><iframe width="420" height="315" src="http://www.youtube.com/embed/kqWqb3FGN-c" frameborder="0" allowfullscreen></iframe><br />TRAVA-FIST PLANETから続く世界ですな
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11154891045.html</link>  
      <pubDate>Sun, 05 Feb 2012 17:54:10 +0900</pubDate> 
    </item>  
    <item> 
      <title>スイム2.0km</title>  
      <description><![CDATA[<p>
 　クロールをだらだらと500m、ブレスをだらだらと500m、クロールをだらだらと500m、ブレスをだらだらと500m。<br /><br />現在 <br />　体重：61.7kg　体脂肪：19.8<br /><br />目標 <br />　体重：59.5kg　体脂肪：15.1%<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11155378747.html</link>  
      <pubDate>Sat, 04 Feb 2012 21:20:29 +0900</pubDate> 
    </item>  
    <item> 
      <title>ラン10.0km</title>  
      <description><![CDATA[<p>
 　ラン10.0km/60分。<br /><br />現在 <br />　体重：62.7kg　体脂肪：21.3%<br /><br />目標 <br />　体重：59.5kg　体脂肪：15.1%
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11154552188.html</link>  
      <pubDate>Fri, 03 Feb 2012 23:19:18 +0900</pubDate> 
    </item>  
    <item> 
      <title>ブートキャンプ（7）自分で関数を作り、利用する 2/2</title>  
      <description><![CDATA[<p>
 <div class="c_g"><strong>ブートキャンプ目次</strong><br /><a href="http://ameblo.jp/xcc/entry-11082999260.html" target="_blank">（1）iPhone/iPadアプリケーションを作るには？</a><br />　　<a href="http://ameblo.jp/xcc/entry-11084017360.html" target="_blank">→無料開発者登録</a><br /><a href="http://ameblo.jp/xcc/entry-11126502451.html" target="_blank">（2）プログラミング言語とは何か？</a><br /><a href="http://ameblo.jp/xcc/entry-11132725235.html" target="_blank">（3）Xcodeを使ったC言語の学習</a><br /><a href="http://ameblo.jp/xcc/entry-11137416003.html" target="_blank">（4）C言語ソースの解析1/2</a><br /><a href="http://ameblo.jp/xcc/entry-11137453749.html" target="_blank">（5）C言語ソースの解析2/2</a><br /><a href="http://ameblo.jp/xcc/entry-11138951293.html" target="_blank">（6）自分で関数を作り、利用する1/2</a></div><br />　ちょっとだけ横道にそれて、変数についての話をしましょう。<br />　グローバル変数は、ローカル変数のように影響範囲が関数内に限られず、どの関数からも変更可能なので、関数をたくさん呼び出す複雑なプログラムを作った時に、どの関数で、どのグローバル変数が変更されるかを把握しなくてはならず、管理が大変です。<br /><div class="s1">int result;<br />void a(void)<br />{<br /><font color="#00BFFF">   ・・・ 何か複雑な処理。</font><br />    result = 0;　　<font color="#00BFFF">←　その課程でresultが0になる。</font><br />}<br />void factorial(void)<br />{<br />    result = 3 * 2 * 1;<br />}<br />int main (int argc, const char * argv[])<br />{<br />    factorial();	<font color="#00BFFF">←　resultは3の階乗になる。</font><br /><font color="#00BFFF">    a();	←　階乗とは無関係の別の処理をする関数。その課程で副次的にresultが0になる。<br /></font>    printf("factorial 3 =%d\n", result);		<font color="#00BFFF">←　resultは3の階乗ではなく0になっている。</font><br />    return 0;<br />}</div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-9-factorial-global.zip" target="_blank">study-9-factorial-global.zip</a><br /><br />　また、分割コンパイルのところで、別ファイルに記述された関数が使えると説明しましたが、グローバル変数も同じように宣言する事で、別ファイルの関数から利用できます。こうなるとますます管理が難しくなります。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/55/4b/j/o0550035611741745322.jpg"  alt="$テン＊シー＊シー-9" border="0" /><br /><br />　グローバル変数は、外部のファイルからも使える変数なので、外部変数とも呼ばれます。<br /><br /><font color="#00BFFF">スコープ</font><br />　このような関数や変数の影響範囲をスコープと呼びます。<br />　グローバル変数は、最大級のスコープを持つわけです。ローカル変数は関数内がスコープとなります。<br /><br /><font color="#00BFFF">static変数</font><br />　グローバル変数も関数のように型の前にstaticを付ける事で、スコープをファイル内に制限する事が可能です。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/c4/52/j/o0552046911741750482.jpg"  alt="$テン＊シー＊シー-10" border="0" /><br /><br />　これで、少しだけグローバル変数が管理しやすくなります。<br />　いずれにしろ、グローバル変数は、本当に必要かどうか（関数の引数、戻り値で解決できないかどうか等）、慎重に考えてから利用するべきです。<br /><br /><font color="#00BFFF">関数内static変数</font><br />　関数内の変数宣言でstaticを使うと、関数内での宣言でありながら、ヒープ領域にメモリ区画が確保され、アプリケーションが終了するまでメモリに存在しつつ、スコープは関数内のみという変数を用意できます。<br /><br />　これを利用すると、以下のcountup関数のような呼び出すたびにカウントを1つ増やす関数も作れます。<br /><div class="s1">void countup(void)<br />{　<br />    <font color="#00BFFF">static</font> int count = 0;<br />    count = count + 1;<br />    printf("count =%d\n", count);<br />}<br /><br />int main (int argc, const char * argv[])<br />{<br />    countup();	<font color="#00BFFF">←画面に　count=1　を出力</font><br />    countup();	<font color="#00BFFF">←画面に　count=2　を出力</font><br />    countup();	<font color="#00BFFF">←画面に　count=3　を出力</font><br />    return 0;<br />}</div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-10-countup.zip" target="_blank">study-10-countup.zip</a><br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/74/f5/j/o0516024911741750484.jpg"  alt="$テン＊シー＊シー-11" border="0" /><br /><br />　最初のcountへの代入はアプリケーション起動時に1度だけ実行されます。<br />　グローバル変数やstaticの付いた変数は、このようにしてアプリケーション起動時の初期値を設定可能です。<br /><div class="s1">    <font color="#00BFFF">static</font> int count = 0;</div><br /><br /><div class="c_g"><br />　もし、staticを付けていない、ただのローカル変数の場合は、関数が呼ばれるたびにcountへ0が代入されます。つまり<br /><div class="s1">    int count = 0;</div><br />　だと<br /><div class="s1">    int count;<br />    count = 0;</div><br />　の省略形という意味になります。<br /></div><br />　次の<br /><div class="s1">    count = count + 1;</div><br />　は<br /><div class="c_g">count ←count + 1</div><br />　というcountの値に1を加算して、countに代入する処理です。<br /><div class="c_g"><br />　= による左側の変数への代入は最後におこなわれます。<br />　例えば、以下のように書いた場合、= の右側の計算での変数aの値は すべて同じです。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/62/0f/j/o0374010111741750483.jpg"  alt="$テン＊シー＊シー-12" border="0" /><br /><br /></div><br />　グローバル変数、static変数の適切な使い分けは、場数を踏んで体得するしかありません。いろいろなサンプルプログラムを読んだり、自分で書いたりして経験を積んでいってください。<br /><br />　それでは階乗計算の話に戻ります。<br /><br /><font color="#00BFFF">引数によるfactorial関数の拡張</font><br />　今度は、factorial関数にint型の引数を一つ用意して、この値に対して階乗計算をおこない、その結果を戻すようにしてみましょう。<br /><div class="s1">int factorial(<font color="#00BFFF">int seed</font>)	<font color="#00BFFF">←引数seedを用意</font><br />{<br />    int result;<br /><font color="#00BFFF">    seedの階乗計算をしてresultに代入。<br /></font>    return result;<br />}<br /><br />int main (int argc, const char * argv[])<br />{<br />    int result;<br />    result = factorial(3);	<font color="#00BFFF">←階乗したい値を引数で渡す</font><br />    printf("factorial 3 =%d\n", result);<br />    return 0;<br />}<br /></div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-11-factorial-dowhile.zip" target="_blank">study-11-factorial-dowhile.zip</a><br /><br />　seedという引数を階乗するようにします。<br /><br /><font color="#00BFFF">ループ処理（do ～ while）</font><br />　 そのためには引数seedを1になるまで一つずつ減らし、1になったら 終わらせるというループ処理が必要です。<br />　このようなループ処理制御には<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/48/93/j/t02200014_0390002511741754735.jpg"  alt="$テン＊シー＊シー-13" border="0" /><br /><br />　という制御文を使います。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/da/37/j/o0235025411741754734.jpg"  alt="$テン＊シー＊シー-14" border="0" /><br /><br />　ここで現れた条件式は、条件分岐式で説明した条件式です。条件式の結果がfalseの時、ループが終了します。したがって今回なら条件式に<br /><div class="c_g">seed > 1</div><br /> 　と書けば、seedの値が1より大きい場合にループし続ける処理が書けることになります。<br /> 　このループの中で、引数seedの値を1減らす処理をおこなえば、やりたかったループ処理が実現でき ます。<br />　引数seedの値を1減らすには、先にやった四則演算と代入処理を組み合わせを使います。<br /><div class="c_g">seed = seed - 1</div><br />　これで<br /><div class="c_g">seed ← seed - 1の計算結果</div><br />　という処理がおこなわれseedの値が更新されていくことになります。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/f2/54/j/o0525022711741754736.jpg"  alt="$テン＊シー＊シー-15" border="0" /><br /><br />　 あとは、以下のようにresultの初期値をseedにしておいてから、ループ中のseedの値をresultに掛け合わせていけば、階乗の計算ができます。<br /><br /><img src="http://stat.ameba.jp/user_images/20120203/00/xcc/a4/0a/j/o0543026811770977919.jpg"  alt="$テン＊シー＊シー-16" border="0" /><br /><br /><font color="#00BFFF">さまざまな演算子</font><br />　代入と四則演算を合成した演算子を使うと、factorial関数は、もう少し省略した記述も可能です。<br /><div class="s1">int factorial(int seed)<br />{<br />    int result = seed;<br />    do {<br />        seed--;<br />        result *= seed;<br />    } while (seed > 1);    <br />    return result;<br />}</div><br />　まず、変数の宣言と直後の代入<br /><div class="s1">    int result;<br />    result = seed;</div><br />　は、static変数の時に説明したように合成でき<br /><div class="s1">    int result = seed;</div><br />　とできます。<br />　int型変数の値を1つ減らしたり、増やしたりする場合は<br /><div class="c_g">++	1つ増やす<br />--	1つ減らす</div><br />　という演算子が利用でき<br /><div class="s1">        seed = seed - 1;</div><br />　は<br /><div class="s1">        seed--;</div><br />　と記述できます。<br /><div class="s1">        result = result * seed;</div><br />　は<br /><div class="c_g">+=	左の変数に右の計算式の結果を足したものを代入。<br />-=	〃			　　引いたものを代入。<br />*=	〃			　　かけたものを代入。<br />/=	〃			　　割ったものを代入。<br />%=	〃			　　割ったあまりを代入。<br /></div><br />　の*=が使え<br /><div class="s1">        result *= seed;<br /></div><br />　とできます。<br /><br />　--演算子(++も同じ)は、少し特殊で 変数の前に付けるか、後ろに付けるかで意味が変わります。<br /><div class="s1">        seed--;<br />        result *= seed;</div><br />　の場合は<br /><div class="s1">        result *= --seed;</div><br />　と合成できます。<br /><div class="s1">        result *= seed--;</div><br />　の場合、<br /><div class="s1">        result *= seed;<br />        seed--;</div><br />　という意味になるので気をつけてください。<br />　もう少しだけ短くなるわけです。<br /><div class="s1">int factorial(int seed)<br />{<br />    int result = seed;<br />    do {<br />        result *= --seed;<br />    } while (seed > 1);    <br />    return result;<br />}</div><br />　短さを求めるなら、フリーフォーマットを利用して以下のように書いても問題な くコンパイルできます。<br /><div class="s1">int factorial(int seed){int result=seed;do{result*=--seed;}while(seed>1);return result;}</div><br />　しかし、これが見た目に読みにくい事は一目瞭然です。<br />　後で読み解くのに苦労するような書き方は避けるべきでしょう。<br />　また、最初で説明 した注釈文を豊富に入れておく事も非常に意味のある事です。<br />　 それと、result *= --seed;より元の2行の方が見やすいかもしれません。<br /><div class="s1">/*<br /> 自然数の階乗、引数seedの階乗計算の結果を返す。<br /> */<br />int factorial(int seed)<br />{<br />    int result = seed;  //  階乗計算のためにseedで初期化<br />    do {<br />        seed--;         //	ひとつ小さくする<br />        result *= seed;<br />    } while (seed > 1); //	seedが1になるまでループ<br />    return result;<br />}</div><br /><div class="c_g">　//　の他に　/*　と　*/　で囲んだ部分も注釈にできます。<br />　/*　と　*/の間は複数行にわけて記述もできます。どちらを使うかは自由です。</div><br /><br />　factorial関数を、数学の定義<br /><div class="c_g"> 0!=1	0の階乗は1</div><br />　にも対応させてみましょう。<br />　これを計算式にする事は不可能です。このような時は、先の条件分岐を使います。<br /><div class="s1">/*<br /> 自然数の階乗、引数seedの階乗計算の結果を返す。<br /> */<br />int factorial(int seed)<br />{<br /><font color="#00BFFF">    if (seed == 0) {    //	seedが0の時は無条件で1を返す<br />        return 1;<br />    }</font><br />    int result = seed;  //  階乗計算のためにseedで初期化<br />    do {<br />        seed--;         //	ひとつ小さくする<br />        result *= seed;<br />    } while (seed > 1); //	seedが1になるまでループ<br />    return result;<br />}<br /></div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-12-factorial-dowhile-2.zip" target="_blank">study-12-factorial-dowhile-2.zip</a><br /><br />　 引数seedが0の時は、即座に関数を終わらせ1を返します。このようにreturn処理は関数の終わりだけでなく、どこにでも書く事ができます。<br />　引数や戻り値で負の値を扱わないという事を明示するのもひとつの考えです。<br /><br /><font color="#00BFFF">unsigned int型</font><br />　以下のようにintの前にunsignedを付ける事で、seedやresult、戻り値を負の数を扱わない型にできます。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/2c/d7/j/o0272006211741757409.jpg"  alt="$テン＊シー＊シー-17" border="0" /><br /><br /><div class="s1"><font color="#00BFFF">unsigned</font> int factorial(<font color="#00BFFF">unsigned</font> int seed)<br />{<br />    if (seed == 0) {    //	seedが0の時は無条件で1を返す<br />        return 1;<br />    }<br />    <font color="#00BFFF">unsigned</font> int result = seed;  //  階乗計算のためにseedで初期化<br />    do {<br />        seed--;         //	ひとつ小さくする<br />        result *= seed;<br />    } while (seed > 1); //	seedが1になるまでループ<br />    return result;<br />}<br /></div><br /><div class="c_g">　ただし、Xcodeの初期設定ではunsigned int型の引数に、負の値を渡しても注意はされません。また、int型やunsigned int型で大きな数の階乗計算をすると、すぐに記憶できる値の範囲を超えてしまうでしょう。その場合はfloat型を使うことになります。</div><br /><font color="#00BFFF">ループ処理（while）</font><br />　do~whileループ以外に2つのループがあり、こちらを使う事も可能です。<br />　whileループは判定がループの最初におこなわれます。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/e5/c5/j/o0399039411741757411.jpg"  alt="$テン＊シー＊シー-18" border="0" /><br /><br />　今回の場合、うまく工夫すると、最初に判定する点でdo~whileループよりスッキリした記述になりま す。<br /><div class="s1">unsigned int factorial(unsigned int seed)<br />{<br />    unsigned int result = 1;     //  階乗計算のために1で初期化<br />    while (seed > 1) {  //  seedが1より大きい間ループ<br />        result *= seed;<br />        seed--;         //	ひとつ小さくする<br />    }<br />    return result;<br />}<br /></div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-13-factorial-while.zip" target="_blank">study-13-factorial-while.zip</a><br /><br /> <font color="#00BFFF">ループ処理（for）</font><br />　初期化処理や、ループ1回ごとにおこなう処理を記述できるforループもあります。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/dc/51/j/o0558029911741761426.jpg"  alt="$テン＊シー＊シー-19" border="0" /><br /><br />　whileループによく似ていますし、ループ初期化、ループ1回ごとにおこなう処理が記述できるので、さらにシンプルに記述できそうですが、以下の記述だとスコープの問題が発生します。<br /><div class="s1">unsigned int factorial(unsigned int seed)<br />{<br />    for (unsigned int result = 1; seed > 1; seed--) {<br />        result *= seed;<br />    }<br />    return result;<br />}<br /></div><br />　上記のままだとreturnで戻すresult変数が見つからないというエラーになるのです。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/11/cd/j/o0484006411741761425.jpg"  alt="$テン＊シー＊シー-20" border="0" /><br />注意と同じようにアイコンをクリックすると詳細がわかる。<br /><br />　これは、変数宣言で説明したスコープの問題で、forループのループ初期化で<br /><div class="c_g">    for (<font color="#00BFFF">unsigned int result = 1;</font></div><br />　とresultを変数宣言すると、このresultはforループ内だけのスコープになってしまうためです。<br />　したがって、今回の場合、result変数宣言はforループ外でおこない、for ループ初期化処理は空にする必要があります。<br />　for ループ初期化処理を空にするには<br /><div class="c_g">for (;</div><br />　と記述します。<br /><div class="s1">unsigned int factorial(unsigned int seed)<br />{<br />    unsigned int result = 1;<br />    for (; seed > 1; seed--) {	<font color="#00BFFF">←初期化処理を何も書かずに ; を書く。</font><br />        result *= seed;<br />    }<br />    return result;<br />}<br /></div><br />サンプルプロジェクト：<a href="http://www.tetera.jp/xcc/bootcamp/study-14-factorial-for.zip" target="_blank">study-14-factorial-for.zip</a><br /><br />　その時その時で最適なループを選んで利用してください。<br />　ループ処理は、if同様、処理が1つなら{}を省略もできます。<br /><div class="s1">    for (; seed > 1; seed--) <br />        result *= seed;</div><br />　以上で階乗関数の作成はおしまいです。<br /><br />　次のパートでは、ここまでにならったループ処理や条件分岐処理、変数を使って文字列を加工してみましょう。<br /><div class="c_g">　forループに限らず、関数内で{}を使う事で、一時的なスコープを作り出せます。例えば以下のように記述された場合<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/8a/69/j/o0417020911741761428.jpg"  alt="テン＊シー＊シー-21" border="0" /><br /><br />　引数のseedと、{}内のseedは、まったく別物になります。<br />　とうぜん、{}内ののseed = 100は、forループのseedに何の影響を与える事もなく、factorial関数は正常に計算をおこなう事になります。<br /><br /><img src="http://stat.ameba.jp/user_images/20120118/17/xcc/cb/aa/j/o0460028011741761427.jpg"  alt="テン＊シー＊シー-22" border="0" /><br /><br />　上の例のような記述をする人はいないと思いますが、スコープによる変数の影響範囲には絶えず気を使うようにしてください。</div><br />
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11142757658.html</link>  
      <pubDate>Fri, 03 Feb 2012 00:41:58 +0900</pubDate> 
    </item>  
    <item>
      <title><![CDATA[PR: 薬剤師転職ファーネットキャリア]]></title>
      <link>http://rss.rssad.jp/rss/ad/VLf9GzHs1fvD/eiJvPSVVn_Nm?type=2&amp;ent=9f5c97f44fe6c9dbbff05ff21807f57b</link>
      <description><![CDATA[<table cellspacing="0" cellpadding="0"><tbody><tr><td align="left" valign="center"><a href="http://rss.rssad.jp/rss/ad/VLf9GzHs1fvD/eiJvPSVVn_Nm?type=2" target="_blank"><img alt="" style="border: 0;" border="0" src="http://rss.rssad.jp/rss/img/VLf9GzHs1fvD/eiJvPSVVn_Nm?type=2&ent=9f5c97f44fe6c9dbbff05ff21807f57b"/></a></td></tr><tr><td align="left" valign="top" > 薬剤師向け転職支援サービス。本人に代わり、希望の求人案件をリサーチ </td></tr></tbody></table><div style="font-size:10px;"><span style="padding-top:5px;"><br style="display:none"/><a href="http://www.rssad.jp/trendmatch/trendmatch.html">Ads by Trend Match</a></span><br/></div><img border="0" width="1" height="1" src="http://rss.rssad.jp/rss/ibfeed/VLf9GzHs1fvD/eiJvPSVVn_Nm"/>]]></description>
      <pubDate>Fri, 03 Feb 2012 00:41:58 +0900</pubDate>
    </item>
    <item> 
      <title>気概はあるか？</title>  
      <description><![CDATA[<p>
 　「トゥルー・グリット」観ますた。<br />　カッコいいっす。<br />　マティ役のヘイリー・スタインフェルドも、コグバーン役のジェフ・ブリッジスもどっちも良し。<br />　ちなみにマティ見てて、森鴎外の「最後の一句」の「いち」を連想してしまった。あの娘もかなりのTrue Gritを持っとるけんね。<br /><br /><a href="http://www.aozora.gr.jp/cards/000129/files/687_15356.html" target="_blank">最後の一句：青空文庫</a><br /><br />　ラストの夜の荒野の疾走に胸が高鳴るのよ。<br />　俺も老いたなとか…コグバーン、カッコ良すぎ。<br /><br />　本年度アカデミー賞10部門ノミネートもわかるわ。<br />　Blu-ray特典を見た限り原作に忠実に作ってるっぽい。としたら、このチャールズ・ポーティスって作家、ただ者ではないな。って翻訳されてるのトゥルー・グリットだけじゃん。もったいない。<br /><br />　見るべし！<br /><br /><a href="http://www.amazon.co.jp/gp/product/B006VQ94QI/ref=as_li_ss_il?ie=UTF8&tag=rebornxcc-22&linkCode=as2&camp=247&creative=7399&creativeASIN=B006VQ94QI"><img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=B006VQ94QI&MarketPlace=JP&ID=AsinImage&WS=1&tag=rebornxcc-22&ServiceVersion=20070822" ><br />トゥルー・グリット [Blu-ray]</a><img src="http://www.assoc-amazon.jp/e/ir?t=rebornxcc-22&l=as2&o=9&a=B006VQ94QI" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><br />
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11153708934.html</link>  
      <pubDate>Thu, 02 Feb 2012 23:53:00 +0900</pubDate> 
    </item>  
    <item> 
      <title>ウエイト</title>  
      <description><![CDATA[<p>
 デッドリフト<br />60kg x 10回<br />90kg x 4回<br />100kg x 3回<br /><br />ラットプルダウンバックワイド<br />42kg x 10回<br />42kg x 10回<br />42kg x 10回<br /><br />ベンチプレス<br />50kg x 10回<br />55kg x 8回<br />55kg x 7回<br /><br />ショルダープレス<br />42kg x 10回<br />47kg x 8回<br />51kg x 3回<br /><br />ツイスト<br />43kgx10回<br />43kgx10回<br />43kgx10回<br /><br />クランチ<br />59kgx10回<br />59kgx10回<br />59kgx10回<br /><br />アームカール<br />17kgx10回<br />17kgx10回<br />17kgx10回<br /><br />現在 <br />　体重：62.4kg　体脂肪：21.2%<br /><br />目標 <br />　体重：59.5kg　体脂肪：15.1%<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11153646606.html</link>  
      <pubDate>Thu, 02 Feb 2012 23:09:51 +0900</pubDate> 
    </item>  
    <item> 
      <title>結果発表</title>  
      <description><![CDATA[<p>
 　がんばってみたんだけどね～。<br />　あんま、効果無し。<br />　水卜アナ並にぷよぷよ。<br /><br /><img src="http://stat.ameba.jp/user_images/20120203/00/xcc/50/64/j/o0590039311771007226.jpg"  alt="$テン＊シー＊シー-1" border="0" /><br /><br />現在 <br />　体重：62.4kg　体脂肪：21.2%<br /><br />目標 <br />　体重：59.5kg　体脂肪：15.1%
 
</p>]]></description>  
      <link>http://ameblo.jp/xcc/entry-11153689181.html</link>  
      <pubDate>Wed, 01 Feb 2012 23:59:59 +0900</pubDate> 
    </item> 
  </channel> 
</rss>

