<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>テクニック 具体的な値を想定 | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/tag/%e3%83%86%e3%82%af%e3%83%8b%e3%83%83%e3%82%af-%e5%85%b7%e4%bd%93%e7%9a%84%e3%81%aa%e5%80%a4%e3%82%92%e6%83%b3%e5%ae%9a/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Tue, 21 Jul 2026 09:45:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.29</generator>
	<item>
		<title>アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/</link>
		<pubDate>Wed, 06 Apr 2022 02:30:17 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6431</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された基 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/">アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、平成 24 年度 春期 問 8 「ビットの検査」を取り上げます。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}.card-panel{margin:1.5em auto;}pre{position:relative;background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}dt{text-align:right;width:5em}dl.inline dd{margin-left:6em}.box-border{position:absolute;padding:2em;border:.2em solid #f06292;}@media screen and (max-width:600px){.width-half-on-large{width:100%}}</style>
<h2>問題に示された具体例を見てプログラムの機能を理解する</h2>
<p>平成 24 年度 春期「ビットの検査」の問題を見てみましょう。 以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。</p>
<table class="responsive-width mag_h30">
<tr>
<th width="50%">平成 24 年度 春期 午後</th>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_pm_qs.pdf#page=35" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_pm_ans.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</table>
<p>この問題の内容は、前半部（設問 1 、設問 2 ）と後半部（設問 3 ）の 2 部構成になっています。</p>
<p>前半部は、 8 ビットの引数 Data の中で、 8 ビットの引数 Mask で指定したビット位置にあるビットの値を検査した結果を返す BitTest 関数です。</p>
<p>後半部は、 8 ビットの引数 Data の中にある 1 の個数を返す BitCount 関数です。</p>
<p>前半部の BitTest 関数のプログラムは、以下に示したように、とてもシンプルであり、プログラムの機能を理解できれば、問題を解けるでしょう。 <span class="u">この前半部で、 50 % の正解を目指す</span>ことにします。</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<pre>
○整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask) 
○整数型: RC         /* 返却値 */
▲ <span class="blank">a</span>
| • RC ← 2         /* 返却値は 2 */
+―――
| ▲ <span class="blank">b</span>
| | • RC ← 0        /* 返却値は 0 */
| +―――
| | • RC ← 1        /* 返却値は 1 */
| ▼
▼
• return RC          /* RC を返却値として返す */
</pre>
</div>
<p>以下は、問題に示された BitTest 関数の説明です。この説明を読んだだけでは、プログラムの機能がよくわかりませんね。</p>
<div class="card-panel">
〔プログラム 1 の説明〕</p>
<p>　整数型関数 BitTest を，次のとおりに宣言する。</p>
<pre>
〇整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask)
</pre>
<p>　検査される 8 ビットのデータは入力用の引数 Data に，検査をするビット位置の情報は入力用の引数 Mask に，それぞれ格納されている。 Mask 中のビットの値が 1 で あるビット位置に対応した Data 中のビットを検査して，次の返却値を返す。ここで， Mask 中には 1 のビットが 1 個以上あるものとする。</p>
<dl class="inline background c-round">
<dt>返却値 0:</dt>
<dd>検査した全てのビットが 0</dd>
<dt>1:</dt>
<dd> 検査したビット中に 0 と 1 が混在</dd>
<dt>2:</dt>
<dd>検査した全てのビットが 1</dd>
</dl>
</div>
<p>おそらく出題者も「説明だけではわからないだろう」と思ったのでしょう。 そこで、説明の後に、以下の具体例を示しています。</p>
<p>この具体例を見れば、プログラムの機能がわかるはずです。</p>
<div class="card-panel">
　例えば，図 1 の例 1 では， Mask のビット番号 7 ～ 5 の 3 ビットが 1 であるので， Data のビット番号 7 ～ 5 の 3 ビットの値を検査し， 0 と 1 が混在しているので返却値 1 を返す。 例 2 では， Mask のビット番号 4 と 0 の 2 ビットが 1 であるので， Data の ビット番号 4 と 0 の 2 ビットの値を検査し，どちらも 1 であるので返却値 2 を返す。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2022/04/h24h_q8_figure_1.jpg" loading="lazy"><figcaption>図 1 　BitTest の実行例</figcaption></figure>
</div>
<p>BitTest 関数は、引数 Mask の中にある 1 の位置で、引数 Data をチェックする桁を指定します。 BitTest 関数は、返却値として、チェックする桁が全て 0 なら 0 を返し、 0 と 1 が混在していれば 1 を返し、全て 1 なら 2 を返します。</p>
<p>このように、<span class="u">問題に具体例が示されているときは、それを見れば、短い時間にプログラムの機能を理解できる</span>ようになっています。 問題に具体例があったら<span class="bold">「ヒントだ！」</span>と思ってください。</p>
<h2>選択肢に示された変数に具体的なデータを想定して考える（設問 1 ）</h2>
<p>プログラムの機能を理解できたので、設問を解いてみましょう。 設問 1 は、 BitTest 関数のプログラムの穴埋めです。 以下に、再度プログラムを掲載します。</p>
<p>空欄 a が真なら返却値を 2 にしています。 したがって、空欄 a は、チェックする桁が全て 1 であることの条件です。<br />
空欄 b が真なら返却値を 0 にしています。 したがって、空欄 b は、チェックする桁が全て 0 であることの条件です。</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<pre>
○整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask) 
○整数型: RC         /* 返却値 */
▲ <span class="blank">a</span>
| • RC ← 2         /* 返却値は 2 */
+―――
| ▲ <span class="blank">b</span>
| | • RC ← 0        /* 返却値は 0 */
| +―――
| | • RC ← 1        /* 返却値は 1 */
| ▼
▼
• return RC          /* RC を返却値として返す */
</pre>
</div>
<p>以下は、空欄 a と空欄 b の選択肢です。</p>
<p>&#8220;&#038;&#8221; は AND 演算（論理積）を意味し、 &#8220;|&#8221; は OR 演算（論理和）を意味しています。 これらは、条件を結ぶ論理演算ではなく、 2 つの 2 進数の対応する桁同士で論理演算をするものです。</p>
<p>それでは、これらの論理演算を使って、チェックする桁が全て 1 であることと、チェックする桁が全て 0 であることは、どうすれば判断できるのでしょうか？</p>
<div class="card-panel pad_bt00">
解答群</p>
<pre>
ア　(Data & Mask) = "00000000" B
イ　(Data & Mask) = Data
ウ　(Data & Mask) = Mask
エ　(Data | Mask) = "00000000" B
オ　(Data | Mask) = Mask
</pre>
</div>
<p>こういうことを頭の中だけで考えていると、どんどん時間が経過してしまいます。 選択肢があるのですから、それらをよく見てください。</p>
<p>どの選択肢でも、行っている論理演算は、 <code class="language-none pad_w05">Data & Mask</code>（ AND 演算）と <code class="language-none pad_w05">Data | Mask</code> （ OR 演算）のいずれかなのですから、 <span class="u">Data と Mask に具体的なデータを想定</span>して考えましょう。 そうすれば、短い時間に正解を選ぶことができます。</p>
<p>&nbsp;</p>
<p>返却値が 2 （チェックする桁が全て 1 である）になる具体例として、問題に示されていた</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 00010001</pre>
<p>を想定してみましょう。</p>
<pre class="mag_h40">
      00110011 Data
AND   00010001 Mask
――――――――――――――――――
      00010001
</pre>
<pre>
      00110011 Data
OR    00010001 Mask
――――――――――――――――――
      00110011
</pre>
<p>以上のように、 AND 演算の結果は 00010001 になり（これは、 Mask と同じであり選択肢ウです）、 OR 演算の結果は 00110011 になります（これは、 Data と同じであり選択肢にありません）。</p>
<p>したがって、選択肢ウが正解です。</p>
<p>返却値が 0 （チェックする桁が全て 0 である）になる具体例は、問題に示されていないので、先ほどの具体例をアレンジして</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 10001000</pre>
<p>を想定してみましょう。</p>
<pre class="mag_tp40">
      00110011 Data
AND   10001000 Mask
――――――――――――――――――
      00000000
</pre>
<pre class="mag_bt40">
      00110011 Data
OR    10001000 Mask
――――――――――――――――――
      10111011
</pre>
<p>以上のように、 AND 演算の結果は 00000000 になり（これは、選択肢アです）、 OR 演算の結果は 10111011 になります（これは、選択肢にありません）。</p>
<p>したがって、選択肢アが正解です。</p>
<h2>具体例を想定してプログラムをトレースする（設問 2 ）</h2>
<p>設問 2 は、 BitTest 関数で引数 Mask を 00000000 （チェックする桁の指定なし）としたときに、返却値として 0 を返すようにするには、プログラムをどのように修正すればよいかという内容です。 変更なしも含めて、以下の 3 つの修正案が示されています。</p>
<p>問題に</p>
<blockquote>
<p class="grey-text">空欄 a と空欄 b には、設問 1 の正しい答えが入っているものとする</p>
</blockquote>
<p>とあるので、ここでは、それぞれの空欄にプログラムを入れてあります。</p>
<div class="card-panel">
<div class="row">
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_one</i> (変更なし) 〕</p>
<pre class="mag_w05">
▲ (Data & Mask) = Mask
| • RC ← 2
+―――
| ▲ (Data & Mask) = "00000000" B
| | • RC ← 0
| +―――
| | • RC ← 1
| ▼
▼
• return RC
</pre>
</div>
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_two</i> 〕</p>
<pre class="mag_w05">
▲ (Data & Mask) = "00000000" B
| • RC ← 0
+―――
| ▲ (Data & Mask) = Mask
| | • RC ← 2
| +―――
| | • RC ← 1
| ▼
▼
• return RC
</pre>
</div>
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_3</i> 〕</p>
<pre class="mag_w05">
• RC ← 2
▲ (Data & Mask) = "00000000" B
| • RC ← 2
▼
▲ (Data & Mask) = Mask
| • RC ← 1
▼
▼
• return RC
</pre>
</div>
</div>
<p>解答群<br />
ア　修正案 <i class="material-icons">looks_one</i>　　<br class="hide-on-med-and-up">イ　修正案 <i class="material-icons">looks_two</i><br />
ウ　修正案 <i class="material-icons">looks_3</i>　　<br class="hide-on-med-and-up">エ　修正案 <i class="material-icons">looks_one</i> 及び <i class="material-icons">looks_two</i><br />
オ　修正案 <i class="material-icons">looks_one</i> 及び <i class="material-icons">looks_3</i>　　<br class="hide-on-med-and-up">カ　修正案 <i class="material-icons">looks_two</i>及び <i class="material-icons">looks_3</i>
</div>
<p>この設問は、<span class="u">具体例を想定してプログラムをトレースすることで、解くことができます</span>。</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 00000000</pre>
<p>を想定してみましょう。</p>
<p class="mag_tp50">〔修正案 <i class="material-icons">looks_one</i> (変更なし) 〕</p>
<pre>
▲ (Data & Mask) = Mask
| • RC ← 2</span>
+―――
| ▲ (Data & Mask) = "00000000" B
| | • RC ← 0
| +―――
| | • RC ← 1
| ▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:.5em;left:2.25em;width:12em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:1em;left:15em;">(Data & Mask) = Mask となり、<br>変数 RC に 2 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:10em;">返却値として 2 が返される</span>
</pre>
<p>〔修正案 <i class="material-icons">looks_two</i> 〕</p>
<pre>
▲ (Data & Mask) = "00000000" B
| • RC ← 0</span>
+―――
| ▲ (Data & Mask) = Mask
| | • RC ← 2
| +―――
| | • RC ← 1
| ▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:.5em;left:2.25em;width:16em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:1em;left:20em;">(Data & Mask) = 00000000 となり、<br>変数 RC に 0 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:10em;">返却値として 0 が返される</span>
</pre>
<p>〔修正案 <i class="material-icons">looks_3</i> 〕</p>
<pre class="mag_bt50">
• RC ← 2
▲ (Data & Mask) = "00000000" B
| • RC ← 2</span>
▼
▲ (Data & Mask) = Mask
| • RC ← 1</span>
▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:2.75em;left:1em;width:18em;padding:2.45em;"></span><span class="box-border" style="top:8.25em;left:1em;width:18em;padding:2.45em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:3em;left:20em;">(Data & Mask) = 00000000 となり、<br>いったん変数 RC に 0 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;top:9em;left:20em;">(Data & Mask) = Mask ともなるので、<br>変数 RC が 2 で上書きされる。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:11em;">返却値として 2 が返される</span>
</pre>
<p>以上のように、修正案 <i class="material-icons">looks_one</i> では、</p>
<pre>Data & Mask = Mask</pre>
<p>となるので、返却値として 2 が返されます。</p>
<p>&nbsp;</p>
<p>修正案 <i class="material-icons">looks_two</i> では、</p>
<pre>Data & Mask = 00000000</pre>
<p>となるので、返却値として 0 が返されます。</p>
<p>&nbsp;</p>
<p>修正案 <i class="material-icons">looks_3</i> では、</p>
<pre>Data & Mask = 00000000</pre>
<p>となるので返却値を格納する変数 RC にいったん 0 が格納されますが、</p>
<pre>Data & Mask = Mask</pre>
<p>も成り立つので変数 RC が 2 で上書きされて、返却値として 2 が返されます。</p>
<p>&nbsp;</p>
<p>したがって、修正案 <i class="material-icons">looks_two</i> だけが正しく動作し、選択肢イが正解です。</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>今回は、</p>
<ul class="background c-round bold">
<li>「問題に示された具体例を見てプログラムの機能を理解する」</li>
<li>「選択肢に示された変数に具体的なデータを想定して考える」</li>
<li>「具体例を想定してプログラムをトレースする」</li>
</ul>
<p>という解き方を紹介しました。</p>
<p>どの解き方にも「具体例」や「具体的」という言葉があります。 これは、<span class="u">他人（出題者）が作ったプログラムを短い時間で読み取るには、とにかく具体例を想定することが重要</span>だからです。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/">アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報技術者試験 午前免除（修了試験）の講評 ～ 2021年6月13日実施</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/report_fe_special_test_202106/</link>
		<pubDate>Mon, 14 Jun 2021 02:37:11 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午前免除試験]]></category>
		<category><![CDATA[試験講評]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=guide&#038;p=5459</guid>
		<description><![CDATA[<p>試験対策講座の講師として、誠に勝手ながら、2021年6月13日（日）に実施された基本情報技術者午前免除試験（修了認定に係る試験）の講評をさせていただきます。今回受験された人は振り返りの題材として、今後受験される人は対策の [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/report_fe_special_test_202106/">基本情報技術者試験 午前免除（修了試験）の講評 ～ 2021年6月13日実施</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>試験対策講座の講師として、誠に勝手ながら、2021年6月13日（日）に実施された基本情報技術者午前免除試験（修了認定に係る試験）の講評をさせていただきます。今回受験された人は振り返りの題材として、今後受験される人は対策の資料として、参考にしていただければ幸いです。</p>
<table class="mag_h40 centered responsive-width">
<thead>
<tr>
<th>実施月</th>
<th>問題</th>
<th>解答</th>
</tr>
</thead>
<tbody>
<tr>
<td>2021 年 6 月</td>
<td><a href="https://www.jitec.ipa.go.jp/1_80tokurei/kakomondai/tokurei_Mondai_20210613_FE.pdf" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_80tokurei/kakomondai/tokurei_ans_20210613_FE.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</tbody>
</table>
<style>table{font-size:.85em}dl.inline dd{margin-left:2em}.italic-text{font-style:italic;font-family:Times;font-weight:600;}.math{height:3em;width:auto;position:relative;top:1em;}.formura{font-size:1.5em; margin:1.5em .5em;overflow:auto;}.upper-roman > li{list-style-type:upper-roman;}@media screen and (max-width:600px){dl:not(.inline) > dd{margin-left:unset}}</style>
<h2>冒頭の難しい問題が目立ったが、難易度はこれまでと同じ</h2>
<p>今回の試験問題の内容も、<span class="bold">ほぼ 100 % が過去問題の再利用</span>でした。したがって、過去問題を数多く練習していれば、きっと合格点が取れたはずです。</p>
<p>冒頭に難しい問題が集中していて、目立ったかもしれませんが、全体的な難易度は、これまでの試験と同じでした。</p>
<p>以下は、今回の試験問題の分類と難易度を A, B, C で示したものです。この難易度は、私の講師経験から、</p>
<ul class="background c-round">
<li>受講者のほぼ全員ができるものを A （やさしい）</li>
<li>半数ぐらいができるものを B （ふつう）</li>
<li>ほとんどができないものを C （むずかしい）</li>
</ul>
<p>としたものです。</p>
<table class="mag_h30 striped block">
<caption class="mag_h10 grey-text">問題の分類と難易度</caption>
<thead>
<tr>
<th>分野</th>
<th>問題番号（難易度）</th>
</tr>
<tr>
  </thead>
<tbody>
<td>情報の基礎理論</td>
<td>問 1 ( B ) 、問 2 ( C ) 、問 3 ( C ) 、問 4 ( B ) 、問 5 ( B ) 、問 6 ( B ) </td>
</tr>
<tr>
<td>アルゴリズム</td>
<td>問 7 ( B ) 、問 8 ( C ) 、問 9 ( B ) 、問 10 ( B ) </td>
</tr>
<tr>
<td>ハードウェア</td>
<td>問 11 ( B ) 、問 12 ( B ) 、問 13 ( B ) 、問 20 ( B ) 、問 21 ( B ) 、問 22 ( B ) </td>
</tr>
<tr>
<td>ソフトウェア</td>
<td>問 14 ( A ) 、問 17 ( B ) 、問 18 ( B ) 、問 19 ( B ) </td>
</tr>
<tr>
<td>システム構成</td>
<td>問 15 ( A ) 、問 16 ( B ) </td>
</tr>
<tr>
<td>マルチメディアとヒューマンインタフェース</td>
<td>問 23 ( B ) 、問 24 ( A ) </td>
</tr>
<tr>
<td>データベース</td>
<td>問 25 ( A ) 、問 26 ( A ) 、問 27 ( A ) 、問 28 ( B ) 、問 29 ( A ) </td>
</tr>
<tr>
<td>ネットワーク</td>
<td>問 30 ( B ) 、問 31 ( B ) 、問 32 ( B ) 、問 33 ( A ) 、問 34 ( B ) </td>
</tr>
<tr>
<td>セキュリティ</td>
<td>問 35 ( A ) 、問 36 ( B ) 、問 37 ( B ) 、問 38 ( B ) 、問 39 ( A ) 、問 40 ( A ) 、問 41 ( B ) 、問 42 ( A ) 、問 43 ( A ) 、問 44 ( B ) </td>
</tr>
<tr>
<td>開発技術</td>
<td>問 45 ( A ) 、問 46 ( A ) 、問 47 ( A ) 、問 48 ( B ) 、問 49 ( A ) 、問 50 ( A ) </td>
</tr>
<tr>
<td>マネジメント系</td>
<td>問 51 ( A ) 、問 52 ( B ) 、問 53 ( B ) 、問 54 ( B ) 、問 55 ( B ) 、問 56 ( B ) 、問 57 ( B ) 、問 58 ( A ) 、問 59 ( B ) 、問 60 ( A ) </td>
</tr>
<tr>
<td>ストラテジ系</td>
<td>問 61 ( B ) 、問 62 ( B ) 、問 63 ( A ) 、問 64 ( B ) 、問 65 ( B ) 、問 66 ( A ) 、問 67 ( B ) 、問 68 ( B ) 、問 69 ( B ) 、問 70 ( B ) 、問 71 ( B ) 、問 72 ( B ) 、問 73 ( A ) 、 問 74 ( A ) 、 問 75 ( A ) 、問 76 ( A ) 、問 77 ( C ) 、問 78 ( B ) 、問 79 ( B ) 、問 80 ( A ) </td>
</tr>
</tbody>
</table>
<p><span class="grey-text small-text">※マネジメント系とストラテジ系は、全体で 1 つの分野にしています。</span></p>
<p>全80問の難易度を集計すると、</p>
<p>A が 28 問、<br />
B が 48 問、<br />
C が 4 問</p>
<p>です。</p>
<p>A が 90 % できて、 B が 50 % できて、 C が 25 % できる（四択問題なので最低でも 25 % できます）とすれば、 1 問が 1.25 点なので、得点の期待値は、</p>
<p>1.25 点 × ( 28 × 0.9 ＋ 48 × 0.5 ＋ 4 × 0.25 )<br />
＝ 62.75 点</p>
<p>になり、ギリギリですが合格点の 60 点を超えています。</p>
<p>以下は、近年の午前免除試験の得点の期待値です。今回の 62.75 点という期待値は、これまでの試験と同じです。</p>
<table class="inline-block centered responsive-width">
<caption class="grey-text mag_h10">近年の午前免除試験の得点の期待値</caption>
<thead>
<tr>
<th>試験実施日</th>
<th>難易度A</th>
<th>難易度B</th>
<th>難易度C</th>
<th>得点の期待値</th>
</tr>
</thead>
<tbody>
<tr>
<th class="block">2020 年 1 月 16 日（日）</th>
<td>30 問</td>
<td>41 問</td>
<td>9 問</td>
<td>62.19 点</td>
</tr>
<tr>
<th class="block">2020 年 6 月 14 日（日）</th>
<td>19 問</td>
<td>52 問</td>
<td>9 問</td>
<td>63.75 点</td>
</tr>
<tr>
<th class="block">2020 年 7 月 26 日（日）</th>
<td>20 問</td>
<td>50 問</td>
<td>10 問</td>
<td>63.75 点</td>
</tr>
<tr>
<th class="block">2020 年 12 月 13 日（日）</th>
<td>28 問</td>
<td>48 問</td>
<td>4 問</td>
<td>62.75 点</td>
</tr>
<tr>
<th class="block">2021 年 1 月 24 日（日）</th>
<td>30 問</td>
<td>41 問</td>
<td>9 問</td>
<td>62.19 点</td>
</tr>
<tr>
<th class="block">2021 年 6 月 13 日（日）</th>
<td>28 問</td>
<td>48 問</td>
<td>4 問</td>
<td>62.75 点</td>
</tr>
</tbody>
</table>
<h2>見たことがない問題でも、知識を総動員すれば何とかなる</h2>
<p>試験問題の内容は、ほぼ 100 % が過去問題の再利用なのですが、<span class="u">毎回 2 ～ 3 問くらいは「こんな問題を見たことがない！」という問題もあります</span>。それらは、基本情報技術者試験ではなく、他の試験区分の過去問題だからです。</p>
<p>今回の試験では、以下の問題です。問 8 と問 34 は、応用情報技術者試験の過去問題です。問 38 は、情報セキュリティマネジメント試験の過去問題です。</p>
<div class="card-panel mag_h30">
問 8<br />
自然数をキーとするデータを，ハッシュ表を用いて管理する。キー <span class="italic-text">x</span> のハッシュ 関数 <span class="italic-text">h(x)</span> を</p>
<div class="mag_lt10 italic-text">h(x) = x mod n</div>
<p>とすると，任意のキー <span class="italic-text">a</span> と <span class="italic-text">b</span> が衝突する条件はどれか。ここで， <span class="italic-text">n</span> はハッシュ表の 大きさであり， <span class="italic-text">x mod n</span> は <span class="italic-text">x</span> を <span class="italic-text">n</span> で割った余りを表す。</p>
<p>ア　<span class="italic-text">a + b</span> が <span class="italic-text">n</span> の倍数　　<br class="hide-on-med-and-up">イ　<span class="italic-text">a &#8211; b</span> が <span class="italic-text">n</span> の倍数<br />
ウ　<span class="italic-text">n</span> が <span class="italic-text">a + 6</span> の倍数　　<br class="hide-on-med-and-up">エ　<span class="italic-text">n</span> が <span class="italic-text">a &#8211; b</span> の倍数
</div>
<div class="card-panel mag_h30">
問 34<br />
TCP/IP ネットワークにおける RARP の機能として，適切なものはどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>IP パケットが通信先の IP アドレスに到達するかどうかを調べる。</dd>
<dt>イ</dt>
<dd>MAC アドレスから IP アドレスを求める。</dd>
<dt>ウ</dt>
<dd>ドメイン名とホスト名から IP アドレスを求める。</dd>
<dt>エ</dt>
<dd>プライベート IP アドレスとグローバル IP アドレスを相互に変換する。</dd>
</dl>
</div>
<div class="card-panel mag_h30">
問 38<br />
リバースブルートフォース攻撃に該当するものはどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>攻撃者が何らかの方法で事前に入手した利用者 ID とパスワードの組みのリストを使用して，ログインを試行する。</dd>
<dt>イ</dt>
<dd>パスワードを一つ選び、利用者 ID として次々に文字列を用意して総当たりにログインを試行する。</dd>
<dt>ウ</dt>
<dd>利用者 ID，及びその利用者 ID と同一の文字列であるパスワードの組みを次々に生成してログインを試行する。</dd>
<dt>エ</dt>
<dd>利用者 ID を一つ選び、パスワードとして次々に文字列を用意して総当たりにログインを試行する。</dd>
</dl>
</div>
<p><span class="u">基本情報技術者試験の午前免除試験を受けるために、他の試験区分の過去問題まで練習する必要はありません</span>。したがって、この手の問題は、対処のしようがありません。</p>
<p>ただし、基本情報技術者試験の過去問題の練習で得た知識を総動員すれば、正解できる場合も多々あります。「見たことないからできない」とあきらめずに、<span class="bold">「見たことないけれど何とかしよう」</span>と思ってください。</p>
<p>以下に、何とかする例を示します。</p>
<div class="background c-round">
<p class="bold">問 8 を何とかする</p>
<p>数学的に答えを導くのではなく、 a と b と n に<span class="u">シンプルな具体例を想定して、それが成り立つ選択肢を選べば解けます</span>。<br />
ここでは、 n に 3 を想定します。そして、 a mod 3 と b mod 3 が衝突する（同じ値になる）具体例として、 </p>
<p>a に 10  ( 10 mod 3 = 1 ) 、<br />
b に 4 ( 4 mod 3 = 1 ) </p>
<p>を想定します。</p>
<p>これらの具体例を選択肢に当てはめると、以下のようになります。</p>
<dl class="inline">
<dt>ア</dt>
<dd>10 + 4 が 3 の倍数　・・・成り立たない</dd>
<dt>イ</dt>
<dd>10 &#8211; 4 が 3 の倍数　・・・成り立つ</dd>
<dt>ウ</dt>
<dd>3 が 10 + 4 の倍数　・・・成り立たない</dd>
<dt>エ</dt>
<dd>3 が 10 &#8211; 4 の倍数　・・・成り立たない</dd>
</dl>
<p>成り立つのは、選択肢イだけなので、選択肢イが正解です。もしも、想定した具体例で答えを 1 つに絞り込めない場合は、別の具体例を想定してください。
</p></div>
<div class="background c-round">
<p class="bold">問 34 を何とかする</p>
<p>基本情報技術者試験の過去問題を練習していれば、「 ARP 」というネットワーク用語に関する問題に遭遇したことがあるでしょう。</p>
<p>ARP（ Address Resolution Protocol 、アープ）は、 IP アドレスから MAC アドレスを求めます。</p>
<p>この問題は、</p>
<blockquote><p>TCP/IP ネットワークにおける</p></blockquote>
<p>と言っているので、「 RARP 」という聞いたことがない用語は、ネットワーク用語であり、おそらく ARP に関連したものでしょう。そう考えて、選択肢を見てみましょう。</p>
<p>選択肢イの<span class="u">「 MAC アドレスから IP アドレスを求める」は、 ARP と逆の機能</span>です。ここで「 R は、 Reverse = 逆、という意味だ！」とピンと来るはずです。選択肢イを選んでください。それで、正解です。
</div>
<div class="background c-round">
<p class="bold">問 38 を何とかする</p>
<p>この問題を何とかする方法も、問 34 と同様です。基本情報の過去問題を練習していれば、セキュリティの分野で「ブルートフォース攻撃」という用語に関する問題に遭遇したことがあるでしょう。</p>
<p>ブルートフォース（ brute force = 力任せ）攻撃は、様々な文字列をパスワードとして試行することを繰り返して、不正アクセスを行う攻撃です。</p>
<p>この問題の「リバースブルートフォース攻撃」は、ブルートフォースに「リバース（ reverse = 逆）」という言葉が付いています。<span class="u">ブルートフォースの「逆」と考えて、選択肢を見る</span>と、選択肢イの</p>
<blockquote><p>パスワードを一つ選び、利用者 ID として次々に文字列を用意して総当たりにログインを試行する</p></blockquote>
<p>が正解だとわかります。
</p></div>
<p><span class="chip">解答</span>　問 8 － イ　　問 34 － イ　　問 38 － イ</p>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/テクニック 具体的な値を想定/" class="tag mag_rt05">テクニック 具体的な値を想定</a>
</div>
<h2>難しくて奇抜な過去問題であっても、きちんと練習しておこう</h2>
<p>基本情報技術者試験の過去問題を練習していると、「こんな難しくて奇抜な問題は、何度も出ないだろう」と思う問題に遭遇することがあります。ところが、そういう問題であっても、出題されることがあるのです。</p>
<p>今回の試験では、以下の問題です。</p>
<div class="card-panel mag_h30">
問 2</p>
<p><span style="vertical-align: middle;">a 及び b を定数とする関数 <img class="math mag_w05" src="../../wp-content/uploads/2019/10/function_f.jpg"> 及び <img class="math mag_w05" src="../../wp-content/uploads/2019/10/function_g.jpg"> に対して，<img class="math mag_w05" src="../../wp-content/uploads/2019/10/limit.jpg"> はどれか。ここで，a ≠ 0，b ≠ 0，t > 1 とする。</span></p>
<p><span style="vertical-align: middle;">ア　0　　イ　1　　<br class="hide-on-med-and-up">ウ　<img class="math mag_w05" src="../../wp-content/uploads/2019/10/mfrac.jpg">　　エ　∞</span>
</div>
<div class="card-panel mag_h30">
問 3</p>
<p>関数 <span class="italic-text">f(x)</span> は，引数も戻り値も実数型である。この関数を使った， 1. ~ 5. から成る手続を考える。手続の実行を開始してから 2. ~ 5. を十分に繰り返した後に， 3. で表示される <span class="italic-text">y</span> の値に変化がなくなった。このとき成立する関係式はどれか。</p>
<ol class="mag_lt10">
<li><span class="italic-text">x  ← a</span></li>
<li><span class="italic-text">y ← f(x)</span></li>
<li><span class="italic-text">y</span> の値を表示する。</li>
<li class="italic-text">x ← y</li>
<li>2. に戻る。</li>
</ol>
<p>ア　<span class="italic-text">f(a) = y</span>　　イ　<span class="italic-text">f(y) = 0</span>　　<br class="hide-on-med-and-up">ウ　<span class="italic-text">f(y) = a</span>　　エ　<span class="italic-text">f(y) = y</span>
</div>
<div class="card-panel mag_h30">
問 22</p>
<p>家庭用の 100 V 電源で動作し，運転中に 10 A の電流が流れる機器を，図のとおりに 0 分から 120 分まで運転した。このとき消費する電力量は何 Wh か。ここで，電圧及び電流の値は実効値であり、停止時に電流は流れないものとする。また、力率は 1 とする。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/06/q22_figure.jpg" loading="lazy"><br />
</figure>
<p>ア　1,000　　イ　1,200　　ウ　1,500　　エ　2,000
</p></div>
<p>過去問題は、「難しいか易しいか」「奇抜か普通か」に関わらず、同じ問題が何度も出題されます。<span class="u">難しくて奇抜な過去問題であっても、きちんと練習</span>しておきましょう。それが、確実に得点をアップする秘訣です。</p>
<p>自分で解き方がわからなくても、過去問題であれば、インターネットを検索すれば、解き方を示した記事が見つかるはずです。この記事も、その 1 つですから、解き方を示しておきましょう。</p>
<div class="background c-round">
<p class="bold">問 2 の解き方</p>
<p>以下の手順を何度も繰り返し練習して、丸暗記ではなく、納得して覚えてください。</p>
<p><span class="chip mag_rt05 indigo white-text">手順 1</span>g(t) / f(t)に、それぞれの関数の計算式を入れて、式を整理します。</p>
<p class="hide-on-med-and-up mag_h20 small-text grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>スマートフォンでご覧の場合、数式は横スクロールで表示できます</p>
<div class="formura">
<math><mfrac><mrow><mi>f</mi><mfenced><mi>t</mi></mfenced></mrow><mrow><mi>g</mi><mfenced><mi>t</mi></mfenced></mrow></mfrac><mo>=</mo><mfrac><mrow><mfrac bevelled="true"><mi>b</mi><mrow><mo>(</mo><msup><mi>t</mi><mn>2</mn></msup><mo>&#8211;</mo><mi>t</mi><mo>)</mo></mrow></mfrac></mrow><mrow><mfrac bevelled="true"><mi>a</mi><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></mfrac></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>b</mi><mo>･</mo><mo>(</mo><mi>t</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mrow><mi>a</mi><mo>･</mo><mo>(</mo><msup><mi>t</mi><mn>2</mn></msup><mo>&#8211;</mo><mi>t</mi><mo>)</mo></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>bt</mi><mo>+</mo><mi>b</mi></mrow><mrow><msup><mi>at</mi><mn>2</mn></msup><mo>&#8211;</mo><mi>at</mi></mrow></mfrac></math>
</div>
<p><span class="chip mag_rt05 indigo white-text">手順 2</span>この式のまま、t → ∞ にすると、 ∞ / ∞ になります。これは、値の定まらない「不定形」です。選択肢には、不定形がありません。</p>
<div class="formura">
<math><mfrac><mrow><mi>b</mi><mi>t</mi><mo>+</mo><mi>b</mi></mrow><mrow><mi>a</mi><msup><mi>t</mi><mn>2</mn></msup><mo>&#8211;</mo><mi>a</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>b</mi><mo>･</mo><mn>&#x221e;<!--INFINITY--></mn><mo>+</mo><mi>b</mi></mrow><mrow><mi>a</mi><mo>･</mo><msup><mn>&#x221e;<!--INFINITY--></mn><mn>2</mn></msup><mo>&#8211;</mo><mi>a</mi><mo>･</mo><mn>&#x221e;<!--INFINITY--></mn></mrow></mfrac><mo>=</mo><mfrac><mn>&#x221e;<!--INFINITY--></mn><mn>&#x221e;<!--INFINITY--></mn></mfrac></math>
</div>
<p><span class="chip mag_rt05 indigo white-text">手順 3</span>そこで、分母にある項の最大次数である t<sup>2</sup> で、分母と分子を割って、式を整理します。</p>
<div class="formura">
<math><mfrac><mrow><mi>b</mi><mi>t</mi><mo>+</mo><mi>b</mi></mrow><mrow><mi>a</mi><msup><mi>t</mi><mn>2</mn></msup><mo>&#8211;</mo><mi>a</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mfrac bevelled="true"><mrow><mo>(</mo><mi>bt</mi><mo>+</mo><mi>b</mi><mo>)</mo></mrow><mrow><msup><mi>t</mi><mn>2</mn></msup></mrow></mfrac></mrow><mrow><mfrac bevelled="true"><mrow><mo>(</mo><msup><mi>at</mi><mn>2</mn></msup><mo>&#8211;</mo><mi>at</mi><mo>)</mo></mrow><mrow><msup><mi>t</mi><mn>2</mn></msup></mrow></mfrac></mrow></mfrac><mo>=</mo><mfrac><mrow><mrow><mfrac bevelled="true"><mi>b</mi><mi>t</mi></mfrac></mrow><mo>+</mo><mfrac bevelled="true"><mi>b</mi><msup><mi>t</mi><mn>2</mn></msup></mfrac></mrow><mrow><mi>a</mi><mo>&#8211;</mo><mrow><mfrac bevelled="true"><mi>a</mi><mi>t</mi></mfrac></mrow></mrow></mfrac></math>
</div>
<p><span class="chip mag_rt05 indigo white-text">手順 4</span>この式で、t → ∞ にすると、</p>
<p>b / t = b / ∞ = 0 ,<br />
b / t<sup>2</sup> = b / ∞<sup>2</sup> = 0 ,<br />
a / t = a / ∞ = 0</p>
<p>になるので、式のそれぞれの部分を 0 に置き換えて、式を整理します。</p>
<div class="formura">
<math><mfrac><mrow><mfrac bevelled="true"><mi>b</mi><mi>t</mi></mfrac><mo>+</mo><mfrac bevelled="true"><mi>b</mi><msup><mi>t</mi><mn>2</mn></msup></mfrac></mrow><mrow><mi>a</mi><mo>&#8211;</mo><mfrac bevelled="true"><mi>a</mi><mi>t</mi></mfrac></mrow></mfrac><mo>=</mo><mfrac><mrow><mn>0</mn><mo>+</mo><mn>0</mn></mrow><mrow><mi>a</mi><mo>&#8211;</mo><mn>0</mn></mrow></mfrac><mo>=</mo><mfrac><mn>0</mn><mi>a</mi></mfrac></math>
</div>
<p><span class="chip mag_rt05 indigo white-text">手順 5</span>0 / aという式になりました。 a ≠ 0 なのですから、 0 / a = 0 です。したがって、選択肢アが正解です。
</div>
<div class="background c-round">
<p class="bold">問 3 の解き方</p>
<p>この問題は、関数 <span class="italic-text">f(x)</span> の処理内容が示されていないので、具体例を想定して解くことはできません。正解は、選択肢エの <span class="italic-text">f(y) = y</span> なのですが、どうしてそうなるのか、以下に理由を示しますので、これも、丸暗記ではなく、納得して覚えてください。</p>
<p><span class="chip mag_rt05 indigo white-text">理由</span>2. ~ 5. を繰り返すと、</p>
<ol class="upper-roman">
<li><span class="italic-text">f(x)</span> の戻り値を求める</li>
<li>その値を表示</li>
<li>その値を引数として <span class="italic-text">f(x)</span> を呼び出す</li>
</ol>
<p>となります。</p>
<p>2. ~ 5. を十分に繰り返して、 <span class="italic-text">f(x)</span> の戻り値が変化しなくなったのですから、 <span class="italic-text">f(x)</span> の戻り値が <span class="italic-text">x</span> と同じ値になったのです。したがって、 <span class="italic-text">f(x)＝x</span> です。</p>
<p>選択肢には、 <span class="italic-text">f(x) = x</span> がありませんが、<span class="u">選択肢エの <span class="italic-text">f(y) = y</span> が同じ意味</span>なので、選択肢エが正解です。
</div>
<div class="background c-round">
<p class="bold">問 22 の解き方</p>
<p>電力量に関しては、中学の理科の時間に教わったはずですが、忘れている人も多いでしょう。以下に、説明を示しますので、思い出してください。</p>
<dl>
<dt class="chip indigo white-text">電力とは？</dt>
<dd>電力 = 電圧 × 電流 であり、 W (ワット) という単位で示します。</dd>
<dt class="chip indigo white-text mag_tp10">電力量とは？</dt>
<dd>電力量 = 電力 × 時間 であり、 Wh (ワットアワー) という単位で示します。</dd>
</dl>
<p>思い出したら、問題を解けるでしょう。</p>
<p>電圧が 100 V で電流が 10 A なのですから、電力は、</p>
<p>100 V × 10 A = 1000 W</p>
<p>です。問題に示された図を見ると、全部で</p>
<p>90 分間 = 1.5 時間 = 1.5 h</p>
<p>だけ機器を運転しています。したがって、電力量は、</p>
<p>1000 W × 1.5 h = 1500 Wh</p>
<p>であり、選択肢ウが正解です。問題文に示された実効値や力率は、このような単純な計算で OK とするための補足なので、気にする必要はありません。
</p></div>
<p><span class="chip">解答</span>　問 2 － ア　　問 3 － エ　　問 22 － ウ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p>以上、試験対策講座の講師として、誠に勝手ながら、試験問題の講評をさせていただきました。</p>
<p>無事に合格できた人は、ここで手を抜かずに、午後試験の学習を始めてください。</p>
<p>残念な結果になってしまった人は、ここで気落ちせずに、次の午前免除試験の合格を目指してください。</p>
<p>皆様のご健闘をお祈り申し上げます！</p>
<p>&nbsp;</p>
<p><script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script></p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/report_fe_special_test_202106/">基本情報技術者試験 午前免除（修了試験）の講評 ～ 2021年6月13日実施</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>具体的な値を入れるとプログラムがわかる練習問題｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_instant_value/</link>
		<pubDate>Sun, 23 Aug 2020 23:30:20 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[2進数]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=patterns_algorithms&#038;p=4442</guid>
		<description><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。 苦手を克服するには [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_instant_value/">具体的な値を入れるとプログラムがわかる練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。</p>
<p>苦手を克服するには、短いプログラムを何度も練習して、穴埋めに慣れることが重要です。</p>
<p>そのために、実際の試験問題の一部をアレンジした練習問題を作りました。とても短い問題ですので、気軽に取り組んでください。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}pre{background:#263238;color:#eceff1;border-radius:unset;font-size:1em;line-height:1.8;position:relative;margin:auto -7.5%;padding:1em 7.5%;}.card-panel>pre{margin:1em -24px;padding:1em 24px;border-radius:unset}.table-container{padding:1.5em 1em}table{font-size:.85em;}@media screen and (min-width:601px){.responsive-width{width:60%}}dl.inline dd{margin-left:2em}.comment{position:absolute;padding:.5em;color:#f44336;background:#fff;font-size:.9em;box-shadow:rgba(0,0,0,.05) 0 4px 12px 0;z-index:3}@media only screen and (max-width:600px){ol{padding-left:1em}.table-container{padding:unset}caption{text-align:left}}</style>
<h2>練習問題</h2>
<div class="card-panel">
問 4　「 M 進数字列を N 進数字列に基数変換するプログラム」（平成 16 年度 秋期 午後）を一部改変</p>
<p>　RadixConv 関数は、 M 進数字列（ 2 ≦ M ≦ 16 ）を、 N 進数字列（ 2 ≦ N ≦ 16 ）に基数変換するプログラムである。</p>
<ol>
<li>M 進数字列および N 進数字列は、数字を表す文字だけで構成され、空白文字は含まない。 11 ～ 16 進数の 10 以上の数字には、 &#8220;A&#8221; ～ &#8220;F&#8221; のアルファベットを用いる。</li>
<li>RadixConv 関数は、 M 進数字列を整数値に変換した後、その整数値を N 進数字列に変換する。その際に、 M 進数字列を整数値に変換する MToInt 関数と、整数値を N 進数字列に変換する IntToN 関数を使う。</li>
<li>MToInt 関数と IntToN 関数は、数字を整数に変換して返す ToInt 関数、整数値を数字に変換する ToStr 関数、文字列の長さを返す Length 関数、および文字列の一部を切り出して返す SubStr 関数を使う。</li>
<li>このプログラムで使われる関数の引数と戻り値の仕様を表 1 ～ 7 に示す。</li>
</ol>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 1　RadixConv 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>Frdx</td>
<td>整数型</td>
<td>変換元の数字列の基数<br class="hide-on-med-and-up">（ 2 ≦ Frdx ≦ 16 ）</td>
</tr>
<tr>
<td>Fnum</td>
<td>文字列</td>
<td>変換元の数字列</td>
</tr>
<tr>
<td>Trdx</td>
<td>整数型</td>
<td>変換後の数字列の基数<br class="hide-on-med-and-up">（ 2 ≦ Trdx ≦ 16 ）</td>
</tr>
<tr>
<td>戻り値</td>
<td>文字列型</td>
<td>変換後の数字列</td>
</tr>
</table>
</div>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 2　MToInt 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>Rdx</td>
<td>整数型</td>
<td>変換元の数字列の基数<br class="hide-on-med-and-up">（ 2 ≦ Rdx ≦ 16 ）</td>
</tr>
<tr>
<td>Num</td>
<td>文字列型</td>
<td>変換元の数字列</td>
</tr>
<tr>
<td>戻り値</td>
<td>整数型</td>
<td>変換後の整数</td>
</tr>
</table>
</div>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 3　IntToN 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>Val</td>
<td>整数型</td>
<td>変換元の整数</td>
</tr>
<tr>
<td>Rdx</td>
<td>整数型</td>
<td>変換後の数字列の基数<br class="hide-on-med-and-up">（ 2 ≦ Rdx ≦ 16 ）</td>
</tr>
<tr>
<td>戻り値</td>
<td>文字列型</td>
<td>変換後の数字列</td>
</tr>
</table>
</div>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 4　ToInt 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>P</td>
<td>文字型</td>
<td>変換元の数字（ &#8220;0&#8221;, &#8220;1&#8221;, …, &#8220;F&#8221; ）</td>
</tr>
<tr>
<td>戻り値</td>
<td>整数型</td>
<td>変換後の整数</td>
</tr>
</table>
</div>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 5　ToStr 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>Q</td>
<td>整数型</td>
<td>変換元の整数（ 0 ≦ Q ≦ 15 ）</td>
</tr>
<tr>
<td>戻り値</td>
<td>文字型</td>
<td>変換後の数字</td>
</tr>
</table>
</div>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 6　Length 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>S</td>
<td>文字列型</td>
<td>長さを求める文字列</td>
</tr>
<tr>
<td>戻り値</td>
<td>整数型</td>
<td>文字列の長さ</td>
</tr>
</table>
</div>
<div class="table-container">
<table class="striped responsive-width">
<caption>表 7　SubStr 関数</caption>
<thead>
<tr>
<th>引数／<br class="hide-on-med-and-up">戻り値</th>
<th>データ型</th>
<th>意味</th>
</tr>
</thead>
<tr>
<td>S</td>
<td>文字列型</td>
<td>切り出し元の文字列</td>
</tr>
<tr>
<td>Idx</td>
<td>整数型</td>
<td>切り出しを始める位置（先頭を 1 とする）</td>
</tr>
<tr>
<td>N</td>
<td>整数型</td>
<td>切り出す文字数</td>
</tr>
<tr>
<td>戻り値</td>
<td>文字列型</td>
<td>S の先頭から Idx の位置から N 文字を返す</td>
</tr>
</table>
</div>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<p>［プログラム］</p>
<pre>
◯文字列型: RadixConv(整数型: Frdx, 文字列型: Fnum, 整数型: Trdx)
  return IntToN(MToInt(Frdx, Fnum), Trdx)

◯整数型: MToInt(整数型: Rdx, 文字列型: Num)
  整数型: Idx, Val
  Val ← 0

  for (Idx を 1 から Length(Num) 以下まで 1 つずつ増加)
    Val ← <span class="blank">a</span> + ToInt(Substr(Num, Idx, 1))
  endfor

  return Val

◯文字列型: IntToN(整数型: Val, 整数型: Rdx)
  整数型: Quo	/* 商 */
  整数型: Rem	/* 剰余 */
  文字列型: Num  

  <span class="blank mag_lt00">b</span>
  Num ← ""

  while (Quo が Rdx 以上)
    Rem ← Quo mod Rdx
    Num ← ToStr(Rem) + Num  /* + は文字列を連結する演算子 */
    <span class="blank mag_lt00">c</span>
  endwhile

  <span class="blank mag_lt00">d</span>
  return Num
</pre>
<p class="small-text grey-text mag_bt30"><i class="material-icons yellow-text mag_rt05">add_alert</i>注　ToInt 関数、ToStr 関数、Length 関数、SubStr 関数のプログラムは示さないが、正しく作成されているとする。</p>
<p>設問　プログラム中の<span class="blank"></span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群<br />
ア　Rdx<br />
イ　Val<br />
ウ　Val × Rdx<br />
エ　Val ÷ Rdx</p>
<p>b ～ d に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>Quo ← Quo ÷ Rdx</dd>
<dt>イ</dt>
<dd>Quo ← Quo ÷ Rem</dd>
<dt>ウ</dt>
<dd>Quo ← Rdx</dd>
<dt>エ</dt>
<dd>Quo ← Rem ÷ Rdx</dd>
<dt>オ</dt>
<dd>Quo ← Val</dd>
<dt>カ</dt>
<dd>Rem ← Rdx</dd>
<dt>キ</dt>
<dd>Rem ← Val</dd>
<dt>ク</dt>
<dd>Num ← ToStr(Quo) + Num</dd>
<dt>ケ</dt>
<dd>Num ← ToStr(Rem) + Num</dd>
</dl>
</div>
<h2>ポイント1: 自分にわかりやすい具体例を想定する</h2>
<p>RadixConv 関数は、 M 進数字列を N 進数字列に基数変換するプログラムですが、 M と N のままではプログラムを読むことはできません。</p>
<p class="bold">M と N に、自分に分かりやすい具体例を想定してください。</p>
<p>ここでは以下のように想定します。</p>
<ul class="background c-round">
<li>M = 10, N = 2 として、 10 進数字列を 2 進数字列に変換すること</li>
<li>具体的な数字列として、 &#8220;12&#8221; という 10 進数字列を &#8220;1100&#8221; という 2 進数字列に変換する</li>
</ul>
<p>これらの想定によって、 RadixConv 関数は、以下の処理を行うことになります。</p>
<p class="grey-text">図　RadixConv 関数が行う処理の具体例</p>
<pre class="pad_h40">
◯文字列型: RadixConv(整数型: <span class="red-text">Frdx</span>, 文字列型: <span class="red-text">Fnum</span>, 整数型: <span class="red-text">Trdx</span>)
  <span class="red-text">return</span> IntToN(MToInt(<span class="red-text">Frdx</span>, <span class="red-text">Fnum</span>), <span class="red-text">Trdx</span>)
<span class="comment" style="top:.6em;left:21em;">10</span><span class="comment" style="top:.6em;left:30em;">"12"</span><span class="comment" style="top:.6em;left:39em;">2</span><span class="comment" style="bottom:2.5em;left:4em;">戻り値 "1100"</span><span class="comment" style="bottom:2.5em;left:17em;">10</span><span class="comment" style="bottom:2.5em;left:21em;">"12"</span><span class="comment" style="bottom:2.5em;left:26em;">2</span>
</pre>
<p>これで、プログラムの内容を読めるはずです。同じ具体例を想定して、他の関数のプログラムも読んでみましょう。</p>
<h2>ポイント2: 具体例で処理内容を理解し、選択肢をヒントにして穴埋めをする</h2>
<p>まず、空欄 a がある MToInt 関数です。 MToInt 関数は、数字列を数値に変換して返します。</p>
<p>想定した具体例で、プログラムを読んでみましょう。</p>
<p>ここでは、<br />
Rdx = 10 進数の数字列 Num = &#8220;12&#8221; を、<br />
Val = 12 という整数値に変換<br />
して返すことを想定します。</p>
<p class="grey-text">図　MToInt 関数が行う処理の具体例</p>
<pre class="pad_h50">
◯MToInt(整数型: <span class="red-text">Rdx</span>, 文字列型: <span class="red-text">Num</span>)
  整数型: Idx, Val
  Val ← 0

  for (Idx を 1 から <span class="red-text">Length(Num)</span> 以下まで 1 つずつ増加)
    Val ← <span class="blank">a</span> + <span class="red-text">ToInt(Substr(Num, Idx, 1))</span>
  endfor

  return <span class="red-text">Val</span>
<span class="comment" style="top:1em;left:13em;">10</span><span class="comment" style="top:1em;left:22em;">"12"</span><span class="comment" style="top:9em;left:17em;">2</span><span class="comment" style="top:16em;left:18em;">"12" の先頭から 1 文字ずつ取り出し、それを整数に変換する</span><span class="comment" style="top:21.5em;left:9em;">変換後の 12 を返す</span>
</pre>
<p>この想定では、 Length(Num) は 2 です。したがって、 Idx をループカウンタとした繰り返しは、 Idx を 1, 2 と変化させて繰り返します。</p>
<p>繰り返しの中にある</p>
<pre>Substr(Num, Idx, 1)</pre>
<p>は、 &#8220;12&#8221; の先頭から 1 文字ずつ &#8220;1&#8221;, &#8220;2&#8221; を取り出します。</p>
<p>そして、 </p>
<pre>ToInt(Substr(Num, Idx, 1))</pre>
<p>は、 &#8220;1&#8221;, &#8220;2&#8221; という数字を、 1, 2 という数値に変換します。関数は、 12 という戻り値を返すので、空欄 a がある</p>
<pre>Val ← <span class="blank">a</span>+ ToInt(Substr(Num, Idx, 1))</pre>
<p> は、 1, 2 から 12 を作り出し、それを Val に格納する処理です。</p>
<p>&nbsp;</p>
<p>それでは、どうすれば 1, 2 から 12 を作り出せるでしょう。</p>
<p>もしも、手順が思い浮かばないなら、選択肢を見てください。選択肢の中に必ず正解があるのですから、選択肢を見れば「あっ、これだ！」と気付くはずです。</p>
<blockquote>
<p class="blue-grey-text">a に関する解答群<br />
ア　Rdx<br />
イ　Val<br />
ウ　Val × Rdx<br />
エ　Val ÷ Rdx</p>
</blockquote>
<p>1, 2 から 12 を作り出すには、 1 を 10 倍して、それに 2 を足せばよいのです。つまり、</p>
<pre>Val ← <span class="blank">a</span>+ ToInt(Substr(Num, Idx, 1))</pre>
<p>の部分が、</p>
<pre>Val ← [Val × 10] + 2</pre>
<p>になればよいのです。ここでは、 Rdx = 10 を想定しているので、これに該当するのは、 Val × Rdx （選択肢ウ）です。</p>
<h2>ポイント3: 具体的な場面を想定して穴埋めを行う</h2>
<p>今度は、空欄 b, 空欄 c, 空欄 d がある IntToN 関数です。 IntToN 関数は、整数値を数字列に変換して返します。</p>
<p>想定した具体例で、プログラムを読んでみましょう。ここでは、<br />
Val = 12 という整数値を、<br />
Rdx = 2 進数の数字列 Num = &#8220;1100&#8221; に変換<br />
して返すことを想定します。</p>
<pre class="pad_h40 mag_h30">
◯文字列型: IntToN(整数型: <span class="red-text">Val</span>, 整数型: <span class="red-text">Rdx</span>)
  整数型: Quo	/* 商 */
  整数型: Rem	/* 剰余 */
  文字列型: Num  

  <span class="blank mag_lt00">b</span>
  Num ← ""

  while (Quo が Rdx 以上)
    Rem ← Quo mod Rdx
    Num ← <span class="red-text">ToStr(Rem)</span> + Num  /* + は文字列を連結する演算子 */
    <span class="blank mag_lt00">c</span>
  endwhile

  <span class="blank mag_lt00">d</span>
  return <span class="red-text">Num</span>
<span class="comment" style="top:.6em;left:19em;">12</span><span class="comment" style="top:.6em;left:27em;">2</span><span class="comment" style="top:25em;left:13em;">除算の余りを上位桁に連結する</span><span class="comment" style="bottom:2.5em;left:9em;">"1100"</span>
</pre>
<pre>Rem ← Quo mod Rdx</pre>
<p>の部分で、 Quo を Rdx = 2 で除算した余りを Rem に格納し、</p>
<pre>Num ← ToStr(Rem) + Num</pre>
<p>の部分で、それを数字にして、戻り値 Num （数字列）上位桁に連結しています。</p>
<p>どうして、これらの処理で、 12 を &#8220;1100&#8221; に変換できるのでしょう。</p>
<p>これは、手作業で 10 進数を 2 進数に変換する手順に当てはめればわかるはずです。</p>
<p>&nbsp;</p>
<p>手作業で 12 という 10 進数を 2 進数に変換するには、以下のように 12 を 2 で除算して余りを得る処理を繰り返します。</p>
<figure><figcaption class="mag_h10 center grey-text">図　手作業で 12 という 10 進数を 2 進数に変換する手順</figcaption><img class="materialboxed z-depth-5 hoverable responsive-width" src="../../wp-content/uploads/2020/08/figure_calc_10_2.jpg" loading="lazy" /><br />
</figure>
<p>これによって、変換後の 2 進数が下位桁から順に得られるので、後から得られた値を文字に変換して上位桁に連結すればよいのです。</p>
<p>&nbsp;</p>
<p>このプログラムでは、被除数が Quo で、序数が Rdx = 2 です。 Quo の初期値は、 Val = 12 であるべきなので、空欄 b は Quo ← Val （選択肢オ）です。</p>
<pre class="pad_tp40">
◯文字列型: IntToN(整数型: <span class="red-text">Val</span>, 整数型: <span class="red-text">Rdx</span>)
  整数型: Quo	/* 商 */
  整数型: Rem	/* 剰余 */
  文字列型: Num  

  <span class="blank mag_lt00">b</span>
  Num ← ""
<span class="comment" style="top:.6em;left:19em;">12</span><span class="comment" style="top:.6em;left:27em;">2</span>
</pre>
<p>Rem ← Quo mod Rdx の部分で、 Rem に除算の余りを求めたら、次の繰り返し処理に備えて、 Quo の値を除算の商で更新するべきなので、空欄 c は Quo ← Quo ÷ Rdx （選択肢ア）です。</p>
<pre>
  while (Quo が Rdx 以上)
    Rem ← Quo mod Rdx
    Num ← <span class="red-text">ToStr(Rem)</span> + Num  /* + は文字列を連結する演算子 */
    <span class="blank mag_lt00">c</span>
  endwhile
<span class="comment" style="top:7em;left:13em;">除算の余りを上位桁に連結する</span>
</pre>
<p>&#8220;Quo が Rdx 以上&#8221; つまり &#8220;Quo が 2 以上&#8221; という条件で繰り返しを行っているので、繰り返しを抜けると Quo は 1 になっています。繰り返しを抜けたら最後に、この 1 を文字に変換して上位桁に連結する必要があるので、空欄 d は Num ← ToStr(Quo) + Num （選択肢ク）です。</p>
<pre class="pad_bt40">
  while (Quo が Rdx 以上)
    Rem ← Quo mod Rdx
    Num ← <span class="red-text">ToStr(Rem)</span> + Num  /* + は文字列を連結する演算子 */
    <span class="red-text">Quo ← Quo ÷ Rdx</span>
  endwhile

  <span class="blank mag_lt00">d</span>
  return <span class="red-text">Num</span>
<span class="comment" style="top:17em;left:9em;">"1100"</span>
</pre>
<p>&nbsp;</p>
<p class="bold">10 進数を 2 進数に変換する手順は、基本情報技術者試験の受験者なら必ず知っておくべきことです。</p>
<p>それを知っていたからこそ、 &#8220;12&#8221; という 10 進数字列を &#8220;1100&#8221; という 2 進数字列に変換することを想定して、問題を解けたのです。</p>
<p>もしも、試験の出題範囲の中に、まだ手を付けてない分野があるなら、それがアルゴリズム問題のテーマとなることもあるので、必ず学習しておきましょう。</p>
<p>&nbsp;</p>
<p><span class="chip mag_rt10">解答</span>a － ウ, b － オ, c － ア, d ― ク</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p><span class="bold">「習うより慣れろ」</span>ということわざがあります。アルゴリズム穴埋め問題の克服に関しては、正にその通りでしょう。</p>
<p>この連載は、今回で最終回になります。もしも、これまでの記事の中に理解が不十分なものがあれば、何度も学習を繰り返して「慣れて」ください。そうすれば、多くの問題に共通した解法のポイントをつかめるはずです。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_instant_value/">具体的な値を入れるとプログラムがわかる練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>具体例からヒントを掴む練習問題｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/actual_case_hinting/</link>
		<pubDate>Sun, 16 Aug 2020 23:30:26 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=patterns_algorithms&#038;p=4422</guid>
		<description><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。 苦手を克服するには [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/actual_case_hinting/">具体例からヒントを掴む練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。</p>
<p>苦手を克服するには、短いプログラムを何度も練習して、穴埋めに慣れることが重要です。</p>
<p>そのために、実際の試験問題の一部をアレンジした練習問題を作りました。 とても短い問題ですので、気軽に取り組んでください。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}td{border-left:1px #d0d0d0 solid}table{font-size:.85em;}.red-border-t-l-b{border-left:.3em #e91e63 solid;border-top:.3em #e91e63 solid;border-bottom:.3em #e91e63 solid}.red-border-t-r-b{border-right:.3em #e91e63 solid;border-top:.3em #e91e63 solid;border-bottom:.3em #e91e63 solid}.blue-border-t-l-b{border-left:.3em #03a9f4 solid;border-top:.3em #03a9f4 solid;border-bottom:.3em #03a9f4 solid}.blue-border-t-r-b{border-right:.3em #03a9f4 solid;border-top:.3em #03a9f4 solid;border-bottom:.3em #03a9f4 solid}.blue-border-t-b{border-top:.3em #03a9f4 solid;border-bottom:.3em #03a9f4 solid}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -7.5%;padding:1em 7.5%}.card-panel>pre{margin:1em -24px}.u-pink{background:linear-gradient(transparent 60%,#f8bbd0 40%)}.style-alpha li{list-style-type:lower-alpha}.inline dd{margin-left:2em}@media only screen and (max-width:600px){ol{padding-left:1em}}</style>
<h2>練習問題</h2>
<div class="card-panel">
問 2　「文字列を置換するプログラム」（平成 17 年度 春期 午後）を一部改変</p>
<p>　手続 Replace は、文字列を置換するプログラムである。 Replace には、文字型の配列の引数 A[], S[], D[], B[] があり、 A[] を先頭からコピーして B[] に格納する（ B[] は十分に大きいとする）。 このとき、 A[] 中に S[] と一致する文字列を見つけるたびに、それを D[] の内容に置き換える。 このプログラムで扱う文字型の配列の添字は 0 から始まり、配列の末尾には定数 EOS が格納されている。</p>
<div class="table-container">
<table class="centered bordered responsive-width">
<caption>図　Replace の実行例</caption>
<tr>
<th>添字</th>
<td>0</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
<tr>
<th>A[]</th>
<td>&#8220;a&#8221;</td>
<td>&#8220;a&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>&#8220;c&#8221;</td>
<td>&#8220;a&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>EOS</td>
<td></td>
<td></td>
</tr>
<tr>
<th>S[]</th>
<td>&#8220;a&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>EOS</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>D[]</th>
<td>&#8220;A&#8221;</td>
<td>&#8220;B&#8221;</td>
<td>&#8220;C&#8221;</td>
<td>EOS</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>B[]</th>
<td>&#8220;a&#8221;</td>
<td>&#8220;A&#8221;</td>
<td>&#8220;B&#8221;</td>
<td>&#8220;C&#8221;</td>
<td>&#8220;c&#8221;</td>
<td>&#8220;A&#8221;</td>
<td>&#8220;B&#8221;</td>
<td>&#8220;C&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>EOS</td>
</tr>
</table>
</div>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>表やプログラムは横スクロールできます</p>
<p>［プログラム］</p>
<pre>
◯Replace(文字型の配列: A, 文字型の配列: S, 文字型の配列: D, 文字型の配列: B)
  整数型: Aidx, Sidx, Didx, Bidx, Idx
  Aidx ← 0
  Bidx ← 0

  while (A[Aidx] が EOS と等しくない)
    if (A[Aidx] と S[0] が等しい)
      Idx ← Aidx
      <span class="blank">a</span>

      do
        Sidx ←　Sidx + 1
        Aidx ←　Aidx + 1
      while (<span class="blank">b</span>と A[Aidx] がどちらとも EOS と等しくない)

      if (<span class="blank">c</span>)
        Didx ← 0

        while (D[Didx] が EOS と等しくない)
          B[Bidx] ← D[Didx]
          Didx ← Didx + 1
          Bidx ← Bidx + 1
        endwhile
      else
        <span class="blank">d</span>
        Aidx ← Idx + 1
        Bidx ← Bidx + 1
      endif

      B[Bidx] ← A[Aidx]
      Aidx ← Aidx + 1
      Bidx ← Bidx + 1
    endif
  endwhile

  B[Bidx] ← EOS
</pre>
<p class="mag_tp30">設問</p>
<p>　プログラム中の<span class="blank"></span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a, d に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>B[Bidx] ← A[Aidx]</dd>
<dt>イ</dt>
<dd>B[Bidx] ← S[0]</dd>
<dt>ウ</dt>
<dd>Idx ← 0</dd>
<dt>エ</dt>
<dd>Idx ← 1</dd>
<dt>オ</dt>
<dd>Sidx ← 0</dd>
<dt>カ</dt>
<dd>Sidx ← 1</dd>
</dl>
<p>b, c に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>A[Aidx] と EOS が等しくない</dd>
<dt>イ</dt>
<dd>A[Aidx] と S[Sidx] が等しい</dd>
<dt>ウ</dt>
<dd>A[Aidx] と S[Sidx] が等しくない</dd>
<dt>エ</dt>
<dd>A[Aidx] と S[Sidx] が等しくなく、かつ S[Sidx] と EOS が等しくない</dd>
<dt>オ</dt>
<dd>S[Sidx] と EOS が等しい</dd>
<dt>カ</dt>
<dd>S[Sidx] と EOS が等しくない</dd>
</dl>
</div>
<h2>ポイント1: 問題に示された具体例でプログラムの機能を理解する</h2>
<p>問題文の説明を読んだだけでは、プログラムの機能を理解するのが困難な場合があります。 この問題では、理解を助けるために、具体例が図示されています。</p>
<p>以下のように、問題文の説明と具体例の図を対応させれば、プログラムの機能を理解できるでしょう。</p>
<blockquote>
<p class="blue-grey-text">　手続 Replace は、文字列を置換するプログラムである。 Replace には、文字型の配列の引数 A[], S[], D[], B[] があり、 A[] を先頭からコピーして B[] に格納する（ B[] は十分に大きいとする）。 このとき、 <span class="u-pink">A[] 中に S[] と一致する文字列を見つけるたびに、</span> <span class="u">それを D[] の内容に置き換える。 </span>このプログラムで扱う文字型の配列の添字は 0 から始まり、配列の末尾には定数 EOS が格納されている。</p>
</blockquote>
<p class="center"><i class="material-icons blue-text large">expand_more</i></p>
<div class="table-container">
<table class="centered bordered blue-grey-text responsive-width">
<tr>
<th>添字</th>
<td>0</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
<tr>
<th>A[]</th>
<td>&#8220;a&#8221;</td>
<td class="red-border-t-l-b">&#8220;a&#8221;</td>
<td class="red-border-t-r-b">&#8220;b&#8221;</td>
<td>&#8220;c&#8221;</td>
<td class="red-border-t-l-b">&#8220;a&#8221;</td>
<td class="red-border-t-r-b">&#8220;b&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>EOS</td>
<td></td>
<td></td>
</tr>
<tr>
<th>S[]</th>
<td class="red-border-t-l-b">&#8220;a&#8221;</td>
<td class="red-border-t-r-b">&#8220;b&#8221;</td>
<td>EOS</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>D[]</th>
<td class="blue-border-t-l-b">&#8220;A&#8221;</td>
<td class="blue-border-t-b">&#8220;B&#8221;</td>
<td class="blue-border-t-r-b">&#8220;C&#8221;</td>
<td>EOS</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>B[]</th>
<td>&#8220;a&#8221;</td>
<td class="blue-border-t-l-b">&#8220;A&#8221;</td>
<td class="blue-border-t-b">&#8220;B&#8221;</td>
<td class="blue-border-t-r-b">&#8220;C&#8221;</td>
<td>&#8220;c&#8221;</td>
<td class="blue-border-t-l-b">&#8220;A&#8221;</td>
<td class="blue-border-t-b">&#8220;B&#8221;</td>
<td class="blue-border-t-r-b">&#8220;C&#8221;</td>
<td>&#8220;b&#8221;</td>
<td>EOS</td>
</tr>
</table>
</div>
<h2>ポイント2: プログラムを区切ってコメントを書き込む</h2>
<p>プログラムの機能（概要だけで OK です）を理解できたら、プログラムを区切って、それぞれの区切りごとに、そこで何をしているかをコメントとして書き込んでみましょう（わかる範囲だけで OK です）。</p>
<p>以下に、区切りとコメントの例を示します。 ここでは、区切りの線とコメントを赤色で示していますが、試験当日は、問題用紙に鉛筆で書き込んでください。 こうすることで、プログラムの内容が、とても見やすくなるでしょう。</p>
<pre>
◯Replace(文字型の配列: A, 文字型の配列: S, 文字型の配列: D, 文字型の配列: B)
  整数型: Aidx, Sidx, Didx, Bidx, Idx
  Aidx ← 0
  Bidx ← 0

  while (A[Aidx] が EOS と等しくない)
  <div class="divider red" style="height: .25em; margin-top: 1em;"></div>
    if (A[Aidx] と S[0] が等しい)     <span class="red-text">A[Aidx] と S[0] が等しい場合の処理</span>
      Idx ← Aidx                      <span class="red-text">Idx に Aidx の値を保存する</span>
      <span class="blank">a</span>

      do                              <span class="red-text">A [] と S[] が一致するかどうか繰り返しチェックする</span>
        Sidx ←　Sidx + 1
        Aidx ←　Aidx + 1
      while (<span class="blank">b</span>と A[Aidx] がどちらとも EOS と等しくない)
      <div class="divider red" style="height: .25em; margin-top: 1em;"></div>
      if (<span class="blank">c</span>)               <span class="red-text">A[] と S[] が一致した場合は、</span>
        Didx ← 0                      <span class="red-text">B[] に D[] を格納する</span>

        while (D[Didx] が EOS と等しくない)
          B[Bidx] ← D[Didx]
          Didx ← Didx + 1
          Bidx ← Bidx + 1
        endwhile
      else
        <div class="divider red" style="height: .25em; margin-top: 1em;"></div>
        <span class="blank">d</span>                  <span class="red-text">A[Aidx] と S[0] が等しかったが、</span>
        Aidx ← Idx + 1                <span class="red-text">A[] と S[] が一致しなかった場合の処理</span>
        Bidx ← Bidx + 1
      endif
      
      <div class="divider red" style="height: .25em; margin-top: 1em;"></div>
      B[Bidx] ← A[Aidx]               <span class="red-text">A[Aidx] と S[0] が等しくない場合は、</span>
      Aidx ← Aidx + 1                 <span class="red-text">B[] に A[] を格納する</span>
      Bidx ← Bidx + 1
    endif
  endwhile
  <div class="divider red" style="height: .25em; margin-top: 1em;"></div>

  B[Bidx] ← EOS
</pre>
<h2>ポイント3: 具体的な場面を想定して穴埋めを行う</h2>
<p>プログラムを区切ってコメントを書けたら、穴埋めのある区切りごとに、具体的な場面を想定してみましょう。</p>
<p>まず、<br />
A[1], A[2] の &#8220;a&#8221;, &#8220;b&#8221; が、<br />
S[0], S[1] の &#8220;a&#8221;, &#8220;b&#8221; に一致する<br />
場面を想定してみます。</p>
<p>これに関わるのは、空欄 a, 空欄 b, 空欄 c がある区切りです。 空欄 a と空欄 b がある区切りでは、 A[] と S[] が一致するかどうかをチェックしています。</p>
<pre>
  while (A[Aidx] が EOS と等しくない)
    if (A[Aidx] と S[0] が等しい)     <span class="red-text">A[Aidx] と S[0] が等しい場合の処理</span>
      Idx ← Aidx                      <span class="red-text">Idx に Aidx の値を保存する</span>
      <span class="blank">a</span>

      do                              <span class="red-text">A [] と S[] が一致するかどうか繰り返しチェックする</span>
        Sidx ←　Sidx + 1
        Aidx ←　Aidx + 1
      while (<span class="blank">b</span>と A[Aidx] がどちらとも EOS と等しくない)
</pre>
<pre>if (A[Aidx] と S[0] が等しい) </pre>
<p>の部分では、 Aidx が 1 であり、 A[1] と S[0] が等しいことをチェックします。</p>
<p>その後にある繰り返し処理で、 Sidx と Aidx の値を 1 ずつ増やします。 Sidx は、その名前から S[] の添字だとわかります。</p>
<p>A[1] と S[0] が等しいことをチェックした後は、 A[2] と S[1] が等しいことをチェックします。</p>
<p>したがって、空欄 a は S[Sidx] のSidx を 0 に設定する処理であり、Sidx ← 0 （選択肢オ）です。</p>
<pre>
  while (<span class="blank">b</span>と A[Aidx] がどちらとも EOS と等しくない)
</pre>
<p>の部分では、 A[Aidx] と S[Sidx] が等しい限りチェックが繰り返されます。 したがって、空欄 b は A[Aidx] = S[Sidx] （選択肢イ）です。</p>
<h2>ポイント4: 選択肢を空欄に当てはめて考える</h2>
<p>同じ場面を想定したまま、空欄 d がある区切りを見てみましょう。</p>
<p>ここでは、空欄 c の条件が真なら B[] に D[]を 格納する処理を行っています。</p>
<pre>
if (<span class="blank">c</span>)               <span class="red-text">A[] と S[] が一致した場合は、</span>
  Didx ← 0                      <span class="red-text">B[] に D[] を格納する</span>
  while (D[Didx] が EOS と等しくない)
    B[Bidx] ← D[Didx]
    Didx ← Didx + 1
    Bidx ← Bidx + 1
  endwhile
</pre>
<p>したがって、空欄 c は、 A[] と S[] が一致したことを判断する条件です。 どのような条件でしょうか？</p>
<p>&nbsp;</p>
<p>もしも、プログラムを見ても処理が思い浮かばないなら、選択肢を見てください。</p>
<p>空欄 c の選択肢は、以下に示したア～カがあります。 これらの中に、 A[] と S[] が一致したことを判断できる条件があるのです。</p>
<blockquote>
<p class="blue-grey-text">b, c に関する解答群</p>
<dl class="inline blue-grey-text">
<dt>ア</dt>
<dd>A[Aidx] と EOS が等しくない</dd>
<dt>イ</dt>
<dd>A[Aidx] と S[Sidx] が等しい</dd>
<dt>ウ</dt>
<dd>A[Aidx] と S[Sidx] が等しくない</dd>
<dt>エ</dt>
<dd>A[Aidx] と S[Sidx] が等しくなく、かつ S[Sidx] と EOS が等しくない</dd>
<dt>オ</dt>
<dd>S[Sidx] と EOS が等しい</dd>
<dt>カ</dt>
<dd>S[Sidx] と EOS が等しくない</dd>
</dl>
</blockquote>
<p>これらの選択肢を 1 つずつ空欄 c に当てはめていくと、「あっ、そうか！」と気付くでしょう。</p>
<p>ここで想定している<br />
A[1], A[2] の &#8220;a&#8221;, &#8220;b&#8221; が、<br />
S[0], S[1] の &#8220;a&#8221;, &#8220;b&#8221; に一致する<br />
場面では、 &#8220;A[Aidx] が S[Sidx] と等しい&#8221; という条件が真である限りチェックが繰り返され、 S[Sidx] が EOS になったときに、それまでの文字がすべて等しいことが確認され、繰り返しが終わります。</p>
<p>したがって、 A[] と S[] が一致したことを判断できる条件は、 &#8220;S[Sidx] と EOS が等しい&#8221; （選択肢オ）です。</p>
<h2>ポイント5: 選択肢を見て「待てよ！」と思いとどまる</h2>
<p>最後は、空欄 d がある区切りです。</p>
<p>ここでは、 A[Aidx] と S[0] が等しかったが、 A[] と S[] が一致しなかった場合の処理が行われます。</p>
<p>これは、これまでに想定した場面とは異なるので、<br />
A[0] の &#8220;a&#8221; と S[0] の &#8220;a&#8221; が等しかったが、<br />
A[1] の &#8220;a&#8221; と S[1] の &#8220;b&#8221; が等しくなかった<br />
場面を想定してみましょう。</p>
<pre>
<span class="blank">d</span>                  <span class="red-text">A[Aidx] と S[0] が等しかったが、</span>
Aidx ← Idx + 1                <span class="red-text">A[] と S[] が一致しなかった場合の処理</span>
Bidx ← Bidx + 1
</pre>
<p>この場面では、　B[] に A[0] の &#8220;a&#8221; を格納します。 選択肢を見てみましょう。</p>
<blockquote>
<p class="blue-grey-text">a, d に関する解答群</p>
<dl class="inline blue-grey-text">
<dt>ア</dt>
<dd>B[Bidx] ← A[Aidx]</dd>
<dt>イ</dt>
<dd>B[Bidx] ← S[0]</dd>
<dt>ウ</dt>
<dd>Idx ← 0</dd>
<dt>エ</dt>
<dd>Idx ← 1</dd>
<dt>オ</dt>
<dd>Sidx ← 0</dd>
<dt>カ</dt>
<dd>Sidx ← 1</dd>
</blockquote>
<p>これらの選択肢を見ると、「 B[] に A[0] を格納するのだから、選択肢アの B[Bidx] ← A[Aidx] だろう！」と思うでしょう。</p>
<p>しかし、ここで「待てよ！」と思いとどまってください。</p>
<p>B[] に格納する処理として、もう 1 つ、選択肢イの B[Bidx] ← S[0] があります。</p>
<p>A[Aidx] は、 A[] と S[] が一致するかどうかのチェックで Aidx に 1 を加えているので 0 ではなくなっています。<br />
S[0] には、 Aidx が 0 のときの</p>
<pre>if (A[Aidx] が S[0] と等しい)</pre>
<p>というチェックが真だったのですから、 A[0] の &#8220;a&#8221; が入っています。</p>
<p>したがって、空欄 d は、 B[Bidx] ← S[0]（選択肢イ）です。</p>
<p>&nbsp;</p>
<p>このように、<span class="u">同様の処理をしている選択肢がある場合は、最初に「これかな？」と思っても、そこで早合点せずに、他の選択肢も「もしかすると、これかも？」と確認するようにしてください。 </span>選択肢は、大きなヒントなのですから、大いに活用しましょう。</p>
<p>&nbsp;</p>
<p><span class="chip mag_rt10">解答</span>a － オ, b － イ, c － オ, d ― イ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p><span class="bold">「習うより慣れろ」</span>ということわざがあります。 アルゴリズム穴埋め問題の克服に関しては、正にその通りでしょう。</p>
<p>この連載では、これからも短い練習問題を掲載していきますので、穴埋めに慣れることを目指してください。</p>
<p>正解を見出すポイントとして、同じことが示されることもあると思いますが、それは、多くの問題に共通したポイントがあるからです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/actual_case_hinting/">具体例からヒントを掴む練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>プログラムを分割するコツがわかる練習問題｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/partitioning_program/</link>
		<pubDate>Thu, 06 Aug 2020 04:46:00 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=patterns_algorithms&#038;p=4407</guid>
		<description><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。 苦手を克服するには [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/partitioning_program/">プログラムを分割するコツがわかる練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。</p>
<p>苦手を克服するには、短いプログラムを何度も練習して、穴埋めに慣れることが重要です。</p>
<p>そのために、実際の試験問題の一部をアレンジした練習問題を作りました。 とても短い問題ですので、気軽に取り組んでください。</p>
<style>article,pre{font-family:consolas,'Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;padding:.5em 0 .5em 1em;}.card-panel>pre{margin:1em -24px;padding:1em 24px}ol.style-alpha li{list-style-type:lower-alpha}dl.inline dd{margin-left:2em}@media only screen and (max-width:600px){ol{padding-left:1em}}</style>
<h2>練習問題</h2>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<div class="card-panel">
問 4　「タブ文字を展開するプログラム」（平成 18 年度 秋期 午後）を一部改変</p>
<p>　手続 TabSpc は、タブ文字を展開するプログラムである。</p>
<ol>
<li>TabSpc は、引数で指定された文字型配列 Src[] を先頭から調べ、 Src[] 中のすべてのタブ文字をそれぞれ一つ以上の間隔文字（スペース）に変換して、引数で指定された文字型配列 Dst[] に格納する。 </li>
<li>文字型配列の各要素には、文字を 1 文字ずつ順に格納し、最後の文字の次の要素にはシステム定数である EOS を格納する。 なお、配列の添字は 1 から始まり、添字の値を文字位置と呼ぶ。 </li>
<li>Src[] 中にタブ文字が出現した場合、次の文字が最も近い右のタブ位置に格納されるように、タブ文字を一つ以上の間隔文字に置換して、 Dst[] （要素数は十分に大きいとする）に格納する。 ここで、タブ位置とは、整数型の引数 TabGap で渡されるタブ間隔（≧ 2）を用いて、次の式で計算される文字位置である。
<pre class="mag_w00">タブ位置 = タブ間隔 × n + 1 （ n は 1 以上の整数）</pre>
</li>
<li>タブ間隔が 4 のときの実行例を図に示す。  &#8220;j&#8221; を Dst[] のタブ位置である文字位置 13 （ = 4 × 3 + 1 ）に格納したのでは、タブ文字が間隔文字に置き換わらないので、最も近い右のタブ位置である文字位置 17 （ = 4 × 4 + 1 ）に格納する。 </li>
</ol>
<figure><figcaption>図　タブ間隔が 4 のときの TabSpc の実行例</figcaption><img class="responsive-width materialboxed hoverable z-depth-5" src="../../wp-content/uploads/2020/08/figure1_q4.jpg" loading="lazy" /><br />
</figure>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>アルゴリズムは横スクロールできます</p>
<p>［プログラム］</p>
<pre>
◯TabSpc(文字型の配列: Src, 文字型の配列: Dst, 整数型: TabGap)
  整数型: Sidx, Didx, N, TabPos
  Sidx ← 1
  Didx ← 1

  while (Src[Sidx] が EOS とは等しくない) /* EOS: 文字列の終わりを表すシステム定数 */
    if (Src[Sidx] が TAB と等しい)        /* TAB: タブ文字を表すシステム定数 */
      N ← ( <span class="blank">a</span> ) ÷ TabGap
      TabPos ← TabGap × N + 1
      while (Didx が TabPos より小さい)
        Dst[Didx] ← SPC                 /* SPC: 間隔文字を表すシステム定数 */
        <span class="blank">b</span>
      endwhile
    else
      <span class="blank">c</span>
      Didx ← Didx + 1
    endif

    Sidx ← Sidx + 1
  endwhile

  Dst[Didx] ← EOS
</pre>
<p class="mag_tp30 bold">設問</p>
<p>プログラム中の<span class="blank"></span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>Didx + 1</dd>
<dt>イ</dt>
<dd>Didx &#8211; 1</dd>
<dt>ウ</dt>
<dd>Didx + TabGap + 1</dd>
<dt>エ</dt>
<dd>Didx + TabGap &#8211; 1</dd>
</dl>
<p>b 、 c に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>Didx ← Didx + 1</dd>
<dt>イ</dt>
<dd>Dst[Didx] ← Src[Sidx]</dd>
<dt>ウ</dt>
<dd>Dst[Didx + 1] ← Src[Sidx]</dd>
<dt>エ</dt>
<dd>Dst[Didx] ← Src[Sidx + 1]</dd>
</div>
<h2>ポイント1: プログラムを区切って見る</h2>
<p><span class="u">私の講師経験上、「アルゴリズムが苦手です！」という受講者の多くは、プログラム全体を一気に見て理解しようとします</span>。 それでは、なかなか理解できなくて当然です。</p>
<p>プログラムというものは、全体をいくつかの部分に区切って見るものだからです。 「そんなこと言われても、どうやって区切ったらよいかわかりません！」だと思いますので、区切り方をアドバイスしましょう。</p>
<p>&nbsp;</p>
<p>プログラムの処理の流れの種類は、<br />
<span class="bold">順次（まっすぐ進む）</span><br />
<span class="bold">分岐（条件に応じて選択する）</span><br />
<span class="bold">反復（条件に応じて繰り返す）</span><br />
の 3 つです。</p>
<p>擬似言語では、何も指定しなければ順次になり、 if と endif で囲めば分岐になり、 while と endwhile で囲めば反復になります。 これらの表記に注目すれば、機械的に区切れるはずです。</p>
<p>プログラムを区切った例を下図に示します。</p>
<figure><figcaption>図　プログラムを「順次」「分岐」「反復」で区切った例</figcaption><pre style="position:relative;" class="grey">
◯TabSpc(文字型の配列: Src, 文字型の配列: Dst, 整数型: TabGap)<span class="badge white grey-text">順次</span>
  整数型: Sidx, Didx, N, TabPos
  Sidx ← 1
  Didx ← 1
<div class="grey darken-1" style="margin-left:2em;">while (Src[Sidx] が EOS とは等しくない) /* EOS: 文字列の終わりを表すシステム定数 */<span class="badge white grey-text text-darken-1">反復</span>
  
  
  
  
  
  
  
  
  
  
  
  
  
endwhile</div><span>  Dst[Didx] ← EOS</span><span class="badge white grey-text">順次</span>
<span class="grey darken-3" style="position:absolute;top:9.5em;left:4em">if (Src[Sidx] が TAB と等しい)        /* TAB: タブ文字を表すシステム定数 */<span class="badge white grey-text text-darken-3">分岐</span>
  N ← ( <span class="blank">a</span> ) ÷ TabGap
  TabPos ← TabGap × N + 1
  while (Didx が TabPos より小さい)
    Dst[Didx] ← SPC                 /* SPC: 間隔文字を表すシステム定数 */
    <span class="blank">b</span>
  endwhile
else
  <span class="blank">c</span>
  Didx ← Didx + 1
endif

Sidx ← Sidx + 1</span></pre>
</figure>
<p>プログラムを区切ったことで、空欄 a 、空欄 b 、空欄 c があるのが、分岐の部分だとわかります。 それがわかったら（ここが大事です！）、<span class="bold">プログラム全体ではなく、分岐の部分だけを見てください。 </span></p>
<p>この分岐は、どのような条件で分岐するのでしょう。</p>
<pre>Src[Sidx] が TAB と等しい</pre>
<p>という条件が真なら空欄 a と空欄 b がある上側の処理を行い、そうでないなら空欄 c がある下側の処理を行います。 これもプログラムの区切りです。 これらの区切りごとに、プログラムを見てください。</p>
<h2>ポイント2: わかりやすい部分を先に穴埋めする</h2>
<p><span class="u">空欄の穴埋めは、わかりやすい部分から先に行ってください。 </span>分岐の下側にある空欄 c の穴埋めが、わかりやすいでしょう。</p>
<p>ここでは、 Src[Sidx] が TAB と等しい という条件が真でないときの処理なのですから、 Src[] から取り出した文字（タブ文字でない文字）を、そのまま Dst[] に格納する処理です。</p>
<p>したがって、</p>
<pre>Dst[Didx] ← Src[Sidx]</pre>
<p>が適切であり、選択肢イが正解です。</p>
<h2>ポイント3: 選択肢をヒントにして考える</h2>
<p>それでは、空欄 a と空欄 b がある分岐の上側の処理を見てみましょう。</p>
<p>ここは、 Src[Sidx] が TAB と等しい という条件が真のときの処理なので、タブ文字を間隔文字に置き換える処理です。</p>
<pre>
  N ← ( <span class="blank">a</span> ) ÷ TabGap
  TabPos ← TabGap × N + 1
  while (Didx が TabPos より小さい)
    Dst[Didx] ← SPC                 /* SPC: 間隔文字を表すシステム定数 */
    <span class="blank">b</span>
  endwhile
</pre>
<p>空欄 a より空欄 b の方がわかりやすそうなので、空欄 b の穴埋めを先に行うことにしましょう。</p>
<p>さて、どのような処理をすればよいのでしょうか？</p>
<p>こういうことは、腕を組んで考えることではありません。 基本情報技術者試験の問題は、すべて多岐選択式です。 <span class="u">したがって、解答群に示された選択肢をヒントにして考えてください。 </span></p>
<p>空欄 b の選択肢を以下に示します。</p>
<blockquote>
<p class="blue-grey-text">b 、 c に関する解答群</p>
<dl class="inline blue-grey-text">
<dt>ア</dt>
<dd>Didx ← Didx + 1</dd>
<dt>イ</dt>
<dd>Dst[Didx] ← Src[Sidx]</dd>
<dt>ウ</dt>
<dd>Dst[Didx + 1] ← Src[Sidx]</dd>
<dt>エ</dt>
<dd>Dst[Didx] ← Src[Sidx + 1]</dd>
</dl>
</blockquote>
<p>空欄 b の処理が、</p>
<p>選択肢アだったら？<br />
選択肢イだったら？<br />
選択肢ウだったら？<br />
選択肢エだったら？</p>
<p>と考えると「あっ、そうか！」と気付くでしょう。</p>
<p>空欄 b は、 Dst[Didx] に必要な数だけ SPC （間隔文字）を格納する処理です。  1 つ SPC を格納したら、 Didx に 1 を加えて格納先を 1 つ先に進めます。</p>
<p>したがって、選択肢アの</p>
<pre>Didx ← Didx + 1</pre>
<p>が正解です。</p>
<h2>ポイント4: 具体例を想定し、想定した値で計算する</h2>
<p>それでは、最後に残った空欄 a の穴埋めです。</p>
<p>ここは、空欄 a から N（ タブ位置の計算式の n ）の値を求め、さらに N から TabPos （タブ位置）の値を求める処理です。 これは、かなり難しそうです。</p>
<pre>
  N ← ( <span class="blank">a</span> ) ÷ TabGap
  TabPos ← TabGap × N + 1
</pre>
<p>こういうときに頼りになるのが、問題に示された具体例です。</p>
<p>問題には、 TabGap（タブ間隔）= 4 としたときの具体例の図が示されていて、そこには、問題に示された</p>
<blockquote>
<p class="blue-grey-text">タブ位置 = タブ間隔 × n + 1 （ n は 1 以上の整数）</p>
</blockquote>
<p>という計算で得られるタブ位置も示されています。 そして、</p>
<blockquote>
<p class="blue-grey-text">&#8220;j&#8221; を Dst[] のタブ位置である文字位置 13 （ = 4 × 3 + 1 ）に格納したのでは、タブ文字が間隔文字に置き換わらないので、最も近い右のタブ位置である文字位置 17 （ = 4 × 4 + 1 ）に格納する</p>
</blockquote>
<p>という注意書きがあります。 おそらく、この注意書きが答えを見出すポイントなのでしょう。</p>
<p>&nbsp;</p>
<p>この注意書きに注目して、具体例を想定してみましょう。</p>
<p>Src[] の文字位置 12 にあるタブ文字を展開するときに、 Dst[] のタブ位置が 13 でなく 17 になればよいわけです。</p>
<p>空欄 a の選択肢を見ると、どれも Dst[] の格納先である Didx が含まれています。 想定した場面では、</p>
<p>  Didx = 13<br />
  TabGap = 4</p>
<p>なので、選択肢ア～エの値は、以下になります。</p>
<p>整数の割り算では、小数点以下がカットされることに注意してください。</p>
<dl class="background c-round inline">
a に関する解答群</p>
<dt>ア</dt>
<dd>Didx + 1 = 12 + 1 = 13</dd>
<dt>イ</dt>
<dd>Didx = 1 = 12 = 1 = 11</dd>
<dt>ウ</dt>
<dd>Didx + TabGap + 1 = 12 + 4 + 1 = 17</dd>
<dt>エ</dt>
<dd>Didx + TabGap = 1 = 12 + 4 = 1 = 15</dd>
</dl>
<p>この 13, 11, 17, 15 をプログラムの空欄 a に入れて、 TabPos を求めると以下になります。</p>
<pre>
選択肢ア
  N ← (13) ÷ 4 ・・・ N は 3 になる。
  TabPos ← 4 × N + 1 ・・・ TabPos は 13 になる。

選択肢イ
  N ← (11) ÷ 4 ・・・ N は 2 になる。
  TabPos ← 4 × N + 1 ・・・ TabPos は 9 になる。

選択肢ウ
  N ← (17) ÷ 4 ・・・ N は 4 になる。
  TabPos ← 4 × N + 1 ・・・ TabPos は 17 になる。

選択肢エ
  N ← (15) ÷ 4 ・・・ N は 3 になる。
  TabPos ← 4 × N + 1 ・・・ TabPos は 13 になる。
</pre>
<p>ここでは、 TabPos が 17 になればよいので、選択肢ウが正解です。 やはり、注意書きが答えを見出すポイントでした。</p>
<p>&nbsp;</p>
<p><span class="chip mag_rt10">解答</span>a － ウ, b － ア, c － イ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p><span class="bold">「習うより慣れろ」</span>ということわざがあります。 アルゴリズム穴埋め問題の克服に関しては、正にその通りでしょう。</p>
<p>この連載では、これからも短い練習問題を掲載していきますので、穴埋めに慣れることを目指してください。</p>
<p>正解を見出すポイントとして、同じことが示されることもあると思いますが、それは、多くの問題に共通したポイントがあるからです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/partitioning_program/">プログラムを分割するコツがわかる練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>トレースのテクニックが身につく練習問題｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_trace/</link>
		<pubDate>Wed, 08 Jul 2020 08:06:19 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[スタック]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[トレースのコツ]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=patterns_algorithms&#038;p=4292</guid>
		<description><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。 苦手を克服するには [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_trace/">トレースのテクニックが身につく練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。</p>
<p>苦手を克服するには、短いプログラムを何度も練習して、穴埋めに慣れることが重要です。</p>
<p>そのために、実際の試験問題の一部をアレンジした練習問題を作りました。とても短い問題ですので、気軽に取り組んでください。</p>
<style>article,pre{font-family:consolas,'Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -7.5%;padding:1em 7.5%}.card-panel>pre{margin:1em -24px;padding:1em 24px}</style>
<h2>練習問題</h2>
<div class="card-panel">
問 4　「スタックを使って整数値を 10 進数字列に変換するプログラム」（平成 19 年度 秋期 午後）を一部改変</p>
<p>　スタックを使って整数値を 10 進数字列（文字列）に変換する IntFormat 関数である。 IntFormat 関数は、引数 Int で指定された整数値を 10 進数字列に変換し、その先頭の数字（文字）から 1 文字ずつ順に引数 Out[] に格納し、格納した文字数を引数 Len に格納する。整数値を 10 進数字列に変換する手順は、次のとおりである。</p>
<ol class="mag_h30">
<li>Int の値がゼロの場合は、 Out[0] に &#8220;0&#8221; を、 Len に 1 を格納して、関数を終了する。</li>
<li>Int の値が負の場合は、負符号を表す &#8220;-&#8221; を Out[] に格納し、 Int の値を正数に変換する。</li>
<li>Int の 1 の位から上位に向かって、 1 けたずつ 10 進数字に変換し、 Push 関数でスタックに積む。</li>
<li>スタックに積み終わったら、スタックに積んだ文字を順番に Pop 関数で取り出して Out[] に格納することによって、変換後の 10 進数字を正しい順序に並び替える。</li>
<li>Len に Out[] に格納した文字数を設定して、関数を終了する。</li>
</ol>
<p>　引数の値をスタックに積む Push 関数と、スタックから取り出した値を戻り値として返す Pop 関数は、あらかじめ用意されているとする。配列の添字は 0 から始まり、 Out[] の要素数は十分に大きいものとする。プログラム中の各演算で、あふれは生じないものとする。 IntFormat 関数の変換例を下図に示す。</p>
<figure><figcaption class="mag_h10 small-text center grey-text">図　IntFormat 関数の変換例</figcaption><img class="materialboxed hoverable z-depth-5 responsive-width" data-caption="図　IntFormat 関数の変換例" src="../../wp-content/uploads/2020/07/q4_figure.jpg" loading:"lazy"><br />
</figure>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>アルゴリズムは横スクロールできます</p>
<p>［プログラム］</p>
<pre>
◯IntFormat(整数型: Int, 文字型の配列: Out, 整数型: Len)
  整数型: L, I, Idx
  文字型の配列: Chr ← {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
  文字型: T

  L ← 0

  /* 引数 Int がゼロの場合の処理 */
  if (Int が 0 )
    Out[L] ← Chr[Int]
    L ← L + 1
    Len ← L
    return
  endif

  /* 符号の処理 */
  if (Int が 0 より小さい)
    I ← -Int
    Out[L] ← "-"
    L ← 1 + 1
  else
    I ← Int
  endif

  /* 数値を 1 けたずつ数字に変換してスタックに格納する処理 */
  Push("#")     /* スタックに番兵として "#" を積む */

  while (I が 0 より大きい)
    Idx ← I - (I ÷ 10) × 10
    Push(Chr[Idx])
    I ← <span class="blank">a</span>
  endwhile

  /* スタックから取り出す処理 */
  T ← Pop()

  while (T が "#" でない)
    Out[L] ← T
    <span class="blank">b</span>
    T ← Pop()
  endwhile

  Len ← L
  return
</pre>
<p>設問　プログラム中の<span class="blank"></span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群<br />
ア　I &#8211; 10<br />
イ　I &#8211; I ÷ 10<br />
ウ　I &#8211; ( I ÷ 10 ) × 10<br />
エ　I ÷ 10</p>
<p>b に関する解答群<br />
ア　L ← L + 1<br />
イ　L ← L &#8211; 1<br />
ウ　I ← I + 1<br />
エ　I ← I &#8211; 1
</p></div>
<h2>ポイント1：数値と数字の違いを知る</h2>
<p>数値と数字は、異なるものです。たとえば、 123 は、 1 つの数値です。これを画面に表示するときは、 &#8220;1&#8221;, &#8220;2&#8221;, &#8220;3&#8221; という 3 つの文字を表示することになります。</p>
<p><span class="u">このように数値の 1 けたずつを 1 つの文字にしたものが数字です。</span></p>
<p>問題に示された IntFormat 関数の変換例を見てください。 IntFormat 関数は、引数 Int に指定された 123 という数値を、 &#8220;1&#8221;、&#8221;2&#8243;、&#8221;3&#8243; という数字に変換して引数 Out[] に格納し、その文字数の 3 を引数 Len に格納するのです。</p>
<p>&nbsp;</p>
<p>コンピュータの内部では、あらゆる情報を数値で表しています。したがって、 &#8220;1&#8221;, &#8220;2&#8221;, &#8220;3&#8221; という数字も、その<span class="u">実体は、それぞれの数字に割り当てられた文字コードの数値</span>です。</p>
<p>何という数値が割り当てられるかは、使用する文字コード体系によって異なりますが、たとえば JIS X 0201 という文字コード体系では、<br />
&#8220;1&#8221; は 49、<br />
&#8220;2&#8221; は 50、<br />
&#8220;3&#8221; は 51<br />
です。 49 、50 、51 を文字型として画面に出力すると、それぞれに対応した &#8220;1&#8221;, &#8220;2&#8221;, &#8220;3&#8221; という数字が表示されるのです。</p>
<p>&nbsp;</p>
<p>この問題では、文字コードは示されていません。その代わりに、</p>
<pre>文字型の配列: Chr ← {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}</pre>
<p>という文字の配列を用意しています。</p>
<p>配列の添字が 0 から始まるとしているので、 Chr[0] ～ Chr[9] は、 0 から 9 の数値に対応する &#8220;0&#8221; ～ &#8220;9&#8221; という数字になります。</p>
<p>たとえば、<span class="u">変数 Idx の値が 5 なら、 Char[Idx] は、数値 5 に対応する &#8220;5&#8221; という数字</span>になります。</p>
<h2>ポイント2： コメントをヒントにして、問題文の説明とプログラムを対応付ける</h2>
<p>この問題のように、<span class="bold">処理の手順が示されている場合は、手順とプログラムを対応付けることで、空欄で行う処理がわかる</span>場合がよくあります。</p>
<p>その際に、<span class="u">プログラムの中にあるコメントも大いに参考にしてください。</span>試験問題のプログラムのコメントは、<span class="bold">コメント（注釈）というよりは、ヒント</span>だからです。</p>
<p>&nbsp;</p>
<p>手順の説明の (1) は、プログラムで </p>
<pre>/* 引数 Int がゼロの場合の処理 */</pre>
<p>というコメントに対応した処理です。</p>
<p>ここには、空欄がないので (1) に示されている</p>
<blockquote>
<p class="grey-text"> Int の値がゼロの場合は、 Out[0] に &#8220;0&#8221; を、 Len に 1 を格納して、関数を終了する</p>
</blockquote>
<p>という処理をやっているのだ、と考えるだけで OK です。<span class="u">プログラムの内容を詳しく見る必要はありません。</span></p>
<p>&nbsp;</p>
<p>同様に、手順の説明の (2) は、プログラムの </p>
<pre>/* 符号の処理 */</pre>
<p>の部分に対応し、ここにも空欄がないので、プログラムの内容を詳しく見る必要はありません。</p>
<h2>ポイント3： 具体的な数値を想定して処理の流れをトレースする</h2>
<p>手順の説明の (3) は、プログラムの</p>
<pre>/* 数値を1けたずつ数字に変換してスタックに格納する処理 */</pre>
<p>に対応し、ここには空欄 a があるので、</p>
<blockquote>
<p class="grey-text">Int の 1 の位から上位に向かって、 1 けたずつ 10 進数字に変換し、 Push 関数でスタックに積む</p>
</blockquote>
<p>という説明と対応付けて、プログラムの内容を詳しく見てみましょう。</p>
<p>以下に、該当するプログラムの部分を示します。</p>
<pre>
  /* 数値を 1 けたずつ数字に変換してスタックに格納する処理 */
  Push("#")     /* スタックに番兵として "#" を積む */

  while (I が 0 より大きい)
    Idx ← I - (I ÷ 10) × 10
    Push(Chr[Idx])
    I ← <span class="blank">a</span>
  endwhile
</pre>
<p><span class="bold">プログラムを見る（読み取る）コツは、わかりやすい具体例を想定すること</span>です。</p>
<p>ここでは、変換する数値を格納している変数 I に 123 が格納されていることを想定してみましょう。</p>
<blockquote>
<p class="grey-text"> Int の 1 の位から上位に向かって、 1 けたずつ 10 進数字に変換し、 Push 関数でスタックに積む</p>
</blockquote>
<p>という説明なので、 123 という数値を、 3, 2, 1 の順に、 &#8220;3&#8221;, &#8220;2&#8221;, &#8220;1&#8221; という数字に変換して、 Push 関数でスタックに積みます。</p>
<p>スタックに積むのは、&#8221;3&#8243;, &#8220;2&#8221;, &#8220;1&#8221; の順に変換しただけでは順序が逆だからです。<br />
&#8220;1&#8221;<br />
&#8220;2&#8221;<br />
&#8220;3&#8221;<br />
の順に変換してスタックに積み、それをスタックから取り出すと<br />
&#8220;1&#8221;, &#8220;2&#8221;, &#8220;3&#8221;<br />
という正しい順序にできます。<span class="bold">スタックでは、積んだときと逆の順序で取り出すことになる</span>からです。</p>
<p>それでは、プログラムを見てみましょう。</p>
<p>まず、</p>
<pre>|・Idx ← I - (I ÷ 10) × 10</pre>
<p>という処理の I に 123 を想定すると、</p>
<pre>|・Idx ← 123 - (123 ÷ 10) × 10</pre>
<p>になります。</p>
<p>123 ÷ 10 は、整数同士の割り算なので、<span class="u">小数点以下がカットされて（これは、とっても重要なことなので必ず覚えておいてください）</span>、 12 になります。<br />
× 10 で、それを 10 倍するので、<br />
(123 ÷ 10) × 10 は、 120 になります。</p>
<p>したがって、</p>
<pre>123 - (123 ÷ 10) × 10</pre>
<p>は、 123 &#8211; 120 = 3 になって、変数 Idx には、 123 の最下位けたの 3 が得られます。</p>
<p>次に、</p>
<pre>Push(Chr[Idx])</pre>
<p>という処理の Idx に 3 を想定すると、</p>
<pre>Push(Chr[3])</pre>
<p>となります。 Chr[3] は &#8220;3&#8221; なので、これによって 3 という数値が &#8220;3&#8221; という数字に変換されて、スタックにプッシュされます。</p>
<p>次に、</p>
<pre>I ← <span class="blank">a</span></pre>
<p>という処理に空欄 a があります。これは、次に同じ処理（最下位けたの数値を取り出して、それを数字に変換してスタックに積む）に合わせて、変数 I の値を更新する処理です。</p>
<p>この処理の前で、変数 I の値は 120 になっています。これを 12 に変換すれば、最下位けたが 2 になります。さあ、空欄 a では、どのような処理を行えばよいのでしょう？</p>
<div class="grey lighten-5 c-round pad_20">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w05">タグで関連記事をチェック</span><a href="../../tag/スタック" class="tag">スタック</a><a class="tag" href="../../tag/テクニック-具体的な値を想定/">テクニック 具体的な値を想定</a>
</div>
<h2>ポイント4： 選択肢の変数に具体的な値を設定する</h2>
<p>こういうことは、空欄を眺めて腕を組んで考えることではありません。基本情報技術者試験の問題は、すべて選択問題なのですから、必ず選択肢を見て考えてください。</p>
<p>以下に、空欄 a の選択肢を示します。</p>
<blockquote class="mag_h30">
<p class="grey-text">a に関する解答群<br />
ア　I &#8211; 10<br />
イ　I &#8211; I ÷ 10<br />
ウ　I &#8211; ( I ÷ 10 ) × 10<br />
エ　I ÷ 10</p>
</blockquote>
<p>現時点で、変数 I は 120 です。これを 12 にしたいのですから、選択肢の変数 I に 120 を代入して、 12 になるものが正解です。</p>
<p>以下のように、選択肢エが正解です。繰り返しますが、整数の割り算では、小数点以下がカットされることに注意してください。</p>
<div class="background c-round">
a に関する解答群<br />
ア　120 &#8211; 10 = 110<br />
イ　120 &#8211; 120 ÷ 10 = 120 &#8211; 12 = 108<br />
ウ　120 &#8211; (120 ÷ 10) × 10 = 120 &#8211; 120 = 0<br />
エ　120 ÷ 10 = 12
</div>
<h2>ポイント5： 同様の処理をしている部分と見比べる</h2>
<p>手順の説明の（4）は、プログラムの</p>
<pre>/* スタックから取り出す処理 */</pre>
<p>に対応し、ここには空欄 b があるので、</p>
<blockquote>
<p class="grey-text">スタックに積み終わったら、スタックに積んだ文字を順番に Pop 関数で取り出して Out[] に格納することによって、変換後の 10 進数字を正しい順序に並び替える</p>
</blockquote>
<p>という説明と対応付けて、プログラムの内容を詳しく見てみましょう。</p>
<p>以下に、該当するプログラムの部分を示します。</p>
<pre>
  /* スタックから取り出す処理 */
  T ← Pop()

  while (T が "#" でない)
    Out[L] ← T
    <span class="blank">b</span>
    T ← Pop()
  endwhile
</pre>
<p>まず、</p>
<pre>T ← Pop()</pre>
<p>の部分でスタックから取り出した数字を変数 T に格納しています。</p>
<p>次に、</p>
<pre>while (T が "#" でない)</pre>
<p>は、スタックの末尾を示す番兵（目印となるデータのことで、ここでは &#8220;#&#8221; という文字です）を取り出すまで繰り返す、つまりスタックに積まれたデータをすべて取り出すまで繰り返すということです。</p>
<p>次に、</p>
<pre>Out[L] ← T</pre>
<p>で、取り出した数字 T を Out[L] に格納しています。</p>
<p>次に、</p>
<pre><span class="blank">b</span></pre>
<p>という空欄 b があります。</p>
<p>空欄bの穴埋めは、以下の解答群から選びます。さあ、どれでしょう？</p>
<blockquote class="mag_h30">
<p class="grey-text">b に関する解答群<br />
ア　L ← L + 1<br />
イ　L ← L &#8211; 1<br />
ウ　I ← I + 1<br />
エ　I ← I &#8211; 1</p>
</blockquote>
<p>ここでは、プログラムの中で、同様の処理をしている部分と見比べる、ということをしてみましょう。</p>
<p>以下のオレンジ色文字の部分で、同様の処理をしています。</p>
<pre>
  /* 引数 Int がゼロの場合の処理 */
  if (Int が 0 )
    <span class="amber-text">Out[L] ← Chr[Int]</span>
    <span class="amber-text">L ← L + 1</span>
    Len ← L
    return
  endif
</pre>
<pre>
  /* 符号の処理 */
  if (Int が 0 より小さい)
    I ← -Int
    <span class="amber-text">Out[L] ← "-"</span>
    <span class="amber-text">L ← 1 + 1</span>
  else
    I ← Int
  endif
</pre>
<p>これらを見ると、 Out[L] にデータを格納したら、次の格納に備えて L の値を 1 増やす処理をしていることがわかります。空欄 b も同じはずです。</p>
<p>したがって、選択肢アの L ← L + 1 が正解です。</p>
<p>&nbsp;</p>
<p><span class="chip mag_rt10">解答</span>a － エ, b － ア</p>
<div class="divider mag_h50"></div>
<p><span class="bold">「習うより慣れろ」</span>ということわざがあります。アルゴリズム穴埋め問題の克服に関しては、正にその通りでしょう。</p>
<p>この連載では、これからも短い練習問題を掲載していきますので、穴埋めに慣れることを目指してください。</p>
<p>正解を見出すポイントとして、同じことが示されることもあると思いますが、それは、多くの問題に共通したポイントがあるからです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_trace/">トレースのテクニックが身につく練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報技術者試験 午前免除（修了試験）の講評 ～ 2020年6月14日実施</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/report_fe_special_test_202006/</link>
		<pubDate>Mon, 15 Jun 2020 02:15:10 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午前免除試験]]></category>
		<category><![CDATA[試験講評]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=guide&#038;p=4206</guid>
		<description><![CDATA[<p>試験対策講座の講師として、誠に勝手ながら、 2020 年 6 月 14 日（日）に実施された基本情報技術者の午前免除試験（修了認定に係る試験）の講評をさせていただきます。 今回受験された人は ふりかえり の題材として、今 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/report_fe_special_test_202006/">基本情報技術者試験 午前免除（修了試験）の講評 ～ 2020年6月14日実施</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>試験対策講座の講師として、誠に勝手ながら、 2020 年 6 月 14 日（日）に実施された基本情報技術者の午前免除試験（修了認定に係る試験）の講評をさせていただきます。</p>
<p>今回受験された人は ふりかえり の題材として、今後受験される人は対策の資料として、参考にしていただければ幸いです。</p>
<div class="grey lighten-5 pad_20 c-round">
<span class="chip">試験問題と解答</span><a class="mag_lt10" href="https://www.jitec.ipa.go.jp/1_80tokurei/kakomondai/tokurei_Mondai_20200614_FE.pdf" rel="noopener" target="_blank">問題</a></td>
<td><a class="mag_lt10" href="https://www.jitec.ipa.go.jp/1_80tokurei/kakomondai/tokurei_ans_20200614_FE.pdf" rel="noopener" target="_blank">解答</a></td>
</div>
<style>dl.background dt{font-weight:700;margin:1em auto}dl.inline dd{margin-left:2em}@media only screen and (max-width:600px){dl dd,dl.background dd{margin-left:0}}pre{margin-left:-24px!important;margin-right:-24px!important;padding-left:24px!important;padding-right:24px!important;border-radius:unset}</style>
<h2>難易度は例年通り</h2>
<p>今回の試験問題の難易度は、例年通りであり、きちんと勉強していれば、ちゃんと合格点を取れたでしょう。以下は、問題の分類と難易度を示したものです。</p>
<p>この難易度は、私の講師経験から、</p>
<ul class="background c-round">
<li>受講者のほぼ全員ができるものを A （やさしい）</li>
<li>半数ぐらいができるものを B （ふつう）</li>
<li>ほとんどができないものを C （むずかしい）</li>
</ul>
<p>としたものです。</p>
<p>集計すると、</p>
<p>A が 19 問、<br />
B が 52 問<br />
C が  9 問</p>
<p>です。</p>
<p>A が 90 % できて、 B が 60 % できて、 C が 30 % できる（ 4 択問題なのでデタラメでも 25 % できるので 30 % としました）とすれば、正答数の期待値は、</p>
<p>19 問 × 0.9 ＋ 52 問 × 0.6 ＋ 9 問 × 0.3<br />
＝ 51 問</p>
<p>になり、合格点の 80 問中 48 問以上に達しています。</p>
<table class="striped block">
<caption class="grey-text mag_h10">問題の分類と難易度</caption>
<thead class="hide-on-small-only">
<tr>
<th>分野</th>
<th>問題番号（難易度）</th>
</tr>
</thead>
<tbody>
<tr>
<th>情報の基礎理論</th>
<td>問1（B）、問2（B）、問3（C）</td>
</tr>
<tr>
<th>アルゴリズム</th>
<td>問4（B）、問7（A）、問8（A）、問9（B）、問10（B）、問18（B）</td>
</tr>
<tr>
<th>ハードウェア</th>
<td>問5（B）、問6（B）、問11（A）、問12（B）、問20（A）、問21（B）、問22（B）</td>
</tr>
<tr>
<th>ソフトウェア</th>
<td>問17（B）、問19（A）</td>
</tr>
<tr>
<th>システム構成</th>
<td>問13（B）、問15（B）、問16（B）</td>
</tr>
<tr>
<th>マルチメディアとヒューマンインタフェース</th>
<td>問14（B）、問23（A）、問24（C）</td>
</tr>
<tr>
<th>データベース</th>
<td>問25（B）、問26（A）、問27（B）、問28（B）、問29（B）</td>
</tr>
<tr>
<th>ネットワーク</th>
<td>問30（B）、問31（B）、問32（B）、問33（B）、問34（A）</td>
</tr>
<tr>
<th>セキュリティ</th>
<td>問35（B）、問36（B）、問37（A）、問38（B）、問39（B）、問40（B）、問41（A）、問42（C）、問43（B）、問44（B）</td>
</tr>
<tr>
<th>開発技術</th>
<td>問45（B）、問46（A）、問47（B）、問48（B）、問49（B）、問50（C）</td>
</tr>
<tr>
<th>マネジメント系</th>
<td>問51（B）、問52（B）、問53（B）、問54（B）、問55（A）、問56（B）、問57（C）、問58（A）、問59（A）、問60（A）</td>
</tr>
<tr>
<th>ストラテジ系</th>
<td>問61（B）、問62（A）、問63（B）、問64（C）、問65（A）、問66（A）、問67（C）、問68（B）、問69（B）、問70（B）、問71（B）、問72（B）、問73（B）、問74（B）、問75（A）、問76（B）、問77（C）、問78（C）、問79（B）、問80（B）</td>
</tr>
</tbody>
</table>
<p class="small-text grey-text">マネジメント系とストラテジ系は、それぞれを1つの分野としています。</p>
<h2>ほぼ全員ができる問題の例</h2>
<p>今回の試験問題の中から、 A （やさしい）、 B （ふつう）、 C （むずかしい）の具体例をお見せしましょう。</p>
<p>まず、受講者のほぼ全員ができる A の問題です。もしも、このレベルの問題ができないなら「ちゃんと勉強」していないということです。</p>
<div class="card-panel mag_h30">
問 55</p>
<p>サービスマネジメントのプロセス改善におけるベンチマーキングはどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>IT サービスのパフォーマンスを財務，顧客，内部プロセス，学習と成長の観点から測定し，戦略的な活動をサポートする。</dd>
<dt>イ</dt>
<dd>業界内外の優れた業務方法(ベストプラクティス)と比較して，サービス品質及びパフォーマンスのレベルを評価する。</dd>
<dt>ウ</dt>
<dd>サービスのレベルで可用性信頼性，パフォーマンスを測定し，顧客に報告する。</dd>
<dt>エ</dt>
<dd>強み，弱み，機会，脅威の観点から IT サービスマネジメントの現状を分析する。</dd>
</dl>
</div>
<p>ちゃんと勉強していれば、「ベンチマークキング」という言葉の意味を知っているはずです。「優れた業績を上げている他社と自社を比較する」ことなので、選択肢イが正解です。</p>
<p>さらに、ちゃんと勉強していれば、</p>
<dl>
<dt>選択肢ア</dt>
<dd>「財務、顧客、内部プロセス、学習と成長」という言葉から「バランススコアカード」</dd>
<dt>選択肢ウ</dt>
<dd>「サービスレベル」という言葉から「SLA（Service Level Agreement）」</dd>
<dt>選択肢エ</dt>
<dd>「強み、弱み、機会、脅威」という言葉から「SWOT分析」</dd>
</dl>
<p>とわかるはずです。どれも、よく出題される用語です。</p>
<p><span class="chip mag_rt10">解答</span>イ</p>
<h2>半数ぐらいができる問題の例</h2>
<p>次は、受講者の半数ぐらいができる B の問題です。</p>
<p>もしも、このレベルの問題ができないなら、何度も繰り返し練習して克服してください。<span class="u">このレベルの問題ができるかどうかが、合否の分かれ目になるから</span>です。</p>
<div class="card-panel grey lighten-5 z-depth-0 blue-grey-text hide-on-med-and-up c-round mag_h40 small-text">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、SQL 文は横スクロールすると全文をご覧になれます
</div>
<div class="card-panel mag_h30">
問 28</p>
<p>&#8220;中間テスト&#8221; 表からクラスごと，教科ごとの平均点を求め，クラス名，教科名の昇順に表示する SQL 文中の a に入れる字句はどれか。</p>
<dl>
<dt></dt>
<dd>中間テスト (クラス名, 教科名, 学生番号, 名前, 点数)</dd>
</dl>
<p>〔SQL 文〕</p>
<pre class="mag_h10">
<code class="language-sql">SELECT クラス名, 教科名,  AVG(点数) AS 平均点
  FROM 中間テスト
  [　　a　　]</code>
</pre>
<p>ア　</p>
<pre><code class="language-sql">GROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数) </code></pre>
<p>イ　</p>
<pre><code class="language-sql">GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名</code></pre>
<p>ウ　</p>
<pre><code class="language-sql">GROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点</code></pre>
<p>エ　</p>
<pre><code class="language-sql">GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名</code></pre>
</div>
<p>SQL 文でデータをグループ分けする GROUP BY と、データを整列させる ORDER BY に関する問題です。</p>
<p>「クラスごと、教科ごと」は、 SQL 文で「クラス、教科名でグループ分けして」と表現することになるので、<code class="language-sql pad_w05">GROUP BY クラス名, 教科名</code>が適切です。</p>
<p>「クラス名、教科の昇順」は、 SQL 文で「クラス名、教科の昇順に整列して」と表現することになるので、<code class="language-sql pad_w05">ORDER BY クラス名, 教科名 ASC</code>が適切です。</p>
<p>昇順を意味する <code class="language-sql pad_w10">ASC</code> は省略できるので、 <code class="language-sql">ORDER BY クラス名, 教科名</code> とすることもできます。以上のことから、選択肢イが正解です。</p>
<p>&nbsp;</p>
<p>SQL 文は、午前試験でも午後試験でもよく出題されるので、しっかりとマスターしておきましょう。</p>
<p>そのために、 SQL 文に関する過去問題を数多く解いてください。もしも、知らない構文に遭遇したら、そのつど、教材（きっと何らかの教材をお持ちでしょう）を参照して意味を調べてください。</p>
<p><span class="chip mag_rt10">解答</span>イ</p>
<div class="divider mag_bt20"></div>
<p><i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a class="tag" href="../../tag/sql">SQL</a></p>
<h2>ほとんどができない問題の例</h2>
<p>最後は、受講者のほとんどができない C の問題です。</p>
<p>もしも、このレベルの問題ができなくても、あまり気にしないでください。 80 問中 48 問以上（ 60 % 以上）できれば合格なのですから、少しぐらいできない問題があっても合否には影響しないからです。</p>
<p>C レベルの問題は、それほど多くありません。今回は、 9 問でした。</p>
<div class="card-panel mag_h30">
問 42</p>
<p>インターネットに接続された利用者の PC から，DMZ 上の公開 Web サイトにアクセスし，利用者の個人情報を入力すると，その個人情報が内部ネットワークのデー タベース(DB) サーバに蓄積されるシステムがある。このシステムにおいて，利用 者個人のディジタル証明書を用いた TLS 通信を行うことによって期待できるセキュリティ上の効果はどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>PC と DB サーバ間の通信データを暗号化するとともに，正当な DB サーバであるかを検証することができるようになる。</dd>
<dt>イ</dt>
<dd>PC と DB サーバ間の通信データを暗号化するとともに，利用者を認証することができるようになる。</dd>
<dt>ウ</dt>
<dd>PC と Web サーバ間の通信データを暗号化するとともに，正当な DB サーバであるかを検証することができるようになる。</dd>
<dt>エ</dt>
<dd>PC と Web サーバ間の通信データを暗号化するとともに，利用者を認証することができるようになる。</dd>
</dl>
</div>
<p>「公開鍵暗号方式」や「ディジタル署名」の仕組みを知っていても、「ディジタル証明書」や「 TLS 通信」を知らないという人が多いでしょう。せっかくなので、この機会に覚えておきましょう。</p>
<dl class="background c-round">
<dt>ディジタル証明書</dt>
<dd>認証局（ CA ＝ Certificate Authority  ）によって発行される証明書であり、暗号化やディジタル署名に使われる公開鍵の所有者が、ちゃんと認証局に申請を行っていることを示します。</dd>
<dt>TLS 通信</dt>
<dd>TLS（ Transport Layer Security ）というプロトコルを使った通信であり、公開鍵暗号方式を使って、通信相手の認証、暗号化、改ざんの検出を行えます。</dd>
</dl>
<p>この問題では、「利用者個人のディジタル証明書を用いた通信」なので、利用者の認証、利用者の PC から Web サーバ間の通信の暗号化、およびデータの改ざんの検出が行えます。これに該当するのは、選択肢エです。</p>
<p>利用者の PC がアクセスしているのが Web サーバであること（ DB サーバではありません）、認証の対象となるのが利用者であること（ DB サーバではありません）に注意してください。</p>
<p><span class="chip mag_rt10">解答</span>エ</p>
<h2>見たことない問題の例</h2>
<p>これまでの<strong>午前免除試験の内容は、ほぼ 100 % が過去問題の再利用</strong>であり、それは今回も同様でした。</p>
<p>ただし、 1 問だけ「こんな問題見たことない！」というものがあったはずです。それは、以下の問題です。</p>
<div class="card-panel mag_h30">
問 3<br />
(1 + α)<sup>n</sup> の計算を， 1 + n × α で近似計算ができる条件として，適切なものはどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>|α| が 1 に比べて非常に小さい。</dd>
<dt>ィ</dt>
<dd>|α| が n に比べて非常に大きい。</dd>
<dt>ウ</dt>
<dd>|α ÷ n| が 1 よりも大きい。</dd>
<dt>エ</dt>
<dd>|n × α| が 1 よりも大きい。</dd>
</dl>
</div>
<p>この問題を見たことがなくても当然です。なぜなら、これは <span class="bold">応用情報技術者試験の過去問題</span><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_1/2017h29h_ap_am_qs.pdf#page=3" rel="noopener" target="_blank">（平成 29 年度 春期 問 2 ）</a>だからです。</p>
<p>見るからに難しそうですが、たったの 1 問だけなのですから、まったく気にする必要はありません。とは言え「どうしても気になる」という人もいると思いますので、解説しておきましょう。</p>
<p>&nbsp;</p>
<p>このような問題を解くときに「式を変形して正解を導こう」と考える必要はありません。</p>
<p><span class="u">選択肢があるのですから、具体例を想定して、選択肢の中から最も適切なものを選べばよい</span>のです。</p>
<p>たとえば、全体として n ＝ 2 を想定し、それぞれの選択肢で α の値を想定して、近似計算ができるかどうかを確認してみましょう。</p>
<div class="background c-round">
選択肢アは、 |α| が 1 に比べて非常に小さいのですから、 α ＝ 0.1 を想定してみます（非常に小さくはありませんが、試験会場では電卓を使えないので簡単な値にしています）。</p>
<p>（ 1 ＋ α ）<sup>2</sup><br />
＝ （ 1 ＋ 0.1 ）<sup>2</sup><br />
＝ 1.21</p>
<p>であり、 1 ＋ n × α ＝ 1 ＋ 2 × 0.1 ＝ 1.2 なので、近似計算ができるといえます。
</p></div>
<div class="background c-round">
選択肢イは、 |α| が n に比べて非常に大きいのですから、 α ＝ 10 を想定してみます（これも非常に大きくはありませんが、試験会場では電卓を使えないので簡単な値にしています）。</p>
<p>（ 1 ＋ α ）<sup>2</sup><br />
＝ （ 1 ＋ 10 ）<sup>2</sup><br />
＝ 121</p>
<p>であり、 1 ＋ n × α ＝ 1 ＋ 2 × 10 ＝ 21 なので、近似計算ができるとはいえません。
</p></div>
<div class="background c-round">
選択肢ウは、| α ÷ n | が 1 よりも大きいのですから、 α ＝ 4 を想定してみます。</p>
<p>（ 1 ＋ α ）<sup>2</sup><br />
＝ （ 1 ＋ 4 ）<sup>2</sup><br />
＝ 25</p>
<p>であり、 1 ＋ n × α ＝ 1 ＋ 2 × 4 ＝ 9 なので、近似計算ができるとはいえません。
</p></div>
<div class="background c-round">
選択肢エは、 | n × α | が 1 よりも大きいのですから、 α ＝ 10 を想定してみます。</p>
<p>（ 1 ＋ α ）<sup>2</sup><br />
＝ （ 1 ＋ 10 ）<sup>2</sup><br />
＝ 121</p>
<p>であり、 1 ＋ n × α ＝ 1 ＋ 2 × 10 ＝ 21 なので、近似計算ができるとはいえません。
</p></div>
<p>以上のことから、選択肢アが正解ですが、いかがでしょうか。</p>
<p>もしも「具体例を想定するやり方でも難しい！」と思ったらなら、この問題を気にしないで構いません。たった 1 問題だけの応用情報技術者試験の問題なのですから。</p>
<p><span class="chip mag_rt10">解答</span>ア</p>
<div class="divider mag_bt20"></div>
<p><i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a class="tag" href="../../tag/テクニック-具体的な値を想定">テクニック 具体的な値を想定</a></p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>以上、試験対策講座の講師として、誠に勝手ながら、試験問題の講評をさせていただきました。</p>
<p>無事に合格できた人は、ここで手を抜かずに、午後試験の学習を始めてください。残念な結果になってしまった人は、ここで気落ちせずに、午前試験と午後試験の学習を並行して進めてください。</p>
<p>いずれにしても、最終的なゴールは、 2020 年 10 月に開催予定の春期の代替試験です。皆様のご健闘をお祈り申し上げます！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/report_fe_special_test_202006/">基本情報技術者試験 午前免除（修了試験）の講評 ～ 2020年6月14日実施</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>配列を分割するプログラム（マージソート）｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/loop/</link>
		<pubDate>Tue, 12 May 2020 01:18:41 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=patterns_algorithms&#038;p=4029</guid>
		<description><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。 苦手を克服するには [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/loop/">配列を分割するプログラム（マージソート）｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。</p>
<p>苦手を克服するには、短いプログラムを何度も練習して、穴埋めに慣れることが重要です。</p>
<p>そのために、旧制度の午後試験のアルゴリズム過去問題の一部をアレンジした練習問題を作りました。とても短い問題ですので、気軽に取り組んでください。</p>
<style>article,article pre{font-family:consolas,'Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -7.5%;padding:1em 7.5%}.card-panel>pre{margin:1em -24px;padding:1em 24px}@media screen and (max-width: 600px){dd{margin-left:1em;}}</style>
<h2>練習問題</h2>
<div class="card-panel">
問 8 「マージソート」（平成 22 年度 春期 午後）を一部改変</p>
<p>手続 Split は、要素数 num 個の配列 list を 2 つに分割して、前半部を配列 slist1 に格納し、後半部を配列 slist2 に格納する。配列の添字は、 0 から始まる。プログラム中の<span class="blank">a</span>に入れる正しい答えを、解答群の中から選べ。</p>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<p>［プログラム］</p>
<pre>
◯Split(整数型の配列: list, 整数型: num, 整数型の配列: slist1, 整数型の配列: slist2)
  整数型: num1, num2, i

  num1 ← num ÷ 2        /* slist1の要素数計算 */
  num2 ← num - num1     /* slist2の要素数計算 */

  for (i を 0 から num1 まで 1 ずつ増やす)
    slist1[i] ← list[i]
  endfor

  for (i を 0 から num2 まで 1 ずつ増やす)
    slist2[i] ←  <span class="blank">a</span>
  endfor</pre>
<p>a の解答群</p>
<p>ア　list[i]　　<br class="hide-on-med-and-up">イ　list[num + i]<br />
ウ　list[num1 + i]　　<br class="hide-on-med-and-up">エ　list[num2 + i]
</div>
<h2>ポイント1: 変数に具体的な値を想定する</h2>
<p>すべての問題に共通したポイントがあります。それは、<span class="bold">変数に具体的な値を想定する</span> ということです。</p>
<p>このプログラムには、配列の要素数として num 、num1 、num2 という変数が登場しますが、それらを「 num 、num1 、num2 は、何らかの値だ」と思っていたのでは、プログラムの内容をつかめないでしょう。</p>
<div class="background c-round">
具体的な値として、たとえば num に 7 を想定してみてください。</p>
<p>num1 ← num ÷ 2 なので、 num1 は 7 ÷ 2 = 3 になります（整数型の計算なので除算の小数点以下がカットされます）。<br />
num2 ← num &#8211; num1 なので、 num2 は 7 &#8211; 3 = 4 になります。</p>
<p>これによって「 要素数 num 個の配列を num1 個と num2 個に分割する」というつかみどころのない問題が、</p>
<p><span class="bold">要素数 7 個の配列を 3 個と 4 個に分割する</span></p>
<p>という明確な問題になりました。
</p></div>
<h2>ポイント2: ループは最初の処理を想定する</h2>
<p>「要素数 7 個の配列を 3 個と 4 個に分割する」という想定で、<span class="blank">a</span>の穴埋めをやってみましょう。</p>
<p>この<span class="blank">a</span>は、変数 i を使ったループ（繰り返し処理）の中にあります。きっと「うわっ！ ループだ！ 苦手だ！」という人が多いでしょう。</p>
<pre>
  for (i を 0 から num2 まで 1 ずつ増やす)
    slist2[i] ←  <span class="blank">a</span>
  endfor
</pre>
<p>ループの穴埋めをするポイントは、 <span class="bold">最初の処理を想定する</span> ということです。</p>
<p>「ループなのだから、最初から最後まで処理の流れを追いかける必要があるのでは？」と思っていたのでは、頭が混乱してしまいます。<br />
<span class="u">「ループの穴埋めは、繰り返しのどの場面でも成り立つのだから、わかりやすい最初の処理を想定しよう」</span>と割り切ってください。</p>
<p>そうすれば、ぐっと気持ちが楽になります。</p>
<div class="background c-round">
最初の処理では、変数 i = 0 です。</p>
<p>i = 0 のときに <span class="blank">a</span> に何が入ればよいか考えればよいのです。
</div>
<h2>ポイント3: 必ず解答群を見て考える</h2>
<p>「考える」といっても、プログラムの空欄だけを見て考えるのではありません。これも、すべての問題に共通したポイントなのですが、<span class="bold">必ず解答群を見て考える</span> ようにしてください。</p>
<p>ここでは、</p>
<ul class="background c-round">
<li>要素数 7 個の配列を 3 個と 4 個に分割する（ num = 7, num1 = 3, num2 = 4 ）</li>
<li>i = 0</li>
</ul>
<p>を想定しています。</p>
<p>したがって、</p>
<p>slist2[i] ← <span class="blank">a</span>の部分は、<br />
slist2[0] ← <span class="blank">a</span>です。</p>
<p>配列 slist1 の先頭の要素である slist2[0] に代入するものが答えです。</p>
<div class="background c-round">
配列 list の list[0] ～ list[6] のうち、</p>
<dl>
<dt>前半の 3 個の list[0] ～ list[2]</dt>
<dd>-> 配列 slist1 に格納</dd>
<dt>後半の 4 個の list[3] ～ list[6]</dt>
<dd>-> 配列 slist2 に格納</dd>
</dl>
<p>となります。</p>
<p>ここでは先頭の要素を想定しているので、</p>
<p>slist2[0] ← <span class="blank">a</span> は、<br />
slist2[0] ← list[3] です。
</div>
<p>さあ、これで穴埋めの準備がすべて整いました。</p>
<p>num = 7 、num1 = 3 、num2 = 4 、i = 0 を想定して list[3] になるものを、解答群から選んでみましょう。</p>
<p>変数のままの解答群は、以下のようになっています。</p>
<p>ア　list[i]　　<br class="hide-on-med-and-up">イ　list[num + i]<br />
ウ　list[num1 + i]　　<br class="hide-on-med-and-up">エ　list[num2 + i]</p>
<p>これらに num = 7 、num1 = 3 、num2 = 4 、i = 0 を設定すると、以下のようになります。</p>
<p>ア　list[0]　　イ　list[7]<br />
ウ　list[3]　　エ　list[4]</p>
<p>これらの中で、list[3] になっているのは、選択肢ウだけです。したがって、選択肢ウが正解です。</p>
<p>いかがでしょう。「あれあれ、できちゃった！」という気持ちになって、苦手意識が解消されたでしょう。</p>
<p>もしも、「 1 回練習しただけでは不安」なら、何度も繰り返し記事を読んで、ポイントをしっかりとつかんでください。</p>
<p>&nbsp;</p>
<p><span class="chip mag_rt10">解答</span>ウ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p><span class="bold">「習うより慣れろ」</span>ということわざがあります。アルゴリズム穴埋め問題の克服に関しては、正にその通りでしょう。</p>
<p>この連載では、これからも短い練習問題を掲載していきますので、穴埋めに慣れることを目指してください。</p>
<p>正解を見出すポイントとして、同じことが示されることもあると思いますが、それは、多くの問題に共通したポイントがあるからです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/loop/">配列を分割するプログラム（マージソート）｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>「厳選5題」過去問と解説 &#124; 平成22年度 春期 の過去問やるならこれをやれ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h22_spring/</link>
		<pubDate>Mon, 25 Nov 2019 04:58:39 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午前問題]]></category>
		<category><![CDATA[正規化]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=kakomon-gensen&#038;p=3120</guid>
		<description><![CDATA[<p>ここでは、平成 22 年度 春期 基本情報技術者試験の午前試験 の中から「やるべき問題」を 5 題に厳選し、ぶっちゃけた解説をさせていただきます。 やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習し [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h22_spring/">「厳選5題」過去問と解説 | 平成22年度 春期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>ここでは、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22_1/2010h22h_fe_am_qs.pdf" rel="noopener" target="_blank">平成 22 年度 春期 基本情報技術者試験の午前試験</a> の中から「やるべき問題」を 5 題に厳選し、ぶっちゃけた解説をさせていただきます。</p>
<p>やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習しないとできない問題）です。</p>
<style>pre{margin-right:-24px!important;margin-left:-24px!important;padding-right:24px!important;padding-left:24px!important}blockquote p{color:#607d8b}table{font-size:.85em;}@media screen and (min-width:601px){.responsive-width{width:60%}}</style>
<h2>【厳選問題 1 】<br />CPU がカチカチ信号で動作しているイメージをつかもう</h2>
<div class="card-panel mag_h30">
問 9　(平成 22 年度 春期)</p>
<p>表の CPI と構成比率で，3 種類の演算命令が合計 1,000,000 命令実行されるプログラムを，クロック周波数が 1 GHz のプロセッサで実行するのに必要な時間は何ミリ秒か。</p>
<table class="centered mag_h20 responsive-width">
<thead>
<tr>
<th>演算命令</th>
<th>CPI ( Cycles Per Instruction )</th>
<th>構成比率 ( % )</th>
</tr>
<tbody>
<tr>
<td>浮動小数点加算</td>
<td>3</td>
<td>20</td>
</tr>
<tr>
<td>浮動小数点乗算</td>
<td>5</td>
<td>20</td>
</tr>
<tr>
<td>整数演算</td>
<td>2</td>
<td>60</td>
</tr>
</tbody>
</thead>
</table>
<p>ア　0.4　　イ　2.8　　ウ　4.0　　エ　28.0
</p></div>
<div class="chip">解説</div>
<p>「クロック周波数」や「 CPI 」という言葉をご存知ですか？ ご存知でないなら、この問題で覚えてください。</p>
<p>コンピュータの演算制御装置であるプロセッサ（ CPU とも呼びます）は、時計のようにカチカチと繰り返される電気信号で動作していて、これを<span class="mag_w05 bold">クロック信号</span>と呼びます。<br />
1 秒間にプロセッサに与えられるクロック信号の数を<span class="mag_w05 bold">クロック周波数</span>と呼び<span class="bold mag_w05">Hz（ヘルツ）</span>という単位で示します。</p>
<p>たとえば、クロック周波数が 1 GHz なら、1 秒間に 1 G 個= 1 × 10<sup>9</sup> 個のクロック信号がプロセッサに与えられます。</p>
<p>プロセッサが解釈・実行する命令は、命令の種類によって何個のクロック信号が必要なのかが決まっていて、これを<span class="mag_w05 bold">CPI（ Cycles Per Instruction ）</span>という単位で示します。</p>
<p>たとえば、3 個のクリック信号で解釈・実行できる命令の CPI は、3 です。ここまでが、この問題を解くために必要な知識です。</p>
<p>&nbsp;</p>
<p>それでは、問題を解いてみましょう。</p>
<p>3 種類の演算命令があり、それぞれ CPI の値が異なります。ここでは、命令の構成比率（プログラムの中で使われている比率）が示されているので、3 つの命令を平均した CPI は、</p>
<div class="background c-round">
3 × 0.2 + 5 × 0.2 + 2 × 0.6 = 2.8
</div>
<p>になります。</p>
<p>プログラムの中には、全部で 1000000 命令あるので、プログラムを実行するのに必要はクロック数は、全部で</p>
<div class="background c-round">
2.8 × 1000000 = 2.8 × 10<sup>6</sup> 個
</div>
<p>です。</p>
<p>これを 1 GHz のクロック周波数、つまり 1 秒間に 1 G 個= 1 × 10<sup>9</sup> 個のクロック信号が与えられるプロセッサで実行するのですから、</p>
<div class="background c-round">
（ 2.8 × 10<sup>6</sup> ）÷（ 1 × 10<sup>9</sup> ）<br />
= 2.8 × 10<sup>-3</sup><br />
= 2.8 ミリ秒
</div>
<p>かかります。したがって、選択肢イが正解です。</p>
<p><span class="chip">解答</span>イ</p>
<h2>【厳選問題 2 】<br />ターンアラウンドタイムの意味を知っていればわかります</h2>
<div class="card-panel mag_h30">
問 15　(平成 22 年度 春期)</p>
<p>一つのジョブについての，ターンアラウンドタイム，CPU 時間，入出力時間及び処理待ち時間の四つの時間の関係を表す式はどれか。ここで，ほかのオーバヘッド時間は考慮しないものとする。</p>
<p>ア　処理待ち時間 = CPU 時間 + ターンアラウンドタイム + 入出力時間<br />
イ　処理待ち時間 = CPU 時間 &#8211; ターンアラウンドタイム + 入出力時間<br />
ウ　処理待ち時間 = ターンアラウンドタイム &#8211; CPU 時間 &#8211; 入出力時間<br />
エ　処理待ち時間 = 入出力時間 &#8211; CPU 時間 &#8211; ターンアラウンドタイム
</p></div>
<div class="chip">解説</div>
<p>選択肢に「処理待ち時間 = 」という式が並んでいますが、この問題のテーマは「処理待ち時間」ではありません。<span class="bold">「ターンアラウンドタイムの意味を知っていますか？」</span> という問題です。</p>
<p>&nbsp;</p>
<p>「ターンアラウンドタイム」は、「バッチ処理」の処理時間を示すものです。</p>
<p>バッチ（ batch ）は、「束」という意味であり、バッチ処理は「複数データをまとめて処理すること」を意味します。</p>
<p>たとえば、1 日の営業時間に発生した数多くのデータを、営業時間後にまとめて処理するのが、バッチ処理です。バッチ処理では、データの演算だけでなく、<span class="bold">データの入出力にも多くの時間がかかります。</span></p>
<p>したがって、バッチ処理の処理時間であるターンアラウンドタイムは、</p>
<div class="background c-round">
ターンアラウンドタイム = データの演算時間 + データの入出力時間
</div>
<p>という式になります。</p>
<p>&nbsp;</p>
<p>選択肢では、「データの演算時間」を「 CPU 時間」と示し、「データの入出力時間」を「入出力時間」と示しています。</p>
<p>さらに「処理待ち時間」という項目がありますが、これはバッチ処理にかかる時間なので、ターンアラウンドタイムに加えます。</p>
<p>&nbsp;</p>
<p>以上のことから、</p>
<div class="background c-round">
ターンアラウンドタイム = CPU 時間 + 入出力時間 + 処理待ち時間
</div>
<p>という式ができ、これを「処理待ち時間 = 」に変形すると、</p>
<div class="background c-round">
処理待ち時間 = ターンアラウンド &#8211; CPU 時間 &#8211; 入出力時間
</div>
<p>になります。したがって、選択肢ウが正解です。</p>
<p><span class="chip">解答</span>ウ</p>
<h2>【厳選問題 3 】<br />落ち着いてやってみれば、とっても簡単な計算です</h2>
<div class="card-panel mag_h30">
問 17　(平成 22 年度 春期)</p>
<p>あるオンラインリアルタイムシステムでは，20 件/秒の頻度でトランザクションが発生する。このトランザクションは CPU 処理と 4 回の磁気ディスク入出力処理を経て終了する。磁気ディスク装置の入出力処理時間は 40 ミリ秒 / 回であり，CPU 処理時間は十分に短いものとする。それぞれの磁気ディスク装置が均等にアクセスされるとしたとき，このトランザクション処理には最低何台の磁気ディスク装置が必要か。</p>
<p>ア　3　　イ　4　　ウ　5　　エ　6
</p></div>
<div class="chip">解説</div>
<p>一見して「うわっ！ 難しそう」と思われる問題ですが、落ち着いてやってみれば、とっても簡単な問題です。<span class="bold">こういう問題を練習しておくと、「やればできる！」という自信が付きます。</span></p>
<p>少しずつ問題の内容を見てみましょう。</p>
<blockquote><p>あるオンラインリアルタイムシステムでは、20 件 / 秒の頻度でトランザクションが発生する</p></blockquote>
<p>とは、単に「 1 秒間に 20 件の処理が発生する」と考えれば OK です。トランザクションは、処理のまとまりを意味する言葉であり、1 件、2 件と数えます。</p>
<blockquote><p>このトランザクションは CPU 処理と 4 回の磁気ディスク入出力処理を経て終了する</p></blockquote>
<p>とあり、さらに</p>
<blockquote><p>磁気ディスク装置の入出力時間は 40 ミリ秒 / 回であり、CPU 時間は十分に短いものとする</p></blockquote>
<p>なので、1 件のトランザクションの処理時間は、短い CPU 時間を無視して、4 回の磁気ディスク入出力処理だけの時間になります。</p>
<p>これは、4 回 × 40 ミリ秒 / 回 = 160 ミリ秒です。</p>
<blockquote><p>それぞれの磁気ディスク装置が均等にアクセスされるとしたとき、このトランザクション処理には最低何台の磁気ディスク装置が必要か</p></blockquote>
<p>ですから、1 秒間に 20 件のトランザクションを処理するために必要な磁気ディスク装置の台数を求めればよいのです。</p>
<p>1 件のトランザクションあたり 160 ミリ秒かかるので、1 台の磁気ディスク装置は、</p>
<div class="background c-round">
1 秒当たり、1 秒 ÷ 160 ミリ秒<br />
= 1000 ミリ秒 ÷ 160 ミリ秒<br />
= 6.25 件
</div>
<p>のトランザクションを処理できます。0.25 という中途半端な処理はできないので、端数を切り捨てて 6 件です。</p>
<p>1 台で 6 件を処理できるので、20 件を処理するには、20 件 ÷ 6 件 = 3.33・・・台の磁気ディスク装置が必要であり、端数を切り上げて 4 台です。</p>
<p>したがって、選択肢イが正解です。どうです？ とっても簡単な問題だったでしょう！</p>
<p><span class="chip">解答</span>イ</p>
<h2>【厳選問題 4 】<br />この問題で第3正規形かどうかを判断する方法を覚えよう</h2>
<div class="card-panel mag_h30">
問 30　(平成 22 年度 春期)</p>
<p>&#8220;発注伝票&#8221; 表を第3 正規形に書き換えたものはどれか。ここで、下線部は主キーを表す。</p>
<pre class="language-none">
発注伝票 (<span style="border-bottom: 1px solid white">注文番号</span>, <span style="border-bottom: 1px solid white">商品番号</span>, 商品名, 注文数量)
</pre>
<pre class="language-none">
ア  発注 (<span style="border-bottom: 1px solid white">注文番号</span>, 注文数量)
    商品 (<span style="border-bottom: 1px solid white">商品番号</span>, 商品名)

イ  発注 (<span style="border-bottom: 1px solid white">注文番号</span>, 注文数量)
    商品 (<span style="border-bottom: 1px solid white">注文番号</span>, <span style="border-bottom: 1px solid white">商品番号</span>, 商品名)

ウ  発注 (<span style="border-bottom: 1px solid white">注文番号</span>, <span style="border-bottom: 1px solid white">商品番号</span>, 注文数量)
    商品 (<span style="border-bottom: 1px solid white">商品番号</span>, 商品名)

エ  発注 (<span style="border-bottom: 1px solid white">注文番号</span>, <span style="border-bottom: 1px solid white">商品番号</span>, 注文数量)
    商品 (<span style="border-bottom: 1px solid white">商品番号</span>, 商品名, 注文数量)
</pre>
</div>
<div class="chip">解説</div>
<p>関係データベースの正規化理論がテーマの問題です。</p>
<p>正規化理論では、表の状態を「非正規形」「第 1 正規形」「第 2 正規形」「第 3 正規形」に区別し、それぞれ以下のように定義しています。</p>
<p>「繰り返し」「部分従属性」「推移従属性」が排除すべきものであり、すべてを排除した状態が第3正規形です。</p>
<dl class="mag_h30 background c-round">
<dt>非正規形</dt>
<dd>繰り返しがある。</dd>
<dt>第 1 正規形</dt>
<dd>繰り返しを排除している。</dd>
<dt>第 2 正規形</dt>
<dd>第 1 正規形を満たし、さらに部分従属性を排除している。</dd>
<dt>第 3 正規形</dt>
<dd>第 2 正規形を満たし、さらに推移従属性を排除している。</dd>
</dl>
<p>理論的に考えると難しいのですが、第 3 正規形とは、早い話が「主キーに従属した列だけの表」です。</p>
<p>主キーとは、レコード（行）を特定できるユニークな情報を持つ列です。<br />
従属とは「列 A によって列 B が特定できる」ということです。</p>
<p>これを「 A → B 」のように矢印で示すとわかりやすいでしょう。</p>
<p>以下は、第 3 正規形の表の例です。A 、B 、C 、D 、E は、何らかの情報を持った列だとします。</p>
<p>主キーは、下線を付けた A です。主キー A から B 、C 、D 、E に向かって従属性の矢印が引けています。このような矢印だけが引ければ、第 3 正規形だと判断できます。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/11/q30_h22_s_figure1.png"><br />
</figure>
<p>それでは、問題を見てみましょう。</p>
<p>問題では「表名（ 列名1, 列名2, ・・・）」という形式で表を示していますが、わかりやすいように列を枠で囲んで表を示します。</p>
<p>問題に示された「発注伝票」表は、「注文番号」と「商品番号」の 2 つの列をセットにして主キーにしています。このような主キーを「複合キー」と呼びます。</p>
<p>従属性の線を引くと、以下のように、「注文数量」は、複合キーの「注文番号」と「商品番号」に従属しますが、「商品名」は「商品番号」だけに依存します。</p>
<p>これを「部分従属性」と呼び、部分従属性の線があると第 3 正規形ではありません。第 3 正規形は、「主キーに従属した列だけの表」だからです。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/11/q30_h22_s_figure2.png"><br />
</figure>
<p>このような場合には、「注文番号」と「商品番号」の複合キーに従属する「注文数量」を持つ表 1 と、「商品番号」に従属する「商品名」を持つ表 2 に分割します。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/11/q30_h22_s_figure3.png"><br />
</figure>
<p>したがって、選択肢ウが正解です。</p>
<p><span class="chip">解答</span>ウ</p>
<div class="divider mag_h30"></div>
<p><i class="material-icons light-blue-text">search</i><span class="grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/正規化" class="tag">正規化</a></p>
<h2>【厳選問題 5 】<br />M や N を使った式は、具体例を想定すればわかります</h2>
<div class="card-panel mag_h30">
問 41　(平成 22 年度 春期)</p>
<p>パスワードに使用できる文字の種類の数を M ，パスワードの文字数を n とするとき，設定できるパスワードの理論的な総数を求める数式はどれか。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/11/q41_h22_s_figure1.png"><br />
</figure>
</div>
<div class="chip">解説</div>
<p>M 種類の文字で文字数 n のパスワードを作ると、その総数はいくつになりますか？ という問題です。</p>
<p>このように M だの n だのと言っている問題には、定番の解法があります。それは、<span class="bold">「 M や n に具体的な数値を想定する」</span>です。</p>
<p>選択肢があるのですから、その具体例を代入して同じ値になるものが正解です。</p>
<p>&nbsp;</p>
<p>例として、M = 3 種類の文字「 A 」「 B 」「 C 」で、文字数 n = 2 のパスワードを作るとしましょう。</p>
<p>パスワードの総数は、<br />
「 AA 」「 AB 」「 AC 」「 BA 」「 BB 」「 BC 」「 CA 」「 CB 」「 CC 」<br />
の 9 通りです。</p>
<p>選択肢に示された式に、M = 3、n = 2 を代入すると、以下になります。</p>
<dl class="mag_h30">
<dt>選択肢ア</dt>
<dd>3<sup>2</sup> = 9</dd>
<dt>選択肢イ</dt>
<dd>( 3 × 2 × 1 ) / ( 1 ) = 6</dd>
<dt>選択肢ウ</dt>
<dd>( 3 × 2 × 1 ) / ( ( 2 × 1 ) × ( 1 ) ) = 3</dd>
<dt>選択肢エ</dt>
<dd>( 4 × 3 × 2 × 1 ) / ( ( 2 × 1 ) × ( 2 × 1 ) ) = 6</dd>
</dl>
<p>9 になっている選択肢アが正解です。</p>
<p><span class="chip">解答</span>ア</p>
<div class="divider mag_h30"></div>
<p><i class="material-icons light-blue-text">search</i><span class="grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/テクニック-具体的な値を想定/" class="tag">テクニック 具体的な値を想定</a></p>
<p>&nbsp;</p>
<div class="divider mag_bt30"></div>
<p>記事をお読みいただきありがとうございます。</p>
<p>もしも、一度解いただけでは、よくわからない問題があったなら、わかるまで何度でも練習してください。<span class="bold">「やるべき問題」は「わかるまでやるべき問題」</span>だからです。</p>
<p>この厳選問題大全集が、受験者の皆様のお役に立てば幸いです。</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h22_spring/">「厳選5題」過去問と解説 | 平成22年度 春期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>「厳選5題」過去問と解説 &#124; 平成24年度 春期 の過去問やるならこれをやれ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h24_spring/</link>
		<pubDate>Wed, 18 Sep 2019 09:23:13 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[2進数]]></category>
		<category><![CDATA[PPM]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午前問題]]></category>
		<category><![CDATA[工数]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=kakomon-gensen&#038;p=2130</guid>
		<description><![CDATA[<p>ここでは、平成 24 年度 春期 基本情報技術者試験の午前試験 の中から「やるべき問題」を 5 題に厳選し、ぶっちゃけた解説をさせていただきます。 やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習し [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h24_spring/">「厳選5題」過去問と解説 | 平成24年度 春期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>ここでは、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_am_qs.pdf" rel="noopener" target="_blank">平成 24 年度 春期 基本情報技術者試験の午前試験</a> の中から「やるべき問題」を 5 題に厳選し、ぶっちゃけた解説をさせていただきます。</p>
<p>やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習しないとできない問題）です。</p>
<style>h2 .chip{vertical-align:middle;background:#3f51b5;color:white;margin-right:.75em;}.chip i{font-size:2em!important;}dl.inline dd{margin-left:5em;}</style>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_one</i></span>自分流に具体例を書けばイメージをつかめます</h2>
<div class="card-panel mag_h30">
問 7　(平成 24 年度 春期)</p>
<p>多数のデータが単方向リスト構造で格納されている。 このリスト構造には，先頭ポインタとは別に、末尾のデータを指し示す末尾ポインタがある。 次の操作のうち，ポインタを参照する回数が最も多いものはどれか。</p>
<p>ア　リストの先頭にデータを挿入する。<br />
イ　リストの先頭のデータを削除する。<br />
ウ　リストの末尾にデータを挿入する。<br />
エ　リストの末尾のデータを削除する。
</p></div>
<div class="chip">解説</div>
<p>この問題を見て「まったくイメージが思い浮かばない！」と思った人が多いでしょう。</p>
<p>このような問題は、自分流の具体例を書いてみましょう。 そうすれば、イメージをつかめます。 以下に具体例の例を示しますので、参考にしてください。</p>
<p>&nbsp;</p>
<p>単方向リストですから、1 つの要素が「データの値」と「ポインタ（次にどこいつながっているか）」という 2 つの情報を持っています。</p>
<p>ここでは、要素数 5 個のリストを想定して、それぞれのデータを「あ」「い」「う」「え」「お」とします。</p>
<p>それぞれの要素に 100 番地、200 番地、300 番地、400 番地、500 番地という適当なアドレスを想定して、個々の要素のポインタを設定します。</p>
<p>先頭の要素のアドレスを持つ先頭ポインタと、末尾の要素のアドレスを持つ末尾ポインタがあるので、それらに 100 番地と 500 番地を設定します。 リストのつながりを矢印で示して、具体例のできあがりです。</p>
<figure><figcaption>図　自分流の具体例を書いた例</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/my_own_figure_pointer.png" loading="lazy"><br />
</figure>
<p>具体例が書けたので、問題を解く準備ができました。 ポインタを参照する回数が最も多い操作を選ぶ問題なので、それぞれの選択肢の操作を実際にやってみましょう。</p>
<p>選択肢アの「リストの先頭にデータを挿入する」は、</p>
<ol class="background c-round">
<li>600 番地に「か」という要素を追加することを想定し、先頭ポインタを参照して（ 1 回目）、その 100 番地という情報を追加した要素のポインタに設定し、先頭ポインタを 600 番地に変更</li>
</ol>
<p>します。</p>
<p>ポインタの参照は、1 回だけです。</p>
<figure><figcaption>図　ア　リストの先頭にデータを挿入する</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/my_own_figure_option_a.png" loading="lazy"><br />
</figure>
<p>選択肢イの「リストの先頭のデータを削除する」は、</p>
<ol class="background c-round">
<li>先頭ポインタを参照して（ 1 回目）</li>
<li>先頭の要素のポインタを参照して（ 2 回目）、その 200 番地という情報を先頭ポインタに設定</li>
</ol>
<p>します。</p>
<p>ポインタの参照は、2 回です。</p>
<figure><figcaption>図　イ　リストの先頭のデータを削除する</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/my_own_figure_option_i.png" loading="lazy"><br />
</figure>
<p>選択肢ウの「リストの末尾にデータを挿入する」は、</p>
<ol class="background c-round">
<li>600 番地に「か」「次はなし」という要素を追加することを想定し、末尾ポインタを参照して（ 1 回目）、末尾の要素の「次はなし」を追加した要素の「次は 600 番地」に変更し、さらに末尾ポインタを「末尾は 600 番地」に変更</li>
</ol>
<p>します。</p>
<p>ポインタの参照は、1 回だけです。</p>
<figure><figcaption>図　ウ　リストの末尾にデータを挿入する</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/my_own_figure_option_u.png" loading="lazy"><br />
</figure>
<p>選択肢エの「リストの末尾のデータを削除する」は、</p>
<ol class="background c-round">
<li>末尾ポインタを参照して（ 1 回目）「末尾は 500 番地」を記憶しておき、</li>
<li>先頭ポインタを参照して（ 2 回目）100 番地の要素にアクセスし、</li>
<li>その要素のポインタを参照して（ 3 回目）「次は 500 番地」ではないので 200 番地の要素にアクセスし、</li>
<li>その要素のポインタを参照して（ 4 回目）「次は 500 番地」ではないので 300 番地の要素にアクセスし、</li>
<li>その要素のポインタを参照して（ 5 回目）「次は 500 番地」ではないので 400 番地の要素にアクセスし、</li>
<li>その要素のポインタを参照して（ 6 回目）「次は 500 番地」なのでそれを「次はなし」に変更し、末尾ポインタを「末尾は 400 番地」に変更</li>
</ol>
<p>します。</p>
<p>ポインタの参照は、6 回です。</p>
<figure><figcaption>図　エ　リストの末尾のデータを削除する</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/my_own_figure_option_e.png" loading="lazy"><br />
</figure>
<p>以上のことから、ポインタを参照する回数が最も多い操作は、選択肢エです。</p>
<p><span class="chip mag_tp30">解答</span> エ</p>
<div class="grey lighten-5 pad_20 c-round">
<i class="material-icons indigo-text">search</i> 関連タグ <a class="tag" href="../../tag/テクニック-具体的な値を想定/">テクニック 具体的な値を想定</a>
</div>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_two</i></span>事前にしっかりと練習しておけば試験当日に焦りません</h2>
<div class="card-panel mag_h30">
問 20　(平成 24 年度 春期)</p>
<p>次の条件で四つのジョブが CPU 処理及び印刷を行う場合に，最初の CPU 処理を開始してから最後の印刷が終了するまでの時間は何分か。</p>
<ol>
〔条件〕</p>
<li>多重度 1 で実行される。</li>
<li>各ジョブの CPU 処理時間は 20 分である。</li>
<li>各ジョブは CPU 処理終了時に 400 M バイトの印刷データをスプーリングする。<br />
スプーリング終了後に OS の印刷機能が働き，プリンタで印刷される。</li>
<li>プリンタは 1 台であり，印刷速度は 100 M バイト当たり 10 分である。</li>
<li>CPU 処理と印刷機能は同時に動作可能で，互いに影響を及ぼさない。</li>
<li>スプーリングに要する時間など，条件に記述されていない時間は無視できる。</li>
</ol>
<p>ア　120　　イ　160　　ウ　180　　エ　240
</p></div>
<div class="chip">解説</div>
<p>もしも、この問題を試験当日に初めて見たら、「ジョブ」「多重度」「スプーリング」という言葉に惑わされて、「何これ！ どうやって解くの？」と大いに焦るでしょう。 こういう問題こそ、事前にしっかりと練習しておくべきです。</p>
<p>&nbsp;</p>
<p>まず、言葉の意味を説明しましょう。</p>
<dl class="background c-round">
<dt class="bold">「ジョブ」</dt>
<dd>プログラムのことです。</dd>
<dt class="bold">「多重度」</dt>
<dd>同時に実行されるプログラムの数のことです。</dd>
</dl>
<p>ここでは、「多重度 1 」ですから、同時に実行されるプログラムはなく、1 つのプログラムの実行が終了してから、次のプログラムの実行が開始されます。</p>
<p>「スプーリング」とは、低速の周辺装置へ出力するデータを OS が預かる機能です。</p>
<p>ここでは、低速なプリンタへの印刷データを OS が預かっています。</p>
<p>問題文の 6. に</p>
<blockquote>
<p class="grey-text">「スプーリングに要する時間など、条件に記述されていない時間は無視できる」</p>
</blockquote>
<p>とあるので、スプーリングは瞬時に行われます。</p>
<p>したがって、CPU 処理と印刷処理を行う個々のジョブから見ると、CPU 処理が終わった時点で瞬時に印刷処理（実際にはスプーリング）が終了し、次のジョブを開始できます。</p>
<p>OS は、プリンタの処理速度に合わせて、預かった印刷データを出力します。</p>
<p>&nbsp;</p>
<p>次に、それぞれの処理時間を確認しましょう。</p>
<p>ジョブは、全部で 4 つあり、それぞれが 20 分の CPU 処理と瞬時の印刷処理（スプーリング）を行います。</p>
<p>個々のジョブの印刷データが 400 M バイトで、プリンタの印刷速度が 100 M バイトあたり 10 分です。</p>
<p>したがって、個々のジョブの印刷には、400 M バイト × 100 M バイト × 10 分 ＝ 40 分かかります。</p>
<p>&nbsp;</p>
<p>CPU 処理と印刷処理の順序を図に書いてみましょう。</p>
<p>4 つのジョブを A 、B 、C 、D とし、それぞれの CPU 処理と印刷処理を色分けして示します。 CPU 処理が終わると、すぐに次の CPU 処理が開始されること、印刷処理は、CPU 処理とは別に、順番に行われることがポイントです。</p>
<figure><figcaption>図　CPU 処理と印刷処理の順序</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/my_own_figure_option_e.png" loading="lazy"><br />
</figure>
<p>図を書いたことで、最初の CPU 処理を開始しから最後の印刷処理が終了するまでの時間は、180 分あることがわかりました。 ウが正解です。</p>
<p><span class="chip mag_tp30">解答</span> ウ</p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_3</i></span>ハードウェアの問題は 2 進数の問題です</h2>
<div class="card-panel mag_h30">
問 25　(平成 24 年度 春期)</p>
<p>7セグメント LED 点灯回路で，出力ポートに 16 進数で 6D を出力したときの表示状態はどれか。 ここで， P7 を最上位ビット(MSB)， P0  を最下位ビット( LSB )とし， ポート出力が 1 のとき， LED は点灯する。</p>
<figure>
  <img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2019/09/h24_spring_q25_figure.png" loading="lazy"><br />
</figure>
<div class="row">
<div class="col s3">
ア　<img src="../../wp-content/uploads/2019/09/h24_spring_q25_option_a.png">
</div>
<div class="col s3">
イ　<img src="../../wp-content/uploads/2019/09/h24_spring_q25_option_i.png">
</div>
<div class="col s3">
ウ　<img src="../../wp-content/uploads/2019/09/h24_spring_q25_option_u.png">
</div>
<div class="col s3">
エ　<img src="../../wp-content/uploads/2019/09/h24_spring_q25_option_e.png">
</div>
</div>
</div>
<div class="chip">解説</div>
<p>私の講師経験では、「ハードウェアが苦手です」という受験者が多いようです。</p>
<p>そんな人が、この問題を見たら「何これ？ 電気回路なんてわからない！」と思うでしょう。</p>
<p>でも、ご安心ください。</p>
<p>基本情報技術者試験のハードウェアの問題は、結局のところ 2 進数の問題だからです。 電気回路がわからなくても、 2 進数がわかれば問題を解けます。</p>
<p>&nbsp;</p>
<p>ディジタルの電気回路では、1 本の電線で 2 進数の 1 桁の情報が伝達されます。</p>
<p>この問題では、出力ポート（データを出力する窓口）にある P0 ～ P7 の 8 本の電線を使って、8 桁の 2 進数が出力され、それぞれが 7 セグメント LED の a ～ Dt に接続されます。</p>
<p>7セグメント LED とは、7 つの LED を数字の 8 の形に並べ、それらのいくつかを点灯させることで数字や文字の形にするものです。 この LED には、小数点（ドット）を示す LED もあります。</p>
<p>&nbsp;</p>
<p>問題に、「ポート出力が 1 のとき、LED は点灯する」とあります。</p>
<p>これは、P0 ～ P7 の 8 本の電線につながった a ～ Dt のうち、1 が伝達されているものが点灯するという意味です。</p>
<p>ここでは、16 進数で 6D ＝ 2 進数で 01101101 を出力しています。</p>
<p>P7 が最上位ビットで、P0 が最下位ビットなので、Dt 、g 、f 、e 、d 、c 、b 、a のうち、1 になっている g 、f 、d 、c 、a が点灯します。</p>
<figure><figcaption>図　01101101 の出力による LED の点灯</figcaption><img class="materialboxed z-depth-5" style="width:50%;margin:auto;" src="../../wp-content/uploads/2019/09/h24_spring_q25_led.png" loading="lazy"><br />
</figure>
<p>これによって、数字の 5 の形になります。 正解は、ウです。</p>
<p><span class="chip mag_tp30">解答</span> ウ</p>
<div class="grey lighten-5 pad_20 c-round">
<i class="material-icons indigo-text">search</i> 関連タグ <a class="tag" href="../../tag/2進数">2進数</a>
</div>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_4</i></span>算数の文章問題の大人版だと思って解いてください</h2>
<div class="card-panel mag_h30">
問 53　(平成 24 年度 春期)</p>
<p>設計書の作成状況が表のとおりであるとき， 3 種類の設計書全ての作成を完了させるために必要な今後の工数(人時)は幾らか。</p>
<table class="bordered mag_h20 centered responsive-width">
<thead>
<tr>
<th>設計書</th>
<th>作成枚数<br />(枚)</th>
<th>1 枚当たりの所要工数<br />(人時)</th>
<th>現在までの作成済み枚数<br />(枚)</th>
</tr>
</thead>
<tbody>
<tr>
<td>基本設計書</td>
<td>80</td>
<td>5</td>
<td>80</td>
</tr>
<tr>
<td>概要設計書</td>
<td>300</td>
<td>2</td>
<td>200</td>
</tr>
<tr>
<td>詳細設計書</td>
<td>500</td>
<td>2</td>
<td>50</td>
</tr>
</tbody>
</table>
<p>ア　550　　イ　900　　ウ　1100　　エ　2000
</p></div>
<div class="chip">解説</div>
<p>この問題を見て「何これ？ 工数の計算方法なんて知らない！」と思ったなら、心配しなくて大丈夫です。</p>
<p>基本情報には、事前に公式を暗記する必要がある問題が出たことがありません。 常識的な考えで計算できます。</p>
<p>小学校や中学校の算数で、「文章問題（文章を読んで計算式を考える問題）」がありましたが、その大人版のようなものです。</p>
<p>&nbsp;</p>
<p>それでは、常識的な考えで、問題を解いてみましょう。</p>
<p>基本設計書は、80 枚のうち 80 枚が作成済みなので、残りの工数はありません。</p>
<p>概要設計書は、300 枚のうち 200 枚が作成済みなので、残り 100 枚です。 1 枚当たりの所要工数が 2 人時なので、この 100 枚には 2 × 100 ＝ 200 人時の工数がかかります。</p>
<p>詳細設計書は、500 枚のうち 50 枚が作成済みなので、残り 450 枚です。 1 枚当たりの所要工数が 2 人時なので、この 450 枚には 2 × 450 ＝ 900 人時の工数がかかります。</p>
<p>&nbsp;</p>
<p>以上のことから、3 種類の設計書全ての作成を完成させるために必要な今後の工数は、200 人時 ＋ 900 人時 ＝ 1100 人時であり、ウが正解です。</p>
<p><span class="chip mag_tp30">解答</span> ウ</p>
<div class="grey lighten-5 pad_20 c-round">
<i class="material-icons indigo-text">search</i> 関連タグ <a class="tag" href="../../tag/工数/">工数</a>
</div>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_5</i></span>花形、金のなる木、問題児、負け犬は、そう呼ばれる理由で覚えよう</h2>
<div class="card-panel mag_h30">
問 67　(平成 24 年度 春期)</p>
<p>プロダクトポートフォリオマネジメント( PPM )における &#8220;花形&#8221; を説明したものはどれか。</p>
<p>ア　市場成長率，市場占有率ともに高い製品である。 成長に伴う投資も必要とするので，資金創出効果は大きいとは限らない。<br />
イ　市場成長率，市場占有率ともに低い製品である。 資金創出効果は小さく，資金流出量も少ない。<br />
ウ　市場成長率は高いが，市場占有率が低い製品である。 長期的な将来性を見込むことはできるが，資金創出効果の大きさは分からない。<br />
エ　市場成長率は低いが，市場占有率は高い製品である。 資金創出効果が大きく，企業の支柱となる資金源である。
</p></div>
<div class="chip">解説</div>
<p>この問題を見て「何これ？ 花形って役者のことじゃないの！」と思われて当然です。 もともと英語だった言葉を、日本人の感覚に合わせて意訳したものだからです。</p>
<p>プロダクト・ポートフォリオ・マネジメント（ Product Portfolio Management ＝ PPM ）は、1970 年代に米国の Boston Consulting Group が提唱した経営資源（製品や事業など）のマネジメント手法です。 経営資源を、市場成長率と市場占有率の高低から、Stars 、Cash Cows 、Question Marks 、Dogs の 4 つに分類します。</p>
<p>これらが、「花形」「金のなる木」「問題児」「負け犬」と意訳されているのです。 それぞれが何であるかは、丸暗記ではなく、そう呼ばれる理由を納得して覚えてください。 そうすれば、決して忘れません。</p>
<figure><figcaption>図　プロダクト・ポートフォリオ・マネジメント</figcaption><img class="materialboxed z-depth-5 responsive-width pad_05" src="../../wp-content/uploads/2019/09/ppm.png" loading="lazy"><br />
</figure>
<p>市場成長率が高ければ、お金がかかることになります。 市場占有率が高ければ、お金を稼ぐことになります。</p>
<ul class="background c-round">
<li>市場成長率が高く、市場占有率も高い経営資源は、お金がかかりますが、お金も稼ぐので、<span class="bold">花形</span>です。</li>
<li>市場成長率が低く、市場占有率が高い経営資源は、お金がかからないのに、お金を稼ぐので、<span class="bold">金のなる木</span>です。</li>
<li>市場成長率が高いのに、市場占有率が低い経営資源は、お金をかけているのに、お金を稼がないので、<span class="bold">問題児</span>です。</li>
<li>そして、市場成長率が低く、市場占有率も低い経営資源は、お金がかかりませんが、お金も稼がないので、<span class="bold">負け犬</span>です。</li>
</ul>
<p>それでは、選択肢を見てみましょう。</p>
<p>選択肢アは、市場成長率、市場占有率ともに高い製品なので、花形です。 したがって、正解はアです。</p>
<p>念のため他の選択肢も見ておきましょう。</p>
<dl class="background c-round inline">
<dt>選択肢イ</dt>
<dd>市場成長率、市場占有率ともに低い製品なので、負け犬です。</dd>
<dt>選択肢ウ</dt>
<dd>市場成長率が高く、市場占有率が高い製品なので、問題児です。</dd>
<dt>選択肢エ</dt>
<dd>市場成長率が低く、市場占有率が高い製品なので、金のなる木です。</dd>
</dl>
<p><span class="chip mag_tp30">解答</span> ア</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p>記事をお読みいただきありがとうございます。</p>
<p>もしも、一度解いただけでは、よくわからない問題があったなら、わかるまで何度でも練習してください。 <span class="bold">「やるべき問題」は「わかるまでやるべき問題」</span>だからです。</p>
<p>この厳選問題大全集が、受験者の皆様のお役に立てば幸いです。</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h24_spring/">「厳選5題」過去問と解説 | 平成24年度 春期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
