<?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%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Mon, 20 Apr 2026 07:08:52 +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>新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 2</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_2/</link>
		<pubDate>Wed, 06 Jul 2022 04:25:29 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></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=guide&#038;p=6612</guid>
		<description><![CDATA[<p>2023 年 4 月から基本情報技術者試験の制度が変更され、特に科目 B 試験（従来の午後試験に該当するもの）の内容が大きく変わります。 IPA（独立行政法人情報処理推進機構）は、「基本情報技術者試験 科目 B のサンプ [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_2/">新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 2</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2023 年 4 月から基本情報技術者試験の制度が変更され、特に科目 B 試験（従来の午後試験に該当するもの）の内容が大きく変わります。 IPA（独立行政法人情報処理推進機構）は、<a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B のサンプル問題」</a>として、アルゴリズムとプログラミングの問題を 5 問と、情報セキュリティの問題を 1 問だけ公開しています。</p>
<p><a href="../new_algorithm_and_programming_1/">前回の記事</a>では、アルゴリズムとプログラミングの問題を 3 問取り上げました。 この記事では、残りの 2 問を取り上げて、解法のポイントを説明します。</p>
<style>table{font-size:.9em;}pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;background:#1a2638;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}dl.inline dd{margin-left:2em;}</style>
<h2>サンプル問題（問 4 ） データを特性に応じた構造に変換する</h2>
<p>アルゴリズムとプログラミングの問題は、</p>
<ol class="background c-round">
<li>「プログラムの基本要素（型、変数、配列、代入、算術演算、比較演算、論理演算、選択処理、繰返し処理、手続・関数の呼出し、など）」</li>
<li>「データ構造及びアルゴリズム（再帰、スタック、キュー、木構造、グラフ、連結リスト、整列、文字列処理、など）」</li>
<li>「プログラミングの諸分野への適用（数理・データサイエンス・ AI などの分野を題材としたプログラム、など）」</li>
</ol>
<p>という 3 つのカテゴリに分けられています。</p>
<p>サンプル問題の問 4 は「プログラミングの諸分野への適用」の問題です。 出題趣旨は、</p>
<blockquote>
<p class="grey-text">「多変量解析や機械学習などを用いたデータサイエンスの取組に当たっては、データを、特性に応じた構造に変換することがある。本問では、疎行列の格納に適したデータ構造への変換を題材として、プログラムの動作の理解を問う」</p>
</blockquote>
<p>です。 以下に、問題を示します。</p>
<div class="background c-round mag_h30 blue-grey-text small-text">問題はすべて<a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B のサンプル問題」</a> より出典</div>
<div class="divider mag_h50"></div>
<div class="chip">プログラミングの諸分野への適用</div>
<p class="bold">問 4</p>
<p>次の記述中の<span class="blank">a</span>～<span class="blank">c</span>に入れる正しい答えの組合せを，解答群の中から選べ。ここで，配列の要素番号は 1 から始まる。</p>
<p>　要素の多くが 0 の行列を疎行列という。次のプログラムは，二次元配列に格納された行列のデータ量を削減するために，疎行列の格納に適したデータ構造に変換する。</p>
<p>　関数 transformSparseMatrix は，引数 matrix で二次元配列として与えられた行列を，整数型配列の配列に変換して返す。 関数 transformSparseMatrix を<br />
transformSparseMatrix({{3, 0, 0, 0, 0}, {0, 2, 2, 0, 0}, {0, 0, 0, 1, 3}, {0, 0, 0, 2, 0}, {0, 0, 0, 0, 1}}) として呼び出したときの戻り値は，{{ <span class="blank">a</span> }, { <span class="blank">b</span> }, { <span class="blank">c</span> }} である。</p>
<p>〔プログラム〕</p>
<pre>○整数型配列の配列: transformSparseMatrix(整数型の二次元配列: matrix)
 整数型: i, j
 整数型配列の配列: sparseMatrix
 sparseMatrix ← {{}, {}, {}} /* 要素数0の配列を三つ要素にもつ配列 */
 for (i を 1 から matrixの行数 まで 1 ずつ増やす)
   for (j を 1 から matrixの列数 まで 1 ずつ増やす)
     if (matrix[i, j] が 0 でない)
       sparseMatrix[1]の末尾 に iの値 を追加する
       sparseMatrix[2]の末尾 に jの値 を追加する
       sparseMatrix[3]の末尾 に matrix[i, j]の値 を追加する
     endif
   endfor
 endfor
 return sparseMatrix</pre>
<p>解答群</p>
<table class="bordered responsive-width">
<thead>
<tr>
<th></th>
<th>a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
<tbody>
<tr>
<th>ア</th>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>3, 2, 2, 1, 2, 3, 1</td>
</tr>
<tr>
<th>イ</th>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>3, 2, 2, 1, 3, 2, 1</td>
</tr>
<tr>
<th>ウ</th>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>3, 2, 2, 1, 2, 3, 1</td>
</tr>
<tr>
<th>エ</th>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>3, 2, 2, 1, 3, 2, 1</td>
</tr>
</tbody>
</table>
<div class="divider mag_h30"></div>
<p>出題趣旨に沿って、問題の内容を見てみましょう。</p>
<blockquote>
<p class="grey-text">「変量解析や機械学習などを用いたデータサイエンスの取組み」</p>
</blockquote>
<p>という大きな趣旨ではあっても、そのほんの一部である</p>
<blockquote>
<p class="grey-text bold text-darken-5">「データを、特性に応じた構造に変換すること」</p>
</blockquote>
<p>がテーマの問題です。</p>
<blockquote>
<p class="grey-text">「二次元配列に格納された行列のデータ量を削減するために、疎行列の格納に適したデータ構造に変換する」</p>
</blockquote>
<p>ためのプログラムが示されているので、その内容から変換方法を読み取ってください。</p>
<dl class="background c-round">
<dt>「行列」</dt>
<dd>要素を縦と横に並べたものであり、プログラムでは 2 次元配列で表せます。</dd>
<dt>「疎行列」</dt>
<dd>ほとんどの要素が 0 である行列のことです。 0 でない要素だけを保存すれば、疎行列のデータ量を削減できます。</dd>
</dl>
<p>多くのプログラミング言語では、 2 次元配列を<span class="u">「 1 次元配列を要素とした 1 次元配列」</span>として表現します。 この問題に示されたプログラムも同様です。 変換する前の疎行列は、以下の内容になっています。 ここでは、わかりやすいように、要素（ 2 次元配列の要素の 1 次元配列）ごとに改行して示しています。</p>
<figure><figcaption>図　変換前の疎行列 matrix の内容</figcaption><pre>matrix = {
  {3, 0, 0, 0, 0}, <span class="cyan-text"><i class="material-icons">label</i> 1 行目</span>
  {0, 2, 2, 0, 0}, <span class="cyan-text"><i class="material-icons">label</i> 2 行目</span>
  {0, 0, 0, 1, 3}, <span class="cyan-text"><i class="material-icons">label</i> 3 行目</span>
  {0, 0, 0, 2, 0}, <span class="cyan-text"><i class="material-icons">label</i> 4 行目</span>
  {0, 0, 0, 0, 1}, <span class="cyan-text"><i class="material-icons">label</i> 5 行目</span>
}</pre>
</figure>
<p>こうすると、行と列がわかりやすくなります。 問題文の中に</p>
<blockquote>
<p class="grey-text">「配列の要素番号は 1 から始まる」</p>
</blockquote>
<p>とあるので、先頭は 0 行目ではなく 1 行目です。</p>
<p>&nbsp;</p>
<p>ここでは、変換前の 2 次元配列が matrix であり、変換後の 2 次元配列が sparseMatrix です。</p>
<p>for 文による多重ループで matrix[i行][j列] を取り出し、もしも値が 0 でないなら、 sparseMatrix[1] の末尾に i の値を追加し、 sparseMatrix[2] の末尾に j の値を追加し、 sparseMatrix[3] の末尾に matrix[i行][j列] の値を追加します。</p>
<p>つまり、疎行列の 0 でない要素を取り出し、その行の値を sparseMatrix[1] に、列の値を sparseMatrix[2] に、要素の値を sparseMatrix[3] に格納するのです。 これは、プログラムの以下の部分です。</p>
<figure><figcaption>疎行列 matrix の 0 でない要素の情報を sparseMatrix に格納する</figcaption><pre>for (i を 1 から matrixの行数 まで 1 ずつ増やす)
  for (j を 1 から matrixの列数 まで 1 ずつ増やす)
    if (matrix[i, j] が 0 でない)
      sparseMatrix[1]の末尾 に iの値 を追加する <span class="cyan-text"><i class="material-icons">label</i> 要素の行の値</span>
      sparseMatrix[2]の末尾 に jの値 を追加する <span class="cyan-text"><i class="material-icons">label</i> 要素の列の値</span>
      sparseMatrix[3]の末尾 に matrix[i, j]の値 を追加する <span class="cyan-text"><i class="material-icons">label</i> 要素の値</span>
    endif
  endfor
endfor</pre>
</figure>
<p>ここまでプログラムを読み取れれば、変換後の sparseMatrix の内容がわかるでしょう。</p>
<p>以下に示したように、変換前の疎行列 matrix の (1) ～ (7) の要素の行、列、値が、それぞれ sparseMatrix[1] 、 sparseMatrix[2] 、 sparseMatrix[3] に追加されていきます。</p>
<figure><figcaption>図　変換前の疎行列 matrix の 0 でない値</figcaption><pre>matrix = {
  {<span class="cyan-text bold">3<sup>(1)</sup></span>, 0, 0, 0, 0}, <span class="cyan-text">(1) 1 行、 1 列、値 3</span>
  {0, <span class="cyan-text bold">2<sup>(2)</sup></span>, <span class="cyan-text bold">2<sup>(3)</sup></span>, 0, 0}, <span class="cyan-text">(2) 2 行、 2 列、値 2 / (3) 2 行、 3 列、値 2</span>
  {0, 0, 0, <span class="cyan-text bold">1<sup>(4)</sup></span>, <span class="cyan-text bold">3<sup>(5)</sup></span>}, <span class="cyan-text">(4) 3 行、 4 列、値 1 / (5) 3 行、 5 列、値 3</span>
  {0, 0, 0, <span class="cyan-text bold">2<sup>(6)</sup></span>, 0}, <span class="cyan-text">(6) 4 行、 4 列、値 2</span>
  {0, 0, 0, 0, <span class="cyan-text bold">1<sup>(7)</sup></span>}, <span class="cyan-text">(7) 5 行、 5 列、値 1</span>
}</pre>
</figure>
<p>したがって、</p>
<p>sparseMatrix[1] の内容は {1, 2, 2, 3, 3, 4, 5}、<br />
sparseMatrix[2] の内容は {1, 2, 3, 4, 5, 4, 5}、<br />
sparseMatrix[3] の内容は {3, 2, 2, 1, 3, 2, 1}</p>
<p>になります。選択肢イが正解です。</p>
<h2>サンプル問題（問 5 ）ライブラリを適切に利用する</h2>
<p>サンプル問題の問 5 も「プログラミングの諸分野への適用」の問題です。出題趣旨は、</p>
<blockquote>
<p class="grey-text">「文書を構成する言葉や文字に関する統計情報は、自然言語処理などに活用されている。本問では、ある文字に後続する文字の出現割合の計算を題材として、問題文に示されたプログラムの仕様を理解した上で、ライブラリを適切に利用し、正しく処理を実装する能力を問う」</p>
</blockquote>
<p>です。以下に、問題を示します。</p>
<div class="divider mag_h50"></div>
<div class="chip">プログラミングの諸分野への適用</div>
<p class="bold">問 5</p>
<p>次のプログラム中の<span class="blank">a</span>と<span class="blank">b</span>に入れる正しい答えを，解答群の中から選べ。</p>
<p>　任意の異なる 2 文字を c1， c2 とするとき，英単語群に含まれる英単語において， c1 の次に c2 が出現する割合を求めるプログラムである。英単語は，英小文字だけから成る。英単語の末尾の文字が c1 である場合，その箇所は割合の計算に含めない。例えば，図に示す 4 語の英単語  &#8220;importance&#8221; ， &#8220;inflation&#8221; ， &#8220;information&#8221; ， &#8220;innovation&#8221; から成る英単語群において， c1 を &#8220;n&#8221; ， c2 を &#8220;f&#8221; とする。英単語の末尾の文字以外に &#8220;n&#8221; は五つあり，そのうち次の文字が &#8220;f&#8221; であるものは二つである。したがって，求める割合は， 2 ÷ 5 = 0.4 である。 c1 と c2 の並びが一度も出現しない場合， c1 の出現回数によらず割合を 0 と定義する。</p>
<figure>
  <img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2022/07/sample_q5_figure.jpg" loading="lazy"><figcaption>図 4 語から成る英単語群の例</figcaption></figure>
<p>　プログラムにおいて，英単語群は Words 型の大域変数 words に格納されている。クラス Words のメソッドの説明を，表に示す。本問において，文字列に対する演算子 &#8220;+&#8221; は，文字列の連結を表す。また，整数に対する演算子 &#8220;÷&#8221; は，実数として計算する。</p>
<table class="responsive-width">
<caption>表 クラス Words のメソッドの説明</caption>
<thead>
<tr>
<th>メソッド</th>
<th>戻り値</th>
<th>説明</th>
</tr>
</thead>
<p>  <tbory></p>
<tr>
<td>freq(文字列型: str)</td>
<td>整数型</td>
<td>英単語群中の文字列 str の出現回数を返す。</td>
</tr>
<tr>
<td>freqE(文字列型: str)</td>
<td>整数型</td>
<td>英単語群の中で，文字列 str で終わる英単語の数を返す。</td>
</tr>
</tbody>
</table>
<p>〔プログラム〕</p>
<pre>大域: Words: words /* 英単語群が格納されている */
/* c1の次にc2が出現する割合を返す */
○実数型: prob(文字型: c1, 文字型: c2)
 文字列型: s1 ← c1の1文字だけから成る文字列
 文字列型: s2 ← c2の1文字だけから成る文字列
 if (words.freq(s1 ＋ s2) が 0 より大きい)
  return <span class="blank"></span>
 else
  return 0
 endif</pre>
<p>解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>(words.freq(s1) &#8211; words.freqE(s1)) ÷ words.freq(s1 + s2)</dd>
<dt>イ</dt>
<dd>(words.freq(s2) &#8211; words.freqE(s2)) ÷ words.freq(s1 + s2)</dd>
<dt>ウ</dt>
<dd>words.freq(s1 + s2) ÷ (words.freq(s1) &#8211; words.freqE(s1))</dd>
<dt>エ</dt>
<dd>words.freq(s1 + s2) ÷ (words.freq(s2) &#8211; words.freqE(s2))</dd>
</dl>
<div class="divider mag_h30"></div>
<p>この問題も</p>
<blockquote>
<p class="grey-text">「文書を構成する言葉や文字に関する統計情報は、自然言語処理などに活用されている」</p>
</blockquote>
<p>という壮大な趣旨ではあっても、そのほんの一部である</p>
<blockquote>
<p class="grey-text bold text-darken-5">「ある文字に後続する文字の出現割合の計算」</p>
</blockquote>
<p>がテーマです。</p>
<p>さらに</p>
<blockquote>
<p class="grey-text bold text-darken-5">「ライブラリを適切に利用し、正しく処理を実装する能力を問う」</p>
</blockquote>
<p>という趣旨にも注目してください。</p>
<p>数理、データサイエンス、 AI などのプログラミングでは、あらかじめ用意されているライブラリを活用する場面が多いので、このような趣旨なのでしょう。 どのような機能のライブラリを使うのかは、問題ごとに示されるはずです。</p>
<p>ここでは、ライブラリとして提供されている Word クラスを使います。</p>
<p>問題文を見ると、 Word クラス型の大域変数 word の中に英単語群（複数の英単語）が格納されていて、 Word クラスが freq(文字列型：str) メソッドおよび freqE(文字列型：str) メソッドを持っています。 <span class="u">これらのメソッドの機能を理解することが、問題を解く大きなポイント</span>になります。</p>
<p>&nbsp;</p>
<p>問題に示された図から、</p>
<blockquote>
<p class="grey-text">「 c1 の次に c2 が出現する割合を求める」</p>
</blockquote>
<p>の意味を読み取りましょう。</p>
<p>c1 を &#8220;n&#8221; 、 c2 を &#8220;f&#8221; とした場合、 &#8220;nf&#8221; の出現回数 ÷ ( &#8220;n&#8221; の出現回数 &#8211; 末尾に &#8220;n&#8221; が出現する回数) を求めればよいことがわかります。</p>
<p>プログラムを見ると、文字 c1 を文字列 s1 に変換し、文字 c2 を文字列 s2 に変換しています。 これは、<span class="u">文字と文字列を区別するプログラミング言語を想定している</span>のでしょう。問題文に</p>
<blockquote>
<p class="grey-text">「文字列に対する演算子 &#8220;+&#8221; は、文字列の連結を表す」</p>
</blockquote>
<p>とあるので、 s1 + s2 は、 &#8220;nf&#8221; という文字列になります。</p>
<p>&nbsp;</p>
<p>問題に示された表に、</p>
<dl class="">
<dt>freq(文字列型：str)メソッド</dt>
<dd>「英単語群中の文字列 str の出現回数を返す」</dd>
<dt>freqE(文字列型：str)メソッド</dt>
<dd>「英単語群の中で、文字列 str で終わる英単語の数を返す」</dd>
</dl>
<p>という説明があります。</p>
<p>したがって、 &#8220;nf&#8221; の出現回数 ÷ (&#8220;n&#8221;の出現回数 &#8211; 末尾に &#8220;n&#8221; が出現する回数) は、</p>
<pre>words.freq(s1 + s2) ÷ (words.freq(s1) - words.freqE(s1))</pre>
<p>となり、選択肢ウが正解です。</p>
<p>&nbsp;</p>
<p>もしも、このサンプル問題と同様の問題が従来の午後試験で出題されたとしたら、配列に格納された文字列をコツコツと処理するプログラムが示されたはずです。 それがライブラリを利用するプログラムになっているのですから、<span class="u">科目 B 試験のアルゴリズムとプログラミングの問題は、従来よりも解きやすくなった（やさしくなった）といえます</span>。</p>
<p>ただし、<span class="bold">まったくプログラミング経験がないと、問題の意味がわからない</span>でしょう。</p>
<p>試験対策として、 <span class="u">Java や Python など、ライブラリを活用するプログラミング言語を学習しておくべき</span>です。 科目 B 試験には、プログラミング言語の問題がありませんが、プログラミング言語の知識と経験が要求されます。</p>
<div class="chip mag_tp50">サンプル問題の正解</div>
<p>問 4 － イ　問 5－ ウ</p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>以上、「基本情報技術者試験 科目 B 試験のサンプル問題」の中から、アルゴリズムとプログラミングの問題を取り上げて、解法のポイントを説明しました。 2023 年 4 月以降に基本情報技術者試験を受験される方の参考になれば幸いです。</p>
<p>科目 B のサンプル問題には、情報セキュリティの問題もあります。この問題は、今後の記事で取り上げる予定です。</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_2/">新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 2</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 1</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_1/</link>
		<pubDate>Tue, 07 Jun 2022 06:54:37 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<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=guide&#038;p=6571</guid>
		<description><![CDATA[<p>2023 年 4 月から基本情報技術者試験の制度が変更され、特に科目 B 試験（従来の午後試験に該当するもの）の内容が大きく変わります。 この記事では、 IPA （独立行政法人情報処理推進機構）が公開している「基本情報技 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_1/">新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 1</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2023 年 4 月から基本情報技術者試験の制度が変更され、特に科目 B 試験（従来の午後試験に該当するもの）の内容が大きく変わります。 この記事では、 IPA （独立行政法人情報処理推進機構）が公開している<a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B のサンプル問題」</a>の中から、アルゴリズムとプログラミングの問題を取り上げ、従来からの変更点を説明します。</p>
<style>code{padding:.1em .5em!important;background:#1a2638!important;}table{font-size:.9em;}.bordered > td{border:.1px solid rgba(0,0,0,.12)!important;}pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;background:#1a2638;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}th{text-align:center;}dl.inline dd{margin-left:5em;}dl.inline.mag_lt2em dd{margin-left:2em;}</style>
<h2>サンプル問題（問 1 ） 新たな分岐構文 if</h2>
<p>アルゴリズムとプログラミングの問題は、</p>
<ol class="background c-round">
<li>「プログラムの基本要素（型、変数、配列、代入、算術演算、比較演算、論理演算、選択処理、繰返し処理、手続・関数の呼出し、など）」</li>
<li>「データ構造及びアルゴリズム（再帰、スタック、キュー、木構造、グラフ、連結リスト、整列、文字列処理、など）」</li>
<li>「プログラミングの諸分野への適用（数理・データサイエンス・ AI などの分野を題材としたプログラム、など）」</li>
</ol>
<p>という 3 つのカテゴリに分けられています。</p>
<p>サンプル問題の問 1 は「プログラムの基本要素」の問題です。出題趣旨は、</p>
<blockquote>
<p class="grey-text">「年齢によって決まる施設の入場料を返す処理を題材として、与えられた仕様を満たす選択処理を可能にする条件式を導く能力を問う」</p>
</blockquote>
<p>です。 以下に、問題を示します。</p>
<div class="background c-round mag_h30 blue-grey-text small-text">問題はすべて<a href="https://www.jitec.ipa.go.jp/1_13download/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B のサンプル問題」</a> より出典</div>
<div class="divider mag_h50"></div>
<div class="chip">プログラムの基本要素</div>
<p class="bold">問 1</p>
<p>次のプログラム中の<span class="blank"></span>に入れる正しい答えを，解答群の中から選べ。</p>
<p>ある施設の入場料は，0 歳から 3 歳までは 100 円，4 歳から 9 歳までは 300 円，10 歳以上は 500 円である。関数 fee は，年齢を表す 0 以上の整数を引数として受け取り，入場料を返す。</p>
<p>〔プログラム〕</p>
<pre>○整数型: fee(整数型: age)
 整数型: ret
 if (age が 3 以下)
   ret ← 100
 elseif ( <span class="blank"></span> )
   ret ← 300
 else
   ret ← 500
 endif
 return ret</pre>
<p>解答群</p>
<dl class="inline mag_lt2em">
<dt>ア</dt>
<dd>(age が 4 以上) and (age が 9 より小さい)</dd>
<dt>イ</dt>
<dd>(age が 4 と等しい) or (age が 9 と等しい)</dd>
<dt>ウ</dt>
<dd>(age が 4 より大きい) and (age が 9 以下)</dd>
<dt>エ</dt>
<dd>age が 4 以上</dd>
<dt>オ</dt>
<dd>age が 4 より大きい</dd>
<dt>カ</dt>
<dd>age が 9 以下</dd>
<dt>キ</dt>
<dd>age が 9 より小さい</dd>
</dl>
<div class="divider mag_h30"></div>
<p>プログラムの内容は、擬似言語で示されていますが、<span class="u">従来の試験の擬似言語と比べて記述形式が変わっています</span>。</p>
<p>従来は、分岐（選択）と繰り返しが <code class="language-none">▲</code> や <code class="language-none">■</code> などの図形で示されていましたが、それが <code class="language-none">if</code> や <code class="language-none">while</code> や <code class="language-none">for</code> などの言葉に変わっています。 <span class="u">英語としてプログラムを読めるので、わかりやすくなったといえるでしょう</span>。 従来は、処理の先頭に <code class="language-none">・</code>（ドット）がありましたが、新たな擬似言語にはありません。 ただし、変数への代入は、従来と同じであり <code class="language-none">←</code> で示します。</p>
<p>&nbsp;</p>
<p>プログラムの内容を説明しましょう。</p>
<p>年齢を表す整数型の引数 age を受け取り、戻り値として年齢に応じた入場料を返す fee 関数が定義されています。 関数の定義に <code class="language-none">○</code> を付けることは従来と同じですが、変数（ここでは変数 ret ）の宣言には従来と異なり <code class="language-none">○</code> を付けません。　このような細かな変更は、あまり気にする必要はないでしょう。　問題のテーマは、擬似言語の記述形式を細かく理解することではなく、プログラムの内容を読み取ることだからです。</p>
<p>このプログラムから、<span class="u">新たな擬似言語の分岐の構文を知ってください</span>。</p>
<dl class="background c-round inline">
<div class="chip"><i class="material-icons blue-text">code</i> 新たな分岐の構文と意味</div>
<p></p>
<dt><code class="language-none">if</code></dt>
<dd>もしも</dd>
<dt><code class="language-none">elseif</code></dt>
<dd>そうでなければ、もしも</dd>
<dt><code class="language-none">else</code></dt>
<dd>そうでなければ</dd>
<dt><code class="language-none">endif</code></dt>
<dd>if の終わり</dd>
</dl>
<p><code class="language-none">if</code> の後にある条件（条件はカッコで囲みます）が 真 なら、 if ブロックの処理が行われます。 ブロックとは、処理のまとまりであり、処理の先頭をインデント（スペースを何個か入れて字下げ）することで表します。</p>
<div class="background c-round">
<div class="chip"><i class="material-icons blue-text">code</i> if ブロック</div>
<p class="indigo-text">「 age が 3 以下」という条件が真なら実行される</p>
<pre> if (age が 3 以下)
   ret ← 100</pre>
</div>
<p>そうでない場合は、 <code class="language-none">elseif</code> の条件が真なら、 elseif ブロックの処理が行われます。</p>
<div class="background c-round">
<div class="chip"><i class="material-icons blue-text">code</i> elseif ブロック</div>
<p class="indigo-text">そうではなく空欄の条件が真なら実行される</p>
<pre> elseif ( <span class="blank"></span> )
   ret ← 300</pre>
</div>
<p>そうでない場合は、 else ブロックの処理が行われます。</p>
<div class="background c-round">
<div class="chip"><i class="material-icons blue-text">code</i> else ブロック</div>
<p class="indigo-text">そうではない場合に実行される</p>
<pre> else
   ret ← 500</pre>
</div>
<p>空欄に入る条件を考えてみましょう。</p>
<p>この空欄の条件が 真 なら、戻り値を格納する変数 ret に 300 が代入されます。 問題に</p>
<blockquote>
<p class="grey-text">「 4 歳から 9 歳までは 300 円」</p>
</blockquote>
<p>とあるので、空欄には「 4 歳から 9 歳まで」という条件が入ります。</p>
<p>解答群の中で、この条件に該当するのは、選択肢カの</p>
<blockquote>
<p class="grey-text">age が 9 以下</p>
</blockquote>
<p>です。</p>
<p>ここでは、 <span class="u">4 以上という条件が不要であることに注目</span>してください。</p>
<p>if ブロックの「 age が 3 以下」という条件が 真 でないときに、 elseif ブロックの条件がチェックされます。 「 age が 3 以下」という条件が 真 でないので、 age が 4 以上であることが確定しています。</p>
<p>そのため、 elseif ブロックの「 age が 9 以下」という条件が真なら、「 4 歳から 9 歳まで」ということになるのです。</p>
<h2>サンプル問題（問 2 ） 新たな繰り返し構文 while と for</h2>
<p>サンプル問題の問 2 も「プログラムの基本要素」の問題です。 出題趣旨は、</p>
<blockquote>
<p class="grey-text">「配列の要素の並びを逆順にする処理を題材として、配列の概念を理解した上で、正しく処理を実装する能力を問う」</p>
</blockquote>
<p>です。 以下に、問題を示します。</p>
<div class="divider mag_h50"></div>
<div class="chip">プログラムの基本要素</div>
<p class="bold">問 2</p>
<p>次のプログラム中の<span class="blank">a</span>と<span class="blank">b</span>に入れる正しい答えの組合せを，解答群の中から選べ。ここで，配列の要素番号は 1 から始まる。</p>
<p>次のプログラムは，整数型の配列 array の要素の並びを逆順にする。</p>
<p>〔プログラム〕</p>
<pre>整数型の配列: array ← {1, 2, 3, 4, 5}
整数型: right, left
整数型: tmp

for (left を 1 から (arrayの要素数 ÷ 2 の商) まで 1 ずつ増やす)
  right ←<span class="blank">a</span>
  tmp ← array[right]
  array[right] ← array[left]
  <span class="blank">b</span>← tmp
endfor</pre>
<p>解答群</p>
<table class="responsive-width striped">
<thead>
<tr>
<th></th>
<th>a</th>
<th>b</th>
</tr>
</thead>
<tr>
<th>ア</th>
<td>array の要素数 &#8211; left</td>
<td>array[left]</td>
</tr>
<tr>
<th>イ</th>
<td>array の要素数 &#8211; left</td>
<td>array[right]</td>
</tr>
<tr>
<th>ウ</th>
<td>array の要素数 &#8211; left + 1</td>
<td>array[left]</td>
</tr>
<tr>
<th>エ</th>
<td>array の要素数 &#8211; left + 1</td>
<td>array[right]</td>
</tr>
</table>
<div class="divider mag_h30"></div>
<p>このプログラムから、新たな擬似言語の繰り返しの構文を知ってください。</p>
<div class="background c-round">
<div class="chip"><i class="material-icons blue-text">code</i> 新たな繰り返しの構文</div>
<p><code class="language-none">while</code> および <code class="language-none">for</code>
</div>
<p>この問題では、 <code class="language-none">for</code> を使っています。 <code class="language-none">for</code> の制御記述の部分には、変数の値をどのように変化させながら繰り返すかを記述します。 ここでは、</p>
<pre>(left を 1 から（ array の要素 ÷ 2 の商）まで 1 ずつ増やす)</pre>
<p>です。 <code class="language-none">for</code> と <code class="language-none">endfor</code> （ for の終わりを意味します）で囲まれたブロックの中にある処理が、繰り返し実行されます。</p>
<div class="background c-round">
<div class="chip"><i class="material-icons blue-text">code</i> for ブロック</div>
<p class="indigo-text">for ブロック制御記述に従ってブロックの中の処理が繰り返される</p>
<pre>  right ←<span class="blank">a</span>
  tmp ← array[right]
  array[right] ← array[left]
  <span class="blank">b</span>← tmp</pre>
</div>
<p>擬似言語の記述形式が変わっても、プログラムの内容を読み取るコツは同じです。それは、<span class="u">わかりやすい具体的なデータを想定すること</span>です。</p>
<p>ここでは、プログラムの中に</p>
<pre>整数型の配列： array ← {1, 2, 3, 4, 5}</pre>
<p>という要素数 5 個の配列 array が示されているので、この配列を想定してプログラムを読み取りましょう。 配列の要素は、 <code class="language-none">{</code> と <code class="language-none">}</code> の中に <code class="language-none">,</code> カンマで区切って並べます。</p>
<p>プログラムの内容は、配列 array の要素の並びを逆順にするのですから、 <code class="language-none">{1, 2, 3, 4, 5}</code> を <code class="language-none">{5, 4, 3, 2, 1}</code> にします。</p>
<p>要素数 5 個の配列 array を想定したので、<br />
<code class="language-none">(left を 1 から (array の要素 ÷ 2 の商) まで 1 ずつ増やす) </code>は、 <code class="language-none">(left を 1 から 2 まで 1 ずつ増やす)</code> になります。 </p>
<p>問題に</p>
<blockquote>
<p class="grey-text">「配列の要素番号は 1 から始まる」</p>
</blockquote>
<p>と示されていることに注意してください。 以下は、逆順にする前と後の配列の内容です。</p>
<figure class="mag_h30">
<table class="centered responsive-width">
<tr>
<td>array[1]</td>
<td>array[2]</td>
<td>array[3]</td>
<td>array[4]</td>
<td>array[5]</td>
</tr>
<tr class="bordered">
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</table>
<p class="center red-text"><i class="material-icons red-text" style="transform:rotate(90deg)">forward</i> 逆順にする</p>
<table class="centered responsive-width">
<tr>
<td>array[1]</td>
<td>array[2]</td>
<td>array[3]</td>
<td>array[4]</td>
<td>array[5]</td>
</tr>
<tr class="bordered">
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</table>
</figure>
<p>ここで、繰り返し処理の穴埋めをするコツをお教えしましょう。 それは、<span class="u">最初の 1 回目の処理を想定すること</span>です。</p>
<p>繰り返しの処理をはじめから終わりまで、すべてトレース（処理の流れとデータの変化を追いかけること）する必要はありません。 繰り返し処理は、繰り返しのどの場面でも成り立つのですから、わかりやすい 1 回目の処理を想定して選択肢を想定するのが得策です。</p>
<p>最初の 1 回目の処理では、変数 left （変数の名前から配列の左側の要素番号であることがわかります）の値が 1 です。 array[1] と array[5] を交換すれば、順序が逆順になります。 そのためには、変数 right （変数の名前から配列の右側の要素番号であることがわかります）の値を 5 にする必要があります。</p>
<p>これが空欄 a です。</p>
<p>解答群の中で、 array の要素数が 5 で、 left が 1 のときに、 5 になるのは、</p>
<blockquote>
<p class="grey-text">「 array の要素数 &#8211; left + 1 」</p>
</blockquote>
<p>です。 これで、正解を選択肢ウとエに絞り込めました。</p>
<p>&nbsp;</p>
<p>空欄 a の後にある処理では、変数 tmp （値を一時的に逃がすための変数なので、 temporary を意味する tmp という名前にしています）を使って、 array[left] と array[right] を交換する処理を行います。</p>
<pre>tmp ← array[right]</pre>
<p>で、 array[right] の値を変数 tmp に逃がしました。</p>
<pre>array[right] ← array[left]</pre>
<p>で、 array[right] に array[left] の値を格納しました。</p>
<p>あとは、変数 tmp に逃がしておいた値を array[left] に格納すればよいので</p>
<pre>array[left] ← tmp</pre>
<p>です。</p>
<p>したがって、空欄 b は array[left] であり、選択肢ウが正解です。</p>
<h2>サンプル問題（問 3 ） 新登場 オブジェクト指向</h2>
<p>サンプル問題の問 3 は「データ構造及びアルゴリズム」の問題です。 出題趣旨は、</p>
<blockquote>
<p class="grey-text">「クラスを用いて各要素を表現した単方向リストを題材として、単方向リストに要素を追加する処理を実装する能力を問う」</p>
</blockquote>
<p>です。以下に、問題を示します。</p>
<div class="divider mag_h50"></div>
<div class="chip">データ構造及びアルゴリズム</div>
<p id="sample3" class="bold">問 3</p>
<p>次のプログラム中の<span class="blank">a</span>と<span class="blank">b</span>に入れる正しい答えの組合せを，解答群の中から選べ。</p>
<p>手続 append は，引数で与えられた文字を単方向リストに追加する手続である。単方向リストの各要素は，クラス ListElement を用いて表現する。クラス ListElement の説明を図に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead は，単方向リストの先頭の要素の参照を格納する。リストが空のときは，listHead は未定義である。</p>
<figure>
<table class="responsive-width mag_bt10">
<thead>
<tr>
<th>メンバ変数</th>
<th>型</th>
<th width="40%">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>val</td>
<td>文字型</td>
<td>リストに格納する文字。</td>
</tr>
<tr>
<td>next</td>
<td>ListElement</td>
<td>リストの次の文字を保持するインスタンスの参照。初期状態は未定義である。</td>
</tr>
</tbody>
</table>
<table class="responsive-width">
<thead>
<tr>
<th>コンストラクタ</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>ListElement(文字型: qVal)</td>
<td>引数 qVal でメンバ変数 val を初期化する。</td>
</tr>
</tbody>
</table><figcaption class="center grey-text small-text mag_h10">図 クラス ListElement の説明</figcaption></figure>
<p>〔プログラム〕</p>
<pre>大域: ListElement: listHead ← 未定義の値
○append(文字型: qVal)
 ListElement: prev, curr
 curr ← ListElement(qVal)
 if (listHead が <span class="blank">a</span>)
   listHead ← curr
 else
   prev ← listHead
   while (prev.next が 未定義でない)
     prev ← prev.next
   endwhile
   prev.next ← <span class="blank">b</span>
 endif</pre>
<p>解答群</p>
<table class="responsive-width striped">
<thead>
<tr>
<th></th>
<th>a</th>
<th>b</th>
</tr>
</thead>
<tbody>
<tr>
<th>ア</th>
<td>未定義</td>
<td>curr</td>
</tr>
<tr>
<th>イ</th>
<td>未定義</td>
<td>curr.next</td>
</tr>
<tr>
<th>ウ</th>
<td>未定義</td>
<td>listHead</td>
</tr>
<tr>
<th>エ</th>
<td>未定義でない</td>
<td>curr</td>
</tr>
<tr>
<th>オ</th>
<td>未定義でない</td>
<td>curr.next</td>
</tr>
<tr>
<th>カ</th>
<td>未定義でない</td>
<td>listHead</td>
</tr>
</tbody>
</table>
<div class="divider mag_h30"></div>
<p>この問題では、<span class="u">オブジェクト指向の構文</span>が使われています。</p>
<p>サンプル問題に添付された擬似言語の仕様の中には、オブジェクト指向に関して</p>
<blockquote>
<p class="grey-text">「演算子 . は、メンバ変数又はメソッドのアクセスを表す」</p>
</blockquote>
<p>という記述だけがあります。</p>
<p>プログラムの中では、クラスをデータ型とした変数を定義し、</p>
<pre>変数 ← コンストラクタ(引数)</pre>
<p>という構文で、クラスのインスタンス（メモリ上にロードされたクラスの実体であり、これをオブジェクトと呼ぶ場合もあります）を生成しています。 これらのことから、<span class="u">擬似言語におけるオブジェクト指向の表記は、 Java に似たもの</span>だと思われます。</p>
<p>&nbsp;</p>
<p>オブジェクトは、いくつかのデータと処理をまとめたものです。 オブジェクトは、クラスとして定義され、クラスが持つデータを<span class="u">メンバ変数</span>と呼び、クラスが持つ処理を<span class="u">メソッド</span>と呼びます。</p>
<p><span class="u">コンストラクタ</span>は、インスタンスの生成時に呼び出される特殊なメソッドであり、<span class="u">クラス名と同じ名前のメソッド</span>にします。 多くの場合に、コンストラクタは、コンストラクタの引数で、メンバ変数の値を初期化します。</p>
<p>&nbsp;</p>
<p>このプログラムで使われている ListElement クラスには、 val および next というメンバ変数と、 ListElement というコンストラクタがあります。 ListElement クラスをデータ型とした変数 curr を宣言し、</p>
<pre>curr ← ListElement(qVal)</pre>
<p>という処理で ListElement のインスタンスを生成し、引数 qVal を指定してコンストラクタ ListElement を呼び出しています。 引数 qVal は、メンバ変数 val に格納されます。</p>
<p>変数 curr には、 ListElement クラスのインスタンスの参照が格納されます。 <span class="u">参照</span>とは、メモリにロードされたインスタンスがどこにあるかを示す情報（メモリアドレスのことだと考えて OK です）です。</p>
<p>ListElement クラスは、連結リストを実現するためのものです。 従来の擬似言語では、連結リストのつながり情報を、配列の要素番号で示していましたが、新しい擬似言語では、参照で示しています。 これは、 C 言語や Java などで<span class="u">連結リスト</span>を実現するときの定番の表記方法であり、 C 言語では「自己参照構造体」と呼ばれます。</p>
<blockquote><p><a href="https://ja.wikipedia.org/wiki/連結リスト" rel="noopener" target="_blank">連結リスト &#8211; Wikipedia</a></p></blockquote>
<p>オブジェクト指向や、自己参照構造体による連結リストが取り上げられているのですから、新しい試験では、<span class="u">従来の試験と比べて問題自体のボリュームは小さくなっていますが、内容はかなり本格的なもの（様々なプログラミングの知識が要求されるもの）</span>になっています。</p>
<p>&nbsp;</p>
<p>それでは、問題を解いてみましょう。</p>
<p>大域変数（グローバル変数） listHead は、その名前が示す通り、連結リストの先頭の要素の参照を格納するためのものです。 初期状態では、未定義の値（多くのプログラミング言語では、 null で示される値）が格納されています。</p>
<pre>大域: ListElement: listHead ← 未定義の値</pre>
<p>手続き（関数のことです） append は、引数 qVal の値を持つ要素を連結リストに追加します。 append の最初の処理として、引数 qVal を格納した要素を新たに作成し、その参照を変数 curr に格納しています。</p>
<pre>○append(文字型: qVal)
 ListElement: prev, curr
 curr ← ListElement(qVal)</pre>
<p>次に、もしも listHead の値が空欄 a なら、大域変数 listHead に変数 curr を代入しています。 これは、新たに作成した要素を連結リストの先頭にしているのですから、最初の要素の場合です。 listHead の値が未定義の値なら、最初の要素なので、空欄 a は、未定義の値です。 これで、正解を解答群の選択肢ア、イ、ウに絞り込めます。</p>
<pre> if (listHead が <span class="blank">a</span>)
   listHead ← curr</pre>
<p>空欄 b がある else ブロックは、最初の要素でない場合の処理なので、既存の連結リストの末尾の要素の次に、新たに作成した要素を追加します。 そのために、変数 prev に大域変数 listHead の値を格納し、 <code class="language-none">(prev.next が未定義でない)</code> という条件の while ブロックで繰り返し処理を行います（ while ブロックの終わりは endwhile で表します）。</p>
<pre> else
   prev ← listHead
   while (prev.next が 未定義でない)
     prev ← prev.next
   endwhile
   prev.next ← <span class="blank">b</span></pre>
<p>この処理では、変数 prev に prev.next を格納して、連結リストをたどっています。</p>
<p>これが <code class="language-none">(prev.next が未定義でない)</code> という条件が 真 である限り繰り返されるので、繰り返しを抜けたときには、変数 prev に既存のリストの末尾の要素の参照が得られます。 その要素の次を意味するメンバ変数 prev.next に新たに作成した要素の参照を格納すれば、連結リストに要素を追加できるので、空欄 b は curr です。</p>
<div class="background c-round">
<div class="chip"><i class="material-icons blue-text">code</i> while ブロック</div>
<p class="indigo-text">条件が真である限りブロックの中の処理が繰り返される</p>
<pre>   while (prev.next が 未定義でない)
     prev ← prev.next
   endwhile</pre>
</div>
<p>したがって、選択肢アが正解です。</p>
<div class="chip mag_h50">サンプル問題の正解</div>
<p>問 1 － カ　問 2 － ウ　問 3 － ア</p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>以上、「基本情報技術者試験 科目 B 試験のサンプル問題」の中から、アルゴリズムとプログラミングの問題を取り上げ、従来からの変更点を説明しました。 2023 年 4 月以降に基本情報技術者試験を受験される方の参考になれば幸いです。</p>
<p>なお、アルゴリズムとプログラミングのサンプル問題は、全部で 5 問が公開されています。 今回は、それらの中から 3 問を取り上げました。残りの 2 問は、今後の記事で取り上げる予定です。</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_1/">新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 1</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報技術者試験はどう変わる？ 開発者向けから「デジタル人材」向け資格へ ～試験要綱とシラバス変更点（科目 B 試験など）を調査</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/changed4dx/</link>
		<pubDate>Mon, 25 Apr 2022 23:30:36 +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=guide&#038;p=6478</guid>
		<description><![CDATA[<p>IPA から 2023 年 4 月 基本情報技術者試験の試験制度が大きく変わることが発表されました。 通年試験化、午後試験の大幅な変更といったトピックに注目が集まる中、試験要綱やシラバスも同時に改定されました。 ここでは [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/changed4dx/">基本情報技術者試験はどう変わる？ 開発者向けから「デジタル人材」向け資格へ ～試験要綱とシラバス変更点（科目 B 試験など）を調査</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="../revision_system_on_202304/">IPA から 2023 年 4 月 基本情報技術者試験の試験制度が大きく変わることが発表されました。</a> 通年試験化、午後試験の大幅な変更といったトピックに注目が集まる中、試験要綱やシラバスも同時に改定されました。</p>
<p>ここではその試験要項とシラバスの変更点を深掘りしました。 すると、<span class="bold">従来の &#8220;開発者の登竜門&#8221; という資格の位置づけから、より広い対象となる DX に必要な &#8220;デジタル人材&#8221; 向けに変化</span>したことがわかりました。</p>
<p>&nbsp;</p>
<p>まずは試験要項から確認しましょう。</p>
<blockquote><p><a href="https://www.ipa.go.jp/shiken/syllabus/gmcbt80000007c4c-att/youkou_ver5_0_henkou.pdf" rel="noopener" target="_blank">「情報セキュリティマネジメント試験、基本情報技術者試験における実施方式、出題範囲などの変更について（試験要綱抜粋）」（変更箇所表示版）</a></p></blockquote>
<ul class="collection mag_h40 grey-text small-text">
<li class="collection-item"><i class="material-icons red-text">fiber_new</i> 2022/05/26 <a href="https://www.ipa.go.jp/news/2022/shiken/henkou20220525.html" rel="noopener" target="_blank">IPA から科目 B 試験の内容が補足</a>されましたので、更新しました</li>
</ul>
<style>.border-box{border-bottom:.1em solid #3f51b5;padding:.25em .5em;color:#3f51b5;margin:.5em 0;}.chip.white{border:.1em solid #2196f3 !important}.line-through{text-decoration:line-through;text-decoration-style:double;color:#e91e63;}@media screen and (max-width:600px){dd{margin-left:1em}}</style>
<h2>試験要綱で対象者像が大きく変化。 デジタル人材の輩出が目的に</h2>
<dl class="background c-round">
<dt class="chip white blue-text">変更前</dt>
<dd class="grey-text">高度 IT 人材となるために必要な基本的知識・技能をもち，実践的な活用能力を身に付けた者</dd>
<dt class="chip blue white-text">変更後</dt>
<dd>IT を活用したサービス，製品，システム及びソフトウェアを作る人材に必要な基本的知識・技能をもち，実践的な活用能力を身に付けた者</dd>
</dl>
<p><span class="u">「高度 IT 人材」と &#8220;開発者&#8221; を意識した文章から、 「活用および作る人材」と表現が変化</span>しています。 これはノーコード / ローコードツールの普及により開発者ではない IT ユーザでもソフトウェアを組み合わせて作ることが増えたことに伴う変更と考えられます。</p>
<p>つまり基本情報技術者試験は従来の &#8220;開発者&#8221; の登竜門から、より垣根を広くした <span class="u">DX に必要な <span class="bold">&#8220;デジタル人材&#8221;</span> への登竜門というポジション</span>を狙ったのであろう、ということが見て取れます。</p>
<h3>期待する技術水準で IT 企業だけではなく事業会社も含む表現に変更</h3>
<p>対象者像が変わったことをうけ、期待する技術水準も変更されました。</p>
<dl class="background c-round">
<dt class="chip white blue-text">変更前</dt>
<dd class="grey-text">需要者（企業経営，社会システム）が直面する課題に対して，情報技術を活用した戦略立案に参加する。</dd>
<dt class="chip blue white-text">変更後</dt>
<dd>組織及び社会の課題に対する， IT を活用した戦略の立案，システムの企画・要件定義に参加する。</dd>
</dl>
<p>「需要者」という委託を受ける側の表現から、「組織及び社会の課題」と変化しました。 これは先程述べた、対象者像が &#8220;IT ユーザ&#8221; にも広がったことで、従来の &#8220;IT 企業&#8221; だけではなく &#8220;事業会社&#8221; も含まれるようになった証左です。</p>
<p>&nbsp;</p>
<p>またレベルについても変化が見られます。</p>
<dl class="background c-round">
<dt class="chip white blue-text">変更前</dt>
<dd class="grey-text">上位者の方針を理解し，自らソフトウェアを開発できる。</dd>
<dt class="chip blue white-text">変更後</dt>
<dd>上位者の方針を理解し，自らプログラムを作成できる。</dd>
</dl>
<p>ソフトウェアという複数のプログラムやミドルウェアを意識した開発ではなく、あくまでプログラミング能力が求められるレベルに変化しました。 これが後述する午後の選択問題を廃止するという理由になったと考えられます。</p>
<p>また、従来の &#8220;開発者&#8221; の登竜門という位置づけであれば、詳細設計までが担当業務と考えられてきましたが、事業会社の &#8220;デジタル人材&#8221; は DX をリードする立場にもなるため、担当業務が拡大しました。</p>
<dl class="background c-round">
<dt class="chip blue white-text mag_rt05">追加</dt>
<dd>上位者の指導の下に，システムの企画・要件定義に参加できる。</dd>
</dl>
<p>&nbsp;</p>
<p>このように基本情報技術者試験の対象者像が &#8220;開発者&#8221; も含めた &#8220;デジタル人材&#8221; へ変化したことが試験要綱からわかります。</p>
<h2>採点方式を変更し、デジタル人材をより増やす方向へ</h2>
<dl class="background c-round">
<dt class="chip white blue-text">変更前</dt>
<dd class="grey-text">60 点以上</dd>
<dt class="chip white-text blue">変更後</dt>
<dd>IRT による採点方式に変更し 600 点以上 1000 点満点</dd>
</dl>
<p>IT パスポート試験でも採用されている IRT の採点方式が基本情報技術者試験でも採用されるようになります。 この IRT (Item Response Theory) は項目応答理論と呼ばれ、各回の試験の難易度を調整するため、毎回、出題した問題ごとに採点の比重を変える方式です。</p>
<p>通年試験となり、試験難易度の公平性を保つ上では重要な仕組みなので、受験者を増やして &#8220;デジタル人材&#8221; を増やそうとする意図がここでもわかります。</p>
<p>ただ、一方で受験者が勉強する上では、従来の午後試験で行っていた配点による対策のメリハリはつけにくくなりました。</p>
<h2>科目 B 試験における変更で、デジタル人材向けのレベルに</h2>
<p>科目 A 試験（旧午前試験）では出題数 ( 80 問から 60 問に変更) と制限時間 ( 150 分から 90 分に変更) が変更されたぐらいで、試験範囲の変更はありません。</p>
<p>多く変更されたのが科目 B 試験（旧午後試験）です。 </p>
<dl class="background c-round">
<dt class="chip white blue-text">変更前</dt>
<dt class="grey-text">出題数 11 問</dt>
<dd class="grey-text">情報セキュリティ (選択必須) 1 問 / アルゴリズム (選択必須) 1 問</dd>
<dd class="grey-text">テクノロジ系・マネジメント系・ストラテジ系から 4 問出題 (選択問題)</dd>
<dd class="grey-text">プログラミング（アセンブラ・ C 言語・ Java ・ Python ・表計算 それぞれ 1 問） 5 問出題</dd>
<dd class="grey-text">大問（長文読解 [複数設問]）</dd>
<dt class="grey-text">解答数 5 問</dt>
<dd class="grey-text">必須選択 2 問</dd>
<dd class="grey-text">選択問題 2 問</dd>
<dd class="grey-text">プログラミング 1 問</dd>
<dt class="chip white-text blue">変更後</dt>
<dt>出題数 20 問</dt>
<dd><i class="material-icons red-text">fiber_new</i> 情報セキュリティから 4 問とアルゴリズムから 16 問を出題</dd>
<dd>プログラミング的思考力を問う擬似言語による出題に統一</dd>
<dd>選択問題とプログラミング言語の選択は廃止</dd>
<dd>小問（2 ページ弱の短文と単問）</dd>
<dt>解答数: 20 問</dt>
<dd>全問必須選択</dd>
</dl>
<p>従来は各プログラム言語の &#8220;プログラムを読める&#8221; ことが要求されてきましたが、 &#8220;プログラミング思考&#8221; を問う問題に変更されます。 各言語を習得する時間が減り、アルゴリズム・擬似言語に集中できる時間が増えました。</p>
<p>また従来、選択分野で出題されたデータベース、ネットワークなども廃止され、そこで必要とされた SQL 、 ER 図、ネットワーク図、 IP アドレスのような各要素技術を深掘りする必要はありません（引き続き、科目 A 試験 [従来の午前試験] レベルの知識は必要です）。</p>
<p>これは冒頭の対象者像の変化、 &#8220;デジタル人材&#8221; を多く輩出するための変更と考えると合点がいきます。 逆に開発者としての登竜門を &#8220;応用情報技術者試験&#8221; に据えるという思惑があるのかも知れません。</p>
<h2>シラバスを変更し「プログラミング思考」に変化</h2>
<p>ここからは試験シラバスと呼ばれる出題範囲を記した資料で、変更前と変更後の差分を確認しましょう。 なお、シラバスには従来通り、科目 A 試験、科目 B 試験による試験範囲の違いは明記されていません。</p>
<blockquote><p><a href="https://www.ipa.go.jp/shiken/syllabus/gmcbt80000007c4c-att/syllabus_fe_ver8_0_henkou.pdf" rel="noopener" target="_blank">「基本情報技術者試験 シラバス 通年試験化に伴う変更内容」（変更箇所表示版）</a><br />
<a href="https://www.ipa.go.jp/shiken/syllabus/gmcbt80000007c4c-att/youkou_ver5_0_henkou.pdf" rel="noopener" target="_blank">「情報セキュリティマネジメント試験、基本情報技術者試験における実施方式、出題範囲などの変更について（試験要綱抜粋）」（変更箇所表示版） </a></p></blockquote>
<h3>アルゴリズム</h3>
<p>シラバス上は &#8220;擬似言語&#8221; を追加しただけの変更です。</p>
<dl class="background c-round">
<div class="border-box">目標</div>
<dt class="chip white blue-text">変更前</dt>
<dd class="grey-text">アルゴリズム，流れ図の基本的な考え方，表現方法を修得し，適用する。</dd>
<dt class="chip white-text blue">変更後</dt>
<dd>アルゴリズムの基本的な考え方と，流れ図や擬似言語による表現方法を修得し，適用する。</dd>
</dl>
<p>ただし、これは後述しますが、サンプル問題を見ると、その擬似言語の記述方法に変更がありました。</p>
<p>また、 5/25 に IPA が補足してアルゴリズムの試験範囲を発表しました。 詳細は以下のとおりです。</p>
<dl class="background c-round">
<dt><i class="material-icons indigo-text">looks_one</i> プログラミング全般に関すること</dt>
<dd>実装するプログラムの要求仕様（入出力，処理，データ構造，アルゴリズムほか）の把握，使用するプログラム言語の仕様に基づくプログラムの実装，既存のプログラムの解読及び変更，処理の流れや変数の変化の想定，プログラムのテスト，処理の誤りの特定（デバッグ）及び修正方法の検討 など<br />
<span class="chip">注記</span> プログラム言語について，基本情報技術者試験では擬似言語を扱う。</dd>
<dt><i class="material-icons indigo-text">looks_two</i> プログラムの処理の基本要素に関すること</dt>
<dd>型，変数，配列，代入，算術演算，比較演算，論理演算，選択処理，繰返し処理，手続・関数の呼出し など</dd>
<dt><i class="material-icons indigo-text">looks_3</i> データ構造及びアルゴリズムに関すること</dt>
<dd>再帰，スタック，キュー，木構造，グラフ，連結リスト，整列，文字列処理 など</dd>
<dt><i class="material-icons indigo-text">looks_4</i> プログラミングの諸分野の適用に関すること</dt>
<dd>数理・データサイエンス・AI などの分野を題材としたプログラム など</dd>
<p class="small-text grey-text">
<a href="https://www.ipa.go.jp/shiken/syllabus/gmcbt80000007c4c-att/youkou_ver5_0_henkou.pdf#page=41" rel="noopener" target="_blank">「情報セキュリティマネジメント試験、基本情報技術者試験における実施方式、出題範囲などの変更について（試験要綱抜粋）」（変更箇所表示版） </a> より</p>
</dl>
<p>これまでの試験でもシラバスに掲載されていましたが、基本要素とデータ構造及びアルゴリズムに関することがより明確になりました。 ここに挙げられた論理演算や再帰などは最低限、試験合格にあたってはマスターすべき内容となります。</p>
<h3>情報セキュリティ</h3>
<p>IPA の補足発表で正式に科目 B 試験で情報セキュリティとアルゴリズムのみが出題されることになり、情報セキュリティの試験範囲も発表されました。</p>
<dl class="background c-round">
<dt><i class="material-icons indigo-text">looks_5</i> 情報セキュリティの確保に関すること</dt>
<dd>情報セキュリティ要求事項の提示（物理的及び環境的セキュリティ，技術的及び運用のセキュリティ），マルウェアからの保護，バックアップ，ログ取得及び監視，情報の転送における情報セキュリティの維持，脆弱性管理，利用者アクセスの管理，運用状況の点検 など</dd>
</dl>
<h3>プログラミング</h3>
<p>従来プログラム言語で求めていた内容が、この &#8220;プログラミング&#8221; の中項目に移行されてきました。</p>
<p>特筆すべきは <span class="bold">&#8220;オブジェクト指向&#8221;</span> です。 これは従来 Java や Python で求めれていました。 これに伴い <span class="u">&#8220;擬似言語でオブジェクト指向を表現する&#8221; 記述方法が新しく追加</span>されます。</p>
<p class="grey-text small-text">（以下はすべて追加された項目）</p>
<div class="background c-round">
<div class="border-box">目標</div>
<p>プログラミングの基礎を修得し，適用する。</p>
<div class="border-box">内容</div>
<ol class="" start="3">
<li>データ型と変数<br />
プログラム言語で使用される代表的なデータ型と，変数の概念を理解する。<br />
<span class="grey pad_05 white-text small-text mag_rt05">用語例</span>整数型，実数型，論理型，文字型，文字列型，抽象データ型，構造型，代入
</li>
<li>演算<br />
プログラム言語における代表的な演算を理解する。<br />
<span class="grey pad_05 white-text small-text mag_rt05">用語例</span>算術演算，比較演算，論理演算，ビット演算
</li>
<li>制御構造<br />
プログラム言語の基本的な制御構造を理解する。<br />
<span class="grey pad_05 white-text small-text mag_rt05">用語例</span>選択処理，繰返し処理
</li>
<li>手続，関数<br />
プログラムにおける，手続，関数の概念とそれらの使用方法を理解する。<br />
<span class="grey pad_05 white-text small-text mag_rt05">用語例</span>引数，戻り値，局所変数
</li>
<li>オブジェクト指向プログラミング<br />
クラスやメソッドを使用したオブジェクト指向プログラミングの考え方を理解する。<br />
<span class="grey pad_05 white-text small-text mag_rt05">用語例</span>コンストラクタ，メンバ変数，オーバーライド，オーバーロード
</li>
</ol>
</div>
<h3>プログラム言語</h3>
<p>特筆すべき事項はありません。</p>
<p>Python は過去問題が公開されないまま、合計 5 回の出題で終了することになりました。</p>
<dl class="background c-round">
<div class="border-box">目標</div>
<dt class="chip white blue-text">変更前</dt>
<dd class="grey-text">プログラム言語の種類，特徴，基本的な記述方法を修得し，適用する。</dd>
<dt class="chip white-text blue">変更後</dt>
<dd>プログラム言語の種類，特徴，基本的な記述方法を理解し，適用する。</dd>
<dt class="chip white-text pink">削除</dt>
<dd class="pink-text line-through">C，Java，Python，アセンブラ言語のプログラム作成方法を修得し，適用する。</dd>
<dt class="chip white-text pink">削除</dt>
<dd class="pink-text line-through">表計算ソフトの活用方法を修得し，適用する。</dd>
<div class="border-box">内容</div>
<dt class="chip white-text pink">削除</dt>
<dd class="pink-text line-through"><i class="material-icons blue-grey-text">looks_one</i> C 言語 から <i class="material-icons blue-grey-text">looks_6</i> 表計算ソフトまで</dd>
</dl>
<p>ご覧いただいた通り、シラバス &#8220;だけ&#8221; を見ると、擬似言語で変更が予想されるほかは、特に目立った変更点はありませんでした。</p>
<h2>科目 B 試験のサンプル問題でわかった擬似言語の変更</h2>
<p>試験要綱、シラバスと合わせて、 IPA から科目 B 試験のサンプル問題も公開されました。</p>
<blockquote><p><a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B 試験のサンプル問題」</a></p></blockquote>
<p>これを確認すると、<span class="bold">従来の擬似言語の記法が変わった</span>ことがわかります。</p>
<p class="hide-on-med-and-up background small-text grey-text c-round mag_h10"><i class="material-icons blue-text mag_rt05">info</i>スマートフォンでご覧の際、プログラムは右スクロールできます</p>
<p class="grey-text small-text">（以下、変更前のプログラムは<a href="https://www.ipa.go.jp/shiken/mondai-kaiotu/gmcbt8000000dict-att/2019r01a_fe_pm_qs.pdf#page=3" rel="noopener" target="_blank">午後問題の巻頭の仕様書</a>から抜粋。 変更後のプログラムはすべて上記サンプル問題から抜粋。）</p>
<div class="background c-round">
<p class="bold">if 文</p>
<dt class="chip white blue-text">変更前</dt>
<dd>
<pre class="c-round"><code class="language-none">▲ 条件式
| 　処理 1
+---
| 　処理 2
▼</code></pre>
</dd>
<dt class="chip white-text blue">変更後</dt>
<dd>
<pre class="c-round"><code class="language-none">if (age が 3 以下)
  ret ← 100
elseif ( "[   空欄   ]" )
  ret ← 300
else
  ret ← 500
endif
return ret</code></pre>
</dd>
<p class="bold">for 文</p>
<dt class="chip white blue-text">変更前</dt>
<dd>
<pre class="c-round"><code class="language-none">■ 条件式
| 　処理
■</code></pre>
</dd>
<dt class="chip white-text blue">変更後</dt>
<dd>
<pre class="c-round"><code class="language-none">for (i を 1 から matrixの行数 まで 1 ずつ増やす)
  for (j を 1 から matrixの列数 まで 1 ずつ増やす)
    if (matrix[i, j] が 0 でない)
      sparseMatrix[1]の末尾 に iの値 を追加する
      sparseMatrix[2]の末尾 に jの値 を追加する
      sparseMatrix[3]の末尾 に matrix[i, j]の値 を追加する
    endif
  endfor
endfor</code></pre>
</dd>
<p class="bold">クラス</p>
<dt class="chip white-text blue">追加</dt>
<dd>
<pre class="c-round"><code class="language-none">大域: ListElement: listHead ← 未定義の値
○append(文字型: qVal)
  ListElement: prev, curr
  curr ← ListElement(qVal)
  if (listHead が "[   空欄 a   ]" )
    listHead ← curr
  else
    prev ← listHead
    while (prev.next が 未定義でない)
      prev ← prev.next
    endwhile
    prev.next ← "[   空欄 b   ]"
  endif</code></pre>
</dd>
</div>
<p>従来の擬似言語の独特な矢印を使った記述方法ではなく、 Ruby や PHP といったスクリプト言語に近い記述方法（型推論あり）に変わり、実際のプログラミングに近くなりました。 これにより直感的に理解しやすくなりました。</p>
<p>また、先程シラバスのアルゴリズムで触れたオブジェクト指向の構文（大域 がクラス ListElement の宣言、 ○append がメソッド）が追加されました。</p>
<p>&nbsp;</p>
<p>なお、このサンプル問題の解説は、後日、お馴染みの矢沢久雄さんに執筆いただき、記事を公開する予定です。</p>
<h2>まとめ</h2>
<p>2023 年 4 月から大きく試験制度を変更することになった基本情報技術者試験の変更点を、対象者像からシラバスまで詳しく見てきました。</p>
<p>通年試験化、午後問題の変更が大きなトピックとされていますが、対象者像を見ると、<span class="bold">より広い対象を目指した試験制度の変更</span>であることがわかります。 これを機に、 IT 企業で開発者になりたい方だけでなく、<span class="u">事業会社で DX を主導するユーザやプロダクトマネージャのような方にもふさわしい資格になる</span>、ということが言えそうです。</p>
<p>&nbsp;</p>
<p>基本情報技術者試験 受験ナビでは今後も引き続き、この試験制度の改定を詳しくレポートして参ります。</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/changed4dx/">基本情報技術者試験はどう変わる？ 開発者向けから「デジタル人材」向け資格へ ～試験要綱とシラバス変更点（科目 B 試験など）を調査</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_java/</link>
		<pubDate>Thu, 09 Sep 2021 23:30:13 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[Java]]></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=this_weeks_exercise&#038;p=5839</guid>
		<description><![CDATA[<p>今週の午後問題 では毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「 2019 年度 秋期 Java」でしたが、皆さん、手応え [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_java/">今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<span class="bold">今週の午後問題</span> では<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../r01a_java/">「 2019 年度 秋期 Java」</a>でしたが、皆さん、手応えはいかがでしょうか？</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}pre{margin:1em -2em!important;padding:1em 2em!important}blockquote > p{color:#607d8b}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2019 年度 秋期 Java 通知メッセージの配信システム</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>プログラムの説明に</p>
<blockquote><p>Notifier クラスのインスタンスは、シングルトン（ Java 仮想計算機内で唯一の存在）である</p></blockquote>
<p>と示されています。</p>
<p>Notifier クラスの getInstance メソッドは、その名前から、インスタンスの参照を返すものであることがわかります。<br />
Notifier クラスは、 static final な、 INSTANCE フィールドに new Notifier() で得られた Notifier クラスのインスタンスを保持しています。</p>
<p>したがって、 getInstance メソッドが返すのは、 INSTANCE フィールドの値であり、選択肢イが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<p>空欄 b がある if ブロックは、</p>
<pre><code class="language-java">devices == null // 利用者名に対する携帯端末名のリストが作成されていない</code></pre>
<p>という条件が &#8220;真&#8221; のとき実行されます。</p>
<p>この場合には、</p>
<pre><code class="language-java">divices = new ArrayList&lt;();</code></pre>
<p>で携帯端末名のリストを新たに作成し、 userMobileDivices に user （利用者名）と divices を登録します。</p>
<p>したがって、空欄 b の行で行う処理は、</p>
<pre><code class="language-java">userMobileDivices.put(user, devices)</code></pre>
<p>であり、選択肢オが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>c</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>空欄 c がある if ブロックは、</p>
<pre><code class="language-java">messageList == null // デバイス名に対するメッセージのリストが作成されていない</code></pre>
<p>という条件が &#8220;真&#8221; のとき実行されます。</p>
<p>この場合には、</p>
<pre><code class="language-java">messageList = new ArrayList&lt;>();</code></pre>
<p>でメッセージのリストを新たに作成し、 messagesToDeliver に device （携帯端末名）と messageList を登録します。</p>
<p>したがって、空欄 c の行で行う処理は、</p>
<pre><code class="language-java">messagesToDeliver.put(device, messageList)</code></pre>
<p>であり、選択肢イが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>d</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<pre><code class="language-java">メソッド名() "[  d  ]" 例外クラス名 { }</code></pre>
<p>という構文なので、空欄 d に入るのは、 <code class="language-java">throws</code> です。</p>
<p>したがって、選択肢オが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>e</p>
<p><span class="chip bold">正解</span> ウ</p>
<div class="divider"></div>
<p>図 1 に示された実行結果の例を見ると、</p>
<pre><code class="language-none">phone: [You have a message]
tablet: [You have a message]</code></pre>
<p>という形式で表示されています。</p>
<p>したがって、<span class="u">空欄 e に入るのは、携帯端末名</span>です。</p>
<p>createUserMobileDevice メソッドの説明を見ると、</p>
<blockquote><p>利用者名と携帯端末名を登録して</p></blockquote>
<p>と示されているので、このメソッドの引数 user が利用者名であり、引数 name が携帯端末名です。</p>
<p>したがって、空欄 e は name であり、選択肢ウが正解です。
</p></div>
<div class="background c-round">
<p class="bold">設問 2</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<p>α の前で</p>
<pre><code class="language-java">notifier.shutdown();</code></pre>
<p>という処理が行われています。プログラムの説明に</p>
<blockquote><p>メソッド shutdown は、通知システムを停止する。未配信の全メッセージ、全利用者名及び全携帯端末名の登録情報を削除し、登録されている全携帯端末の待ち受け状態を解除する</p></blockquote>
<p>と示されています。</p>
<p>この状態で、 α の位置で</p>
<pre><code class="language-java">notifier.send("Taro", "You have 2 messages.");</code></pre>
<p>を実行すると、<span class="u">全利用者名の登録情報が削除されている</span>ので、 send メソッドの</p>
<pre><code class="language-java">if (userMobileDevices.contaninsKey(user))</code></pre>
<p>が &#8220;偽&#8221; となり、 if ブロックの処理が行われません。</p>
<p>devices　も空のままになるので、その後にある</p>
<pre><code class="language-java">for (MobileDevice device : devices)</code></pre>
<p>の処理も行われません。 send メソッドは、何もせずに終了することになります。例外も発生しません。</p>
<p>したがって、選択肢オが正解です。
</p></div>
<h2>みんなの解答</h2>
<p>では、皆さん、手応えはいかがだったでしょうか？</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_cmnt.pdf" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background grey-text c-round">
　問 11 では，携帯端末へ非同期でメッセージを擬似的に通知する処理を題材に，複数スレッド間でデータを更新する処理などについて出題した。<br />
　設問 1 では， a ， c ， d の正答率は平均的で，おおむね理解されていた。 b の正答率は低く，エと誤って解答した受験者が多く見受けられた。二つの Map の内容の構造的な関係を理解した上で， device と devices で表しているものが異なることに注意すれば，正答できた。 e の正答率は低く，イと誤って解答した受験者が見受けられた。引数のラムダ式の評価は，クラス MobileDevice のコンストラクタの呼出し前に行われることに注意が必要である。<br />
　設問 2 では，正答率は低く，エと誤って解答した受験者が見受けられた。メソッド send では，引数で指定された利用者名が登録されているかどうかを，必ず確認してから処理を行っていることに注意が必要である。<br />
　Java では，スレッド間で同期処理を行うための機能が言語仕様レベルで備えられているので，それらを基礎的な技術として習得しておくことは重要である。一方，コンピュータの高性能化に伴い，基本的な同期処理の機能では実現できない高度な並列処理及び並行処理を行うための機能の利用が要求されることも多く，それらについても学習するようにしてほしい。
</div>
<p>来週から午後問題は分野を<span class="bold">「情報セキュリティ」</span>に絞って出題します！ぜひ挑戦してみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_java/">今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔問題〕Java 通知メッセージの配信システム 2019 (令和元) 年度</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/r01a_java/</link>
		<pubDate>Sun, 05 Sep 2021 23:30:32 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=5828</guid>
		<description><![CDATA[<p>今週の午後問題 のコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまも参加して解答できます！　その週の金曜にはその解答と 矢沢久雄 さんによる 解説 ページを公開し [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/r01a_java/">今週の午後問題〔問題〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<span class="bold">今週の午後問題</span> のコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまも参加して解答できます！　<span class="u">その週の金曜にはその解答と 矢沢久雄 さんによる 解説 ページを公開</span>し、皆さんの正解率も発表します。</p>
<p>ぜひ腕試しにお使い下さい！</p>
<p>今回は「 2019 年度 秋期 Java」を出題します
</p></div>
<style>pre{margin:1.5em -7.5% 1.5em calc(-7.5% - 10px)!important;padding:1.5em 7.5%!important}figcaption{margin:1em 0;text-align:center;color:#9e9e9e;}.blank{border:.2em solid #607d8b;padding:.25em 2em;margin:auto .5em;}dl.inline dd{margin-left:2em;}details{padding:2em;}details p{color:"#607d8b"}table.forth-col-left tbody tr td:nth-child(4){text-align: left;}summary:hover{cursor:pointer;}summary{display:inline-block;}.chip span::after{content:"\e5cf";font-family:"Material Icons";vertical-align:middle;margin-left:.5em;}summary::-webkit-details-marker{display:none;}details[open] .chip span::after{content:"\e5ce";}.responsive-width{width:80%;margin:auto;}.iframe-container{overflow:auto;margin:2em auto}@media screen and (max-width:600px){.responsive-width{width:100%}}</style>
<h2>今週の午後問題<br />2019 年度 秋期 Java 通知メッセージの配信システム</h2>
<div class="divider mag_h30"></div>
<p class="bold">問 11</p>
<p>次の Java プログラムの説明及びプログラムを読んで，設問 1 ，2 に答えよ。<br />
( Java プログラムで使用する API の説明は，<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_qs.pdf#page=77" rel="noopener" target="_blank">この冊子の末尾</a>を参照してください。)</p>
<div class="mag_lt10">
〔プログラムの説明〕</p>
<p>　スマートフォンやタブレット端末といった携帯端末に通知メッセージを配信するシステム (以下，通知システムという) を模したプログラムである。この通知システムは，メール着信を通知するメッセージを非同期で携帯端末に配信する。このプログラムでは，通知メッセージを配信する処理及び各携帯端末の処理を，それぞれ独立したスレッドとして実行する。</p>
<p>　このプログラムは，次のインタフェース及びクラスから成る。ここで，各コンストラクタ及びメソッドには，正しい引数が与えられるものとする。</p>
<ol>
<li><span class="bold">インタフェース NotificationListener は，通知メッセージを受け取るためのメソッドを定義する。以下， NotificationListener のインスタンスをリスナという。</span>
<ol type="i">
<li>メソッド onNotificationReceived は，通知メッセージを受信したときに呼び出される。受信した通知メッセージは，引数の文字列のリストで与えられる。</li>
</ol>
</li>
<li><span class="bold">クラス MobileDevice は，携帯端末を表す。</span>
<ol type="i">
<li>コンストラクタは，引数で指定された携帯端末名及びリスナをもつ携帯端末を生成する。</li>
<li>メソッド getListener はリスナを， getName は携帯端末名を返す。</li>
</ol>
</li>
<li><span class="bold">クラス Notifier は，携帯端末の管理や通知メッセージの配信などを行う。 Notifier のインスタンスは，シングルトン ( Java 仮想計算機内で唯一の存在) である。</span>
<ol type="i">
<li>メソッド register は，引数で指定された利用者名とその携帯端末名を登録する。指定された利用者名に対応する携帯端末名が既に登録されている場合は，その利用者名に対応する携帯端末名として追加登録する。</li>
<li>メソッド send は，引数で指定された利用者名で登録されている各携帯端末に，引数で指定された文字列を通知メッセージとして配信する。携帯端末に対して未配信の通知メッセージがある場合，引数のメッセージを未配信のメッセージリストに追加する。 </li>
<li>メソッド loopForMessages は，引数で指定された携帯端末に対して，通知メッセージがあれば携帯端末のリスナに通知し，なければ通知メッセージを受け取れる状態 (以下，待ち受け状態という) にする。この処理を，通知システムが停止されるまで繰り返す。</li>
<li>メソッド shutdown は，通知システムを停止する。未配信の全メッセージ，全利用者名及び全携帯端末名の登録情報を削除し，登録されている全携帯端末の待ち受け状態を解除する。</li>
</ol>
</li>
<li><span class="bold">クラス Tester は，プログラム 1 ～ 3 をテストする。</span>
<ol type="i">
<li>メソッド main は，利用者名 Taro の携帯端末名 phone 及び tablet を通知システムに登録して，Taro にメッセージを送信する。その後，通知システムを停止する。</li>
<li>メソッド createUserMobileDevice は，利用者名とその携帯端末名を登録して，通知メッセージを受信できる状態にする処理を，新しく生成したスレッドで実行する。</li>
</ol>
</li>
</ol>
<p>　図 1 は，クラス Tester のメソッド main を実行して得られた出力の例である。ここで，プログラムは，スレッドの実行速度及び事象発生に対する応答が十分速いシステムで実行されるものとする。また，スレッドのスケジューリングによって，各行の出カ順は異なることがある。</p>
<figure>
<pre><code class="language-none">phone: [You have a message.]
tablet: [You have a message.]
Terminating Taro's tablet
Terminating Taro's phone</code></pre><figcaption>図 1 メソッド main の実行結果の例</figcaption></figure>
<p>〔プログラム 1 〕</p>
<p class="background c-round blue-grey-text mag_h30 small-text hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>スマートフォンをご覧の際、プログラムは右にスクロールできます
</p>
<pre><code class="language-java">import java.util.List;

public interface NotificationListener {
	void onNotificationReceived(List&lt;String> messageList);
}</code></pre>
<p>〔プログラム 2 〕</p>
<pre><code class="language-java">public final class MobileDevice {
	private final String name;
	private final NotificationListener listener;
	
	public MobileDevice(String name, NotificationListener listener){
		this.name = name;
		this. Listener = listener;
	}
	
	public NotificationListener getListener() { return listener; }
	
	public String getName() { return name; }
}</code></pre>
<p>〔プログラム 3 〕</p>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class Notifier {
	private static final Notifier INSTANCE = new Notifier();

	private final Object lock = new Object();
	// 利用者ごとに携帯端末を管理
	private final Map&lt;String, List&lt;MobileDevice>> userMobileDevices
		  = new HashMap&lt;>();
	// 携帯端末ごとに通知メッセージを保持
	private final Map&lt;MobileDevice, List&lt;String>> messagesToDeliver
		  = new HashMap&lt;>();
	private volatile boolean active = true;
	
	public static Notifier getInstance() { return "[  a  ]"; }

	private Notifier() { }
	
	public void register(String user, MobileDevice device) {
		synchronized (lock) {
			List&lt;MobileDevice> devices = userMobileDevices.get(user);
			if (devices == null) {
				devices = new ArrayList&lt;>();
				userMobileDevices.put( "[  b  ]" );
			}
			devices.add(device);
		}
	}

	public void send (String user, String message) {
		List&lt;MobileDevice> devices = new ArrayList&lt;>();
		synchronized (lock) {
			if (userMobileDevices.containsKey(user)) {
				for (MobileDevice device : userMobileDevices.get(user)) {
					List&lt;String> messageList = messagesToDeliver.get(device);
					if (messageList == null) {
						messageList = new ArrayList&lt;>();
						messages ToDeliver.put( "[  c  ]" );
					}
					messageList.add(message);
					devices.add(device);
				}
			}
		}
		for (MobileDevice device : devices) {
			synchronized (device) {
				// 通知メッセージがあることを待ち受け状態のスレッドに通知
				device.notifyAll();
			}
		}
	}
	
	public void loopForMessages(MobileDevice device) {
		while (active) {
			List&lt;String> messageList;
			synchronized (lock) {
				messageList = messagesToDeliver.remove(device);
			}

			if (messageList != null) {
				device.getListener().onNotificationReceived(messageList);
			}
			synchronized (device) {
				try {
					// 通知メッセージが到着するかタイムアウトするまで待つ
					device.wait(3000L);
				} catch (InterruptedException e) {
					break;
				}
			}
		}
	}

	public void shutdown() {
		active = false;
		List&lt;MobileDevice> devices = new ArrayList&lt;>();
		synchronized (lock) {
			messagesToDeliver.clear();
			for (String user: userMobileDevices.keySet()) {
				for (MobileDevice device : userMobileDevices.get(user)) {
					devices.add(device);
				}
			}
			userMobileDevices.clear();
		}
		for (MobileDevice device : devices) {
			synchronized (device) {
				//待ち受け状態のスレッドに通知
				device.notifyAll();
			}
		}
	}
}</code></pre>
<p>〔プログラム 4 〕</p>
<pre><code class="language-java">public class Tester {
	public static void main(String[] args) "[  d  ]" InterruptedException {
		createUserMobileDevice("Taro", "phone");
		createUserMobileDevice("Taro", "tablet");
		Notifier notifier = Notifier.getInstance();
		notifier.send("Taro", "You have a message.");
		Thread.sleep(500L);
		notifier.shutdown();
		/* α */
	}

	private static void createUserMobileDevice(String user, String name) {
		MobileDevice device = new MobileDevice(name, messageList ->
			  System.out.println( "[  e  ]" + ":" + messageList));
		Notifier notifier = Notifier.getInstance();
		notifier.register(user, device);
		new Thread(() -> {
			notifier.loopForMessages(device);
			System.out.printf("Terminating %s's %s%n", user, name);
		}).start();
	}
}</code></pre>
<p class="bold mag_tp50">設問 1</p>
<p>プログラム中の<span class="blank"></span>に入れる正しい答えを，解答群の中から選べ。</p>
<p>a に関する解答群</p>
<p>ア　<code class="language-java">getInstance()</code><br />
イ　<code class="language-java">INSTANCE</code><br />
ウ　<code class="language-java">new Notifier()</code><br />
エ　<code class="language-java">Notifier()</code><br />
オ　<code class="language-java">Notifier.class</code><br />
カ　<code class="language-java">this</code></p>
<p>b, c に関する解答群</p>
<p>ア　<code class="language-java">device, devices</code><br />
イ　<code class="language-java">device, messageList</code><br />
ウ　<code class="language-java">device, user</code><br />
エ　<code class="language-java">user, device</code><br />
オ　<code class="language-java">user, devices</code><br />
カ　<code class="language-java">user, messageList</code></p>
<p>d に関する解答群</p>
<p>ア　<code class="language-java">extends</code><br />
イ　<code class="language-java">implements</code><br />
ウ　<code class="language-java">requires</code><br />
エ　<code class="language-java">throw</code><br />
オ　<code class="language-java">throws</code><br />
カ　<code class="language-java">uses</code></p>
<p>e に関する解答群</p>
<p>ア　<code class="language-java">device</code><br />
イ　<code class="language-java">device.getName()</code><br />
ウ　<code class="language-java">name</code><br />
エ　<code class="language-java">Tester.this.name</code><br />
オ　<code class="language-java">this.name</code><br />
カ　<code class="language-java">user</code></p>
<p class="bold mag_tp50">設問 2</p>
<p>プログラム 4 のクラス Tester において，メソッド main の /* α */ を図 2 の 2 行で置き換えて実行したとき，この 2 行に対するプログラムの動作に関する記述として，正しい答えを，解答群の中から選べ。</p>
<figure>
<pre><code class="language-java">		notifier.send("Taro", "You have 2 messages.");
		Thread.sleep(500L);</code></pre><figcaption>図 2 /* α */ と置き換える行</figcaption></figure>
<p>解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd><code class="language-none">"phone: [You have 2 messages.]"</code> だけを出力する。</dd>
<dt>イ</dt>
<dd><code class="language-none">"tablet: [You have 2 messages.]"</code> だけを出力する。</dd>
<dt>ウ</dt>
<dd>メソッド loopForMessages で， NullPointerException が発生する。</dd>
<dt>エ</dt>
<dd>メソッド send で， NullPointerException が発生する。</dd>
<dt>オ</dt>
<dd>利用者名 Taro が登録されていないので，メソッド send は何もしないで終了する。</dd>
<dt>カ</dt>
<dd>利用者名 Taro は登録されているが，利用者名 Taro の携帯端末が何も登録されていないので、メソッド send は何もしないで終了する。</dd>
</dl>
</div>
<div class="divider mag_tp60 mag_bt30"></div>
<details class="grey lighten-5 blue-grey-text c-round">
<summary class="chip"><span>問題のヒント</span></summary>
<p>Java の問題は、アルゴリズムに重点を置いているものと、プログラムの構造に重点を置いているものがあります。</p>
<p>この問題は、プログラムの構造に重点を置いています。そのため、クラスの関連付けや、クラスのインスタンスの生成など、オブジェクト指向プログラミングの知識が要求されます。</p>
<p>さらに、プログラムでは、インターフェイス、コレクション、ジェネリクス、マルチスレッドなど、かなり高度な機能が多用されています。全体的に難しく感じるかもしれませんが、一部の設問は、 Java の基本構文がわかればできるようになっているので、自分の持てる知識を総動員して解いてください。<br />
</details>
<h2>みんなの解答欄</h2>
<p>こちらから解答できます！</p>
<div class="iframe-container center">
<iframe src="https://docs.google.com/forms/d/e/1FAIpQLSf-qigsqj8ZzXDcJGwNuUX2BAOwuPx4pjjfFk6hbTf9ribw0A/viewform?embedded=true" width="100%" height="2424" frameborder="0" marginheight="0" marginwidth="0">読み込んでいます…</iframe>
</div>
<p>今週の金曜に解答解説ページを、ご解答頂いた方の正解率とともに公開します !!</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/r01a_java/">今週の午後問題〔問題〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (5) オブジェクト指向</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/oo/</link>
		<pubDate>Wed, 04 Aug 2021 02:58:59 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5599</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 Python によるオブジェクト指向の基礎で [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/oo/">基本情報ではじめる Python (5) オブジェクト指向</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 Python による<span class="bold">オブジェクト指向の基礎</span>です。オブジェクト指向は、情報処理推進機構が公開している Python のサンプル問題でも取り上げられている重要なテーマなので、しっかりとマスターしてください。</p>
<style>.left-bordered td:first-child{border:.1em solid black;}.left-bordered tr{border-bottom:unset;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}dt{font-weight:700;}.chip{height:auto!important;}@media screen and (max-width:600px){dd{margin-left:1em}}</style>
<h2>オブジェクト指向とは？</h2>
<p>オブジェクト指向は、プログラムの部品化に関する指向です。 Python では、プログラムの部品化に 2 つの指向が使えます。<span class="u">プロセス指向</span>と<span class="u">オブジェクト指向</span>です。</p>
<p>プロセス指向では、<span class="u">関数を部品</span>にします。<br />
オブジェクト指向では、<span class="u">クラスを部品</span>にします。</p>
<p>どちらの指向を使うのかは、プログラマの好みの問題ですが、一般的に言うと、小規模なプログラムには、プロセス指向が適していて、大規模なプログラムには、オブジェクト指向が適しています。</p>
<p>&nbsp;</p>
<p><span class="u">関数は、単独の機能を持った小さな部品</span>です。関数は、外部から引数として渡されたデータを使って処理を行います。<br />
<span class="u">クラスは、複数の機能を持った大きな部品</span>です。クラスは、内部に保持しているデータを使って処理を行います。</p>
<p>たとえば、半径の値から、円周の長さと円の面積を求める部品を作るとしましょう。</p>
<dl class="background c-round">
<dt>プロセス指向</dt>
<dd>外部から引数として渡された半径の値から円周の長さを求める circle_perimeter 関数と、面積を求める circle_area 関数を、別々に作ることになります</dd>
<dt>オブジェクト指向</dt>
<dd>内部に半径の値を保持し、その値を使って円周の長さを求める perimeter メソッド <sup>※</sup> と、円の面積を求める area メソッドを持つ、 Circle クラスを作ることになります</dd>
<dd><sup>※</sup> メソッド（ method = 「やり方」）とは、クラスが持つ処理のこと</dd>
</dl>
<p>以下は、オブジェクト指向の図示技法としてよく使われる UML （ Unified Modeling Language ）のクラス図を使って、 Circle クラスを示したものです。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムや表は横スクロールすると全文をご覧になれます</p>
</div>
<div class="grey lighten-5 pad_20 c-round table-container mag_h30">
<table class="left-bordered">
<tr>
<td>Circle</td>
<td><i class="material-icons blue-text mag_rt05">fast_forward</i>クラス名</td>
</tr>
<tr>
<td>radius</td>
<td><i class="material-icons blue-text mag_rt05">fast_forward</i>クラスが内部に保持するデータ</td>
</tr>
<tr>
<td>perimeter()<br />area()</td>
<td><i class="material-icons blue-text mag_rt05">fast_forward</i>クラスが持つメソッド</td>
</tr>
</table>
</div>
<p>クラス図では、四角形を 3 段階に区切り、上段にクラス名（ここでは Circle ）、中段にクラスが内部に保持するデータ（ここでは radius ）、下段にクラスが持つメソッド（ここでは perimeter() と area() ）を記述します。メソッドは、メソッドあることがわかりやすいように、メソッド名の後に () を付けます。オブジェクト指向では、個々のメソッドではなく、クラス全体が 1 つの部品です。</p>
<h2>クラスを定義する方法</h2>
<p>先ほど UML のクラス図で示した Circle クラスを、 Python のプログラムで表してみましょう。</p>
<p>以下は、 Circle クラスを定義です。このプログラムを Circle.py というファイル名で作成しましょう。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>Python で Circle クラスを定義したプログラム ( Circle.py )</figcaption><pre><code class="language-py"># Circleクラスの定義
class Circle:
    # 初期化メソッドの定義
    def __init__(self, radius):
        self.radius = radius

    # 円周の長さを求めるメソッド
    def perimeter(self):
        return self.radius * 2 * 3.14

    # 円の面積を求めるメソッド
    def area(self):
        return self.radius * self.radius * 3.14</code></pre>
</figure>
<p>クラスは、</p>
<pre><code class="language-py">class クラス名:</code></pre>
<p>という構文で定義します。</p>
<p>クラスのブロックの中に</p>
<pre><code class="language-py">def メソッド名(self, その他の引数, ・・・)</code></pre>
<p>という構文で、メソッドを定義します。</p>
<p>メソッドを定義する構文は、関数を定義する構文と同様ですが、<span class="u">第 1 引数を <code class="language-py"> self </code> にする約束</span>になっています。この self は「自分」という意味であり、そのクラスのインスタンス（インスタンスについてはあとで説明します）の識別情報が自動的に格納されます。それによって、メソッドの処理の中では、</p>
<pre><code class="language-py">self.変数名</code></pre>
<p>という構文で、クラスのインスタンスが持つデータを読み書きできます。このデータを<span class="u">インスタンス変数</span>と呼びます。</p>
<p>perimeter メソッドは、</p>
<pre><code class="language-py">self.radius * 2 * 3.14</code></pre>
<p>という計算で得られる円周の長さを返します。</p>
<p>area メソッドは、</p>
<pre><code class="language-py">self.radius * self.radius * 3.14</code></pre>
<p>という計算で得られる円の面積を返します。</p>
<p><code class="language-py"> self.radius </code> は、「自分が保持しているインスタンス変数 radius 」という意味です。それでは、インスタンス変数 radius の実体は、どこにあるのでしょう？ </p>
<p>それは、 <code class="language-py"> __init__ </code> メソッドの処理内容を見ればわかります。</p>
<h2>特殊メソッド __init__ の役割</h2>
<p>先ほど UML のクラス図で示した Circle クラスには、ありませんでしたが、 Python でクラスを定義するときには、 <code class="language-py"> __init__ </code> メソッドを記述します。 init は、 initialize （初期化）という意味です。</p>
<p>メソッド名の前後に、アンダースコア（ _ ）が 2 つずつあるのは、特定の場面で自動的に呼び出される特殊メソッドであることを意味しています。 <code class="language-py"> __init__ </code> メソッドは、クラスのインスタンスが生成された直後に、自動的に呼び出される特殊メソッドです。</p>
<p><code class="language-py"> __init__ </code> メソッドの処理として、何を行うのかは、プログラムの目的次第ですが、多くの場合に、<span class="u">インスタンス変数を作成</span>します。</p>
<pre><code class="language-py">self.radius = radius</code></pre>
<p>の部分で、インスタンス変数 radius を作成し、それに radius という値を設定しています。</p>
<p>左辺も右辺も radius なので、混乱するかもしれませんが、 self が付いている <code class="language-py"> self.radius </code> がインスタンス変数であり、 self が付いていない radius は外部から引数として <code class="language-py"> __init__ </code> メソッドに渡された半径の値です。 Python は、変数を宣言せずに使う言語なので、この <code class="language-py"> self.radius = radius </code> によって、インスタンス変数 radius が作成されます。</p>
<h2>インスタンスを生成して使う方法</h2>
<p>クラスは、オブジェクトを定義したものです。クラスは、その機能が必要になった時点で、メモリにロードして使います。メモリにロードされたクラスが <span class="bold">オブジェクト</span> であり、クラスの <span class="bold">インスタンス</span>（ instance = 「実例」）とも呼ばれます。</p>
<p>クラスを定義したプログラムは、ハードディスク上にあります。このプログラムをメモリにロードしたものが、クラスのインスタンスです。 1 つのクラスから、複数のインスタンスを生成することもできます。生成とは、メモリにロードすることです。</p>
<p>たとえば、以下の例は、 Circle クラスのインスタンスを 2 つ生成して、それぞれに c1 および c2 という名前を付けたときの、ハードディスクとメモリのイメージです。</p>
<figure><figcaption class="grey-text mag_h10 center">図 Circle クラスのインスタンスを 2 つ生成した例</figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/08/figure_class_instance.jpg" loading="lazy"><br />
</figure>
<p>Python のプログラムで、 Circle クラスのインスタンスを生成して使ってみましょう。</p>
<p>以下は、 Circle クラスのインスタンスを 2 つ生成して、それぞれの機能を使うプログラムを、 Python の対話モードで実行したところです。説明の都合で、行末にコメントを付けていますが、実際に実行するときには、コメントは不要です。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 Circle クラスのインスタンスを生成して使う（対話モード）</figcaption><pre><code class="language-bash">>>> from Circle import Circle	# Circleをインポートする
>>> c1 = Circle(10)		# 半径 10 のインスタンス c1 を生成する
>>> c2 = Circle(100)	# 半径 100 のインスタンス c2 を生成する
>>> c1.perimeter()		# c1の円周を求める
62.800000000000004
>>> c2.perimeter()		# c2の円周を求める
628.0
>>> c1.area()			# c1の面積を求める
314.0
>>> c2.area()			# c2の面積を求める
31400.0</code></pre>
</figure>
<p>クラスのインスタンスは、 <code class="language-bash">インスタンス名 = クラス名(引数) </code> という構文で生成します。</p>
<pre><code class="language-bash">c1 = Circle(10)</code></pre>
<p>によって Circle クラスのインスタンス c1 が生成され、引数 radius に 10 という値が渡されて <code class="language-py"> __init__ </code> メソッドが自動的に呼び出されます。</p>
<p>クラスの定義では、メソッドの第 1 引数に self がありますが、<span class="u">メソッドを呼び出すときには、 self を指定しません</span>。 self は、自動的に付加されるようになっているからです。</p>
<p>同様に、</p>
<pre><code class="language-bash">c2 = Circle(100)</code></pre>
<p>によって Circle クラスのインスタンス c2 が生成され、引数 radius に 100 という値が渡されて <code class="language-py"> __init__ </code> メソッドが自動的に呼び出されます。</p>
<p>&nbsp;</p>
<p>それぞれの半径の値を内部に保持したインスタンス c1 と c2 が生成されました。これ以降では、 <code class="language-bash"> インスタンス名.メソッド名() </code> という構文で、メソッドを呼び出して使います。</p>
<p><code class="language-bash"> c1.perimeter() </code> と <code class="language-bash"> c1.area() </code> で、 c1 の円周と面積が求められます。<br />
<code class="language-bash"> c2.perimeter() </code> と <code class="language-bash"> c2.area() </code> で、 c2 の円周と面積が求められます。</p>
<p>perimeter メソッドと area メソッドを呼び出すときに、引数に半径の値を指定していないことに注目してください。これは、どちらのメソッドも、内部に保持している半径の値を使って処理を行っているからです。</p>
<div class="divider mag_h50"></div>
<p>いかがでしたか。 Python によるオブジェクト指向の基礎を、しっかりとマスターできたでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/oo/">基本情報ではじめる Python (5) オブジェクト指向</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題」過去問と解説｜平成21年度 秋期 の過去問やるならこれをやれ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h21_autumn/</link>
		<pubDate>Mon, 23 Dec 2019 04:38:14 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[IPアドレス]]></category>
		<category><![CDATA[UML]]></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=3353</guid>
		<description><![CDATA[<p>ここでは、平成 21 年度 秋期 基本情報技術者試験の午前試験 の中から「やるべき問題」を 5 題に厳選し、ぶっちゃけた解説をさせていただきます。 やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習し [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h21_autumn/">「厳選5題」過去問と解説｜平成21年度 秋期 の過去問やるならこれをやれ</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_2009h21_2/2009h21a_fe_am_qs.pdf" rel="noopener" target="_blank">平成 21 年度 秋期 基本情報技術者試験の午前試験</a> の中から「やるべき問題」を 5 題に厳選し、ぶっちゃけた解説をさせていただきます。</p>
<p>やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習しないとできない問題）です。</p>
<style>h2 .chip{vertical-align:middle;background:#3f51b5;color:white;margin-right:.75em;}.chip i{font-size:2em!important;}table{font-size:.85em;}dd,dl.inline dd{margin-left:2em}@media screen and (min-width:601px){.responsive-width{width:60%}}pre,code{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;background:#eceff1;color:#263238;}pre{padding:1em 1.5em;margin:1.5em 0;}code{padding:.15em .5em;}pre{}</style>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_one</i></span>CUI 環境でディレクトリを指定する方法を知っておこう</h2>
<div class="card-panel mag_h30">
問 19　(平成 21 年度 秋期)</p>
<p>A ， B というディレクトリ名をもつ複数個のディレクトリが図の構造で管理されている。</p>
<figure>
<img class="mag_h30 hoverable materialboxed responsive-width" data-caption="問 19" src="../../wp-content/uploads/2019/12/q19_figure.jpg" alt="" loading="lazy" /><br />
</figure>
<p>カレントディレクトリを &yen;A&yen;B → .. → ..&yen;B → .&yen;A の順に移動させた場合，最終的なカレントディレクトリはどこか。 ここで，ディレクトリの指定方法は次のとおりとする。</p>
<p>〔ディレクトリの指定方法〕</p>
<dl class="inline">
<dt>(1)</dt>
<dd>ディレクトリは， &#8220;ディレクトリ名 &yen;･･･&yen; ディレクトリ名&#8221; のように，経路上の ディレクトリを順に &#8220;&yen;&#8221; で区切って並べた後に &#8220;&yen;&#8221; とディレクトリ名を指定する。 </dd>
<dt>(2)</dt>
<dd>カレントディレクトリは &#8220;.&#8221; で表す。 </dd>
<dt>(3)</dt>
<dd>1階層上のディレクトリは &#8220;..&#8221; で表す。  </dd>
<dt>(4)</dt>
<dd>始まりが &#8220;&yen;&#8221; のときは，左端にルートディレクトリが省略されているものとする。 </dd>
<dt>(5)</dt>
<dd>始まりが &#8220;&yen;&#8221; ， &#8220;.&#8221; ， &#8220;..&#8221;  のいずれでもないときは，左端にカレントディレクトリ配下であることを表す &#8220;.&yen;&#8221; が省略されているものとする。 </dd>
</dl>
<p>ア　&yen;A　　イ　&yen;A&yen;A　　<br class="hide-on-med-and-up">ウ　&yen;A&yen;B&yen;A　　エ　&yen;B&yen;A
</div>
<div class="chip">解説</div>
<p>UNIX 系の OS や Windows などを操作するには、</p>
<ul>
<li>ウインドウのメニューやアイコンを操作するビジュアルな <span class="bold">GUI（ Graphical User Interface ）</span>環境</li>
<li>コマンドをキー入力して操作する <span class="bold">CUI（ Character User Interface ）</span>環境</li>
</ul>
<p>があります。 GUI 環境でフォルダと呼ばれるものは、 CUI 環境で<span class="bold">ディレクトリ</span>と呼ばれます。</p>
<p>この問題では、 CUI 環境におけるカレントディレクトリ（現在の操作対象のディレクトリ）の移動がテーマになっています。 問題の図に示されたディレクトリの構造で、指定された通りにカレントディレクトリを移動してみましょう。</p>
<p>&nbsp;</p>
<p>はじめは、 &yen;A&yen;B がカレントディレクトリです。 先頭の &yen; はルートを示し、それ以降の &yen; はディレクトリの区切りを示します。</p>
<p>したがって、 &yen;A&yen;B は「ルートの下の A 、その下の B 」という意味であり、以下がカレントディレクトリになります（これ以降では、カレントディレクトリを赤色の円で囲んで示します）。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/12/q19_figure2-300x237.jpg" alt="" loading="lazy" /><br />
</figure>
<p>次に、 &#8220;..&#8221; に移動します。  &#8220;..&#8221; は、「 1 つ上のディレクトリ」を意味するので、現在位置から 1 つ上に上がって、以下がカレントディレクトリになります。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/12/q19_figure3-300x237.jpg" alt="" loading="lazy" /><br />
</figure>
<p>次に、 ..&yen;B に移動します。 これは、「 1 つ上のディレクトリに上がって、その下の B 」という意味であり、以下がカレントディレクトリになります。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/12/q19_figure4-300x237.jpg" alt="" loading="lazy" /><br />
</figure>
<p>最後に、 .&yen;Aに移動します。  &#8220;.&#8221; は、「カレントディレクトリ」を意味するので、現在位置から A に下がって、以下がカレントディレクトリになります。</p>
<p>このディレクトリは、「ルートの下の B 、その下の A 」なので、 &yen;B&yen;A です。 したがって、選択肢エが正解です。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed responsive-width" src="../../wp-content/uploads/2019/12/q19_figure5-300x237.jpg" alt="" loading="lazy" /><br />
</figure>
<p><span class="chip mag_tp30">解答</span>　エ</p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_two</i></span>半加算器と全加算器の違いを知っておこう</h2>
<div class="card-panel mag_h30">
問 25　(平成 21 年度 秋期)</p>
<p>図は全加算器を表す論理回路である。 図中の x に 1 ， y に 0 ， z に 1 を入力したとき，出力となる c(けた上げ数) ， s(和) の値はどれか。</p>
<figure>
<img class="hoverable z-depth-5 materialboxed" style="margin:auto;" src="../../wp-content/uploads/2019/12/q25_figure.jpg" alt="" loading="lazy" /><br />
</figure>
<table class="centered responsive-width mag_h30">
<thead>
<tr>
<th></th>
<th>c</th>
<th>s</th>
</tr>
</thead>
<tbody>
<tr>
<td>ア</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>イ</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>ウ</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>エ</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
<div class="chip">解説</div>
<p>この連載では、かつて<a href="../how2judge_nesessary_unnesessary/#i-5">半加算器の問題（平成 21 年度 春期 問 25 ）</a>を取り上げました。</p>
<p>半加算器は、 XOR 演算と AND 演算を使って、 1 桁の 2 進数を加算するものです。 複数桁の 2 進数を加算するには、半加算器だけでなく、全加算器も必要になります。</p>
<p>&nbsp;</p>
<p>例として、 0101 と 0011 という 4 ビットの 2 進数を加算するとしましょう。 最下位桁は、その桁にある 2 つの数値を足すだけであり、これは半加算器で行えます。</p>
<p>最下位桁より上の桁は、その桁にある 2 つの数値と、下位桁からの桁上がり、全部で 3 つの数値を足すことになります。 これを実現するのが、<span class="bold">全加算器</span>です。</p>
<p>したがって、 4 ビットの 2 進数の加算は、以下のように、 1 つの半加算器と 3 つの全加算器で実現されることになります。</p>
<figure><figcaption>図　4 ビットの加算の例</figcaption><img class="materialboxed z-depth-5" data-caption="図　4 ビットの加算の例" src="../../wp-content/uploads/2020/11/4bit_adder.png" loading="lazy" style="margin: auto;"><br />
</figure>
<p>問題に示された全加算器の図を見てください。</p>
<p>左側の x 、 y 、 z は、加算する 3 つの数字です。 右側の c は計算結果の桁上がり（ carry ）で、 s は sum （和）です。</p>
<p>ここでは、 x = 1 、 y = 0 、 z = 1 とするので、計算結果は、 1 + 0 + 1 = 10 になり、 c が 1 で s が 0 です。 したがって、選択肢ウが正解です。</p>
<p>&nbsp;</p>
<p>全加算器の内部では、半加算器を 2 つ使っています。 以下に全加算器の仕組みを示します。</p>
<ol class="background c-round">
<figure>
<img class="hoverable materialboxed responsive-width pad_05" data-caption="全加算器" src="../../wp-content/uploads/2019/12/q25_figure3.jpg" alt="" loading="lazy" /><br />
</figure>
<li>x と y を半加算器 1 で足す</li>
<li>その結果の s と z を半加算器 2 で足す</li>
<li>その結果の s を全加算器の s とする</li>
<li>半加算器 1 の c と半加算器 2 の c を OR 回路につなぎ、その結果が全加算器の c とする</li>
</ol>
<p><span class="chip mag_tp30">解答</span>　ウ</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p class="grey-text small-text"><i class="material-icons mag_rt05">info_outline</i>加算器 / 半加算器に関する詳しい記事</p>
<p><a href="../../mastering_tech/digital_logic/"></p>
<div class="row valign-wrapper pad_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2020/11/digital_logic_cover-300x169.png" width="640" height="360" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">基本情報でわかる 論理演算 「真理値表を書けば、半加算器と全加算器の仕組みがわかる」</div>
</div>
<p></a></p>
<div class="divider mag_bt40 mag_tp10"></div>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_3</i></span>サブネットマスクと CIDR 表記の対応を知っておこう</h2>
<div class="card-panel mag_h30">
問 39　(平成 21 年度 秋期)</p>
<p>IP アドレス 10.1.2.146 ，サブネットマスク 255.255.255.240 のホストが属するサブネットワークはどれか。</p>
<p>ア　10.1.2.132/26　　<br class="hide-on-med-and-up">イ　10.1.2.132/28<br />
ウ　10.1.2.144/26　　<br class="hide-on-med-and-up">エ　10.1.2.144/28
</div>
<div class="chip">解説</div>
<p>サブネットワークとは、 1 つのネットワークを分割したものです。 IPv4 の IP アドレスでは、サブネットマスクおよび CIDR（ Classless Inter-Domain Routing 、サイダー）表記によって、サブネットワークを示すことができます。</p>
<p>この問題は、255.255.255.240 というサブネットマスクが、 CIDR 表記ではどのようになるかを、選択肢から選ぶものです。</p>
<p>&nbsp;</p>
<p>IPv4 の IP アドレスのサイズは、 32 ビットです。 255.255.255.240 というサブネットマスクを 2 進数で表記してみましょう。</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>11111111.11111111.11111111.11110000</pre>
<p>32 ビットの上位 28 ビットに 1 が並び、残りの下位 4 ビットに 0 が並んでいます。</p>
<p>このように、サブネットマスクは、上位桁に 1 が並び下位桁に 0 が並んだ形式になっていて、 <span class="bold">1 が並んだ部分がサブネットワーク（ネットワークとサブネットのアドレス）</span>で、 <span class="bold">0 が並んだ部分がホストアドレスである</span>ことを示しています。</p>
<p>&nbsp;</p>
<p>10.1.2.146 という IP アドレスのサブネットワークを求めてみましょう。 10.1.2.146 を 2 進数で表記します。</p>
<pre>00001010.00000001.00000010.10010010</pre>
<p>ここでは、上位 28 ビットがサブネットワークなので、</p>
<pre>00001010.00000001.00000010.1001xxxx</pre>
<p>になります。</p>
<p><code>xxxx</code> の部分は、「設定なし」という意味にしたいので、 0 で埋めて、</p>
<pre>00001010.00000001.00000010.10010000</pre>
<p>とします。</p>
<p>これを 10 進数表記にすると、 10.1.2.144 です。</p>
<p>&nbsp;</p>
<p>サブネットワークを 10.1.2.144 と示しただけでは、上位何桁までがサブネットワークなのかがわかりません。 そこで、 CIDR 表記が使われます。</p>
<p>CIDR 表記は、<span class="bold"> / の後に上位桁の桁数を示したもの</span> です。</p>
<p>ここでは、上位 28 ビットがサブネットワークなので、それを /28 で示します。 したがって、 10.1.2.144/28 となっている選択肢エが正解です。</p>
<p><span class="chip mag_tp30">解答</span>　エ</p>
<div class="divider mag_h30"></div>
<p class="grey-text mag_tp30"><i class="material-icons light-blue-text">search</i><span class="grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/IPアドレス/" class="tag">IP アドレス</a></p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_4</i></span>UML のクラス図とシーケンス図の役割を知っておこう</h2>
<div class="card-panel mag_h30">
問 45　(平成 21 年度 秋期)</p>
<p>UML 2.0 で定義している図のうち，動的な振る舞いを表現するものはどれか。</p>
<p>ア　オブジェクト図　　<br class="hide-on-med-and-up">イ　クラス図<br />
ウ　シーケンス図　　<br class="hide-on-med-and-up">エ　パッケージ図
</div>
<div class="chip">解説</div>
<p>UML 2.0 では、 13 種類の図が定義されていますが、試験によく出るのは、<span class="bold">クラス図</span>と<span class="bold">シーケンス図</span>です。</p>
<p>これらは、オブジェクト指向において最も重要な概念である<span class="bold">「オブジェクト」と「メッセージ」を示すもの</span>です。</p>
<dl class="background c-round">
<dt class="bold">クラス図</dt>
<dd>オブジェクトの<span class="bold">静的な構造</span>（構成要素と関連）</dd>
<dt class="bold">シーケンス図</dt>
<dd>オブジェクトの<span class="bold">動的な振る舞い</span>（メッセージの受け渡し）</dd>
</dl>
<p>この問題は、動的な振る舞いを表現する図を選ぶのですから、選択肢ウのシーケンス図が正解です。</p>
<p>&nbsp;</p>
<p>言葉だけではイメージがつかめないと思いますので、クラス図とシーケンス図の簡単な例をお見せしましょう。 ここでは、ユーザーとコンピュータがジャンケンをするプログラムを作るとします。</p>
<div class="background c-round">
プログラムが、どのような構成要素を持つクラスから構成され、どのように関連しているのかを示すのが、クラス図です。 クラス図では、四角形を 3 つに区切り、上から順にクラス名、属性（クラスが持つデータ）、振る舞い（クラスが持つ処理）を記述します。</p>
<p>ここでは、「ユーザー」「コンピュータ」「審判」という 3 つのクラスがあるとしています。</p>
<figure class="center"><figcaption class="chip mag_h10"><i class="material-icons blue-text mag_rt05">description</i>クラス図の例</figcaption><img class="hoverable materialboxed responsive-width pad_05" data-caption="クラス図の例" src="../../wp-content/uploads/2019/12/q45_figure.jpg" alt="" loading="lazy" /><br />
</figure>
<p>「審判」から「ユーザー」と「コンピュータ」に伸びた破線の矢印は、「審判」が「ユーザー」と「コンピュータ」を使うことを意味します。 クラス図にも振る舞いがありますが、動的ではありません。 そのクラスが、その振る舞いを持っていることを示しているだけなので、静的です。
</p></div>
<div class="background c-round">
プログラムの実行時には、クラスがメモリにロードされます。 これを<span class="bold">「クラスのインスタンス」または「オブジェクト」</span>と呼びます。 シーケンス図は、プログラムの実行時のオブジェクト間のメッセージの受け渡しを示します。</p>
<figure class="center"><figcaption class="chip mag_h10"><i class="material-icons blue-text mag_rt05">description</i>シーケンス図の例</figcaption><img class="hoverable materialboxed responsive-width pad_05" data-caption="シーケンス図の例" src="../../wp-content/uploads/2019/12/q45_figure2.jpg" alt="" loading="lazy" /><br />
</figure>
<ul class="background c-round">
<p class="post-title">シーケン図の見方</p>
<li>四角形で囲まれた「：クラス名」は、そのクラスのインスタンス（オブジェクト）を意味します</li>
<li>そこから下に伸びた破線は、インスタンスの存在期間を示します</li>
<li>図の上から下に時間が経過するとして、実線の矢印でメッセージ（他のオブジェクトの振る舞いの呼び出し）を示します</li>
<li>破線の矢印でメッセージへの応答を示します。 縦長の四角形は、処理を行っている区間を示します</li>
</ul>
<p>このようにして、シーケンス図は、オブジェクトの動的な振る舞いを表現するのです。
</p></div>
<p><span class="chip mag_tp30">解答</span>　ウ</p>
<div class="divider mag_h30"></div>
<p class="grey-text mag_tp30"><i class="material-icons light-blue-text">search</i><span class="grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/UML/" class="tag">UML</a></p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_5</i></span>カプセル化、継承、多態性の意味を知っておこう</h2>
<div class="card-panel mag_h30">
問 46　(平成 21 年度 秋期)</p>
<p>オブジェクト指向でシステムを開発する場合のカプセル化の効果はどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>オブジェクトの内部データ構造やメソッドの実装を変更しても，ほかのオブジェクトがその影響を受けにくい。 </dd>
<dt>イ</dt>
<dd>既存の型に加えてユーザ定義型を追加できるので，問題領域に合わせてプログラムの仕様を拡張できる。 </dd>
<dt>ウ</dt>
<dd>子クラスとして派生するので，親クラスの属性を子クラスが利用できる。 </dd>
<dt>エ</dt>
<dd>同一メッセージを送っても，受け手のオブジェクトによって，それぞれが異なる 動作をするので，メッセージを受け取るオブジェクトの種類が増えても，メッセージを送るオブジェクトには影響がない。 </dd>
</dl>
</div>
<div class="chip">解説</div>
<p>先ほどの問題で示したように、オブジェクト指向の最も基本となる概念は、オブジェクトとメッセージですが、それらの次に重要な概念として、カプセル化、継承、多態性があります。</p>
<p>この問題では、カプセル化がテーマになっていますが、選択肢の中には、継承と多態性に関する説明もあります。</p>
<p>&nbsp;</p>
<p>カプセル化とは、属性と振る舞いをまとめて 1 つのオブジェクトにすることです。 まとめることによって、属性や振る舞いの変更がオブジェクトの内部で対処できるようになり、外部に影響を与えにくくなります。</p>
<p>したがって、カプセル化の効果に該当するのは、選択肢アであり、これが正解です。</p>
<dl class="background c-round">
<dt class="bold">継承とは</dt>
<dd>既存のクラス（親クラス）を改造することなく、必要な機能を付け足して新たなクラス（子クラス）を作成することです。 <br />子クラスは、親クラスの属性と振る舞いを利用できます。 <br />継承の効果に該当するのは、選択肢ウです。 </dd>
<dt class="bold">多態性とは</dt>
<dd>同じ構文の振る舞い（同じメッセージで呼び出せる振る舞い）を、複数のオブジェクトが持つことです。 <br />これによって、オブジェクトを利用する側は、同じメッセージで、様々なオブジェクトを利用できます。 <br />多態性の効果に該当するのは、選択肢エです。 </dd>
</dl>
<p><span class="chip mag_tp30">解答</span>　ア</p>
<div class="divider mag_h30"></div>
<p class="grey-text mag_tp30"><i class="material-icons light-blue-text">search</i><span class="grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/オブジェクト指向/" class="tag">オブジェクト指向</a></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/h21_autumn/">「厳選5題」過去問と解説｜平成21年度 秋期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>午後問題の歩き方 ｜ Java プログラミング問題の楽勝パターン（2）オブジェクト指向</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_java_2_of_questions_at_pm/</link>
		<pubDate>Tue, 18 Sep 2018 02:34:25 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">http://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=gogo_arukikata&#038;p=445</guid>
		<description><![CDATA[<p>前回の記事では、「 C 言語と Java のどちらかを選択する予定だ」という人に、 「試験当日の問題次第ですが、生半可に Java ができるというレベルでは、Java を選ばない方が無難かもしれませんね」 というアドバイ [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_java_2_of_questions_at_pm/">午後問題の歩き方 ｜ Java プログラミング問題の楽勝パターン（2）オブジェクト指向</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>前回の記事では、「 C 言語と Java のどちらかを選択する予定だ」という人に、</p>
<p>「試験当日の問題次第ですが、生半可に Java ができるというレベルでは、Java を選ばない方が無難かもしれませんね」</p>
<p>というアドバイスをしました。</p>
<p><a href="../guide_java_1_of_questions_at_pm/"></p>
<div class="card hoverable mag_h30 c-round">
<div class="row valign-wrapper direction-column-on-small">
<div class="col m4 pad_00 flex"><img src="../../wp-content/uploads/2018/09/java_cover-640x360.jpg" loading="lazy" /></div>
<div class="col m8 pad_20 black-text bold">Java プログラミング問題の難易度（1）Java 基本構文</div>
</div>
</div>
<p></a></p>
<p>ただし、「ぜひ Java を選んでください！」とアドバイスしたくなるような問題もあります。</p>
<p>それは、 <span class="bold">継承や多態性などのオブジェクト指向がテーマの問題</span> です。オブジェクト指向が苦手でないなら、きっと楽勝のはずです。</p>
<p>実際の問題を見てみましょう。</p>
<div class="background blue-grey-text small-text mag_h40 c-round">
<i class="material-icons light-blue-text mag_rt05">info</i>本記事では読みやすいよう、シンタックスハイライトを入れています。実際の試験では白黒です。ご注意くださいませ。</p>
<p class="blue-grey-text small-text hide-on-med-and-up"><i class="material-icons light-blue-text mag_rt05">info</i>スマートフォンでご覧の際は、プログラムは横スクロールできます</p>
</div>
<style>article{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif}article pre:not(.line-numbers){margin-right:-7.5%!important;margin-left:-7.5%!important;padding-left:7.5%!important}article pre.line-numbers{margin-right:-7.5%!important;margin-left:-7.5%!important}</style>
<h2>抽象クラスや抽象メソッドを知っていれば楽勝</h2>
<p>以下は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_1/2017h29h_fe_pm_qs.pdf#page=52" rel="noopener" target="_blank">平成 29 年度 春期 午後 問 11「電気料金プランの比較」</a> の設問 1 の一部です。</p>
<p>プログラムの説明は省略しますが、空欄 a に入るものを解答群から選んでください。</p>
<p>[プログラム 1]</p>
<pre class="line-numbers">
<code class="language-java">'[ 空欄a ]' class TierTable {
	final double[][] pairs;

	TierTable(double... tiers) {
		if (tiers.length % 2 == 1) {
			throw new IllegalArgumentException("不正な長さ: " + tiers.length);
		}
		double[][] a = new double[tiers.length / 2][];
		for (int i = 0; i < tiers.length; i += 2) {
			a[ '[ 空欄b ]' ] = new double[] { tiers[i], tiers[i + 1] };
		}
		this.pairs = a;
	}

	abstract double map(double amount);
}</code></pre>
<div class="card-panel mag_h30">
a に関する解答群</p>
<p>ア　abstract　　<br class="hide-on-med-and-up">イ　final　　<br class="hide-on-med-and-up">ウ　private<br />
エ　protected　　<br class="hide-on-med-and-up">オ　public　　<br class="hide-on-med-and-up">カ　static
</div>
<p>&nbsp;</p>
<p>TierTable クラスには、 <code class="language-java"> abstract double map(double amount); </code> という抽象メソッドがあります。</p>
<p>抽象メソッドを持つクラスは、インスタンスを生成できないので、class の前に abstract を指定して抽象クラスにしなければなりません。</p>
<p>したがって、正解は、選択肢アです。</p>
<p><span class="bold">いかがですか。「えっ！ こんなに簡単でいいの？」と言いたくなるような問題でしょう。</span></p>
<p>&nbsp;</p>
<p>ただし、そう思えるのは、オブジェクト指向の概念である抽象クラスや抽象メソッドを知っているからです。</p>
<h2>継承を知っていれば楽勝</h2>
<p>以下は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_1/2017h29h_fe_pm_qs.pdf#page=56" rel="noopener" target="_blank">同じ年度の問題の設問 2</a> の一部です。プログラムの説明を読んで、空欄eに入るものを解答群から選んでください。</p>
<div class="card-panel mag_h30">
　プログラム 6 は，割引プランを表すためのクラス DiscountPlan である。 DiscountPlan は，クラス RatePlan を拡張し，上位クラスである RatePlan のメソッド getPrice で求めた電気料金から割引率を求め，割引を適用した金額を電気料金として計算する。プログラム中の <span class="bold" style="border: 2px solid;">　　　　　</span> に入れる正しい答えを，解答群の中から選べ。
</div>
<p>[プログラム 6 ]</p>
<pre class="line-numbers">
<code class="language-java">class DiscountPlan '[ 空欄e ]' RatePlan {
	private final TierTable discountTiers;

	Discount Plan(String name, double basicCharge,
					TierTable pricingTiers, TierTable discountTiers) {
		super (name, basicCharge, pricingTiers);
		this.discountTiers = discountTiers;
	}

	int getPrice(double amount) {
		int price = '[ 空欄f ]'.getPrice(amount);
		return (int) (price * '[ 空欄g]' );
	}
}</code></pre>
<div class="card-panel mag_h30">
e に関する解答群</p>
<p>ア　extends　　<br class="hide-on-med-and-up">イ　implements　　<br class="hide-on-med-and-up">ウ　imports<br />
エ　public　　<br class="hide-on-med-and-up">オ　throws
</div>
<p>プログラムの説明に「 DiscountPlan は、クラス RatePlan を拡張し」と示されています。これは、「 RatePlan クラスを継承して DiscountPlan クラスを定義する」という意味です。</p>
<p>Java では、<span class="bold">継承 を extends（拡張する）</span> というキーワードで示します。したがって、正解は、選択肢アです。</p>
<p><span class="bold">これも、「えっ！ こんなに簡単でいいの？」と言いたくなるような問題でしょう。</span></p>
<p>&nbsp;</p>
<p>ただし、そう思えるのは、オブジェクト指向の概念である継承を知っているからです。( 2 回目)</p>
<div class="divider" style="margin: 3.5em 0 1.5em;"></div>
<p><span class="badge red white-text" style="float: left!important;">PR</span></p>
<div class="center" style="padding-top: 1rem;">
<a href="https://www.amazon.co.jp/dp/B081N4LWSB"><br />
<img class="hoverable z-depth-5" src="../../wp-content/uploads/2018/09/java_banner.png"><br />
</a>
</div>
<div class="mag_h30 divider"></div>
<h2>継承におけるコンストラクタの取り扱いを知っていれば楽勝</h2>
<p>今度は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_1/2014h26h_fe_pm_qs.pdf#page=58" rel="noopener" target="_blank">平成 26 年度 春期 午後 問 11「雑誌記事のオンライン購読サイト」</a> の設問 1 の一部です。プログラムの説明は省略しますが、空欄 b に入るものを解答群から選んでください。</p>
<p>[プログラム 5 ]</p>
<pre class="line-numbers">
<code class="language-java">class PaidMember extends Member {
	PaidMember(String name) {
		'[ 空欄b ]';
	}

	boolean testAndMark(Article article) {
		return '[ 空欄d ]';
	}
}</code></pre>
<p>b に関する解答群</p>
<pre><code class="language-java">ア　new User(name)　　イ　super()　　ウ　super(name)
エ　super.name = name　　オ　this()　　カ　this(name)
キ　this.name = name　　ク　User(name)</code>
</pre>
<p>&nbsp;</p>
<p><code class="language-java"> class PaidMember extends Member { } </code> という構文から、Member クラスを継承して PaidMember クラスを定義しています。</p>
<p>PaidMember クラスの中にある <code class="language-java"> PaidMember(String name) { } </code> は、クラス名と同名のメソッドなので、<span class="bold">コンストラクタ</span> です。</p>
<p>多くの場合に、コンストラクタ では、引数の値をフィールドに格納する処理が行われます。</p>
<p>ここでは、引数 name を何らかのフィールドに指定するはずです。ところが、PaidMember クラスには、フィールドがありません。</p>
<p>なぜでしょう。</p>
<p>フィールドは、継承元の Member クラスにあるからです。</p>
<p>それでは、継承元の Member クラスのフィールドに 引数 name の値を渡すには、どうしたらよいでしょう。</p>
<p>選択肢をヒントにして考えてみましょう。</p>
<p><code class="language-java"> super(name); </code> という構文で、継承元のクラスのコンストラクタを呼び出せばよいことに気づくはずです。正解は、選択肢ウです。</p>
<p>&nbsp;</p>
<p><span class="bold">これも、オブジェクト指向の概念である継承と、継承におけるコンストラクタの取り扱いを知っていれば、楽勝の問題です。</span></p>
<h2>クラスの継承とインターフェイスの実装の違いを知っていれば楽勝</h2>
<p>続いて、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_2/2012h24a_fe_pm_qs.pdf#page=57" rel="noopener" target="_blank">平成 24 年 秋期 午後 問 11「スレッドを利用したタイマ」</a> の設問 1 の一部です。ここでも、プログラムの説明は省略しますが、空欄 c に入るものを解答群から選んでください。</p>
<p>[プログラム 1]</p>
<pre class="line-numbers">
<code class="language-java">public interface TimerAction {
	public void onStart(Timer timer, long instant);
	public void onAlarm(Timer timer, long instant);
	public void onCancel(Timer timer, long instant);
}</code>
</pre>
<p>[プログラム 3]</p>
<pre class="line-numbers">
<code class="language-java">import java.util.Date;

public class TimerTest '[ 空欄c ]' TimerAction {
	Timer longTimer, shortTimer;

	private void test() '[ 空欄d ]' InterruptedException {
		longTimer = Timer.createTimer("long timer", '[ 空欄e ]', 4);
		shortTimer = Timer.createTimer("short timer", '[ 空欄e ]', 2);
		shortTimer.close();
		longTimer.close();
	}
	// 中略
}</code>
</pre>
<div class="card-panel mag_h30">
c, d に関する解答群</p>
<p>ア　expands　　<br class="hide-on-med-and-up">イ　extends　　<br class="hide-on-med-and-up">ウ　implements<br />
エ　subclasses　　<br class="hide-on-med-and-up">オ　throw　　<br class="hide-on-med-and-up">カ　throws
</div>
<p>TimerAction は、クラスではなくインターフェイスです。クラスは extends キーワードで継承しますが、<span class="bold">インターフェイスは implements キーワードで実装する</span> ものです。</p>
<p>ここでは、TimerTest クラスが TimerAction インターフェイスを実装します。したがって、空欄 c に入るのは、選択肢ウの implements です。</p>
<p>&nbsp;</p>
<p>ついでに、空欄 d に入るものも選んでみましょう。</p>
<p><code class="language-java"> public void test() </code> の後に空欄 d があり、その後に InterruptedException という例外クラスが指定されています。</p>
<p>これは、「 test() メソッドが InterruptedException 例外を投げる」という表現です。したがって、空欄 d には、選択肢カの throws が入ります。</p>
<p>&nbsp;</p>
<p>この空欄 d は、オブジェクト指向に直接関係していませんが、<span class="bold">Javaの例外に関する構文を知っていれば、楽勝のはずです。こういう問題も出るのです。</span></p>
<h2>インターフェイスを使った多態性を知っていれば楽勝</h2>
<p>最後に、もう 1 つだけ楽勝の問題を紹介しましょう。</p>
<p>以下は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2011h23_1/2011h23tokubetsu_fe_pm_qs.pdf#page=51" rel="noopener" target="_blank">平成 23 年度 春期（特別試験）午後 問 11「追加可能な文字列インターフェイスの 2 種類の実装」</a> の一部です。</p>
<p>プログラムを示しませんが、AppendableCharSequence インターフェイスと、それを実装した ArrayAppendableCharSequence クラス、および ListAppendableCharSequence クラスがあります。</p>
<p>同じインターフェイスで定義されたメソッドを、2つのクラスが実装（メソッドの処理内容をそれぞれのクラスに合わせて記述）しているのです。</p>
<p>これは、<span class="bold">多態性</span> です。</p>
<p>&nbsp;</p>
<p>以下に示したプログラムの空欄 e には、引数 a に、ArrayAppendableCharSequence クラスのインスタンスと、ListAppendableCharSequence クラスのインスタンスの、どちらでも指定できるデータ型を入れることになります。</p>
<p>それは、AppendableCharSequence インターフェイスです。同じインターフェイスを実装したクラスのインスタンスは、そのインターフェイスをデータ型とすることができます。</p>
<p><span class="bold">これは、多態性を使ったプログラムで定番の表現です。知っていれば、楽勝！ 楽勝です！</span></p>
<p>[プログラム 4 ]</p>
<pre class="line-numbers">
<code class="language-java">public class Test {
	static final int[] TIMES = {
		5000, 10000, 50000, 100000
	};

	public static void main(String[] args) {
		for (int n : TIMES) {
			measureTime(n, new ArrayAppendableCharSequence());
			measureTime(n, new ListAppendableCharSequence());
		}
	}

	static void measureTime(int n, '[ 空欄e ]' a ) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < n; i++) {
			a.append((char) (i % 26 + 'a'));
		}
		long end = System.currentTimeMillis();
		System.out.printf("%s: %d [times] %d [ms]%n",
						a.getClass().getName(),
						n, end - start);
	}
}</code></pre>
<p>e に関する解答群</p>
<pre><code class="language-java">ア　AppendableCharSequence
イ　ArrayAppendableCharSequence
ウ　ListAppendableCharSequence
エ　ListAppendableCharSequence.Bucket
オ　Object
カ　String</code>
</pre>
<p>&nbsp;</p>
<div class="divider mag_h50"></div>
<p>今回の記事では、<span class="bold">「オブジェクト指向が苦手でないなら楽勝」</span>という問題を紹介しましたが、<span class="bold">C 言語より Java の方が常に楽勝なわけではありません。</span></p>
<p>C 言語と Java のどちらかを選択する予定の人は、試験当日の問題の内容を見て、慎重に判断してください。</p>
<p><span class="bold">中途半端に Java に手を付けてから「やっぱり C 言語に変えよう」とならないように、くれぐれも注意してください。時間を大幅にロスしてしまうからです。</span></p>
<p>&nbsp;</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_java_2_of_questions_at_pm/">午後問題の歩き方 ｜ Java プログラミング問題の楽勝パターン（2）オブジェクト指向</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
