MAGAZINE

キャリテク!マガジン

コラム

擬似言語プログラム

こんにちは。小澤です。

今回からは、コンピュータサイエンスでも中心的な概念の一つであるアルゴリズムについて解説します。

アルゴリズムとは、問題を解決するための手順や方法のことです。

基本情報技術者試験では、擬似言語を使用したアルゴリズムの問題が出題されることがあるため、まずは擬似言語について学習することにしましょう。

今回の内容は、『徹底攻略 基本情報技術者試験教科書 令和5年度』の「2−6 擬似言語プログラムの記述の基本」(94ページ〜100ページ)に該当します。

擬似言語とは

基本情報技術者試験の科目Bでは、プログラミングに必要な考え方や基本的なアルゴリズムの理解が問われます。

この科目で出題されるのは、具体的なプログラミング言語での実装を深く掘り下げるような問題ではなく、擬似言語を用いたアルゴリズムを問う問題です。

ここでいう「擬似言語」とは、実際のプログラミングに使う言語ではなく、処理の流れを自然言語に近い形式で表現している言語のことを指します。

この擬似言語を用いることで、プログラムの意図や手順を記述でき、人間に理解しやすい形式で表現できます。
また、プログラミング初学者にとっても、プログラミングの基礎を学ぶ上で参考になることが多いでしょう。

実際にプログラムを書く際には、いくつかのポイントに注意する必要があります。

  1. 設計を考える
    プログラムを書く前に、アルゴリズムやデータ構造を設計し、プログラム全体の構造を考慮することが重要です。
    要件を把握し、必要な機能や処理の流れを明確にすることで、プログラムの作成がスムーズに進みます。
     
  2. 疑似言語で検証する
    擬似言語を使用して、アルゴリズムや処理の手順(フロー)を記述すると、論理的なエラーや漏れを発見しやすくなります。
     

このように、プログラムの設計や理解において重要なツールとして擬似言語を活用できます。擬似言語のメリットをもう少し挙げてみましょう。

  1. 理解しやすい表現

    擬似言語は、自然言語に近い形式でアルゴリズムやプログラムの意図を表現できるため、プログラミング言語の文法や構文に慣れていない初学者でも、擬似言語で記述されたコードを読むことで処理の流れや意図を把握できます。
     
  2. プログラミング言語の枠組みに依存しない

    擬似言語は、特定のプログラミング言語の構文やルールに依存しません。そのため、アルゴリズムや処理のアイデアをプログラミング言語によらずに表現することができます。
     
  3. 抽象化と精緻化

    擬似言語は、プログラミング言語よりも抽象化された表現が可能です。
    プログラミング言語では、細かな文法や構文に気を配る必要があるため、アルゴリズムの本質を理解するのに時間がかかることがあります。
    擬似言語を使うことで、アルゴリズムの本質に集中することができます。
     
  4. 問題解決の明確化

    擬似言語を使うことで、問題解決のプロセスを明確にすることができます。
    アルゴリズムや処理の手順を自然言語で表現することで、問題を分析し、解決策を導き出すことができます。
    これにより、問題解決のスキルや論理的思考力を養うことができます。

擬似言語の簡単な例

擬似言語を使った問題では、制御構造や配列や文字列の操作、再帰やソートアルゴリズムなどが出題されます。

ただし、問題文に擬似言語での変数宣言の方法や制御構文(分岐や繰り返し)の書き方が記載されるため、擬似言語の仕様を理解する必要はありません。

問題文に与えられた条件を正確に把握し、問題解決に必要なアルゴリズムを自分なりに考え出すことが重要です。

例えば、擬似言語を使った簡単な例は次のようなものです。

<条件分岐の例>

<繰り返しの例>

<変数の代入の例>

擬似言語の問題例

IPAのサイトに基本情報技術者試験の公開問題が公開されています。
擬似言語を含む問題も掲載されているので、参考にしてみるとよいでしょう。

擬似言語の問題を解くためには、プログラムを順にトレースしていくことが重要です。
実行手順を追跡することで、プログラムがどのように実行されるか理解することができます。

問2(令和5年度 基本情報技術者試験 科目B 公開問題)

この問題は、手続き関数の呼び出し順序について問うものです。手続きproc2を呼び出した結果を回答します。

このプログラムをトレースしてみましょう。

  1. proc2を呼び出します。
  2. proc2の中で、まずproc3が呼ばれるので、proc3に移動します。proc3で「C」が出力されます。
  3. proc2に戻り、次に「"B" を出力する」となっているので、「B」が出力されます。
  4. 続いて、proc2の中でproc1が呼ばれるので、proc1に移動します。proc1では、まず「A」を出力し、次にproc3を呼び出しています。proc3に移動すると「C」が出力されます。

ここまでの出力を並べてみると「C、B、A、C」となります。

問4(令和5年度 基本情報技術者試験 科目B 公開問題)

次の問題は、手続testの処理が終了した直後のhashArrayの要素を問う問題です。

この問題では、まず、変数名や手続き名などの登場人物について整理しましょう。

  1. hashArray:整数型の配列変数で、大域指定はプログラム全体で使用可能なグローバル変数であることを意味します。
  2. add:手続き関数です。整数型のvalueを引数に取ります。
    valueをhashArrayに格納し、格納できた場合はtrue、格納できなかった場合はfalseを返します。
  3. calcHash1:手続き関数です。引数に整数型のvalueを取ります。
    この関数は、valueをhashArrayの要素数で割った余りに1を加えたものを返します。
  4. calcHash2:手続き関数です。引数に整数型のvalueを取ります。
    この関数は、valueに3を足したものをhashArrayの要素数で割った余りに1を加えたものを返します。

それでは、手続きtestから順にトレースしてみましょう。

  1. hashArray ← {5個の -1}

    hashArrayという配列に、-1を5個格納します。
    結果、hashArrayは、{-1, -1, -1, -1, -1}となります。なお、配列の要素番号は1から始まることが指定されています。
     
  2. add(3)

    手続き関数addに引数として3を渡しています。
    addは最初にcalcHash1を呼び出します(②)。
    引数は3なので、3をhashArrayの要素数である5で割った余りである3に1を足したもの、つまり4が返却される(③)ので、iに代入します。

    そして、hashArray[4]の中身を参照して-1かどうか判定しています(④)。
    hashArray[4]は-1なので、hashArray[4]に3を代入します(⑤)。
    この時点でのhashArrayの要素は、{-1, -1, -1, 3, -1}となります。
     
  3. add(18)

    手続き関数addに引数として18を渡します。
    先ほどと同様に、最初にcalcHash1が呼び出されます(②)。
    18をhashArrayの要素数である5で割った余りである3に1を足したもの、つまり4が返却される(③)ので、iに代入します。

    hashArray[4]の中身を参照しますが、先ほどの処理で3を代入したので、-1ではありません。
    else側の処理に移り、calcHash2を呼び出します(⑥)。
    calcHash2では、18に3を足したもの、つまり21をhashArrayの要素数5で割った余りである1に1を足したもの、つまり2が返却される(⑦)ので、iに代入します。

    最後に、hashArray[2]の中身を参照して-1かどうか判定します(⑧)。
    hashArray[2]は-1なので、hashArray[2]に18を代入します(⑨)。
    この時点でのhashArrayの要素は、{-1, 18, -1, 3, -1}となります。
     
  4. add(11)

    手続き関数addに引数として11を渡します。
    先ほどと同様に、最初にcalcHash1が呼び出されます(②)。
    11をhashArrayの要素数である5で割った余りである1に1を足したもの、つまり2が返却される(③)ので、iに代入します。

    そして、hashArray[2]の中身を参照しますが、直前で18を代入しているので、-1ではありません。
    ここもelse側の処理に移り、calcHash2を呼び出します(⑥)。
    calcHash2では、11に3を足したもの、つまり14をhashArrayの要素数5で割った余りである4に1を足したもの、つまり5が返却される(⑦)ので、iに代入します。

    最後に、hashArray[5]の中身を参照して-1かどうか判定します(⑧)。
    hashArray[5]は-1なので、hashArray[5]に11を代入します。
    この時点でのhashArrayの要素は、{-1, 18, -1, 3, 11}となります。
     

よって、最終的なhashArrayの要素は、{-1, 18, -1, 3, 11}となります。

まとめ

今回は、基本情報技術者試験の科目Bで使用される擬似言語について説明し、擬似言語を使った問題の例として、手続き関数の呼び出し順序の問題や、配列の要素を操作する問題の解説をしました。

手続き関数の呼び出し順序については、複数の手続き関数が入り乱れる場合でも、プログラムを順にトレースすれば正しい実行順序を把握することができます。配列の要素を操作する問題も、要素番号や要素の値の変化を追いながら、プログラムを順にトレースすることが重要です。

次回は、アルゴリズムについて解説します。
アルゴリズムとは、問題を解決するための手順や方法で、ソートアルゴリズムや探索アルゴリズムなどがあります。アルゴリズムの基礎となるデータ構造についても触れたいと思います。


よろしければ、本コラムの感想をお聞かせください!
読者の皆様から頂いたご意見を基に、改善・改良してまいります✊

https://forms.gle/7VqULDSagvdYS4q4A


過去の連載記事

  1. 未経験者が基本情報技術者試験の受験勉強を始める前に読んでほしい事
  2. シフト演算はコンピュータの基本的な演算
facebook シェアシェア
LINE シェアシェア