擬似言語の問題は必ず出題されます。
問題のバリエーションも少ないので、解き方さえ覚えると確実に点を取れます。
今回は、ITパスポート令和4年 問78を例にして解説しました。
はっきり言って、問78は難しいです。
問96のほうが、わかりやすい問題です。
問96をやってから、問78に取り組むことをおすすめします。
さて、かなり丁寧に手順を踏んで解説したため、記事が長くなってしまいました。
まずは、問題を解く流れを掴んで、2回目以降、詳細を確認していくような読み方をおすすめします。
また、問題に慣れてしまえば、この解説のとおり手順を踏まなくても、問題を解けるようになります。
まずは、擬似言語の解き方をトレースすることから始めてみましょう。
擬似言語の問題を解くポイント
文章で書かれた説明、条件、手順を理解してから、プログラムを考える。
問題見たけど、無理。。。
文章で書かれた説明、条件、手順だけで、プログラムの機能(動作)がわかるように、問題は作られています。
アルファベットで書かれて、わかりにくいプログラムを見て、プログラムの機能(動作)を考える必要はありません。
選択肢の式に具体的な値を代入して、矛盾が生じないものを選ぶ。
選択肢を代入して、結果に矛盾が生じないものを選ぶだけで正解できます。
選択肢にある4つの式に値を代入して、結果に矛盾が生じないものを選ぶだけで正解できます。
式に代入すべき値は、文章で書かれた条件や手順から決めることが出来ます。
問題を解く手順
詳しく説明したら長くなってしまいました。
最初は軽く読んで、何回かに分けてお読みください。
Step 1 構成を整理して、問題文を読み解く。
- Step 1構成を整理して、問題文を読み解く。
- 1説明(条件)
- 2設問
- 3手順(動作)
- 4選択肢
- 5プログラム
- Step 2関数の働き(目的)を説明(条件)で確認する。
- Step 3関数の動作を、[手順]で具体的な値を使って確認する。
- Step 4プログラムの構成を、[手順]と対応させて確認する。
- Step 5選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- Step 6各選択肢に具体的な値を代入し、て矛盾がないか調べる。
問題文を項目ごとに整理しましょう。
まだ、内容を考える必要はありません。
説明(条件)
関数の説明が書かれています。
ここでは、「配列を使う関数の問題なんだな」程度の理解で、次に進みましょう。
設問
最初は、プログラムの中でaの場所を確認するだけでいいです。
手順
プログラムの流れを、言葉で説明しています。
ここの理解が、問題を解く上で重要なポイントです。
選択肢
4つの中から1つ選ぶのに、一つ一つの選択肢の内容を理解する必要はありません。
「jとkを代入するんだな」程度の理解で、次に進みましょう。
ここでは、jとkが何を意味するか考える必要ありません。
プログラム
プログラムの空欄を埋める候補が何か、上の選択肢を見て確認しましょう。
ここでは、プログラムの詳細を考える必要はありません。
次の段階で、手順と一緒に考えましょう。
項目ごとに、問題を分解するとわかりやすいね。
Step 2 関数の働き(目的)を説明(条件)で確認する。
- Step 1構成を整理して、問題文を読み解く。
- Step 2関数の働き(目的)を説明(条件)で確認する。
- 1関数checkDigit
- 2配列originalDigit
- Step 3関数の動作を、[手順]で具体的な値を使って確認する。
- Step 4プログラムの構成を、[手順]と対応させて確認する。
- Step 5選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- Step 6各選択肢に具体的な値を代入して、矛盾がないか調べる。
関数のイメージを掴むと、問題を読むのが楽になりますよ。
関数checkDigit
関数の働き(目的)を確認しましょう。
「配列orijinalDigit」の中身が気になるでしょうが、ここでは、「配列orijinalDigit」という塊(かたまり)としてとらえて置きます。
「配列orijinalDigit」については、次で確認します。
では、説明の太字の部分に着目します。
関数の働き(目的)を理解するときは、「関数名」「引数」「戻り値」が大切です。
これらの関係を図にすると、次のようなイメージになります。
なお、この問題では、「チェックデジット」そのものが何を指すか知らなくても問題は解けます。
問題を解いてからでも、確認しておきましょう。
配列originalDigit
配列originalDigitについて、確認します。
問題文には、次のようにあります。
説明の太字の部分から、次のことがわかります。
問題文 | → | わかること |
---|---|---|
「10進9桁の整数」 | → | 例えば, 000000777 |
「上位の桁から順に格納された整数型の配列」 | → | 9個の要素(箱)がある |
「要素番号は1から始まる」 | → | 箱には、1から9まで番号がついている。 |
図に示すと、配列originalDigitは、次のようになります。
頭が疲れた。。。
Step 3 関数の動作を、[手順]で具体的な値を使って確認する。
- Step 1構成を整理して、問題文を読み解く。
- Step 2関数の働き(目的)を説明(条件)で確認する。
- Step 3関数の動作を、[手順]で具体的な値を使って確認する。
- 1手順(1)
- 2手順(2)
- 3手順(3)
- Step 4プログラムの構成を、[手順]と対応させて確認する。
- Step 5選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- Step 6各選択肢に具体的な値を代入して、矛盾がないか調べる。
[手順]の内容を、一つ一つ具体的な数値で確認しましょう。
手順(1)
図に示すと、次のようになります。
手順(2)
図に示すと、次のようになります。
手順(3)
図に示すと、次のようになります。
なるほど。。。
Step 4 プログラムの構成を、[手順]と対応させて確認する。
- Step 1構成を整理して、問題文を読み解く。
- Step 2関数の働き(目的)を説明(条件)で確認する。
- Step 3関数の動作を、[手順]で具体的な値を使って確認する。
- Step 4プログラムの構成を、[手順]と対応させて確認する。
- 1○整数型~originalDigit)の部分←説明
- 2for ~ endfor の部分
- 3while ~ endwhile の部分
- 4return j の部分
- Step 5選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- Step 6各選択肢に具体的な値を代入して、矛盾がないか調べる。
結論を先に言うと、プログラムと手順と対応させると、図のようになります。
プログラムと手順が対応させられるんだ。
でも、どうしてこうなるの?
では、その理由を説明します。
今後、プログラムの構成確認するときの目の付けどころ、プログラムの分け方を参考にしてください。
○整数型~originalDigit)の部分←説明
関数を宣言しているので、問題文の説明にあたります。
for ~ endfor の部分
配列originalDigitの各要素を足しているので、手順1にあたります。
while ~ endwhile の部分
jを10で割った商を求めて、10の位の数を求めているので、手順2にあたります。
return j の部分
戻り値を記述しているので、手順3にあたります。
Step 5 選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- Step 1構成を整理して、問題文を読み解く。
- Step 2関数の働き(目的)を説明(条件)で確認する。
- Step 3関数の動作を、[手順]で具体的な値を使って確認する。
- Step 4プログラムの構成を、[手順]と対応させて確認する。
- Step 5選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- 1選択肢の入る a の前後で、jやkが使われている部分を調べる。
- 2手順2と照らし合わせて、変数に具体的な値を対応させる。
- Step 6各選択肢に具体的な値を代入して、矛盾がないか調べる。
例えば、選択肢の式にあるjやkが何を示す変数なのかわからないと、値を代入できません。
そこで、jやkの意味を調べます。
選択肢の入る a の前後で、jやkが使われている部分を調べる。
いくら選択肢の式そのものだけを見ても、jやkを理解できません。
選択肢の入る a の前後で、jやkを調べることが大切です。
調べる変数は3つあります。
○式右側のj(例:j ← j – 10 × k)
式の右側にあるので、計算に使う値です。
プログラムでは、式が入る a より上(前)を探します。
目印の部分にjがあります。
手順1に当たる部分です。
式右側のjは、配列originalDigitの各要素の数字を足した合計です。
○式右側のk(例:j ← j – 10 × k)
式の右側にあるので、計算に使う値です。
プログラムでは、式が入る a より上(前)を探します。
目印の部分にkがあります。
手順2に当たる部分です
jを10で割った商を求めているので、式の右側のkは10の位の数です。
○式左側のj(例:j ← j – 10 × k)
式の左側にあるのでjは、計算の結果です。
プログラムでは、式が入る aより下(後) を探します。
目印の部分にjがあります。
手順3に当たる部分にあります。
return j とあるので,左側のjの値は最終的に戻り値になります。
これで、式右側のj、式右側のk、式左側のjの意味がわかった。
手順2と照らし合わせて、変数に具体的な値を対応させる。
手順に従って、計算します。
ここまでで、j、kについて次のことがわかっています。
・式右側のjは、配列originalDigitの各要素の数字の合計
・式右側のkは、10の位の数
・式左側のjの値は、最終的に戻り値
そこで、具体的な数字を当てはめてみましょう。
これで、式右側のj、式右側のk、式左側のjが決まりました。
なお、この値は、あくまで「000000777」の場合の値であって、10進9桁の整数が変わるとjやkの値も変わります。
この解説の最後に、別の整数の場合を補足しました。
おぉ、自分で計算できた!
Step 6 各選択肢に具体的な値を代入して、矛盾がないか調べる。
- Step 1構成を整理して、問題文を読み解く。
- Step 2関数の働き(目的)を説明(条件)で確認する。
- Step 3関数の動作を、[手順]で具体的な値を使って確認する。
- Step 4プログラムの構成を、[手順]と対応させて確認する。
- Step 5選択肢の変数が、[手順]の具体的な値のどれに当たるか調べる。
- Step 6各選択肢に具体的な値を代入して、矛盾がないか調べる。
ここまでで、各選択肢のj、kの値が下図のようにわかりました。
そこで、これらの値を式に代入して、前のステップで求めたチェックディジットの値と矛盾しない式を探します。
式が合っていたら、僕がStep5で求めた値 3 と一致するはずだね。
ア j ← j – 10 × k
式右側を計算します。
j-10×k=21-10×2=1
そのため、式左側はj=1です。
これは、手順(2)で求めた値 3と一致しません。
イ j ← k + ( j – 10 × k )
式右側を計算します。
k+(j-10×k)=(2+(21-10×2)=3
そのため、式左側はj=3です。
手順(2)で求めた値 3と一致します。
ウ j ← k + ( j – 10 )× k
式右側を計算します。
k+(j- 10)×k=2+(21-10)=13
そのため、式左側はj=13です。
手順(2)で求めた値 3と一致しません。
エ j ← k +j
式右側を計算します。
k+j=2+21=23
そのため、式左側はj=23です。
手順(2)で求めた値 3と一致しません。
よって、正解は イ です。
補足(別の整数の場合)
〇手順2による計算
〇 イ j ← k + ( j – 10 × k ) による計算
式右側を計算します。
k+(j-10×k)
=1+(15-10×1)
= 6
そのため、式左側はj=6です。
〇 ウ j ← k + ( j – 10 )× k
式右側を計算します。
k+(j-10)×k
=1+(15-10)×1
= 6
そのため、式左側はj=6です。
手順(2)で求めた値 =6と イとウの数式で求めた値=6が一致しました。
同じ結果が出てしまう場合には、jの値を変えて再度計算してみるしかありません。
数学では数式が異なっても、計算の値が同じになることがあります。
ITパスポート試験で具体的な値を入れて答えを導く場合には、具体的な値を1つだけでなく、異なる値を2つ、3つ入れて確かめるといいです。
まとめ
ITパスポート令和4年 問78を解きながら、擬似言語問題の解き方を解説しました。
最初に、擬似言語の問題を解くポイントを説明しました。
文章で書かれた説明、条件、手順を理解してから、プログラムを考える。
選択肢を空欄に入れて、矛盾が生じないものを選ぶ。
次に、この問題を解く手順を具体的に説明しました。
説明は長くなりましたが、問題に慣れてしまえば、この解説のとおり手順を踏まなくても、問題を解けるようになります。
まずは、解き方をトレースすることから始めてみましょう。
コメント