メインコンテンツへスキップ
見出し画像

【解法を学ぶ】FE令和8年科目B(基本情報技術者試験, 科目B, 擬似言語, 午後)

    このNoteでは「基本情報技術者試験(FE)」令和8年度科目Bを解説します。

    今までの学習がバッチリ効果を出しますね。公式の公開問題は勿論、私が準備した「課題」「11個の解法」も有効でした。随時リンクを貼ったので、必要と感じたら補強に使って頂けたら嬉しいです。


    FE科目Bの本試験は20問なのに、公開問題はたったの5問。しかも年に1回だけ公開。新FEになって、サンプル(20問)+令和5~7(5問×3回=15問)で25問しかありません。

    数少ない公開問題を無駄にしないために、一度不合格になって”学習に使える問題がもうない!”って方のために、深い復習を提案したくて一所懸命作りました。

    このNoteは、私がIT専門学校で授業したことを基に作成しています。IT専門学校でFEは第一目標として、カリキュラムが構築されています。何も知らずに入学しても、1年生10月にはFE合格していきますよ。実績ある教育ノウハウを詰め込んだので、少しでも信頼して頂けたら嬉しいです。

    少しでも学習のお役に立てたら嬉しいです。

    それでは始めましょう!


    >全Noteへのリンク(FE節)
    ※科目Aのテーマ別対策、科目B対策、旧FE午後(セキュリティ)など沢山作りました!

    【NOTICE】著作権を侵害には即座に法的措置をしています。人格否定もブロックなどの自衛手段を行います。私は1個人であり、公人ではありません。プライベート時間の全てを費やして作成してきました。ご理解頂ける方のみ、ご活用されると嬉しいです🫠


    問01 | 順番と範囲に注意

    シフトですね。奇しくも沢山課題を作ってました。
    >【擬似言語アルゴ②】シフトの基礎Note
    >【擬似言語アルゴ②課題C】複数個分のシフトNote
    >【擬似言語アルゴ③】一部をシフトNote

    大事なのは順番。下図右だとダメ。

    画像
    >【擬似言語アルゴ②】シフトの基礎Noteより2つの注意点

    あと、破棄処理はしなくてOK。どうせ上書きするので(下図左❶と下図左右❷)。

    画像


    問01は「data[i]←data[i-1]」なので、「右←左」しているので、右シフト。

    上図と同じなので。右端からシフト処理をすべき。つまり、ループカウンタを大きい方から減らす制御。ウかエです。

    ループの開始と終了時をトレースします。シフト漏れや範囲外になってないか確認したい。

    • ウの場合

      • 開始時はi=len-1
        data[len-1]←data[len-1-1]
        ➡右端data[len]へデータが代入されずダメ

      • 終了時はi=2
        data[2]←data[2-1]
        つまりdata[2]←data[1]
        ➡左端data[1]を移動してるのでOK

    • エの場合

      • 開始時はi=len
        data[len]←data[len-1]
        ➡右端data[len]にデータ代入してるのでOK

      • 終了時はi=2
        ウで検討した通りOK

    以上よりエ。



    配列の注意点

    ループの開始と終了で、配列の要素番号が適切かを確認して下さい。

    下記にバグがあるので考えてくださいね。

    for(iを 1から 10まで 1ずつ増やす)
      data[i] ← data[i - 1]
    endfor

    バグは「配列の定義外部分を使っている」のです。

    • data[10]を使った理由は。ループカウンタ「i」を「10」まで回してしまったから。

    • data[0]を使った理由は、「i-1」を使っているのを考えた、ループカウンタ制御をしてなかったから。iを「2から」にすればまだ良かった。

    なおdata[0]が使えないのは、FE科目B擬似言語で「配列の要素番号は1から」なので。プログラムでは[0]から使えるので1個ずれます。私はfor(iを 1から~)で、data[i-1]という組み方をします。



    配列とリスト

    配列は宣言時に個数を指定するので、
    「整数型:data←{0, 0, 0}」であったら、
    data[1]~[3]しか使えません。
    data[4]は使えません。

    ただし、ちょっと曖昧で。
    「dataの末尾に0を追加」と書かれていたら、
    data[4]が使えるようになります。

    「リスト」の使い方ですが。FE科目B擬似言語では配列(基本的に個数固定)とリスト(後から追加できる)を曖昧にしてるみたい。>擬似言語の教科書Note㉒




    問02 | 簡単データで逆算/確認する

    問題文に具体的な入力値がない時、自分で値を設定して動作確認します。>擬似言語の解法11Note❷

    complement関数の返り値は、問題文「xを加算すると00000000になる値」なので、yを逆算してみます。

    例えば、x=00000001の時、返り値は11111111になるはず。

    擬似言語を遡ってみます。
    ❶「return y」では、y=11111111
    ❷「y←y+00000001」する時、y=11111110
    ❸「y←空欄」で、x=00000001からy=11111110を作る処理をア~カから選びます。

    • ア:x AND 01111111 = 00000001

    • イ:x AND 11111111 = 00000001

    • ウ:x OR   01111111 = 01111111

    • エ:x OR   11111111 = 11111111

    • オ:x XOR 01111111 = 01111110

    • カ:x XOR 11111111 = 11111110

    以上よりカ。


    再度、順張りで確認。
    ❶「y←空欄」にて
    00000001を
    11111111とXORしたら
    11111110になり。
    ❷「y←y+00000001」にて
    11111111になる。
    ❸たしかにx=00000001と足せば、
    00000000になる。


    1つの確認だと”たまたま”もあり得るので、もう1回ぐらい確認してみます。今回はカだけが候補になりましたが、複数候補がある時にも有効なテ。

    x=00000010の時、返り値=11111110になるか。
    ❶「y←空欄」にて
    00000010を
    11111111とXORしたら
    11111101になり。
    ❷「y←y+00000001」にて
    11111110になる。
    ❸たしかにx=00000010と足せば、
    00000000になる。

    良さそうですね。




    問03 | 選択肢が多いから減らしたい

    ポイントは2つ。

    1点目は、配列要素の範囲。
    配列の要素番号にループカウンタが混ざっているので。
    ・擬似言語では[1]からなので、[0]や[-1]を使ってないか
    ・宣言時の配列要素数を超えてないか
    のチェックをすると、簡単に選択肢を絞れるかもです。

    2点目は、簡単な値を設定する。
    func1()は計算が簡単、func2()で同じ結果になるように組むのが目的。簡単なデータを設定して、func1()の結果を求めて、func2()で同じ結果が出る選択肢を選びます。>擬似言語の解法11Note❷



    ループ→範囲違反→消去法 できないか?

    問01で学んだ通り。data[i-1]やdata[i-2]が、うっかりdata[0]やdata[-1]にならないか確認したい。

    「for(iを3から~増やす)」なので、iの最小値は「3」、最大は青点状。

    i=3を代入すると
    data[i-1]➡data[2]
    data[i-2]➡data[1]

    i=4を代入すると
    data[i-1]➡data[3]
    data[i-2]➡data[2]

    i=5を代入すると
    data[i-1]➡data[4]
    data[i-2]➡data[3]
    data[4]は定義されてないですね。

    しつこいですが。
    i=6を代入すると
    data[i-1]➡data[5]
    data[i-2]➡data[4]
    data[5]もdata[4]も定義されてないですね。

    よって、data[i-1]やdata[i-2]を使っている選択肢(ウエキク)を消去。候補は、アイオカ。



    func1()と同じになるfunc2()を組み立てる

    問02と同じで、自分で簡単な値を設定して確認します。>擬似言語の解法11Note❷


    n=2はどうせ「return 1」で計算が介入しないので、n=3から考えます。func2()でも、n=3からループが1回以上実行されますし。


    n=3の時。

    func1()は、
    2×func1(3-2)+func1(3-1)
    =2×func1(1)+func1(2)
    =2×1+1
    =3

    func2()をアイオカで考えます。
    for(iを3からn=3まで1ずつ増やす)なので1回だけ実行。
    data[1]←data[2]、data[2]←data[3]で、配列dataは変わらず{1, 1, 1}のまま。

    data[3]を4通り計算します。
    ア:2×1+1=3
    イ:2×1+1=3
    オ:1+2×1+1=4
    カ:1+2×1+1=4

    func1(3)=3だったので、アイが候補(オカを消す)。


    n=4の時。

    func1()は、
    2×func1(4-2)+func1(4-1)
    =2×func1(2)+func1(3)
    ※func1(3)はn=3の時に3だと計算済み。
    =2×1+3
    =5

    func2()をアイで考えます。
    for(iを3からn=4まで1ずつ増やす)なので2回実行。

    i=3の時。data[1]←data[2]、data[2]←data[3]で、配列dataは変わらず{1, 1, 1}のまま。

    data[3]を2通り計算。
    ア:2×1+1=3
    イ:2×1+1=3
    data={1, 1, 3}になります。

    i=4の時。data[1]←data[2]、data[2]←data[3]で、data={1, 3, 3}。

    data[3]を2通り計算。
    ア:2×1+3=5
    data={1, 3, 5}になります。
    イ:2×3+1=7
    data={1, 3, 7}になります。

    func1(4)=5だったので、アが正答。




    問04 | よく出るリスト(データ, 次アドレス)

    リストは出題されてます。
    >【FE】令和5年科目B問01のNote
    >【FEB】サンプル問題1科目B問10のNote
    >【FEB】サンプル問題2科目B問03のNote

    orderList()関数の機能は、図1から図2を作る感じ。

    配列dataList, pointerListを読み解くんですね。メモリからリストデータを組み立てて表示。


    for文内の「繰返し処理を終了する」した後はreturn文。関数全体が終わります。つまり、リストを全部紐解いたってこと。

    では、リストの終わりについて。問題文に「単方向リストの末尾に対応するpointerListの要素は未定義」なので、【空欄a=pointerList[p]】が未定義だったら繰返し処理を終了して関数も終了させればOK。

    解答はウエに絞り。


    【空欄b】は、変数pに何か代入してる。

    変数pはdataList[p]やpointerList[p]のように要素番号に使われている。

    例えば「linearListの末尾にdataList[p]の値を追加する」って、リストを紐解いた結果linearListにデータを追加してるので。pは次に紐解くデータの要素番号を指している。

    次のデータはpointerList。なぜなら問題文に「pointerListにリストの次の要素に対応するdataListの要素番号を格納」とあるので。

    「p←pointerList[p]」で、次要素の要素番号(アドレス)が代入されます。

    解答はイエに絞る。【空欄a】でウエに絞ったので、正答はエだと確定します。


    【空欄b】は消去法でアウを消して、イエに絞れます。

    もし「p←i」だと、「for(iを1から~1ずつ増やす)」なので、
    LinearListの末尾にdataList[1]の値を追加する
    LinearListの末尾にdataList[2]の値を追加する
    LinearListの末尾にdataList[3]の値を追加する
    となってしまう。
    図2が{10, 30, 20, 40}となってしまう。

    消去法で「空欄b = i」はない、アウはない、と判断してOK。


    単方向リストは、操作のアルゴリズムだけでなく、オブジェクト指向としても出題されてます。出てるかは分かりませんが、双方向リストも課題を作ろうか思案しときますね(準備中*)。
    >【FE】令和5年科目B問01のNote
    >【FEB】サンプル問題1科目B問10のNote
    >【FEB】サンプル問題2科目B問03のNote




    問05 | 問題文の引数/返り値に合うか

    引数と返り値が掲載されている場合があります。掲載通りになるのを見つければ良いのです。>擬似言語の解法11Note❸

    【空欄a】について。「/* 名前一覧の作成 */」なのに、ウエ「未定義の値」を追加するわけない。アとイに絞り。


    【空欄b】について。一旦、問題文の例に合わせたトレースをしてみます。

    問題文通り。引数{"Red", "Green", "Blue", "Red"}を入力すれば、返り値{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 0, 0}}になると書かれていますね。

    「/* 名前一覧の作成 */」にて、配列colorVector={"Red", "Green", "Blue"}になります。

    「/* One-Hot表現への変換 */」にて、配列tempVectorに1や0を追加して、Redなら{1, 0, 0}、Greenなら{0, 1, 0}を作りたいんですね。


    for文が二重で、「jを~colorsの要素数まで」「kを~colorVectorの要素数まで」から、配列colorsと配列colorVectorが絡む、と一旦決め打ちして考えてみます。

    たしかに、引数が入った配列colorsから、1つcolors[j=1]を取り出せば”Red”。配列colorVectorから1つcolorVector[k=1]を取り出せば"Red"なので、比較して一致でtempVector={1}にしちゃえば良い。

    colorVector[k=2]で"Green"なので、一致しないので、tempVector={1, 0}のように「0」を追加すれば良い。

    colorVector[k=3]で"Blue"なので、一致しないので、tempVector={1, 0, 0}のように「0」を追加すれば良い。


    k=3=colorVectorの要素数までforループしたので、次はj=2。

    colors[j=2]="Green"。
    colorVector[k=1]="Red"で、一致せず、tempVector={0}
    colorVector[k=2]="Green"で、一致して、tempVector={0, 1}
    colorVector[k=3]="Blue"で、一致せず、tempVector={0, 1, 0}
    良さそう。

    以上より正答はイ。(空欄aでアイに絞ってた)


    消去法でアを消せるかも考えておきます。

    アb「colorsの要素のいずれかにcolorVector[k]の値が格納されている」なら「tempVectorの末尾に1を追加」と組んじゃうとダメってのも確認します。

    colors={"Red", "Green", "Blue", "Red"}で
    colorVector={"Red", "Green", "Blue"}という状況。

    colorsの要素のいずれか("Red", "Green", "Blue")に
    colorVector[k=1]={"Red"}の値が格納されている。
    colorVector[k=2]={"Green"}の値も格納されている。
    colorVector[k=3]={"Blue"}の値も格納されている。
    よってtempVector={1, 1, 1}の出来上がり。

    jループでcolors[j=1~4]でループさせて、
    {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}}になります。


    ひょっとしたら、本試験では「消去法だけで」カタをつけても良いかもですね。

    【空欄a】でウエなし(アイ)、【空欄b】でアウなし(イエ)、正答はイ。

    とはいえ、イで正しく動くのかは確認も理解もしておきいたいですね。




    問06 | 記述に忠実に

    解き始めた時は「頭に入れることイッパイだなぁ」と思いましたが、結局は表1と図1の見比べがメイン。

    必ず記述を見つけましょう。自分の常識/勘/センスは一旦封印です。FEに限らず、SGでもSCでも、全IPA資格試験で通用する原則です。>【長文解法】6つのテクニックNote⓪


    項番(一)。「古いログから上書きされ」るのは、図1ルール4「1年間のログが参照できる」に違反する可能性あり。空き容量が充分ないと、1年分保存できないから。


    項番(二)。「運用は~現在はC主任だけ」は、図1ルール3-3「運用担当者は複数名にする」に違反。


    項番(三)。「ログの日時は、UTC」は、図1ルール2「日本標準時」に違反。

    なお「UTC(世界協定時)」は経度0度(=イギリス)での時刻、「日本標準時(JST)」は9時間差です。

    日本で午前9時の時、UTCは午前0時。

    計算もできます。24時間/360度=1時間/15度。経度が15度違うと1時間の時差。日本は東経135度(明石市)。135/15=9時間。
    >SC令和3年度春期午後2問1設問1(4)aの解説Note
    >SC令和3年度春期午後2問1設問1(5)bの解説Note
    >SC平成30年度秋期午後2問2設問2(2)の解説Note
    >SC平成27年春午後1問2の解説Note
    >SC平成24年秋午後1問3設問1bの解説Note


    項番(四)。「Zサーバのログ」が「毎月末」に「Yサーバに保管」。図1で確認するも特段「毎月末」などの指定なし。

    「Yサーバに保管」は、図1ルール3-2「社内ネットワーク~ファイルサーバにログを保管」で、図1上の問題文「社内ネットワークに設置したファイルサーバ(以下, Yサーバという)」で一致。

    でも表1って「図1のルールに違反している現在の運用」なので、図1の何かに違反してる。

    図1ルール3-2を更に読むと「運用担当者だけがアクセスできるようにすること」。図1上の問題文に「営業部の各従業員~Yサーバ上の全てのファイルが編集可能」なので、運用担当者以外もアクセスできちゃう。

    「全てのファイルが編集可能」を読んだ時点で、怪しいので▶印です。SG科目BやSCまでも使えるテクニックです。>長文問題を読む6つのテクニック(3-3)


    以上より
    項番(一)ルール4
    項番(二)ルール3
    項番(三)ルール2
    項番(四)ルール3
    なので、ルール3違反は(二)(四)、正答はケ。




    まとめ

    お疲れ様でした!

    60分で基礎を復習できます。
    >【2分×30節で読める基礎】擬似言語の教科書Note
    問題演習を通して見出すべきノウハウ。
    >【図解で流し見】擬似言語の解法11のNote
    基本課題12個+追加課題25個(現状)
    >FE科目BのSTEP4(目次)

    実力確認や模擬試験に。
    >令和07年科目Bの解説Note
    >令和06年科目Bの解説Note
    >令和05年科目Bの解説Note
    >サンプル科目B(1❶)の解説Note(擬似言語)
    >サンプル科目B(1❷)の解説Note(セキュリティ)
    >サンプル科目B(2)の解説Note

    またFE科目Bセキュリティは、SG科目Bが似ている(てか流用している)ので、問題演習として優秀です。>全Noteへのリンク(SG)

    良かったらご活用下さい。


     
     
    大学・専門学校の先生の解説Note。 学生時代にITパスポート試験・基本情報技術者試験・応用情報技術者試験を独学で高得点合格。情報処理安全確保支援士試験(セキスペ)・データベーススペシャリスト試験・ネットワークスペシャリスト試験・G検定なども取得。 2027年にPD-S受験予定。