ITパスポートの過去問
令和4年度
テクノロジ系 問78
このページは閲覧用ページです。
履歴を残すには、 「新しく出題する(ここをクリック)」 をご利用ください。
問題
令和4年度 ITパスポート試験 テクノロジ系 問78 (訂正依頼・報告はこちら)
関数checkDigitは、10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列originalDigitを引数として、次の手順で計算したチェックデジットを戻り値とする。プログラム中の a に入れる字句として、適切なものはどれか。ここで、配列の要素番号は1から始まる。
〔手順〕
(1) 配列originalDigitの要素番号1〜9の要素の値を合計する。
(2) 合計した値が9より大きい場合は、合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を、合計した値が9以下になるまで繰り返す。
(3) (2)で得られた値をチェックデジットとする。
〔プログラム〕
〇整数型:checkDigit(整数型の配列: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
〔手順〕
(1) 配列originalDigitの要素番号1〜9の要素の値を合計する。
(2) 合計した値が9より大きい場合は、合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を、合計した値が9以下になるまで繰り返す。
(3) (2)で得られた値をチェックデジットとする。
〔プログラム〕
〇整数型:checkDigit(整数型の配列: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
正解!素晴らしいです
残念...
この過去問の解説 (3件)
01
設問のプログラムにおいて、最初のfor文は、
j ← j + originalDigit[i]
の処理を i が 1 からoriginalDigitの要素数まで繰り返しています。
この部分は、手順1になります。
次のwhile文は
k ← j ÷ 10
[a]
の処理を j が9より大きい間繰り返しています。
この部分は、手順2になります。
手順2では、「合計した値を10進の整数で表現したときの各桁の
数字を合計する」となっています。
これは、例えば j が、59の時、5 + 9 = 14をし、その後、1 + 4 = 5を
するという意味です。j が59の時、
k ← j ÷ 10 では、k に5が入ります。
j には、5 + 9の結果が入らないといけません。
選択肢を確認します。
1.59 - 10×5 = 9 のため不正解です。
2.5 + (59 - 10×5) = 14 のため正解です。
3.5 + (59 - 10)×5 = 250 のため不正解です。
4.5 + 59 = 64 のため不正解です。
参考になった数9
この解説の修正を提案する
02
プログラミングに関する問題です。
このようなアルゴリズムの理解力を問う問題では、トレースをしていくことが重要です。
その際、実際にダミーデータを入れてトレースをしていきましょう。
ここではダミーデータとして、「453628473」を用意します。
まずは各桁を合計します。
アルゴリズムの通りに合計していくと、変数jは順に、
4
4 + 5 = 9
9 + 3 = 12
12 + 6 = 18
18 + 2 = 20
20 + 8 = 28
28 + 4 = 32
32 + 7 = 39
39 + 3 = 42
と値が増えていき、最終的には42が代入されます。
42は9より大きい数字なので、while文内の処理が実行されます。
この処理は最終的に9より小さくならなくてはなりません。
またこのケースでのチェックディジットの条件として各桁の数字を合計とあるので、42ですと4 + 2で6になる必要があります。
コードには
k ← j ÷ 10の商
[ a ]
とあり、データを10で割った後の値を変数kに退避しています。
そのデータをどうするのかが問われています。(空欄a)
ここで各選択肢の計算を行った場合、どれが正しい値になるのかを検証していきます。
この時点で、
変数j には 42
変数kには 42 ÷ 10 = 4により4
が代入済みです。
以降、選択肢の「←」より右部分の式については、jやkをこの値で読み替えてください。
1
42 – 40 で2となり、9より小さいですが数値が正しくないので誤りです。
(正しい値は6です。)
2
4 + (42 – 10 × 4)
= 4 + (42 - 40)
= 4 + 2
= 6
となり、正しい結果となります。
3
1回目のループ
4 + (42 - 10) × 4
= 4 + 32 × 4
= 4 + 128
= 132
9より小さいという条件を満たさないので2回目突入
4 + (132 - 10) × 4
= 4 + 122 × 4
= 4 + 488
= 492 ←値が小さくなるどころか大きくなっている?
以下、さらに値が大きくなり無限ループとなります。
4
4 + 42 = 46
4 + 46 = 50
4 + 50 = 54…と、これも無限ループになります。
■参考
C言語で実際にプログラムを書くと次のようになります。
開発環境を整えられる人は実際にプログラムを書いたり改変してみたりすると、より理解が深まるでしょう。
#include<stdio.h>
int main(){
int originalDigit[9];
int i,j,k;
/*
9桁の整数の各桁を上位から入力
※設問のプログラムにはない部分です。
*/
for(int x = 0;x < 9;x++){
printf("%d番目の値を入力してください > ",x + 1);
scanf("%d",&originalDigit[x]);
}
j = 0;
/*
各桁を合計する部分
設問では「iを1からoriginalDigitの要素数まで1ずつ増やす」と
記載されています。
*/
for(i = 0;i < 9;i++){
j = j + originalDigit[i];
}
/*9より大きい場合に実行される、更なる桁どおしの計算*/
while(j > 9){
k = j / 10; /*10真数9桁の場合、jが2桁をこえることはない*/
j = k + (j - 10 * k);
}
printf("チェックディジットは%dです。",j);
return j;
}
参考になった数5
この解説の修正を提案する
03
2が正解です。
手順(1)、(2)、(3)の内容をプログラムとして進めていきます。[a]の前にある「k ← j ÷ 10 の商」では「(2)合計した値が9より大きい場合は、合計した値を10進の整数で表現」するために十の位があった場合に一の位に変換する処理を表しています。
例えば、jが28であった場合に、「k ← j ÷ 10 の商」でkには20÷10の商である2が入るので、次の[a]では十の位の数字kと一の位の数字を合計する処理が入る必要があります。
2の「j ← k +(j − 10 × k)」であれば、
j←2+(28-10×2)
j←2+8
となり、jには十の位と一の位が合計された10が入ります。
よって、正解は2です。
1の解説)例えばjを28とした場合、28-10×2=8で正しい答えが得られていません。
2の解説)正解です。
3の解説)例えばjを28とした場合、2+(28-10)=20で正しい答えが得られていません。
4の解説)例えばjを28とした場合、2+28=30で正しい答えが得られていません。
参考になった数3
この解説の修正を提案する
前の問題(問77)へ
令和4年度問題一覧
次の問題(問79)へ