blog/content/post/2008-05-04-00000907.md

164 lines
8.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 『新版 C言語によるアルゴリズムとデータ構造』・第二章
author: kazu634
date: 2008-05-04
url: /2008/05/04/_976/
wordtwit_post_info:
- 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3979;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- C
- Programming
---
<div class="section">
<p>
 続き。
</p>
<div class="hatena-asin-detail">
<a href="http://www.amazon.co.jp/dp/4797331631/?tag=hatena_st1-22&ascsubtag=d-7ibv" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.amazon.co.jp/dp/4797331631/?tag=hatena_st1-22&ascsubtag=d-7ibv', '');"><img src="https://images-na.ssl-images-amazon.com/images/I/51HCG5croYL._SL160_.jpg" class="hatena-asin-detail-image" alt="新版 C言語によるアルゴリズムとデータ構造" title="新版 C言語によるアルゴリズムとデータ構造" /></a></p>
<div class="hatena-asin-detail-info">
<p class="hatena-asin-detail-title">
<a href="http://www.amazon.co.jp/dp/4797331631/?tag=hatena_st1-22&ascsubtag=d-7ibv" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.amazon.co.jp/dp/4797331631/?tag=hatena_st1-22&ascsubtag=d-7ibv', '新版 C言語によるアルゴリズムとデータ構造');">新版 C言語によるアルゴリズムとデータ構造</a>
</p>
<ul>
<li>
<span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/%BC%C6%C5%C4%CB%BE%CD%CE" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%BC%C6%C5%C4%CB%BE%CD%CE', '柴田望洋');" class="keyword">柴田望洋</a>,<a href="http://d.hatena.ne.jp/keyword/%C4%D4%CE%BC%B2%F0" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%C4%D4%CE%BC%B2%F0', '辻亮介');" class="keyword">辻亮介</a>
</li>
<li>
<span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF%A5%AF%A5%EA%A5%A8%A5%A4%A5%C6%A5%A3%A5%D6" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF%A5%AF%A5%EA%A5%A8%A5%A4%A5%C6%A5%A3%A5%D6', 'ソフトバンククリエイティブ');" class="keyword">ソフトバンククリエイティブ</a>
</li>
<li>
<span class="hatena-asin-detail-label">発売日:</span> 2005/08/27
</li>
<li>
<span class="hatena-asin-detail-label">メディア:</span> 大型本
</li>
<li>
<span class="hatena-asin-detail-label">購入</span>: 4人 <span class="hatena-asin-detail-label">クリック</span>: 14回
</li>
<li>
<a href="http://d.hatena.ne.jp/asin/4797331631" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4797331631', 'この商品を含むブログ (23件) を見る');" target="_blank">この商品を含むブログ (23件) を見る</a>
</li>
</ul>
</div>
<div class="hatena-asin-detail-foot">
</div>
</div>
<p>
<a name="seemore"></a>
</p>
<h4>
配列の要素数
</h4>
<p>
 配列の要素数は
</p>
<p>
>|c>
</p>
<p>
sizeof(a) / sizeof(a[0]);
</p>
<p>
||<
</p>
<p>
で計算できます。例はこんな感じ。
</p>
<pre class="syntax-highlight">
<span class="synPreProc">#include </span><span class="synConstant">&#60;stdio.h&#62;</span>
<span class="synType">int</span> main(<span class="synType">void</span>);
<span class="synType">int</span> main(<span class="synType">void</span>)
{
<span class="synType">int</span> i;
<span class="synType">int</span> a[<span class="synConstant">5</span>] = {<span class="synConstant">1</span>, <span class="synConstant">2</span>, <span class="synConstant">3</span>, <span class="synConstant">4</span>, <span class="synConstant">5</span>};
<span class="synComment">/* 次で要素数を計算しているよ! */</span>
<span class="synType">int</span> num_a = <span class="synStatement">sizeof</span>(a) / <span class="synStatement">sizeof</span>(a[<span class="synConstant"></span>]);
printf (<span class="synConstant">&#34;配列 a の要素数は </span><span class="synSpecial">%d</span><span class="synConstant"> です。</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, num_a);
<span class="synStatement">for</span> (i = <span class="synConstant"></span>;i &#60;= <span class="synConstant">5</span>;i++) printf (<span class="synConstant">&#34;a[</span><span class="synSpecial">%d</span><span class="synConstant">] = </span><span class="synSpecial">%d\n</span><span class="synConstant">&#34;</span>, i, a[i]);
<span class="synStatement">return</span>(<span class="synConstant"></span>);
}
</pre>
<p>
結構、面倒くさい…というのが正直なところ。
</p>
<h4>
配列要素への値の読み込み
</h4>
<p>
 配列を走査して最大値を求めます。
</p>
<pre class="syntax-highlight">
<span class="synPreProc">#include </span><span class="synConstant">&#60;stdio.h&#62;</span>
<span class="synType">int</span> main(<span class="synType">void</span>);
<span class="synType">int</span> maxof(<span class="synType">const</span> <span class="synType">int</span> a[], <span class="synType">int</span> num_a);
<span class="synType">int</span> maxof(<span class="synType">const</span> <span class="synType">int</span> a[], <span class="synType">int</span> num_a)
{
<span class="synType">int</span> i;
<span class="synType">int</span> max = a[<span class="synConstant"></span>];
<span class="synStatement">for</span> (i = <span class="synConstant">1</span>;i &#60; num_a;i++)
<span class="synStatement">if</span> (max &#60; a[i]) max = a[i];
<span class="synStatement">return</span>(max);
}
<span class="synType">int</span> main(<span class="synType">void</span>)
{
<span class="synType">int</span> i;
<span class="synType">int</span> x[<span class="synConstant">7</span>];
<span class="synType">int</span> nx = <span class="synStatement">sizeof</span>(x) / <span class="synStatement">sizeof</span>(x[<span class="synConstant"></span>]);
printf (<span class="synConstant">&#34;</span><span class="synSpecial">%d</span><span class="synConstant"> 個の整数を入力してください。</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, nx);
<span class="synStatement">for</span> (i = <span class="synConstant"></span>;i &#60; nx;i++) {
printf (<span class="synConstant">&#34;x[</span><span class="synSpecial">%d</span><span class="synConstant">]: &#34;</span>, i);
scanf(<span class="synConstant">&#34;</span><span class="synSpecial">%d</span><span class="synConstant">&#34;</span>, &#38;x[i]);
}
printf (<span class="synConstant">&#34;最大値は </span><span class="synSpecial">%d</span><span class="synConstant"> です。</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, maxof(x, nx));
<span class="synStatement">return</span>(<span class="synConstant"></span>);
}
</pre>
<p>
ここで注意なのが、
</p>
<blockquote title="Amazon.co.jp 新版 C言語によるアルゴリズムとデータ構造: 柴田 望洋, 辻 亮介: 本" cite="https://www.amazon.co.jp/exec/obidos/ASIN/4797331631/simsnes-22/ref=nosim">
<p>
C言語では、関数間で配列を先頭要素へのポインタという形で受け渡します。このため、呼び出される側の関数で要素数を調べることはできませんので、配列とは別に要素数を受け取る必要があります。
</p>
<p>
また、受け取った側の関数で、引数に const をつけて宣言しておけば、配列の要素に対して値を書き込めなくなります。
</p>
<p>
<cite><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4797331631/simsnes-22/ref=nosim" onclick="__gaTracker('send', 'event', 'outbound-article', 'https://www.amazon.co.jp/exec/obidos/ASIN/4797331631/simsnes-22/ref=nosim', 'Amazon CAPTCHA');" target="_blank">Amazon CAPTCHA</a></cite>
</p>
</blockquote>
<p>
ということらしい。仕様だよ、ということらしい。
</p>
<h4>
関数形式マクロ
</h4>
<p>
 <a href="http://www.geocities.jp/ky_webid/c/039.html" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.geocities.jp/ky_webid/c/039.html', 'C言語編 第39章 マクロ');" target="_blank">C言語編 第39章 マクロ</a>を参照する。
</p>
</div>