<?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>Java | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Wed, 17 Jun 2026 00:43:28 +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>今週の午後問題〔解答〕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>基本情報 プログラミング 言語の選択と学習方法｜午後問題の歩き方</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/choice_of_programming_languages/</link>
		<pubDate>Mon, 22 Mar 2021 04:27:00 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[CASL II]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[擬似言語]]></category>
		<category><![CDATA[表計算]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=gogo_arukikata&#038;p=5234</guid>
		<description><![CDATA[<p>info アルゴリズムとプログラミング問題の対策には、新しい擬似言語にリライトした連載「アルゴリズムとプログラミング問題を解くコツ」がオススメです。 プログラミング言語の特徴と選び方 基本情報技術者試験の午後試験では、「 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/choice_of_programming_languages/">基本情報 プログラミング 言語の選択と学習方法｜午後問題の歩き方</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 flex">
<p class="mag_rt10 mag_h00"><i class="material-icons blue-text" style="font-size:2.2em">info</i></p>
<p class="blue-grey-text mag_h00">アルゴリズムとプログラミング問題の対策には、新しい擬似言語にリライトした連載<a href="../../patterns_algorithms/" class="bold">「アルゴリズムとプログラミング問題を解くコツ」</a>がオススメです。</p>
</div>
<h2>プログラミング言語の特徴と選び方</h2>
<p>基本情報技術者試験の午後試験では、「 C 言語」「 Java 」「 Python 」「アセンブラ ( CASLⅡ ) 」「表計算」の中から、 1 つを選択しなければなりません。プログラミングの経験がない人は、「どれを選んで、どのように学習すればよいのだろう？」と悩んでしまうでしょう。</p>
<p>そこで、この記事では、それぞれのプログラミング言語の特徴を説明し、それぞれの学習方法をアドバイスします。</p>
<p>&nbsp;</p>
<p>はじめに、それぞれの言語の特徴を説明しましょう。</p>
<p>「何か 1 つプログラミング言語をマスターしたい」と思っている人は、それぞれの特徴から、自分の好みに合った言語を選んでください。<span class="u">「やってみたい！」と思った言語を選ぶことが重要</span>です。興味がない言語を嫌々学習したのでは、決してマスターできないからです。</p>
<style>table{font-size:.85em;}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:#292a33;color:#eceff1;font-size:1em;margin:1em -7.5%;padding:1em 7.5%}th{text-align:center;}@media screen and (min-width:601px){.responsive-width{width:70%}}</style>
<h3>C言語 の特徴</h3>
<p>C 言語は、 IT 業界の第一プログラミング言語と呼べるものです。英語が世界の共通語であるように、 <span class="bold">C 言語は、 IT 業界の共通語である</span>と言えます。</p>
<p>図 1 は、プログラミング言語の人気ランキングを示した <a href="https://www.tiobe.com/tiobe-index/" rel="noopener" target="_blank">TIOBE Index</a> の 2021 年 3 月のランキングを Top 10 まで示したものです。 1 年前の 3 月に 1 位だった Java を抜いて、 C 言語が 1 位になっていることがわかります。</p>
<p class="background c-round blue-grey-text mag_h30 small-text blue-grey-text hide-on-med-and-up"><i class="material-icons light-blue-text mag_rt05">info</i>表は右にスクロールできます</p>
<div class="table-container">
<table class="striped centered responsive-width" style="font-family: Consolas, 'Courier New';">
<caption>図 1　2021 年 3 月のプログラミング言語の人気ランキング（ TIOBE Index より）</caption>
<thead>
<tr>
<th>Mar-21</th>
<th>Mar-20</th>
<th>Change</th>
<th>Programming<br />Language</th>
<th>Ratings</th>
<th>Change</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td><i class="material-icons blue-text">call_made</i></td>
<td>C</td>
<td>15.33%</td>
<td>-1.00%</td>
</tr>
<tr>
<td>2</td>
<td>1</td>
<td><i class="material-icons red-text">call_received</i></td>
<td>Java</td>
<td>10.45%</td>
<td>-7.33%</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td></td>
<td>Python</td>
<td>10.31%</td>
<td>0.20%</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td></td>
<td>C++</td>
<td>6.52%</td>
<td>-0.27%</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td></td>
<td>C#</td>
<td>4.97%</td>
<td>-0.35%</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
<td></td>
<td>Visual Basic</td>
<td>4.85%</td>
<td>-0.40%</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
<td></td>
<td>JavaScript</td>
<td>2.11%</td>
<td>0.06%</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
<td></td>
<td>PHP</td>
<td>2.07%</td>
<td>0.05%</td>
</tr>
<tr>
<td>9</td>
<td>12</td>
<td><i class="material-icons blue-text">call_made</i></td>
<td>Assembly language</td>
<td>1.97%</td>
<td>0.72%</td>
</tr>
<tr>
<td>10</td>
<td>9</td>
<td><i class="material-icons red-text">call_received</i></td>
<td>SQL</td>
<td>1.87%</td>
<td>0.03%</td>
</tr>
</tbody>
</table>
</div>
<h3>Java の特徴</h3>
<p>Java は、私が知る限り、現在、最もニーズが高い言語です。</p>
<p><span class="u">ほとんどの IT 企業が、新人研修で Java を取り上げています。それは、配属後の開発の現場で Java が使われることが多いから</span>です。先ほどの TIOBE Index でも、 Java が第 2 位になっています。</p>
<p>実は、ここ数年、ずっと Java が 1 位だったのですが、最近になって人気に陰りが見えてきました。そのため、第一プログラミング言語である C 言語に 1 位の座を受け渡してしまったのです。</p>
<h3>Python の特徴</h3>
<p><span class="u">Python は、現在、最も注目が高まっている言語</span>です。</p>
<p>図 2 は、プログラマ向けの雑誌「日経ソフトウエア」 2021 年 3 月号の表紙です。これを見ると、特集記事も、連載記事も、付録の冊子も、ほとんどが Python 関連になっていることがわかるでしょう。それだけ Python が注目されているからです。</p>
<p>先ほどの TIOBE Index でも、 Python が第 3 位になっています。第 2 位の Java との差は、ほんのわずかです。 Python の台頭によって、 Java の人気に陰りが生じたのです。</p>
<figure><figcaption>図 2　プログラマ向け雑誌「日経ソフトウエア」の表紙</figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/03/cover_nikkei_software.png" width="451" height="641" loading="lazy"><br />
</figure>
<h3>アセンブラ ( CASLⅡ [CASL2] ) の特徴</h3>
<p>アセンブラは、コンピュータのハードウエアを直接操作する命令を記述する言語です。</p>
<p>基本情報技術者試験のアセンブラは、 COMETⅡ （コメット・ツー）という架空のコンピュータを対象とした CASLⅡ （キャッスル・ツー）という架空のアセンブラです。したがって、開発の現場で CASLⅡ を使うことはありませんが、<span class="u">ハードウエアの仕組みとプログラムを関連付ける、という学習効果は、大いにあります。</span></p>
<h3>表計算の特徴</h3>
<p>表計算は、プログラミング言語ではありませんが、プログラミング言語の選択肢の 1 つになっています。</p>
<p>基本情報技術者試験の表計算は、 Microsoft Excel ではなく、独自仕様のものです。ただし、セルに数式や関数を入れてワークシートを作成することは、 Microsoft Excel と同様です。 <span class="u">Microsoft Excel を使ったことがあるなら、短時間でマスターできるでしょう。</span></p>
<h3>選択のポイント</h3>
<p>それぞれのプログラミング言語の特徴から、言語を選ぶポイントをまとめると、以下のようになります。</p>
<ul class="background c-round">
<li>IT業界の第一プログラミング言語を学んでおきたいなら <span class="bold">C 言語</span> です！</li>
<li>すぐに開発の現場で使える言語をマスターしたいなら <span class="bold">Java</span> です！</li>
<li>近い将来、開発の現場でニーズが高まる言語をマスターしたいなら <span class="bold">Python</span> です！</li>
<li>ハードウエアの仕組みとプログラムを関連付けて学習したいなら <span class="bold">アセンブラ</span> です！</li>
<li>試験までの学習時間がないなら <span class="bold">表計算</span> です！</li>
</ul>
<h2>プログラミング言語の学習方法</h2>
<p>次に、それぞれの言語の学習方法をアドバイスしましょう。</p>
<p>ここでは、<span class="bold">試験問題のプログラムを読めるレベルになるには、どのように学習すればよいかを示します。</span> ただし、プログラムを読めるだけでは、試験問題を解くことはできません。試験問題のテーマは、言語で示されたアルゴリズムを読み取ることだからです。 <span class="u">言語とアルゴリズムの学習を、並行して行ってください。</span></p>
<h3>C 言語 / Java / Python の学習方法</h3>
<p>C 言語、Java、Python の学習方法は、どれも同じです。それぞれの言語構文を解説した書籍を購入して、そこに示されたサンプルプログラムを作ってください。</p>
<div class="background c-round">
プログラミング言語は、暗記して覚えるものではありません。自分の手でプログラムを作って、自分の目で動作を確認して、体得するものです。</p>
<p>プログラムを作るには、専用のツールが必要です。ほとんどのツールは、インターネットから無償で入手できます。ツールの入手方法とインストール方法が示された書籍を選ぶとよいでしょう。
</p></div>
<p><span class="bold">基本構文だけがわかれば OK</span> なので、「はじめての〇〇」や「〇〇入門」のようなタイトルの書籍がよいでしょう。</p>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/java/" class="tag mag_rt05">Java</a><a href="../../tag/python/" class="tag">Python</a>
</div>
<h3>アセンブラ CASLⅡ [ CASL2 ] の学習方法</h3>
<p>アセンブラの学習も書籍で行いますが、実在するコンピュータのアセンブラではなく、<span class="u">基本情報技術者試験の架空のアセンブラである CASLⅡ の書籍を購入することに注意</span> してください。</p>
<p>CASLⅡのプログラムを作って動作を確認するときは、CASLⅡシミュレータを利用できます。インターネットから無償で入手できる CASLⅡ シミュレータがいくつかあります。図3は、<a href="https://www.chiba-fjb.ac.jp/fjb_labo/casl/index.html" rel="noopener" target="_blank">船橋情報ビジネス専門学校が公開している CASLⅡ シミュレータ</a>です。プログラムによって、 CPU とメモリの内部がどのように変化するかを、ビジュアルに確認できます。</p>
<figure><figcaption>図 3　CASLⅡ シミュレータの例</figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/03/casl2_simulator.png" width="781" height="447" loading="lazy"><br />
</figure>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/casl-ii/" class="tag">CASLⅡ</a>
</div>
<h3>表計算の学習方法</h3>
<p>表計算の学習も書籍で行いますが、 <span class="u">Microsoft Excel ではなく、基本情報技術者試験の表計算の書籍を購入することに注意</span>してください。私の知る限りでは、基本情報技術者試験の表計算のシミュレータはないので、ワークシートやマクロを動作させることはできません。</p>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/表計算/" class="tag">表計算</a>
</div>
<p>&nbsp;</p>
<p>どの言語の学習も、書籍を購入して行うことになります。</p>
<p>実際に書店に行って、自分に合った書籍を探してください。書籍を最初から最後までを 1 回学習しただけでは、マスターできなくても当然です。少なくとも、同じ書籍で 3 回は学習してください。そうすれば、きっとマスターできます。</p>
<h2>擬似言語のことを考慮すると C 言語 か 表計算 がおススメかも</h2>
<p>基本情報技術者試験の午後試験には、 C 言語 、 Java 、 Python 、アセンブラ ( CASLⅡ )、表計算の他に、共通に使用される <span class="bold">擬似言語</span> というものがあります。</p>
<p>この擬似言語は、午後の選択必須問題である「データ構造およびアルゴリズム」で使われるので、読み方を覚えなければなりません。このことから、プログラミング言語では、表計算がおススメだといえます。なぜなら、表計算の問題の後半部は、擬似言語で記述されたマクロ（ワークシートを操作するプログラム）の内容を読み取るものだからです。</p>
<p>「擬似言語を覚えなければならないのだから、それを使える表計算を選ぶのが得策だ」というわけです。図 4 にマクロの例を示します。</p>
<figure><figcaption>図 4　表計算のマクロは擬似言語で記述されている（ 平成 23 年度 秋期 午後 問 13 から抜粋）</figcaption><pre>○マクロ: BonusCalc
○整数型: row, DeptPoint
■ <span class="blank">f</span>
| • DeptPoint ← 0
| ■
| | • DeptPoint ← DeptPoint + 1
| | • 相対(L1, row, 0) ← DeptPoint
| ■ <span class="blank">g</span>
| • <span class="blank">h</span>
■</pre>
</figure>
<p><span class="bold">擬似言語の構文は、 C 言語 に似ています。</span> このことから、プログラミング言語では、 C 言語もおススメだといえます。 C 言語をマスターすれば、擬似言語も容易に理解できるからです。</p>
<p>図 5 に擬似言語と C 言語の構文を対応付けた例を示します。</p>
<figure><figcaption>図 5　擬似言語と C 言語 の構文を対応付けた例</figcaption><div class="row">
<div class="col s6">
<figure><figcaption>擬似言語の構文</figcaption><pre>
<code class="language-none">
▲ 条件式
| 　処理 1
+---
| 　処理 2
▼
</code>
</pre>
</figure>
</div>
<div class="col s6">
<figure><figcaption>C 言語の構文</figcaption><pre>
<code class="language-clike">
if 条件式 {
    処理 1;
} else {
    処理 2;
}
</code>
</pre>
</figcaption></div>
</div>
<div class="row">
<div class="col s6">
<pre>
<code class="language-none">
■ 条件式
| 　処理
■
</code>
</pre>
</div>
<div class="col s6">
<pre>
<code class="language-clike">
while (条件式) {
    処理;
}
</code>
</pre>
</div>
</div>
</figure>
<p>「擬似言語の構文で、黒い三角は C 言語の if 文であり、黒い四角は C 言語の while 文だ」とわかれば、すぐに理解できるでしょう。</p>
<p>Java と Python には、オブジェクトを定義するクラスという構文があります。擬似言語では、クラスが使われません。 C 言語でも、クラスが使われません。この点でも、擬似言語と C 言語は、よく似ています。</p>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/擬似言語/" class="tag">擬似言語</a>
</div>
<div class="divider mag_h40"></div>
<p>以上で、私のお話は、おしまいです。基本情報技術者試験のプログラミング言語の選択に悩んでいる方々に、少しでもお役に立ったなら幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/choice_of_programming_languages/">基本情報 プログラミング 言語の選択と学習方法｜午後問題の歩き方</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>矢沢久雄さんが執筆! 午後 プログラミング 問題対策の参考書「速習言語」を刊行しました!!</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/release_sokushu_programming4fe/</link>
		<pubDate>Wed, 20 Nov 2019 08:09:57 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[CASL II]]></category>
		<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=gogo_arukikata&#038;p=2861</guid>
		<description><![CDATA[<p>info 速習言語は試験制度変更により販売を停止しました 基本情報技術者試験 受験ナビでも多くの記事を書いて頂いている 矢沢 久雄 さんにお願いし、基本情報技術者試験 午後のプログラミング問題に特化した参考書、 「速習言 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/release_sokushu_programming4fe/">矢沢久雄さんが執筆! 午後 プログラミング 問題対策の参考書「速習言語」を刊行しました!!</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p class="background c-round blue-grey-text"><i class="material-icons red-text mag_rt10" style="font-size:2.2em">info </i>速習言語は試験制度変更により販売を停止しました</p>
<p>基本情報技術者試験 受験ナビでも多くの記事を書いて頂いている 矢沢 久雄 さんにお願いし、基本情報技術者試験 午後のプログラミング問題に特化した参考書、</p>
<p><span class="bold">「速習言語 Java 」<br />
「速習言語 CASLⅡ 」<br />
「速習言語 表計算」</span></p>
<p>この 3 冊を電子書籍として刊行しました!! <img src="https://s.w.org/images/core/emoji/11/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/11/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/11/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>令和 2 年度 ( 2020 年度) 春期試験より、プログラミング問題は配点が高くなり、避けて通れない問題になりました。</p>
<p>この記事では、このプログラミング問題に特化した「速習言語」の特徴や中身をチラ見せしますので、ぜひぜひ立ち読み感覚でご覧ください!</p>
<h2>プログラミングをマスターするのではなく「プログラムが読める」ようになること</h2>
<p>ご存知の通り、基本情報技術者試験ではソースコードを実際に書いて、合否判定されるわけではありません。</p>
<p>つまり、&#8221;プログラミングができること&#8221; が問われていません。あくまでプログラムの仕様とプログラムを読んで、それを選択肢から選んで解答するものです。</p>
<p>&nbsp;</p>
<p>これは英語の入試などに似ていて、こういった試験では、外国人と会話でコミュニケーションできることが問われるのではなく、あくまで、</p>
<ul>
<li class="mag_h10">英文を読める</li>
<li class="mag_h10">英語を聞いて理解できる</li>
</ul>
<p>この 2 つが主です。</p>
<p>英語で外国人とのコミュニケーションできるようになるには、膨大な時間が必要ですが、ただ、筆記試験に限って言うと、英語でコミュニケーションが取れなくても合格できます。</p>
<p>そして、英語の筆記試験の攻略法は、皆さんがご経験の通り、単語の引き出しを増やす、言語構文を覚える、文章の流れを読むテクニック、こういった特有のコツを身につけることですね。</p>
<p>&nbsp;</p>
<p>刊行した「速習言語」でも同様に、プログラミングをマスターするのではなく、&#8221;出題される&#8221; 言語構文、関数、ライブラリだけを解説し、開発言語ごとに試験のプログラムを読むテクニックを解説しています。</p>
<p>これにより、速習言語を使うと、時間を圧倒的に短縮して学ぶことができます。</p>
<h2>わかりやすさでお馴染みの矢沢 久雄さんが執筆!</h2>
<p>基本情報技術者試験 受験ナビの著者紹介ページにもありますが、この受験ナビの著者でもあり、「プログラムはなぜ動くのか」という書籍を書いた 矢沢 久雄 さんに速習言語を執筆頂きました。<br />
(ちなみに、「プログラムはなぜ～」はIT書では、異例の 10 万部を突破した書籍です)</p>
<p>矢沢さんが書かれる文章のわかりやすさは、受験ナビの読者の皆さまにも、恐らく伝わっているのでは? と思っています。</p>
<p>&nbsp;</p>
<p>また、皆さまのおかげで、矢沢さんが書かれた記事は Google の検索ランキングで、</p>
<div class="card-panel z-depth-0 bold" style="border-radius: 5px;">
<code>基本情報 java</code>　<code>基本情報技術者試験 java</code> などの検索ワードで 1 位 !!<br />
<code>基本情報 casl</code>　<code>基本情報技術者試験 casl2</code> などの検索ワードで 1 位 !!<br />
<code>基本情報 表計算</code>　<code>基本情報技術者試験 表計算</code> などの検索ワードで 1 位 !!
</div>
<p><small class="grey-text" style="text-inline: 2rem">2019 年 8月 ~ 11 月の 3 ヶ月間 の平均順位</small></p>
<p>とご評価いただいています。</p>
<p>「速習言語」では、Web ページの都合上、カットせざるを得なかった言語構文や、関数、ライブラリなどの解説ページを大幅追加しています。ぜひご期待ください。</p>
<p>&nbsp;</p>
<style>code{font-family:monospace;background-color:#eceff1;color:red;padding:.4rem;font-size:.9rem}.indent{padding-left:1em;text-indent:-1em;line-height:200%}</style>
<h2>速習言語 のご紹介</h2>
<p>速習言語は電子書籍のみで、Kindle ストアで販売を開始しています !!</p>
<div class="card hoverable mag_h30">
<div class="row">
<div class="col m4 center hide-on-small-only"><img src="../../wp-content/uploads/2019/11/spreadsheet_cover.jpg"></div>
<div class="col m8">
<div class="card-content black-text">
<span class="card-title">速習言語 表計算 編</span></p>
<div class="chip teal white-text">目次</div>
<p>ステップ1　表計算の基礎知識<br />
ステップ2　セルの参照と複写<br />
ステップ3　関数の種類と機能<br />
ステップ4　マクロによるプログラミング<br />
ステップ5　問題演習<br />
&ensp;</p>
<div class="chip teal small-text white-text">価格</div>
<p>￥<big class="bold">980</big> (税込)　<small class="grey-text">Kindle ストアで販売中</small>　<img src="../../wp-content/uploads/2019/11/iconfinder_Amazon_1298723.png">
</div>
</div>
</div>
</div>
<div class="card hoverable mag_h30">
<div class="row">
<div class="col m4 center hide-on-small-only"><img src="../../wp-content/uploads/2019/11/casl2_cover.jpg"></div>
<div class="col m8">
<div class="card-content black-text">
<span class="card-title">速習言語 CASLⅡ（CASL2）編</span></p>
<div class="chip teal white-text">目次</div>
<p>ステップ1　アセンブラ言語の特徴<br />
ステップ2　命令の種類<br />
ステップ3　覚えておくべきプログラミング技法<br />
ステップ4　問題演習<br />
補足資料　言語リファレンス<br />
&ensp;</p>
<div class="chip teal small-text white-text">価格</div>
<p>￥<big class="bold">980</big> (税込)　<small class="grey-text">Kindle ストアで販売中</small>　<img src="../../wp-content/uploads/2019/11/iconfinder_Amazon_1298723.png">
</div>
</div>
</div>
</div>
<div class="card hoverable mag_h30">
<div class="row">
<div class="col m4 center hide-on-small-only"><img src="../../wp-content/uploads/2019/11/java_cover.jpg"></div>
<div class="col m8">
<div class="card-content black-text">
<span class="card-title">速習言語 Java 編</span></p>
<div class="chip teal white-text">目次</div>
<p>ステップ1　Javaの基本構文<br />
ステップ2　Javaによるオブジェクト指向プログラミング<br />
ステップ3　Javaの基本的なクラスライブラリ<br />
ステップ4　問題演習<br />
補足資料　言語リファレンス<br />
&ensp;</p>
<div class="chip teal small-text white-text">価格</div>
<p>￥<big class="bold">980</big> (税込)　<small class="grey-text">Kindle ストアで販売中</small>　<img src="../../wp-content/uploads/2019/11/iconfinder_Amazon_1298723.png">
</div>
</div>
</div>
</div>
<h2>立ち読みコーナー 「まえがき」全文掲載</h2>
<p>では、最後に速習言語がどのような内容なのか、矢沢さんから許可をいただき、「まえがき」を全文掲載いたします。</p>
<p>お気軽にお立ち読みください !!</p>
<div class="card-panel grey lighten-5 z-depth-0 indigo-text" style="border-radius: 10px">
<h3 class="bold">基本情報技術者の合格を目指す皆さんへ</h3>
<h4 class="bold">本書の目的</h4>
<p>　本書は、基本情報技術者試験の午後問題として必ず出題される「プログラミング問題」の学習書です。</p>
<p>　本書の目的は、プログラミングの基本概念を理解している受験者を対象とし、できる限り短時間で無駄なく特定の言語を学習し、試験問題に解答できる能力を身に付ける手助けをすることです。</p>
<h4 class="bold">試験問題に解答できる能力とは？</h4>
<p>　この試験のプログラミング問題のほとんどは、プログラム内にある空欄を適切なコードで埋めるものとなっています。しかしその設問自体は、コードの候補を示した選択式となっているため、プログラミング言語のスペルを暗記しておく必要はありません。さらに、プログラムの中では高度な命令は使われず、基本的な入出力命令（キー入力、ディスプレイ出力、ファイル入出力）だけが使われますから、すべての命令の使い方を覚える必要もありません。つまり、オリジナルのプログラムの作成能力までは要求されていないのです。では、何が必要なのでしょうか。それは、他人（出題者）が作ったプログラムを読みこなす能力です。</p>
<p>　この能力を身に付けることは、単なる試験対策のためではありません。プログラミングができるとはプログラムを作れることを意味しますが、いきなりゼロから作れる人などはいません。最初は、他人が作ったプログラムを読んでまねることから始めるのです。目的に合わせて既存のプログラムの内容を部分的に改造することを繰り返している内に、自然とオリジナルのプログラムが作れるようになります。したがって、この能力は、本格的なプログラミングの学習においても第一歩となる重要なことなのです。</p>
<h4 class="bold">プログラミングの学習ステップ</h4>
<p>　最初にマスターする言語を決めたら、次に説明するステップに沿って学習を始めましょう。</p>
<div class="indent mag_h20"><span class="bold">第一段階のステップでは、命令とデータの記述方法を学びます。</span><br />
プログラムとは、コンピュータに与える「命令（〜せよ）」および命令の対象となる「データ（…を）」をプログラミング言語の文法に従って記述したものです。プログラミング言語の種類によって、命令やデータを表すキーワード（単語）と、それらを並べる構文（文法）に若干の違いがあります。ただし、どのようなプログラミング言語であっても、その内容は基本的に「…を〜せよ」という命令文を書き並べたものだといえます。</div>
<div class="indent mag_h20"><span class="bold">第二段階のステップでは、プログラムの流れの表現方法を学びます。</span><br />
たった一つの命令文だけでプログラムが完結することなどめったにありません。プログラムの中には、複数の命令文が記述されています。それらが、まずこの命令文、次にこの命令文、次に…と、まるで川のように流れていくのです。その流れには、「順次（まっすぐ流れる）」「分岐（条件に応じて流れが分かれる）」「反復（同じ流れを何度か繰り返す）」の3種類があります。</div>
<div class="indent mag_h20"><span class="bold">第三段階のステップは、複数の小さなプログラムの構成方法を学びます。</span><br />
ある程度大きなプログラム（命令文の総数が多いプログラム）は、小さな部品に分けて作られます。そして、プログラムの入り口となる「主プログラム」と、主プログラムから利用される「副プログラム」とに構成されるのです。</div>
<p>　どのようなプログラミング言語でも、基本的には、上述したような三つのステップで学習して行きます（本書では、さらにプログラミング言語の種類ごとにステップを細かく分けています）。</p>
<div class="indent mag_h20"><span class="bold">最終段階は、学習の総仕上げとして、過去に出題された問題に挑戦です。</span><br />
本書で学習した知識があれば、プログラムの内容は読みこなせるはずです。試験当日は、1問を30分程度で解答できなければなりませんが、学習段階では1〜2時間かけてかまいません。プログラムの先頭から末尾まで完全に理解できるようになるまで、何度でもプログラムを読んでください。多くの問題を中途半端に解くより、一つの問題を丁寧に解いた方が確実に理解が深まります。プログラムを注意深く読む練習が必要なのです。答えを覚えてしまうぐらいになってから、新たな問題に進むとよいでしょう。どんなプログラムでも読みこなせるという自信がもて、試験当日にも冷静に問題に取り組めるはずです。</div>
<h4 class="bold">試験当日まで粘り強く</h4>
<p>　プログラミング言語の学習方法は、外国語の学習方法とよく似ています。教材を1回だけ学習したり、プログラムを1回だけ読んでマスターできるものではないからです。もしも理解が不十分だと思う部分があれば、該当する項目を何度でも復習してください。同じプログラムを何度でも読んでください。言語は、同じことを繰り返し学習して身に付けるものです。</p>
<div class="indent mag_h20"><span class="bold">いつまで繰り返せばよいのでしょう。</span><br />
ゴールは決まっています。情報処理技術者試験の日までです。どうか強い意志を持って取り組んでください。皆さんが合格の栄冠を勝ち取られることを心より願っております。</div>
<p>　それでは、元気に学習を始めましょう！</p>
<p>　2019年10月吉日<br />
　矢沢久雄
</p></div>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/release_sokushu_programming4fe/">矢沢久雄さんが執筆! 午後 プログラミング 問題対策の参考書「速習言語」を刊行しました!!</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>
		<item>
		<title>午後問題の歩き方 ｜ Java プログラミング問題の難易度（1）Java基本構文</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_java_1_of_questions_at_pm/</link>
		<pubDate>Tue, 18 Sep 2018 01:47:13 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">http://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=gogo_arukikata&#038;p=436</guid>
		<description><![CDATA[<p>実務において Java を使いこなすには、言語構文、オブジェクト指向、デザインパターン、Servlet 、JSP 、JDBC 、さらに様々な API やフレームワークなど、習得すべき知識が膨大にあります。 それでは、基本 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_java_1_of_questions_at_pm/">午後問題の歩き方 ｜ Java プログラミング問題の難易度（1）Java基本構文</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>実務において Java を使いこなすには、言語構文、オブジェクト指向、デザインパターン、Servlet 、JSP 、JDBC 、さらに様々な API やフレームワークなど、習得すべき知識が膨大にあります。</p>
<p>それでは、基本情報技術者試験の Java の問題を解くには、どのような知識があればよいのでしょう。</p>
<p>試験の出題範囲の細目を示したシラバスと、実際の問題をいくつか見てみましょう。</p>
<div class="card-panel blue-grey-text small-text z-depth-0 grey lighten-5 mag_h30 c-round">
<i class="material-icons light-blue-text mag_rt05">error</i>本記事ではわかりやすいよう、問題にシンタックスハイライトを入れています</p>
<p class="hide-on-med-and-up blue-grey-text"><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;}.collection{line-height:2.5}.chip{box-shadow:rgba(0,0,0,.05) 0 4px 12px 0}.cyan-background{background:#e0f7fa;line-height:2.5;padding:1em;border-radius:.5em}pre:not(.line-numbers){margin-right:-7.5%!important;margin-left:-7.5%!important;padding-left:7.5%!important;border-radius:unset}pre.line-numbers{margin-right:-7.5%!important;margin-left:-7.5%!important}</style>
<h2>シラバスに示された Java の知識と技術</h2>
<p>シラバスの内容を見ると、Java の問題を解くには <span class="bold">「基本構文」「オブジェクト指向」「 API 」の知識があればよい</span> ことがわかります。</p>
<p>以下は、IPA が試験の <a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_1.pdf#page=17" rel="noopener" target="_blank">シラバス</a> に示した「 Java の知識と技術」です。<span class="chip mag_w05">修得項目</span>に示された言葉の中に、知らないことがないかどうかチェックしてください。</p>
<p>もしも、 <span class="bold">半分以上知らないことがあったなら、Java を選ばない方が無難です。</span>試験当日まで、あまり時間がないのですから。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<p class="title blue-text bold">（1）Java の基本的なプログラム</p>
<p>Java の基本的なプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>クラス、メソッド、main メソッド、標準出力、注釈、javadoc コメント、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（2）数値の計算</p>
<p>四則演算を行うプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>データ型、型変換（キャスト）、変数、配列、四則演算子、式、代入演算子、比較演算子、増分演算子、減分演算子、シフト演算子、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（3）選択型のプログラム</p>
<p>条件式を使って条件分岐するプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>if 文、switch 文、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（4）反復型のプログラム</p>
<p>反復型の制御文を使ったプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>while 文、do 文、for 文、拡張 for 文、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（5）クラスとインスタンス</p>
<p>クラスを定義し、インスタンス化して使用するプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span> インスタンス変数、インスタンスメソッド、アクセス修飾子、参照型変数、隠蔽（いんぺい）、コンストラクタ、オーバロード、this 、クラス変数、クラスメソッド、文字列クラス、パッケージ、完全限定名、super 、単純名、import 宣言、クラス修飾子、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（6）差分プログラミング</p>
<p>既存のクラスの機能を拡張するプログラム、インタフェースを利用して機能を追加するプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>継承、final 、extends 、スーパクラス、サブクラス、Object 、implements 、キャスト、アップキャスト、ダウンキャスト、instanceof 、オーバライド、ダイナミックバインド、クラスライブラリ、抽象クラス、抽象メソッド、基底クラス、派生クラス、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（7）例外処理</p>
<p>例外処理を行うプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>try 文、throw 文、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（8）並列処理</p>
<p>並列処理を行うプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>スレッド、synchronized 修飾子、wait( ) 、notify( ) 、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（9）コレクションと総称</p>
<p>コレクションを使ったプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>add( ) 、remove( ) 、List 、Set 、Map 、Stack 、型引数、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（10）入れ子クラス</p>
<p>入れ子クラスを使ったプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>メンバクラス、メンバインタフェース、局所クラス、匿名クラス、など</div>
</li>
<li class="collection-item">
<p class="title blue-text bold">（11）列挙</p>
<p>列挙型を使ったプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>列挙定数、final 変数、など</div>
</li>
</ul>
<h2>シラバスにある項目は出題される</h2>
<p>こういうことを言うと、シラバスや試験問題の作成者にたいへん失礼かもしれませんが、あえて言わせていただきます。</p>
<p>Java の問題には、Java 固有の知識をふんだんに使ったプログラムが出題されることがあります。</p>
<p>午後問題の問 7 ～ 問 11 は、「ソフトウェア開発」という共通した出題分野の選択問題です。C 言語、Java 、Python 、アセンブラ、表計算のどれを選んでも、ソフトウェア開発がテーマであるべきです。</p>
<p><span class="bold">Java 固有の知識をふんだんに使ったプログラムを出題したら、不公平であり、おかしいでしょう。Java 自体が出題分野ではない</span> のですから。</p>
<p>&nbsp;</p>
<p>文句を言っても仕方ありません。シラバスにあることは、堂々と出題されるのです。</p>
<p>例として、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2015h27_2/2015h27a_fe_pm_qs.pdf#page=53" rel="noopener" target="_blank">平成 27 年度 秋期 午後 問 11「ブロックのデータのキャッシュ管理」</a>のプログラムの一部を見てみましょう。</p>
<p>[プログラム 4]</p>
<p><span class="hide-on-med-and-up small-text blue-grey-text"><i class="material-icons mag_rt05">announcement</i>横にスクロールできます<br />(以下、プログラムなども同じ)</span></p>
<pre class="line-numbers">
<code class="language-java">import java.util.ArrayList;
import java.util.List;

abstract class ListBasedCache extends Cache {
    final List&lt;Entry> entries = new ArrayList&lt;Entry>();

    private static final int CACHE_SIZE = 20;

    byte[] getCachedBlockData(int index) {
        for (Entry entry : entries) {
            if (entry.getIndex() '[ 空欄 c ]' index) {
                hit(entry);
                return entry.getBlockData();
            }
        }
        return null;
    }

    void cacheBlockData(int index, byte[] blockData) {
        if ( '[ 空欄 d ]' ) {
            entries.remove( '[ 空欄 e ]' );
        }
        entries.add(0, new Entry(index, blockData));
    }

    abstract void hit(Entry entry);

    // 入れ子クラス
    private static class Entry {
        private final int index;
        private final byte[] blockData;

        private Entry(int index, byte[] blockData) {
            this.index = index;
            this.blockData = blockData;
        }

        int get Index() { return index; }
        byte[] getBlockData() { return blockData; }
    }

    // 入れ子クラス
    static class Fifo extends '[ 空欄 f ]' {
        void hit (Entry entry) { }
    }

    // 入れ子クラス
    static class Lru extends '[ 空欄 f ]' {
        void hit(Entry entry) {
            entries.remove( '[ 空欄 g ]' );
            entries.add(0, entry);
        }
    }
}</code>
</pre>
<p>このプログラムでは、「入れ子クラス」が使われています。入れ子クラスは、Java 固有の機能であり、簡単に説明すると（以下は適当にお読みください）．．．</p>
<blockquote class="mag_h40">
<p class="blue-grey-text">入れ子クラスとは、クラスやメソッドの中で定義されたクラスのことである。入れ子クラスの private なメンバであっても、入れ子の外側のクラスからアクセスできる。static を指定した入れ子クラスは、外側のクラスのインスタンスがなくても常時存在しているが、外側のクラスのインスタンスメンバにはアクセスできない。static を指定しない入れ子クラスは、外側のクラスのインスタンスがないと存在できないが、外側のクラスのインスタンスメンバにアクセスできる。<br />
．．．（以上）</p>
</blockquote>
<p>という、かなり特殊なものです。入れ子クラスなんて使わなくても、ソフトウェア開発の問題を作れるはずです。</p>
<p>しかし、出題されたのです。シラバスの（ 10 ）に「入れ子クラス」があるからでしょう。</p>
<blockquote class="mag_h30"><p>
<span class="title blue-text"><span class="bold">（ 10 ）入れ子クラス</span></span><br />
入れ子クラスを使ったプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>メンバクラス、メンバインタフェース、局所クラス、匿名クラス、など</div>
</blockquote>
<p>このように、シラバスにある項目は、堂々と出題されるのです。<span class="bold">したがって、もしもシラバスの中に半分以上知らない項目があるなら、Java を選ばない方が無難です。</span></p>
<div class="divider mag_tp40"></div>
<p><span class="badge red white-text c-round" 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" loading="lazy" /><br />
</a>
</div>
<div class="divider mag_tp30 mag_bt40"></div>
<h2>コレクション関連の API がよく出題される</h2>
<p>Java には、膨大な数の API（ Application Programming Interface 、クラスライブラリとも呼ばれる）が用意されています。試験問題の末尾に、「 Java プログラムで使用する API の説明」があるので、事前に API の種類と機能を丸暗記しておく必要はありません。</p>
<p>ただし、よく出題されるコレクション関連の API の使い方には、事前に慣れていた方がよいでしょう。</p>
<p>なぜ、コレクション関連の API がよく出題されるのでしょうか。それは、シラバスの（9）に示されているからです。</p>
<blockquote class="mag_h30"><p>
<span class="blue-text"><span class="bold">（9）コレクションと総称</span></span><br />
コレクションを使ったプログラムを作成する。</p>
<div class="cyan-background"><span class="chip white mag_rt10">修得項目</span>add( ) 、remove( ) 、List 、Set 、Map 、Stack 、型引数、など</div>
</blockquote>
<p>以下は、近年 3 年（ 6 回）の試験で、Java の問題に使われた API の種類です。</p>
<p>赤色で示した <span class="red-text"> java.util.List&lt;E&gt;, java.util.ArrayList&lt;E&gt;, java.util.Map&lt;K, V&gt;, java.util.HashMap&lt;K, V&gt;, java.util.Stack&lt;E&gt;</span> が、コレクション関連の API です。</p>
<p><span class="bold">もしも、これらの使い方を知らないなら、Java を選ばない方が無難です。</span>見ての通り、とってもよく出題されているからです。</p>
<table class="striped mag_h30 block">
<thead>
<tr>
<th>試験の年度</th>
<th>Java の問題で使われた API の種類</th>
</tr>
</thead>
<tbody>
<tr>
<td>平成27年度秋期</td>
<td>java.util.List&lt;E&gt;<br />
<span class="red-text"> java.util.ArrayList&lt;E&gt;</span><br />
java.lang.System</td>
</tr>
<tr>
<td>平成28年度春期</td>
<td><span class="red-text">java.util.List&lt;E&gt;</span><br />
<span class="red-text"> java.util.ArrayList&lt;E&gt;</span><br />
java.lang.String<br />
java.util.UUID</td>
</tr>
<tr>
<td>平成28年度秋期</td>
<td><span class="red-text">java.util.Map&lt;K, V&gt;</span><br />
<span class="red-text"> java.util.HashMap&lt;K, V&gt;</span><br />
<span class="red-text"> java.util.Stack&lt;E&gt;</span></td>
</tr>
<tr>
<td>平成29年度春期</td>
<td>（なし）</td>
</tr>
<tr>
<td>平成29年度秋期</td>
<td>java.lang.String<br />
java.lang.Integer<br />
java.util.Arrays<br />
java.util.Comparator&lt;T&gt;<br />
<span class="red-text"> java.util.Map&lt;K, V&gt;</span><br />
<span class="red-text"> java.util.HashMap&lt;K, V&gt;</span></td>
</tr>
<tr>
<td>平成30年度春期</td>
<td>（なし）</td>
</tr>
</tbody>
</table>
<p>平成 29 年度 春期 と平成 30 年度 春期の Java の問題では、API が使われていません。</p>
<p>これは、アルゴリズムやオブジェクト指向がテーマだからです。こういう問題は、実にいいですね。</p>
<p><span class="bold">これなら、「 Java 」の問題ではなく、「ソフトウェア開発」の問題です。</span></p>
<h2>シラバスを超えた知識が出題される場合もある</h2>
<p>シラバスに示されているとはいえ、Java 固有の知識をふんだんに使ったプログラムが出題されるのは、困ったことです。</p>
<p><span class="bold">さらに、困ったことに、シラバスを拡大解釈したような構文や API に関する設問が出題されることもあります。</span></p>
<p>おそらく出題者は「このシラバスのレベルなら、このぐらいのことを出題しても大丈夫だろう」と思ったのでしょう。例として、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_2/2014h26a_fe_pm_qs.pdf#page=60" rel="noopener" target="_blank">平成 26 年度 秋期 午後 問 11「可変オブジェクトとその問題点」</a> の設問 1 の一部を見てみましょう。プログラムの空欄 d と空欄 e の解答群に注目してください。</p>
<p>[プログラム 2 ] より抜粋</p>
<pre>
<code class="language-java">public static void main(String[] args) {
    testException(null, new Date(0L), '[ 空欄 d ]' );
    testException(new Date(0L), null, '[ 空欄 d ]' );
    testException(new Date(-1L), new Date(0L), '[ 空欄 e ]' );
    testException(new Date(0L), new Date(-1L), '[ 空欄 e ]' );</code>
</pre>
<p>d, e に関する解答群</p>
<pre>
<code class="language-java">ア IllegalArgumentException
イ IllegalArgumentException.class
ウ IllegalArgumentException.getClass() 
エ new IllegalArgumentException()
オ new NullPointerException() 
カ NullPointerException
キ NullPointerException.class
ク NullPointerException.getClass()</code></pre>
<p>選択肢に示された「 class 」や「 getClass() 」の機能をご存知でしょうか。</p>
<p>Java には、クラスを取得するために、以下に示した 3 つの方法があります。3 つ目の方法は、データベースをアクセスするプログラムを作るときに使ったことがあるかもしれませんが、他の 2 つの方法は、知らない人が多いでしょう。かなり特殊なものだからです。</p>
<ol class="background c-round">
<li>クラス名.class で取得する<br />
<code class="language-java">Class&lt;?&gt; c = String.class</code><br />
※ class を「 class リテラル」と呼ぶ。</li>
<li>オブジェクト名.getClass() で取得する<br />
<code class="language-java">String s;<br />
Class&lt;?&gt; c = s.getClass();</code></li>
<li>Class.forName( &#8220;クラス名&#8221; ) で取得する<br />
<code class="language-java">Class&lt;?&gt; c = Class.forName( "java.lang.String" );</code></li>
</ol>
<p>正解は、空欄 d がキで、空欄 e がイです。どちらも、class リテラルが使われています。 <span class="bold">class リテラルは、シラバスに示されていません。それでも、出題されました。</span></p>
<p>このように、シラバスを超えた知識が出題される場合もあるのです。</p>
<p>なお、選択肢のウとキで使われている getClass() は、java.lang.Object クラスのメソッドですが、試験問題の末尾に API の説明がありませんでした。「正解の選択肢じゃないから説明いらないよね！」ということなのでしょう（たぶん）。</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p>C 言語にオブジェクト指向のための構文が追加されて C++ が作られ、C++ をベースとして Java が作られました。したがって、C 言語と Java の構文は、よく似ています。</p>
<p>そのため「 C 言語と Java のどちらかを選択する予定だ」という人もいることでしょう。</p>
<p>この記事が、選択の判断材料になったなら幸いです。試験当日の問題次第ですが、 <span class="bold">生半可に Java ができるというレベルでは、Java を選ばない方が無難かもしれませんね。</span></p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p>
<p><span class="bold"><i class="material-icons indigo-text mag_rt05">label</i>次はこちら</span></p>
<p><a href="../guide_java_2_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 m3 pad_00"><img src="../../wp-content/uploads/2018/09/Java_cover_2-640x360.jpg" loading="lazy" /></div>
<div class="col m9 black-text bold pad_15">Java プログラミング問題の楽勝パターン（2）オブジェクト指向</div>
</div>
</div>
<p></a></p>
<p>&nbsp;</p>
<p><span class="bold"><i class="material-icons indigo-text mag_rt05">label</i>注目の Python の難易度を知る</span></p>
<p><a href="../how_about_python/"></p>
<div class="card hoverable mag_h30 c-round">
<div class="row valign-wrapper direction-column-on-small">
<div class="col m3 pad_00"><img src="../../wp-content/uploads/2019/01/python_cover-640x480.png" loading="lazy" /></div>
<div class="col m9 black-text bold pad_15">「基本情報 の Python ってどんな感じ？」を解説</div>
</div>
</div>
<p></a></p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_java_1_of_questions_at_pm/">午後問題の歩き方 ｜ Java プログラミング問題の難易度（1）Java基本構文</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
