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

<channel>
	<title>トレースのコツ | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/tag/%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b9%e3%81%ae%e3%82%b3%e3%83%84/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Tue, 24 Mar 2026 08:09:18 +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>本番で午後がわからなすぎて諦めて途中退室した悔しさをバネに、8割まで正解率アップできた勉強方法</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/jukenki/interview_with_hdn/</link>
		<pubDate>Fri, 21 May 2021 05:16:22 +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=jukenki&#038;p=5390</guid>
		<description><![CDATA[<p>※この記事は基本情報技術者試験の旧制度（2022年以前）の記事です。 題材となっている「午後問題」は現在の試験制度では出題されません。ご注意くださいませ。 &#160; ブログ、SNS、動画など様々なメディアに情報が溢れ [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/jukenki/interview_with_hdn/">本番で午後がわからなすぎて諦めて途中退室した悔しさをバネに、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><small>※<font color="red">この記事は基本情報技術者試験の旧制度（2022年以前）の記事です。<br />
題材となっている「午後問題」は現在の試験制度では出題されません。ご注意くださいませ。</font></small></p>
<p>&nbsp;</p>
<p>ブログ、SNS、動画など様々なメディアに情報が溢れ、基本情報技術者試験の対策方法は、さまざまな方の受験体験から、近しい人の勉強法や勉強時間などを参考にして、自身のやり方を決める時代になりました。</p>
<p>この「受験体験記」では、合否問わず、様々な受験体験をインタビューしています。</p>
<p>今回は 1 回目の受験で午後がわからなさすぎて途中退室してしまった悔しさから、午後の攻略を誓って、見事、正解率を 8 割までアップさせた 秦野 さんに、選択問題の選び方やアルゴリズムのトレースのコツなどをインタビューしました。</p>
<div class="divider mag_tp50 mag_bt20"></div>
<div class="row valign-wrapper">
<div class="col s3">
    <img class="circle z-depth-1" src="../../wp-content/uploads/2021/05/icon_hdn.jpg" loading="lazy">
  </div>
<div class="col s9 pad_20">
<div class="chip">お話を伺った方</div>
<p class="post-title">秦野　亘 さん <span class="small-text">（仮名）</span></p>
<p class="small-text">IT 企業所属。開発未経験で試験勉強を開始</p>
</p></div>
</div>
<div class="divider mag_h20"></div>
<style>.comment{background-color:#fafafa;color:#3f51b5;border-radius:10px;padding:1.5em;margin:3em 0 4em;position:relative}.icon{background:url(../../wp-content/uploads/2021/05/icon_hdn-150x150.jpg);background-size:cover;border-radius:50%;height:3em;width:3em;position:absolute;top:-1.5em;left:1em;border:3px solid #fff}.comment p{color:#3f51b5}dl.inline dd{margin-left:14.5em}</style>
<h2>選択問題は自分の将来なりたいITエンジニア像から選ぶ</h2>
<p class="blue-grey-text">―― 受験は 2 回目と伺いましたが、 1 回目はどのような結果だったのでしょうか？</p>
<div class="comment">
<div class="icon"></div>
<p>1 回目の試験では、午前で 6 割は取れましたが、午後は 2 割しか取れませんでした。午後問題の対策が不十分なまま、試験日を迎えたこと、試験当日、問題がわからないからといって諦めて途中退室したこと、どちらの体験もとても悔しいものでした。
</p></div>
<p class="blue-grey-text">―― その悔しさをもとにどのような対策を考えられたのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>まずは午前免除を活用することで、午後試験の対策に少しでも多くの時間を割こうと考えました。その中でもアルゴリズムが苦手だったので、重点的に対策しようと計画しました。
</p></div>
<p class="blue-grey-text">―― 午前免除試験はいかがでしたか？</p>
<div class="comment">
<div class="icon"></div>
<p>もともと午前は 6 割の正解率でしたが、 8 割の正解率で合格できました。午前だけに集中できるのはよかったですね。
</p></div>
<p class="blue-grey-text">―― いいですね。では、続く午後の対策について。幅広く分野がありますが、どこに注力されたのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>苦手のアルゴリズムの次に重視したのが、配点の変わった情報セキュリティです。ちなみに、今回の試験制度変更で必須問題の対策はどれも重要になったと思っています。</p>
<p>あとは<span class="bold">選択分野ですが、私は将来的にどのような IT エンジニアを目指したいかで選びました</span>。
</div>
<p class="blue-grey-text">―― なりたい将来像をベースにするのはとても良いですね。具体的にどんな IT エンジニアになりたいとお考えなのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>様々な分野をまんべんなく知っているマネージャのようなジェネラリストではなく、テクノロジのスペシャリストを目指しています。なので 1 つだけ外して、選択分野はテクノロジ系の分野をすべて勉強しました。
</p></div>
<p class="blue-grey-text">―― いいモチベーションですね！ちなみに外したのはどの分野だったのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>将来的なことを考えてネットワークだけ外しました。ただ情報セキュリティでもネットワークの知識が必要なので、ある程度は勉強していました。
</p></div>
<h2>基本情報の JOIN の攻略方法</h2>
<p class="blue-grey-text">―― 計画は順調に進んだのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>基本的には計画通りに進みましたが、想定よりラクになったものはなく、逆に想定よりつまづいたものがありました。
</p></div>
<p class="blue-grey-text">―― どこでつまづいたのでしょうか？</p>
<div class="comment">
<div class="icon"></div>
<p>ピンポイントですが、データベースの JOIN を使う問題です。
</p></div>
<p class="blue-grey-text">―― とても細かいところですが、確かに難所ですよね。基本情報の問題ではテーブルのレコードが少ないので、 SQL は演習にしにくいのですが、どのように対策したのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>問題文に定義されているテーブルや、問題の選択肢でイメージしにくいものを、紙に書き出して整理していました。特に <span class="u">JOIN は RIGHT で結合しているか、 LEFT で結合しているかで結果が変わる</span>ので、紙に書き出すと整理しやすくなりました。
</div>
<p class="blue-grey-text">―― 確かに！それはわかりやすくなりますね</p>
<div class="comment">
<div class="icon"></div>
<p>JOIN の問題もそうですが、現場で SQL をよく見るので、データベースの問題で学んだことが、将来、自分一人で SQL を書くときには役に立ちそうです。と言っても、これは基本情報で学ぶ知識全般にも言えることですね。
</p></div>
<h2>アルゴリズムのトレースのコツは自分の間違えを辿りやすくすること</h2>
<p class="blue-grey-text">―― では、先ほど挙げて頂いたアルゴリズムですが、どこが苦手だったのですか？</p>
<div class="comment">
<div class="icon"></div>
<p>見慣れない擬似言語で、かつ長いプログラムを読んでいると、とにかく何をしているのか分からず、迷子になってしまっていました。そこで、頭の中で処理がイメージできるようになるまで、トレースの練習をしていました。
</p></div>
<p class="blue-grey-text">―― トレースにもコツがあるのでしょうか？</p>
<div class="comment">
<div class="icon"></div>
<p>アルゴリズムの問題では、ほとんどの年度で空欄を埋める問題が出ています。その<span class="u">空欄の使い方にコツがある</span>と思います。</p>
<p>例えば、解答を見て「自分はウだと思うが正解はイだった」だった場合、イの選択肢が入った状態、ウの選択肢が入った状態でそれぞれトレースして、比べてみると理解が深まると思います。
</p></div>
<p class="blue-grey-text">―― なるほど、自分がなぜ間違えたのか、わかりやすくなりますね</p>
<div class="comment">
<div class="icon"></div>
<p>あとはそれぞれのトレース結果に、登場する変数が 1 行毎にどのような値になるのか、面倒がらずに書くと、さらに良いですね。あとで見直したときに、どこでトレースを間違えたのか把握しやすくなります。
</p></div>
<p class="blue-grey-text">―― トレースは自分の考えた軌跡を修正していくのがコツなんですね。<br />
では、その勉強の成果はいかがでしたか？</p>
<div class="comment">
<div class="icon"></div>
<dl class="inline">
<dt>情報セキュリティ</dt>
<dd>100 %</dd>
<dt>アルゴリズム</dt>
<dd>70 %</dd>
<dt>プログラミング言語</dt>
<dd>100 %</dd>
<dt>選択問題1</dt>
<dd>100 %</dd>
<dt>選択問題2</dt>
<dd>70 % </dd>
</dl>
<p>で全体では 8 割 近くまで正解率をアップできました！ 1 回目が 2 割だったので、しっかり成果を出せてよかったと思っています。
</p></div>
<p class="blue-grey-text">―― 素晴らしいですね!!<br />
最後に受験者の方へのメッセージがあればお願いします</p>
<div class="comment">
<div class="icon"></div>
<p>まずは必須問題で得点を稼げるように、具体的には練習時に満点を取れるまで演習することをおすすめします。最悪、選択問題まで手が回らなくても、必須問題全てが取れていれば合格できます。</p>
<p>また、選択問題もなるべく捨てない、捨てても 1 ～ 2 分野までにするのがよいと思います。選択問題が 2 問しか出ないからといって、自分の好きや得意で 2 つだけ選んで勉強するのは NG です。なぜなら、本番でその分野が出題されず、まったく勉強していない分野を選ぶことになってしまって、痛い目を見るからです。
</p></div>
<p class="blue-grey-text">―― 必須問題が最優先ですね。貴重なアドバイスありがとうございます。今日はありがとうございました！</p>
<div class="comment">
<div class="icon"></div>
<p>ありがとうございました。
</p></div><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/jukenki/interview_with_hdn/">本番で午後がわからなすぎて諦めて途中退室した悔しさをバネに、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>手順をヒントにトレースする練習問題｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/trace_with_steps/</link>
		<pubDate>Thu, 09 Jul 2020 06:45:08 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[トレースのコツ]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=patterns_algorithms&#038;p=4316</guid>
		<description><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。 苦手を克服するには [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/trace_with_steps/">手順をヒントにトレースする練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、基本情報技術者試験で、多くの受験者が苦手意識を持っている科目 B 試験 アルゴリズムとプログラミング分野の「アルゴリズム穴埋め問題」に的を絞って、正解を見出すポイントを詳しく説明します。</p>
<p>苦手を克服するには、短いプログラムを何度も練習して、穴埋めに慣れることが重要です。</p>
<p>そのために、実際の試験問題の一部をアレンジした練習問題を作りました。とても短い問題ですので、気軽に取り組んでください。</p>
<style>article,pre{font-family:consolas,'Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -7.5%;padding:1em 7.5%}.card-panel>pre{margin:1em -24px;padding:1em 24px}ol.style-alpha li{list-style-type:lower-alpha}@media only screen and (max-width:600px){ol{padding-left:1.5em}}</style>
<h2>練習問題</h2>
<div class="card-panel">
問 4　「挿入ソートで昇順に整列するプログラム」（平成 19 年度 春期 午後）を一部改変</p>
<p>　手続 InsertSort は、引数で与えられた配列 A[] を、挿入ソートで昇順に整列する。配列 A[] の添字は 0 から始まり、要素数は引数 N で与えられる。挿入ソートの手順は、次のとおりである。</p>
<ol>
<li>まず、 A[0] と A[1] を整列し、次に A[0] から A[2] までを整列し、その次に A[0] から A[3] までというように、整列する区間の要素を一つずつ増やしていき、最終的に A[0] から A[N &#8211; 1] までを整列する。</li>
<li>整列する区間が A[0] から A[M]（ 1 ≦ M &lt; N ）までのとき、 A[M] を既に整列された列 A[0] , <i class="material-icons">more_horiz</i>, A[M &#8211; 1] 中の適切な位置に挿入する。その手順は次のとおりである。
<ol class="style-alpha mag_h20">
<li>A[M] の値を、作業領域 Tmp に格納する。</li>
<li>A[M &#8211; 1] から A[0] に向かって Tmp と比較し、 Tmp よりも大きな値を順次隣（要素番号の大きい方）に移動する。</li>
<li>b. で最後に移動した値の入っていた配列要素に Tmp の値を格納する。 b. で移動がなかった場合には A[M] に格納する。</li>
</ol>
</li>
</ol>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<p>［プログラム］</p>
<pre>
◯InsertSort(整数型の配列: A, 整数型: N)
  整数型: Idx1, Idx2, Tmp
  論理型: Loop

  for (Idx1 を 1 から N より小さい間 1 つずつ増やす)
    Tmp ← A[Idx1]
    Idx2 ← <span class="blank">a</span>
    Loop ← true

    while (Idx2 が 0 以上でかつ Loop が true)
      if (A[Idx2] が Tmp より大きい)
        <span class="blank">b</span>
        Idx2 ← Idx2 - 1
      else
        Loop ← false
      endif
    endwhile

    A[Idx2 + 1] ← Tmp
  endfor
</pre>
<p>設問　プログラム中の<span class="blank"></span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群<br />
ア　Idx1<br />
イ　Idx1 + 1<br />
ウ　Idx1 &#8211; 1<br />
エ　1 &#8211; Idx1</p>
<p>b に関する解答群<br />
ア　A[Idx2] ← A[Idx2 + 1]<br />
イ　A[Idx2] ← A[Idx2 &#8211; 1]<br />
ウ　A[Idx2 + 1] ← A[Idx2]<br />
エ　A[Idx2 &#8211; 1] ← A[Idx2]
</p></div>
<h2>ポイント1: 手順の説明とプログラムを対応付ける（その1）</h2>
<p>この問題のように、<span class="u">問題文に手順が詳しく示されている場合は、手順の説明とプログラムを対応付けることで、空欄で行う処理がわかる</span>場合がよくあります。</p>
<p>以下は、手順の説明とプログラムを対応付けた例です。ここでは、手順の説明を<span class="light-blue-text">青色の文字</span>でコメントとして追加しています。実際の試験では、これを頭の中でやってください。</p>
<figure><figcaption>図　手順の説明とプログラムを対応付けた例</figcaption>［プログラム］</p>
<pre>
◯InsertSort(整数型の配列: A, 整数型: N)
  整数型: Idx1, Idx2, Tmp
  論理型: Loop

  <span class="light-blue-text">/* 1. まず、 A[0] と A[1] を整列し、次に A[0] から A[2] までを整列し、*/</span>
  <span class="light-blue-text">/* その次に A[0] から A[3] までというように、整列する区間の要素を一つ */</span>
  <span class="light-blue-text">/* ずつ増やしていき、最終的に A[0] から A[N - 1] までを整列する。 */</span>
  for (Idx1 を 1 から N より小さい間 1 つずつ増やす)
    <span class="light-blue-text">/* 2. 整列する区間が A[0] から A[M] ( 1 ≦ M &lt; N ) までのとき、A[M] を */</span>
    <span class="light-blue-text">/* 既に整列された列 A[0], <i class="material-icons">more_horiz</i>, A[M - 1] 中の適切な位置に挿入する。 */</span>
    <span class="light-blue-text">/* その手順は次のとおりである。 */</span>
    <span class="light-blue-text">/*  a. A[M] の値を、作業領域 Tmp に格納する。 */</span>
    Tmp ← A[Idx1]
    <span class="light-blue-text">/*  b. A[M - 1] から A[0] に向かって */</span>
    Idx2 ← <span class="blank">a</span>
    Loop ← true

    while (Idx2 が 0 以上でかつ Loop が true)
      <span class="light-blue-text">/* Tmp と比較し、Tmp よりも大きな値を */</span>
      if (A[Idx2] が Tmp より大きい)
        <span class="light-blue-text">/* 順次隣（要素番号の大きい方）に移動する。 */</span>
        <span class="blank">b</span>
        Idx2 ← Idx2 - 1
      else
        Loop ← false
      endif
    endwhile

    <span class="light-blue-text">/* c. b. で最後に移動した値の入っていた配列要素に Tmp の値を格納する。 */</span>
    <span class="light-blue-text">/* b. で移動がなかった場合には A[M] に格納する。 */</span>
    A[Idx2 + 1] ← Tmp
  endfor
</pre>
</figure>
<h2>ポイント2: 手順の説明とプログラムを対応付ける（その2）</h2>
<p>手順の説明とプログラムを対応付けたことで、以下がわかります。</p>
<pre>
  <span class="light-blue-text">/*  a. A[M] の値を、作業領域 Tmp に格納する。 */</span>
  Tmp ← A[Idx1]
</pre>
<p>手順の説明で M と呼んでいる変数は、プログラムでは Idx1 です。</p>
<pre>
  <span class="light-blue-text">/*  b. A[M - 1] から A[0] に向かって */</span>
  Idx2 ← <span class="blank">a</span>
  Loop ← true

  while (Idx2 が 0 以上でかつ Loop が true)
</pre>
<blockquote class="mag_h10">
<p class="grey-text"> A[M &#8211; 1] から A[0] に向かって</p>
</blockquote>
<p>を A[Idx2] で示すので、空欄 a で Idx2 に設定する初期値は M &#8211; 1 です。説明の M がプログラムでは Idx1 なので、空欄 a は Idx1 &#8211; 1 であり、選択肢ウが正解です。</p>
<h2>ポイント3: 手順の説明とプログラムを対応付ける（その3）</h2>
<p>空欄 b がある分岐では、</p>
<pre>
  <span class="light-blue-text">/* Tmp と比較し、Tmp よりも大きな値を */</span>
  if (A[Idx2] が Tmp より大きい)
    <span class="light-blue-text">/* 順次隣（要素番号の大きい方）に移動する。 */</span>
    <span class="blank">b</span>
    Idx2 ← Idx2 - 1
</pre>
<blockquote class="mag_h10">
<p class="grey-text">Tmp と比較し、 Tmp よりも大きな値を順次隣（要素番号の大きい方）に移動する。</p>
</blockquote>
<p>という処理を行っています。</p>
<pre>A[Idx2] が Tmp より大きい</pre>
<p>なのですから、 Tmp より大きな値は A[Idx2] であり、この値を順次隣（要素番号の大きい方）に移動するのですから、 A[Idx2 + 1] ← A[Idx2] が適切であり、選択肢ウが正解です。</p>
<p>&nbsp;</p>
<p><span class="chip mag_rt10">解答</span>a － ウ, b － ウ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p><span class="bold">「習うより慣れろ」</span>ということわざがあります。アルゴリズム穴埋め問題の克服に関しては、正にその通りでしょう。</p>
<p>この連載では、これからも短い練習問題を掲載していきますので、穴埋めに慣れることを目指してください。</p>
<p>正解を見出すポイントとして、同じことが示されることもあると思いますが、それは、多くの問題に共通したポイントがあるからです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/trace_with_steps/">手順をヒントにトレースする練習問題｜アルゴリズムとプログラミング問題を解くコツ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>トレースのテクニックが身につく練習問題｜アルゴリズムとプログラミング問題を解くコツ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/patterns_algorithms/technique_trace/</link>
		<pubDate>Wed, 08 Jul 2020 08:06:19 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[スタック]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[トレースのコツ]]></category>
		<category><![CDATA[科目 B]]></category>

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