基本情報技術者(2種)−T

 

このページでは、しゅんぜい氏の発行されているメルマガのうち「基本情報(2種)」について

編集して掲載しています。

[ ホーム ] [ 上へ ] [ 基本情報技術者(2種)−U ]


確立(H12.秋 2種 問70)

 4人を無作為に選んだとき、生まれ月が同じ人のいる確率はおおよそ
 幾らか。ここで、月ごとの出生率は等しいものとする。

 ア 0.25   イ 0.43   ウ 0.57   エ 0.62



----------------------------------------------------------------------

 それでは、みなさんの回答を紹介します。
 どれも力作ぞろいです。ありがとうございます。

> わたしの計算では50%となってしまい、選択肢にありません。
> なぜでしょう(涙)

 どのように考えたのでしょうか?(^^;
 他の方の回答を良く見ておきましょうね。どうもありがとうございました。

> 求めたい確率は次のようになります。

> 生まれ月が同じ人のいる組み合わせの数
> 求める確率=───────────────────
> 4人の生まれ月の全ての組み合わせの数

> 分母の「全ての組み合わせ」は、「月ごとの出生率は等しい」とあるので、
> すぐに計算できます。

> 分母(全ての組み合わせ)= 12×12×12×12 通り

> 問題は分子ですが、次の4種類の場合が考えられます。

> 分子(生まれ月が同じ人のいる組み合わせの数)
> = 4人とも同じ生まれ月
> +3人が同じで、1人が別の生まれ月
> +2人が同じで、残りの2人は別々の生まれ月
> +2人が同じで、残りの2人も(先の2人とは別の)同じ生まれ月

> ●4人とも同じ場合は、全員1月、全員2月・・・と、12通りあります。
> ●3人が同じ場合は、3人の生まれ月は12通り、1人の生まれ月は11通りで
> す。さらに、ABCDの4人の内、別の生まれ月の人がAさんの場合、B
> さんの場合、・・・と、さらに4通り考えられます。従って、
> (3人が同じ)= 4×12×11 通り
> ●2人同じであとは別々の場合は、2人の生まれ月は12通り、1人は11通り、
> 最後の1人は10通りです。さらに、同じ生まれ月の2人の組み合わせは、
> AB、AC、AD、・・・と、6通りありますので、
> (2人同じ、残りは別々)= 6×12×11×10 通り
> ●2人ずつ同じ場合は、2人の生まれ月は12通り、あとの2人の生まれ月は
> 11通りです。4人を2人組みに分ける分け方は、3通りしかありません。
> (2人ずつ同じ)= 3×12×11 通り

> 以上をまとめると、求める確率は次のようになります。

> 12 + 4×12×11 + 6×12×11×10 + 3×12×11
> 求める確率 = ──────────────────────
> 12×12×12×12
> = 0.427...

> よって、四捨五入すれば「イ」の 0.43 が答えです。

 これは、まじめに解いてしまった解法ですね。間違いではありませんが、
 このやり方だと、計算量が多くなってしまい、ちょっと大変です(^^;
 どうもありがとうございました。

> これは同じ月に生まれた人が一組もない確率を求めると解きやすい
> と思います。まず、4人を無作為に選ぶので、生まれ月の選ばれ方は全部で
> 12の4乗 通り。このうち、同じ月に生まれた人が一組もないのは、
> 12個の中から4個を選ぶ順列(高校の数学で習う)なので、
> 12*11*10*9 通り。
> よって、同じ月に生まれた人が一組もない確率は、(12*11*10*9) / (12^4)
> ゆえに求める確率は、 1 - (12*11*10*9) / (12^4) ≒ 0.43
> 従って、答えは イ となります。

 「同じ月に生まれた人が一組もない確率」というのがポイントです。
 求める確率の逆の確率を求めて、1から引いてあげると求まります。
 あと、12^4 とは12の4乗(12を4回かける)という意味ですね。
 どうもありがとうございました。

> 生まれつきが同じ人のいる確率 = 1 − 全員誕生月が違う確率
> と考えて、

> ある1人の誕生月を決めてその人と残りの人が違う確率は
>    1/12×11/12×10/12×9/12
> これが12通り(12ヶ月分)あるので、全員誕生月が違う確率は
>    1/12×11/12×10/12×9/12×12
>   =495/864
> よって
> 同じ誕生月の人がいる確率 = 1 − 495/864
>              = 369/864
>              = 0.427・・・
>              = 0.43
> ということで、正解はイ

 数値が違うのは、途中で約分してあるだけで、同じ解き方です。
 どうもありがとうございました。
 次回は、ハンドル名(ペンネーム)もお願いします。

> 回答:イ
> 解説
> 4人の月の組合せの総数を求め、4人がすべて違う月となる場合の
> 数を引いた割合と考えました。
> 4人では大変なので2人で実際に考えていきます。

> 1−1  2−1  3−1  4−1
> 1−2  2−2  3−2  4−2
> 1−3  2−3  3−3  4−3
> 1−4  2−4  3−4  4−4
> 1−5  2−5  3−5  4−5
> 1−6  2−6  3−6  4−6  …………
> 1−7  2−7  3−7  4−7
> 1−8  2−8  3−8  4−8
> 1−9  2−9  3−9  4−9
> 1−10 2−10 3−10 4−10
> 1−11 2−11 3−11 4−11
> 1−12 2−12 3−12 4−12

> 2人の組合せの総数は 12 * 12 で良いと思います。したがって、
> 4人の場合は 12 * 12 * 12 * 12 = 20736 になります。

> 次は二人が違う月になる場合の数です。
>  1−1   〇2−1   〇3−1   〇4−1
> 〇1−2    2−2   〇3−2   〇4−2
> 〇1−3   〇2−3    3−3   〇4−3
> 〇1−4   〇2−4   〇3−4    4−4
> 〇1−5   〇2−5   〇3−5   〇4−5
> 〇1−6   〇2−6   〇3−6   〇4−6 …………
> 〇1−7   〇2−7   〇3−7   〇4−7
> 〇1−8   〇2−8   〇3−8   〇4−8
> 〇1−9   〇2−9   〇3−9   〇4−9
> 〇1−10  〇2−10  〇3−10  〇4−10
> 〇1−11  〇2−11  〇3−11  〇4−11
> 〇1−12  〇2−12  〇3−12  〇4−12

> 11回の組合せが12回続きます。12 * 11 で良いと思います。
> すると4人の場合は 12 * 11 * 10 * 9 = 11880 になります。

> 20736 - 11880 = 8856 が「生まれ月が同じ人のいる」場合の数と
> なります。
> 8856 / 20736 = 0.427

> 三日考えました。合っていると良いのですが...

 これも式は微妙に違いますが、話の流れは同じです。
 3日かかっても、自力で正解にたどり着いたのは、すばらしいことだと
 思います。どうもありがとうございました。

> これは、4人の誕生月の組み合わせパターンは、
> 12*(掛ける)12*12*12=20736通り。

> そして「生まれ月が同じ」というのは4人のうち2人が同じ、3人が同じ、
> 4人とも同じというパターンがあって、これをいちいち算出すると
> ややこしいので、「4人とも違う誕生月」が何通りあるかをもとめて、
> それを、全部の組み合わせのパターン(20736通り)から引けばいい
> かと思います。
> 4人とも違う誕生月のパターンは、
> 12*11*10*9=11880通りです。

> この求め方は、袋の中に1〜12の番号の付いた12個の玉があって、
> それを1人ずつ順番にとっていく(袋の中には戻さない)という場面を
> 想像してみます。
> 1人目は、12個の中から1個とります。どの玉をとるかで12通り
> 考えられます。
> 2人目は、11個の中から1個とります。12個のうち1個はもう、
> 1人目が取って袋の中にありませんから。よって、11通り。
> 3人目は、10個の中から1個取ります。よって10通り。
> 4人目は、9個の中から1個取ります。よって9通り。
> このアクションが連続して同時に起こるというときには、数字を
> 掛け合わすと私は覚えています。

> よって、「生まれ月が同じ」パターンは、
> 20736−11880=8856通りとなります。

> 従って「生まれ月が同じ」確率は
> 8856/(割る)20736=0.427033・・・約0.42となり
> 「イ」が正解となります。

 途中に出てきた考え方は、順列の考え方ですね。
 どうもありがとうございました。

> (その1)
> 4人A,B,C,Dの生まれつきが同じ場合というのは、4パターン考えられます。
> 1) 2人が同じ月で後はバラバラ (例)1月、1月、2月、6月
> 2) 2人が同じ月、後の2人も同じ月 (例)3月、3月、9月、9月
> 3) 3人が同じ月 (例)7月、7月、7月、8月
> 4) 4人とも同じ月 (例)5月、5月、5月、5月

> (パターン1)
> 例えばAとBの生まれ月が同じ確率を考えると、
> ・Aの生まれ月は何月でもいい 1
> ・Bの生まれ月はAと同じ 1/12
> ・Cの生まれ月はA,Bの生まれ月以外 11/12
> ・Dの生まれ月はA,Bと、Cの生まれ月以外 10/12
> となるので確率は1×(1/12)×(11/12)×(10/12)=55/864となる

> 生まれつきが同じ2人の組合せは
> (A,B),(A,C),(A,D),(B,C),(B,D),(C,D)
> の6通りなので(パターン1)の確率は
> 6×(55/864)=55/144

> (パターン2)
> 例えばAとB,CとDの生まれつきがそれぞれ同じ確率を考えると
> ・Aの生まれ月は何月でもいいので 1
> ・Bの生まれ月はAと同じ 1/12
> ・Cの生まれ月はA,Bの月以外 11/12
> ・Dの生まれ月はCと同じ 1/12
> となるので確率は1×(1/12)×(11/12)×(1/12)=11/1728となる

> 生まれつきが同じ2人が2組みある組合せは
> ((A,B),(C,D)),((A,C),(B,D)),((A,D),(B,C))
> の3通りなので(パターン2)の確率は
> 3×(11/1728)=11/576

> (パターン3)
> 例えばA,B,Cの生まれつきが同じ確率を考えると
> ・Aの生まれ月は何月でもいい 1
> ・Bの生まれ月はAと同じ 1/12
> ・Cの生まれ月もAと同じ 1/12
> ・Dの生まれ月はAと違う月 11/12
> となるので確率は1×(1/12)×(1/12)×(11/12)=11/1728となる

> 生まれ月が同じ3人の組合せは
> (A,B,C),(A,B,D),(A,C,D),(B,C,D)
> の4通りなので(パターン3)の確率は
> 4×(11/1728)=11/432

> (パターン4)
> ・Aの生まれ月は何月でも良い 1
> ・Bの生まれ月はAと同じ 1/12
> ・Cの生まれ月はA,Bと同じ 1/12
> ・Dの生まれ月はA,B,Cと同じ 1/12
> となるので(パターン4)となる確率は1×(1/12)×(1/12)×(1/12)=1/1728

> それぞれのパターンとなる確率をすべて足せば聞かれている確率が求まる
> (パターン1)+(パターン2)+(パターン3)+(パターン4)
> 55/144 + 11/576 + 11/432 + 1/1728 = 41/96
> = 0.427..(イ)
> ---
> でも実際はこんなめんどくさい事はしなくても大丈夫
> A,B,C,Dの生まれ月が全部違う確率は
> 1×11/12×10/12×9/12=55/96
> このとき以外は生まれ月が重なった人がいるという事なので
> 求める確率は
> 1-(55/96)=41/96=0.427..(イ)
> 高校の確率で出て来る余事象の考え方です。

 やはり、余事象の考え方を使ったほうがラクですね。
 どうもありがとうございました。

 

 戻る


2進数の除算(H12.春 2種 問6)

 

式 0.0011(2)÷0.001(2) の値はどれか。
 ここで、x.xx (2) は2進数を表わす。

 ア 0.00001 (2)
 イ 0.000011 (2)
 ウ 0.11 (2)
 エ 1.1 (2)

 しゅんぜい注)実際の問題文と表記が異なりますが、数字は全て2進数を
        表していると思ってください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.春 2種 問6)
----------------------------------------------------------------------
 エ 1.1 (2)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日は、2進数に関する問題でした。
 2進数に関する問題はいろいろ出題されていますが、今日は計算問題を
 取り上げてみました。

 さて、0.0011(2)÷0.001(2) の計算ですが、これを10進数に直して
 割り算をしようとすると、とってもめんどくさくなってしまいますので、
 違うやり方を考えましょう。

 まず、割り算なので分数にしてみます。

    0.0011(2)
   ──────
    0.001(2)

 ここで、分子、分母をそれぞれ3ビット左にシフトさせます。
 つまり、2の3乗を分子、分母にかけると、

    1.1(2)
   ─────
    1(2)

 となります。この分母の 1(2) は、2進数でも10進数でも「1」です。

 つまり、1.1(2) を「1」で割っても 1.1(2) なので「エ」が正解ですね。

 ん?よくわからないぞ。という人は、10進数の 0.0011÷0.001 を
 同じように分数で考えてみてください。
 10進数なら、左に3ビット分シフトするというのが、1000倍すること
 なので、わかりやすいと思います。

 戻る


16進小数の変換(H12.秋 2種 問2)

 

 16進小数 2A.4C と等しいものはどれか。

 ア 2^5 + 2^3 + 2^1 + 2^(-2) + 2^(-5) + 2^(-6)

 イ 2^5 + 2^3 + 2^1 + 2^(-1) + 2^(-4) + 2^(-5)

 ウ 2^6 + 2^4 + 2^2 + 2^(-2) + 2^(-5) + 2^(-6)

 エ 2^6 + 2^4 + 2^2 + 2^(-1) + 2^(-4) + 2^(-5)

> しゅんぜい注)2^5 は 2 の 5 乗、2^(-2) は 2 の (-2) 乗を表します。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.秋 2種 問2)
----------------------------------------------------------------------
 ア 2^5 + 2^3 + 2^1 + 2^(-2) + 2^(-5) + 2^(-6)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日は、16進小数に関する問題でした。
 基本的な問題ですね。

 先日やった、N進数の話を思い出しましょう。
 Nには、自然数が入ります。

 今、1234.56という10進数を考えます。
 各位に注目すると、1234.56は次のように考えることが出来ます。

    1×1000=1000   (千の位が1)   10^3
    2× 100= 200   (百の位が2)   10^2
    3×  10=  30   (十の位が3)   10^1
    4×   1=   4   (一の位が4)   10^0
    5× 0.1=   0.5 (十分の一の位が4)10^(-1)
  +)6×0.01=   0.06(百分の一の位が4)10^(-2)
  ──────────────────────────  ↑
           1234.56          ポイント

 ポイントは、右側に書いた部分です。
 10進数というのは、各位が「10の○乗」になっているとも言えます。

 ○に入る数字は、小数点の左側(整数部分)では一番右が0になり、
 左に行くに連れて1つずつ増えます。一方、小数点の右側(小数部分)は
 右に行くに連れて1つずつ減っていきます。

 N進数に拡張すれば、「Nの○乗」ずつ増えていきます。


 また、16進小数 2A.4C は2進数に変換することが出来ます。
 16進数を2進数に変換するには、16進数の各位の数字に注目し、
 それを2進数に変えます。

 つまり・・・

 16進数    2    A  .  4    C
   ↓ 
  2進数   0010   1010 . 0100   1100

 よって、16進小数で 2A.4C は、2進数だと 00101010.01001100 と
 表せますね。よって、小数点より左側の整数部分では 2^5, 2^3, 2^1 が
 小数点より右側の小数部分では 2^(-2), 2^(-5), 2^(-6) ということで
 「ア」が正解となります。

 戻る


浮動小数点演算(H12.秋 2種 問7)

 

 浮動小数点数の加減算を実行したとき、けた落ちが発生する演算はどれか。
 ここで、有効けたは、仮数部3けたに対して、演算は6けたで行われるもの
 とする。

 ア 0.123 × 10^2 + 0.124 × 10^(-2)

 イ 0.234 × 10^5 − 0.221 × 10^2

 ウ 0.556 × 10^6 + 0.552 × 10^4

 エ 0.556 × 10^7 − 0.552 × 10^7

> しゅんぜい注)10^2 は 10 の 2 乗、10^(-2) は 10 の (-2) 乗を表します。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.秋 2種 問7)
----------------------------------------------------------------------
 エ 0.556 × 10^7 − 0.552 × 10^7

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日は、浮動小数点演算時のけた落ちに関する問題でした。

 けた落ち(cancellation error) とは、絶対値のほぼ等しい二つの数の
 絶対値の差を求めたとき、有効けた(有効数字とも言います)が減るために
 発生する誤差のことをいいます。

 「有効けたが減る」と書きましたが、問題文に

> 有効けたは、仮数部3けたに対して、演算は6けたで行われるものとする。

 と書いてありますので、これをふまえて、選択肢を順に見ていきましょう。


> ア 0.123 × 10^2 + 0.124 × 10^(-2)

   仮数部とは、0.123 の部分のことをいいます。これで3けたです。
   それに対して、10^2 の部分を指数部といいます。

   演算は「有効けた6けたで演算する」と書いてありますので、
   それぞれ6けたに直してから、次のように計算します。

     0.123 × 10^2  = 12.3000
   +)0.124 × 10^(-2) = 0.00124
   ────────────────
               12.30124 (6けたにするなら 12.3012)

   計算後は、「仮数部+指数部」という形に戻します。

    12.30124 = 0.123 × 10^2

   よって、演算前と比べ、有効けたは減っていないので
   けた落ちは発生していません。


> イ 0.234 × 10^5 − 0.221 × 10^2

   同様に

     0.234 × 10^5 = 23400.0
   −)0.221 × 10^2 = 22.1000
   ────────────────
              23422.1000 (23422.1)

   元に戻して 23422.1 = 0.234 × 10^5

   これもけた落ちは発生していません。


> ウ 0.556 × 10^6 + 0.552 × 10^4

     0.556 × 10^6 = 556000
   +)0.552 × 10^4 = 5520.00
   ────────────────
              561520.00 (561520)

   元に戻して 561520 = 0.561 × 10^6

   これもけた落ちは発生していません。


> エ 0.556 × 10^7 − 0.552 × 10^7

     0.556 × 10^7 = 5560000 (556000 × 10^1)
   −)0.552 × 10^7 = 5520000 (552000 × 10^1)
   ───────────────────────
               40000 ( 4000 × 10^1)

   元に戻して 40000 = 0.4 × 10^5

   0.4 × 10^5 は、仮数部が1けたになっていますね。
   つまり、3けたから1けたに「けた落ち」しています。

   よって、正解は「エ」になります。


 戻る


桁落ち誤差(H11.春 2種 問10)


 けた落ちによる誤差に関する記述として、正しいものはどれか。

 ア 指定された有効けた数で演算結果を表すために、切捨て、切上げ、
   四捨五入などで下位のけたを削除することによって発生する誤差

 イ 絶対値の非常に大きな数と小さな数の足し算や引き算を行ったとき、
   小さい数が試算結果に反映されないために発生する誤差

 ウ 絶対値のほぼ等しい二つの数の絶対値の差を求めたとき、
   有効けたが減るために発生する誤差

 エ 浮動小数点数の計算処理の打ち切りと、指定した規則で行うことに
   よって発生する誤差


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H11.春 2種 問10)
----------------------------------------------------------------------
 ウ 絶対値のほぼ等しい二つの数の絶対値の差を求めたとき、
   有効けたが減るために発生する誤差

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今週も引き続き、数学の知識に関する問題をやっていきます。
 今日も、浮動小数点演算時のけた落ちに関する問題でした。
 3連休だった方も多いと思いますので、金曜日の分をさっき見たばかり
 という方は、正解できたのでは?

 けた落ち(cancellation error) とは、絶対値のほぼ等しい二つの数の
 絶対値の差を求めたとき、有効けた(有効数字とも言います)が減るために
 発生する誤差のことをいいます。


 選択肢を順に見ていきましょう。

> ア 指定された有効けた数で演算結果を表すために、切捨て、切上げ、
>   四捨五入などで下位のけたを削除することによって発生する誤差

   これは、丸め誤差(rounding error) のことですね。

   「丸める」というのは、わかりやすく省略してしまうことを言います。
   つまり、「円周率を 3.14 でなく 3 にしよう!」と言うように、
   意図的に下位のけたを削除する(この場合は切捨て)ことをいいます。

   #小学校では 3.14 から「およそ 3 」になるそうですね。


> イ 絶対値の非常に大きな数と小さな数の足し算や引き算を行ったとき、
>   小さい数が試算結果に反映されないために発生する誤差

   これは、情報落ち誤差(loss of trailing digit) のことです。

   たとえば、プログラムで数値を扱うときに有効数字(有効けた)が
   4桁だとしましょう。

   そのとき、a = 1.234 * 10^2 と b = 1.234 * 10^(-2) という
   2つの数 a , b の和を考えてみます。

   まず、手計算をしてみると

     a = 1.234 * 10^2 = 123.4
     b = 1.234 * 10^(-2) = 0.01234

     a + b = 123.4123

   ここで、a + b = 123.4123 となりますが、これを上のコンピューター
   のプログラムで行った場合は、有効数字(有効けた)が4桁なので

     a + b = 1.234 * 10^2

   と表現されてしまいます。つまり、実際との誤差が 0.01234 ですね。
   このような情報が落ちる(無くなる)誤差を情報落ち誤差といいます。


> ウ 絶対値のほぼ等しい二つの数の絶対値の差を求めたとき、
>   有効けたが減るために発生する誤差

   これが、けた落ち誤差(cancellation error) です。

   これも有効数字(有効桁)が4桁だとしましょう。
   そのとき、a = 5.678 * 10^(-1) と b = 5.643 * 10^(-1) という
   2つの数 a , b の差を考えてみます。

     a = 5.678 * 10^(-1) = 0.5678
     b = 5.643 * 10^(-1) = 0.5643

     a - b = 0.0035

   つまり、これを元の形に直せば 3.5 * 10^(-3) と表現されてしまい
   有効数字(有効けた)が4桁から2桁になってしまいます。

   このような、有効けたが減る(落ちる)ために発生する誤差が
   けた落ち誤差です。


> エ 浮動小数点数の計算処理の打ち切りと、指定した規則で行うことに
>   よって発生する誤差

   これは、打切り誤差(truncation error) です。

   たとえば、1/3 * 3 (3分の1×3)を考えてみましょう。

   手計算でやれば 1 になりますが、
   8桁の数字が扱えるコンピュータで計算すると

     1/3 = 0.33333333

   となってしまうため、計算結果は 0.99999999 となります。

   これを防ぐには、計算順序を変える必要があります。
   この場合には、(1 * 3)/ 3 にすれば良いですね。

   このように、ある規則で行うことにより発生する誤差を打切り誤差と
   いいます。

 戻る


論理演算(H12.秋 2種 問4)

 

 IEEE 754(1985) 標準では、32 ビットの浮動小数点を次の形式で表現する。


  ┌―┬―――――――┬――――――――――――――┐
  │S│E(8ビット)│   M(23ビット)   │
  └―┴―――――――┴――――――――――――――┘

  S:符号、1ビット
  E:指数部、8ビット
  M:仮数部、23ビット

 この指数部を取り出すためのマスクビットを、16進数表現したものは
 どれか。ここで、マスクビットとは、必要な情報を取り出すために
 ビットごとの AND 演算を行う際に使うビットパターンのことである。

 ア 0FF00000
 イ 7F800000
 ウ FF000000
 エ FF800000



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.秋 2種 問4)
----------------------------------------------------------------------
 イ 7F800000
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日は、論理演算(マスクビット)の問題でした。
 論理演算の問題も毎回出題されていますね。必須です。

 問題文に「指数部を取り出すためのマスクビット」とありましたが
 マスクビットとは、必要なビット列の情報を取り出すために使われる
 ビットパターンを言います。

 この問題では、



  ┌―┬―――――――┬――――――――――――――┐
  │S  |    E(8ビット)      |             M(23ビット)                |  
  └―┴―――――――┴――――――――――――――┘

  S:符号、1ビット
  E:指数部、8ビット
  M:仮数部、23ビット

 となっているので、Eの部分を取り出すということになります。

 Eの部分を取り出すのに AND 演算を使うように書いてあります。
 AND 演算は、2つの数があって、両方「1」ならば「1」それ以外は「0」
 という結果になる演算方法です。論理積とも言います。
 下の表で確認しておきましょう。


   ┌―――┬―――┬―――――┐
   │ x │ y │x AND y │
   ├―――┼―――┼―――――┤
   │ 0 │ 0 │  0  │
   ├―――┼―――┼―――――┤
   │ 0 │ 1 │  0  │
   ├―――┼―――┼―――――┤
   │ 1 │ 0 │  0  │
   ├―――┼―――┼―――――┤
   │ 1 │ 1 │  1  │
   └―――┴―――┴―――――┘


 

 さて、本題は「Eの部分を取り出す」ことですが、Eの部分を取り出すには
 マスクビットを作用させた後、SやMの部分を0にする必要があります。

 これは、AND 演算を考えれば、作用させるマスクビットが0のビットの場合
 は、SやMのビットが「0」でも「1」でも演算結果が「0」になることが
 わかります。
 よって、ここまででマスクビットは


  ┌―┬―――――――┬――――――――――――――┐
  │S│E(8ビット)│   M(23ビット)   │
  └―┴―――――――┴――――――――――――――┘

 → 0EEEEEEEE00000000000000000000000


 というように考えられます。  

さらに、残りのEの部分ですが、この部分のビット列を「1」にしておく

ことで、0のビットなら「0」を1のビットなら「1」を取り出すことができます。

したがって、マスクビットは   01111111100000000000000000000000  となります。

これを4ビットずつ区切って16進数表現に直せば 

 


  0111 1111 1000 0000 0000 0000 0000 0000 
   (7) (F) (8) (0) (0) (0) (0) (0) 

よって、正解は 7F800000 となります。 

#なんか、今日の解説は意味不明かもしれません・・・。   まぁ、取り出すところが「1」で、残りは「0」ということです。

 

戻る


論理演算(H12.秋 2種 問10)

 関数 eq(X,Y) は、引数XとYの値が等しければ1を返し、異なれば0を
 返す。eq(eq(A,B),eq(B,C)) を呼び出したとき、1が返ってくるための
 必要十分条件はどれか。

 ア A=B かつ B=C
 イ A=B 又は B=C
 ウ (A=B かつ B=C) 又は A=C
 エ (A=B かつ B=C) 又は (A≠B かつ B≠C)




━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.秋 2種 問10)
----------------------------------------------------------------------
 エ (A=B かつ B=C) 又は (A≠B かつ B≠C)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日も、論理演算(関数がらみ)の問題でした。
 ていねいに考えれば、比較的やさしい問題ですね。

 では、解いていきます。

> eq(X,Y) は、引数XとYの値が等しければ1を返し、異なれば0を返す。

 これが、この問題に出てくる関数の条件ですね。
 この記述を数式で表現すれば、

   X=Yのとき、eq(X,Y)=1 ・・・(*)

   X≠Yのとき、eq(X,Y)=0 ・・・(**)

 となります。そして、問題は eq(eq(A,B),eq(B,C))=1になるための
 必要十分条件を求めればいいのですね。

 eq(eq(A,B),eq(B,C))=1を満たすには、条件(*) から

   eq(A,B)=eq(B,C)

 のときであることがわかります。

 eq の関数は、0か1の値を取る関数なので

  (1) eq(A,B)=eq(B,C)=1

 または、

  (2) eq(A,B)=eq(B,C)=0

 になるときが、求める必要十分条件になります。

 ★(1) の場合

  eq(A,B)=1 になるには (*) よりA=Bのときですね。
  同様に、eq(B,C)=1 になるにはB=Cのときです。

  よって、(1) は A=B かつ B=C となります。

 ★(2) の場合

  eq(A,B)=0 になるには (**) よりA≠Bのときですね。
  同様に、eq(B,C)=0 になるにはB≠Cのときです。

  よって、(2) は A≠B かつ B≠C となります。


 したがって、必要十分条件は (1) または (2) より

   (A=B かつ B=C) または (A≠B かつ B≠C)

 となるので、「エ」が正解になります。

 

戻る


否定論理和(H12.秋 2種 問9)

 

 NOR(否定論理和)は2項論理演算の一つである。xNORyの行に入る結果は
 どれか。


    ┌――――┬―――――――――┐
    │ x  │ 0 0 1 1 │
    ├――――┼―――――――――┤
    │ y  │ 0 1 0 1 │
    ├――――┼―――――――――┤
    │xNORy │         │
    └――――┴―――――――――┘

 ┌―┬―――――――――┐
 │ア│ 0 0 0 1 │
 ├―┼―――――――――┤
 │イ│ 0 1 1 0 │
 ├―┼―――――――――┤
 │ウ│ 1 0 0 0 │
 ├―┼―――――――――┤
 │エ│ 1 1 1 0 │
 └―┴―――――――――┘


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.秋 2種 問9)
----------------------------------------------------------------------


  ┌―┬―――――――――┐
 │ウ│ 1 0 0 0 │
 └―┴―――――――――┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日も、論理演算(否定論理和)の問題でした。
 まぁ、これもかなりやさしい問題だと思いますが。

 NOR(否定論理和)とは、論理和演算と否定演算がくっついたものです。

 論理和とは、簡単にいうと、どちらかに「1」があれば「1」になります。
 OR 演算とも言います。


   ┌―――┬―――┬―――――┐
   │ x │ y │x OR y │
   ├―――┼―――┼―――――┤
   │ 0 │ 0 │  0  │
   ├―――┼―――┼―――――┤
   │ 0 │ 1 │  1  │
   ├―――┼―――┼―――――┤
   │ 1 │ 0 │  1  │
   ├―――┼―――┼―――――┤
   │ 1 │ 1 │  1  │
   └―――┴―――┴―――――┘


 また否定演算とは、値の真偽(0と1)が逆転する演算です。
 NOT 演算とも言います。


   ┌―――┬―――┐
   │ x │NOT x│
   ├―――┼―――┤
   │ 1 │ 0 │
   ├―――┼―――┤
   │ 0 │ 1 │
   └―――┴―――┘

 よって、NOR(否定論理和)演算は論理和を考えた後、否定演算を行えば 


    ┌―――┬―――┬―――――┬―――――┐
   │ x │ y │x OR y │x NOR y │
   ├―――┼―――┼―――――┼―――――┤
   │ 0 │ 0 │  0  │  1  │
   ├―――┼―――┼―――――┼―――――┤
   │ 0 │ 1 │  1  │  0  │
   ├―――┼―――┼―――――┼―――――┤
   │ 1 │ 0 │  1  │  0  │
   ├―――┼―――┼―――――┼―――――┤
   │ 1 │ 1 │  1  │  0  │
   └―――┴―――┴―――――┴―――――┘

となり、「ウ」が正解です。

 戻る


スタック(H12.秋 2種 問8)

 

 次の二つのスタック操作を定義する。

  PUSH n : スタックにデータ(整数値 n )をプッシュする。
  POP  : スタックからデータをポップする。

 空のスタックに対して、次の順序でスタック操作を行った結果はどれか。

  PUSH 1 → PUSH 5 → POP → PUSH 7 → PUSH 6 → PUSH 4 → POP →
  POP → PUSH 3


 ア │ │   イ │ │   ウ │ │   エ │ │
   ├─┤     ├─┤     ├─┤     ├─┤
   │1│     │3│     │3│     │6│
   ├─┤     ├─┤     ├─┤     ├─┤
   │7│     │4│     │7│     │4│
   ├─┤     ├─┤     ├─┤     ├─┤
   │3│     │6│     │1│     │3│
   └─┘     └─┘     └─┘     └─┘

----------------------------------------------------------------------

 スタックに関する問題でした。
 今回は、図入りの回答が多く、力の入った回答が多かったのですが
 紙面の都合上、図の部分は見やすい方のものを選ばさせてもらいました。

 それでは、みなさんの回答を紹介します。

> スタック:最後に格納されたデータが最初に取り出されるリスト
> プッシュ:スタックにデータを入れること
> ポップ :スタックからデータを取り出すこと
> (情報処理用語辞典、新星出版社より)

 どうもありがとうございました。
 他のみなさんも、引用をするときには出典の明記をお願いします。


> 回答:ウ
> 解説
> スタック ( stack )
> 後入れ先出し(LIFO)のデータ構造。後入れ先出し記憶装置または
> 記憶領域をさすこともある。複数のデータを順次に記憶するが、
> 取り出せるデータは常に1件で、最も後から記憶したデータのみ
> である。列の一端だけで追加や取り出しが可能である。新しく記憶
> するデータを古いデータに積み重ねることをプッシュダウン(push
> down)、または単にプッシュ(押し込み)という。逆にスタックか
> ら最も新しいデータを取り出すことをポップアップ(pop up)、又は
> 単にポップ(跳ね上げ)という。
> (学研:情報処理基本用語辞典2000年版)

 この辞典は「合格情報処理」の付録でついてくるものですね。
 どうもありがとうございました。


> スタックの場合,
> 後入れ先出し方(後から入ったものを先に取り出す)
> であることが,ポイントで,それに気づけば
> 後は順に,スタック操作をしていけばよい

 どうもありがとうございました。
 図が長かったので省略しましたが、とてもわかりやすい図でしたよ。

> スタック(stack):山.積み上げる,詰め込む
> (つまり,積み上げて,使うときは上のものから)
>
> LIFO(last in first out):最後に入れた物が最初に出る.後入れ先出し.
>
> PUSH n : nをスタックの上に積み重ねる.[下の表では +n と表記]
> POP  : スタックの一番上のデータを取り出す(使う).[P と表記] 

 
 ─────────────────
 +1 +5 P +7 +6 +4 P P +3
 ─────────────────
           4
         6 6 6   3
   5   7 7 7 7 7 7
 1 1 1 1 1 1 1 1 1

> 答え,ウ(上から3,7,1)

> [参考]
> キュー(queue):列,待ち行列.列を作る,列に加わる
> FIFO(first in first out):最初に入れた物が最初に出る.先入れ先出し.


>           ┬─┬─┬─┬
> 入力 A,B,C →│C│B│A│→ 出力 A,B,C
>           ┴─┴─┴─┴


> というように,キューでは入力と出力の順序は変わりません.
> スタックでは問題のように,出し入れのタイミングにより順序が変わります
> (だからスタックの方が問題になりやすいですね)
>
> −−−−−−−−−
>
> ところで,
> > スプーリング(spooling) って?
> spoolingはFIFO(キュー)になりますよね.普通.
> spoolって「糸巻き」の事らしいんですが,
> 糸巻きは,LIFOだよなぁ...<そこまで考えて命名した訳じゃなさそう(笑)
 スタックとキューは、セットで覚えておきましょうね>みなさん
 たしかに、糸巻きは後に巻いたものが先に出てくることになりますね(^^;
 語源をご存知の方がいらしたら、メールで教えてください。
 どうもありがとうございました。


> まず、スタック(棚)とは一番最後に入れたものを最初に取り出す方法。
> 図で言うとPOP時に一番上にあるものを取り出す。
>
> 1つずつ見ていくと、 

 
> (1) PUSH 1 (2) PUSH 5 (3) POP  (4) PUSH 7
>               5
>               ↑
>  │ │   │ │   │ │   │ │
>  ├─┤   ├─┤   ├─┤   ├─┤
>  │  │   │ │   │ │   │ │
>  ├─┤   ├─┤   ├─┤   ├─┤
>  │ │   │5│   │ │   │7│
>  ├─┤   ├─┤   ├─┤   ├─┤
>  │1│   │1│   │1│   │1│
>  └─┘   └─┘   └─┘   └─┘
> 
> (5) PUSH 6 (6) PUSH 4 (7) POP  (8) POP   (9) PUSH 3
>               4     6
>               ↑     ↑
>  │ │   │4│   │ │   │ │   │ │
>  ├─┤   ├─┤   ├─┤   ├─┤   ├─┤
>  │6│   │6│   │6│   │ │   │3│
>  ├─┤   ├─┤   ├─┤   ├─┤   ├─┤
>  │7│   │7│   │7│   │7│   │7│
>  ├─┤   ├─┤   ├─┤   ├─┤   ├─┤
>  │1│   │1│   │1│   │1│   │1│
>  └─┘   └─┘   └─┘   └─┘   └─┘
> 
> よって答えは(ウ)。

 この図が一番わかりやすそうでした。うまく表せていますね(^^)
 ただ、回答の際には「まる1」とか機種依存文字は使わないで下さいね。
 Windows 以外では文字化けしてしまいます。
 どうもありがとうございました。


> スタックの途中経過はおそらく書いてくれる人がいると思うので、(^-^;
> 私は、試験中にいかにちゃっちゃと解くかを書きたいと思います。

> スタックに入れた順を追ってPOPが出てきたら、POPとその直前に入れたもの
> を「無かったもの」としちゃいます。

> (0)初期状態
>   PUSH 1 → PUSH 5 → POP → PUSH 7 → PUSH 6 → PUSH 4 → POP →
>   POP → PUSH 3

> (1)PUSH 5 → POP を無かったものとする。
>   PUSH 1 → PUSH 7 → PUSH 6 → PUSH 4 → POP → POP → PUSH 3

> (2)PUSH 4 → POP を消す。
>   PUSH 1 → PUSH 7 → PUSH 6 → POP → PUSH 3

> (3)PUSH 6 → POP を消す。
>   PUSH 1 → PUSH 7 → PUSH 3

> 要するに、入れ物の底から1→7→3と入れたことと同じ意味になるの
> で、答えは(ウ)です。

> 試験中は消すものを、打ち消し線を引いちゃえば簡単ですよね。

> この問題は過去問で解いたことがあったので、こないだの2種で再出して
> ラッキー☆と思いました。

 PUSH → POP と続けば、入れたものをすぐに出すことになるんですね。
 うまい方法だと思います。どうもありがとうございました。


> 簡単に解くには、
> POP が出てくると その前の PUSH とセットで( )で
> くくってしまえば 簡単に解けると思います。  

>   PUSH 1 → (PUSH 5 → POP) → PUSH 7 →
>    {PUSH 6 → (PUSH 4 → POP) → POP} → PUSH 3

> どの()にも入っていない PUSH の数字だけ並べていけば解けます。

 これも PUSH → POP をセットにした考え方ですね。
 どうもありがとうございました。


> 問いの操作を数式に置き換えてみます。

>  1+5−5+7+6+4−4−6+3=1+3+7 よってウが正解。
>    ○ ●   □ △ ▲ ■

> これは、「POPはPUSHを相殺する」という私の考えから出てきたものです。
> 実際はPOPに対するPUSHを斜線で消していくことで、答えを求めています。
>  
> 「こんな考え方もあるよ」ということで、あまり深くは考えないで
> 下さい(笑)。
>  余談ですが、CASLを少しかじってみると、スタックについて実感出
> 来るかもしれません。フリーのCASLシミュレータなどを探してみては
> いかがでしょうか。

 どうもありがとうございました。
 フリーのCASLシミュレータは、理科大の infoserv のページにも
 ありました。まだ、ダウンロードしていませんが、なかなか良さそうです。
 http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/


> C言語で整数型を宣言していくとどのように、アドレスが振り分けられて
> いるのかがよく判ります。

 C言語でメモリのアドレスを見るには、printf で %p を使えばよかった
 気がします。VC++ などでは、すぐ見られますね。

    戻る


分散(H12.春 2種 問1)

 次の五つのデータがある。分散は幾らか。

  3, 2, 7, 7, 6

 ア 2.1
 イ 2.3
 ウ 2.4
 エ 4.4

 #紙と鉛筆を持ってきて、ちゃんと計算しましょうね。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.春 2種 問1)
----------------------------------------------------------------------
 エ 4.4

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------

 今日は、分散を求める問題でした。計算方法と分散の意味を
 しっかり押さえておきましょう。


 分散とは、データのばらつき具合を調べる時に求めます。
 この分散の値が小さいほど平均に近い値が多いことになり、大きければ
 平均から離れた値が多いということになります。

 #厳密にいうと、平均との誤差を考える時は、分散の平方根の標準偏差で
  考えなくてはいけないんですが、分散でもだいたいのばらつき具合は
  分かります。

 さて、その分散の求め方ですが、次の式を用います。

>   各データの(平均値と各データとの差)の2乗の総和の平均

 と書いてもよくわからないので、実際にやってみましょう。


 問題のデータは、3, 2, 7, 7, 6 でした。
 これらの平均は、

  ( 3 + 2 + 7 + 7 + 6 ) / 5 = 5 

 となります。

 よって、分散は

  [ (5-3)^2 + (5-2)^2 + (5-7)^2 + (5-7)^2 +(5-6)^2 ] / 5

 = ( 4 + 9 + 4 + 4 + 1 ) / 5

 = 4.4

 となるので、正解は 4.4 になります。


 ちなみに、分散の計算は下の計算方法でも求まります。

> (各データの2乗の平均)−(各データの平均の2乗)

 各データの2乗の平均 = ( 3^2 + 2^2 + 7^2 + 7^2 + 6^2 ) / 5

            = ( 9 + 4 + 49 + 49 + 36 ) / 5

            = 29.4

 各データの平均の2乗 = [ ( 3 + 2 + 7 + 7 + 6 ) / 5 ]^2 

            = 25

 よって、分散は 29.4 - 25 = 4.4 となります。

 戻る


ソート(H11.春 2種 問28)

 データの整列方法に関する記述のうち、正しいものはどれか。

 ア クイックソートは、ある間隔で要素を取り出した部分列を整列し、
   更に間隔をつめた部分列を取り出して整列する方法である。

 イ シェルソートは、隣り合う要素を比較して、大小の順が逆であれば、
   それらの要素を入れ替えるという操作を繰り返して行う方法である。

 ウ バブルソートは、中間的な基準値を決めて、それより大きな値の要素を
   集めた区分と小さな値の要素を集めた区分とに振り分ける。
   次にそれぞれの区分の中で同様な処理を繰り返す方法である。

 エ ヒープソートは、未整列の部分を部分木で表し、そこから最大値又は
   最小値を取り出して既整列の部分に移す。この操作を繰り返して、
   未整列部分を縮めてゆく方法である。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H11.春 2種 問28)
----------------------------------------------------------------------
 エ ヒープソートは、未整列の部分を部分木で表し、そこから最大値又は
   最小値を取り出して既整列の部分に移す。この操作を繰り返して、
   未整列部分を縮めてゆく方法である。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日は、ソートの問題でした。
 取り上げようと思っていた問題がありましたが、寝坊したので
 急遽、この問題に変更になりました(^^;


 データの整列(ソート)とは、ある基準にしたがってデータを昇順か降順に
 並び替えることをいいます。


 順に選択肢を見ていきましょう。

> ア クイックソートは、ある間隔で要素を取り出した部分列を整列し、
>   更に間隔をつめた部分列を取り出して整列する方法である。

   これは、シェルソートの説明ですね。
   書き出しを「シェルソートは・・・」に変えれば、正解です。
   改良挿入法とも言います。


> イ シェルソートは、隣り合う要素を比較して、大小の順が逆であれば、
>   それらの要素を入れ替えるという操作を繰り返して行う方法である。

   これは、バブルソートの説明ですね。
   書き出しを「バブルソートは・・・」に変えれば、正解です。


> ウ バブルソートは、中間的な基準値を決めて、それより大きな値の要素を
>   集めた区分と小さな値の要素を集めた区分とに振り分ける。
>   次にそれぞれの区分の中で同様な処理を繰り返す方法である。

   これは、クイックソートの説明ですね。
   書き出しを「クイックソートは・・・」に変えれば、正解です。
   クイックソートは、一般に一番早く並び替えられるといわれています。


> エ ヒープソートは、未整列の部分を部分木で表し、そこから最大値又は
>   最小値を取り出して既整列の部分に移す。この操作を繰り返して、
>   未整列部分を縮めてゆく方法である。

   これが正解のヒープソートです。
   二分木を利用してソートを行います。


 もう1つソートで有名なのが基本選択法です。

 データ中の最小値を求め、次にそれを除いた部分の中から最小値を求める。
 この操作を繰り返していく方法(平成10年度・秋・2種・問15)

戻る


ソート(H11.春 2種 問28)

 データの整列方法に関する記述のうち、正しいものはどれか。

 ア クイックソートは、ある間隔で要素を取り出した部分列を整列し、
   更に間隔をつめた部分列を取り出して整列する方法である。

 イ シェルソートは、隣り合う要素を比較して、大小の順が逆であれば、
   それらの要素を入れ替えるという操作を繰り返して行う方法である。

 ウ バブルソートは、中間的な基準値を決めて、それより大きな値の要素を
   集めた区分と小さな値の要素を集めた区分とに振り分ける。
   次にそれぞれの区分の中で同様な処理を繰り返す方法である。

 エ ヒープソートは、未整列の部分を部分木で表し、そこから最大値又は
   最小値を取り出して既整列の部分に移す。この操作を繰り返して、
   未整列部分を縮めてゆく方法である。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H11.春 2種 問28)
----------------------------------------------------------------------
 エ ヒープソートは、未整列の部分を部分木で表し、そこから最大値又は
   最小値を取り出して既整列の部分に移す。この操作を繰り返して、
   未整列部分を縮めてゆく方法である。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今日は、ソートの問題でした。
 取り上げようと思っていた問題がありましたが、寝坊したので
 急遽、この問題に変更になりました(^^;


 データの整列(ソート)とは、ある基準にしたがってデータを昇順か降順に
 並び替えることをいいます。


 順に選択肢を見ていきましょう。

> ア クイックソートは、ある間隔で要素を取り出した部分列を整列し、
>   更に間隔をつめた部分列を取り出して整列する方法である。

   これは、シェルソートの説明ですね。
   書き出しを「シェルソートは・・・」に変えれば、正解です。
   改良挿入法とも言います。


> イ シェルソートは、隣り合う要素を比較して、大小の順が逆であれば、
>   それらの要素を入れ替えるという操作を繰り返して行う方法である。

   これは、バブルソートの説明ですね。
   書き出しを「バブルソートは・・・」に変えれば、正解です。


> ウ バブルソートは、中間的な基準値を決めて、それより大きな値の要素を
>   集めた区分と小さな値の要素を集めた区分とに振り分ける。
>   次にそれぞれの区分の中で同様な処理を繰り返す方法である。

   これは、クイックソートの説明ですね。
   書き出しを「クイックソートは・・・」に変えれば、正解です。
   クイックソートは、一般に一番早く並び替えられるといわれています。


> エ ヒープソートは、未整列の部分を部分木で表し、そこから最大値又は
>   最小値を取り出して既整列の部分に移す。この操作を繰り返して、
>   未整列部分を縮めてゆく方法である。

   これが正解のヒープソートです。
   二分木を利用してソートを行います。


 もう1つソートで有名なのが基本選択法です。

 データ中の最小値を求め、次にそれを除いた部分の中から最小値を求める。
 この操作を繰り返していく方法(平成10年度・秋・2種・問15)

戻る


フローチャート(H12.秋 2種 問59)

 

 次の流れ図は,10 進整数 j(0<j<100)を 2 進数に変換する処理を表して
 いる。2 進数は下位けたから順に,配列 NISHIN の要素 1 から 8 に格納
 される。流れ図の a 及び b に入る処理はどれか。ここで,j div 2 は
 j を 2 で割った商の整数部分を,j mod 2 は j を 2 で割った余りを表す。


     _____
    ( 開 始 )
      ̄ ̄│ ̄ ̄
     ──┴───
    /j を入力 /
    ───┬── 
     ──┴──
    /  変換  \
   │ k:1,1,8(注) │
   └───┬───┘
    ┌──┴──┐
    │【 a 】│
    └──┬──┘
    ┌──┴──┐
    │【 b 】│
    └──┬──┘
   ┌───┴───┐
   │       │  (注) ループ端の繰返し指定は,
    \  変換  /     変数名:初期値,増分,終値
     ──┬──       を示す。
     ──┴──
    ( 終 了 )
      ̄ ̄ ̄ ̄ ̄ 

   ┌───────────┬───────────┐
   │     a     │     b     │
 ┌─┼───────────┼───────────┤
 │ア│j div 2 → j     │j mod 2 → NISHIN[k] │
 ├─┼───────────┼───────────┤
 │イ│j div 2 → NISHIN[k] │j mod 2 → j     │
 ├─┼───────────┼───────────┤
 │ウ│j mod 2 → j     │j div 2 → NISHIN[k] │
 ├─┼───────────┼───────────┤
 │エ│j mod 2 → NISHIN[k] │j div 2 → j     │
 └─┴───────────┴───────────┘

 Special thanks! ( http://www.sam.hi-ho.ne.jp/ike3/ )


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解答■(出典:H12.秋 2種 問59)
----------------------------------------------------------------------


   ┌───────────┬───────────┐
   │     a     │     b     │
 ┌─┼───────────┼───────────┤
 │エ│j mod 2 → NISHIN[k] │j div 2 → j     │
 └─┴───────────┴───────────┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■解説■
----------------------------------------------------------------------
 今週は、フローチャート特集にしたいと思います。
 フローチャートが縦に長くなるので、多少見づらいかもしれませんが
 ためしにやってみたいと思います。

 今日は、10進数→2進数 に変換する問題でした。
 10進数を2進数に変換するには、10進数の数を2で割っていき
 その余りを利用して変換する方法(今日の問題の方法)があります。
 まぁ、知っている方も多いと思いますが、この方法は中学3年生の教科書に
 載っているやり方です。

 では試しに、10進数で「23」という数を2進数に変換します。
 「23」を2で割っていき、余りを記録していきます。
 最終的には、「1」になるまで割りつづけてください。

 
          (余り)
   2)23 
     ̄ ̄ ̄ ̄
   2)11    1 ↑
     ̄ ̄ ̄ ̄     │
   2) 5    1 │
     ̄ ̄ ̄ ̄     │
   2) 2    1 │
     ̄ ̄ ̄ ̄     │
      1    0 │
             │
     ────────┘
    ここから

 このように「1」になるまで割り終わったら、矢印の順に数字を並べます。
 この場合、「10111」となりますね。この数字が2進数に変換された
 数字になります。

    「23」 ⇔ 「10111」

    10進数     2進数


 さて、問題に戻ると

> 2 進数は下位けたから順に,配列 NISHIN の要素 1 から 8 に格納される。

 という部分が、10進数を2で割った余りを記録することに対応します。
 つまり、

  j を2で割った余りが NISHIN[1], ... , NISHIN[8] に格納される

 ことになります。


 したがって、正解のフロチャートは次のようになります。


     _____
    ( 開 始 )      開始
      ̄ ̄│ ̄ ̄
     ──┴───
    /j を入力 /      10進数 j を入力
    ───┬── 
     ──┴──      (繰り返し)
    /  変換  \      │この解釈は
   │ k:1,1,8(注) │     │「k が 1 から 8 まで 1 ずつ増える」
   └───┬───┘     │ということ
  ┌────┴─────┐   │
  │j mod 2 → NISHIN[k]│   │j を2で割った余りを保存
  └────┬─────┘   │
    ┌──┴───┐     │
    │j div 2 → j│     │j を2で割って、次の計算の準備
    └──┬───┘     │
   ┌───┴───┐     │
   │       │     │
    \  変換  /     (繰り返し)
     ──┬── 
     ──┴──
    ( 終 了 )      終了
      ̄ ̄ ̄ ̄ ̄ 

戻る