プログラムの中に listHead.next や prioQueue.size() のような、点でつながれた書き方が出てくることがあります。見慣れないと身構えますが、読み方はひとつだけです。. は「〜の中の」と読みます。
第1部 擬似言語の教科書 地図+20回
G1擬似言語の地図(入口)G2-1変数と宣言G2-2データ型G2-3代入「←」G3-1部品を呼ぶ/戻るG3-2引数G3-3戻り値・手続と関数G4-1配列と要素番号G4-2配列の読み書きG5選択処理 ifG6-1繰返し forG6-2配列を for で回すG7繰返し whileG8-1算術演算子と優先順位G8-2and / or / notG9-12次元配列G9-22重ループG10大域変数と局所変数G11未定義G12-1演算子 . の読み方G12-2クラスとはG12-3コンストラクタ
なぜ、箱の中に箱を入れるのか
生徒1人ぶんのデータを持ちたいとします。名前と点数の2つです。ここまでの書き方だと、こうなります。
文字列型: namae ← "田中" 整数型: ten ← 80
2人めが出てくると namae2、ten2 と増えていきます。しかもどの名前とどの点数が同じ人のものかは、名前の付け方で察するしかありません。
そこで、1人ぶんをひとまとめにして、1つの名前で持ちます。
Seito: seito
seito という大きい箱が1つあって、その中に namae と ten という名前の付いた小さい箱が入っている ── そういう形です。
1つの名前の中に、名前の付いた箱が入っている。取り出すのが「.」
中の箱を取り出すのが .
seito.namaeseito の中の namae → "田中"
seito.tenseito の中の ten → 80
. は「〜の中の」と読みます。左に書いたものの中から、右に書いた名前のものを取り出す ── これだけです。
取り出したあとは、ふつうの箱とまったく同じです。読めますし、書き換えもできます。
seito.ten ← seito.ten + 10 seito.ten を出力する
seito.ten が 80 なら、1行目で 90 になり、2行目で 90 が出ます。代入の読み方も変わりません。
. は、IPAが定めた演算子
出典:IPA「擬似言語の記述形式」〔演算子と優先順位〕の注記
演算子 . は,メンバ変数又はメソッドのアクセスを表す。
いま namae や ten と呼んでいた中の箱のことを、正式にはメンバ変数といいます。もう1つのメソッドは、このあと扱います。
優先順位の表では、. は () と同じいちばん上の段にあります。つまりどの計算よりも先に、この取り出しが行われます。
seito.ten + 1 なら、先に seito.ten を取り出してから 1 を足します。迷う場面はほとんどありません。
[ ] と . は、指し方が違う
配列は data[3] のように番号で指しました。. は seito.ten のように名前で指します。
どちらも「中から1つ取り出す」点は同じです。同じものが並んでいて番号で呼ぶのが配列、違うものが入っていて名前で呼ぶのがメンバ変数だと考えてください。
次の書き方は、どう読みますか。
seito.ten
中に何が入っているかは、表で与えられる
seito の中に namae と ten がある ── この中身の一覧が、実際の出題では表で示されます。覚えておく必要はありません。
出典:基本情報技術者試験 科目B サンプル問題 問10
クラス ListElement は,単方向リストの要素を表す。クラス ListElement のメンバ変数の説明を表に示す。
表 クラス ListElement のメンバ変数の説明
| メンバ変数 | 型 | 説明 |
|---|---|---|
val |
文字型 | 要素の値 |
next |
ListElement |
次の要素の参照 次の要素がないときの状態は未定義 |
listHead の中には val と next の2つが入っている、と読めます。そして next の型が ListElement 自身になっているのがポイントです。中の箱が、また同じ形の箱を指しているわけです。
「.」は「〜の中の」。左のものの中から、右の名前を取り出す
この表さえあれば読める
listHead.val先頭の要素の値
listHead.next次の要素そのもの
listHead.next.val次の要素の値
実際の出題では、メンバ変数の名前と意味は必ず表で与えられます。覚えておく必要はありません。表を見ながら読むのが正しい解き方です。
[ ] と . は、指し方が違う
配列は data[3] のように番号で指しました。. は a.val のように名前で指します。
どちらも「中から1つ取り出す」点は同じです。番号で並んでいるものが配列、名前が付いているものがメンバ変数だと考えてください。
要素が1列に並んだリストです。1つの要素は2つのものを持ちます ── val(その要素の値)と next(次の要素)。
先頭から "A"、"B"、"C" と並んでいて、listHead が先頭の要素です。listHead.next.val はどれですか。
メソッド ── 中に入っている、名前の付いた部品
取り出されるのが部品のときは、メソッドといいます。うしろに括弧が付くので見分けられます。
出典:基本情報技術者試験 科目B サンプル問題 問8(プログラムの一部)
prioQueue.enqueue("A", 1)
prioQueue.dequeue() /* 戻り値は使用しない */
while (prioQueue.size() が 0 と等しくない)
読み方は「prioQueue の中の enqueue を呼ぶ」。呼び出し方は手続や関数とまったく同じで、括弧の中に引数を並べます。
見分けるのは括弧だけ
メンバ変数a.val 括弧が付かない。箱なので読み書きできる
メソッドa.size() 括弧が付く。部品なので呼ぶと動く
手続と関数の見分けと同じで、戻り値があれば ← の右に置け、無ければ1行で完結します。
上の prioQueue.dequeue() には /* 戻り値は使用しない */ という注釈が付いています。値を返すのに、受け取らずに捨てているということです。
G3-3 で見た「1行で呼んでいるから手続とは限らない」と、まったく同じ話です。
b は、次の説明が与えられたクラスの実物です。
b が持っているもの
持っている値count(回数)
してもらえる処理reset() … 回数を 0 に戻す
次の2行は、それぞれ何をしていますか。
b.reset() 整数型: n ← b.count
点がつながったとき ── 左から1つずつ
実際の出題では、. が2つ続くことがあります。
出典:基本情報技術者試験 科目B サンプル問題 問10(解答群より)
listHead.nextlistHead.next.nextprev.nextprev.next.next
つながった . を読む手順
- いちばん左の名前を見る。それが出発点
- 最初の
.の右を取り出す。ここで「別のもの」に移っている - 次の
.の右を、いま移ったものの中から取り出す - 点の数だけ繰り返す。1つの点で、1つ先へ進む
途中で戻ることはありません。左から右へ、一方通行です。
1行ずつ動かして確かめます。prev がリストの上を1つずつ進んでいくところを見てください。
点をたどると、1つずつ先へ進む
当サイトオリジナルの例題
ループ開始前
配列
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
サンプル問題 問10 は、単方向リストから要素を1つ削除する手続です。空欄に入るのは prev.next.next(正解はカ)。
prev.next は消したい要素、prev.next.next はその次の要素。消したい要素を飛ばして、その次につなぎ替えるので、点が2つ要ります。点の数を1つ間違えるだけで、別の答えになります。
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
. を名前の一部だと思う |
演算子。優先順位の表のいちばん上の段にある |
| メンバ変数の意味を覚えようとする | 実際の出題では必ず表で与えられる。見ながら読む |
| メンバ変数とメソッドを混同する | 括弧が付くのがメソッド。箱か部品かの違い |
| 点の数を数え違える | 1つの点で1つ先。左から1つずつ区切る |
[ ] と同じつもりで番号を入れる |
. は名前で指す。番号で指すのは [ ] |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
- 基本情報技術者試験 科目B サンプル問題(2022年12月26日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
シミュレータと練習問題は当サイトのオリジナルです。

