■
また、ITパスポートの擬似言語を初回から勉強したい方はこちら↓
■
今回は令和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を解説します。