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

216 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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/_975/
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:3977;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- C
- Programming
---
<div class="section">
<p>
 『<a href="http://d.hatena.ne.jp/asin/4797331631" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4797331631', '新版 C言語によるアルゴリズムとデータ構造');">新版 C言語によるアルゴリズムとデータ構造</a>』を購入した。とりあえず少しずつやって、研修に備える。研修で残業なんかしたくない。さっさと帰るぞー。
</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>
演習1-4
</h4>
<blockquote title="Amazon.co.jp 新版 C言語によるアルゴリズムとデータ構造: 柴田 望洋, 辻 亮介: 本" cite="https://www.amazon.co.jp/exec/obidos/ASIN/4797331631/simsnes-22/ref=nosim">
<p>
整数a, bを含め、その間の全整数の和を求めて返す以下の関数を作成せよ。
</p>
<pre class="syntax-highlight">
<span class="synType">int</span> sumof(<span class="synType">int</span> a, <span class="synType">int</span> b);
</pre>
<p>
なお、aとbの大小関係なく和を求めること。<span class="footnote"><a href="/sirocco634/#f1" name="fn1" title="a = 3, b = 5でも、a = 5, b= 3でも結果は変わらないようにする">*1</a></span>
</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>
<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> sumof(<span class="synType">int</span> a, <span class="synType">int</span> b);
<span class="synType">int</span> sumof(<span class="synType">int</span> a, <span class="synType">int</span> b)
{
<span class="synType">int</span> sum = <span class="synConstant"></span>;
<span class="synType">int</span> i;
<span class="synStatement">if</span> (a &#60;= b) {
<span class="synStatement">for</span> (i = a;i &#60;= b;i++) {
sum+= i;
}
}
<span class="synStatement">else</span> {
<span class="synStatement">for</span> (i = b;i &#60;= a;i++) {
sum+= i;
}
}
<span class="synStatement">return</span>(sum);
}
<span class="synType">int</span> main(<span class="synType">void</span>)
{
printf (<span class="synConstant">&#34;</span><span class="synSpecial">%d\n</span><span class="synConstant">&#34;</span>, sumof(<span class="synConstant">10</span>, <span class="synConstant">1</span>));
<span class="synStatement">return</span>(<span class="synConstant"></span>);
}
</pre>
<h4>
演習問題1-5
</h4>
<blockquote title="Amazon.co.jp 新版 C言語によるアルゴリズムとデータ構造: 柴田 望洋, 辻 亮介: 本" cite="https://www.amazon.co.jp/exec/obidos/ASIN/4797331631/simsnes-22/ref=nosim">
<p>
正の整数値を読み込んで、その値の桁数を表示するプログラムを作成せよ。たとえば、135を読み込んだら『その数は3桁です。』と表示し、1314を読み込んだら『その数は4桁です。』と表示すること。
</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>
<ol>
<li>
10 より小さい場合
</li>
<li>
100 より小さい場合
</li>
<li>
1000 より小さい場合
</li>
</ol>
<p>
みたいな感じでやっていく方法しか思いつかなかった。でも、回答のやり方はもっと素敵だった。10で割って、商が0になるまでカウンタをインクリメントすればいい訳か。なるへそー。以下、自分なりにその発想を書いてみた。
</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="synComment">/* i: 桁数カウント用, n: 整数を格納 tmp: 作業用 */</span>
<span class="synType">int</span> i, n, tmp;
puts(<span class="synConstant">&#34;正の整数を入力してね&#34;</span>);
<span class="synComment">/* 正の整数を入力してもらう */</span>
<span class="synStatement">do</span> {
printf (<span class="synConstant">&#34;正の整数: &#34;</span>);
scanf(<span class="synConstant">&#34;</span><span class="synSpecial">%d</span><span class="synConstant">&#34;</span>, &#38;n);
} <span class="synStatement">while</span> (n &#60;= <span class="synConstant"></span>);
tmp = n;
i = <span class="synConstant"></span>;
<span class="synComment">/* 10で割った商が0より大きければ桁+1するよ */</span>
<span class="synStatement">while</span> (tmp &#62; <span class="synConstant"></span>) {
tmp = tmp / <span class="synConstant">10</span>;
i++;
}
printf (<span class="synConstant">&#34;</span><span class="synSpecial">%d</span><span class="synConstant"></span><span class="synSpecial">%d</span><span class="synConstant"> 桁です。</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, n, i);
<span class="synStatement">return</span>(<span class="synConstant"></span>);
}
</pre>
<p>
これの
</p>
<pre class="syntax-highlight">
tmp = tmp / <span class="synConstant">10</span>;
</pre>
<p>
</p>
<pre class="syntax-highlight">
tmp /= <span class="synConstant">10</span>
</pre>
<p>
でも大丈夫らしい。ちなみにputsは自動的に改行コードを挿入して文字列<span class="footnote"><a href="/sirocco634/#f2" name="fn2" title="man putsしたら、stringsと強調してあった">*2</a></span>を表示してくれる命令。printfはフォーマットを指定して表示させる命令という違いがあるらしい。scanfは
</p>
<blockquote>
<p>
The scanf() family of functions scans input according to a format, as described below. This format may contain conversion specifiers; the results from such conversions, if any, are stored through the pointer arguments. The scanf() function reads input from the standard input stream stdin
</p>
</blockquote>
<p>
というそうで、とりあえず変数のアドレスを渡すのが仕様らしい。scanfは
</p>
<pre class="syntax-highlight">
scanf(入力をどのように解釈するか, 格納する変数のアドレス);
</pre>
<p>
というように使うらしい。
</p>
</div>
<div class="footnote">
<p class="footnote">
<a href="/sirocco634/#fn1" name="f1">*1</a>a = 3, b = 5でも、a = 5, b= 3でも結果は変わらないようにする
</p>
<p class="footnote">
<a href="/sirocco634/#fn2" name="f2">*2</a>man putsしたら、string<i>s</i>と強調してあった
</p>
</div>