<景品表示法に基づく表記>本サイトのコンテンツには、商品プロモーションが含まれています。

ITパスポート/情報処理

ITパスポートの擬似言語~令和4年問78 過去問解説【ゼロから分かる擬似言語⑥】

ITパスポート令和4年問78過去問解説

前回(擬似言語⑤)の記事はこちら

ITパスポート試験問題、令和5年問64
ITパスポートの擬似言語 ~令和5年問64 過去問解説【ゼロから分かる擬似言語⑤】前回の記事(擬似言語④)はこちら https://shindan-model.com/it-pass-giji-gengo-004...

また、ITパスポートの擬似言語を初回から勉強したい方はこちら↓

擬似言語
ITパスポートの擬似言語 超入門~ゼロからわかる擬似言語① 変数・データ型・配列・関数・コメント【お知らせ】 令和6年度ITパスポート試験公開問題の解説を最速公開しています ※2024年4月以降受験する方で、生成AIに関する出題...

今回は令和4年ITパスポート試験の擬似言語問78の解説を行います。

この問題は、10進9桁の整数の数値を入力として受け取り、そのチェックデジットを出力する関数を記述する問題です。

こちら令和4年に出題された擬似言語の中では難易度が若干高いものですが、分かりやすく説明しますので、しっかり学習してください。

※動画で解説を視聴したい方は、下記YouTube動画をご覧ください。

問題文の確認

関数checkDigitは,10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列originalDigitを引数として,次の手順で計算したチェックデジットを戻り値とする。プログラム中のaに入れる字句として,適切なものはどれか。ここで,配列の要素番号は1から始まる。

[手順]
(1)配列originalDigitの要素番号1~9の要素の値を合計する。
(2)合計した値が9より大きい場合は,合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を,合計した値が9以下になるまで繰り返す。
(3)(2)で得られた値をチェックデジットとする。

[プログラム]
〇整数型:chkDigit(整数型の配列:originalDigit)
整数型:i,j,k
j←0
for(iを1からoriginalDigitの要素数まで1ずつ増やす)
j←j+originalDigit[i]
endfor
while(jが9より大きい)
k←j÷10の商 /* 10進数9桁の数の場合,jが2桁を超えることはない */
【a】
endwhile
return j

【解答選択肢】
ア)j ← j-10×k
イ)j ← k+(j-10×k)
ウ)j ← k+(j-10)×k
エ)j ← k+j

冒頭文の確認

冒頭文では、関数の引数と動作について説明されています。

関数checkDigitは,10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列originalDigitを引数として,次の手順で計算したチェックデジットを戻り値とする。プログラム中のaに入れる字句として,適切なものはどれか。ここで,配列の要素番号は1から始まる。

[手順]
(1)配列originalDigitの要素番号1~9の要素の値を合計する。
(2)合計した値が9より大きい場合は,合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を,合計した値が9以下になるまで繰り返す。
(3)(2)で得られた値をチェックデジットとする。

【冒頭文の要旨】

関数名:チェックデジット
引数:整数型の配列オリジナルデジット
動作:オリジナルデジットの要素の合計値を10進数で表現したときの各桁の数字を合計し、その合計が9以下になるまで繰り返す。最終的に求めた合計値をチェックデジットとして返す。

この冒頭文で難しいのは、以下の1行かも知れません。

10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列 originalDigit を引数として,次の手順で計算したチェックデジットを戻り値とする。

10進9桁の整数とは、たとえば「1億2345万6789」みたいな1億の位から始まる数字です。

これの「上位の桁から順に格納された整数型の配列」がオリジナルデジットな訳ですから、上の9桁の例でいうと、{1,2,3,4,5,6,7,8,9} のようになります。このように、カンタンな数字を入れた例をイメージすることが問題を解くポイントとなります。

以降、この記事では、{1,2,3,4,5,6,7,8,9} を代入して矛盾がない選択肢を正解と考えます。

また、

合計した値が9より大きい場合は,合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を,合計した値が9以下になるまで繰り返す。

先の1~9まで9つの整数を合計すると、45になります。45の場合は、各桁の数字の合計すなわち4+5=9が得られれば、正しいことになります。

プログラムの宣言部

宣言部では、関数の宣言と変数の宣言が行われています。

001  〇整数型:chkDigit(整数型の配列:originalDigit)
002 整数型:i,j,k
003   j←0

1行目では関数の宣言(整数型チェックデジット)をしており、引数は配列(整数型のオリジナルデジット)です。

2行目では3つの整数型の変数を宣言しています(i、j、k)

3行目では、jを0で初期化しています。

処理部の確認

004  for(iを1からoriginalDigitの要素数まで1ずつ増やす)
005   j←j+originalDigit[i]
006  endfor
007  while(jが9より大きい)
008   k←j÷10の商 /* 10進数9桁の数の場合,jが2桁を超えることはない */
009   【a】
010  endwhile
011  return j

処理部では、以下の処理が行われています。

4行目~6行目のforループ(オリジナルデジットの各要素の値を合計)

4行目~6行目のforループ処理でオリジナルデジットの各要素の値を合計しています。

前述のとおり、オリジナルデジットが「123456789」の場合ですと、処理は以下のようになります。

1) ループ処理で各要素の値を合計する。
2) j = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

つまり、jの値が45になります。

7~8行目(合計値が9より大きい場合は、合計値を10進数で表現したときの10の位の数字を求める)

7行目~8行目では、合計値が9より大きい場合は、合計値を10進数で表現したときの2桁目(10の位)の数字をkに代入する処理をしています。

上記45の場合、 合計値が9より大きいため、8行目を実行します。

k = 45 ÷ 10の商 = 4

以上より、45の2桁目(10の位)の数字(4)をkに代入できました。

※なお、8行目のコメント(/* 10進数9桁の数の場合,jが2桁を超えることはない */
)にあるように、10進9桁の各桁の整数の総和は最大でも81(9×9)ですから、3桁以上ある場合を考慮する必要はありません。

かならず、whileは1回で抜けることになります。

9行目 空欄a

空欄aには、合計値の10進数表現の各桁の数字を合計する処理が記述されます。

具体的には、合計値を10進数で表現したときの1桁目(10の位)の数字(5)を求め、先の2桁目の数字(k)と合計して、jに代入しなければなりません。

そして、9行目の処理にて、そのjは9になるはずです。

※のちほど、それぞれの解答選択肢を検証し、j=9のものが正解となります。

10行目~11行目

whileループを抜け、チェックデジット(上記の場合9)を返します。

解答選択肢の検証

解答選択肢を検証すると、以下のようになります。

※9行目実施までのj=45、k=4のため、以下それぞれの代入式の右辺に代入します。

ア)j ← j-10×k:合計値から十の位の数字を差し引く処理。正しくないため、×

イ)j ← k+(j-10×k):合計値から十の位の数字を差し引いた値に十の位の数字を加える処理。正しいため、〇

ウ)j ← k+(j-10)×k:合計値から十の位の数字を差し引いた値に十の位の数字の2倍を加える処理。正しくないため、×

エ)j ← k+j:合計値と十の位の数字を加える処理。正しくないため、×

まとめ

したがって、正解はイとなります。

今回はこの擬似言語令和4年問78の問題を解説しました。若干ITパスポートの擬似言語としては難し目の問題ですが、それでもしっかり具体的な数値を簡単な数値を入れて見ることで、正解が解けることがわかると思います。

ぜひしっかり学習して擬似言語を得点源にしてください。お疲れ様でした。

次回は、令和4年問96を解説します。

ITパスポートの擬似言語⑦~令和4年問96 過去問解説前回の記事(令和4年問78の解説)は以下となります。 https://shindan-model.com/it-pass-giji...