擬似言語の文字列処理がわからない人へ|1文字ずつ取り出す読み方と回文判定を解説
文字列を1文字ずつ調べる処理が出てきた瞬間、何をしているのか分からなくなる。
文字が並んだコードを見て、身構えてしまっていませんか?
数値の計算なら落ち着いて追えるのに、文字が出てきた途端に読めなくなる。科目Bを学ぶ人から、この相談は本当によく届きます。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務でも文字列の処理は毎日のように書きますし、1文字分の数え間違いで氏名の末尾が欠けて表示される不具合を直したこともあります。
つまり、ここでつまずくのは珍しいことではありません。この記事では、擬似言語の文字列を読むときの考え方を、試験で問われる形に沿って一つずつ整理していきます。
文字列は文字が一列に並んだもの¶
まず、言葉の整理から始めましょう。文字列とは、文字が順番に一列に並んだものです。
たとえば ABC という文字列は、A と B と C という三つの文字が、この順番で並んでいる状態を指します。順番が変われば別の文字列になります。
ここで大事なのは、文字列を一つのかたまりとして見るのをやめることです。中身は文字の列で、位置を指定すれば何番目の文字かを取り出せます。
この見方に切り替わると、文字列の問題は配列の問題とほとんど同じ形に見えてきます。実際、擬似言語の出題でも、文字列は文字が並んだ配列として扱われることが多いです。
文字型と文字列型は別のもの¶
つまずきの多くは、ここの区別があいまいなまま進んでしまうことから生まれます。二つの型を並べて確認しましょう。
| 型 | 表すもの | 値の例 |
|---|---|---|
| 文字型 | 1文字だけ | A、b、7 |
| 文字列型 | 0文字以上の並び | ABC、Giji、空の文字列 |
文字型が入る変数に、文字列をまるごと入れることはできません。逆に、文字列から1文字を取り出したものは文字型として扱われます。
問題文では、この違いが宣言の部分にはっきり書かれています。変数の宣言を読み飛ばすと、後半で何を比べているのか分からなくなります。
だから、コードを読み始める前に宣言をひととおり眺める癖をつけてください。それだけで、処理の意図が半分見えることもあります。
文字数と添字の関係でつまずく¶
もう一つ、必ず押さえておきたいのが位置の数え方です。文字列の何番目という言い方は、問題によって数え始めが違います。
擬似言語の問題では、先頭を1番目と数える書き方がよく使われます。ただし、これは問題文の前置きで定義されるものなので、毎回そこを確認するのが確実です。
具体例で見ておきましょう。ABCDE という5文字の文字列を、先頭から1と数える場合で並べます。
| 位置 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 文字 | A | B | C | D | E |
文字数は5で、末尾の位置も5です。数え始めが1のときは、この二つの数が一致します。
一方、先頭を0と数える決まりなら、末尾の位置は4になります。文字数から1を引いた値が末尾になるわけです。
この一つのずれが、繰返しの終了条件をまるごと変えてしまいます。位置の数え方は、配列の添字とまったく同じ話なので、あわせて確認しておくと理解が早くなります。
【関連記事】擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
1文字ずつ取り出す基本の形を覚える¶
文字列の問題は、形がある程度決まっています。先頭から末尾まで、位置を一つずつ進めながら文字を取り出す。この形が土台です。
まずはコードを見てください。文字列の中に A がいくつあるかを数える処理です。
○文字列型: str ← "BANANA"
○整数型: i, count
○文字型: c
count ← 0
i ← 1
while (i が str の文字数 以下)
c ← str の i 文字目 /* i 番目の文字を取り出す */
if (c が "A" と等しい)
count ← count + 1
endif
i ← i + 1 /* 次の位置へ進める */
endwhile
count を表示する
やっていることは三つだけです。取り出して、調べて、位置を進める。
繰返しの条件にも注目してください。位置が文字数以下である間だけ回るので、末尾まで見終わったところで自然に止まります。
言葉だけでは腑に落ちにくいので、値の動きを表にします。
| 回数 | i | 取り出した文字 c | A と等しいか | 処理後の count |
|---|---|---|---|---|
| 1回目 | 1 | B | いいえ | 0 |
| 2回目 | 2 | A | はい | 1 |
| 3回目 | 3 | N | いいえ | 1 |
| 4回目 | 4 | A | はい | 2 |
| 5回目 | 5 | N | いいえ | 2 |
| 6回目 | 6 | A | はい | 3 |
| 7回目 | 7 | ― | ― | 条件が偽で終了 |
6回目で末尾まで見終わり、7回目に入ろうとしたところで繰返しが終わりました。答えは3です。
この表のように、位置と取り出した文字を横に並べて書くのが確実な読み方です。頭の中だけで追うと、必ずどこかで一つずれます。
書き方そのものに不安がある人は、手順をまとめた記事があるので先に読んでみてください。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
位置を進める向きは一方向とは限らない¶
基本の形が読めるようになったら、次は向きです。先頭から末尾へ進む処理があれば、末尾から先頭へ戻る処理もあります。
末尾から進む場合は、位置の初期値が文字数になり、繰返しのたびに1ずつ減っていきます。終了条件も、位置が1以上である間、という形に変わります。
さらに、両端から中央へ向かって同時に進める形もあります。次に見る回文判定が、まさにこの動きです。
どの向きで進んでいるのかは、位置を更新している行を見れば分かります。足しているのか引いているのか、そこを最初に確かめてください。
繰返しの構造そのものが怪しいときは、こちらで土台を固めておくと安心です。
【関連記事】擬似言語のwhileとforってどう違う?繰返し処理で迷子にならない方法を詳しく解説
回文判定を読んでみる¶
文字列の定番といえば、回文の判定です。前から読んでも後ろから読んでも同じ並びになる文字列を、回文と呼びます。
LEVEL や NOON がその例です。判定の考え方は単純で、両端の文字を突き合わせていくだけです。
先頭と末尾を比べ、同じなら一つ内側へ寄せる。違う文字が一つでも見つかった時点で、回文ではないと決まります。
コードにすると、次のような形になります。
○文字列型: str ← "LEVEL"
○整数型: left, right
○論理型: kaibun
left ← 1
right ← str の文字数
kaibun ← true
while (left が right より小さい and kaibun が true)
if (str の left 文字目 が str の right 文字目 と等しくない)
kaibun ← false
endif
left ← left + 1
right ← right - 1
endwhile
kaibun を表示する
二つの位置が、内側へ向かって同時に動いていきます。左が右に追いつくか追い越したら、比べる相手がいなくなるので終了です。
値の動きを追ってみましょう。
| 回数 | left | right | 比べる文字 | 一致 | kaibun |
|---|---|---|---|---|---|
| 1回目 | 1 | 5 | L と L | はい | true |
| 2回目 | 2 | 4 | E と E | はい | true |
| 3回目 | 3 | 3 | ― | ― | 条件が偽で終了 |
三回目に入る手前で、left と right がどちらも3になりました。真ん中の1文字は自分自身と比べるまでもないので、ここで止まって正解です。
もし文字数が偶数なら、left が right を追い越した時点で終わります。どちらの場合も、同じ条件でうまく止まってくれます。
論理型の変数が何を覚えているか¶
このコードで見落としやすいのが、kaibun という論理型の変数です。真か偽のどちらかを持ち、判定の結果を覚えておく役割をしています。
最初に true を入れておき、違う文字が見つかったときだけ false に変えます。一度 false になったら、その後は二度と true に戻りません。
この形は、条件を満たすかどうかを最後まで調べる処理で繰り返し出てきます。フラグと呼ばれることもあり、科目Bでは頻出の考え方です。
繰返しの条件に kaibun が入っている点にも意味があります。回文ではないと分かった時点で、残りを調べずに抜けられるからです。
複合条件の読み方に不安が残る場合は、こちらで整理しておきましょう。
【関連記事】擬似言語の論理演算(and・or・not)の読み方|複合条件で迷わないコツを解説
科目Bでつまずきやすい場所¶
ここまでの内容が分かっていても、本番で失点しやすい箇所はある程度決まっています。私が学習の相談を受けてきた範囲では、次の三つに集中していました。
型を先に知っておけば、同じ落とし穴は避けられます。表で確認しましょう。
| つまずく場所 | 何が起きるか | 対処 |
|---|---|---|
| 数え始めの取り違え | 末尾の1文字を見落とす | 問題文の前置きで数え方を確認する |
| 文字と文字列の混同 | 比較の意味が読めなくなる | 宣言の型を先に読む |
| 位置の更新忘れ | 繰返しが終わらない | 位置を進める行がどこかを指差す |
どれも、知識としては簡単なことばかりです。それでも本番の緊張の中では、こういう当たり前のところで足をすくわれます。
とくに一つ目は、答えが惜しいところでずれる原因になります。文字数が5なのに4回しか回っていない、という取りこぼしです。
空欄補充では、比べている相手を先に確かめる¶
科目Bでは、コードの一部が空欄になっている出題形式がよくあります。文字列の問題では、位置を表す式が空欄になるパターンが目立ちます。
このとき、コード全体を理解しようとすると時間が足りません。空欄の前後だけを見て、そこで何と何を比べたいのかを考えてください。
回文の判定なら、比べる相手は反対側の端です。先頭が1番目なら、対になるのは末尾から数えた同じ距離の位置になります。
迷ったら、短い文字列を一つ当てはめて確かめるのが確実です。3文字か4文字の例を使えば、数十秒で判断できます。
空欄補充の解き方そのものを固めたい人には、専用の記事を用意しています。
【関連記事】基本情報技術者試験の科目Bの空欄補充問題の解き方を解説|擬似言語で見る判断ポイント
確かめ算に使う文字列の選び方¶
ちょっとしたコツもお伝えしておきます。動作を確かめるときは、すべて違う文字でできた文字列を選んでください。
AAAA のような並びだと、位置がずれていても答えが合ってしまいます。ABCD なら、どこを取り出したのか一目で分かります。
回文判定を確かめるときは、回文になる例とならない例を両方試すのが確実です。片方だけでは、条件の向きを間違えていても気づけません。
手を動かして確かめるのが一番の近道¶
文字列の処理は、読むだけではなかなか身につきません。位置が動いていく様子は、実際に追ってはじめて納得できるものです。
紙に文字を横に並べ、上に位置の数字を振ってみてください。それだけで、どこを見ているのかが目で分かるようになります。
そのうえで、コードを一行ずつ動かして確かめられると理解が速くなります。Giji Academy の擬似言語シミュレーターなら、変数の変化を見ながら処理を追えます。
使い方から知りたい人は、次の記事に手順をまとめてあります。
【関連記事】擬似言語 シミュレーターとは?試験対策に役立つ使い方と学習法を解説
まとめ¶
最後に、この記事で確認したことを振り返ります。
文字列は、文字が一列に並んだものでした。かたまりとして見るのをやめ、位置を指定して1文字を取り出せるものとして扱うのが第一歩です。
文字型と文字列型は別のもので、その違いは宣言の部分に書かれています。読み始める前に宣言を眺める習慣が、後半の理解を助けてくれます。
処理の形は、位置を一つずつ進めながら文字を取り出す繰返しが土台でした。向きは先頭からとは限らず、末尾からや両端からという形もあります。
回文判定では、両端から内側へ寄せていき、結果を論理型の変数に覚えさせていました。この形は他の問題でも何度も出てくるので、一度追っておく価値があります。
そして最大のつまずきどころは、数え始めのずれでした。先頭が1なのか0なのか。ここを毎回確認するだけで、惜しい失点はぐっと減ります。
文字列でつまずくのは、あなたの理解力の問題ではありません。位置を書き出して一度追いかければ、必ず読めるようになります。