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

<channel>
	<title>午後プログラミング言語問題 | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/tag/%e5%8d%88%e5%be%8c%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e8%a8%80%e8%aa%9e%e5%95%8f%e9%a1%8c/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Mon, 03 Aug 2026 08:40:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.29</generator>
	<item>
		<title>新しく変更される 基本情報 アルゴリズムとプログラミング（科目 B ）の難易度はどうなる？</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/check_updates_on_alogorithm/</link>
		<pubDate>Thu, 02 Jun 2022 02:12:51 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[新試験情報]]></category>
		<category><![CDATA[試験情報]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=guide&#038;p=6557</guid>
		<description><![CDATA[<p>2022 年 5 月 25 日に IPA （独立行政法人情報処理推進機構）から「基本情報技術者試験 科目B試験のサンプル問題などへの補足事項の追加について」という情報が公開され、 2023 年 4 月から試験制度が大幅に [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/check_updates_on_alogorithm/">新しく変更される 基本情報 アルゴリズムとプログラミング（科目 B ）の難易度はどうなる？</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2022 年 5 月 25 日に IPA （独立行政法人情報処理推進機構）から<a href="https://www.ipa.go.jp/news/2022/shiken/henkou20220525.html" rel="noopener" target="_blank">「基本情報技術者試験 科目B試験のサンプル問題などへの補足事項の追加について」</a>という情報が公開され、 2023 年 4 月から試験制度が大幅に変更される基本情報技術者試験の科目 B 試験（従来の午後試験に該当するもの）の内容が、より明確になりました。</p>
<p>この記事では、アルゴリズムの問題に重点を置いて、科目 B 試験の内容を説明します。</p>
<style>table{font-size:.9em;}figcaption{text-align:left;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:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}th{text-align:center;}dl.inline dd{margin-left:2em;}</style>
<h2>科目 B 試験の内容</h2>
<p>2023 年 4 月以降の基本情報技術者試験では、これまでの午前試験と午後試験が、科目 A 試験と科目 B 試験という名称に代わります。 科目 A 試験の内容は、これまでの午前試験と比べて、問題数が 80 問から 60 問に減り、試験時間が 150 分から 120 分に減るだけであり、問題の構成に大きな違いはないと思われます。</p>
<p>それに対して、科目 B 試験は、これまでの午後試験と比べて、問題の構成が大きく変わります。</p>
<p>以下は、現時点で過去問題が入手できる 2019 年秋期までの午後試験、現在実施されている 2022 年下期までの午後試験、および 2023 年 4 月以降の科目 B 試験の問題構成です。</p>
<figure class="responsive-width">
<table class="striped">
<caption>図 1　2019 年秋期までの午後試験の問題構成（試験時間 150 分）</caption>
<thead>
<tr>
<th>問題番号</th>
<th>内容</th>
<th>配点</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<td>情報セキュリティ</td>
<td>12 点</td>
</tr>
<tr>
<th>2 ～ 7</th>
<td>ソフトウェア、ハードウェア、データベース、ネットワーク、ソフトウェア設計から 4 問出題<br />マネジメント系、ストラテジ系 から 2 問出題</td>
<td> 各 12 点</td>
</tr>
<tr>
<th>8</th>
<td>データ構造およびアルゴリズム</td>
<td>20 点</td>
</tr>
<tr>
<th>9 ～ 13</th>
<td>ソフトウェア開発( C 言語、COBOL 、Java、アセンブラ、表計算から各 1 問出題)</td>
<td>20 点</td>
</tr>
</tbody>
</table><figcaption>
<i class="material-icons blue-text">info</i> 問 1 と問 8 は必須です。<br />
<i class="material-icons blue-text">info</i> 問 2 ～ 問 7 は 4 問を選択し、問 9 ～問 13 は 1 問を選択します。<br />
<i class="material-icons blue-text">info</i> 100 点満点で 60 点以上が合格です。<br />
</figcaption></figure>
<figure class="responsive-width">
<table class="striped">
<caption>図 2　2022 年下期までの午後試験の問題構成（試験時間 150 分）</caption>
<thead>
<tr>
<th>問題番号</th>
<th>内容</th>
<th>配点</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<td>情報セキュリティ</td>
<td>20 点</td>
</tr>
<tr>
<th>2 ～ 5</th>
<td>ソフトウェア・ハードウェア、データベース、ネットワーク、 ソフトウェア設計から 3 問出題<br />マネジメント系、ストラテジ系か ら 1 問出題</td>
<td> 各 15 点</td>
</tr>
<tr>
<th>6</th>
<td>データ構造およびアルゴリズム</td>
<td>25 点</td>
</tr>
<tr>
<th>7 ～ 11</th>
<td>ソフトウェア開発( C 言語、 Java 、 Python 、アセンブラ、表計算から各 1 問出題)</td>
<td>25 点</td>
</tr>
</tbody>
</table><figcaption>
    <i class="material-icons blue-text">info</i> 問 1 と問 6 は必須です。<br />
    <i class="material-icons blue-text">info</i> 問 2 ～問 5 は 2 問を選択し、問 7 ～問 11 は 1 問を選択します。<br />
    <i class="material-icons blue-text">info</i> 100 点満点で 60 点以上が合格です。<br />
  </figcaption></figure>
<figure class="responsive-width">
<table class="striped">
<caption>図 3　2023 年 4 月以降の科目 B 試験の問題構成（試験時間 150 分）</caption>
<thead>
<tr>
<th>問題番号</th>
<th>内容</th>
<th>配点</th>
</tr>
</thead>
<tbody>
<tr>
<th>1 ～ 20</th>
<td>情報セキュリティ ( 4 問)<br />アルゴリズムとプログラミング ( 16 問)</td>
<td>IRT による</td>
</tr>
</tbody>
</table><figcaption>
    <i class="material-icons blue-text">info</i> すべて必須です。<br />
    <i class="material-icons blue-text">info</i> IRT （ Item Response Theory 、項目応答理論）に基づく方式で採点（問題の難易度に差があっても不公平が生じない採点）する ので、問題ごとの配点は決められていません。<br />
    <i class="material-icons blue-text">info</i> 1000 点満点で 600 点以上が合格です。<br />
  </figcaption></figure>
<p>科目 B 試験の内容は、情報セキュリティ（ 4 問）およびアルゴリズムとプログラミング（ 16 問）だけです。 これまで、プログラミング経験のない受験者を悩ませてきたソフトウェア開発（ C 言語、 Java 、 Python 、アセンブラ、表計算）の問題はありません。 テクノロジ系、マネジメント系、ストラテジ系の選択問題もありません。</p>
<p><span class="u">これらの変更によって、従来の試験と比べて、受験対策が容易になるでしょう</span>。 学習する分野が減って明確になったからです。</p>
<h2>アルゴリズムとプログラミングのカテゴリ</h2>
<p>科目 B 試験は、全 20 問中の 16 問がアルゴリズムとプログラミングの問題です。</p>
<p>受験者は、この分野を重点的に学習する必要があります。 IPA の資料によると、アルゴリズムとプログラミングの出題範囲は、以下の 3 つのカテゴリに分けられています。</p>
<dl class="background c-round inline">
<div class="chip indigo white-text">カテゴリ</div>
<p></p>
<dt><i class="material-icons">looks_one</i></dt>
<dd>プログラムの基本要素（型、変数、配列、代入、算術演算、比較演算、論理演算、選択処理、繰返し処理、手続・関数の呼出し　など）</dd>
<dt><i class="material-icons">looks_two</i></dt>
<dd>データ構造及びアルゴリズム（再帰、スタック、キュー、木構造、グラフ、連結リスト、整列、文字列処理　など）</dd>
<dt><i class="material-icons">looks_3</i></dt>
<dd>プログラミングの諸分野への適用（数理・データサイエンス・ AI などの分野を題材としたプログラム　など）</dd>
</dl>
<p><i class="material-icons indigo-text">looks_one</i> は、プログラムの基本的な概念に関するものです。<br />
<i class="material-icons indigo-text">looks_two</i> のデータ構造及びアルゴリズムは、従来の試験のデータ構造及びアルゴリズムと同様です。<br />
<i class="material-icons indigo-text">looks_3</i> は、プログラミングの様々な分野への適用です。</p>
<p><i class="material-icons indigo-text">looks_one</i> と <i class="material-icons indigo-text">looks_3</i> があるので、分野の名称が従来の「データ構造及びアルゴリズム」ではなく、「アルゴリズムとプログラミング」とされたのでしょう。</p>
<h2>アルゴリズムとプログラミングの出題範囲</h2>
<p>アルゴリズムとプログラミングの <i class="material-icons indigo-text">looks_one</i> と <i class="material-icons indigo-text">looks_3</i> の対策として、何を学習すればよいのでしょう。 以下は、 IPA が公開している<a href="https://www.ipa.go.jp/shiken/syllabus/gmcbt80000007c4c-att/youkou_ver5_0.pdf#page=39" rel="noopener" target="_blank">試験要綱抜粋</a>に示されたアルゴリズムとプログラミングの出題範囲です。</p>
<dl class="background c-round">
<div class="chip indigo white-text">試験要綱抜粋</div>
<p></p>
<dt><i class="material-icons">looks_one</i> プログラミング全般に関すること</dt>
<dd>実装するプログラムの要求仕様（入出力，処理，データ構造，アルゴリズムほか）の把握、使用するプログラム言語の仕様に基づくプログラムの実装，既存のプログラムの解読及び変更、処理の流れや変数の変化の想定、プログラムのテスト、処理の誤りの特定（デバッグ）及び修正方法の検討 など<br />
注記 プログラム言語について、基本情報技術者試験では擬似言語を扱う。</dd>
<dt><i class="material-icons">looks_two</i> プログラムの処理の基本要素に関すること</dt>
<dd>型、変数、配列、代入、算術演算、比較演算、論理演算、選択処理、繰返し処理、手続・関数の呼出し など</dd>
<dt><i class="material-icons">looks_3</i> データ構造及びアルゴリズムに関すること</dt>
<dd>再帰、スタック、キュー、木構造、グラフ、連結リスト、整列、文字列処理 など</dd>
<dt><i class="material-icons">looks_4</i> プログラミングの諸分野の適用に関すること</dt>
<dd>数理・データサイエンス・ AI などの分野を題材としたプログラム など</dd>
</dl>
<p>これを見ると、ソフトウェア開発（ C 言語、 Java 、 Python 、アセンブラ、表計算）がなくなったとはいえ、プログラミングの経験がないと理解しにくい概念や用語が数多くあることがわかります。 <span class="u">試験に出題されなくても、受験対策として何らかのプログラミング言語を学習しておくべき</span>です。</p>
<blockquote>
<p class="grey-text">プログラム言語について、基本情報技術者試験では擬似言語を扱う」</p>
</blockquote>
<p>という注記があるので、<span class="bold">擬似言語に似た表現を使う C 言語か Java をお勧めします。</span></p>
<h2>アルゴリズムとプログラミングのサンプル問題</h2>
<p>実際にどのような形式の問題が出るのでしょう。 IPA が公開している<a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">科目 B のサンプル問題</a>を見ると、</p>
<dl class="background c-round inline">
<dt><i class="material-icons">looks_one</i></dt>
<dd>プログラムの基本要素</dd>
<dt><i class="material-icons">looks_two</i></dt>
<dd>データ構造及びアルゴリズム</dd>
<dt><i class="material-icons">looks_3</i></dt>
<dd>プログラミングの諸分野への適用</dd>
</dl>
<p>という 3 つのカテゴリの問題では、どれも擬似言語で記述されたプログラムが示されています。</p>
<p>アルゴリズムとプログラミングの対策として、擬似言語のプログラムを読み取れるようになっておく必要があります。 ただし、どの問題も、従来の午後試験と比べて、とても短いものになっているので、<span class="u">プログラムの内容を読み取ることに苦戦することはないでしょう</span>。</p>
<p>以下は、プログラムの基本要素のサンプル問題です。 午前試験の問題が、ちょっと長くなった程度のボリュームです（この問題の正解は、選択肢カです）。</p>
<div class="divider mag_h50"></div>
<div class="chip">プログラムの基本要素のサンプル問題</div>
<p id="sample1" class="bold">問 1</p>
<p>次のプログラム中の<span class="blank"></span>に入れる正しい答えを，解答群の中から選べ。</p>
<p>ある施設の入場料は，0 歳から 3 歳までは 100 円，4 歳から 9 歳までは 300 円，10 歳以上は 500 円である。関数 fee は，年齢を表す 0 以上の整数を引数として受け取り，入場料を返す。</p>
<p>〔プログラム〕</p>
<pre>○整数型: fee(整数型: age)
 整数型: ret
 if (age が 3 以下)
   ret ← 100
 elseif ( <span class="blank"></span> )
   ret ← 300
 else
   ret ← 500
 endif
 return ret</pre>
<p>解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>(age が 4 以上) and (age が 9 より小さい)</dd>
<dt>イ</dt>
<dd>(age が 4 と等しい) or (age が 9 と等しい)</dd>
<dt>ウ</dt>
<dd>(age が 4 より大きい) and (age が 9 以下)</dd>
<dt>エ</dt>
<dd>age が 4 以上</dd>
<dt>オ</dt>
<dd>age が 4 より大きい</dd>
<dt>カ</dt>
<dd>age が 9 以下</dd>
<dt>キ</dt>
<dd>age が 9 より小さい</dd>
</dl>
<div class="divider mag_h30"></div>
<p>今後は、 Web 記事でも市販書籍でも、<i class="material-icons indigo-text">looks_one</i> プログラムの基本要素、 <i class="material-icons indigo-text">looks_two</i>データ構造及びアルゴリズム、 <i class="material-icons indigo-text">looks_3</i> プログラミングの諸分野への適用という 3 つのカテゴリで、試験の出題範囲に示された概念や用語を説明し、それを具体的に擬似言語の短いプログラムにしたものが紹介されるでしょう。</p>
<p>2023 年 4 月以降に受験される方は、新しい学習教材で学習しましょう。 もちろん、この基本情報技術者試験 受験ナビでも、どんどん新しい学習教材を提供する予定です。</p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>以上、アルゴリズムにおける従来制度の試験範囲と 5 月 25 日の発表内容との違いを説明しました。 2023 年 4 月以降に基本情報技術者試験を受験される方の参考になれば幸いです。 なお、 2022 年の下期の基本情報技術者試験までは、現行の試験制度で実施されることにご注意ください。</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/check_updates_on_alogorithm/">新しく変更される 基本情報 アルゴリズムとプログラミング（科目 B ）の難易度はどうなる？</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報技術者試験が2023年4月から通年試験になり午後試験が大きく変更。プログラミング言語の選択も廃止</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/revision_system_on_202304/</link>
		<pubDate>Mon, 25 Apr 2022 05:25:57 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[新試験情報]]></category>
		<category><![CDATA[試験情報]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=guide&#038;p=6461</guid>
		<description><![CDATA[<p>先程、 IPA は 2023 年 4 月以降の試験制度に関する大きな変更を発表しました。 プレス発表　基本情報技術者試験と情報セキュリティマネジメント試験を通年試験化：IPA 独立行政法人 情報処理推進機構 これによると [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/revision_system_on_202304/">基本情報技術者試験が2023年4月から通年試験になり午後試験が大きく変更。プログラミング言語の選択も廃止</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>先程、 IPA は 2023 年 4 月以降の試験制度に関する大きな変更を発表しました。</p>
<blockquote><p><a href="https://www.ipa.go.jp/about/press/20220425.html" rel="noopener" target="_blank">プレス発表　基本情報技術者試験と情報セキュリティマネジメント試験を通年試験化：IPA 独立行政法人 情報処理推進機構</a></p></blockquote>
<p>これによると年 2 回試験だったものを通年に変更するほか、これまで難関とされてきた午後試験を簡略化し、選択分野やプログラミング言語選択を廃止、情報セキュリティとアルゴリズム中心に出題が変更されます。</p>
<h2>主な変更点</h2>
<p>主な変更点は以下のとおりです。</p>
<ul class="background c-round">
<li>上期 / 下期試験から<span class="bold">通年試験</span>へ（受験日時を選ぶ方式へ）</li>
<li>午前 / 午後試験から &#8220;科目 A 試験&#8221; / &#8220;科目 B 試験&#8221; へ変更
<ul>
<li>科目 A 試験の主題範囲は従来の午前試験と変更なし</li>
</ul>
</li>
<li>午後試験の試験範囲が大きく変更され、<span class="bold">情報セキュリティから 4 問とアルゴリズム（擬似言語）から 16 問が出題</span>へ
<ul>
<li><span class="bold">選択分野を廃止</span>（従来は、テクノロジ系 [ハードウェア、ソフトウェア、データベース、ネットワーク、ソフトウェア設計] とマネジメント系とストラテジ系から選択）</li>
<li>従来の Java や Python など<span class="bold">プログラミング言語の選択を廃止</span> <i class="material-icons">arrow_forward</i> 擬似言語に統一 </li>
</ul>
</li>
<li>試験時間、試験問題数を削減（上記の IPA プレス発表より抜粋）<br />
<table class="centered inline-block mag_h20">
<thead class="hide-on-small-only">
<tr>
<th colspan="2" width="50%" valign="middle" align="center">変更前</th>
<th colspan="2" width="50%" valign="middle" align="center">変更後</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更前</span>午前試験<br />（小問）</td>
<td>試験時間： 150 分<br />出題数： 80 問<br />解答数： 80 問</td>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更後</span>科目 A 試験<br />（小問）</td>
<td>試験時間： 90 分<br />出題数： 60 問<br />解答数： 60 問</td>
</tr>
<tr>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更前</span>午後試験<br />（大問）</td>
<td>試験時間： 150 分<br />出題数： 11 問<br />解答数： 5 問<br />※選択問題あり</td>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更後</span>科目 B 試験<br /><u><span class="bold">（小問）</span></u></td>
<td>試験時間： 100 分<br />出題数： 20 問<br />解答数： 20 問<br /><u><span class="bold">※選択問題なし（全問必須）</span></u></td>
</tr>
</tbody>
</table>
</li>
<li>合格基準を従来の 60 点以上という絶対評価から <span class="bold">IRT 方式へ変更</span>（項目ごとに点数を調整）</li>
<li>リテイクポリシー（再受験）は受験日の <span class="bold">30 日後</span>から再受験可能</li>
<li>午前試験免除制度は維持</li>
</ul>
<p>試験をコンパクトにして受験しやすいように、という意図で変更されました。 この変更に伴い、大きく難易度が変化します。</p>
<p>なお、この試験の変更は <span class="bold">2023 年 4 月 5 日</span> から開始され、<del>試験申込は 2023 年 3 月 15 日から予定されています</del> 申込がスタートしました。 詳しくは以下の記事をご覧ください。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p class="grey-text small-text"><i class="material-icons mag_rt05">info_outline</i>関連記事</p>
<p><a href="../new_system_launch/"></p>
<div class="row valign-wrapper pad_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2023/03/cover_new_system_launch-300x169.jpg" width="300" height="169" loading="lazy" ></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">2023 新制度・基本情報技術者試験 受験申込～受験～合格発表までの流れ</div>
</div>
<p></a></p>
<div class="divider mag_bt40 mag_tp10"></div>
<h2>新試験の申込方法も発表</h2>
<p>2023 年 2 月に新制度の申込方法も発表されました。</p>
<dl class="background c-round">
<span class="post-title indigo-text u">試験概要</span></p>
<dt class="chip">受験時間</dt>
<dd class="mag_bt10">
<p class="bold mag_h00">科目 A 試験と科目 B 試験を同日に受験</p>
<dl>
<dt></dt>
<dd>科目 A 試験　90 分</dd>
<dt></dt>
<dd>科目 B 試験　100 分</dd>
</dl>
</dd>
<dt class="chip">申込開始</dt>
<dd class="mag_bt10">2023 年 3 月 15 日 10 時から</dd>
<dt class="chip">試験開始</dt>
<dd class="mag_bt10">2023 年 4 月 5 日から</dd>
<dt class="chip">受験場所</dt>
<dd class="mag_bt10"><a href="https://www.jitec.ipa.go.jp/1_00topic/cbts_kaijyo_20230220.pdf" rel="noopener" target="_blank">全国 47 都道府県の CBT テストセンター</a><br />（ 2023 年 2 月 20 日時点）<br />申込時に日時と場所を選択</dd>
<dt class="chip">受験費用</dt>
<dd class="mag_bt10">7500 円（税込）</dd>
<dt class="chip">申込方法</dt>
<dd class="mag_bt10"><a href="https://itee.ipa.go.jp/ipa/user/public/entry/" rel="noopener" target="_blank">情報処理技術者試験・情報処理安全確保支援士試験 マイページ</a> より申込</dd>
<dt class="chip">合格発表</dt>
<dd class="mag_bt10">受験月の翌月中旬<br />（試験終了後、画面上で科目 A / 科目 B の科目評価点を表示）</dd>
<dt class="chip">リテイクポリシー（再受験）</dt>
<dd><span class="bold">受験翌日の 30 日後から再受験可能</span><br />（再受験申込は受験終了時刻から最長 1 日後から申込可能）</dd>
</dl>
<p>従来試験は年 2 回の受験に限定されていたものが、受験日が 30 日後から再受験可能になり、大きくハードルが下がりました。</p>
<h2>識者に聞く試験内容変更による難易度の変化</h2>
<p>情報処理技術者試験の様々な区分で参考書を執筆される三好康之さん、矢沢久雄さんに試験内容変更による難易度を解説いただきましたので、関連記事も合わせてぜひご覧ください。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../renew_fe_level/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/04/cover_renew_fe_level-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">ベストセラー対策本の著者が分析！ 新・基本情報技術者試験の難易度</div>
</div>
<p></a><br />
<a href="../check_new_course_b/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/04/cover_check_new_course_b-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">新しい基本情報技術者試験は「受験しやすく合格しやすくなる！」 サンプル問題から科目 B 問題の難易度を解説</div>
</div>
<p></a><br />
<a href="../changed4dx/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/04/cover_changed4dx-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">基本情報技術者試験はどう変わる？ 開発者向けから「デジタル人材」向け資格へ ～試験要綱とシラバス変更点（科目 B 試験など）を調査</div>
</div>
<p></a></p>
<h2>科目 A 試験 / 科目 B 試験のサンプル問題セットを解説</h2>
<p>2022 年 12 月 26 日に IPA は科目 A 試験（ 60 問） / 科目 B 試験（ 20 問）のサンプル問題セットを公開しました。</p>
<blockquote><p><a href="https://www.jitec.ipa.go.jp/1_00topic/topic_20221226.html" rel="noopener" target="_blank">IPA     独立行政法人 情報処理推進機構：基本情報技術者試験、情報セキュリティマネジメント試験の通年試験に関するお知らせ（サンプル問題セット、リテイクポリシーの公開）</a></p></blockquote>
<p>早速、サンプル問題セットの分析 / 旧制度との難易度比較 / 勉強方法を、矢沢 久雄さんに解説いただきました。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../analytics_sample_exam/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../..//wp-content/uploads/2023/01/cover_exam_a-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">科目 A 試験対策は過去問演習｜科目 A 試験・科目 B 試験サンプル問題セットからわかる傾向と対策 (1)</div>
</div>
<p></a><br />
<a href="../analytics_sample_exam/exam_b_programming/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2023/01/cover_exam_b_programming-1-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">科目 B 試験 アルゴリズムとプログラミング 対策はプログラミングを経験すること｜科目 A 試験・科目 B 試験サンプル問題セットからわかる傾向と対策 (2)</div>
</div>
<p></a><br />
<a href="../analytics_sample_exam/exam_b_sec/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../..//wp-content/uploads/2023/01/cover_exam_b_sec-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">科目 B 試験 情報セキュリティ 対策は旧午前試験の過去問で演習｜科目 A 試験・科目 B 試験サンプル問題セットからわかる傾向と対策 (3)</div>
</div>
<p></a></p>
<div class="divider mag_tp10 mag_bt40"></div>
<h2>科目 A 試験 / 科目 B 試験 対策に効く連載</h2>
<p>受験ナビでは新しい科目 A 試験 / 科目 B 試験の勉強に使える連載をスタートしています。 ぜひご覧ください。</p>
<h3>科目 A 試験対策の連載<br /> 「基本情報ではじめる IT の勉強」</h3>
<p>試験の受験層がリスキリングして IT をはじめて学ぶ方も増えたため、受験ナビでは科目 A 試験の各分野ごとにあらましや必要性、用語、過去問などを紹介する連載をスタートしています。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../../learn_tech/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/08/cover_computer_science4beginners-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">基本情報ではじめる IT の勉強</div>
</div>
<p></a></p>
<div class="divider mag_tp10 mag_bt40"></div>
<h3>科目 B 試験 アルゴリズムとプログラミング 対策の連載<br /> 「新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門」</h3>
<p>科目 B 試験では出題される 20 問のうち、 16 問出題されるのがアルゴリズムとプログラミングです。 はじめてアルゴリズムとプログラミングを学ぶ方向けの連載で、ぜひプログラミングデビューしましょう。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../../similar_programming/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2023/01/about_programming_algorithm_cover-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門</div>
</div>
<p></a></p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/revision_system_on_202304/">基本情報技術者試験が2023年4月から通年試験になり午後試験が大きく変更。プログラミング言語の選択も廃止</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/learn_python/practice/</link>
		<pubDate>Sun, 16 Jan 2022 23:30:32 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<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=learn_python&#038;p=6354</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 前回までで、試験の出題範囲をほぼ網羅して学習できました。最終回 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/">基本情報ではじめる 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>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>前回までで、試験の出題範囲をほぼ網羅して学習できました。最終回となる今回は、総仕上げとして、試験問題レベルの Python のプログラムにチャレンジしてみましょう。</p>
<div class="background red-text small-text pink-text">
<i class="material-icons">report</i>現時点で、 Python の過去問題は公開されていません。この記事に示した問題は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_2/2017h29a_fe_pm_qs.pdf#page=46" rel="noopener" target="_blank">平成 29 年度 秋期 の C 言語</a>の問題の一部を Python に置き換えたものです。
</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!important;}@media screen and (max-width:600px){dd{margin-left:1em}ol.background{padding-left:3em!important}}</style>
<h2>問題</h2>
<p>　次の Python プログラムの説明及びプログラムを読んで、設問に答えよ。</p>
<p>〔問題〕</p>
<p>　文字列の中から、回文（ palindrome ）を探して表示する関数 find_palindrome である。回文とは、先頭から読んだ文字の並びと末尾から読んだ文字の並びが一致する文字の並びのことである。ただし、ここでは次の条件を満たすものとする。</p>
<ul class="background c-round">
<li>文字列は英字（ A ～ Z、 a ～ z ）、数字（ 0 ～ 9 ）、記号（ !&#8221;#%&#038;'()*+、-./:+&lt;=>?[]^_{|} ）及び空白文字から成る。</li>
<li>文字の並びを読むとき、英字の大文字と小文字は区別しない。</li>
<li>文字の並びを読むとき、記号及び空白文字は無視する。</li>
<li>回文は英数字で始まり英数字で終わる。ただし、英数字 1 文字は回文ではない。</li>
</ul>
<p>　本問のプログラムが表示する回文の例を表 1 に示す。 No.1 で示す文字列において、文字の並び bc0cb は回文である。 c0c も回文であるが、本問のプログラムでは、文字列の先頭に最も近い文字から始まるものを表示する。また、 No.2 で示す文字列において、英字の大文字と小文字は区別しないので、文字の並び Bc0Cb は回文である。さらに、 No.3 で示す文字列において、英字の大文字と小文字を区別せず、かつ、記号及び空白文字を無視するので、文字の並び B!c0Cb は回文である。 No.4 で示す文字列において、文字列の先頭に最も近い b を先頭文字とする文字の並び bc0cb と bc0cb1bc0cb は、いずれも回文である。しかし、本問のプログラムでは、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。</p>
<table class="centered responsive-width">
<caption>表 1　本問のプログラムが表示する回文の例</caption>
<thead>
<tr>
<th>No.</th>
<th>文字列</th>
<th>表示する回文</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>abc0cbe</td>
<td>bc0cb</td>
</tr>
<tr>
<td>2</td>
<td>ABc0CbE</td>
<td>Bc0Cb</td>
</tr>
<tr>
<td>3</td>
<td>AB!c0 CbE</td>
<td>B!c0 Cb</td>
</tr>
<tr>
<td>4</td>
<td>abc0cb1bc0cbe</td>
<td>bc0cb</td>
</tr>
<tbody>
</table>
<ol class="mag_h30">
<li>関数 find_palindrome の仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字列 text の中から、回文を探して表示する。文字列 text の中に複数の回文がある場合、先頭文字位置が文字列の先頭に最も近いものを表示する。さらに、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。</dd>
<dt class="chip">引数</dt>
<dd>text	文字列</dd>
</dl>
<p>　関数 find_palindrome は、関数 is_palindrome 及び関数 find_char を使用する。
</li>
<li>関数 is_palindrome の仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字の並び chars の idx 以降が回文かどうかを判定する。</dd>
<dt class="chip">引数</dt>
<dd>chars	文字の並び</dd>
<dd>idx	チェックする先頭位置の添え字</dd>
<dd>size	チェックする文字数</dd>
<dt class="chip">返却値</dt>
<dd>回文の場合は 1</dd>
<dd>回文でない場合は 0</dd>
</dl>
</li>
<li>関数find_charの仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字列 st の idx 以降で、文字 ch が最初に現れる位置を求める。ただし、英字の大文字と小文字は区別しない。</dd>
<dt class="chip">引数</dt>
<dd>st	文字列</dd>
<dd>idx	チェックする先頭位置の添え字</dd>
<dd>ch	文字</dd>
<dt class="chip">返却値</dt>
<dd>文字 ch が現れる場合は、それが最初に現れる位置の添え字</dd>
<dd>文字 ch が現れない場合は、 -1</dd>
</dl>
</li>
<li>プログラム中で使用している組み込み関数やメソッドの概要は、次のとおりである。
<dl class="background c-round">
<dt>s.isalnum()</dt>
<dd>文字列sの内容がすべて英数字のとき、Trueを返し、それ以外のとき、Falseを返す。</dd>
<dt>s.lower()</dt>
<dd>文字列sの中にあるすべての英大文字を、英小文字に変換した文字列を返す。</dd>
<dt>print(s, end = &#8220;&#8221;)</dt>
<dd>文字列sを表示して、改行しない。</dd>
</dl>
</li>
</ol>
<p>〔プログラム〕</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<pre class="line-numbers"><code class="language-py">def find_palindrome(text):
    for i in range(len(text)):
        if not text[i].isalnum():
            continue
        # ithは、文字列textの第i文字の添え字
        ith = i
        # hitは、第i文字と一致した文字の添え字
        hit = find_char(text, ith + 1, text[ith]) 
        while hit != -1:
            # psizeは、文字の並びの長さ
            psize = "［　　a　　］"
            if is_palindrome(text, ith, psize):
                while ith < hit + 1:
                    print(text[ith], end = "")
                    ith += 1
                print()
                return
            hit = find_char(text, hit + 1, text[ith])

def is_palindrome(chars, idx, size):
    l = idx
    r = idx + size - 1
    while l < r:
        while not chars[l].isalnum():
            l += 1
        while not chars[r].isalnum():
            r -= 1
        if "［　　b　　］":
            return 0
        l += 1
        r -= 1
    return 1

def find_char(st, idx, ch):
    for i in range(idx, len(st)):
        if "［　　c　　］":
          return i
    return -1</code></pre>
<p class="bold">設問</p>
<p>プログラム中の<span class="bold mag_w05">［　　　　　］</span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群</p>
<pre><code class="language-py">ア　i			
イ　ith			
ウ　ith + 1
エ　hit - ith		
オ　hit - ith + 1</code></pre>
<p>b に関する解答群</p>
<pre><code class="language-py">ア　l == r
イ　1 != r
ウ　chars[l] == chars[r]
エ　chars[l] != chars[r]
オ　chars[l].lower() == chars[r].lower()
カ　chars[l].lower() != chars[r].lower()</code></pre>
<p>c に関する解答群</p>
<pre><code class="language-py">ア　ch == st[i]
イ　ch != st[i]
ウ　ch.lower() == st[i].lower()
エ　ch.lower() != st[i].lower()
オ　(ch == st[i].lower()) or (ch.lower() == st[i])
カ　(ch == st[i].lower()) and (ch.lower() == st[i])</code></pre>
<div class="divider mag_h40"></div>
<h2>解答と解説</h2>
<h3>空欄 a の解説</h3>
<p>表 1 に示された「 abc0cbe 」という文字列から「 bc0cb 」という回文が表示される例を想定して、関数 find_palindrome の処理の流れを追いかけてみましょう。</p>
<ol class="background c-round">
<li>6 行目で、「 abc0cbe 」の先頭の「 a 」の添え字が変数 ith に格納されます。</li>
<li>8 行目で、「 abc0cbe 」の先頭から 1 つ先を起点とした「 bc0cbe 」という文字列から先頭の「 a 」と、同じ文字があるかどうかが関数 find_char で検索されます。<br />この場合は、見つからないので、関数 find_char の戻り値は -1 になり、それ以降にある while 文の処理は行われず、次の文字の処理に進みます。</li>
<li>6 行目で、「 abc0cbe 」の 2 文字目の「 b 」の添え字が変数 ith に格納されます。</li>
<li>8 行目で、「 abc0cbe 」の 2 文字目から 1 つ先を起点とした「 c0cbe 」という文字列から 2 文字目の「 b 」と、同じ文字があるかどうかが関数 find_char で検索されます。</br>この場合は、「 b 」が見つかり、関数 find_char の戻り値は見つかった「 b 」の位置の添え字になり、それ以降の while 文の処理に入ります。</li>
<li>11 行目で変数 psize に空欄 a の値を代入します。
<li>12 行目で変数 psize を関数 is_palindrome の第 3 引数に指定しています。関数の仕様を見ると、第 3 引数は、チェックする文字数です。<br />ここでは、「 abc0cbe 」の「 bc0cb 」という文字の並びが回文かどうかをチェックします。</li>
</ol>
<p>この文字の並びの長さは、「 bc0cb 」の先頭の「 b 」を指す添え字 ith と、末尾の「 b 」を指す添え字 hit の差、プラス 1 で求められます。したがって、空欄 a は、<code class="language-py pad_w05 mag_w05">hit - ith + 1</code>（選択肢オ）です。</p>
<h3>空欄 b の解説</h3>
<p>関数 is_palindrome では、文字列 chars を左端からたどる l と右端からたどる r を 1 つずつ変化させる while 文で、文字列 chars が回文かどうかをチェックしています。</p>
<p>左端からたどった文字は<code class="language-py pad_w05 mag_w05">chars[l]</code>であり、右端からたどった文字は<code class="language-py pad_w05 mag_w05">chars[r]</code>です。</p>
<p>&nbsp;</p>
<p>空欄 b には、関数 is_palindrome が戻り値として 0 を返す条件が入ります。関数 is_palindrome の仕様を見ると、戻り値として 0 を返すのは、文字列 chars が回文でない場合です。</p>
<p>大文字と小文字が違っても同じとみなすので、空欄 b の条件は、小文字に統一して等しくないことをチェックする<code class="language-py pad_w05 mag_w05">chars[l].lower() != chars[r].lower()</code>（選択肢カ）です。</p>
<h3>空欄 c の解説</h3>
<p>関数 find_char は、引数で指定された文字列 st から文字 ch を見つけて、最初に見つかった位置の添え字を返します。</p>
<p>空欄 c は、<code class="language-py pad_w05 mag_w05">st[i]</code>の添え字を返す処理の条件です。大文字と小文字が違っても同じとみなすので、<code class="language-py pad_w05 mag_w05">ch.lower() == st[i].lower()</code>（選択肢ウ）です。</p>
<p>&nbsp;</p>
<div class="chip">解答</div>
<p>空欄 a ― オ<br />
空欄 b ― カ<br />
空欄 c ― ウ</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>いかがでしたか。 Python のプログラムを読み取って、問題を解けましたか？</p>
<p>もしも、プログラミングの学習を始めたばかりなら、スラスラできなくても当然です。同じ問題を、何度も繰り返し練習してください。時間はかかるかもしれませんが、必ずできるようになります。</p>
<p>この連載は、今回で最終回になります。これまで連載をお読みいただいた皆様に、この場をお借りして、厚く御礼申し上げます。</p>
<p>またどこかでお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/">基本情報ではじめる 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 (9) import 文とライブラリの活用</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/import/</link>
		<pubDate>Thu, 09 Dec 2021 06:30:25 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6292</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 import 文とライブラリの活用です。この [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/import/">基本情報ではじめる Python (9) import 文とライブラリの活用</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 <span class="bold">import 文とライブラリの活用</span>です。このテーマをマスターすれば、試験の出題範囲をほぼ網羅できたことになります。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<p class="title blue-text bold">（10）ライブラリの活用</p>
<p>　問題解決のために適した代表的な標準ライブラリ又は外部ライブラリを利用し，プログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>import 文，モジュール，パッケージ など
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_2.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.2</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}blockquote > p {color:#607d8b;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;scrollbar-width:thin;}.chip{height:auto;line-height:1.5;padding:6px 12px;}</style>
<h2>モジュールと import 文</h2>
<p>Python には、様々なプログラムから利用できる関数やクラスが数多く用意されていて、それらを<span class="bold">「ライブラリ」</span>と呼びます。</p>
<p>それらの中で、一般的な Python の開発環境をインストールすれば、すぐに利用できるものを<span class="u">「標準ライブラリ」</span>と呼び、必要に応じて後から追加して利用するものを<span class="u">「外部ライブラリ」</span>と呼びます。</p>
<p>ライブラリの実体は、関数やクラスなどが記述されたファイルです。このようなファイルを<span class="bold">「モジュール」</span>と呼びます。</p>
<p>&nbsp;</p>
<p><a href="../library_functions/">前回（第 8 回）で説明した「組み込み関数」</a>は、何の設定もせずに利用できましたが、<span class="u">標準ライブラリや外部ライブラリを利用するには、 import 文を使ってモジュールをインポート</span>する（モジュールを利用することを設定する）必要があります。</p>
<p>標準ライブラリである math モジュールを例にして、 import 文の使い方を説明しましょう。 math モジュールは、数学関連の様々な関数を提供します。ここでは、引数の平方根を返す sqrt 関数を使います。</p>
<p>&nbsp;</p>
<p>math モジュールを利用するには、プログラムの先頭で <code class="language-py">import math</code> を実行します。これによって、 <code class="language-py">math.関数名(引数)</code> という構文で、 math モジュールの関数を呼び出せます。</p>
<p>図 1 では、 <code class="language-py">import math</code> を実行してから、 <code class="language-py">math.sqrt(2)</code> を呼び出して、 2 の平方根を求めています。</p>
<p>この記事では、 Python の対話モードでプログラムを実行します。説明のために、プログラムの中にコメントを記入した部分がありますが、実際にプログラムを作って動作を確認するときには、これらのコメントは不要です。</p>
<div class="background blue-grey-text small-text mag_h30 c-round">
<i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか [ Shift + Enter ] で実行できます
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 1 　import 文の使い方<br />
</figcaption><pre><code class="language-py">>>> import math     # mathモジュールをインポートする
>>> math.sqrt(2)  	# mathモジュールのsqrt関数を呼び出す
1.4142135623730951  # 関数の戻り値が表示される</code></pre>
</figure>
<h2>import 文のバリエーション</h2>
<p>import 文の使い方には、いくつかのバリエーションがあります。先ほどの例では、 <code class="language-py">import math</code> で math モジュールをインポートして、 <code class="language-py">math.sqrt(2)</code> という構文で sqrt 関数を呼び出しました。</p>
<p>もしも、関数名の前に「 math 」を付けることを面倒だと感じたら、</p>
<pre><code class="language-py">from math import sqrt</code></pre>
<p>というバリエーションを使ってください。これは、</p>
<blockquote><p>math モジュールから sqrt をインポートする</p></blockquote>
<p>という意味です。これによって、関数名の前に「 math 」を付けずに <code class="language-py">sqrt(2)</code> という構文で sqrt 関数を呼び出せます。</p>
<p>図 2 に例を示します。</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 2 　import 文の使い方のバリエーション（その 1 ）<br />
</figcaption><pre><code class="language-py">>>> from math import sqrt # mathモジュールからsqrt関数をインポートする
>>> sqrt(2)               # sqrt関数を呼び出す
1.4142135623730951        # 関数の戻り値が表示される</code></pre>
</figure>
<p>モジュールの中には、「 matplotlib.pyplot 」のように長い名前になっているものもあります。もしも、長いモジュール名を使うことを面倒だと感じたら、</p>
<pre><code class="language-py">import matplotlib.pyplot as plt</code></pre>
<p>というバリエーションを使ってください。これは、</p>
<blockquote><p>matplotlib.pyplot モジュールをインポートして plt という別名を付ける</p></blockquote>
<p>という意味です。これによって、 matplotlib.pyplot という長いモジュール名を、 plt という短い別名で使えるようになります。プログラムの例は、この記事の最後に示します。</p>
<h2>パッケージ</h2>
<p>ここで、再び「 matplotlib.pyplot 」というモジュール名に注目してください。</p>
<p>「 matplotlib 」と「 pyplot 」が、ドット（ . ）でつながれています。これは、</p>
<blockquote><p>matplotlib パッケージの pyplot モジュール</p></blockquote>
<p>という意味です。<span class="u"><span class="bold">「パッケージ」</span>とは、複数のモジュールをまとめたもの</span>です。 Windows では、パッケージは、複数のファイル（モジュール）を格納したディレクトリです。</p>
<p>ライブラリの中には、パッケージの形で提供されるものもあります。これは、複数のモジュールを、まとめて提供するということです。</p>
<p>matplotlib パッケージは、グラフの描画に関する複数のモジュールを、まとめて提供します。図 3 に示したように、 matplotlib というディレクトリの中に、 pyplot.py, quiver.py, rcsetup.py など、複数のファイルがあるのです（それぞれのモジュールは、拡張子が .py となったファイルですが、インポートするときには、拡張子を省略します）。</p>
<figure><figcaption>図 3　 Windows では、パッケージはディレクトリであり、モジュールはファイルである</figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/12/path_module.jpg" loading="lazy"><br />
</figure>
<p>パッケージの中にあるモジュールをインポートするときには、 <code class="language-py">matplotlib.pyplot</code> のように「パッケージ名.モジュール名」という構文でモジュールを指定します。</p>
<h2>matplotlib.pyplot を利用したサンプルプログラム</h2>
<p>基本情報技術者試験のシラバスには、標準ライブラリや外部ライブラリの具体的な名前が明記されていません。したがって、<span class="u">何らかのライブラリを利用したプログラムが出題される場合には、モジュールの機能の説明が示されるはず</span>です。</p>
<p>情報処理推進機構 ( IPA ) が公開している <a href="https://www.jitec.ipa.go.jp/1_13download/fe_python_sample.pdf" rel="noopener" target="_blank">Python のサンプル問題</a>（現時点で、公式に公開されているのは、このサンプル問題だけです）では、 matplotlib.pyplot モジュールを利用したプログラムが出題されています。</p>
<p>モジュールの機能は、図 4 に示したようにコメントとして示されています。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 4 　サンプル問題では、ライブラリの機能をコメントで示している<br />
</figcaption><pre><code class="language-py">import matplotlib.pyplot as plt  # グラフ描画の外部ライブラリ
　：
plt.xlim(-320, 320)  # x軸の表示範囲を設定
plt.ylim(-240, 240)  # y軸の表示範囲を設定
　：
# (x1, y1)と(x2, y2)を結ぶ線分を描画
plt.plot([x1, x2], [y1, y2], color='black', linewidth=2)
　：
# 描画結果を表示
plt.show()</code></pre><figcaption>IPA が公開した <a href="https://www.jitec.ipa.go.jp/1_13download/fe_python_sample.pdf" rel="noopener" target="_blank">基本情報技術者試験（FE）午後試験 Python のサンプル問題</a><i class="material-icons red-text mag_w05">picture_as_pdf</i>より</figcaption></figure>
<p>実際に、 matplotlib.pyplot モジュールを使ってみましょう。</p>
<p>図 5 では、</p>
<p>(-300, -200),<br />
(0, 200),<br />
(300, -200),<br />
(-300, -200),</p>
<p>という 4 つの点を結んだ線分で、三角形を描画しています（ここでは、サンプル問題のプログラムとは違うコメントを記入しています）。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 5 　atplotlib.pyplot モジュールを利用したプログラム<br />
</figcaption><pre><code class="language-py"># matplotlib.pyplotをインポートしてpltという別名をつける
import matplotlib.pyplot as plt

# グラフのx軸とy軸の表示範囲を設定する
plt.xlim(-320, 320)
plt.ylim(-240, 240)

# x座標のリストとy座標のリストの点を結ぶ線分を描画する（画面には表示されない）
plt.plot([-300, 0, 300, -300], [-200, 200, -200, -200], color='black', linewidth=2)

# 描画の内容を画面に表示する
plt.show()</code></pre>
</figure>
<p>plt.plot の 1 つ目の引数には、点の x 座標のリストを指定し、 2 つ目の引数には点の y 座標のリストを指定します。</p>
<p>図 5 のプログラムの実行結果の例を図 6 に示します。</p>
<figure><figcaption></figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/12/output_figure_triangle.png" width="563" height="413" loading="lazy"><br />
</figure>
<p>matplotlib.pyplot モジュールを利用すると、このように短いプログラムでビジュアルにグラフの描画ができます。実際の試験問題でも、 matplotlib.pyplot モジュールが使われる可能性は、大いにあるでしょう。</p>
<div class="divider mag_h50"></div>
<p>第 1 回から第 9 回（今回）までの連載で、基本情報技術者試験の Python の出題範囲をほぼ網羅しました。</p>
<p>次回は、<span class="u">総仕上げとして、試験問題レベルの Python のプログラムを読むことにチャレンジ</span>します。もしも、理解が不十分なテーマがあれば、これまでの記事を読み直して復習しておいてください。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/import/">基本情報ではじめる Python (9) import 文とライブラリの活用</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 (8) 組み込み関数</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/library_functions/</link>
		<pubDate>Sat, 20 Nov 2021 02:30:06 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6252</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 Python の組み込み関数です。簡単なサン [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/library_functions/">基本情報ではじめる Python (8) 組み込み関数</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 <span class="bold">Python の組み込み関数</span>です。簡単なサンプルプログラムの動作を確認することで、試験のシラバスに示された組み込み関数の種類と機能を、一気に理解しましょう。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<p class="title blue-text bold">（6）組込み関数</p>
<p>　型、リスト、文字列の入出力、ファイル操作などに関する組込み関数の利用場面を理解し、プログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>int, float, str, list, range, enumerate, zip, len, print, input, open  など
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_2.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.2</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}table{font-size:.85em;}td{vertical-align:top;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;scrollbar-width:thin;}@media screen and (min-width:601px){.responsive-width{width:60%}}</style>
<h2>Python の組み込み関数の種類</h2>
<p>Python のプログラミング環境には、膨大な数の関数が用意されています。それらの中で、<span class="u">インポート（ import 文を使って使用を宣言すること）なしですぐに使える関数を<span class="bold">「組み込み関数」</span>と呼びます</span>。</p>
<p>図 1 は、 Python の組み込み関数の一覧です。赤色で示した関数は、試験のシラバスに示されているものです。これらを一気に理解することが、今回のテーマです。</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、表は横スクロールすると全文をご覧になれます
</div>
<div class="table-container">
<table>
<tr>
<td><span class="bold">A</span><br />
abs()<br />
aiter()<br />
all()<br />
any()<br />
anext()<br />
ascii()</p>
<p><span class="bold">B</span><br />
bin()<br />
bool()<br />
breakpoint()<br />
bytearray()<br />
bytes()</p>
<p><span class="bold">C</span><br />
callable()<br />
chr()<br />
classmethod()<br />
compile()<br />
complex()</p>
<p><span class="bold">D</span><br />
delattr()<br />
dict()<br />
dir()<br />
divmod()</td>
<td><span class="bold">E</span><br />
<span class="red-text">enumerate()</span><br />
eval()<br />
exec()</p>
<p><span class="bold">F</span><br />
filter()<br />
<span class="red-text">float()</span><br />
format()<br />
frozenset()</p>
<p><span class="bold">G</span><br />
getattr()<br />
globals()</p>
<p><span class="bold">H</span><br />
hasattr()<br />
hash()<br />
help()<br />
hex()</p>
<p><span class="bold">I</span><br />
id()<br />
<span class="red-text">input()</span><br />
<span class="red-text">int()</span><br />
isinstance()<br />
issubclass()<br />
iter()</td>
<td><span class="bold">L</span><br />
<span class="red-text">len()</span><br />
<span class="red-text">list()</span><br />
locals()</p>
<p><span class="bold">M</span><br />
map()<br />
max()<br />
memoryview()<br />
min()</p>
<p><span class="bold">N</span><br />
next()</p>
<p><span class="bold">O</span><br />
object()<br />
oct()<br />
<span class="red-text">open()</span><br />
ord()</p>
<p><span class="bold">P</span><br />
pow()<br />
<span class="red-text">print()</span><br />
property()</td>
<td><span class="bold">R</span><br />
<span class="red-text">range()</span><br />
repr()<br />
reversed()<br />
round()</p>
<p><span class="bold">S</span><br />
set()<br />
setattr()<br />
slice()<br />
sorted()<br />
staticmethod()<br />
<span class="red-text">str()</span><br />
sum()<br />
super()</p>
<p><span class="bold">T</span><br />
tuple()<br />
type()</p>
<p><span class="bold">V</span><br />
vars()</p>
<p><span class="bold">Z</span><br />
<span class="red-text">zip()</span></p>
<p>その他<br />
__import__()</td>
</tr>
</table>
</div>
<p>組み込み関数の機能を理解するには、実際に使ってみることが一番です。</p>
<p>これ以降では、 Python の対話モードで、組み込み関数を使った簡単なサンプルプログラムを動作させます。プログラムの動作結果を見て、関数の名前（名前の意味も説明します）と機能を対応付けてください。</p>
<p>プログラムには、説明の都合でコメント（ # で始まる文字列）を付けている部分がありますが、実際にプログラムを作って動作させるときには、これらのコメントは不要です。</p>
<div class="background blue-grey-text small-text mag_h30 c-round">
<i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか [ Shift + Enter ] で実行できます
</div>
<h2>int 関数</h2>
<p>int 関数は、 integer （整数）という意味です。 int 関数は、引数で指定された数字列（文字列）を整数に変換して返します。</p>
<p>図 2 は、変数 s1 と s2 に適当な数字列を代入し、それらを int 関数で整数に変換して加算するプログラムです。</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 2 　数字列を整数に変換して加算するプログラム<br />
</figcaption><pre><code class="language-py">>>> s1 = "123"		    # 変数s1に適当な数字列を代入する
>>> s2 = "456"		    # 変数s2に適当な数字列を代入する
>>> int(s1) + int(s2)	# 変数s1とs2の内容を整数に変換して加算する
579                     # 加算結果が得られる</code></pre>
</figure>
<p>このように、 int 関数は、数字列を整数に変換して演算する場面で、よく使われます。</p>
<h2>float 関数</h2>
<p>float 関数は、 floating point number （浮動小数点数）という意味です。 float 関数は、引数で指定された数字列（文字列）を浮動小数点数に変換して返します。</p>
<p>図 3 は、変数 s1 と s2 に適当な数字列を代入し、それらを float 関数で浮動小数点数に変換して加算するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 3 　数字列を浮動小数点数に変換して加算するプログラム<br />
</figcaption><pre><code class="language-py">>>> s1 = "1.23"             # 変数s1に適当な数字列を代入する
>>> s2 = "4.56"             # 変数s2に適当な数字列を代入する
>>> float(s1) + float(s2)   # 変数s1とs2の内容を浮動小数点数に変換して加算する
5.789999999999999           # 加算結果が得られる</code></pre>
</figure>
<p>このように、 float 関数は、数字列を浮動小数点数に変換して演算する場面で、よく使われます。</p>
<h2>str 関数</h2>
<p>str 関数は、 string （文字列）という意味です。 str 関数は、引数で指定されたオブジェクトを文字列に変換して返します。</p>
<p>図 4 は、変数 pi に代入された 3.14 という数値を str 関数で文字列に変換し、 &#8220;円周率 = &#8221; という文字列に連結するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 4 　数値を文字列に変換して他の文字列に連結するプログラム<br />
</figcaption><pre><code class="language-py">>>> pi = 3.14               # 変数piに数値を代入する
>>> "円周率 = " + str(pi)	# 数値を文字列に変換して連結する
'円周率 = 3.14'             # 連結した結果が表示される</code></pre>
</figure>
<p>このように、 str 関数は、数値を文字列に変換して他の文字列に連結する場面で、よく使われます。</p>
<h2>list 関数</h2>
<p>list 関数は、 list （ <span class="u">Python のリストとは C 言語や Java などの配列に相当するもの</span>）という意味です。 list 関数は、引数で指定されたオブジェクトをリストに変換して返します。</p>
<p>図 5 は、 &#8220;hello&#8221; という文字列を list 関数でリストに変換するプログラムです。文字列を構成する 1 つの文字が要素となったリストが得られます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 5 　文字列をリストに変換するプログラム<br />
</figcaption><pre><code class="language-py">>>> list("hello")		    # 文字列をリストに変換する
['h', 'e', 'l', 'l', 'o']	# リストの内容が表示される</code></pre>
</figure>
<h2>range 関数</h2>
<p>range 関数は、 range（範囲）という意味です。 range 関数は、<span class="u">主に for 文の in の後で使われ、引数で指定された範囲の整数列を順番に返します</span>。</p>
<p>図 6 は、 range 関数を使って得られた 0 から 10 未満までの整数列を表示するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 6 　0 から 10 未満までの整数列を表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> for i in range(0, 10):	# for文のinの後でrange関数を使う
...     print(i)            # 変数iに得られた値を表示する
...                         # ［Enter］キーだけを押す
0                           # 0から10未満の値が表示される
1
2
3
4
5
6
7
8
9</code></pre>
</figure>
<h2>enumerate 関数</h2>
<p>enumerate 関数は、 enumerate （数え上げる、列挙する）という意味です。</p>
<p>enumerate 関数は、引数で指定されたイテラブル（リスト、タプル、文字列、など）の要素に、<span class="u">添字を割り当てます</span>。 for 文の in の後でenumerate 関数を使うと、添字と要素が順番に取り出されます。</p>
<p>図 7 は、 <code class="language-py">["apple", "orange", "grape"]</code> というリストの要素に添字を割り当てた結果を表示するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 7 　文字列のリストの要素に添字を割り当てた結果を表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> for i, s in enumerate(["apple", "orange", "grape"]):　# for文のinの後でenumerate関数を使う
...     print(i, s)	                                      # 変数iに得られた添字と、変数sに得られた要素を表示する
...                                                       # ［Enter］キーだけを押す
0 apple                                                   # 添字と要素が表示される
1 orange
2 grape</code></pre>
</figure>
<h2>zip 関数</h2>
<p>zip 関数は、 zip （ジッパーで閉じる）という意味です。</p>
<p>zip 関数は、引数で指定された<span class="u">複数のイテラブル（リスト、タプル、文字列、など）から要素を取り出し、それらをタプルにまとめます（タプルに閉じます）</span>。 for 文の in の後で zip 関数を使うと、 zip 関数の引数に指定された複数のイテラブルから順番に要素が取り出され、それらがタプルに連結されます。</p>
<p>図 8 は、 <code class="language-py">["apple", "orange", "grape"]</code> および <code class="language-py">[100, 200, 300]</code> という 2 つのリストの要素をタプルに閉じて取り出すプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 8 　 2 つのリストの要素をタプルに閉じて取り出すプログラム<br />
</figcaption><pre><code class="language-py">>>> for t in zip(["apple", "orange", "grape"], [100, 200, 300]):  # for文のinの後でzip関数を使う
...     print(t)                                                  # タプルに閉じられた結果を表示する
...                                                               # ［Ener］キーだけを押す
('apple', 100)                                                    # タプルに閉じられた要素が表示される
('orange', 200)
('grape', 300)</code></pre>
</figure>
<h2>len 関数</h2>
<p>len 関数は、 length （長さ）という意味です。 len 関数は、引数で指定されたイテラブル（リスト、タプル、文字列、など）の<span class="u">要素数を返します</span>。</p>
<p>図 9 は、リストと文字列の要素数を表示するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 9 　リストと文字列の要素数を表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> len([100, 200, 300])	# リストの要素数を得る
3                           # 要素数が表示される
>>> len("hello")	      	# 文字列の要素数を得る
5                           # 要素数が表示される</code></pre>
</figure>
<h2>print 関数</h2>
<p>print 関数は、 print （印刷する）という意味です。 print 関数は、引数で指定されたデータを画面に表示します。</p>
<p>引数には、カンマで区切って複数のデータを指定することもできます。<br />
引数 sep に、データを区切る文字（デフォルトは、空白文字）を指定することもできます。<br />
引数 end に、末尾に表示する文字（デフォルトは、改行文字）を指定することもできます。</p>
<p>図 10 は、変数 a, b, c の値をカンマで区切って画面に表示するプログラムです。 Python の対話モードでは、 print 関数を使わなくても、変数の値を入力して ［Enter］ キーを押すだけで、変数の値が画面に表示されます。 print 関数は、主に Python の実行モードで使われます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 10 　変数 a の値を画面に表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> a = 123			            # 変数aに適当な値を代入する
>>> b = 456			            # 変数bに適当な値を代入する
>>> c = 789			            # 変数cに適当な値を代入する
>>> print(a, b, c, sep=",")	    # 区切り文字にカンマを指定する
123,456,789			            # 変数a、b、cの値がカンマで区切られて表示される</code></pre>
</figure>
<h2>input 関数</h2>
<p>input 関数は、 input （入力する）という意味です。 input 関数は、<span class="u">キーボード入力された文字列を返します</span>。 input 関数の引数に文字列を指定すると、それがプロンプト（入力を促す文字列）として表示された後でキー入力が行われます。</p>
<p>図11は、 <code class="language-py">"s -->"</code> というプロンプトを表示した後でキー入力を行い、それを変数 s に代入するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 11 　キー入力を変数に代入するプログラム<br />
</figcaption><pre><code class="language-py">>>> s = input("s -->")	# キーボード入力を変数sに代入する
s -->hello              # 適当な文字列を入力する
>>> s                   # 変数sの内容を確認する
'hello'                 # キー入力した文字列が格納されている</code></pre>
</figure>
<h2>open 関数</h2>
<p>open 関数は、 open （開く）という意味です。 open 関数は、引数で指定されたファイルを開き、そのファイルを操作するための<span class="u">ファイルオブジェクトを返します</span>。</p>
<p>図 12 は、 sample.txt というテキストファイルの内容（果物の名前を 3 つ記述した内容で作成してあります）を読み出して、画面に表示するプログラムです。</p>
<p>open 関数の<span class="u">第 1 引数でファイル名を指定</span>し、<span class="u">第 2 引数でモードを指定</span>します。<code class="language-py">"rt"</code> というモードは、 read text （テキストファイルの読み出し）を意味しています。</p>
<p>open 関数が返すファイルオブジェクトには、<span class="u">イテレータの機能（データを順番に取り出す機能）があります</span>。そのため、 for 文の in の後にファイルオブジェクトを指定すると、テキストファイルから 1 行ずつ文字列を読み出せます。</p>
<p>ファイルの操作が終わったら、ファイルオブジェクトが持つ close メソッドでファイルを閉じます。 print 関数の引数 end に空文字列を指定しているのは、ファイルから読み出した文字列の末尾に改行文字があるので、表示する際に改行が重複しないようにするためです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 12 　テキストファイルの内容を読み出して画面に表示するプログラム<br />
</figcaption><pre><code class="language-py">
>>> file_object = open("sample.txt", "rt")	# ファイルを開く
>>> for s in file_object:                   # ファイルから1行ずつ読み出す
...     print(s, end="")			        # 画面に表示する
...                                         # ［Enter］キーだけ押す
apple                                       # ファイルの内容が表示される
orange
grape
>>> file_object.close()				        # ファイルを閉じる</code></pre>
<div class="background c-round grey-text"><i class="material-icons indigo-text mag_rt05">info</i>編集部注<br />
JupyterLab をご利用の場合は、上記コードを実行するにあたり sample.txt のファイルパスがわかりくく、うまく実行できないかも知れません。その場合は以下のようにすると動作します。<br />
なお、ファイルアップロードはメニュー下のボタンから出来ます。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/11/upload_btn.jpg" loading="lazy"><br />
</figre>
</div>
<figure><figcaption class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>図 13 　図 12 を JupyterLab で実行するときのスニペット<br />
</figcaption><pre><code class="language-py">>>> import os                                                 # os のインターフェイスを扱うライブラリをインポート
>>> os.path.expanduser("~")                                   # ホームディレクトリのパスを表示
'/home/jovyan'                                                # 出力が異なることもあります。編集部が実行した際は '/home/jovyan' というパスが出力されました
>>> file_object = open("/home/jovyan/demo/sample.txt", "rt")  # 得られたパスに /demo/sample.txt を追加
# 以下は同じコード</code></pre>
<p></figre></p>
<div class="divider mag_h50"></div>
<p>IT 業界には、様々なプログラミング言語がありますが、それぞれの言語が、その言語独自の組み込み関数（または、それに相当するもの）を備えています。組み込み関数を使うことで、そのプログラミング言語らしさが表現されます。</p>
<p>したがって、試験問題の Python のプログラムでは、 Python の組み込み関数が多用されるはずです。組み込み関数の種類と機能を、しっかりと理解してください。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/library_functions/">基本情報ではじめる Python (8) 組み込み関数</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 (7) generator と yield 文</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/generator_yield/</link>
		<pubDate>Tue, 05 Oct 2021 03:22:43 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6033</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、ジェネレータと yield 文 です。やや高度 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/generator_yield/">基本情報ではじめる Python (7) generator と yield 文</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、<span class="bold">ジェネレータと yield 文</span> です。やや高度なテーマなのですが、前回のラムダ式と同様に、試験の出題範囲を示したシラバスにあるものなので、しっかりとマスターしておきましょう。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<span class="title blue-text"><br />
<strong>（7）関数の定義</strong><br />
</span><br />
利用者の定義による関数を用いて構造化されたプログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>def 文，return 文，<span class="red-border">ジェネレータ，yield 文</span>，ラムダ式，再帰呼出し，デコレータなど
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_2.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.2</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}</style>
<h2>ジェネレータとは？</h2>
<p>Python では、以下のように、 for 文の in の後にリストやタプルなどのイテラブル（複数の要素を反復して取り出せるオブジェクト）を置くと、要素が 1 つずつ取り出されます。</p>
<p>この記事で示すプログラムは、 Python の対話モードで実行しています。説明の都合で、プログラムの行末にコメントを付けていますが、実際にプログラムを動作させるときには、これらのコメントは不要です。</p>
<div class="background blue-grey-text small-text mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<div class="background small-text mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます</p>
</div>
<pre><code class="language-py">>>> animals = ['dog', 'cat', 'mouse']	# リストを作成する
>>> for a in animals:			        # for文で要素を1つずつ取り出す
...     print(a)			            # 要素を表示する
...					                    # ［Enter］キーだけを押す
dog					                    # 実行結果が表示される
cat
mouse</code></pre>
<pre><code class="language-py">>>> numbers = (111, 222, 333)	# タプルを作成する
>>> for n in numbers:			# for文で要素を1つずつ取り出す
...     print(n)			    # 要素を表示する
...					            # ［Enter］キーだけを押す
111					            # 実行結果が表示される
222
333</code></pre>
<p>リストやタプルは、あらかじめ Python に組込まれているものですが、<span class="u">それらと同様の機能を持つオブジェクトを独自に作成</span>することができ、これを<span class="bold">ジェネレータ</span>と呼びます。</p>
<p>ジェネレータ（ generator ）は、「生成装置」という意味です。ジェネレータは、複数の要素を反復して取り出せるオブジェクトです。リストやタプルと同様に、 for 文の in の後にジェネレータを置くことができます。</p>
<h2>ジェネレータ関数と yield 文</h2>
<p>ジェネレータは、ジェネレータ関数によって作成されます。これは、言葉で説明するより、具体例を示した方が早いでしょう。</p>
<p>以下は、 <code class="language-py">'dog'</code> 、 <code class="language-py">'cat'</code> 、 <code class="language-py">'mouse'</code> という文字列を順番に返す animal_generator というジェネレータ関数の定義です。</p>
<p>通常の関数では、戻り値を return 文で返しますが、<span class="u">ジェネレータ関数では、 <span class="bold">yield 文</span>で返します</span>。 yield は、「生産する」という意味です。 3 つ並んだ yield 文は、要素を反復して取り出すときに、上から順に実行されます。</p>
<pre><code class="language-py">>>> def animal_generator():	# ジェネレータ関数の定義
...     yield 'dog'		    # 1つ目の要素を返す
...     yield 'cat'		    # 2つ目の要素を返す
...     yield 'mouse'	    # 3つ目の要素を返す
...				            # ［Enter］キーだけを押す</code></pre>
<p><code class="language-py">戻り値 = ジェネレータ関数()</code> という構文でジェネレータ関数を呼び出すと、戻り値としてジェネレータが得られます。</p>
<p>以下では、</p>
<pre><code class="language-py">animal = animal_generator()</code></pre>
<p>の部分で、 animal_generator 関数が返したジェネレータを、 animal に格納しています。この animal を for 文の in の後に置くと、要素を 1 つずつ得ることができます。</p>
<pre><code class="language-py">>>> animal = animal_generator()	# ジェネレータオブジェクトを得る
>>> for a in animal:            # for文で要素を1つずつ取り出す
...     print(a)		        # 要素を表示する
...				                # ［Enter］キーだけを押す
dog				                # 実行結果が表示される
cat
mouse</code></pre>
<p>以下のように、ジェネレータ関数を for 文の in の後に置くこともできます。</p>
<pre><code class="language-py">>>> for a in animal_generator():	# ジェネレータ関数をfor文のinの後に置く
...     print(a)	                # 要素を表示する
...					                # ［Enter］キーだけを押す
dog					                # 実行結果が表示される
cat
mouse</code></pre>
<p>Python の組み込み関数である list 関数の引数にジェネレータ関数の呼び出しを置くと、ジェネレータが返す要素をリストに変換することもできます。</p>
<pre><code class="language-py">>>> animals = list(animal_generator())	# ジェネレータの要素をリストに変換する
>>> animals				                # リストの内容を表示する
['dog', 'cat', 'mouse']		            # 実行結果が表示される</code></pre>
<h2>繰り返し処理の中で yield 文を使う</h2>
<p>プログラム（すぐ後で例を示します）を見ると不思議な感じがするかもしれませんが、ジェネレータ関数に繰り返し処理を記述して、その中で yield 文を使うこともできます。</p>
<p>この場合には、<span class="u">繰り返し処理がまとめて実行されるのではなく、ジェネレータ関数が返したジェネレータから要素が 1 つずつ取り出されるときに、繰り返し処理の中にある yield 文が 1 回ずつ呼び出されます</span>。</p>
<p>&nbsp;</p>
<p>以下は、 Python の組み込み関数である range 関数と同様の機能を持つ、 <code class="language-py">range_generator(start, stop, step)</code> というジェネレータ関数の定義です。</p>
<p>start から stop 未満まで step 間隔の値を返します。 <span class="u">while 文の繰り返し処理の中に yield 文があることに注目</span>してください。この yield 文は、ジェネレータから要素が 1 つずつ取り出されるときに、 1 回ずつ呼び出されます。</p>
<pre><code class="language-py">>>> def range_generator(start, stop, step):	# ジェネレータ関数の定義
...     n = start
...     while n < stop:
...         yield n				            # ここに注目！
...         n += step
...						                    # ［Enter］キーだけを押す</code></pre>
<p>以下は、 for 文の in の後に、 <code class="language-py">range_generator(0, 10, 1)</code> を置き、ジェネレータから取り出した要素を表示するプログラムです。 0 から 10 未満まで 1 間隔の値が順番に得られています。</p>
<pre><code class="language-py">for i in range_generator(0, 10, 1):	# ジェネレータ関数をfor文のinの後に置く
...     print(i)			        # 要素を表示する
...					                # ［Enter］キーだけを押す
0					                # 実行結果が表示される
1
2
3
4
5
6
7
8
9</code></pre>
<h2>ジェネレータが役立つ場面（その 1 ）</h2>
<p><span class="u">ジェネレータは、要素が要求される場面でその都度データを産出する（ yield する）ので、メモリを多く消費しないという利点</span>があります。</p>
<p>たとえば、学生時代の数学の教科書に掲載されていた 1 ～ 100 の平方表（ 1 ～ 100 を 2 乗した値の一覧表）を返す関数を作成するとしましょう。以下のように、 1 ～ 100 の平方表のリストを返す関数（ジェネレータ関数ではない通常の関数）として作成すると、リストの大きさ分のメモリを消費します。</p>
<pre><code class="language-py">>>> def square_func():			    # 平方表のリストを返す関数の定義
...     sq_list = []			    # 空のリストを作成する
...     n = 1
...     while n <= 100:
...         sq_list.append(n ** 2)	# リストに要素を追加する
...         n += 1
...     return sq_list			    # 要素数100個のリストを返す
...					                # ［Enter］キーだけを押す</code></pre>
<pre><code class="language-py">>>> for data in square_func():	# 要素を1つずつ取り出す
...     print(data)			    # 要素を表示する
...					            # ［Enter］キーだけを押す
1					            # 実行結果が表示される
4
9
16
25
#　中　略
9604
9801
10000</code></pre>
<p>同じ目的の関数を、以下のようにジェネレータ関数として作成すれば、要素が要求される場面でその都度データを算出するので、メモリを多く消費しません。</p>
<pre><code class="language-py">>>> def square_generator():		# ジェネレータ関数の定義
...     n = 1
...     while n <= 100:
...         yield n ** 2		# 平方の値を算出する
...         n += 1
...					            # ［Enter］キーだけを押す</code></pre>
<pre><code class="language-py">>>> for data in square_generator():	# 要素を1つずつ取り出す
...     print(data)			        # 要素を表示する
...					                # ［Enter］キーだけを押す
1					                # 実行結果が表示される
4
9
16
25
#　中　略
9604
9801
10000</code></pre>
<h2>ジェネレータが役立つ場面（その 2 ）</h2>
<p>ジェネレータ関数は、現在の状態を保持できる関数だといえます。したがって、<span class="u">直前に算出したデータの値を、次に算出するデータの演算で使う、ということができます</span>。これは、通常の関数には、できないことです。通常の関数は、呼び出されるたびに、まっさらな状態で処理を行うからです。</p>
<p>以下は、 1 から 100 までの階乗を算出するジェネレータ関数 fact_generator の定義です。直前に算出したデータの値を変数 prev に格納しているので、変数 n の階乗を prev * n という演算で求めることができます。</p>
<pre><code class="language-py">>>> def fact_generator():		# ジェネレータ関数の定義
...     prev = 1			    # 直前の値の初期値
...     n = 1				    # 現在の値の初期値
...     while n <= 10:
...         fact = prev * n		# nの階乗を演算する
...         yield fact			# nの階乗を算出する
...         prev = fact			# 直前に産出した値を記憶する
...         n += 1
...					            # ［Enter］キーだけを押す</code></pre>
<pre><code class="language-py">>>> for data in fact_generator():	# 要素を1つずつ取り出す
...     print(data)			        # 要素を表示する
...					                # ［Enter］キーだけを押す
1					                # 実行結果が表示される
2
6
24
120
720
5040
40320
362880
3628800</code></pre>
<div class="divider mag_h50"></div>
<p>いかがでしたか。ジェネレータと yield 文の機能を、しっかりとマスターできたでしょう。</p>
<p>なお、<span class="u">リストやタプルからの要素の取り出しは、ジェネレータではなく、同様の機能をクラスで定義したイテレータで実現</span>されています。イテレータの作り方に関するキーワードは、基本情報技術者試験のシラバスに示されていなので、この連載では取り上げませんが、興味がある人は、ぜひ調べてみてください。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/generator_yield/">基本情報ではじめる Python (7) generator と yield 文</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 (6) ラムダ式 って何？ どんな用途で使うの？</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/lambda/</link>
		<pubDate>Tue, 21 Sep 2021 02:30:01 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5944</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、ラムダ式です。かなり高度なテーマですが、試験の [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/lambda/">基本情報ではじめる Python (6) ラムダ式 って何？ どんな用途で使うの？</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、<span class="bold">ラムダ式</span>です。かなり高度なテーマですが、試験の出題範囲を示したシラバスにあるものなので、しっかりとマスターしておきましょう。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<span class="title blue-text"><br />
<strong>（7）関数の定義</strong><br />
</span><br />
利用者の定義による関数を用いて構造化されたプログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>def 文，return 文，ジェネレータ，yield 文，<span class="red-border">ラムダ式</span>，再帰呼出し，デコレータなど
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_1.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.1</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}</style>
<h2>ラムダ式とは？</h2>
<p>ラムダ式は、ラムダ計算をベースにしています。ラムダ計算は、コンピュータの動作を関数で抽象化するものであり、関数を λ（ラムダ） という文字を使って表すことから、その名前が付けられました。ラムダ計算には、様々なトピックがありますが、 Python のラムダ式は、それらの中の一部分だけを使っています。</p>
<p>あらかじめ結論を言ってしまうと、 <span class="bold">Python のラムダ式は、無名関数</span>です。</p>
<p>&nbsp;</p>
<p>無名関数は、名前のない関数です。 Python では、<span class="u">関数を定義するときに、一般的に def 文を使いますが、もう 1 つ別の方法としてラムダ式がある</span>のです。ラムダ式によって無名関数が作られるのです。</p>
<p>例を示しましょう。<br />
以下は、<br />
底辺 × 高さ ÷ 2<br />
という計算で、三角形の面積を求める関数を def 文で定義したものです。</p>
<div class="background small-text mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます</p>
</div>
<pre><code class="language-py">def triangle_area(bottom, height):
    return bottom * height / 2</code></pre>
<p>この関数には、<br />
triangle_area という名前があり、<br />
bottom （底辺）と height （高さ）という引数があり、<br />
bottom * height / 2 という計算式があり、<br />
return 文で 計算結果を戻り値として返します。</p>
<p>&nbsp;</p>
<p>同じ機能の関数をラムダ式で作ると、以下のようになります。ラムダ式は、</p>
<pre><code class="language-py">lambda 引数 : 計算式</code></pre>
<p>という構文で記述します。</p>
<pre><code class="language-py">lambda bottom, height : bottom * height / 2</code></pre>
<p>先頭の lambda というキーワードが、ラムダ式をあることを示しています。</p>
<p>引数が複数ある場合は、カンマで区切ります。引数が計算式で使われ、その計算結果が戻り値として返されます（ return 文は、使いません）。</p>
<p>ラムダ式には、<span class="u">関数の名前に相当するものがありません。だから、無名関数</span>なのです。</p>
<h2>ラムダ式の呼び出し方</h2>
<p>名前がある triangle_area 関数は、</p>
<pre><code class="language-py">triangle_area(10, 20)</code></pre>
<p>という構文で呼び出します。</p>
<p>以下は、 Python の対話モードで、 triangle_area 関数を定義して呼び出した例です。説明の都合で、プログラムの行末にコメントを付けていますが、実際にプログラムを動作させるときには、これらのコメントは不要です。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<pre><code class="language-py">>>> def triangle_area(bottom, height):  # def文で関数を定義する
...     return bottom * height / 2
...
>>> triangle_area(10, 20)  # 関数を呼び出す
100.0</code></pre>
<p>それでは、名前がないラムダ式は、どのように呼び出せばよいのでしょう？ いくつかの方法があります。</p>
<p>1 つは、ラムダ式全体をカッコで囲んで、その後にカッコで囲んで引数を指定するという方法です。以下に例を示します。</p>
<pre><code class="language-py">>>> (lambda bottom, height : bottom * height / 2)(10, 20)  # ラムダ式を呼び出す
100.0</code></pre>
<p>もう 1 つは、ラムダ式を変数に代入して、その変数を関数の名前として、通常の関数と同様に呼び出すという方法です。</p>
<p>以下に例を示します。ここでは、ラムダ式に a という名前を付けています。</p>
<pre><code class="language-py">>>> a = lambda bottom, height : bottom * height / 2  # ラムダ式を変数aに代入する
>>> a(10, 20)  # 変数aを関数名として通常の関数と同様に呼び出す
100.0</code></pre>
<h2>ラムダ式の実用的な使い方と高階関数</h2>
<p>先ほど、ラムダ式を呼び出す方法を 2 つ示しましたが、<span class="u">どちらもラムダ式の実用的な使い方ではありません</span>。</p>
<p>Python におけるラムダ式の実用的な使い方は、<span class="bold">高階関数（ higher order function ）の引数にすること</span>です。<span class="u">高階関数とは、引数に関数を指定する関数のこと</span>です。</p>
<p>&nbsp;</p>
<p>Python には、あらかじめ様々な高階関数が用意されています。</p>
<p>たとえば、 Python の組み込み関数（ import 文でインポートせずに、すぐに使える関数）の filter 関数は、</p>
<pre><code class="language-py">filter(関数, イテラブル)</code></pre>
<p>という構文の高階関数です。</p>
<p>filter 関数は、 2 つの目の引数で指定されたイテラブル（リストやタプルなど）から要素を順番に取り出し、それを 1 つ目の引数で指定された関数に渡して True が返されたものだけを抽出します。</p>
<p>&nbsp;</p>
<p>例として、 filter 関数を使って、</p>
<div class="background c-round">
<code class="language-py">[1, 2, 3, 4, 5]</code> というリストから、 3 以上の要素だけを抽出
</div>
<p>してみましょう。</p>
<p>filter 関数の 1 つ目の引数に指定する関数は、引数の値が 3 以上ならTrueを返す、という機能にします。この関数を、 def 文を使って three_or_greater という名前で定義すると、以下のようになります。</p>
<pre><code class="language-py">def three_or_greater(data):
    return data >= 3</code></pre>
<p>filter 関数を、 1 つ目の引数に three_or_greater 関数を指定し、 2 つ目の引数に、 [1, 2, 3, 4, 5] というリストを指定して実行すると、以下のように 3 以上の[3, 4, 5] が抽出されます。</p>
<pre><code class="language-py">>>> def three_or_greater(data):  # def文で関数を定義する
...     return data >= 3
...
>>> list(filter(three_or_greater, [1, 2, 3, 4, 5]))  # 引数に関数を指定する
[3, 4, 5]</code></pre>
<p>filter 関数は、戻り値として filter オブジェクトを返すので、ここでは、それを list 関数でリストに変換しています。リストに変換しないと、要素の値を画面に表示できないからです。</p>
<p>&nbsp;</p>
<p>さて、ここからがポイントです。</p>
<p>filter 関数の 1 つ目の引数に指定しているのは、引数の値が 3 以上なら True を返す、という単純な機能の関数です。 <span class="u">filter 関数を使うために、わざわざ three_or_greater 関数という定義するのは面倒</span>でしょう。</p>
<p>もしも、</p>
<pre><code class="language-py">filter(>= 3, [1, 2, 3, 4, 5])</code></pre>
<p>のように、 filte r関数の引数に <code class="language-py">>= 3</code> という条件が指定できたら便利です。</p>
<p>ただし、 Python の構文では、関数の引数に条件だけを指定することができません。どうしましょう？ そうです！ こういう場面で、ラムダ式が役立つのです。</p>
<p>&nbsp;</p>
<p>filter 関数の引数に、 <code class="language-py">>= 3</code> という条件は指定できませんが、</p>
<pre><code class="language-py">lambda data : data >= 3</code></pre>
<p>というラムダ式なら指定できます。<span class="u">これが、ラムダ式の実用的な使い方</span>です。以下に、例を示します。</p>
<pre><code class="language-py">>>> list(filter(lambda data : data >= 3, [1, 2, 3, 4, 5]))  # 引数にラムダ式を指定する
[3, 4, 5]</code></pre>
<div class="divider mag_h50"></div>
<p>いかがでしたか。 Python のラムダ式の意味と使い方を、しっかりとマスターできたでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/lambda/">基本情報ではじめる Python (6) ラムダ式 って何？ どんな用途で使うの？</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_java/</link>
		<pubDate>Thu, 09 Sep 2021 23:30:13 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=5839</guid>
		<description><![CDATA[<p>今週の午後問題 では毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「 2019 年度 秋期 Java」でしたが、皆さん、手応え [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_java/">今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<span class="bold">今週の午後問題</span> では<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../r01a_java/">「 2019 年度 秋期 Java」</a>でしたが、皆さん、手応えはいかがでしょうか？</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}pre{margin:1em -2em!important;padding:1em 2em!important}blockquote > p{color:#607d8b}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2019 年度 秋期 Java 通知メッセージの配信システム</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>プログラムの説明に</p>
<blockquote><p>Notifier クラスのインスタンスは、シングルトン（ Java 仮想計算機内で唯一の存在）である</p></blockquote>
<p>と示されています。</p>
<p>Notifier クラスの getInstance メソッドは、その名前から、インスタンスの参照を返すものであることがわかります。<br />
Notifier クラスは、 static final な、 INSTANCE フィールドに new Notifier() で得られた Notifier クラスのインスタンスを保持しています。</p>
<p>したがって、 getInstance メソッドが返すのは、 INSTANCE フィールドの値であり、選択肢イが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<p>空欄 b がある if ブロックは、</p>
<pre><code class="language-java">devices == null // 利用者名に対する携帯端末名のリストが作成されていない</code></pre>
<p>という条件が &#8220;真&#8221; のとき実行されます。</p>
<p>この場合には、</p>
<pre><code class="language-java">divices = new ArrayList&lt;();</code></pre>
<p>で携帯端末名のリストを新たに作成し、 userMobileDivices に user （利用者名）と divices を登録します。</p>
<p>したがって、空欄 b の行で行う処理は、</p>
<pre><code class="language-java">userMobileDivices.put(user, devices)</code></pre>
<p>であり、選択肢オが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>c</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>空欄 c がある if ブロックは、</p>
<pre><code class="language-java">messageList == null // デバイス名に対するメッセージのリストが作成されていない</code></pre>
<p>という条件が &#8220;真&#8221; のとき実行されます。</p>
<p>この場合には、</p>
<pre><code class="language-java">messageList = new ArrayList&lt;>();</code></pre>
<p>でメッセージのリストを新たに作成し、 messagesToDeliver に device （携帯端末名）と messageList を登録します。</p>
<p>したがって、空欄 c の行で行う処理は、</p>
<pre><code class="language-java">messagesToDeliver.put(device, messageList)</code></pre>
<p>であり、選択肢イが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>d</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<pre><code class="language-java">メソッド名() "[  d  ]" 例外クラス名 { }</code></pre>
<p>という構文なので、空欄 d に入るのは、 <code class="language-java">throws</code> です。</p>
<p>したがって、選択肢オが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>e</p>
<p><span class="chip bold">正解</span> ウ</p>
<div class="divider"></div>
<p>図 1 に示された実行結果の例を見ると、</p>
<pre><code class="language-none">phone: [You have a message]
tablet: [You have a message]</code></pre>
<p>という形式で表示されています。</p>
<p>したがって、<span class="u">空欄 e に入るのは、携帯端末名</span>です。</p>
<p>createUserMobileDevice メソッドの説明を見ると、</p>
<blockquote><p>利用者名と携帯端末名を登録して</p></blockquote>
<p>と示されているので、このメソッドの引数 user が利用者名であり、引数 name が携帯端末名です。</p>
<p>したがって、空欄 e は name であり、選択肢ウが正解です。
</p></div>
<div class="background c-round">
<p class="bold">設問 2</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<p>α の前で</p>
<pre><code class="language-java">notifier.shutdown();</code></pre>
<p>という処理が行われています。プログラムの説明に</p>
<blockquote><p>メソッド shutdown は、通知システムを停止する。未配信の全メッセージ、全利用者名及び全携帯端末名の登録情報を削除し、登録されている全携帯端末の待ち受け状態を解除する</p></blockquote>
<p>と示されています。</p>
<p>この状態で、 α の位置で</p>
<pre><code class="language-java">notifier.send("Taro", "You have 2 messages.");</code></pre>
<p>を実行すると、<span class="u">全利用者名の登録情報が削除されている</span>ので、 send メソッドの</p>
<pre><code class="language-java">if (userMobileDevices.contaninsKey(user))</code></pre>
<p>が &#8220;偽&#8221; となり、 if ブロックの処理が行われません。</p>
<p>devices　も空のままになるので、その後にある</p>
<pre><code class="language-java">for (MobileDevice device : devices)</code></pre>
<p>の処理も行われません。 send メソッドは、何もせずに終了することになります。例外も発生しません。</p>
<p>したがって、選択肢オが正解です。
</p></div>
<h2>みんなの解答</h2>
<p>では、皆さん、手応えはいかがだったでしょうか？</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_cmnt.pdf" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background grey-text c-round">
　問 11 では，携帯端末へ非同期でメッセージを擬似的に通知する処理を題材に，複数スレッド間でデータを更新する処理などについて出題した。<br />
　設問 1 では， a ， c ， d の正答率は平均的で，おおむね理解されていた。 b の正答率は低く，エと誤って解答した受験者が多く見受けられた。二つの Map の内容の構造的な関係を理解した上で， device と devices で表しているものが異なることに注意すれば，正答できた。 e の正答率は低く，イと誤って解答した受験者が見受けられた。引数のラムダ式の評価は，クラス MobileDevice のコンストラクタの呼出し前に行われることに注意が必要である。<br />
　設問 2 では，正答率は低く，エと誤って解答した受験者が見受けられた。メソッド send では，引数で指定された利用者名が登録されているかどうかを，必ず確認してから処理を行っていることに注意が必要である。<br />
　Java では，スレッド間で同期処理を行うための機能が言語仕様レベルで備えられているので，それらを基礎的な技術として習得しておくことは重要である。一方，コンピュータの高性能化に伴い，基本的な同期処理の機能では実現できない高度な並列処理及び並行処理を行うための機能の利用が要求されることも多く，それらについても学習するようにしてほしい。
</div>
<p>来週から午後問題は分野を<span class="bold">「情報セキュリティ」</span>に絞って出題します！ぜひ挑戦してみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_java/">今週の午後問題〔解答〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔問題〕Java 通知メッセージの配信システム 2019 (令和元) 年度</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/r01a_java/</link>
		<pubDate>Sun, 05 Sep 2021 23:30:32 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=5828</guid>
		<description><![CDATA[<p>今週の午後問題 のコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまも参加して解答できます！　その週の金曜にはその解答と 矢沢久雄 さんによる 解説 ページを公開し [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/r01a_java/">今週の午後問題〔問題〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<span class="bold">今週の午後問題</span> のコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまも参加して解答できます！　<span class="u">その週の金曜にはその解答と 矢沢久雄 さんによる 解説 ページを公開</span>し、皆さんの正解率も発表します。</p>
<p>ぜひ腕試しにお使い下さい！</p>
<p>今回は「 2019 年度 秋期 Java」を出題します
</p></div>
<style>pre{margin:1.5em -7.5% 1.5em calc(-7.5% - 10px)!important;padding:1.5em 7.5%!important}figcaption{margin:1em 0;text-align:center;color:#9e9e9e;}.blank{border:.2em solid #607d8b;padding:.25em 2em;margin:auto .5em;}dl.inline dd{margin-left:2em;}details{padding:2em;}details p{color:"#607d8b"}table.forth-col-left tbody tr td:nth-child(4){text-align: left;}summary:hover{cursor:pointer;}summary{display:inline-block;}.chip span::after{content:"\e5cf";font-family:"Material Icons";vertical-align:middle;margin-left:.5em;}summary::-webkit-details-marker{display:none;}details[open] .chip span::after{content:"\e5ce";}.responsive-width{width:80%;margin:auto;}.iframe-container{overflow:auto;margin:2em auto}@media screen and (max-width:600px){.responsive-width{width:100%}}</style>
<h2>今週の午後問題<br />2019 年度 秋期 Java 通知メッセージの配信システム</h2>
<div class="divider mag_h30"></div>
<p class="bold">問 11</p>
<p>次の Java プログラムの説明及びプログラムを読んで，設問 1 ，2 に答えよ。<br />
( Java プログラムで使用する API の説明は，<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_qs.pdf#page=77" rel="noopener" target="_blank">この冊子の末尾</a>を参照してください。)</p>
<div class="mag_lt10">
〔プログラムの説明〕</p>
<p>　スマートフォンやタブレット端末といった携帯端末に通知メッセージを配信するシステム (以下，通知システムという) を模したプログラムである。この通知システムは，メール着信を通知するメッセージを非同期で携帯端末に配信する。このプログラムでは，通知メッセージを配信する処理及び各携帯端末の処理を，それぞれ独立したスレッドとして実行する。</p>
<p>　このプログラムは，次のインタフェース及びクラスから成る。ここで，各コンストラクタ及びメソッドには，正しい引数が与えられるものとする。</p>
<ol>
<li><span class="bold">インタフェース NotificationListener は，通知メッセージを受け取るためのメソッドを定義する。以下， NotificationListener のインスタンスをリスナという。</span>
<ol type="i">
<li>メソッド onNotificationReceived は，通知メッセージを受信したときに呼び出される。受信した通知メッセージは，引数の文字列のリストで与えられる。</li>
</ol>
</li>
<li><span class="bold">クラス MobileDevice は，携帯端末を表す。</span>
<ol type="i">
<li>コンストラクタは，引数で指定された携帯端末名及びリスナをもつ携帯端末を生成する。</li>
<li>メソッド getListener はリスナを， getName は携帯端末名を返す。</li>
</ol>
</li>
<li><span class="bold">クラス Notifier は，携帯端末の管理や通知メッセージの配信などを行う。 Notifier のインスタンスは，シングルトン ( Java 仮想計算機内で唯一の存在) である。</span>
<ol type="i">
<li>メソッド register は，引数で指定された利用者名とその携帯端末名を登録する。指定された利用者名に対応する携帯端末名が既に登録されている場合は，その利用者名に対応する携帯端末名として追加登録する。</li>
<li>メソッド send は，引数で指定された利用者名で登録されている各携帯端末に，引数で指定された文字列を通知メッセージとして配信する。携帯端末に対して未配信の通知メッセージがある場合，引数のメッセージを未配信のメッセージリストに追加する。 </li>
<li>メソッド loopForMessages は，引数で指定された携帯端末に対して，通知メッセージがあれば携帯端末のリスナに通知し，なければ通知メッセージを受け取れる状態 (以下，待ち受け状態という) にする。この処理を，通知システムが停止されるまで繰り返す。</li>
<li>メソッド shutdown は，通知システムを停止する。未配信の全メッセージ，全利用者名及び全携帯端末名の登録情報を削除し，登録されている全携帯端末の待ち受け状態を解除する。</li>
</ol>
</li>
<li><span class="bold">クラス Tester は，プログラム 1 ～ 3 をテストする。</span>
<ol type="i">
<li>メソッド main は，利用者名 Taro の携帯端末名 phone 及び tablet を通知システムに登録して，Taro にメッセージを送信する。その後，通知システムを停止する。</li>
<li>メソッド createUserMobileDevice は，利用者名とその携帯端末名を登録して，通知メッセージを受信できる状態にする処理を，新しく生成したスレッドで実行する。</li>
</ol>
</li>
</ol>
<p>　図 1 は，クラス Tester のメソッド main を実行して得られた出力の例である。ここで，プログラムは，スレッドの実行速度及び事象発生に対する応答が十分速いシステムで実行されるものとする。また，スレッドのスケジューリングによって，各行の出カ順は異なることがある。</p>
<figure>
<pre><code class="language-none">phone: [You have a message.]
tablet: [You have a message.]
Terminating Taro's tablet
Terminating Taro's phone</code></pre><figcaption>図 1 メソッド main の実行結果の例</figcaption></figure>
<p>〔プログラム 1 〕</p>
<p class="background c-round blue-grey-text mag_h30 small-text hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>スマートフォンをご覧の際、プログラムは右にスクロールできます
</p>
<pre><code class="language-java">import java.util.List;

public interface NotificationListener {
	void onNotificationReceived(List&lt;String> messageList);
}</code></pre>
<p>〔プログラム 2 〕</p>
<pre><code class="language-java">public final class MobileDevice {
	private final String name;
	private final NotificationListener listener;
	
	public MobileDevice(String name, NotificationListener listener){
		this.name = name;
		this. Listener = listener;
	}
	
	public NotificationListener getListener() { return listener; }
	
	public String getName() { return name; }
}</code></pre>
<p>〔プログラム 3 〕</p>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class Notifier {
	private static final Notifier INSTANCE = new Notifier();

	private final Object lock = new Object();
	// 利用者ごとに携帯端末を管理
	private final Map&lt;String, List&lt;MobileDevice>> userMobileDevices
		  = new HashMap&lt;>();
	// 携帯端末ごとに通知メッセージを保持
	private final Map&lt;MobileDevice, List&lt;String>> messagesToDeliver
		  = new HashMap&lt;>();
	private volatile boolean active = true;
	
	public static Notifier getInstance() { return "[  a  ]"; }

	private Notifier() { }
	
	public void register(String user, MobileDevice device) {
		synchronized (lock) {
			List&lt;MobileDevice> devices = userMobileDevices.get(user);
			if (devices == null) {
				devices = new ArrayList&lt;>();
				userMobileDevices.put( "[  b  ]" );
			}
			devices.add(device);
		}
	}

	public void send (String user, String message) {
		List&lt;MobileDevice> devices = new ArrayList&lt;>();
		synchronized (lock) {
			if (userMobileDevices.containsKey(user)) {
				for (MobileDevice device : userMobileDevices.get(user)) {
					List&lt;String> messageList = messagesToDeliver.get(device);
					if (messageList == null) {
						messageList = new ArrayList&lt;>();
						messages ToDeliver.put( "[  c  ]" );
					}
					messageList.add(message);
					devices.add(device);
				}
			}
		}
		for (MobileDevice device : devices) {
			synchronized (device) {
				// 通知メッセージがあることを待ち受け状態のスレッドに通知
				device.notifyAll();
			}
		}
	}
	
	public void loopForMessages(MobileDevice device) {
		while (active) {
			List&lt;String> messageList;
			synchronized (lock) {
				messageList = messagesToDeliver.remove(device);
			}

			if (messageList != null) {
				device.getListener().onNotificationReceived(messageList);
			}
			synchronized (device) {
				try {
					// 通知メッセージが到着するかタイムアウトするまで待つ
					device.wait(3000L);
				} catch (InterruptedException e) {
					break;
				}
			}
		}
	}

	public void shutdown() {
		active = false;
		List&lt;MobileDevice> devices = new ArrayList&lt;>();
		synchronized (lock) {
			messagesToDeliver.clear();
			for (String user: userMobileDevices.keySet()) {
				for (MobileDevice device : userMobileDevices.get(user)) {
					devices.add(device);
				}
			}
			userMobileDevices.clear();
		}
		for (MobileDevice device : devices) {
			synchronized (device) {
				//待ち受け状態のスレッドに通知
				device.notifyAll();
			}
		}
	}
}</code></pre>
<p>〔プログラム 4 〕</p>
<pre><code class="language-java">public class Tester {
	public static void main(String[] args) "[  d  ]" InterruptedException {
		createUserMobileDevice("Taro", "phone");
		createUserMobileDevice("Taro", "tablet");
		Notifier notifier = Notifier.getInstance();
		notifier.send("Taro", "You have a message.");
		Thread.sleep(500L);
		notifier.shutdown();
		/* α */
	}

	private static void createUserMobileDevice(String user, String name) {
		MobileDevice device = new MobileDevice(name, messageList ->
			  System.out.println( "[  e  ]" + ":" + messageList));
		Notifier notifier = Notifier.getInstance();
		notifier.register(user, device);
		new Thread(() -> {
			notifier.loopForMessages(device);
			System.out.printf("Terminating %s's %s%n", user, name);
		}).start();
	}
}</code></pre>
<p class="bold mag_tp50">設問 1</p>
<p>プログラム中の<span class="blank"></span>に入れる正しい答えを，解答群の中から選べ。</p>
<p>a に関する解答群</p>
<p>ア　<code class="language-java">getInstance()</code><br />
イ　<code class="language-java">INSTANCE</code><br />
ウ　<code class="language-java">new Notifier()</code><br />
エ　<code class="language-java">Notifier()</code><br />
オ　<code class="language-java">Notifier.class</code><br />
カ　<code class="language-java">this</code></p>
<p>b, c に関する解答群</p>
<p>ア　<code class="language-java">device, devices</code><br />
イ　<code class="language-java">device, messageList</code><br />
ウ　<code class="language-java">device, user</code><br />
エ　<code class="language-java">user, device</code><br />
オ　<code class="language-java">user, devices</code><br />
カ　<code class="language-java">user, messageList</code></p>
<p>d に関する解答群</p>
<p>ア　<code class="language-java">extends</code><br />
イ　<code class="language-java">implements</code><br />
ウ　<code class="language-java">requires</code><br />
エ　<code class="language-java">throw</code><br />
オ　<code class="language-java">throws</code><br />
カ　<code class="language-java">uses</code></p>
<p>e に関する解答群</p>
<p>ア　<code class="language-java">device</code><br />
イ　<code class="language-java">device.getName()</code><br />
ウ　<code class="language-java">name</code><br />
エ　<code class="language-java">Tester.this.name</code><br />
オ　<code class="language-java">this.name</code><br />
カ　<code class="language-java">user</code></p>
<p class="bold mag_tp50">設問 2</p>
<p>プログラム 4 のクラス Tester において，メソッド main の /* α */ を図 2 の 2 行で置き換えて実行したとき，この 2 行に対するプログラムの動作に関する記述として，正しい答えを，解答群の中から選べ。</p>
<figure>
<pre><code class="language-java">		notifier.send("Taro", "You have 2 messages.");
		Thread.sleep(500L);</code></pre><figcaption>図 2 /* α */ と置き換える行</figcaption></figure>
<p>解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd><code class="language-none">"phone: [You have 2 messages.]"</code> だけを出力する。</dd>
<dt>イ</dt>
<dd><code class="language-none">"tablet: [You have 2 messages.]"</code> だけを出力する。</dd>
<dt>ウ</dt>
<dd>メソッド loopForMessages で， NullPointerException が発生する。</dd>
<dt>エ</dt>
<dd>メソッド send で， NullPointerException が発生する。</dd>
<dt>オ</dt>
<dd>利用者名 Taro が登録されていないので，メソッド send は何もしないで終了する。</dd>
<dt>カ</dt>
<dd>利用者名 Taro は登録されているが，利用者名 Taro の携帯端末が何も登録されていないので、メソッド send は何もしないで終了する。</dd>
</dl>
</div>
<div class="divider mag_tp60 mag_bt30"></div>
<details class="grey lighten-5 blue-grey-text c-round">
<summary class="chip"><span>問題のヒント</span></summary>
<p>Java の問題は、アルゴリズムに重点を置いているものと、プログラムの構造に重点を置いているものがあります。</p>
<p>この問題は、プログラムの構造に重点を置いています。そのため、クラスの関連付けや、クラスのインスタンスの生成など、オブジェクト指向プログラミングの知識が要求されます。</p>
<p>さらに、プログラムでは、インターフェイス、コレクション、ジェネリクス、マルチスレッドなど、かなり高度な機能が多用されています。全体的に難しく感じるかもしれませんが、一部の設問は、 Java の基本構文がわかればできるようになっているので、自分の持てる知識を総動員して解いてください。<br />
</details>
<h2>みんなの解答欄</h2>
<p>こちらから解答できます！</p>
<div class="iframe-container center">
<iframe src="https://docs.google.com/forms/d/e/1FAIpQLSf-qigsqj8ZzXDcJGwNuUX2BAOwuPx4pjjfFk6hbTf9ribw0A/viewform?embedded=true" width="100%" height="2424" frameborder="0" marginheight="0" marginwidth="0">読み込んでいます…</iframe>
</div>
<p>今週の金曜に解答解説ページを、ご解答頂いた方の正解率とともに公開します !!</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/r01a_java/">今週の午後問題〔問題〕Java 通知メッセージの配信システム 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕表計算 メロンの仕分 2019 (令和元) 年度</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_spreadsheet/</link>
		<pubDate>Thu, 02 Sep 2021 23:30:31 +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=this_weeks_exercise&#038;p=5818</guid>
		<description><![CDATA[<p>今週の午後問題 では毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「 2019 年度 秋期 表計算」でしたが、皆さん、手応えは [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_spreadsheet/">今週の午後問題〔解答〕表計算 メロンの仕分 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<span class="bold">今週の午後問題</span> では<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../r01a_spreadsheet/">「 2019 年度 秋期 表計算」</a>でしたが、皆さん、手応えはいかがでしょうか？</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;font-size:1em;background:#424242;color:#fafafa;margin:1em -2em!important;padding:1em 2em}.blank{border:.2em solid #607d8b;padding:.25em 2em;margin:auto .5em;}dl.inline dd{margin-left:5em;}th{text-align:center}blockquote > p{color:#607d8b}@media screen and (max-width:600px){ol{padding-left:1em}dd{margin-left:1em;}}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2019 年度 秋期 表計算 メロンの仕分</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>セル E2 にはメロンの等級が入ります。</p>
<p>等級については、問題文中に</p>
<blockquote><p>形状と表皮色の低い方が、そのメロンの等級となる</p></blockquote>
<p>という記述があります。</p>
<p>例えば形状が &#8220;並&#8221; で表皮色が &#8220;良&#8221; だったら、 &#8220;並&#8221; ということです。フローチャートだと次のようになります。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width pad_10 white" src="/fenavi/wp-content/uploads/2021/08/figure_sort.jpg" loading="lazy"><br />
</figure>
<blockquote><p>どちらかが &#8216;並&#8217;</p></blockquote>
<p>は</p>
<pre>論理和(C2 = '並', D2 = '並')</pre>
<p>ですから、セル E2 には</p>
<pre>>IF(論理和(C2 = '並', D2 = '並'), '並',
	IF(論理和(C2 = '良', D2 = '良'), '良', '優'))</pre>
<p>選択肢エが入ります。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>セル F2 は算出価格が入ります。</p>
<p>空欄 b は等級が &#8220;並&#8221; 以外のときの単価が入りますので、図 1 の単価表から算出します。 E2 に入った &#8220;優&#8221; または &#8220;良&#8221; を単価表の B1 から D2 の範囲で水平に探します。見つかったら、その範囲の上から 2 つめを取得します。</p>
<p>したがって空欄 b には</p>
<pre>水平照合(E2, 単価表!B1:D2, 2, 0)</pre>
<p>が入ります。</p>
<p>あとは複写する際の相対参照・絶対参照を考えましょう。 F2 は F3 ～ F1001 に複写されます。検索範囲である</p>
<pre>単価表!B1:D2</pre>
<p>の行番号は変化させたくありません。そこで空欄 b には</p>
<pre>水平照合(E2, 単価表!B$1:D$2, 2, 0)</pre>
<p>選択肢エが入ります。</p>
<p>なお、「照合一致」は、値ではなく、何番目に見つかったかの「位置」を返しますから不適切です。「表引き」は表の左上から数えた位置を引数とするので、不適切です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>c</p>
<p><span class="chip bold">正解</span> ウ</p>
<div class="divider"></div>
<p>セル G2 は販売価格が入ります。</p>
<p>空欄 c は A2 が null ではなく、 E2 が &#8220;並&#8221; ではない時の販売価格が入りますので、</p>
<blockquote><p>算出価額を 50 円単位で切り上げた値</p></blockquote>
<p>です。</p>
<p>一番上の行の F2 と G2 の例でいえば、</p>
<blockquote><p>2,431.5</p></blockquote>
<p>が</p>
<blockquote><p>2,450</p></blockquote>
<p>になればよいわけです。</p>
<p>2431.5 ÷ 50 = 48.63　となり、これを整数値に切上げると 49 です。 49 * 50 = 2450　となります。</p>
<p>したがって空欄 c には</p>
<pre>切上げ(F2/50, 0, 0) * 50</pre>
<p>選択肢ウが入ります。
</p></div>
<div class="background c-round">
<p class="bold">設問 2</p>
<p><span class="chip bold">正解</span>d ― キ、 e ― キ、 f ― イ</p>
<div class="divider"></div>
<p>設問 2 はワークシート &#8220;集計表&#8221; の &#8220;並&#8221; の等級のメロンの ID をワークシート &#8220;重量計算表&#8221; に割り振るマクロ Packing の穴埋めです。変数の役割が分かると、マクロが読みやすくなります。</p>
<table class="mag_h30">
<tr>
<th>i</th>
<td>&#8220;集計表&#8221; を 1 行ずつ見ていくための変数（縦に動く）</td>
</tr>
<tr>
<th>j</th>
<td>&#8220;重量計算表&#8221; に上から格納していくための変数（縦に動く）</td>
</tr>
<tr>
<th>CurrentColumn</th>
<td>&#8220;重量計算表&#8221; の適切な列に ID を格納するための変数（横に動く）</td>
</tr>
</table>
<div class="chip mag_tp30">空欄 d</div>
<p>空欄 d の直前の処理で &#8220;集計表&#8221; の ID を &#8220;重量計算表&#8221; に転記しています。そこで空欄 d には<span class="u">該当する ID のメロンの重量を &#8220;重量計算表&#8221; の F 列に加算する処理が入らなければなりません</span>。</p>
<p>加算される合計重量は F1 から数えて、 j 行下のセルですから、</p>
<pre>相対(F1, j, 0)</pre>
<p>です。<br />
加算するメロンの重量は、集計表の B1 から数えて、 i 行下のセルですから、</p>
<pre>相対(集計表!B1, i, 0)</pre>
<p>です。</p>
<p>したがって空欄 d には</p>
<pre>相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, i, 0)</pre>
<p>選択肢キが入ります。</p>
<div class="chip mag_tp30">空欄 e</div>
<p>空欄 e は j を 1 加算する、つまり <span class="u">&#8220;重量計算表&#8221; の次の行に処理を移し、CurrentColumnを 0 に戻すための条件式が入ります</span>。これは問題文中の</p>
<blockquote class="blue-grey-text"><p>&#8220;メロンの合計重量が５kg以上&#8221; 又は &#8220;メロンの個数が４個&#8221; のどちらかを満たす</p></blockquote>
<p>の条件が該当します。</p>
<p>メロンの合計重量は</p>
<pre>相対(F1, j, 0)</pre>
<p>に入っています。</p>
<p>現在の行のメロンの個数は CurrentColumn です。したがって、空欄 e には</p>
<pre>論理和(相対(F1, j, 0) ≧ 5, CurrentColumn = 4)</pre>
<p>選択肢キが入ります。</p>
<div class="chip mag_tp30">空欄 f</div>
<p>空欄 f は繰り返し処理の後にあります。ここは何をしている処理でしょうか。</p>
<p>繰り返し処理が終わっているということは、 <span class="u">&#8220;集計表&#8221; にあるメロンの処理がすべて終わったということ</span>です。</p>
<p>その後の条件式</p>
<pre>相対(F1, j, 0) ≠ null</pre>
<p>は、 &#8220;重量計算表&#8221; の重量に値が入っていることを示します。これは問題文の</p>
<blockquote class="blue-grey-text"><p> (4) 割り振った結果、出荷条件を満たさない大箱に関する情報は、表示しないようにする</p></blockquote>
<p>を実行するための処理です。すでに<span class="u">該当行の A 列から F 列までの幾つかには値が入っていますので、それを null にするための処理</span>といえます。</p>
<p>そこで、変数 k を使って 6 回繰り返しています。 k は列を動かす変数です。空欄 f には</p>
<pre>相対(A1, j, k) ← null</pre>
<p>選択肢イが入ります。
</p></div>
<h2>みんなの解答</h2>
<p>では、皆さん、手応えはいかがだったでしょうか？</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_cmnt.pdf" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background grey-text c-round">
  問 13 では，メロンの仕分を題材に，販売価格の算出式や，出荷条件に基づく箱詰めの割振り処理のマクロについて出題した。<br />
　設問 1 の正答率は平均的で，おおむね理解されていた。 a では，ウと誤って解答した受験者が見受けられた。<br />
メロンの等級を決定する条件を読み解き，関数 IF の条件として論理積と論理和のどちらが正しいかが判断できれば，正答できた。<br />
　設問 2 では，d とf の正答率が低く，あまり理解されていなかった。 d ではイ，ウ及びエと誤って解答した受験者が見受けられた。どのセルが処理対象となるのかを，問題文から落ち着いて読み取って考えてほしい。 e の正答率は平均的で，おおむね理解されていた。<br />
　式やマクロを記述する際は，その式やマクロで取り扱う値の組合せをあらかじめ網羅し，想定どおりの結果が得られることを確認しておくことが大切である。仕様に基づいて式やマクロを適切に記述する能力は，表計算に限らず，プログラム言語一般で求められるので，しっかりと習得しておくことが必要である。
</div>
<p>ぜひ、来週の午後問題にも挑戦してみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_r01a_spreadsheet/">今週の午後問題〔解答〕表計算 メロンの仕分 2019 (令和元) 年度</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
