<?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/gogo_arukikata/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Wed, 20 May 2026 00:42:42 +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>基本情報 プログラミング 言語の選択と学習方法｜午後問題の歩き方</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>基本情報のサンプル問題で Python の基礎知識をチェック &#124; 午後問題の歩き方</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/checkout_basic_python_with_sampleprob/</link>
		<pubDate>Fri, 10 Jan 2020 03:37:33 +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=gogo_arukikata&#038;p=3453</guid>
		<description><![CDATA[<p>令和 2 年度 春期 基本情報技術者の午後試験で、プログラミング言語に Python を選択しようと思っている人は、「自分の持っている知識で大丈夫だろうか？」と心配しているでしょう。 現時点で、基本情報技術者試験の Py [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/checkout_basic_python_with_sampleprob/">基本情報のサンプル問題で Python の基礎知識をチェック | 午後問題の歩き方</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>令和 2 年度 春期 基本情報技術者の午後試験で、プログラミング言語に Python を選択しようと思っている人は、「自分の持っている知識で大丈夫だろうか？」と心配しているでしょう。</p>
<p>現時点で、基本情報技術者試験の Python に関する情報は、<a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_0.pdf" rel="noopener" target="_blank">シラバス</a>と<a href="https://www.jitec.ipa.go.jp/1_13download/fe_python_sample.pdf" rel="noopener" target="_blank">サンプル問題</a>しかありません。</p>
<p><a href="../how_about_python/">前回の記事</a>では、シラバスで Python の知識を確認しました。今回は、サンプル問題のプログラムで Python の知識を確認してみましょう。</p>
<div class="card-panel blue-grey-text z-depth-0 grey lighten-5 mag_h30">
<i class="material-icons blue-text">error</i> <span style="font-size: small">本記事ではわかりやすいよう、問題にシンタックスハイライトを入れ、問題の一部を省略するなどしています</span>
</div>
<style>article pre.line-numbers,article pre:not(.line-numbers){margin-right:-7.5%!important;margin-left:-7.5%!important}article,pre{font-family:consolas,'Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important}article pre:not(.line-numbers){padding-left:7.5%!important}dl{margin:2em 0}dt{margin:2em 1em 1em 0;font-weight:700;border-bottom:.3em solid #2196f3}.r-width{width:60%;margin:auto}@media only screen and (max-width:600px){dd{margin-left:1em}.r-width{width:100%}article pre.line-numbers{padding-left:unset}}</style>
<h2>サンプル問題の内容</h2>
<p>プログラムを見る前に、サンプル問題の内容を簡単に説明しておきます。</p>
<p><code class="language-py"> "R3;R4;F100;T90;E0;F100;E0" </code> という形式の命令列を解釈して、x &#8211; y 平面に図形の描画を行うプログラムです。</p>
<p>個々の命令は、1 文字の英字で示された命令コードと、数値で示された数値パラメタから構成され、セミコロン（ <code class="language-py"> ; </code> ）が命令の区切りを示します。</p>
<p>命令コードと数値パラメタの説明を以下に示します。</p>
<div class="card-panel mag_h30">
<table class="striped inline-block">
<caption class="blue-grey-text">図　命令コードと数値パラメタの説明</caption>
<thead>
<tr>
<th>命令コード</th>
<th>数値パラメタ</th>
<th class="block">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code class="language-py"> F </code></td>
<td>長さ</td>
<td>マーカを現在の進行方向に数値パラメタで指定した長さだけ進め、移動元から移動先までの線分を描く。</td>
</tr>
<tr>
<td><code class="language-py"> T </code></td>
<td>角度</td>
<td>マーカの進行方向を、数値パラメータが正の場合は反時計回りに、負の場合は時計回りに、数値パラメタの角度（度数法）だけ回転する。</td>
</tr>
<tr>
<td><code class="language-py"> R </code></td>
<td>繰返し回数</td>
<td>繰返し区間の開始を示す。この命令と対になる命令コード E との間を、命令コード R の数値パラメタの回数だけ繰り返す。</td>
</tr>
<tr>
<td><code class="language-py"> E </code></td>
<td>0</td>
<td>繰返し区間の終了を示す。数値パラメタは、常に 0 である。</td>
</tr>
</tbody>
</table>
</div>
<p><code class="language-py"> "R3;R4;F100;T90;E0;F100;E0" </code> という命令列は、<code class="language-py"> "R3" </code> 、<code class="language-py"> "R4" </code>、<code class="language-py"> "F100" </code> 、<code class="language-py"> "T90" </code> 、<code class="language-py"> "E0" </code> 、<code class="language-py"> "F100"</code> 、<code class="language-py"> "E0" </code> という 7 個の命令から構成されていて、それぞれ</p>
<ol class="background c-round" style="padding-left: 3em!important;">
<li>「 3 回の繰返しの開始」</li>
<li>「 4 回の繰返しの開始」</li>
<li>「長さ 100 の線分を描く」</li>
<li>「反時計回りに 90 度回転する」</li>
<li>「 4 回の繰返しの終了」</li>
<li>「長さ 100 の線分を描く」</li>
<li>「 3 回の繰返しの終了」</li>
</ol>
<p>を意味しています。</p>
<p>マーカは、初期状態で ( 0, 0 ) の位置にあり、進行方向はx 軸の正方向になっています。したがって、この命令列を解釈することで、以下の 3 つの四角形描画されます。</p>
<figure class="mag_h30 blue-grey-text center materialboxed"><figcaption class="grey-text mag_h10">図　命令列の解釈によって描画された図形の例</figcaption><img class="r-width mag_h20 hoverable" src="../../wp-content/uploads/2020/01/result_figure1.png" data-caption="図　命令列の解釈によって描画された図形の例" loading="lazy"><br />
</figure>
<h2>プログラムの全体構造と実行方法</h2>
<p>それでは、プログラムを見てみましょう。</p>
<p>Python では、プログラムの構成要素を、関数またはクラスという形式にします。</p>
<p>関数やクラスは、あらかじめ用意されているものを利用する場合と、自分で作る場合があります。</p>
<p>標準で用意されている関数やクラスは、すぐに使えますが、そうでないものは、プログラムの先頭で import 文を使って、「この関数やクラスを使います」ということを示してから使わねばなりません。</p>
<p>&nbsp;</p>
<p>以下に、プログラムの全体構造を示します。</p>
<figure class="center mag_h30"><figcaption class="blue-grey-text">図　プログラムの全体構造</figcaption><figcaption class="hide-on-med-and-up small-text blue-grey-text"><i class="material-icons mag_rt05">announcement</i>横にスクロールできます<br />(以下、すべてのプログラムも同様)</figcaption><pre><code class="language-py">import math # mathを使う
import matplotlib.pyplot as plt	# matplotlib.pyplotをpltという別名で使う

# 自分でparse関数を作る
def parse(s):
&#xFE19;

# 自分でMarkerクラスを作る
class Marker:
&#xFE19;

# 自分でdraw関数を作る
def draw(s):
&#xFE19;</code></pre>
</figure>
<p>先頭にある import で、数学関連の関数を提供する math と、描画の機能を提供する matplotlib.pyplot を使うことを示しています。</p>
<p>matplotlib.pyplot は、名前が長いので、as plt で plt という別名をつけています。これによって、matplotlib.pyplot を plt という名前で使えるようになります。</p>
<p>自分で作っている構成要素は、parase 関数、Marker クラス、および draw 関数です。それぞれの内容は、あとで説明します。</p>
<p>&nbsp;</p>
<p>このプログラムには、プログラムの実行開始位置となるものがありません。</p>
<p>それでは、どうやって実行するのかというと、端末（ Windows ではコマンドプロンプト）で Python のインタプリタを起動し、任意の引数を指定して draw 関数を実行するのです。</p>
<p>draw 関数の引数に、描画の命令列を指定します。</p>
<p>以下は、プログラムを fesample.py というファイル名で保存し、Python インタプリタを起動して、fesample を import し（ import するときには、ファイル名の拡張子の .py を指定しません）、<code class="language-py"> "R3;R4;F100;T90;E0;F100;E0" </code> という引数を指定して draw 関数を実行した例です。</p>
<figure class="center mag_h30"><figcaption class="blue-grey-text">図　Python インタプリタで draw 関数を実行した例</figcaption><pre><code class="language-bash">>>> import fesample import draw
>>> draw("R3;R4;F100;T90;E0;F100;E0") 
[] 
[{'opno': 0, 'rest': 3}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}] 
[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}] 
[{'opno': 0, 'rest': 3}]</code></pre>
</figure>
<p>これによって、先ほど示した 3 つの四角形描画されます。端末に表示されているのは、デバッグ用の情報です。</p>
<div class="card-panel grey lighten-5 blue-grey-text z-depth-0 mag_h30" style="border-radius: 5px">
<i class="material-icons light-blue-text">info</i> 編集部 補足<br />
Python をブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」でも試せます
</div>
<h2>parse 関数の内容</h2>
<p>以下は、parse 関数の内容です。ここでは、説明の都合で、行番号を付けてあります。</p>
<p>このプログラムで使われている言語構文から、Python の基礎知識を確認してみましょう。</p>
<figure class="mag_h30 center"><figcaption class="blue-grey-text"図　parse 関数の内容</figcaption><pre class="line-numbers"><code class="language-python">def parse(s):
  return [(x[0], int(x[1:])) for x in s.split(';')]</code></pre>
</figure>
<dl>
<dt>確認 1　関数の定義と戻り値　1 行目、2 行目</dt>
<dd>関数は、 <code class="language-py"> def 関数名(引数): </code> というブロックで定義し、 <code class="language-py">return 戻り値 </code> で戻り値を返します。</dd>
<dt>確認 2　str クラスの split メソッド</dt>
<dd>str クラスの <code class="language-py">split("区切り文字") </code> メソッドは、文字列を区切り文字で分割したリストを返します。<br />
たとえば、 <code class="language-py">"R3;R4;F100;T90;E0;F100;E0" </code> という文字列を  <code class="language-py">　;　</code> という区切り文字で分割すると、<code class="language-py"> ['R3', 'R4', 'F100', 'T90', 'E0', 'F100', 'E0'] </code> というリストが得られます。</dd>
<dt>確認 3　for 文</dt>
<dd>繰返しを表す for 文は、 <code class="language-py">for 変数 in イテラブル </code> という構文で、イテラブル（ range 関数、リスト、タプル、文字列など）から繰返し要素を取り出して変数に格納します。<br />
たとえば、イテラブルに <code class="language-py"> ['R3', 'R4', 'F100', 'T90', 'E0', 'F100', 'E0'] </code> というリストを指定すれば、リストの要素を順番に取り出して変数に格納します。</dd>
<dt>確認 4　リスト内包表記　2 行目</dt>
<dd>リスト内包表記は、リストの要素を効率的に（短いプログラムで）作成する表記です。<br />
<code class="language-py"> [式 for 変数 in イテラブル] </code> という構文で、for 文で変数に取り出されたすべての要素に、同じ式を適用し、その適用結果をリストの要素とします。<br />
たとえば、</p>
<pre style="margin: 0!important"><code class="language-py"> [(x[0], int(x[1:])) for x in ['R3', 'R4', 'F100', 'T90', 'E0', 'F100', 'E0']] </code></pre>
<p>というリスト内包表記では、 </p>
<pre style="margin: 0!important"><code class="language-py"> [('R', 3), ('R', 4), ('F', 100), ('T', 90), ('E', 0), ('F', 100), ('E', 0)] </code></pre>
<p>というリストが作成されます。</dd>
<dt>確認 5　リストとタプル</dt>
<dd>リストは、<code class="language-py"> [要素1, 要素2, ・・・, 要素n] </code> のように、要素を <code class="language-py"> [ ] </code> で囲みます。<br />
タプルは、<code class="language-py"> (要素1, 要素2, ・・・, 要素n) </code> のように、要素を <code class="language-py"> ( ) </code> で囲みます。<br />
<span class="u">リストの要素は、値を変更できますが、タプルの要素は、値を変更できません。</span><br />
タプルを要素としたリストを作ることもできます。たとえば、</p>
<pre style="margin: 0!important"><code class="language-py">[('R', 3), ('R', 4), ('F', 100), ('T', 90), ('E', 0), ('F', 100), ('E', 0)] </code></pre>
<p> は、 (文字列, 整数) というタプルを要素としたリストです。</dd>
<dt>確認 6　文字列から 1 文字を取り出す　2 行目</dt>
<dd><code class="language-py"> 文字列[位置] </code> という構文で、文字列から 1 文字を取り出せます。位置は、先頭を 0 として指定します。<br />
たとえば、<code class="language-py"> x = " F100" </code> という文字列において、<code class="language-py"> x[0] </code> は、先頭の &#8220;F&#8221; を取り出します。</dd>
<dt>確認 7　文字列から部分文字列を切り出す　2 行目</dt>
<dd><code class="language-py"> 文字列[開始位置:終了位置:ステップ] </code> という構文で、文字列の開始位置から終了位置 &#8211; 1 までステップごとに、部分文字列字を切り出せます（この機能を<strong>「スライス」</strong>と呼びます）。<br />
終了位置を省略すると、末尾まで切り出します。ステップを省略すると、1 文字ずつ切り出します。たとえば、<code class="language-py"> x = "F100" </code> という文字列 x において、 <code class="language-py"> x[1:] </code> は、1 文字目から末尾まで 1 文字ずつ切り出すという意味なので、 &#8220;100&#8221; という部分文字列が切り出されます。</dd>
<dt>確認 8　int 関数</dt>
<dd>int 関数は、引数で指定されたオブジェクトを整数に変換します。たとえば、<code class="language-py"> int("100") </code> は、<code class="language-py"> "100" </code> という文字列を、 <code class="language-py"> 100 </code> という整数に変換します。</dd>
</dl>
<h2>Marker クラスの内容</h2>
<p>以下は、Markerクラスの内容です。ここでも、説明の都合で、行番号を付けてあります。</p>
<p>このプログラムで使われている言語構文から、Python の基礎知識を確認してみましょう。</p>
<figure class="mag_h30 center"><figcaption class="blue-grey-text">図　Marker クラスの内容</figcaption><pre class="line-numbers">
<code class="language-py">class Marker:
    def __init__(self):
        self.x, self.y, self.angle = 0, 0, 0
        plt.xlim(-320, 320)  # x軸の表示範囲を設定
        plt.ylim(-240, 240)  # y軸の表示範囲を設定

    def forward(self, val):
        # 度数法で表した角度を，ラジアンで表した角度に変換
        rad = math.radians(self.angle)
        dx = val * math.cos(rad)
        dy = val * math.sin(rad)
        x1, y1, x2, y2 = self.x, self.y, self.x + dx, self.y + dy
        # (x1, y1)と(x2, y2)を結ぶ線分を描画
        plt.plot([x1, x2], [y1, y2], color='black', linewidth=2)
        self.x, self.y = x2, y2

    def turn(self, val):
        self.angle = (self.angle + val) % 360

    def show(self):
        plt.show()  # 描画結果を表示</code></pre>
</figure>
<dl class="mag_h30">
<dt>確認 9 クラスの定義　1 行目</dt>
<dd>クラスは、 <code class="language-py"> class クラス名: </code> というブロックで定義します。</dd>
<dt>確認 10 メソッドの定義と self の役割　3 行目、7 行目、17 行目、20 行目</dt>
<dd>メソッドは、クラスのブロックの中で、 <code class="language-py">def メソッド名(引数):</code> というブロックで定義します。<br />
メソッド（インスタンスメソッド）の第一引数には、現在のインスタンスの参照を格納する引数を置きます。この引数は、慣例として self という名前にします。</dd>
<dt>確認 11 インスタンスの生成と __init__ 関数 の役割　2 行目</dt>
<dd>クラスのインスタンスは、 <code class="language-py"> インスタンス名 = クラス名(引数) </code> という構文で生成します。<br />
インスタンスの生成時に、インスタンスが持つ __init__ 関数が自動的に呼び出されるので、そこで初期化処理を行うことができます。<code class="language-py"> self.インスタンス変数名 = 値</code> という処理を行えば、インスタンス変数に初期値を設定できます。</dd>
<dt>確認 12 タプルのアンパック　3 行目、12 行目、15 行目</dt>
<dd>たとえば、<code class="language-py"> (1, 2, 3) </code> という 3 つの要素を持つタプルがあった場合、<code class="language-py"> x, y, x = (1, 2, 3) </code> という代入で、右辺のタプルの 3 つの要素を、左辺の 3 つの変数に順番に代入でき、これを <strong>タプルのアンパック</strong> と呼びます。<br />
タプルを囲む<code class="language-py"> ( ) </code> は、省略できるので、同じことを <code class="language-py"> x, y, x = 1, 2, 3 </code> と記述することもできます。</dd>
<dt>確認 13 matplotlib.pyplot の使い方　4 行目、5 行目、14 行目、21 行目</dt>
<dd>matplotlib.pyplot は、描画を行う様々なメソッドを提供しています。<br />
ここでは、matplotlib.pyplot に plt という別名を付けているので、 <code class="language-py">plt.メソッド名(引数)</code>という構文で、メソッドを使えます。<br />
たとえば、直線を描画する場合は、はじめに、<code class="language-py"> plt.xlim(下限値, 上限値) </code> と <code class="language-py"> plt.ylim(下限値, 上限値) </code> で、x &#8211; y 平面の x 軸と y 軸の表示範囲をします。<br />
次に、</p>
<pre style="margin: 0!important"><code class="language-py"> plt.plot([x1, x2], [y1, y2], color="色", linewidth=幅) </code></pre>
<p> で、 ( x1, y1 ) と ( x2, y2 ) を結ぶ直線を、color に指定された色と、linewidth に指定された幅で、描画します。<br />
ただし、この時点では、まだ画面には表示されません。必要な描画がすべて終わったら、最後に <code class="language-py"> plt.show() </code> で描画の内容を画面に表示します。</dd>
<dt>確認 14 math の使い方　9 行目、10行目、11 行目</dt>
<dd>math は、数学関連の様々な関数を提供しています。<br />
ここでは、mathに別名を付けていないので、<code class="language-py"> math.関数名(引数) </code>という構文で、関数を使います。<br />
radians 関数は、引数で指定された度数法の角度をラジアン単位に変換します。<br />
cos 関数は、引数で指定されたラジアン単位の角度のコサイン値を求めます。<br />
sin 関数は、引数で指定されたラジアン単位の角度のサイン値を求めます。</dd>
</dl>
<h2>draw 関数の内容</h2>
<p>以下は、draw 関数の内容です。ここでも、説明の都合で、行番号を付けてあります。</p>
<p>このプログラムで使われている言語構文から、Python の知識を確認してみましょう（先ほど「 parase 関数の内容」説明した構文は、取り上げません）。</p>
<figure class="mag_h30 center"><figcaption class="blue-grey-text">図　draw 関数の内容</figcaption><pre class="line-numbers">
<code class="language-py">def draw(s):
    insts = parse(s)
    marker = Marker()
    stack = []
    opno = 0
    while opno < len(insts):
        print(stack)
        code, val = insts[opno]
        if code == 'F':
            marker.forward(val)
        elif code == 'T':
            marker.turn(val)
        elif code == 'R':
            stack.append({'opno': opno, 'rest': val})
        elif code == 'E':
            if stack[-1]['rest'] > 1:
                opno = stack[-1]['opno']
                stack[-1]['rest'] -= 1
            else:
                stack.pop()  # stackの末尾の要素を削除
        opno += 1
    marker.show()</code></pre>
</figure>
<dl>
<dt>確認 15　空のリストの作成　4 行目</dt>
<dd><code class="language-py"> 変数 = [] </code> という構文で、空のリストを作成できます。</dd>
<dt>確認 16　リストへの要素の追加と削除　14行目、20 行目</dt>
<dd>append(要素) メソッドで、リストの末尾に要素を追加できます。pop() メソッドで、リストの末尾の要素を取り出して削除できます。</dd>
<dt>確認 17　while 文</dt>
<dd><code class="language-py"> while 条件: </code> というブロックは、繰返しを表します。ブロックの中にある処理は、条件が True である限り実行されます。</dd>
<dt>確認 18　if 文</dt>
<dd><code class="language-py"> if 条件: </code> というブロックは、条件が True のときに実行されます。</p>
<p>このブロックの後に <code class="language-py">elif 条件: </code> というブロックを任意の数だけ続けることができ、その前にある条件が False であり、そこにある条件が True のときに実行されます。<br />
最後に <code class="language-py"> else: </code> というブロックを 1 つだけ追加することができ、その前にある条件がすべて False のときに実行されます。</dd>
<dt>確認 19　print 関数　7 行目</dt>
<dd>matplotlib.pyplot による図形の描画は、GUI のウインドウの中で行われますが、print(データ) 関数によるデータの表示は、端末の中で行われます。7 行目の <code class="language-py">print(stack) </code> は、デバッグ用の情報を端末に表示しています。</dd>
<dt>確認 20　== 演算子　9 行目、11 行目、13 行目、15 行目</dt>
<dd>== 演算子は、値が等しいときに True を返します。</dd>
<dt>確認 21　辞書　14 行目</dt>
<dd><code class="language-py"> {キー1:値1, キー2:値2, ・・・, キーn:値n} </code> という構文で、辞書を作成できます。</p>
<p>辞書は、キーと値のペアを要素として、添字ではなく、キーを指定することで、要素を取得できます。</dd>
<dt>確認 22　辞書のリスト　16 行目、17 行目、18 行目</dt>
<dd>リストは、任意のオブジェクトを要素にできるので、タプルを要素としたリストや、辞書を要素としたリストを作ることができます。</p>
<p>このプログラムの stack というリストは、辞書のリストです。 <code class="language-py"> stack[リストの添字][辞書のキー] </code> という指定で、リストにおいて添字で指定した位置にある辞書から、辞書のキーで指定した値（辞書のキーとペアの値）を取り出せます。</dd>
<dt>確認 23　リストのマイナスの添字　16 行目、17 行目、18 行目</dt>
<dd>リストの添字をマイナスにすると、末尾から要素を指定できます。末尾は、 &#8211; 1 で表します。<br />
16 行目、17 行目、18 行目で、リストの添字を <code class="language-py"> -1 </code> にしているのは、末尾から取り出すことで、スタックを実現しているからです。</dd>
</dl>
<div class="divider mag_h50"></div>
<p>いかがでしたか。ここで示したサンプル問題のプログラムの内容が「余裕でわかるぜ！」なら心配ありませんが、「わからないことだらけだ！」なら Python の言語構文の学習が必要です。</p>
<p>試験まで、あせらずにコツコツと学習を続けてください。<strong>プログラミング言語の習得には、時間がかかりますので、「あせらず」「コツコツ」が重要です。</strong></p>
<p>&nbsp;</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/checkout_basic_python_with_sampleprob/">基本情報のサンプル問題で Python の基礎知識をチェック | 午後問題の歩き方</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 ってどんな感じ？」を解説｜午後問題の歩き方</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/how_about_python/</link>
		<pubDate>Fri, 13 Dec 2019 06:56:52 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[2019見直し]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=gogo_arukikata&#038;p=3262</guid>
		<description><![CDATA[<p>令和 2 年度の基本情報技術者試験から、午後試験で選択できるプログラミング言語として、新たに Python が採用されます。 「少し勉強したことがあるので Python で受けてみよう！」と思っている人が多いようですが、 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/how_about_python/">「基本情報 の Python ってどんな感じ？」を解説｜午後問題の歩き方</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>令和 2 年度の基本情報技術者試験から、午後試験で選択できるプログラミング言語として、新たに Python が採用されます。</p>
<p>「少し勉強したことがあるので Python で受けてみよう！」と思っている人が多いようですが、「自分の持っている知識で大丈夫だろうか？」と心配している人も多いようです。</p>
<p>&nbsp;</p>
<p>そこで、この記事では、<a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_0.pdf" rel="noopener" target="_blank">基本情報技術者試験のシラバス Ver.7.0</a> に示された「 Python の知識と技術」の中から、「組込み関数」と「イテラブル（シーケンスとコレクション）」にテーマを絞って、それぞれのポイントを解説します。</p>
<p>皆さんの知識の確認をしてください。</p>
<div class="card-panel grey lighten-5 blue-grey-text z-depth-0 mag_h30 c-round small-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> 」で、文中のコードをお試しください
</div>
<div class="card-panel grey lighten-5 z-depth-0 blue-grey-text hide-on-med-and-up c-round mag_h40 small-text">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際、プログラムは横スクロールすると全文をご覧になれます
</div>
<style>pre{margin:1.5em -7.5%!important;padding:1em 7.5%!important}dt{margin:1rem}article>p>code{padding-left:.5em!important}</style>
<h2>組込み関数のポイント</h2>
<h3>覚えておくべき組込み関数の種類</h3>
<p>「組込み関数」とは、import 文でインポートしなくても、すぐに使える関数のことです。シラバスに示された組込み関数を以下に示します。</p>
<p>「これは何だろう？」というものがないかどうか確認してください。これらは、シラバスに示されているのですから、試験問題のプログラムの中で堂々と使われるはずです。</p>
<p>機能をしっかりと覚えておきましょう。</p>
<div class="card mag_h30 z-depth-0 grey lighten-5 c-round">
<div class="card-content indigo-text" style="font-family: Consolas, 'Courier New';">
<span class="card-title">シラバスに示された組込み関数</span></p>
<p>int, float, str, list, range, enumerate, zip, len, print, input, open
</p></div>
</div>
<p>シラバスに示された組込み関数は、以下のように</p>
<p>「データ型を変換する関数」<br />
「イテラブルを操作する関数」<br />
「入出力を行う関数」</p>
<p>にグループ分けできます（イテラブルに関しては、記事の後半で説明します）。</p>
<p>これ以降では、グループごとに組込み関数の機能を説明します。</p>
<div class="card mag_h30 z-depth-0 grey lighten-5 c-round">
<div class="card-content indigo-text" style="font-family: Consolas, 'Courier New';">
<span class="card-title">組込み関数のグループ分け</span></p>
<dl>
<dt>データ型を変換する関数</dt>
<dd>int, float, str, list</dd>
<dt>イテラブルを操作する関数</dt>
<dd>len, range, enumerate, zip</dd>
<dt>入出力を行う関数</dt>
<dd>input, print, open</dd>
</dl>
</div>
</div>
<h3>データ型を変換する関数（int、float、str、list）</h3>
<p>int 関数、float 関数、str 関数、list 関数は、引数で与えられたオブジェクトを、整数、浮動小数点数、文字列、リストに変換して返します。以下に使用例を示します。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> データ型を変換する関数の使用例</div>
<pre>
<code class="language-python">>>> i = int("123")  # "123"という文字列を整数に変換する
>>> type(i)  # 変換後のデータ型を確認する
&lt;class 'int'>  # int型（整数型）である</code>
</pre>
<pre>
<code class="language-python">>>> f = float("4.56")  # "4.56" という文字列を浮動小数点数に変換する
>>> type(f)  # 変換後のデータ型を確認する
&lt;class 'float'>  # float 型（浮動小数点数型）である</code>
</pre>
<pre>
<code class="language-python">>>> s = str(789)  # 789 という整数を文字列に変換する
>>> type(s)  # 変換後のデータ型を確認する
&lt;class 'str'>  # str 型（文字列型）である</code>
</pre>
<pre>
<code class="language-python">>>> l = list("abc")  # "abc"という文字列をリストに変換する
>>> type(l)  # 変換後のデータ型を確認する
&lt;class 'list'>  # list 型（リスト型）である
>>> l  # 変換後のオブジェクトの内容を表示する
['a', 'b', 'c']  # 文字を要素としたリストである</code>
</pre>
<h3>イテラブルを操作する関数（len、range、enumerate、zip）</h3>
<p>len 関数は、 <code class="language-python">len(イテラブル) </code> という構文で使い、イテラブルの要素数を返します。以下に使用例を示します。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> len 関数の使用例</div>
<pre>
<code class="language-python">>>> len("hello")  # "hello"という文字列の要素数を得る
5  # 5 文字である
>>> len([1, 2, 3])  # [1, 2, 3] というリストの要素数を得る
3  # 3 個である</code>
</pre>
<p>&nbsp;</p>
<p>range 関数は、<code class="language-python"> range(開始, 終了, ステップ) </code> という構文で使い、開始 ～ 終了 &#8211; 1 までの連続した数値を持つ range オブジェクトを返します。</p>
<p>数値の間隔をステップで指定することもできます。以下に使用例を示します。<br />
<span class="grey-text">（ range オブジェクトは、そのままでは要素を表示できなので、リストに変換して表示しています）</span></p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> range 関数の使用例</div>
<pre>
<code class="language-python">>>> list(range(5))  # 終了だけを指定する
[0, 1, 2, 3, 4]  # 0 ～ 終了 - 1 の数値が返される

>>> list(range(2, 5))  # 開始と終了を指定する
[2, 3, 4]  # 開始 ～ 終了 - 1 の数値が返される

>>> list(range(0, 10, 2))  # 開始、終了、ステップを指定する
[0, 2, 4, 6, 8]	  # 開始　～ 終了 - 1 の数値がステップおきに返される</code>
</pre>
<p>&nbsp;</p>
<p>enumerate 関数は、 <code class="language-python">enumerate(イテラブル, カウンタの初期値) </code>という構文で使い、カウンタの値とイテラブルの要素から構成された enumerate オブジェクトを返します。</p>
<p>カウンタの初期値を省略すると、0 が指定されたとみなされます。以下に使用例を示します。<br />
<span class="grey-text">（ enumerate オブジェクトは、そのままでは要素を表示できないので、リストに変換して表示しています）</span></p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> enumerate 関数の使用例</div>
<pre>
<code class="language-python">>>> list(enumerate("abc"))  # カウンタの初期値を省略した場合
[(0, 'a'), (1, 'b'), (2, 'c')]  # カウンタの値が 0 から始まる

>>> list(enumerate("abc", 1))  # カウンタの初期値に 1 を設定した場合
[(1, 'a'), (2, 'b'), (3, 'c')]  # カウンタの値が 1 から始まる</code>
</pre>
<p>&nbsp;</p>
<p>zip 関数は、<code class="language-python"> zip(イテラブル1, イテラブル2, ・・・) </code> という構文で使い、複数のイテラブルの要素をまとめた zip オブジェクトを返します。以下に使用例を示します。<br />
<span class="grey-text">（ zip オブジェクトは、そのままでは要素を表示できないので、リストに変換して表示しています）</span></p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> zip 関数の使用例</div>
<pre>
<code class="language-python">>>> list(zip([1, 2, 3], [4, 5, 6]))  # 2 つのリストの要素をまとめる
[(1, 4), (2, 5), (3, 6)]  # 対応する要素がまとめられている</code>
</pre>
<h3>入出力を行う関数（ input、print、open ）</h3>
<p>input 関数は、キー入力された文字列を返します。</p>
<p>print 関数は、引数の値を画面に表示します。</p>
<p>open 関数は、 <code class="language-python">open(ファイル名, モード, エンコーディング) </code> という構文で使い、ファイルを読み書きするためのファイルオブジェクトを返します。　モードとエンコーディングを省略すると、テキストファイルの読み出しを、実行環境のエンコーディングで行うファイルオブジェクトになります。</p>
<p>&nbsp;</p>
<p>以下は、テキストファイルの内容を画面に表示するプログラム（ readtext.py ）と実行結果の例です。</p>
<p>ここでは、あらかじめ &#8220;apple&#8221;、&#8221;orange&#8221;、&#8221;banana&#8221; という文字列を格納した fruits.txt というテキストファイルを用意してあります。</p>
<div class="chip mag_tp20" style="height: auto;"><i class="material-icons light-blue-text">code</i> テキストファイルの内容を画面に表示するプログラム</div>
<pre>
<code class="language-python">filename = input("ファイル名-->")  # ファイル名をキー入力する
fobj = open(filename)  # ファイルオブジェクトを生成する
for data in fobj:  # ファイルから 1 行ずつ読み出す
    print(data, end="")  # 1 行ずつ画面に表示する
fobj.close()  # ファイルを閉じる</code>
</pre>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> プログラムの実行結果の例</div>
<pre class="language-none"  style="border-radius: 5px">
(base) C:\PythonSamples>python readtext.py  # 実行モードで実行する
ファイル名-->fruits.txt  # ファイル名を入力する
apple  # ファイルの内容が表示される
orange
banana
</pre>
<h2>イテラブルのポイント</h2>
<h3>覚えておくべきイテラブルの種類</h3>
<p>「イテラブル」とは、複数の要素を持つオブジェクトのことです。シラバスに示されたイテラブルを以下に示します。</p>
<p>「これは何だろう？」というものがないかどうか確認してください。これらは、シラバスに示されているのですから、組込み関数と同様に、試験問題のプログラムの中で堂々と使われるはずです。</p>
<p>機能をしっかりと覚えておきましょう。</p>
<ul class="background c-round">
<p class="post-title indigo-text">シラバスに示されたイテラブル</p>
<li>リスト</li>
<li>タプル</li>
<li>文字列</li>
<li>辞書</li>
<li>集合</li>
</ul>
<p>シラバスに示されたイテラブルは、以下のように「シーケンス」と「コレクション」、および「ミュータブル」と「イミュータブル」に分類できます。</p>
<p>シーケンスには、順序があり添字で要素を指定できますが、コレクションには、順序がありません。</p>
<p>ミュータブルは、要素の値を変更できますが、イミュータブルは、値を変更できません。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> イテラブルの分類</div>
<table class="bordered centered mag_h30">
<thead>
<tr class="grey lighten-4">
<th>順序の有無 ＼ 変更の可否</th>
<th>ミュータブル<br />（変更可）</th>
<th>イミュータブル<br />（変更不可）</th>
</tr>
</thead>
<tbody>
<tr>
<th class="center grey lighten-4">シーケンス<br />（順序あり）</th>
<td>リスト</td>
<td>タプル<br />文字列</td>
</tr>
<tr>
<th class="center grey lighten-4">コレクション<br />（順序なし）</th>
<td>辞書<br />集合</td>
<td></td>
</tr>
</tbody>
</table>
<p>これらの分類を見て、それぞれのオブジェクトの大きな特徴をつかんでください。これ以降では、シーケンスとコレクションに分けてイテラブルの機能を説明します。</p>
<h3>シーケンス（リスト、タプル、文字列）</h3>
<p>カンマで区切られたオブジェクトを <code class="language-python">[ ] </code> で囲むとリストとみなされ、<code class="language-python"> ( ) </code> で囲むとタプルとみなされます。</p>
<p><code class="language-python"> " " </code> または <code class="language-python">' ' </code> で囲まれた文字の並びは、文字列であるとみなされます。</p>
<p>これらのシーケンスには、以下に示した共通の操作ができます。「スライス」とは、シーケンスを部分的に切り出したものです。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> シーケンスに共通した操作</div>
<p>※seq は シーケンス ( sequence ) を意味します</p>
<table class="bordered mag_h30">
<thead>
<tr>
<th>操作</th>
<th>機能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code class="language-python">x in seq</code></td>
<td>seq の中に x があれば True を返す</td>
</tr>
<tr>
<td><code class="language-python">x not in seq</code></td>
<td>seq の中に x がなければ True を返す</td>
</tr>
<tr>
<td><code class="language-python">seq1 + seq2</code></td>
<td>seq1 と seq2 を結合する</td>
</tr>
<tr>
<td><code class="language-python">seq * n</code></td>
<td>seq を n 回繰り返し結合する</td>
</tr>
<tr>
<td><code class="language-python">seq[i]</code></td>
<td>seq の 0 から数えて i 番目の要素を返す</td>
</tr>
<tr>
<td><code class="language-python">seq[i:j]</code></td>
<td>seq の i から j &#8211; 1 までのスライスを返す</td>
</tr>
<tr>
<td><code class="language-python">seq[i:j:k]</code></td>
<td>seq の i から j &#8211; 1 までの k ごとのスライスを返す</td>
</tr>
<tr>
<td><code class="language-python">seq.index(x)</code></td>
<td>seq の中で x が最初に出現する添字を返す</td>
</tr>
<tr>
<td><code class="language-python">seq.count(x)</code></td>
<td>seq の中にある x の個数を返す</td>
</tr>
</tbody>
</table>
<p>以下は、リストに対して様々な操作を行った例です。同様の操作が、タプルと文字列でも行えます。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> リストに対して様々な操作を行った例</div>
<pre>
<code class="language-python">>>> seq = [1, 2, 3, 4, 5]  # リスト seq を作成する
>>> 3 in seq  # seq の中に 3 があれば True を返す
True  # 3 があるので True</code>
</pre?

<pre>
<code class="language-python">>>> seq = [1, 2, 3, 4, 5]  # リスト seq を作成する
>>> 6 not in seq  # seq の中に 6 がなければ True を返す
True  # 6 がないので True</code>
</pre>
<pre>
<code class="language-python">>>> seq1 = [1, 2, 3]  # リスト seq1 を作成する
>>> seq2 = [4, 5]  # リスト seq2 を作成する
>>> seq1 + seq2  # seq1 と seq2 を結合する
[1, 2, 3, 4, 5]  # 要素が結合されている</code>
</pre>
<pre>
<code class="language-python">>>> seq = [1, 2]  # リスト seq を作成する
>>> seq * 3  # seq を 3 回繰り返し結合する
[1, 2, 1, 2, 1, 2]  # 要素が 3 回繰り返し結合されている</code>
</pre>
<pre>
<code class="language-python">>>> seq = [1, 2, 3, 4, 5]  # リスト seq を作成する
>>> seq[3]  # seq の 0 から数えて 3 番目の要素を返す
4  # 3 番目の 4 が得られる</code>
</pre>
<pre>
<code class="language-python">>>> seq = [1, 2, 3, 4, 5]  # リスト seq を作成する
>>> seq[0:3]  # seq の 0 から 3 - 1 までのスライスを返す
[1, 2, 3]  # seq[0] から seq[2] までのスライスが得られる</code>
</pre>
<pre>
<code class="language-python">>>> seq = [1, 2, 3, 4, 5]  # リスト seq を作成する
>>> seq[0:5:2]  # seq の 0 から 5 - 1 までの 2 ごとのスライスを返す
[1, 3, 5]  # seq[0] から seq[4] までの 2 ごとのスライスが得られる</code>
</pre>
<pre>
<code class="language-python">>>> seq = [1, 2, 3, 4, 5]  # リスト seq を作成する
>>> seq.index(3)  # seq の中で 3 が最初に出現する添字を返す
2  # 添字 2 で 3 が最初に出現する</code>
</pre>
<pre>
<code class="language-python">>>> seq = [3, 3, 3, 3, 3]  # リスト seq を作成する
>>> seq.count(3)  # seq の中にある 3 の個数を返す
5  # 3 は 5 個ある</code>
</pre>
<h3>コレクション（辞書、集合）</h3>
<p>複数の「　<code class="language-python"> キー:バリュー </code> 」を要素として、それらをカンマで区切って並べて <code class="language-python">{ </code> と <code class="language-python">} </code> で囲むと、辞書であるとみなされます。辞書は、添字ではなく、キーで要素を指定します。</p>
<p>以下は、辞書の要素をキーで読み出す例です。果物の名前をキー、価格をバリューにしています。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> 辞書の要素をキーで読み出す例</div>
<pre>
<code class="language-python">>>> fruits = {"apple":100, "orange":80, "banana":200}  # 辞書fruitsを作る
>>> fruits ["apple"]  # キーを指定して要素を読み出す
100  # バリューが得られる</code>
</pre>
<p>カンマで区切られたオブジェクトを <code class="language-python">{ } </code> で囲むと集合であるとみなされます。要素が「 <code class="language-python">キー:バリュー</code> 」という形式ではないので、辞書と区別できます。</p>
<p>集合には、同じ値の要素を複数入れることができません。もしも、同じ値の要素を入れようとすると、無視されます。</p>
<p>集合は、他の集合と、積（ &#038;演算子 ）、和（ +演算子 ）、差（ -演算子 ）、対称差（ ^演算子 ）の集合演算ができます。以下は、集合演算の例です。</p>
<div class="chip mag_tp20"><i class="material-icons light-blue-text">code</i> 集合演算の例</div>
<pre>
<code class="language-python">>>> fruits = {"apple", "orange", "banana"}  # 果物の集合 fruits を作る
>>> reds = {"apple", "rose"}  # 赤い物の集合 reds を作る

>>> fruits & reds  # fruits と reds の積を求める
{'apple'}  # 両方に含まれる要素が得られる

>>> fruits | reds  # fruits と reds の和を求める
{'apple', 'orange', 'rose', 'banana'}  # いずれかに含まれる要素が得られる

>>> fruits - reds  # fruits と reds の差を求める
{'orange', 'banana'}  # fruits から reds の要素が取り除かれる

>>> fruits ^ reds  # fruits と reds の対称差を求める
{'orange', 'rose', 'banana'}  # どちらか一方だけに含まれる要素が得られる</code>
</pre>
<div class="divider mag_h50"></div>
<p>いかがでしたか。この記事の内容が「余裕でわかるぜ！」なら心配ありませんが、「わからないことだらけだ！」なら、Python の言語構文の猛勉強が必要です。</p>
<p>過去の試験を振り返ってみると、新しい言語が採用されたときの第 1 回目の問題は、とてもやさしい内容になっていました。</p>
<p>Pythonの第 1 回目の問題も、きっと同様のはずです。ねらい目です。</p>
<p><strong>ただし、きちんと言語構文を理解していないと問題を解けませんよ！</strong></p>
<p>&nbsp;</p>
<p><span class="blue-grey-text"><i class="material-icons mag_rt05">fast_forward</i>続きはこちら</span></p>
<p><a href="../checkout_basic_python_with_sampleprob/"></p>
<div class="card hoverable z-depth-5 c-round">
<div class="row valign-wrapper direction-column-on-small">
<div class="col s12 m3"><img src="../../wp-content/uploads/2019/01/python_cover.png" alt="Python image" /></div>
<div class="col s12 m9 pad_20 black-text bold">基本情報のサンプル問題で Python の基礎知識をチェック | 午後問題の歩き方</div>
</div>
</div>
<p></a></p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/how_about_python/">「基本情報 の Python ってどんな感じ？」を解説｜午後問題の歩き方</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>こうすりゃ解ける！ 2019年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019autumn/</link>
		<pubDate>Fri, 08 Nov 2019 04:33:48 +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=gogo_arukikata&#038;p=2714</guid>
		<description><![CDATA[<p>2019 年 10 月 20 日（日）に実施された 令和元年度 秋期 基本情報技術者試験 の 午後問題 の中から、必須問題である問 8「データ構造及びアルゴリズム」の解き方を解説します。 テーマは「 Bitap 法による [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019autumn/">こうすりゃ解ける！ 2019年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2019 年 10 月 20 日（日）に実施された <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_qs.pdf#page=38" rel="noopener" target="_blank">令和元年度 秋期 基本情報技術者試験 の 午後問題 の中から、必須問題である問 8「データ構造及びアルゴリズム」</a>の解き方を解説します。</p>
<p>テーマは「 Bitap 法による文字列検索」です。</p>
<p>ありきたりの解説には、飽き飽きしているでしょうから、「こうすりゃ解ける！」という解法のテクニックと心構えを伝授させていただきます。</p>
<div class="card-panel blue-grey-text z-depth-0 grey lighten-5 mag_h30">
<i class="material-icons blue-text">error</i> <span class="small-text">本記事ではわかりやすいよう、問題に背景色や下線などを入れています</span>
</div>
<h2>一見して超難しそうな問題の対処方法を伝授します</h2>
<p>今回の試験を受験された方は、この問題を見て「何これ！ Bitap 法なんて知らない！ 超難しそう！」と思われたでしょう。</p>
<p>基本情報技術者試験のアルゴリズムの問題には、時々こういう超難しそうな問題が出ることがあります。これまでにも「ガウスの消去法」「ニュートン法」「ダイクストラ法」など、超難しそうな問題が出たことがあります。</p>
<p>&nbsp;</p>
<p><strong>でも、ご安心ください。一見して超難しそうな問題ほど、設問の内容は簡単なのです。</strong></p>
<p>なぜなら、アルゴリズムの問題は、受験者全員が解く必須問題だからです。</p>
<p>もしも、設問も超難しかったら、合格率が極端に下がってしまいます。試験を運営する側としては、そんなことはできないはずです。</p>
<p>&nbsp;</p>
<p>それでは、この手の問題は、どうやって解いたらよいのでしょうか？</p>
<p>この記事では、その秘訣を伝授させていただきます。</p>
<p>それでは、設問 1 から解いて行きましょう。問題、設問、解答群を以下に示します。</p>
<style>article,pre{font-family:consolas,'Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important}dl{margin-top:3em;line-height:2}dl.inline dd{margin-left:2em}pre{font-size:1em;background:#424242;color:#fafafa;margin:1.5em -7.5%!important;padding:1.5em 7.5%!important}.card-panel pre{margin:2em -24px!important;padding-left:24px!important}table.forth-col-left tbody tr td:nth-child(4){text-align:left}.r-width{width:50%;margin:auto}@media only screen and (max-width:600px){.r-width{width:100%}}</style>
<div class="card-panel mag_h30" style="line-height: 150%">
問 8　次のプログラムの説明及びプログラムを読んで，設問 1 ~ 3 に答えよ。</p>
<p>〔プログラムの説明〕</p>
<p>　関数 BitapMatch は，Bitap 法を使って文字列検索を行うプログラムである。<br />
　Bitap 法は，検索対象の文字列(以下，対象文字列という)と検索文字列の照合に，個別の文字ごとに定義されるビット列を用いるという特徴をもつ。</p>
<p>　なお，本問では，例えば 2 進数の 16 ビット論理型の定数 0000000000010101 は，上位の 0 を省略して &#8220;10101&#8221;B と表記する。</p>
<dl class="inline">
<dt>(1)</dt>
<dd>　関数 BitapMatch は，対象文字列を Text[] に，検索文字列を Pat[] に格納して呼び出す。配列の要素番号は 1 から始まり， Text[] の i 番目の文字は Text[i] と表記する。Pat[] についても同様に i 番目の文字は Pat[i] と表記する。対象文字列と検索文字列は，英大文字で構成され，いずれも最長 16 文字とする。<br />
　対象文字列 Text[] が &#8220;AACBBAACABABAB&#8221;，検索文字列 Pat[] が &#8220;ACABAB&#8221; の場合の格納例を，図 1 に示す。</dd>
</dl>
<div class="center mag_h30 small-text blue-grey-text">
図 1　対象文字列と検索文字列の格納例<br />
<img class="hoverable materialboxed mag_h15" data-caption="図 1　対象文字列と検索文字列の格納例" src="../../wp-content/uploads/2019/11/q8_r1a_pm_figure1.png" style="margin: auto;">
</div>
<dl class="inline">
<dt>(2)</dt>
<dd>　関数 BitapMatch は，関数 GenerateBitMask を呼び出す。<br />
　関数 GenerateBitMask は，文字 &#8220;A&#8221; ~ &#8220;Z&#8221; の文字ごとに，検索文字列に応じた ビット列(以下，ビットマスクという)を生成し，要素数 26 の 16 ビット論理型配列 Mask[] に格納する。Mask[1] には文字 &#8220;A&#8221; に対するビットマスクを， Mask[2] には文字 &#8220;B&#8221; に対するビットマスクを格納する。このように Mask[1] ~ Mask[26] に文字 &#8220;A&#8221; ~ &#8220;Z&#8221; に対応するビットマスクを格納する。</p>
<p>　関数 GenerateBitMask は， Mask[] の全ての要素を &#8220;0&#8221;B に初期化した後，1 以上で Pat[] の文字数以下の全ての i に対して，Pat[i] の文字に対応する Mask[] の要素である Mask[Index(Pat[i])] に格納されている値の，下位から数えて i 番目のビットの値を 1 にする。</p>
<p>　関数 Index は，引数にアルファベット順で n 番目の英大文字を設定して呼び出すと，整数 n (1 ≦ n ≦ 26 ) を返す。</dd>
</dl>
<dl class="inline">
<dt>(3)</dt>
<dd>　図 1 で示した， Pat[] が &#8220;ACABAB&#8221; の例の場合，関数 GenerateBitMask を実行すると， Mask[] は図 2 のとおりになる。</dd>
</dl>
<div class="center mag_h30 small-text blue-grey-text">
図 2　図 1 で示した Pat[] に対する Mask[] の値<br />
<img class="mag_tp30 hoverable materialboxed mag_h15" data-caption="図 1 で示した Pat[] に対する Mask[] の値" src="../../wp-content/uploads/2019/11/q8_r1a_pm_figure2.png" style="margin: auto;">
</div>
<dl class="inline">
<dt>(4)</dt>
<dd>　関数 GenerateBitMask の引数と返却値の仕様は，表 1 のとおりである。</dd>
</dl>
<table class="striped inline-block mag_h30 centered forth-col-left">
<caption class="mag_h20 blue-grey-text">表 1　関数 GenerateBitMask の引数と返却値の仕様</caption>
<thead>
<tr>
<th>引数/<br class="hide-on-med-and-up">返却値</th>
<th>データ型</th>
<th>入力/<br class="hide-on-med-and-up">出力</th>
<th class="block">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pat[]</td>
<td>文字型</td>
<td>入力</td>
<td class="block">検索文字列が格納されている 1 次元配列 16 ビット</td>
</tr>
<tr>
<td>Mask[]</td>
<td>16 ビット<br class="hide-on-med-and-up">論理型</td>
<td>出力</td>
<td class="block">文字 &#8220;A&#8221; ～ &#8220;Z&#8221; に対応するビットマスクが格納される 1 次元配列</td>
</tr>
<tr>
<td>返却値</td>
<td>整数型</td>
<td>出力</td>
<td class="block">検索文字列の文字数</td>
</tr>
</tbody>
</table>
<p>〔プログラム 1 〕</p>
<pre>
○整数型関数 : GenerateBitMask(文字型: Pat[], 16 ビット論理型: Mask[])
○整数型 : i, PatLen

・ PatLen ← Pat[] の文字数
■ i: 1, i ≦ 26, 1
|　・Mask[i] ← <span class="bold" style="border: 2px solid">　　b　　</span>  /* 初期化 */
■
■ i: 1, i ≦ PatLen, 1
|　・Mask[Index(Pat[i])] ← <span class="bold" style="border: 2px solid">　　c　　</span> と
|                   Mask[Index(Pat[i])] とのビットごとの論理和
■
· return (PatLen)
</pre>
<p>設問 1 プログラムの説明及びプログラム 1 中の <span class="bold" style="border: 2px solid">　　　　</span> に入れる正しい答えを，解答群の中から選べ。</p>
<p>a に関する解答群<br />
ア　0000000000000101　　<br class="hide-on-med-and-up">イ　0000000000101000<br />
ウ　0001010000000000　　<br class="hide-on-med-and-up">エ　1010000000000000</p>
<p>b に関する解答群</p>
<pre>
ア　 "0"B
イ　 "1"B
ウ　 "1"B を Pathen ビットだけ論理左シフトした値
エ　 "1"B を (Pathen - 1) ビットだけ論理左シフトした値
オ　 "1111111111111111"B
</pre>
<p>c に関する解答群</p>
<pre>
ア　 "1"B を (i - 1) ビットだけ論理左シフトした値
イ　 "1"B を i ビットだけ論理左シフトした値
ウ　 "1"B を (Pathen - 1) ビットだけ論理左シフトした値
エ　 "1"B を PatLen ビットだけ論理左シフトした値
オ　 "1"B
</pre>
</div>
<h2>秘訣 1：<br />説明文とプログラムを対応付ける</h2>
<p>プログラム全体の仕組みがわからなくても、プログラムの説明文とプログラムを対応付けると、空欄に何を入れればよいかがわかる場合があります。</p>
<p>この問題では、空欄 b が正にそれです。</p>
<p>プログラムの説明に「 Mask[] のすべての要素を &#8220;0&#8221;B に初期化」とあり、それがプログラムの空欄 b に該当します。</p>
<div class="card-panel mag_h30"">
〔プログラムの説明〕</p>
<p>　関数 GenerateBitMask は， <span class="u">Mask[] の全ての要素を &#8220;0&#8221;B に初期化</span>した後，1 以上で Pat[] の文字数以下の全ての i に対して，(中略)
</div>
<p>ご丁寧に、というか<strong>大ヒント</strong>として、「/* 初期化 */」というコメントまで付けられています。</p>
<p>〔プログラム 1 〕</p>
<pre>
■ i: 1, i ≦ 26, 1
|　<span style="border: solid 2px #f44336; padding: .5em;">・Mask[i] ← <span class="bold" style="border: 2px solid">　　b　　</span>  /* 初期化 */</span>
■
</pre>
<p>空欄 b の正解は、選択肢アです。</p>
<h2>秘訣 2：<br />問題に示された具体例をヒントにして考える</h2>
<p>今度は、プログラムの空欄 c に何が入るかを、説明文と対応付けて考えてみましょう。</p>
<div class="card-panel mag_h30">
〔プログラムの説明〕</p>
<p>　関数 GenerateBitMask は， Mask[] の全ての要素を &#8220;0&#8221;B に初期化した後，1 以上で Pat[] の文字数以下の全ての i に対して，<span class="u">Pat[i] の文字に対応する Mask[] の要素である Mask[Index(Pat[i])] に格納されている値の，下位から数えて i 番目のビットの値を 1 にする。</span>
</div>
<p>この説明文を見る限り、空欄 c に入るのは「下位から数えて i 番目のビット を 1 にした値」であり、</p>
<p>i が 1 なら 0000000000000001<br />
i が 2 なら 0000000000000010<br />
i が 3 なら 0000000000000100<br />
&#xFE19;</p>
<p>のはずです。0000000000000001 を i &#8211; 1 だけ左論理シフトすればよいでしょう。</p>
<p>ところが、プログラムを見ると「空欄 c と Mask[Index(Pat[i])] とのビットごとの論理和」になっています。なぜでしょう？</p>
<p>〔プログラム 1 〕</p>
<pre>

■ i: 1, i ≦ PatLen, 1
|　・Mask[Index(Pat[i])] ← <span class="bold" style="border: 2px solid">　　c　　</span> と
|                   Mask[Index(Pat[i])] とのビットごとの論理和
■
</pre>
<p>こういうときに頼りになるのが、問題に示された具体例です。</p>
<p>具体例を見ると「そういうことか！」とわかる場合があります。コメントも大ヒントですが、<strong>具体例も大ヒント</strong>なのです。</p>
<p>以下の具体例を見ると、&#8221;ACABAB&#8221; の先頭（先ほどのプログラムで i = 1 ）の &#8220;A&#8221; に対応するビットマスクが、<br />
0000000000000001 ではなく、<br />
0000000000010101 になっています。</p>
<div class="card-panel mag_h30"">
〔問題に示された具体例〕</p>
<dl class="inline">
<dt>(3)</dt>
<dd>　図 1 で示した， Pat[] が &#8220;ACABAB&#8221; の例の場合，関数 GenerateBitMask を実行すると， Mask[] は図 2 のとおりになる。</dd>
</dl>
<div class="center mag_h30 small-text blue-grey-text">
図 2　図 1 で示した Pat[] に対する Mask[] の値<br />
<img class="mag_tp30 hoverable materialboxed mag_h15" data-caption="図 1 で示した Pat[] に対する Mask[] の値" src="../../wp-content/uploads/2019/11/q8_r1a_pm_figure2.png" style="margin: auto;">
</div>
</div>
<p>「 えっ、何これ？」<br />
「 1 が 1 個でなくて 3 個ある．．．」<br />
「 ．．．あっ、そういうことか！」<br />
「 &#8220;ACABAB&#8221; の中に &#8220;A&#8221; が 3 個あるから、それを論理和で重ね合わせているんだ！」</p>
<p>とわかるでしょう。</p>
<p>つまり空欄 c は、0000000000000001 を i &#8211; 1 だけ論理左シフトするだけでなく、それまでに得られているビットマスクと論理和で重ね合わせるのです。</p>
<p>したがって、正解は選択肢アです。</p>
<h2>秘訣 3：<br />すぐに解けない設問は後回しにする</h2>
<p>空欄 a を飛ばして、空欄 b と空欄 c を先に解きました。これは、空欄 a の穴埋めは、先に空欄 b と空欄 c を解かないとできないからです。</p>
<p>このように、<strong>もしも順番通りに解いてできない設問があった場合は後回し</strong>にして、先の設問を解いてみましょう。それによって、後回しにした設問が解ける場合があるからです。</p>
<p>&nbsp;</p>
<p>空欄 b と空欄 c を解いたことで、ビットマスクを作る方法がわかりました。</p>
<p>空欄 a には、 &#8220;B&#8221; に対応するビットマスクが入ります。</p>
<p>問題に示された &#8220;ACABAB&#8221; では、先頭から 4 番目と 6 番目に &#8220;B&#8221; が登場します。したがって、</p>
<p>0000000000001000 と<br />
0000000000100000 を論理和で重ね合わせた<br />
0000000000101000 が &#8220;B&#8221; に対応するビットマスクです。</p>
<p>正解は、選択肢イです。</p>
<p><a href="../../tag/マスク/" class="tag mag_tp30">マスク</a></p>
<h2>秘訣 4：<br />具体例をコツコツとトレースすればできる</h2>
<p>それでは、設問 2 に進みましょう。問題、設問、解答群を以下に示します。</p>
<div class="card-panel mag_h30"">
〔関数 BitapMatch の説明〕</p>
<dl class="inline">
<dt>(1)</dt>
<dd>　Text[] と Pat[] を受け取り， Text[] の要素番号の小さい方から Pat[] と一致する文字列を検索し，見つかった場合は，一致した文字列の先頭の文字に対応する Text[] の要素の要素番号を返し，見つからなかった場合は，-1 を返す。 </dd>
<dt>(2)</dt>
<dd>　図 1 の例では， Text[7] ~ Text[12] の文字列が Pat[] と一致するので，7 を返す。</dd>
<dt>(3)</dt>
<dd>　関数 BitapMatch の引数と返却値の仕様は，表 2 のとおりである。</dd>
</dl>
<table class="striped inline-block mag_h30 centered forth-col-left">
<caption>表 2　関数 BitapMatch の引数と返却値の仕様</caption>
<thead>
<tr>
<th>引数/返却値</th>
<th>データ型</th>
<th>入力/出力</th>
<th width="45%">説明</th>
</tr>
<tbody>
<tr>
<td>Text[]</td>
<td>文字型</td>
<td>入力</td>
<td>対象文字列が格納されている 1 次元配列</td>
</tr>
<tr>
<td>Pat[]</td>
<td>文字型</td>
<td>入力</td>
<td>検索文字列が格納されている 1 次元配列</td>
</tr>
<tr>
<td>返却値</td>
<td>整数型</td>
<td>出力</td>
<td>対象文字列中に検索文字列が見つかった場合は，一致した文字列の先頭の文字に対応する対象文字列の要素の要素番号を，検索文字列が見つからなかった場合は， -1 を返す。</td>
</tr>
</tbody>
</table>
<p>〔プログラム 2 〕</p>
<pre>
○整数型関数: BitapMatch(文字型: Text[], 文字型: Pat[])
○16 ビット論理型: Goal, Status, Mask[26]
○整数型: i, TextLen, PatLen
・TextLen ← Text[] の文字数
・PatLen ← GenerateBitMask(Pat[], Mask[])
・Status ← "0"B
・Goal ← "1"B を (PatLen - 1) ビットだけ論理左シフトした値
■ i: 1, i ≦ TextLen, 1
|　・Status ← Status を 1 ビットだけ論理左シフト値と              <i class="material-icons">fast_rewind</i>α
|                                         "1"B とのビットごとの論理和
|　・Status ← Status と Mask[Index(Text[i])] とのビットごとの論理積　<i class="material-icons">fast_rewind</i>β
|　▲ Status と Goal とのビットごとの論理積 ≠ "0"B
|　|　・return (i - PatLen + 1)
|　▼
■
· return (-1)
</pre>
<p>設問 2　次の記述中の <span class="bold" style="border: 2px solid">　　　　</span> に入れる正しい答えを，解答群の中から選べ。</p>
<p>　図 1 で示したとおりに， Text[] と Pat[] に値を格納し，関数 BitapMatch を実行した。プログラム 2 の行 β を実行した直後の変数 i と配列要素 Mask[Index(Text[i])]と変数 Status の値の遷移は，表 3 のとおりである。</p>
<p>　例えば，i が 1 のときに行 β を実行した直後の Status の値は &#8220;1&#8221;B であることから， i が 2 のときに行 α を実行した直後の Status の値は，&#8221;1&#8243;B を 1 ビッ トだけ論理左シフトした &#8220;10&#8221; B と &#8220;1&#8221;B とのビットごとの論理和を取った &#8220;11&#8221;B となる。次に， i が 2 のときに行 β を実行した直後の Status の値は， Mask[Index(Text[2])] の値が &#8220;10101&#8221;B であることを考慮すると， <span class="bold" style="border: 2px solid">　　d　　</span> となる。</p>
<p>　同様に， i が 8 のときに行 β を実行した直後の Status の値が &#8220;10&#8221;B であるということに留意すると， i が 9 のときに行 α を実行した直後の行 β で参照する Mask[Index(Text[9])] の値は <span class="bold" style="border: 2px solid">　　e　　</span> であるので，行 β を実行した直後の Status の値は <span class="bold" style="border: 2px solid">　　f　　</span> となる。</p>
<p class="small-text blue-grey-text mag_h30" style="width: 90%: margin: auto;">表 3　図 1 の格納例に対してプログラム 2 の行 β を実行した直後の配列要素 Mask[Index(Text[i])] と変数 Status の値の遷移</p>
<p><span class="small-text grey-text hide-on-med-and-up"><i class="material-icons mag_rt05">info</i>右にスクロールします</span></p>
<table class="bordered centered responsive-table mag_bt30">
<thead>
<tr>
<th>i</th>
<th>1</th>
<th>2</th>
<th>･･･</th>
<th>8</th>
<th>9</th>
<th>･･･</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mask[Index(Text[i])]</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;10101&#8221;B</td>
<td>･･･</td>
<td>&#8220;10&#8221;B</td>
<td><span class="bold" style="border: 2px solid">　　e　　</span></td>
<td>･･･</td>
</tr>
<tr>
<td>Status</td>
<td>&#8220;1&#8221;B</td>
<td><span class="bold" style="border: 2px solid">　　d　　</span></td>
<td>･･･</td>
<td>&#8220;10&#8221;B</td>
<td><span class="bold" style="border: 2px solid">　　f　　</span></td>
<td>･･･</td>
</tr>
</tbody>
</table>
<p>d ～ f に関する解答群</p>
<p>ア　&#8221;0&#8243;B　　<br class="hide-on-med-and-up">イ　&#8221;1&#8243;B　　<br class="hide-on-med-and-up">ウ　&#8221;10&#8243;B　　<br class="hide-on-med-and-up">エ　&#8221;11&#8243;B<br />
オ　&#8221;100&#8243;B　<br class="hide-on-med-and-up">カ　&#8221;101&#8243;B　　<br class="hide-on-med-and-up">キ　&#8221;10101&#8243;B
</div>
<p>設問 2 の内容は、問題に示された具体例のデータにおいて、プログラム 2 の β の位置の処理を行った直後に、i と Mask[Index(Text[i])] と Status の値が何になっているかを答えよ、というものです。</p>
<p>ここで、またまた「 Bitap 法なんて知らない！」と怖気づいてはいけません。</p>
<p>擬似言語に示された通りにデータを処理して行けば、空欄を埋められるからです。</p>
<p>&nbsp;</p>
<p>それでは、トレースしてみましょう。i ＝ 1 ～ 9 までトレースすれば、すべての空欄を埋められます。</p>
<p>トレースするのは、i をループカウンタとした繰り返し処理です。</p>
<p>以下に、プログラムを示します。この短いプログラムを i ＝ 1 ～ 9 までトレースすればよいのですから、決して難しくないはずです。</p>
<p>トレースするのは、<strong>β の直後の値であることに注意</strong>してください。</p>
<p>〔プログラム 2 〕</p>
<pre>
○整数型関数: : BitapMatch(文字型: Text[], 文字型: Pat[])
○16 ビット論理型: Goal, Status, Mask[26]
○整数型: i, TextLen, PatLen
・TextLen ← Text[] の文字数
・PatLen ← GenerateBitMask(Pat[], Mask[])
・Status ← "0"B
・Goal ← "1"B を (PatLen - 1) ビットだけ論理左シフトした値
■ i: 1, i ≦ TextLen, 1
|　・Status ← Status を 1 ビットだけ論理左シフト値と              <i class="material-icons">fast_rewind</i>α
|                                         "1"B とのビットごとの論理和
|　<span class="u">・Status ← Status と Mask[Index(Text[i])] とのビットごとの論理積 　<i class="material-icons">fast_rewind</i>β</span>
|　▲ Status と Goal とのビットごとの論理積 ≠ "0"B
|　|　・return (i - PatLen + 1)
|　▼
■
· return (-1)
</pre>
<p>トレースした結果を以下に示します。</p>
<table class="bordered centered mag_h30 r-width">
<thead>
<tr>
<th>i</th>
<th>Mask[Index(Text[i])]</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>2</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B（空欄d）</td>
</tr>
<tr>
<td>3</td>
<td>&#8220;10&#8221;B</td>
<td>&#8220;10&#8221;B</td>
</tr>
<tr>
<td>4</td>
<td>&#8220;101000&#8221;B</td>
<td>&#8220;0&#8221;B</td>
</tr>
<tr>
<td>5</td>
<td>&#8220;101000&#8221;B</td>
<td>&#8220;0&#8221;B</td>
</tr>
<tr>
<td>6</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>7</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>8</td>
<td>&#8220;10&#8221;B</td>
<td>&#8220;10&#8221;B</td>
</tr>
<tr>
<td>9</td>
<td>&#8220;10101&#8221;B（空欄e）</td>
<td>&#8220;101&#8221;B（空欄f）</td>
</tr>
</tbody>
</table>
<p>空欄 d 、空欄 e 、空欄 f の正解は、選択肢イ、選択肢キ、選択肢カです。</p>
<h2>秘訣 5：<br />設問に答えられればよいと割り切って解く</h2>
<p>今度は、設問 3 です。問題、設問、解答群を以下に示します。</p>
<div class="card-panel mag_h30"">
設問 3</p>
<p>　関数 GenerateBitMask の拡張に関する，次の記述中の <span class="bold" style="border: 2px solid">　　　　</span> に入れる正しい答えを，解答群の中から選べ。ここで， プログラム 3 中の <span class="bold" style="border: 2px solid">　　b　　</span> には，設問 1 の <span class="bold" style="border: 2px solid">　　b　　</span> の正しい答えが入っているものとする。</p>
<p>表 4 に示すような正規表現を検索文字列に指定できるように，関数 GenerateBitMask を拡張し，関数 GenerateBitMaskRegex を作成した。</p>
<table class="bordered mag_h30 block">
<caption class="mag_h20">表 4　正規表現</caption>
<thead class="hide-on-small-only">
<tr>
<th width="10%">記号</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="chip hide-on-med-and-up">記号</span> []</td>
<td><span class="chip hide-on-med-and-up">説明</span> []内に記載されている文字のいずれか 1 文字に一致する文字を表す。例えば， &#8220;A[XYZ]B&#8221; は， &#8220;AXB&#8221; ， &#8220;AYB&#8221; ， &#8220;AZB&#8221; を表現している。</td>
</tr>
</tbody>
</table>
<p>〔プログラム 3 〕</p>
<pre>
○整数型関数: GenerateBitMaskRegex(文字型: Pat[],
                                16 ビット論理型: Mask[])
○整数型: i, OriginalPatLen, PatLen, Mode

・OriginalPatLen ← Pat[] の文字数
・PatLen ← 0
・Mode ← 0
■ i: 1, i ≦ 26, 1
|　・Mask[i] ← <span class="bold" style="border: 2px solid">　　b　　</span>  /* 初期化 */
■
■ i: 1, i ≦ Original PatLen, 1
|　▲ Pat[i] = "["
|　|　・Mode ← 1
|　|　・PatLen ← PatLen + 1
|--+-----
|　|
|　|　▲ Pat[i] = "]"
|　|　|　・Mode ← 0
|　|--+-----
|　|　|　▲ Mode = 0
|　|　|　|　・PatLen ← PatLen + 1
|　|　|　▼
|　|　|　・Mask[Index(Pat[i])] ← "1"B を (PatLen – 1) ビットだけ
|　|　|　    論理左シフトした値と Mask[Index(Pat[i])] とのビットごとの論理和
|　|　▼
|　▼
■
・return (PatLen)
</pre>
<p>Pat[] に &#8220;AC[BA]A[ABC]A&#8221; を格納して，関数 GenerateBitMaskRegex を呼び出した場合を考える。この場合，文字 &#8220;A&#8221; に対応するビットマスクである Mask[1] は <span class="bold" style="border: 2px solid">　　g　　</span> となり，関数 GenerateBitMaskRegex の返却値は <span class="bold" style="border: 2px solid">　　h　　</span> となる。また，Pat[] に格納する文字列中において [] を入れ子にすることはできないが，誤って Pat[] に &#8220;AC[B[AB]AC]A&#8221; を格納して関数 GenerateBitMaskRegex を呼び出した場合， Mask[1] は <span class="bold" style="border: 2px solid">　　i　　</span>となる。</p>
<p>g ，i に関する解答群</p>
<p>ア　 &#8220;1001101&#8221;B　　<br class="hide-on-med-and-up">イ　 &#8220;1010100001&#8221;B<br />
ウ　 &#8220;1011001&#8221;B　　<br class="hide-on-med-and-up">エ　 &#8220;101111&#8221;B<br />
オ　 &#8220;110011&#8221;B　　<br class="hide-on-med-and-up">カ　 &#8220;111101&#8221;B</p>
<p>h に関する解答群</p>
<p>ア　4　　イ　6　　ウ　9　　エ　13
</p></div>
<p>「正規表現」という、これまた難しそうな言葉が登場しましたが、決して怖気づかないでください。</p>
<p>どうしてこのプログラムで正規表現に対応できるのかを<strong>理解するのではなく、設問に答えられればよい</strong>のです。そう割り切って解いてください。</p>
<p>&nbsp;</p>
<p>プログラムの内容を見て、簡単そうな空欄から解いていきましょう。</p>
<p>まず、PatLen の値を求める空欄 h です。</p>
<p>Mode の初期値は 0 で、Mode = 0 なら 1 文字処理するごとに PatLen の値を 1 増やしています。</p>
<p>&#8220;[&#8221; を処理すると、PatLen を 1 増やし、Mode を 1 にします。</p>
<p>そして、 &#8220;]&#8221; を処理すると、Mode を 0 に戻します。</p>
<p>これは、 &#8220;[&#8221; と &#8220;]&#8221; で囲まれた部分では、その間に何文字あっても PatLen が 1 だけ増えるということです。</p>
<p>&nbsp;</p>
<p>したがって、問題に示された &#8220;AC[BA]A[ABC]A&#8221; という具体例を処理したときの PatLen は、</p>
<ol class="background c-round">
<li>&#8220;AC&#8221; で 2 増える</li>
<li>&#8220;[BA]&#8221; で 1 増える</li>
<li>&#8220;A&#8221; で 1 増える</li>
<li>&#8220;[ABC]&#8221; で 1 増える</li>
<li>&#8220;A&#8221; で 1 増える</li>
</ol>
<p>全部で 6 になります。</p>
<p>したがって、空欄 h の正解は、選択肢イです。</p>
<p>&nbsp;</p>
<p>今度は、&#8221;A&#8221; のビットマスクを求める空欄 g です。</p>
<p>&#8220;AC[BA]A[ABC]A&#8221; において、<br />
&#8220;A&#8221; は 5 回登場し、 &#8220;[&#8221; と &#8220;]&#8221; で囲まれた部分では、その間に何文字あっても PatLen が 1 だけ増えるのですから、 &#8220;ACAAAA&#8221; を想定してビットマスクを求めればよいことになります。</p>
<p>&#8220;A&#8221; は、1 文字目、3 文字目、4 文字目、5 文字目、6 文字目に登場するので、それらの桁位置を 1 とした &#8220;111101&#8221;B というビットマスクになります。したがって、空欄 g の正解は、選択肢カです。</p>
<h2>秘訣 6：<br />少しぐらいできない問題があっても気にしない</h2>
<p>最後は、空欄 i です。</p>
<p>誤って Pat[] に &#8220;AC[B[AB]AC]A&#8221; が与えられた場合には、<br />
&#8220;[B[A&#8221; の部分で PatLen が 2 増えてしまうので、 &#8220;A&#8221; のビットマスクは、&#8221;ACBAACA&#8221; を想定して求められます。</p>
<p>&#8220;A&#8221; は、1 文字目、4 文字目、5 文字目、7 文字目に登場するので、それらの桁位置を 1 とした &#8220;1011001&#8221;B というビットマスクになります。</p>
<p>したがって、空欄 i の正解は、選択肢ウです。</p>
<p>&nbsp;</p>
<p>この空欄 i は、かなり難しいでしょう。</p>
<p>問題の 60 %以上が正解なら合格なのですから、「少しぐらいできない問題があっても気にしない」でください。</p>
<p>&nbsp;</p>
<p>最後に、問題の答えをまとめて示しておきます。</p>
<div class="chip">解答</div>
<p>設問 1　a &#8211; イ　b &#8211; ア　c &#8211; ア<br />
設問 2　d &#8211; イ　e &#8211; キ　f &#8211; カ<br />
設問 3　g &#8211; カ　h &#8211; イ　i &#8211; ウ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p>この記事の中で紹介した</p>
<div class="card-panel indigo-text bold z-depth-0 grey lighten-5 mag_h20">
「説明文とプログラムを対応付ける」<br />
「問題に示された具体例をヒントにして考える」<br />
「すぐに解けない設問は後回しにする」<br />
「具体例をコツコツとトレースすればできる」<br />
「設問に答えられればよいと割り切って解く」<br />
「少しぐらいできない問題があっても気にしない」
</div>
<p>という解法のテクニックと心構えは、午後問題の問 7 ～問 11 のプログラミング言語の問題でも応用できます。</p>
<p>ぜひお試しください。それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019autumn/">こうすりゃ解ける！ 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>こうすりゃ解ける！ 2019年度春期 (平成31年度) 基本情報技術者試験の午後問題を徹底解説</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019spring/</link>
		<pubDate>Tue, 07 May 2019 01:55:52 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[午後問題の解説]]></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=gogo_arukikata&#038;p=1149</guid>
		<description><![CDATA[<p>2019 年 4 月 21 日（日）に実施された平成 31 年度 春期 基本情報技術者試験の午後問題の中から、必須問題である 問1「情報セキュリティ」 の解き方を解説します。 テーマは「クラウドサービスの利用者認証」です [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019spring/">こうすりゃ解ける！ 2019年度春期 (平成31年度) 基本情報技術者試験の午後問題を徹底解説</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2019 年 4 月 21 日（日）に実施された平成 31 年度 春期 基本情報技術者試験の午後問題の中から、必須問題である <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_1/2019h31h_fe_pm_qs.pdf#page=5" rel="noopener" target="_blank">問1「情報セキュリティ」</a> の解き方を解説します。</p>
<p>テーマは「クラウドサービスの利用者認証」です。</p>
<p>ありきたりの解説には、飽き飽きしているでしょうから、「こうすりゃ解ける！」という解法のテクニックと心構えを伝授させていただきます。</p>
<div class="pad_20 blue-grey-text z-depth-0 grey lighten-5 mag_h30">
<i class="material-icons blue-text">info</i> <span class="small-text">本記事ではわかりやすいよう、問題に下線を引いています</span>
</div>
<div class="divider mag_h30"></div>
<p><i class="material-icons red-text">fiber_new</i> 最新の 令和元年度 (2019) 秋期試験 の解説はこちら<br />
<a href="../analytics_question_pm_2019autumn/"></p>
<div class="row valign-wrapper pad_20">
<div class="col s3 pad_00 flex"><img src="../../wp-content/uploads/2019/11/r1a_q8_algorithm_cover.jpg"></div>
<div class="col s9 pad_20 black-text bold">こうすりゃ解ける！<br />2019 年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</div>
</div>
<p></a></p>
<div class="divider" style="width: 90%; margin: .5em auto;"></div>
<p><a href="../../guide/report_fe_2019_autumn/"></p>
<div class="row valign-wrapper pad_20">
<div class="col s3 pad_00 flex"><img src="../../wp-content/uploads/2019/10/exam_description_cover.jpg"></div>
<div class="col s9 pad_20 black-text bold">令和元年度 (2019年度) 秋期<br />基本情報技術者試験 問題解説</div>
</div>
<p></a></p>
<div class="divider mag_h30"></div>
<style>dl.inline dd{margin-left:2em}.r-width{width:80%;margin:auto}@media only screen and (max-width:600px){.r-width{width:100%}}</style>
<h2>まず問題の内容にざっと目を通す</h2>
<p>午後問題の問 1 ～ 問 7 の多くは、架空の事例になっています。前半部が事例の説明で、後半部が設問という構成です。以下に、問題の内容を示しますので、ざっと目を通してください。</p>
<p>&nbsp;</p>
<p><span class="bold">「ざっと」</span>ですよ。</p>
<p>&nbsp;</p>
<p>もしも、丁寧に読んでいたら、時間が足りなくなってしまいます。どんな内容の事例で、どんな設問なのかが、何となくわかれば OK です。</p>
<p>&nbsp;</p>
<p>↓↓↓↓↓　ここから、ざっと問題に目を通してください ↓↓↓↓↓<br />
<span class="small-text grey-text">[ <img src="https://s.w.org/images/core/emoji/11/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 詳細] を押すと開きます</span></p>
<div class="card-panel">
問 1　クラウドサービスの利用者認証に関する次の記述を読んで，設問 1 ，2 に答えよ。</p>
<details>
<p>A 社では現在，Web ベースの業務システムが複数稼働しており，それぞれが稼働するサーバ(以下，業務システムサーバという)を社内 LAN に設置している。 A 社のネットワーク構成を，図1に示す。</p>
<p><img class="materialboxed r-width hoverable mag_h10" data-caption="図 1　A 社のネットワーク構成" src="../../wp-content/uploads/2019/05/pm_q1_h29_spring_figure1.png" alt="" /></p>
<p>　利用者は，業務システムを，社内 LAN に設置されたクライアント PC の Web ブラウザから利用する。社外から社内 LAN へのリモートアクセスは禁止されている。業務システムの利用者認証は，A 社認証サーバでの利用者 ID とパスワード(以下，この二つを併せて利用者認証情報という)の検証によって行っており，シングルサインオンを実現している。</p>
<p>　社内 LAN からインターネットを介した社外への通信は，クライアント PC からプロキシサーバを経由した， HTTP over TLS (以下，HTTPS という)による通信だけが，ファイアウォールによって許可されている。社外からインターネットを介した社内 LAN への通信は，全てファイアウォールによって禁止されている。ファイアウォールの設定は，A 社のセキュリティポリシに基づき変更しないものとする。</p>
<p>&nbsp;</p>
<p>［クラウドサービスの利用者認証］</p>
<p>　このたび A 社は，業務システムの一つである販売管理システムを，B 社がインターネットを介して提供する販売管理サービス(以下，B 社クラウドサービスという) に移行することにした。利用者認証に関しては，A 社認証サーバと B 社クラウドサービスを連携し，次の (1) ~ (3) を実現することにした。</p>
<dl class="inline">
<dt>(1)</dt>
<dd>B 社クラウドサービスをシングルサインオンの対象とする。</dd>
<dt>(2)</dt>
<dd>A 社の利用者認証は，B 社クラウドサービスについても，A 社認証サーバで行う。</dd>
<dt>(3)</dt>
<dd>利用者が本人であることを確認するために A 社認証サーバで用いる <span class="bold blank">a</span> は，B 社クラウドサービスには送信しない。</dd>
</dl>
<p>　(1) ~ (3) を実現するために， A 社は，利用者認証を仲介する ID プロバイダ(以下， IdP という)を社内 LAN に設置することにした。IdP は，認証結果，認証有効期限及 び利用者 ID (以下，これら三つを併せて認証済情報という)にディジタル署名を付加してから，Web ブラウザを介して，B 社クラウドサービスに送信する。B 社クラウドサービスは，付加されているディジタル署名を使って，受信した認証済情報に <span class="bold blank">b</span> がないことを検証する。このために， IdP の <span class="bold blank">c</span> をB 社クラウドサービスに登録しておく。</p>
<p>　Web ブラウザとB 社クラウドサービスとの間，及び Web ブラウザと IdP との間の通信には，HTTPS を用いる。IdP と A 社認証サーバとの間の通信には LDAP を用いる。</p>
<p>&nbsp;</p>
<p>[ B 社クラウドサービスが利用可能になるまでの処理の手順]</p>
<p>　A 社の利用者が，利用者認証されていない状態で，B 社クラウドサービスを利用しようとした場合に，利用可能になるまでの処理の手順を次の ① ~ ⑩ に示す。</p>
<dl class="inline">
<dt>①</dt>
<dd>利用者は，Web ブラウザから B 社クラウドサービスにアクセスの要求を送信する。</dd>
<dt>②</dt>
<dd>B 社クラウドサービスは，アクセスの要求を IdP に転送する指示(以下，転送指示という)を， Web ブラウザに返信する。</dd>
<dt>③</dt>
<dd>Webブラウザは，② の転送指示に従い，IdP にアクセスの要求を送信する。</dd>
<dt>④</dt>
<dd>IMP は，利用者認証情報の入力画面を Web ブラウザに返信する。</dd>
<dt>⑤</dt>
<dd>利用者は，Web ブラウザで利用者認証情報を入力する。Web ブラウザは，入力された利用者認証情報を IdP に送信する。</dd>
<dt>⑥</dt>
<dd>IdP は，利用者認証情報を A 社認証サーバに送信する。</dd>
<dt>⑦</dt>
<dd>A 社認証サーバは，利用者認証情報を検証し，認証結果を IdP に返信する。</dd>
<dt>⑧</dt>
<dd>IdP は，認証結果が成功の場合に，認証済情報を発行し，当該情報の B 社クラウドサービスへの転送指示とともに，Web ブラウザに返信する。</dd>
<dt>⑨</dt>
<dd>Web ブラウザは，⑧ の転送指示に従い，認証済情報を B 社クラウドサービスに送信する。</dd>
<dt>⑩</dt>
<dd>B 社クラウドサービスは，認証済情報に基づいて，B 社クラウドサービスの利用を許可し，操作画面を Webブラウザに返信する。</dd>
</dl>
<p>　B 社クラウドサービスが利用可能になるまでの処理の流れを，図 2 に示す。図 2 中 の ① ~ ⑩ は，処理の手順の ① ~ ⑩ と対応している。</p>
<p><img class="materialboxed r-width hoverable mag_h10" data-caption="図 2　B 社クラウドサービスが利用可能になるまでの処理の流れ" src="../../wp-content/uploads/2019/05/pm_q1_h29_spring_figure2.png" alt="" /><br />
</details>
<p>設問 1　本文中の <span class="bold blank">　</span> に入れる適切な答えを，解答群の中から選べ。</p>
<details>
a ~ c に関する解答群<br />
ア　PKI　　<br class="hide-on-med-and-up">イ　改ざん　　<br class="hide-on-med-and-up">ウ　公開鍵<br />
エ　サービス妨害　　<br class="hide-on-med-and-up">オ　生体情報　　<br class="hide-on-med-and-up">カ　パスワード<br />
キ　秘密鍵　　<br class="hide-on-med-and-up">ク　利用者ID　　<br class="hide-on-med-and-up">ケ　漏えい<br />
</details>
<p>設問2　次の記述中の<span class="bold blank">　</span> に入れる適切な答えを，解答群の中から選べ。</p>
<details>
　B 社クラウドサービスでは，接続元の IP アドレスを A 社のものに限定する機能は提供されていない。しかし，他の業務システムと同様に，B 社クラウドサービスを，社内 LAN からの利用に限定できる。</p>
<p>　この理由は，<span class="bold blank">d</span> ことが必要であるが，IdP を社内 LAN に設置するので，社外から B 社クラウドサービスを利用しようとしても，図 2 中の <span class="bold blank">e</span> の送信で失敗し，利用者認証されないからである。</p>
<p>d に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>B 社クラウドサービスが， IdP と直接通信する</dd>
<dt>イ</dt>
<dd>B 社クラウドサービスが，利用者認証情報を検証し，Web ブラウザに返信する</dd>
<dt>ウ</dt>
<dd>IdP が，利用者に代わって，利用者認証情報を B 社クラウドサービスに送信する</dd>
<dt>エ</dt>
<dd>Web ブラウザが，IdP と通信する</dd>
</dl>
<p>eに関する解答群<br />
ア　①　　イ　③　　ウ　⑤　　エ　⑥　　オ　⑨<br />
</details>
</div>
<h2>設問の答えの裏付けとなる情報を探すために事例の説明を読む<br />[設問 1 空欄 a ]</h2>
<p>問題の内容にざっと目を通したら、設問を見てみましょう。</p>
<p>「ええっ、まだ問題の内容がよくわかってないですよ！」と思われるかもしれませんが、それでいいのです。</p>
<p>これは、事例を隅々まで理解しろ、という問題ではありません。<span class="bold">設問の答えが得られればいい</span> のです。そう割り切ってください。</p>
<p>&nbsp;</p>
<p>設問 1 の空欄 a には、利用者が本人であることを確認するために A 社認証サーバで用いるもので、B 社クラウドサービスに送信しないもの、が入ります。</p>
<p>さて、何でしょう？</p>
<div class="card-panel mag_h30">
(3) 利用者が本人であることを確認するために A 社認証サーバで用いる <span class="bold blank">a</span> は，B 社クラウドサービスには送信しない。
</div>
<p>これは、腕を組んで考えてわかることではありません。答えの裏付けとなる情報が、事例の説明の中にあるはずなので、それを見つけましょう。</p>
<p>このように、<span class="bold">事例の説明は、それを隅々まで理解するために読むのではなく、設問の答えの裏付けとなる情報を見つけるために読む</span>のです。</p>
<p>&nbsp;</p>
<p>事例の説明を見てみると、あった！ あった！ ありました。</p>
<p>以下の下線を付けた部分で、「利用者 ID 」と「パスワード」で利用者認証を行うと示されています。</p>
<div class="card-panel mag_h30">
　利用者は，業務システムを，社内 LAN に設置されたクライアント PC の Web ブラウザから利用する。社外から社内 LAN へのリモートアクセスは禁止されている。業務システムの<span class="u">利用者認証は，A 社認証サーバでの利用者 ID とパスワード</span>(以下，この二つを併せて利用者認証情報という)の検証によって行っており，シングルサインオンを実現している。
</div>
<p>空欄 a は、「利用者 ID 」と「パスワード」のどちらが適切なのでしょうか。</p>
<p>&nbsp;</p>
<p>選択肢を見てみましょう。選択肢に、どちらか一方しかなければ、それで決まりです。</p>
<p>ところが、選択肢には、「利用者 ID 」と「パスワード」の両方があります。</p>
<div class="card-panel mag_h30">
a ~ c に関する解答群<br />
ア　PKI　　<br class="hide-on-med-and-up">イ　改ざん　　<br class="hide-on-med-and-up">ウ　公開鍵<br />
エ　サービス妨害　　<br class="hide-on-med-and-up">オ　生体情報　　<br class="hide-on-med-and-up"><span class="u">カ　パスワード</span><br />
キ　秘密鍵　　<br class="hide-on-med-and-up"><span class="u">ク　利用者ID</span>　　<br class="hide-on-med-and-up">ケ　漏えい
</div>
<p>このような場合は、常識的な判断をしましょう。</p>
<p>一般的に、ログインするときには、「利用者 ID 」は見せても「パスワード」は見せないものです。</p>
<p>したがって、社外にある B 社のクラウドサービスに送信しないものは、「パスワード」の方が適切でしょう。そう判断して、選択肢カの「パスワード」を選んでください。</p>
<p>&nbsp;</p>
<p>「そんな適当な判断では納得できない！」という人は、事例の説明の他の部分に、答えの裏付けとなる情報がないかどうか探してみましょう。</p>
<p>&nbsp;</p>
<p>おっ！ ありました。</p>
<p>以下の下線を付けた部分に、IdP（ ID プロバイダ）が、「認証結果」「認証有効期限」「利用者 ID 」の 3 つを、B 社のクラウドサービスに送信すると示されています。</p>
<p>「利用者 ID 」は、B 社のクラウドサービスに送信するのですから、送信しないのは「パスワード」です。これで、スッキリと解決しましたね。</p>
<div class="card-panel mag_h30">
　(1) ~ (3) を実現するために， A 社は，利用者認証を仲介する ID プロバイダ(以下， IdP という)を社内 LAN に設置することにした。<span class="u">IdP は，認証結果，認証有効期限及 び利用者 ID (以下，これら三つを併せて認証済情報という) にディジタル署名を付加してから，Web ブラウザを介して，B 社クラウドサービスに送信する。</span>
</div>
<h2>午前試験の知識があれば正解を選べる<br />[設問 1 空欄 b 空欄 c ]</h2>
<p>市販教材や対策講座などで、ごく普通に試験勉強をした人なら、ディジタル署名の目的と仕組みをご存知でしょう。</p>
<p><span class="bold">ディジタル署名の目的は、「改ざん」と「なりますし」を検知すること</span>です。</p>
<p>その仕組みとして、送信者が秘密鍵で暗号化してディジタル署名を作成し、受信者が公開鍵で検証を行います。</p>
<p>&nbsp;</p>
<p>午後試験の設問の中には、事例の説明を読まなくても、午前試験の知識があれば正解を選べるものがあります。設問 1 の空欄 b と空欄 c は、まさにそういう問題です。</p>
<div class="card-panel mag_h30">
Web ブラウザを介して，B 社クラウドサービスに送信する。B 社クラウドサービスは，付加されている<span class="u">ディジタル署名を使って，受信した認証済情報に <span class="bold blank">b</span> がないことを検証する。このために， IdP の <span class="bold blank">c</span> をB 社クラウドサービスに登録しておく。</span>
</div>
<div class="card-panel mag_h30">
a ~ c に関する解答群<br />
ア　PKI　　<br class="hide-on-med-and-up">イ　改ざん　　<br class="hide-on-med-and-up">ウ　公開鍵<br />
エ　サービス妨害　　<br class="hide-on-med-and-up">オ　生体情報　　<br class="hide-on-med-and-up">カ　パスワード<br />
キ　秘密鍵　　<br class="hide-on-med-and-up">ク　利用者ID　　<br class="hide-on-med-and-up">ケ　漏えい
</div>
<p>空欄 b は、ディジタル署名で検証できることです。これは、「改ざん」と「なりすまし」ですが、選択肢にあるのは「改ざん」だけなので、解答は選択肢 イ です。</p>
<p>空欄 c は、ディジタル署名を検証するために、B 社のクラウドサービスに登録しておくものです。これは「公開鍵」なので、解答は 選択肢 ウ です。</p>
<p><a class="tag" href="../../tag/公開鍵秘密鍵">公開鍵秘密鍵</a></p>
<h2>選べなかったら消去法で不適切な選択肢を消す<br />[設問 2 空欄 d ]</h2>
<p>今度は、設問 2 の空欄 d です。</p>
<p>選択肢を見ると、何と何が通信するのかが示されています。どれが適切なのでしょう？ 簡単には、選べそうにありませんね。</p>
<p>こういうときには、<span class="bold">「選べなかったら消去法」</span>という言葉を、標語のように思い出してください。</p>
<p>&nbsp;</p>
<p>事例の説明の中にある図 2 に「B 社クラウドサービス」「 Web ブラウザ」「 IdP 」「 A 社認証サーバ」の送信と返信の処理の流れが示されています。</p>
<p>これを見て「この選択肢は違う！」とわかったものに × を付けて消して行くのです。消えずに残ったものが正解です。</p>
<div class="card-panel mag_h30">
d に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>B 社クラウドサービスが， IdP と直接通信する</dd>
<dt>イ</dt>
<dd>B 社クラウドサービスが，利用者認証情報を検証し，Web ブラウザに返信する</dd>
<dt>ウ</dt>
<dd>IdP が，利用者に代わって，利用者認証情報を B 社クラウドサービスに送信する</dd>
<dt>エ</dt>
<dd>Web ブラウザが，IdP と通信する</dd>
</dl>
</div>
<div class="card-panel mag_h30">
　B 社クラウドサービスが利用可能になるまでの処理の流れを，図 2 に示す。図 2 中 の① ~ ⑩ は，処理の手順の ① ~ ⑩ と対応している。</p>
<p><img class="materialboxed r-width hoverable mag_h10" data-caption="図 2　B 社クラウドサービスが利用可能になるまでの処理の流れ" src="../../wp-content/uploads/2019/05/pm_q1_h29_spring_figure2.png" alt="" />
</div>
<p>選択肢アには「 B 社クラウドサービスが IdP と直接通信する」と示されています。図 2 を見ると、B 社クラウドサービスは、Web ブラウザを介して IdP と通信しています。</p>
<p>したがって、選択肢アは × です。</p>
<p>選択肢イには、「 B 社クラウドサービスが、利用者認証情報を検証し、Web ブラウザに返信する」と示されています。B 社クラウドサービスは、② と ⑩ の処理で、Web ブラウザに返信しています。② と ⑩ の処理の説明と見てみると、以下のように、利用者認証情報の検証結果の返信ではありません。</p>
<p>したがって、選択肢イも × です。</p>
<div class="card-panel mag_h30">
<dl class="inline">
<dt>②</dt>
<dd>B 社クラウドサービスは，アクセスの要求を IdP に転送する指示(以下，転送指示という)を， Web ブラウザに返信する。</dd>
<dt>&#xFE19;</dt>
<dd>　</dd>
<dt>⑩</dt>
<dd>B 社クラウドサービスは，認証済情報に基づいて，B 社クラウドサービスの利用を許可し，操作画面を Web ブラウザに返信する。</dd>
</dl>
</div>
<p>選択肢ウには、「 IdP が、利用者に代わって、利用者認証情報を B 社クラウドサービスに返信する」と示されています。図 2 を見ると、IdP から B 社クラウドサービスへの返信はありません。</p>
<p>したがって、選択肢ウも × です。</p>
<p>&nbsp;</p>
<p>残ったのは選択肢エだけですから、それを選んでください。解答は選択肢エです。</p>
<p>&nbsp;</p>
<p>念のため、選択肢エの内容も確認しておきましょう。</p>
<p>選択肢エには、「 Web ブラウザが、IdP と通信する」とだけ示されています。図2を見ると、確かに Web ブラウザは IdP と通信しています。したがって、選択肢エに × を付ける理由はありません。</p>
<p><a class="tag" href="../../tag/消去法のやり方">消去法のやり方</a></p>
<h2>1つぐらいできない設問があっても気にしない<br />[設問 2 空欄 e ]</h2>
<p>試験問題の出題者は、0 点が多発しても困りますが、<span class="bold">満点が多発するのも嫌</span> なようです。</p>
<p>そのため、どの問題にも、とても簡単な設問（この問題では、設問 1 の空欄 b と空欄 c でしょう）と、やや難しい設問があるものです。</p>
<p>&nbsp;</p>
<p>最後の設問 2 の空欄 e は、やや難しい問題でしょう。</p>
<p>60% 以上正解できれば試験に合格できるのですから、1 つぐらいできない設問があっても気にしないでください。</p>
<p>&nbsp;</p>
<p>「そう言われると、よけいに気になります！」という人もいると思いますので、空欄 e も解説しておきましょう。</p>
<p>&nbsp;</p>
<p>選択肢に示された ① 、③ 、⑤ 、⑥ 、⑨ の処理の中から、社外から B 社クラウドサービスを利用しようとしても、IdP が社内 LAN に設置されていることが理由となって、失敗する送信を選べばよいのです。</p>
<p>&nbsp;</p>
<p>社外から利用するのですから、図 2 の Web ブラウザが社外にあります。</p>
<p>A 社の LAN には、ファイアウォールがあり、社外からのアクセスを全て禁止しています。これは、事例の説明で、以下の下線を付けた部分に示されています。</p>
<div class="card-panel mag_h30">
　社内 LAN からインターネットを介した社外への通信は，クライアント PC からプロキシサーバを経由した， HTTP over TLS (以下，HTTPS という)による通信だけが，ファイアウォールによって許可されている。<span class="u">社外からインターネットを介した社内 LAN への通信は，全てファイアウォールによって禁止されている。</span>ファイアウォールの設定は，A 社のセキュリティポリシに基づき変更しないものとする。
</div>
<p>社外の Web ブラウザは、③ の処理で社内の IdP に送信しています。この送信は、ファイアウォール によって禁止されるので、失敗します。</p>
<p>したがって、選択肢イが正解です。</p>
<p>&nbsp;</p>
<p>あれあれ、それほど難しい問題ではなかったかもしれませんね。</p>
<p>&nbsp;</p>
<p>最後に、問題の解答をまとめて示しておきます。</p>
<p>&nbsp;</p>
<div class="chip">解答</div>
<p>平成 31 年度 ( 2019 年度) 春期 問 1</p>
<p>設問 1　a　カ　　b　イ　　c　ウ<br />
設問 2　d　エ　　e　イ</p>
<p>&nbsp;</p>
<div class="divider"></div>
<p>&nbsp;</p>
<p>ここで紹介した</p>
<p><span class="bold"><br />
「まず問題の内容にざっと目を通す」<br />
「設問の答えの裏付けとなる情報を探すために事例の説明を読む」<br />
「午前試験の知識があれば正解を選べる」<br />
「選べなかったら消去法で不適切な選択肢を消す」<br />
「1 つぐらいできない設問があっても気にしない」<br />
</span></p>
<p>という解法のテクニックと心構えは、午後試験の 問 1 ～ 問 7 のすべての問題で応用できます。</p>
<p>&nbsp;</p>
<p>繰り返しアドバイスしますが「事例の説明を隅々まで理解するのではなく、設問の答えが得られればいいのだ」と割り切って問題を解くことが重要です。</p>
<p>&nbsp;</p>
<p>それでは、またお会いしましょう！</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p class="grey-text small-text"><i class="material-icons mag_rt05">info</i>あわせて読みたい</p>
<p><a href="../trend_to_questions_at_pm/"></p>
<div class="row valign-wrapper">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2018/05/trend_to_questions_of_pm.jpg" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">午後問題の歩き方 | 過去問 10 回分から分析した午後問題の出題傾向 ( 2019 春期試験 更新)</div>
</div>
<p></a></p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019spring/">こうすりゃ解ける！ 2019年度春期 (平成31年度) 基本情報技術者試験の午後問題を徹底解説</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>こうすりゃ解ける！ 2018年度秋期 (平成30年) 基本情報技術者試験の午後問題を徹底解説</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2018autumn/</link>
		<pubDate>Mon, 22 Oct 2018 01:53:13 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[午後問題の解説]]></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=512</guid>
		<description><![CDATA[<p>fiber_new 最新の 令和元年度 (2019) 秋期試験 の解説はこちら こうすりゃ解ける！2019 年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説 令和元年度 (2019年度) 秋期基本情報技術 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2018autumn/">こうすりゃ解ける！ 2018年度秋期 (平成30年) 基本情報技術者試験の午後問題を徹底解説</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="divider mag_h30"></div>
<p><i class="material-icons red-text">fiber_new</i> 最新の 令和元年度 (2019) 秋期試験 の解説はこちら</p>
<p><a href="../analytics_question_pm_2019autumn/"></p>
<div class="row valign-wrapper pad_20">
<div class="col s3 flex pad_00"><img src="../../wp-content/uploads/2019/11/r1a_q8_algorithm_cover.jpg"></div>
<div class="col s9 black-text bold">こうすりゃ解ける！<br />2019 年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</div>
</div>
<p></a></p>
<div class="divider" style="width: 90%; margin: .5em auto;"></div>
<p><a href="../../guide/report_fe_2019_autumn/"></p>
<div class="row valign-wrapper pad_20">
<div class="col s3 flex pad_00"><img src="../../wp-content/uploads/2019/10/exam_description_cover.jpg"></div>
<div class="col s9 black-text bold">令和元年度 (2019年度) 秋期<br />基本情報技術者試験 問題解説</div>
</div>
<p></a></p>
<div class="divider mag_h30"></div>
<p>ここでは、2018 年 10 月 21 日（日）に実施された平成 30 年度 秋期 基本情報技術者試験の午後問題の中から、必須問題である<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_fe_pm_qs.pdf#page=6" rel="noopener" target="_blank">問 1「情報セキュリティ」</a> の解き方を解説します。</p>
<p>普通に解説しても面白くないと思いますので、</p>
<div class="card process">
<ul class="bold">
<li>「午後問題を解くための前提条件」</li>
<li>「短時間に午後問題を解く方法」</li>
</ul>
</div>
<p>この 2 つに的を絞ります。ここで紹介する前提条件と解法は、他の問題にも応用できるはずです。</p>
<p>「午後問題が苦手」や「時間が足りない」と悩んでいる受験者のお役に立てば幸いです。</p>
<div class="card-panel blue-grey-text z-depth-0 grey lighten-5 mag_h30">
<i class="material-icons blue-text">info</i> <span class="small-text">本記事ではわかりやすいよう、問題に下線を引いています</span>
</div>
<style>dl.inline dd{margin-left:2em}</style>
<h2>午前問題を数多く練習して頻出用語の意味を覚える</h2>
<p>はじめに、午後問題を解くための前提条件です。それは、問題で取り上げられる用語の意味をちゃんと知っていることです。</p>
<p><span class="bold">「午後問題が苦手」という受験者の多くは、用語の知識が不足しています。</span></p>
<p>たとえば、以下は、現時点で最新のシラバス Ver.4.0 に示されたセキュリティの分野の用語です。丁寧に見たら、この記事の続きを読むのが嫌になってしまうでしょうから、<span class="u">ざっと目を通してください。</span></p>
<p>もしも、「うわっ！ こんなにあるのか！ 意味のわからない用語だらけだ！」と思ったなら、それが午後問題で苦戦する理由です。</p>
<h3>セキュリティ問題の用語チェック</h3>
<div class="divider mag_h30"></div>
<p><span class="bold">ここから先は、[ <i class="material-icons">play_arrow</i> 詳細 ] を開いて、用語にざっと目を通してください</span></p>
<div class="card-panel grey lighten-5 hoverable">
<details>
<dl>
<dt>【情報セキュリティの目的と考え方】</dt>
<dd>機密性（ Confidentiality ）、完全性（ Integrity ）、可用性（ Availability ）、真正性（ Authenticity ）、責任追跡性（ Accountability ）、否認防止（ Non-Repudiation ）、信頼性（ Reliability ）、OECD セキュリティガイドライン（情報システム及びネットワークのセキュリティのためのガイドライン）</dd>
<dt>【情報セキュリティの重要性】</dt>
<dd>情報資産、脅威、脆弱性、サイバー空間、サイバー攻撃</dd>
<dt>【脅威の種類】</dt>
<dd>物理的脅威（事故、災害、故障、破壊、盗難、不正侵入ほか）、技術的脅威（不正アクセス、盗聴、なりすまし、改ざん、エラー、クラッキングほか）、人的脅威（誤操作、紛失、破損、盗み見、不正利用、ソーシャルエンジニアリングほか）、情報漏えい、故意、過失、誤謬、不正行為、妨害行為、サービス妨害</dd>
<dt>【マルウェア・不正プログラム】</dt>
<dd>コンピュータウイルス、マクロウイルス、ワーム、ボット（ボットネット、遠隔操作型ウイルス、C &amp; C サーバ）、トロイの木馬、スパイウェア、ランサムウェア、キーロガー、ルートキット、バックドア、偽セキュリティ対策ソフト</dd>
<dt>【脆弱性】</dt>
<dd>バグ、セキュリティホール、人為的脆弱性、シャドー IT</dd>
<dt>【不正のメカニズム】</dt>
<dd>不正のトライアングル（機会、動機、正当化）、状況的犯罪予防</dd>
<dt>【攻撃者の種類、攻撃の動機】</dt>
<dd>内部関係者、愉快犯、詐欺犯、故意犯、金銭奪取、サイバーテロリズム</dd>
<dt>【攻撃手法】</dt>
<dd>辞書攻撃、総当たり（ブルートフォース）攻撃、パスワードリスト攻撃・クロスサイトスクリプティング、クロスサイトリクエストフォージェリ、クリックジャッキング、ドライブバイダウンロード、SQL インジェクション、ディレクトリトラバーサル、中間者攻撃（ Man-in-the-middle ）、第三者中継、IP スプーフィング、キャッシュポイズニング、セッションハイジャック、DoS（ Denial of Service：サービスの妨害）攻撃、DDoS 攻撃、メールボム、標的型攻撃（ APT（ Advanced Persistent Threats ）、水飲み場型攻撃、やり取り型攻撃ほか）、フィッシング（ワンクリック詐欺ほか）、ゼロデイ攻撃、サイドチャネル攻撃、フットプリンティング</dd>
<dt>【暗号技術】</dt>
<dd>CRYPTREC 暗号リスト、暗号方式（暗号化（暗号鍵）、復号（復号鍵）、解読、共通鍵暗号方式（共通鍵）、公開鍵暗号方式（公開鍵、秘密鍵））、AES（ Advanced Encryption Standard ）、RSA（ Rivest 、Shamir 、Adleman ）、S/MIME（ Secure MIME ）、PGP（ Pretty Good Privacy ）、ハイブリッド暗号、ハッシュ関数（ SHA-256 ほか）、ブロック暗号利用モード、鍵管理、ディスク暗号化、ファイル暗号化、危殆化</dd>
<dt>【認証技術】</dt>
<dd>ディジタル署名（署名鍵、検証鍵）、XML 署名、タイムスタンプ（時刻認証）、メッセージ認証、MAC（ Message Authentication Code：メッセージ認証符号）、チャレンジレスポンス認証</dd>
<dt>【利用者認証】</dt>
<dd>ログイン（利用者 ID とパスワード）、アクセス管理、IC カード、PIN コード、ワンタイムパスワード、多要素認証、セキュリティトークン、シングルサインオン、CAPTCHA</dd>
<dt>【生体認証技術】</dt>
<dd>静脈パターン認証、虹彩認証、声紋認証、顔認証、網膜認証、署名認証、本人拒否率、他人受入率</dd>
<dt>【公開鍵基盤】</dt>
<dd>PKI（ Public Key Infrastructure：公開鍵基盤）、ディジタル証明書（公開鍵証明書）、ルート証明書、サーバ証明書、クライアント証明書、CRL（ Certificate Revocation List：証明書失効リスト）、OCSP、CA（ Certification Authority：認証局）、GPKI（ Government Public Key Infrastructure：政府認証基盤）、BCA（ Bridge Certification Authority：ブリッジ認証局）</dd>
<dt>【情報セキュリティ管理】</dt>
<dd>情報セキュリティポリシに基づく情報の管理、情報、情報資産、物理的資産、ソフトウェア資産、人的資産（人、保有する資格・技能・経験）、無形資産、サービス、リスクマネジメント（ JIS Q 31000 ）、監視、情報セキュリティ事象、情報セキュリティインシデント</dd>
<dt>【リスク分析と評価】</dt>
<dd>機密性、完全性、可用性、情報資産台帳</dd>
<dt>【リスクの種類】</dt>
<dd>財産損失、責任損失、純収益の喪失、人的損失、リスクの種類（オペレーショナルリスク、サプライチェーンリスク、外部サービス利用のリスク、SNS による情報発信のリスクほか）、ペリル、ハザード、モラルハザード、年間予想損失額、得点法、コスト要因</dd>
<dt>【情報セキュリティリスクアセスメント】</dt>
<dd>リスク基準（リスク受容基準、情報セキュリティリスクアセスメントを実施するための基準）、リスクレベル、リスクマトリックス、リスク所有者、リスク源、リスクアセスメントのプロセス（リスク特定、リスク分析、リスク評価）、定性的リスク分析手法、定量的リスク分析手法</dd>
<dt>【情報セキュリティリスク対応】</dt>
<dd>リスクコントロール、リスクヘッジ、リスクファイナンシング、リスク回避、リスク共有（リスク移転、リスク分散）、リスク保有、リスク集約、残留リスク、リスク対応計画、リスク登録簿、リスクコミュニケーション</dd>
<dt>【情報セキュリティ継続】</dt>
<dd>緊急事態の区分、緊急時対応計画（コンティンジェンシープラン）、復旧計画、災害復旧、バックアップ対策、被害状況の調査手法</dd>
<dt>【情報セキュリティ諸規程】</dt>
<dd>報管理規程、機密管理規程、文書管理規程、情報セキュリティインシデント対応規程（コンピュータウイルス感染時の対応ほか）、情報セキュリティ教育の規程、プライバシポリシ（個人情報保護方針）、職務規程、罰則の規程、対外説明の規程、例外の規程、規則更新の規程、規程の承認手続</dd>
<dt>【情報セキュリティマネジメントシステム】</dt>
<dd>ISMS 適用範囲、リーダシップ、計画、運用、パフォーマンス評価、改善、管理目的、管理策（情報セキュリティインシデント管理、情報セキュリティの教育及び訓練、法的及び契約上の要求事項の順守ほか）、ISMS 適合性評価制度、ISMS 認証、JIS Q 27001（ ISO/IEC 27001 ）、JIS Q 27002（ ISO/IEC 27002 ）、情報セキュリティガバナンス（ JIS Q 27014 ）</dd>
<dt>【情報セキュリティ組織・機関】</dt>
<dd>情報セキュリティ委員会、情報セキュリティ関連組織（ CSIRT、SOC（ Security Operation Center ））、サイバーセキュリティ戦略本部、内閣サイバーセキュリティセンター（ NISC ）、IPA セキュリティセンター、CRYPTREC 、JPCERT/CC 、コンピュータ不正アクセス届出制度、コンピュータウイルス届出制度、ソフトウェア等の脆弱性関連情報に関する届出制度、情報セキュリティ早期警戒パートナーシップ、J-CSIP（サイバー情報共有イニシアティブ）、JVN（ Japan Vulnerability Notes ）、ホワイトハッカー</dd>
<dt>【セキュリティ評価基準】</dt>
<dd>評価方法、セキュリティ機能要件、セキュリティ保証要件、保証レベル、JISEC（ IT セキュリティ評価及び認証制度）、JCMVP（暗号モジュール試験及び認証制度）、PCIDSS、CVSS（ Common Vulnerability Scoring System：共通脆弱性評価システム）、脆弱性検査、IT 製品の調達におけるセキュリティ要件リスト、ペネトレーションテスト、耐タンパ性</dd>
<dt>【人的セキュリティ対策】</dt>
<dd>組織における内部不正防止ガイドライン、情報セキュリティ啓発（教育、訓練、資料配付、メディア活用）、パスワード管理、利用者アクセスの管理（アカウント管理、特権的アクセス権の管理、need-to-know（最小権限）ほか）、ログ管理、監視</dd>
<dt>【技術的セキュリティ対策】</dt>
<dd>クラッキング対策、不正アクセス対策、情報漏えい対策、マルウェア・不正プログラム対策（ウイルス対策ソフトの導入、ウイルス定義ファイルの更新ほか）、コンピュータウイルス検出手法（ビヘイビア法ほか）、出口対策、入口対策、多層防御、暗号処理、秘匿化、アクセス制御、脆弱性管理（OS アップデート、脆弱性修正プログラム（セキュリティパッチ）の適用ほか）、ネットワーク監視、ネットワークアクセス権の設定、侵入検知、侵入防止、DMZ（非武装地帯）、検疫ネットワーク、電子メール・Web のセキュリティ（スパム対策、SPF 、URL フィルタリング、コンテンツフィルタリング）、携帯端末（携帯電話、スマートフォン、タブレット端末ほか）のセキュリティ、無線 LAN セキュリティ、クラウドコンピューティングのセキュリティ、クラウドサービスのセキュリティ、電子透かし、ディジタルフォレンジックス（証拠保全ほか）</dd>
<dt>【セキュリティ製品・サービス】</dt>
<dd>ウイルス対策ソフト、SIEM（ Security Information and Event Management ）、ファイアウォール、WAF（ Web Application Firewall）、IDS（ Intrusion Detection System：侵入検知システム）、IPS（ Intrusion Prevention System：侵入防止システム）、UTM（ Unified Threat Management：統合脅威管理）、SSL/TLS アクセラレータ、MDM（ Mobile Device Management ）</dd>
<dt>【物理的セキュリティ対策】</dt>
<dd>RASIS（ Reliability 、Availability 、Serviceability 、Integrity 、Security ）、RAS 技術、耐震耐火設備、UPS 、二重化技術、ミラーリング、監視カメラ、セキュリティゲート、施錠管理、入退室管理、クリアデスク・クリアスクリーン、遠隔バックアップ、USB キー、セキュリティワイヤ</dd>
<dt>【セキュアプロトコル】</dt>
<dd>IPSec 、SSL/TLS 、SSH 、HTTPS（ HTTP over TLS ）、WPA2</dd>
<dt>【認証プロトコル】</dt>
<dd>SPF 、DKIM 、SMTP-AUTH 、OAuth 、DNSSEC 、EAP 、EAP-TLS 、PEAP 、RADIUS</dd>
<dt>【ネットワークセキュリティ】</dt>
<dd>パケットフィルタリング、MAC アドレス（ Media Access Control address ）フィルタリング、認証サーバ、NAT（ Network Address Translation：ネットワークアドレス変換）、IP マスカレード、VLAN 、VPN（ Virtual Private Network：仮想私設網）、セキュリティ監視、OP25B 、ハニーポット、リバースプロキシ</dd>
<dt>【データベースセキュリティ】</dt>
<dd>データベース暗号化、データベースアクセス制御、データベースバックアップ、ログの取得</dd>
<dt>【アプリケーションセキュリティ】</dt>
<dd>Web システムのセキュリティ対策、セキュアプログラミング、脆弱性低減技術（ソースコード静的検査、プログラムの動的検査、ファジングほか）、パスワードクラック対策（ソルトほか）、バッファオーバフロー対策、クロスサイトスクリプティング対策、SQL インジェクション対策（エスケープ処理ほか）</dd>
</dl>
</details>
</div>
<div class="divider mag_h30"></div>
<p>膨大な数の用語を見てショックを受けてしまったかもしれませんが、<span class="bold">それほど心配する必要はありません。</span></p>
<p>なぜなら、よく出る用語は限られているからです。</p>
<p>それを知るには、午前問題を数多く練習することをお勧めします。午前問題で出題される用語は、午後問題でも出題されることが多いからです。</p>
<p><span class="bold">つまり、午前問題を解いてよく出る用語を覚えることが、午後問題を解くための前提条件になるのです。</span></p>
<p>&nbsp;</p>
<p>たとえば、この問題を解くには、以下の用語の意味を知っていれば OK です。どれも、午前問題でよく出題されるものです。</p>
<h3>この問題に必要な午前問題で出題される知識</h3>
<div class="card-panel mag_h10">
<dl>
<dt class="bold pink-text text-accent-3">SQL インジェクション攻撃</dt>
<dd>Web アプリの入力欄に SQL の命令を注入（ injection ＝ 注入）し、それを DB サーバで実行させて、不正な操作を行うこと。</dd>
<dt class="bold pink-text text-accent-3">DNS（ Domain Name System ）</dt>
<dd>URL と IP アドレスを対応付けるプロトコル、およびそれを実現するサーバのこと。</dd>
<dt class="bold pink-text text-accent-3">エスケープ処理</dt>
<dd>プログラムで文字列を処理するときに、SQL や特定のプログラミング言語の命令と解釈される文字や記号を、別の文字や記号に置き換えて、それらの機能を無効にすること。</dd>
<dt class="bold pink-text text-accent-3">アクセスログ</dt>
<dd>サーバーを利用（アクセス）した記録（ログ）のこと。</dd>
<dt class="bold pink-text text-accent-3">DMZ（ De Militarized Zone ＝ 非武装地帯）</dt>
<dd>社内ネットワークの中で、Web サーバやメールサーバなど、社外に公開するサーバを設置する場所のこと。</dd>
<dt class="bold pink-text text-accent-3">WAF（ Web Application Firewall ）</dt>
<dd>Web アプリケーションの脆弱性を突いた攻撃を遮断するために、Web サーバの前段階に配置する防御システムのこと。</dd>
</dl>
</div>
<h2>冒頭の長い事例は斜め読みして、できるだけ早く設問にたどり着く</h2>
<p>次に、短時間に午後問題を解く方法です。</p>
<p>午後問題は、様々な用語を散りばめた事例（架空の事例）であり、内容がとても長くなっています。この問題も「情報セキュリティ事故と対策」というタイトルが付けられた事例です。</p>
<p>冒頭部は、「自動車の販売代理店である A 社は ･･･」という書き出しで始まっています。事例だからです。ここから、<span class="u">長々とした事例の説明がありますが、それに惑わされてはいけません。</span>どんどん時間が経過してしまうからです。</p>
<p><span class="bold">「時間が足りない」という受験者の多くは、事例の説明を丁寧に読み過ぎています。</span></p>
<p>&nbsp;</p>
<p>以下に、この問題の冒頭部を示しますので、ざっと目を通してください。</p>
<div class="divider mag_h30"></div>
<p><span class="u">ここから先は、問 1 を開いて、ざっと目を通してください</span></p>
<div class="card-panel grey lighten-5 hoverable">
<details>
<summary>問 1</p>
<p>情報セキュリティ事故と対策に関する次の記述を読んで，設問 1 ~ 3 に答えよ。</summary>
<p>自動車の販売代理店である A 社は，Web サイトで自動車のカタログ請求を受け付けている。Web サイトは，Web アプリケーションソフト(以下， Web アプリという) が稼働する Web サーバと，データベースが稼働するデータベースサーバ(以下，DB サーバという)で構成されている。Web サーバは A 社の DMZ に設置され，DB サー バは A 社の社内 LAN に接続されている。Web サイトの管理は B 氏が， A 社の社内 LAN に接続されている保守用 PC からアクセスして行っている。カタログ請求者は， Web ブラウザからインターネット経由で HTTP over TLS によって Web サイトにアクセスする。</p>
<dl>
<dt>〔カタログ請求者の情報の登録〕</dt>
<dd>　A 社では，次の目的で，カタログ請求者の情報を保持し，利用することの同意を，カタログ請求者から得ている。</p>
<ul>
<li>情報提供や購入支援を行う。</li>
<li>カタログ請求者が別のカタログを請求したいときなどに，登録した電子メールアドレスとパスワードを使用してログインできるようにする。</li>
</ul>
</dd>
</dl>
<p>　同意が得られたときは，氏名，住所，電話番号，電子メールアドレス，パスワード，購入予定時期，購入予算，希望車種などの情報を， Web アプリに入力してもらい，データベースに登録している。パスワードはハッシュ化して，それ以外の情報は平文で，データベースに格納している。 A 社では，カタログ請求者から要求があったときにだけ，データベースからそのカタログ請求者の情報を消去する運用としている。</p>
<dl>
<dt class="mag_h10">〔カタログ請求者への対応〕</dt>
<dd>A社では，カタログ請求者へのカタログ送付後の購入支援を，データベースに登録されている情報を基に，電子メールと電話で行っている。</dd>
<dt class="mag_h10">〔情報セキュリティ事故の発生〕</dt>
<dd>ある日， A 社の社員から， &#8220;A 社のカタログ請求者一覧と称する情報が，インターネットの掲示板に公開されている&#8221; と B 氏に連絡があった。公開されている情報を B 氏が確認したところ，データベースに登録されている情報の一部であったので，自社のデータベースから情報が流出したと判断して上司に報告した。B 氏は上司からの指示を受けて， Web サイトのサービスを停止し，情報が流出した原因と流出した情報の範囲を特定することにした。</dd>
<dt class="mag_h10">〔情報セキュリティ事故の原因と流出した情報の範囲〕</dt>
<dd>B 氏の調査の結果，Web アプリに SQL インジェクションの脆弱性があることが分かった。そのことから B 氏は，攻撃者が <i class="material-icons red-text">looks_one</i> <span class="u">インターネット経由で SQL インジェクション攻撃を行い</span>，データベースに登録されているカタログ請求者の情報を不正に取得したと推測した。 Web サーバとデータベースではアクセスログを取得しない設定にしていたこともあり，流出した情報の範囲は特定できなかった。そこで，データベースに登録されている全ての情報が流出したことを前提に， A 社では，データベースに登録されている全てのカタログ請求者に情報の流出について連絡するとともに，対策を講じることにした。</dd>
<dt class="mag_h10">〔情報セキュリティ事故を踏まえたシステム面での対策〕</dt>
<dd>B 氏は、今回の情報セキュリティ事故を踏まえたシステム面での対策案を，表 1 のようにまとめた。</dd>
</dl>
<table class="striped mag_h20" style="width: 90%; margin: auto">
<caption class="mag_h10 blue-grey-text">表 1 情報セキュリティ事故を踏まえたシステム面での対策案</caption>
<thead>
<tr>
<th>目的</th>
<th>対策</th>
</tr>
</thead>
<tbody>
<tr>
<td>SQL インジェクション攻撃からの防御</td>
<td>
<ul>
<li>SQL 文の組立てはプレースホルダで実装する。</li>
<li><span class="blank">a</span></li>
</td>
</tr>
<tr>
<td>情報流出リスクの低減</td>
<td>
<ul>
<li><span class="blank">b</span></li>
</td>
</tr>
<tr>
<td>情報流出の原因と流出した情報の範囲の特定</td>
<td>
<ul>
<li><span class="blank">c</span></li>
</td>
</tr>
</tbody>
</table>
</details>
</div>
<div class="divider mag_h30"></div>
<p>長々とした事例の説明を見て、頭の中が混乱してしまった人は、冷静になってください。</p>
<p>&nbsp;</p>
<p>これは、「事例に意見を述べよ」という問題ではありません。<span class="bold">「設問に答えよ」という問題です。</span></p>
<p>&nbsp;</p>
<p>ですから、冒頭の事例の説明は斜め読みして、できるだけ早く設問にたどり着くようにしてください。それが、短時間に午後問題を解く方法です。</p>
<p>いきなり設問から始めたら午後問題にならないので、冒頭に事例の説明があるのです。</p>
<p>そのため、<span class="bold">問題によっては、事例の説明をほとんど読まなくても、設問が解ける場合があります。</span>この問題は、その好例でしょう。</p>
<p>こう言っては、出題者に甚だ失礼ですが、事例の説明はオマケのようなものです。</p>
<h2>すべて選択問題なのだから、消去法で答えを絞り込む</h2>
<p>こうして、設問にたどり着いたら、どうするか？</p>
<p>基本情報技術者試験は、すべて選択問題なので、<span class="bold">消去法で解いてください。</span>正解を選ぶのではなく、誤りと思われる選択肢を消すのです。</p>
<p>消去法には、うっかり間違いを防止する効果もあります。すべての選択肢に○、△、×、？を付けて評価すれば、後で見直しをしなくて済むという効果もあり、短時間に午後問題を解く方法の一助となります。</p>
<p>自分の知識を総動員して、誤りかどうかを判断してください。</p>
<p>もしも、自分の知らないことが書かれていたら、常識的に考えて、誤りかどうかを判断してください。</p>
<p>基本情報技術者試験には、<span class="bold">滅多にヒッカケ問題が出題されない</span>ので、裏をかかずに、素直な判断をしてください。</p>
<p>&nbsp;</p>
<p>それでは、設問を解いてみましょう。</p>
<h3>【設問 1 】</h3>
<div class="card-panel mag_h20">
設問 1 本文中の下線 ① について, この攻撃の説明として適切な答えを, 解答群の中から選べ。</p>
<blockquote>
<dl>
<dt class="mag_h10">〔情報セキュリティ事故の原因と流出した情報の範囲〕</dt>
<dd>B 氏の調査の結果，Web アプリに SQL インジェクションの脆弱性があることが分かった。そのことから B 氏は，攻撃者が <i class="material-icons red-text">looks_one</i> <span class="u">インターネット経由で SQL インジェクション攻撃を行い</span>，データベースに登録されているカタログ請求者の情報を不正に取得したと推測した。
</dl>
</blockquote>
<p>解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>攻撃者が，DNS に登録されているドメインの情報をインターネット経由で外部から改ざんすることによって、カタログ請求者を攻撃者の Web サイトに誘導し, カタログ請求者の Web ブラウザで不正スクリプトを実行させる。</dd>
<dt>イ</dt>
<dd>攻撃者が, インターネット経由で DB サーバに不正ログインする。 </dd>
<dt>ウ</dt>
<dd>攻撃者が, インターネット経由で Web アプリに, データベース操作の命令文を入力することによって、データベースを不正に操作する。 </dd>
<dt>エ</dt>
<dd>攻撃者が, インターネット経由で送信されている情報を盗聴する。</dd>
</dl>
</div>
<p>設問 1 は、本文中の下線 ① にある「 SQL インジェクション攻撃」とは何か、という問題です。</p>
<dl class="inline mag_h30">
<dt>ア</dt>
<dd>「DNS（ Domain Name System ）の改ざん」は、SQL インジェクション攻撃とは無関係なので × です</dd>
<dt>イ</dt>
<dd>「DB サーバに不正ログイン」は、少し SQL に関係する感じがするので △ にしておきましょう</dd>
<dt>ウ</dt>
<dd>「データベース操作の命令文を入力して不正に操作」は、正に SQL インジェクション攻撃であり ○ です</dd>
<dt>エ</dt>
<dd>「盗聴」は、SQL インジェクション攻撃とは無関係なので × です</dd>
</dl>
<p>このような消去法を行って、ウを選びます。実際の正解もウです。</p>
<h3>【設問 2 】</h3>
<div class="card-panel mag_h20">
設問 2</p>
<p>表 1 <span class="bold blank"></span> 中のに入れる対策として最も適切な答えを, 解答群の中から選べ。</p>
<table class="striped mag_h20" style="width: 90%; margin: auto">
<caption class="mag_h10 blue-grey-text">表 1 情報セキュリティ事故を踏まえたシステム面での対策案</caption>
<thead>
<tr>
<th>目的</th>
<th>対策</th>
</tr>
</thead>
<tbody>
<tr>
<td>SQL インジェクション攻撃からの防御</td>
<td>
<ul>
<li>SQL 文の組立てはプレースホルダで実装する。</li>
<li><span class="blank">a</span></li>
</td>
</tr>
<tr>
<td>情報流出リスクの低減</td>
<td>
<ul>
<li><span class="blank">b</span></li>
</td>
</tr>
<tr>
<td>情報流出の原因と流出した情報の範囲の特定</td>
<td>
<ul>
<li><span class="blank">c</span></li>
</td>
</tr>
</tbody>
</table>
</div>
<p>設問 2 は、問題に示された表 1 の空欄a 、b 、c に入る適切な対策は何か、という問題です。</p>
<p>表 1 を見ると、</p>
<p>空欄 a には「 SQL インジェクション攻撃からの防御」という目的に対する対策が入り、<br />
空欄 b には「情報流出リスクの低減」という目的に対する対策が入り、そして、<br />
空欄 c には「情報流出の原因と流出した情報の範囲の特定」という目的に対する対策が入る</p>
<p>ことがわかります。</p>
<p>それぞれの対策を、消去法で選択肢から選んでみましょう。</p>
<h4>【設問 2 の空欄 a 】</h4>
<div class="card-panel mag_h20">
a に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>Web アプリへの入力パラメタには, Web サーバ内のファイル名を直接指定できないようにする。</dd>
<dt>イ</dt>
<dd>Web サーバのメモリを直接操作するような命令を記述できないプログラム言語を用いて, Web アプリを作り直す。 </dd>
<dt>ウ</dt>
<dd>Web ページに出力する要素に対して, エスケープ処理を施す。 </dd>
<dt>エ</dt>
<dd>データベース操作の命令文の組立てを文字列連結によって行う場合は、連結する文字列にエスケープ処理を施す。</dd>
</dl>
</div>
<dl class="inline mag_h30">
<dt>ア</dt>
<dd>「ファイル名の直接指定」は、SQL インジェクション攻撃とは無関係なので × です</dd>
<dt>イ</dt>
<dd>「メモリの直接操作」も、SQL インジェクション攻撃とは無関係なので × です</dd>
<dt>ウ</dt>
<dd>「エスケープ処理」は、SQL インジェクション攻撃の対策の 1 つですが、「 Web ページに出力する要素に対して」という部分が不適切に感じられるので △ にしておきましょう</dd>
<dt>エ</dt>
<dd>「データベース操作の命令文で連結する文字列にエスケープ処理を施す」は、ウよりも SQL インジェクション攻撃の対策として適切です</dd>
</dl>
<p>このような消去法を行って、エを選びます。実際の正解もエです。</p>
<h4>【設問 2 の空欄 b 】</h4>
<div class="card-panel mag_h20">
b に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>カタログ請求者の情報の適切な保管期間を定め, カタログ請求者の同意を得た上で, 保管期間を過ぎた時点でデータベースから消去する。 </dd>
<dt>イ</dt>
<dd>カタログ請求者の情報を, カタログ送付後に直ちに, データベースから消去する。 </dd>
<dt>ウ</dt>
<dd>カタログ請求者へ送付する電子メールにディジタル署名を付ける。 </dd>
<dt>エ</dt>
<dd>データベースに登録されている情報を定期的にバックアップする。</dd>
</dl>
</div>
<dl class="inline mag_h30">
<dt>ア</dt>
<dd>「保存期間を過ぎた時点でデータベースから消去」は、情報流出リスクの低減になるので ○ です</dd>
<dt>イ</dt>
<dd>「カタログ送付後に直ちにデータベースから消去」は、情報流出リスクの低減になりますが、利用者へのサービスが著しく低下してしまい、アより不適切な感じがするので △ にしておきましょう</dd>
<dt>ウ</dt>
<dd>「電子メールにディジタル署名を付ける」は、情報流出リスクの低減と無関係なので × です</dd>
<dt>エ</dt>
<dd>「情報を定期的にバックアップ」も、情報流出リスクの低減と無関係なので × です</dd>
</dl>
<p>このような消去法を行って、アを選びます。実際の正解もアです。</p>
<h4>【設問 2 の空欄 c 】</h4>
<div class="card-panel mag_h20">
c に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>Webサイトの管理に使用する保守用 PC は, 必要なときだけ起動する。</dd>
<dt>イ</dt>
<dd>Web サーバと DB サーバにインストールするミドルウェアは、必要最低限にする。</dd>
<dt>ウ</dt>
<dd>Webサーバと DB サーバのハードディスクのデフラグメンテーションを, 定期的に行う。</dd>
<dt>エ</dt>
<dd>データベースへのアクセスログを取得する。</dd>
</div>
<dl class="inline mag_h30">
<dt>ア</dt>
<dd>「保守用 PC を必要なときだけ起動」は、情報流出の原因と範囲の特定に無関係なので × です</dd>
<dt>イ</dt>
<dd>「インストールするミドルウェアを必要最低限にする」も、情報流出の原因と範囲の特定に無関係なので × です</dd>
<dt>ウ</dt>
<dd>「デフラグメンテーション」は、この用語の意味（断片化を解消するという意味です）がわからなかったら ？ にしておきましょう</dd>
<dt>エ</dt>
<dd>「アクセスログ」は、情報流出の原因と範囲の特定に利用できる情報なので ○ です</dd>
</dl>
<p>このような消去法を行って、エを選びます。実際の正解もエです。</p>
<h3>【設問 3 】</h3>
<div class="card-panel mag_h20">
設問 3</p>
<p>B 氏は上司から，表 1 にまとめた対策案だけで十分なのか検討せよとの指示を受けた。そこで，社外のセキュリティコンサルタント会社に相談したところ， &#8221; Web アプリに脆弱性がないか調査をした方がよい&#8221; と助言され， Web アプリの一部について脆弱性の調査を依頼した。その結果，クロスサイトスクリプ ティングの脆弱性が存在することが判明した。また， &#8221; Web アプリの他の部分 にも脆弱性があることが疑われるので，Web アプリ全体の調査を行うとともに，新たな対策を講じた方がよい&#8221; と助言された。新たな対策として適切な答えを，解答群の中から選べ。
</p></div>
<p>いよいよ、最後の設問 3 です。やや長い説明文が追加されていますが、早い話が「 Web アプリの脆弱性の対策となるものは何か？」という問題です。</p>
<div class="card-panel mag_h20">
解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>DB サーバを，Web サーバと同じく，DMZ に設置する。 </dd>
<dt>イ</dt>
<dd>不正な通信を遮断するために，WAF ( Web Application Firewall ) を導入する。 </dd>
<dt>ウ</dt>
<dd>Web サーバを増設して冗長化した構成にする。 </dd>
<dt>エ</dt>
<dd>保守用 PC のログインパスワードには英数字及び記号を使用し，推測が難しい複雑なものを設定する。</dd>
</dl>
</div>
<dl class="inline mag_h30">
<dt>ア</dt>
<dd>「 DB サーバを DMZ に設置する」は、危険が増すことになるので × です</dd>
<dt>イ</dt>
<dd>「 WAF を導入する」は、正に Web アプリの脆弱性の対策となるものなので ○ です</dd>
<dt>ウ</dt>
<dd>「 Web サーバの増設」は、Web アプリの脆弱性の対策とは無関係なので × です</dd>
<dt>エ</dt>
<dd>「ログインパスワードを複雑なものにする」は、Web アプリの脆弱性の対策とは直接関係しないので × です</dd>
</dl>
<p>このような消去法を行って、イを選びます。実際の正解もイです。</p>
<p>&nbsp;</p>
<div class="divider mag_h50"></div>
<p>最後に、午後問題の効果的な学習方法をアドバイスさせていただきます。それは、<span class="bold">自分流の解説ノートを作ること</span>です。</p>
<p>もしも、自分が誰かに選択肢の選び方を説明するとしたら、どのようにするかを考えて、それをノートに書くのです。</p>
<p>「問題文と対応させれば選べる」<br />
「消去法で絞り込めばこれが残る」<br />
「常識的な判断をすればこっちだ」</p>
<p>といったことを書いてください。</p>
<p>この方法で学習すれば、徐々に午後問題を解くコツがつかめるはずです。</p>
<p>&nbsp;</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2018autumn/">こうすりゃ解ける！ 2018年度秋期 (平成30年) 基本情報技術者試験の午後問題を徹底解説</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>午後問題の歩き方 ｜ 試験1週間前にやるべき午後問題の知識チェック (チェックシート付き)</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/checkpoint_before_exam/</link>
		<pubDate>Mon, 01 Oct 2018 02:30:49 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<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=464</guid>
		<description><![CDATA[<p>この記事を読まれるということは、間もなく基本情報技術者試験の実施日ですね。 「読者の皆さんが、絶対に合格できますように！」という願いを込めて、最後のアドバイスをさせていただきます。 それは、 「ジタバタしてください」です [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/checkpoint_before_exam/">午後問題の歩き方 ｜ 試験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>この記事を読まれるということは、間もなく基本情報技術者試験の実施日ですね。</p>
<p>「読者の皆さんが、絶対に合格できますように！」という願いを込めて、最後のアドバイスをさせていただきます。</p>
<p>それは、 <span class="bold">「ジタバタしてください」です。</span> ジタバタするってどういうこと？</p>
<p>まずは、そこからお話ししましょう。</p>
<h2>あと 1 問できていれば合格だった、という人が多いのです</h2>
<p>「余裕で合格できるぜ」なんて思っている人は、たぶん、この連載を読んでいないでしょう。</p>
<p>「ギリギリかな」「もしかするとダメかも」「いやいや、たぶんダメだろう」などと思っている人が読んでいると思います。</p>
<p>そんな皆さんに、知っておいてほしいのは、 <span class="bold">実際の試験（本試験）では、自分が思っている以上に「できる！」ということです。</span></p>
<p>&nbsp;</p>
<p>「火事場の馬鹿力」という言葉をご存知ですか。</p>
<p>これは、自宅が火事になったときに、普段なら一人では持てないような大きな家具を担ぎ出した、という逸話から生まれた言葉です。</p>
<p>人間は、いざというときに、自分が思っている以上の力を出せるものなのです。</p>
<p>これを基本情報技術者試験に当てはめると、「本試験の馬鹿能力」といった感じでしょう。</p>
<p>&nbsp;</p>
<p>そのため、本試験が終わった後に、「思った以上にできた！」と感じる人が多いのです。</p>
<p>そして、 <span class="bold">「あと 1 問できていれば合格だった（残念）」という人も多い</span> のです。</p>
<p>&nbsp;</p>
<p>どうして、その1問のための勉強をしなかったのかと聞くと、「どうせダメだと思ったので、試験の 3 日ぐらい前には勉強をやめてしまっていた」とのこと。これは、実にもったいないことです。</p>
<p>だから、本試験までジタバタしてほしいのです。</p>
<p>&nbsp;</p>
<p>ジタバタとは、 <span class="bold">「こんなことをしても無駄だろうなどと考えずに、何でもいいから勉強を続けてほしい」</span> という意味です。</p>
<p>本試験の前日でも、<br />
本試験当日に試験会場に向かう電車の中でも、<br />
試験会場に入ってから試験開始時間直前までも、</p>
<p>とにかく何でもいいから勉強を続けてください。そうして、ジタバタして、つまりできる限りのことをすれば、きっとよい結果が得られます。</p>
<style>table{font-size:.85em;}</style>
<h2>ジタバタする手段（時間を取れる場合）</h2>
<p>ここから先は、ジタバタする手段をアドバイスしましょう。</p>
<p>この連載のテーマである基本情報技術者試験の午後問題は、とにかく時間との勝負です。</p>
<p>&nbsp;</p>
<p><span class="bold">配点が 12 点の問 1（必須問題）および問 2 ～ 問 7（選択問題）の過去問題</span> を練習するときには、<span class="bold">1 問あたり 15 分程度の制限時間</span>で解いてください。</p>
<p><span class="bold">配点が 20 点の問 8（必須問題）および問 9 ～ 問 13（選択問題）の過去問題</span> を練習するときには、<span class="bold">1 問あたり 30 分程度の制限時間</span>で解いてください。</p>
<h3>午後問題の制限時間の目安</h3>
<table class="striped mag_h30 responsive-width">
<thead>
<tr>
<th>問題</th>
<th>テーマ</th>
<th>必須 / 選択</th>
<th>制限時間</th>
</tr>
</thead>
<tbody>
<tr>
<td>問 1</td>
<td>情報セキュリティ</td>
<td>必須 1 問</td>
<td>15 分</td>
</tr>
<tr>
<td>問 2 ～ 問 7</td>
<td>テクノロジ系 4 問出題<br />マネジメント系 1 問出題<br />ストラテジ系 1 問出題</td>
<td>選択 2 問</td>
<td>15 分</td>
</tr>
<tr>
<td>問 8</td>
<td>アルゴリズム</td>
<td>必須 1 問</td>
<td>30 分</td>
</tr>
<tr>
<td>問 9 ～ 問 13</td>
<td>プログラミング 5 問出題</td>
<td>選択 1 問</td>
<td>30 分</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>多少あてずっぽうでも構わないので、制限時間内に、とにかく答えを選ぶ練習をしてください。</p>
<p>そして、少しでも時間が余ったなら、見直しをする練習もしてください。制限時間ギリギリまでジタバタしてください。</p>
<p>&nbsp;</p>
<p>もしも、時間が十分に取れるなら、過去問題 1 回分を制限時間の 2 時間 30 分で解く練習もしてください。</p>
<p>筆者の講師経験上、 残念な結果になってしまった受験者の多くは</p>
<p><span class="bold">「問題を解く順序を誤った」<br />
「時間配分を誤った」<br />
「途中で選択問題を変えて時間をロスした」</span></p>
<p>と言って後悔しています。</p>
<p>あらかじめ、過去問題 1 回分の練習をしておけば、これらの後悔を本試験でしないで済みます。「今さら面倒だ」などと言わずに、時間があるなら、ぜひやってください。ジタバタしてください。</p>
<p>&nbsp;</p>
<p>たとえば、以下は、平成 30 年度 春期 基本情報技術者試験の午後問題の一覧です。</p>
<p>皆さんは、どのような順序で解きますか。</p>
<p>選択問題は、どれを選択しますか</p>
<p>（実際の試験で選択する問題は、問題の一覧ではなく、設問と選択肢を見てから決めてください）。</p>
<p class="bold">「試験当日に考えればいいや」では、ダメです。きっと後悔することになります。</p>
<p>どうしても、時間が取れないなら、問題を解く順序だけでも考えておいてください。<br />
実際に問題を解く練習をしないなら、問題を選択する練習だけでもしてください。</p>
<p>「そんなことをしても無駄じゃないの」と言わずに、ジタバタするのです。</p>
<table class="striped mag_h30 responsive-width">
<thead>
<tr>
<th width="10%">問題<br />番号</th>
<th width="45%">出題分野</th>
<th width="45%">テーマ</th>
</tr>
</thead>
<tbody>
<tr>
<td>問 1</td>
<td>情報セキュリティ</td>
<td>Web サービスを利用するためのパスワードを安全に保存する方法</td>
</tr>
<tr>
<td>問 2</td>
<td>ハードウェア</td>
<td>論理回路</td>
</tr>
<tr>
<td>問 3</td>
<td>データベース</td>
<td>小学生を対象とした、ある子供会の名簿を管理する関係データベース</td>
</tr>
<tr>
<td>問 4</td>
<td>ネットワーク</td>
<td>クラウドサービス上でのシステム構築</td>
</tr>
<tr>
<td>問 5</td>
<td>ソフトウェア設計</td>
<td>健康管理システムの設計</td>
</tr>
<tr>
<td>問 6</td>
<td>プロジェクトマネジメント</td>
<td>EVM（ Earned Value Management ）手法を用いたプロジェクトの管理</td>
</tr>
<tr>
<td>問 7</td>
<td>経営戦略・企業と法務</td>
<td>収益の検討</td>
</tr>
<tr>
<td>問 8</td>
<td>データ構造及びアルゴリズム</td>
<td>ヒープの性質を利用したデータの整列</td>
</tr>
<tr>
<td>問 9</td>
<td>ソフトウェア開発（ C ）</td>
<td>簡易集計プログラム</td>
</tr>
<tr>
<td>問 10</td>
<td>ソフトウェア開発（ COBOL ）</td>
<td>注文と入金の情報の突合せ</td>
</tr>
<tr>
<td>問 11</td>
<td>ソフトウェア開発（ Java ）</td>
<td>表現式を構築するためのライブラリ作成</td>
</tr>
<tr>
<td>問 12</td>
<td>ソフトウェア開発（アセンブラ）</td>
<td>数字列の数値への変換</td>
</tr>
<tr>
<td>問 13</td>
<td>ソフトウェア開発（表計算）</td>
<td>会議室の予約システム</td>
</tr>
</tbody>
</table>
<h2>ジタバタする手段（時間が取れない場合）</h2>
<p>午後問題を解いて練習するには、それなりに時間がかかります。通勤電車の中や、会社の休み時間では、十分な時間が取れないかもしれません。</p>
<p>そんなときは、 <span class="bold">午前問題を解いてください。</span></p>
<p>午前問題なら、1 問あたり2 、3 分でできるでしょう。</p>
<p>これまでの連載でも何度か書いてきたことですが、基本情報技術者試験の出題範囲の細目を示したシラバスの内容は、午前問題と午後問題で分けられていません。</p>
<p>午前問題は、用語の意味や概念を知っているかどうかを問う問題であり、 <span class="bold">午後問題は、それらを具体的な事例（架空の事例）に当てはめたもの</span> です。</p>
<p>&nbsp;</p>
<p>したがって、 <span class="bold">午前問題の学習は、午後問題にも有効です。</span></p>
<h3>苦手な分野の午前問題を解きましょう。</h3>
<p>苦手な分野を 1 つでも多く克服すれば、得点が上がるからです。</p>
<p>たとえば、2 進数が苦手なら、2 進数に関する午前問題を数多く練習してください。セキュリティが苦手なら、セキュリティに関する午前問題を数多く練習してください。</p>
<p>&nbsp;</p>
<p>どこが苦手分野かわからないなら、以下のチェックシートをご利用ください。</p>
<p>これは、シラバスに示された主な用語を、分野ごとにまとめたものです。</p>
<p>本試験直前となった今であれば、どの分野の用語も 80 % 以上わかっていてほしいものです。80 % 未満の分野があったなら、そこが苦手分野です。</p>
<p>もしも、「うわ～、50% ぐらいしかわらない！ あせる～！」と感じたなら、好都合です。大いにジタバタできますよ。</p>
<h3>(編集部より) 基本情報技術者 午前知識 チェックシートの使い方について</h3>
<p><a class="hoverable" href="http://bit.ly/2MM4M0i"></p>
<figure><img class="hoverable mag_h30" src="../../wp-content/uploads/2018/09/checksheet_fe.png" alt="" /></figure>
<p></a></p>
<p>このチェックシートをWebから無料でダウンロードできますので、ぜひお使いください。</p>
<ul class="mag_h30">
<li><a href="http://bit.ly/2MM4M0i">基本情報技術者_午前知識_チェックシート(基本情報技術者受験ナビ) &#8211; Google Sheets</a></li>
</ul>
<p>またフィルターを有効にしていますので、ご自身が弱点だと思われる項目だけをピックアップしたり、カスタマイズしてご自由にご利用下さい!</p>
<p>&nbsp;</p>
<h4>Google Drive の マイドライブ にコピーしたい場合</h4>
<ol>
<li>この <a href="http://bit.ly/2MM4M0i">リンク</a> を開くと、Google スプレッドシート が開きます</li>
<li>ログインボタンが右上に表示されていれば、そのボタンからログインしてください</li>
<li>ファイル名「基本情報技術者_午前知識_チェックシート(基本情報技術者受験ナビ) 」の横にある「マイドライブボタン」を押してください</li>
<li>ご自身のマイドライブにコピーしたメッセージが表示されます</li>
<li>ダウンロード後、ファイルをコピー (ファイル > ファイルをコピー を選択) してお使いください</li>
</ol>
<h4>ファイルのダウンロード方法</h4>
<ol>
<li>この <a href="http://bit.ly/2MM4M0i">リンク</a> を開くと、Google スプレッドシート が開きます</li>
<li>メニューの「ファイル」&gt;「形式を指定してダウンロード」&gt;「(お好きなファイル形式)」を選択します</li>
<li>ファイルがダウンロードされます</li>
</ol>
<p>&nbsp;</p>
<p>なお、 Excel 形式のファイルをダウンロードした場合、チェックボックスが有効になりません。このためご自身でチェックボックスを作成してください。</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p>「午後問題の歩き方」の連載は、今回で最終回です。</p>
<p>過去の記事を何度でも読み返せるのが、Web 記事の便利なところです。</p>
<p>これまでの記事の中に、理解が不十分なテーマがあるなら、再度目を通しておいてください。そして、合格するために必要な知識、解法テクニック、心構え、などを、1 つでも多く身に着けてください。</p>
<p>ジタバタしてください。</p>
<p>皆さんのご健闘をお祈り申し上げます！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/checkpoint_before_exam/">午後問題の歩き方 ｜ 試験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>午後問題の歩き方 ｜ 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>
