共通テスト 情報Ⅰ・4-10

バグの発見と修正の一問一答

共通テスト「情報Ⅰ」の「アルゴリズムとプログラミング」から、バグの発見と修正に関する4択問題を10問。「答えと解説を見る」を開くと、正解とその理由がその場で読めます。会員登録は不要です。

この分野の演習

全10問/解説付き・基本無料

アプリ形式で解く(全800問) アルゴリズムとプログラミングの要点解説を読む
問題

上から順に解いてみてください。答えは各問の下で確認できます。

問14-10・基礎

次のプログラムを実行したときの動きとして正しいものはどれか。
( 1 ) n = 1
( 2 ) n < 10 の間繰り返す:
( 3 ) ⎿ 表示する(n)

  • ①n を1回表示して終わる
  • ②1 から 9 までが表示される
  • ③n が変わらず、終わらない
  • ④条件が偽で、何も表示されない
答えと解説を見る
正解 ③n が変わらず、終わらない
解説
正解は「n が変わらず、終わらない」。繰り返しの中に n を変える処理が無いので、n < 10 はいつまでも真です。

なぜ
「〜の間繰り返す」は、条件が偽になるまで処理を繰り返します。条件に使う n を中で変えないので、1 < 10 は真のままで、1 を表示し続けます。これを無限ループといいます。直すには、表示する の行を | にして、その下に ⎿ n = n + 1 を入れます。

ひっかけ注意

・「n を1回表示して終わる」…1回で終わるには、1回目の後で条件が偽になる必要があります。n は 1 のままなので、1 < 10 は真のままです。
・「1 から 9 までが表示される」…繰り返しの中に n = n + 1 がある場合の動きです。そのときは9個表示して、n = 10 で終わります。
・「条件が偽で、何も表示されない」…最初の条件 1 < 10 は真なので、表示は行われます。n を 10 以上から始めた場合なら、何も表示されません。
問24-10・基礎

プログラムの誤りを見つけ、その原因となっている箇所を突き止めて直す作業を何というか。

  • ①コーディング
  • ②コンパイル
  • ③テスト
  • ④デバッグ
答えと解説を見る
正解 ④デバッグ
解説
正解は「デバッグ」。プログラムの誤り(バグ)を取り除く、という意味の言葉です。

なぜ
プログラムは、思ったとおりに動かないことがよくあります。テストで誤りがあると分かったら、変数の値を1行ずつ追うトレース(追跡)や、途中の値を表示させる方法で原因の場所を見つけて直します。この作業がデバッグです。

ひっかけ注意

・「テスト」…プログラムが仕様どおりに正しく動くかを確かめる作業です。誤りがあるかを見つけるのが役目なのに対し、原因を探して直すのがデバッグです。境目の値で試す境界値テストなどの方法があります。
・「コーディング」…アルゴリズムをプログラミング言語で書く作業です。書いた後、テストで誤りが見つかった場合に、デバッグで直します。
・「コンパイル」…人が書いたプログラム(ソースプログラム)を、コンピュータが実行できる形(目的プログラム)に変換することです。変換するソフトウェアをコンパイラといいます。形を変えるだけで、誤りの原因を探して直す作業とは目的が違います。
問34-10・基礎

1 から 10 までの和 55 を求めるつもりで次のプログラムを作ったが、45 が表示された。正しく直す方法はどれか。
( 1 ) goukei = 0 , i = 1
( 2 ) i < 10 の間繰り返す:
( 3 ) | goukei = goukei + i
( 4 ) ⎿ i = i + 1
( 5 ) 表示する(goukei)

  • ①( 2 )行目の i < 10 を i <= 10 にする
  • ②( 2 )行目の i < 10 を i != 10 にする
  • ③( 1 )行目の i = 1 を i = 0 にする
  • ④( 4 )行目の i + 1 を i + 2 にする
答えと解説を見る
正解 ①( 2 )行目の i < 10 を i <= 10 にする
解説
正解は「( 2 )行目の i < 10 を i <= 10 にする」。i < 10 では、i が 10 になった時点で繰り返しが終わり、10 が足されません。

なぜ
< は等しい場合を含まず(未満)、<= は含みます(以下)。i < 10 で足されるのは 1 から 9 までで、合計は 45 です。<= にすると i = 10 の回も実行され、55 になります。境目の値を含むかどうかの誤りは、よくあるバグです。

ひっかけ注意

・「( 2 )行目の i < 10 を i != 10 にする」…!= は「等しくない」です。i が 10 になった時点で偽になるので、足すのは 1〜9 のままで 45 です。
・「( 1 )行目の i = 1 を i = 0 にする」…0 + 1 + … + 9 になり、0 を足しても和は 45 のままです。直すべきは終わりの境目です。
・「( 4 )行目の i + 1 を i + 2 にする」…1、3、5、7、9 だけを足して 25 になります。1回ごとに増やす量を変えると、足す数そのものが変わります。
問44-10・基礎

配列 Data = [2, 4, 6, 8] のすべての要素の合計を求めるつもりで、次のように書いた。( 3 )行目を直すとき、「i を ア から イ まで 1 ずつ増やしながら繰り返す:」のア・イとして正しいものはどれか。添字は 0 から始まる。
( 1 ) Data = [2, 4, 6, 8]
( 2 ) goukei = 0
( 3 ) i を 1 から 4 まで 1 ずつ増やしながら繰り返す:
( 4 ) ⎿ goukei = goukei + Data[i]

  • ①ア 1 / イ 3
  • ②ア 0 / イ 3
  • ③ア 0 / イ 4
  • ④ア 1 / イ 5
答えと解説を見る
正解 ②ア 0 / イ 3
解説
正解は「ア 0 / イ 3」。4個の要素の添字は 0、1、2、3 です。

なぜ
元のプログラムは添字が1つずれています。先頭の Data[0] を足さず、存在しない Data[4] を読もうとします。添字は 0 から 要素数 − 1 までなので、0 から 3 までにします(合計は 2 + 4 + 6 + 8 = 20)。

ひっかけ注意

・「ア 1 / イ 3」…範囲外の添字は無くなりますが、先頭の Data[0] = 2 が足されず、合計は 18 になります(正しくは 20)。
・「ア 0 / イ 4」…存在しない Data[4] を読もうとします。要素数 4 の配列の添字は 0〜3 です。
・「ア 1 / イ 5」…Data[0] が抜けるうえ、存在しない Data[4] と Data[5] も読もうとします。添字の最大は 要素数 − 1 です。
問54-10・標準

配列の合計 12 を表示するつもりで次のプログラムを作ったが、4 が表示された。正しく直す方法はどれか。
( 1 ) Data = [3, 5, 4]
( 2 ) i を 0 から 2 まで 1 ずつ増やしながら繰り返す:
( 3 ) | goukei = 0
( 4 ) ⎿ goukei = goukei + Data[i]
( 5 ) 表示する(goukei)

  • ①( 4 )行目を goukei = Data[i] にする
  • ②( 2 )行目の終わりの値 2 を 3 に書き換える
  • ③( 3 )行目を繰り返しの前に移して1回だけ行う
  • ④( 5 )行目を繰り返しの中に入れて毎回表示する
答えと解説を見る
正解 ③( 3 )行目を繰り返しの前に移して1回だけ行う
解説
正解は「( 3 )行目を繰り返しの前に移して1回だけ行う」。今は毎回 goukei が 0 に戻されるので、最後の 4 しか残りません。

なぜ
合計を入れる変数の初期化(最初の値を入れること)は、繰り返しの前に1回だけ行います。繰り返しの中に置くと、それまで足した分が毎回消えます。初期化の場所の誤りは、トレースで変数の値を追うと見つけやすいバグです。

ひっかけ注意

・「( 4 )行目を goukei = Data[i] にする」…足さずに毎回上書きするだけなので、最後の Data[2] = 4 が残り、やはり 4 です。
・「( 2 )行目の終わりの値 2 を 3 に書き換える」…要素数 3 の配列の添字は 0〜2 なので、存在しない Data[3] を読もうとします。初期化の位置の誤りも残ります。
・「( 5 )行目を繰り返しの中に入れて毎回表示する」…goukei は毎回 0 に戻るので、3、5、4 が順に表示されるだけで、合計 12 にはなりません。
問64-10・標準

配列の最大値を表示するつもりで次のプログラムを作った。実行したとき表示される値はどれか。
( 1 ) Data = [-8, -3, -5]
( 2 ) saidai = 0
( 3 ) i を 0 から 2 まで 1 ずつ増やしながら繰り返す:
( 4 ) | もし Data[i] > saidai ならば:
( 5 ) ⎿ ⎿ saidai = Data[i]
( 6 ) 表示する(saidai)

  • ①-3
  • ②-8
  • ③-5
  • ④0
答えと解説を見る
正解 ④0
解説
正解は「0」。すべての要素が負なので 0 より大きい値が無く、saidai は一度も書き換わりません。

なぜ
最大値の初めの値を 0 にすると、データがすべて 0 未満のとき正しく動きません。本当の最大値は -3 です。直すには、( 2 )行目を saidai = Data[0] にして、実際のデータの値から比べ始めます。このように、負の数だけのデータなど「ふつうでない値」でも試すと、誤りが見つかります。

ひっかけ注意

・「-3」…本来表示してほしい正しい最大値です。( 2 )行目を saidai = Data[0] に直すと、-3 が表示されます。
・「-8」…先頭の値です。-8 > 0 は偽なので、先頭の値でも saidai は書き換わりません。
・「-5」…最後に比べた値です。-5 > 0 も偽なので、saidai は初めの 0 のままです。
問74-10・標準

次のプログラムのトレース表を作る。i = 3 の回の処理が終わった時点での x と y の値の組合せとして正しいものはどれか。
x = 1 , y = 0
i を 1 から 4 まで 1 ずつ増やしながら繰り返す:
| y = y + x
⎿ x = x * 2

  • ①x は 8 / y は 7
  • ②x は 4 / y は 3
  • ③x は 8 / y は 15
  • ④x は 16 / y は 15
答えと解説を見る
正解 ①x は 8 / y は 7
解説
正解は「x は 8 / y は 7」。1回ごとに、y に x を足してから x を2倍にします。

手順
①i = 1:y = 0 + 1 = 1、x = 2。
②i = 2:y = 1 + 2 = 3、x = 4。
③i = 3:y = 3 + 4 = 7、x = 8。
トレース表は、このように各回の後の変数の値を表に書き出して、動きを確かめる方法です。

ひっかけ注意

・「x は 4 / y は 3」…i = 2 の回が終わった時点の値です。i = 3 の回で、y = 3 + 4 = 7、x = 4 × 2 = 8 になります。
・「x は 8 / y は 15」…y だけを i = 4 の回まで進めた値です。トレース表では、同じ回の x と y を同じ時点でそろえて書きます。
・「x は 16 / y は 15」…繰り返しがすべて終わった時点(i = 4 の後)の値です。y は 1 + 2 + 4 + 8 と、x の値を足していきます。
問84-10・標準

10、8、6、4、2 と表示して終わるつもりで次のプログラムを作ったが、繰り返しが終わらなかった。正しく直す方法はどれか。
( 1 ) n = 10
( 2 ) n > 0 の間繰り返す:
( 3 ) | 表示する(n)
( 4 ) ⎿ n = n + 2

  • ①( 2 )行目を n >= 0 の間 にする
  • ②( 4 )行目を n = n - 2 にする
  • ③( 1 )行目を n = 0 にする
  • ④( 3 )行目と( 4 )行目を入れ替える
答えと解説を見る
正解 ②( 4 )行目を n = n - 2 にする
解説
正解は「( 4 )行目を n = n - 2 にする」。n が増え続けると n > 0 はずっと真なので、減らす向きに直します。

なぜ
「〜の間繰り返す」が終わるには、条件がいつか偽になる必要があります。n = n - 2 にすると 10、8、6、4、2 と表示し、n が 0 になった時点で 0 > 0 が偽になって終わります。変数の変わる向きが逆になっていないかを確かめることが大切です。

ひっかけ注意

・「( 2 )行目を n >= 0 の間 にする」…n は 10、12、14… と増え続けるので、やはり終わりません。仮に減らす向きに直した後でも、>= だと 0 まで表示してしまいます。
・「( 1 )行目を n = 0 にする」…最初から 0 > 0 が偽になるので、1回も表示されずに終わります。
・「( 3 )行目と( 4 )行目を入れ替える」…表示の前に n が増えるので 12、14… と表示され、終わらないままです。
問94-10・標準

「得点が 10 以上 20 以下のときだけ OK と表示する」という仕様でプログラムを作ったが、( 1 )行目の条件に誤りがある。得点 tokuten は整数とする。
( 1 ) もし tokuten >= 10 and tokuten < 20 ならば:
( 2 ) ⎿ 表示する("OK")
テストで使う得点の組のうち、このプログラムが仕様と違う動きをする値を含み、誤りを見つけられるものはどれか。

  • ①9、10、11
  • ②5、15、25
  • ③19、20、21
  • ④10、15、19
答えと解説を見る
正解 ③19、20、21
解説
正解は「19、20、21」。仕様では 20 は OK ですが、プログラムの tokuten < 20 は 20 で偽になり、OK が表示されません。

なぜ
誤りは、以下(<=)とすべき所を未満(<)と書いたことです。この種の誤りは、境目の値でだけ結果が変わります。そこで、条件の境目の値とその前後の値をテストに使う方法を「境界値分析」(境界値テスト)といいます。一方、同じ結果になる範囲ごとに代表の値を1つずつ選ぶ方法を「同値分割」といいます。
得点仕様このプログラム
9表示なし表示なし
10〜19OKOK
20OK表示なし(誤り)
21 以上表示なし表示なし
ひっかけ注意

・「9、10、11」…下の境目 10 とその前後の値です。>= 10 は正しく書けているので、3つとも仕様どおりの結果になり、誤りは見つかりません。
・「5、15、25」…範囲の下・中・上から代表を1つずつ選ぶ同値分割の値です。境目の 20 を含まないので、この誤りは見つかりません。
・「10、15、19」…OK になる範囲の中の値だけです。20 ちょうどを試していないので、< と <= の違いが結果に出ません。
問104-10・標準

1 から 3 までの合計 6 だけを表示するつもりで次のプログラムを作った。実行したとき表示される内容はどれか。
goukei = 0
i を 1 から 3 まで 1 ずつ増やしながら繰り返す:
| goukei = goukei + i
⎿ 表示する(goukei)

  • ①6 だけが1回表示される
  • ②1 と 2 と 3 が順に表示される
  • ③6 が3回続けて表示される
  • ④1 と 3 と 6 が順に表示される
答えと解説を見る
正解 ④1 と 3 と 6 が順に表示される
解説
正解は「1 と 3 と 6 が順に表示される」。表示する の行が ⎿ 付きで繰り返しの範囲に入っているので、毎回その時点の合計が表示されます。

なぜ
| と ⎿ が付いた行は、制御文の範囲の中です。⎿ は範囲の最後の行を示します。合計だけを1回表示したいなら、表示する の行を繰り返しの外(| も ⎿ も付かない行)に出し、その前の goukei = goukei + i の行を ⎿ にします。

ひっかけ注意

・「6 だけが1回表示される」…表示する の行が繰り返しの外にある場合の動きです。この問題では ⎿ が付いているので、繰り返しの中で3回表示されます。
・「1 と 2 と 3 が順に表示される」…goukei ではなく i を表示した場合です。表示する(goukei) なので、その時点までの合計が出ます。
・「6 が3回続けて表示される」…合計を全部計算し終えてから表示すると考えた誤りです。繰り返しの中の処理は、1回ごとに上から順に行われます。

当サイトは、独立行政法人 大学入試センターとは一切関係のない、非公式の学習サイトです。試験に関する最新情報は、大学入試センターの公式サイトでご確認ください。

共通テスト 情報Ⅰ 基礎完全対策(全800問)に戻る

※本ページでは、アクセス解析(Googleアナリティクス)と、広告の配信・成果の計測(A8.net)のためにCookie等を利用し、閲覧に関する情報をGoogle LLC・株式会社ファンコミュニケーションズへ送信しています。詳しくはプライバシーポリシーをご覧ください。

※本ページの問題・解説は、生成AI(人工知能)を活用して作成しています。

【PR】