情報I プログラミング問題の解き方|DNCL擬似言語 完全マスター【日本数学塾・数強塾 藤原進之介】
```html
情報I プログラミング問題の解き方|DNCL擬似言語 完全マスター
著者:藤原進之介(日本数学塾・数強塾 講師/著書累計約15万部)
はじめに
こんにちは、日本数学塾・数強塾の藤原進之介です。
2025年度の大学入学共通テストから、新科目「情報I」が正式に導入されました。初年度の結果を見ると、平均点は約69〜73点と、他の科目と比較して高めの水準となりました。しかし、これは決して「簡単だった」ということではありません。
実際、多くの受験生から「プログラミング問題で時間が足りなかった」「DNCLの文法が分からず、何を聞かれているのか理解できなかった」という声が寄せられています。特に、プログラミング領域は得点差がつきやすい分野であり、ここを攻略できるかどうかが合否を分ける大きなポイントとなります。
大学入試センターの外部評価でも、「情報I」の難易度は「適切」と評価されており、今後もこの出題傾向が続くことが予想されます。つまり、プログラミング問題への対策は避けて通れないのです。
本記事では、共通テストで使用される擬似言語「DNCL(共通テスト手順記述標準言語)」の基礎から応用まで、完全マスターを目指して徹底解説します。数学を教える立場から、論理的思考力とパターン認識を活かした解法テクニックをお伝えしますので、プログラミング初心者の方も安心してお読みください。
【情報I プログラミング問題の解き方】の核心ポイント
なぜプログラミング問題が重要なのか
共通テスト「情報I」は、全体で100点満点、試験時間60分で構成されています。問題は大問4題からなり、その中でプログラミング領域は約25〜30点を占めると言われています。
つまり、全体の約4分の1から3分の1がプログラミング問題なのです。ここで確実に得点できれば、大きなアドバンテージになります。
逆に、プログラミング問題を「捨てる」という選択をした場合、残りの70〜75点から高得点を取らなければなりません。しかし、情報社会やデータ分析の問題にも、プログラミング的思考が求められる場面があります。プログラミングを避けることは、実は非効率な戦略なのです。
DNCL(共通テスト手順記述標準言語)とは何か
DNCLは、大学入試センターが共通テスト専用に設計した擬似プログラミング言語です。以前の「情報関係基礎」で使用されていた旧DNCLから、2022年に「新DNCL」または「DNCL2」と呼ばれる新しい表記に改訂されました。
DNCLの最大の特徴は、日本語をベースとした読みやすい記述です。Python、JavaScript、C言語などの実際のプログラミング言語とは異なり、特定の言語に依存しない「考え方」を問う設計になっています。
これは受験生にとってメリットでもありデメリットでもあります。
メリット
- 日本語で書かれているため、初心者でも読みやすい
- 特定のプログラミング言語の知識が不要
- 論理的思考力があれば対応可能
デメリット
- 学校や参考書によって教え方が異なる場合がある
- 実際のプログラミング経験がそのまま活かせない場合がある
- DNCL独自の表記ルールを覚える必要がある
プログラミング問題の3つの出題パターン
共通テストのプログラミング問題は、主に以下の3つのパターンに分類できます。
パターン1:プログラムの穴埋め問題
与えられたプログラムの一部が空欄になっており、適切なコードを選択または記述する問題です。プログラムの流れを理解し、「この部分で何をすべきか」を論理的に推論する力が求められます。
パターン2:プログラムのトレース問題
プログラムを実行したときの変数の値の変化や、最終的な出力結果を問う問題です。プログラムを1行ずつ追跡(トレース)し、各変数の値を正確に把握する技術が必要です。
パターン3:アルゴリズムの理解・改良問題
与えられたアルゴリズムの動作を説明したり、より効率的な方法に改良したりする問題です。単にプログラムが読めるだけでなく、「なぜこの方法なのか」「もっと良い方法はないか」を考える力が問われます。
核心ポイント:「数学的思考」でプログラミングを攻略する
私が数学講師として強調したいのは、プログラミング問題と数学には共通する思考法があるということです。
- 変数と方程式:プログラミングの「変数」は、数学の「未知数」と同じ概念です
- 条件分岐と場合分け:「もし〜ならば」という条件分岐は、数学の場合分けと同じ論理構造です
- 繰り返しと数列:ループ処理は、数列の漸化式やΣ(シグマ)の計算と深く関連しています
- アルゴリズムと証明:正しい手順で正しい結果を導く点で、数学の証明問題と共通しています
数学が得意な人は、この視点でプログラミングを学ぶと驚くほどスムーズに理解できます。数学が苦手な人も、プログラミングを通じて数学的思考力を養うことができます。
具体的な方法・事例(データ・問題例付き)
【DNCL基礎文法】完全マスターガイド
まずは、DNCLの基本的な文法をしっかり押さえましょう。ここを理解することが、すべての出発点です。
1. 変数と代入
変数とは、データを入れる「箱」のようなものです。DNCLでは、以下のように書きます。
x = 10
名前 = "太郎"
合計 = x + 20
ポイント:
- 「=」は「等しい」ではなく「代入する」という意味
- 変数名は日本語でも英語でもOK
- 右辺の計算結果が左辺の変数に格納される
【例題1】次のプログラムを実行した後、変数zの値はいくつになるか。
x = 5
y = 3
z = x + y
x = 10
z = z + x
【解答と解説】
1行ずつトレースしていきましょう。
| 行 | 処理内容 | x | y | z |
|---|---|---|---|---|
| 1行目 | x = 5 | 5 | - | - |
| 2行目 | y = 3 | 5 | 3 | - |
| 3行目 | z = x + y = 5 + 3 | 5 | 3 | 8 |
| 4行目 | x = 10 | 10 | 3 | 8 |
| 5行目 | z = z + x = 8 + 10 | 10 | 3 | 18 |
答え:18
ここで注意すべきは、3行目でzが計算されるとき、xはまだ5だったということです。4行目でxが10に変わっても、すでに計算済みのzには影響しません。プログラムは上から順に1行ずつ実行されることを忘れないでください。
2. 演算子
DNCLで使用する主な演算子は以下の通りです。
算術演算子
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
| + | 加算(足し算) | 5 + 3 | 8 |
| - | 減算(引き算) | 5 - 3 | 2 |
| * | 乗算(掛け算) | 5 * 3 | 15 |
| / | 除算(割り算) | 5 / 3 | 1.666... |
| ÷ または // | 整数除算(商) | 5 ÷ 3 | 1 |
| % | 剰余(余り) | 5 % 3 | 2 |
特に重要なのは「整数除算」と「剰余」です。この2つは共通テストで頻出です。
【例題2】次のプログラムを実行した後の出力結果を答えよ。
a = 17
b = 5
商 = a ÷ b
余り = a % b
表示する(商, 余り)
【解答と解説】
- 17 ÷ 5 の商は 3(17 = 5 × 3 + 2)
- 17 % 5 の余りは 2
答え:3, 2
比較演算子
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
| == | 等しい | 5 == 5 | 真(True) |
| != | 等しくない | 5 != 3 | 真(True) |
| < | より小さい | 3 < 5 | 真(True) |
| <= | 以下 | 5 <= 5 | 真(True) |
| > | より大きい | 5 > 3 | 真(True) |
| >= | 以上 | 5 >= 5 | 真(True) |
論理演算子
| 演算子 | 意味 | 例 |
|---|---|---|
| かつ(and) | 両方が真のとき真 | (x > 0) かつ (x < 10) |
| または(or) | どちらかが真のとき真 | (x == 0) または (x == 1) |
| でない(not) | 真偽を反転 | (x == 0) でない |
3. 条件分岐(if文)
条件分岐は、「もし〜ならば、〜する」という処理を実現します。DNCLでは以下のように書きます。
もし 条件式 ならば
処理1
そうでなければ
処理2
を実行する
または、新DNCLでは以下の表記も使われます。
if 条件式:
処理1
else:
処理2
【例題3】次のプログラムを実行したとき、x = 7 の場合の出力結果を答えよ。
x = 7
もし x % 2 == 0 ならば
表示する("偶数")
そうでなければ
表示する("奇数")
を実行する
【解答と解説】
- x = 7 のとき、x % 2 = 7 % 2 = 1
- 1 == 0 は偽(False)
- よって「そうでなければ」の処理が実行される
答え:奇数
複数条件の場合(elif)
もし 条件1 ならば
処理1
そうでなくもし 条件2 ならば
処理2
そうでなければ
処理3
を実行する
【例題4】次のプログラムは、点数によって評価を表示します。score = 75 のときの出力を答えよ。
score = 75
もし score >= 90 ならば
表示する("A")
そうでなくもし score >= 80 ならば
表示する("B")
そうでなくもし score >= 70 ならば
表示する("C")
そうでなくもし score >= 60 ならば
表示する("D")
そうでなければ
表示する("F")
を実行する
【解答と解説】
- score = 75 >= 90 は偽
- score = 75 >= 80 は偽
- score = 75 >= 70 は真 → ここで処理が決定
答え:C
4. 繰り返し処理(ループ)
繰り返し処理は、プログラミングの最も重要な概念の一つです。同じ処理を何度も実行するときに使います。
回数指定の繰り返し(for文)
i を 1 から 5 まで 1 ずつ増やしながら繰り返す:
表示する(i)
を繰り返す
このプログラムは、1, 2, 3, 4, 5 を順に表示します。
【例題5】次のプログラムを実行したとき、sumの最終的な値を答えよ。
sum = 0
i を 1 から 5 まで 1 ずつ増やしながら繰り返す:
sum = sum + i
を繰り返す
表示する(sum)
【解答と解説】
トレース表を作成します。
| 回数 | i | sum(処理前) | sum = sum + i | sum(処理後) |
|---|---|---|---|---|
| 1回目 | 1 | 0 | 0 + 1 | 1 |
| 2回目 | 2 | 1 | 1 + 2 | 3 |
| 3回目 | 3 | 3 | 3 + 3 | 6 |
| 4回目 | 4 | 6 | 6 + 4 | 10 |
| 5回目 | 5 | 10 | 10 + 5 | 15 |
答え:15
これは1から5までの整数の和を計算しています。数学的には Σ(i=1 to 5) i = 1+2+3+4+5 = 15 です。公式 n(n+1)/2 を使えば 5×6/2 = 15 と即座に検算できます。
条件指定の繰り返し(while文)
条件式 の間繰り返す:
処理
を繰り返す
while文は、条件が真である限り繰り返し続ける構文です。for文と異なり、繰り返し回数が事前に決まっていない場合に使用します。
【例題6】次のプログラムを実行したとき、countの最終的な値を答えよ。
n = 100
count = 0
n > 0 の間繰り返す:
n = n ÷ 2
count = count + 1
を繰り返す
表示する(count)
【解答と解説】
| 回数 | n(処理前) | n ÷ 2 | n(処理後) | count |
|---|---|---|---|---|
| 1回目 | 100 | 100 ÷ 2 = 50 | 50 | 1 |
| 2回目 | 50 | 50 ÷ 2 = 25 | 25 | 2 |
| 3回目 | 25 | 25 ÷ 2 = 12 | 12 | 3 |
| 4回目 | 12 | 12 ÷ 2 = 6 | 6 | 4 |
| 5回目 | 6 | 6 ÷ 2 = 3 | 3 | 5 |
| 6回目 | 3 | 3 ÷ 2 = 1 | 1 | 6 |
| 7回目 | 1 | 1 ÷ 2 = 0 | 0 | 7 |
n = 0 となったので、条件 n > 0 が偽になり、ループ終了。
答え:7
このプログラムは、100を2で何回割れるか(整数として)を数えています。これは2進数の桁数に関連する重要なアルゴリズムです。
5. 配列(リスト)
配列は、複数のデータをまとめて管理するための構造です。DNCLでは以下のように書きます。
配列 = [10, 20, 30, 40, 50]
重要な注意点:配列の添字(インデックス)は、問題によって0から始まる場合と1から始まる場合があります。問題文をよく確認してください。
添字が0から始まる場合
| 添字 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 配列[添字] | 10 | 20 | 30 | 40 | 50 |
添字が1から始まる場合
| 添字 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 配列[添字] | 10 | 20 | 30 | 40 | 50 |
【例題7】次のプログラムを実行したとき、出力結果を答えよ。(添字は0から始まる)
data = [3, 1, 4, 1, 5, 9, 2, 6]
max = data[0]
i を 1 から 7 まで 1 ずつ増やしながら繰り返す:
もし data[i] > max ならば
max = data[i]
を実行する
を繰り返す
表示する(max)
【解答と解説】
このプログラムは配列の中の最大値を求めるアルゴリズムです。
| i | data[i] | 条件 data[i] > max | max(更新後) |
|---|---|---|---|
| 初期値 | - | - | 3(data[0]) |
| 1 | 1 | 1 > 3 → 偽 | 3 |
| 2 | 4 | 4 > 3 → 真 | 4 |
| 3 | 1 | 1 > 4 → 偽 | 4 |
| 4 | 5 | 5 > 4 → 真 | 5 |
| 5 | 9 | 9 > 5 → 真 | 9 |
| 6 | 2 | 2 > 9 → 偽 | 9 |
| 7 | 6 | 6 > 9 → 偽 | 9 |
答え:9
6. 2次元配列
2次元配列は、行と列で構成される表形式のデータを扱います。
表 = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
# 表[行][列] でアクセス
# 表[0][0] = 1, 表[1][2] = 6, 表[2][1] = 8
【例題8】次の2次元配列について、表[1][2] の値を答えよ。(添字は0から始まる)
表 = [[10, 20, 30],
[40, 50, 60],
[70, 80, 90]]
【解答と解説】
- 表[1] は2行目(0から数えて1番目)→ [40, 50, 60]
- 表[1][2] は2行目の3列目(0から数えて2番目)→ 60
答え:60
7. 関数
関数は、一連の処理をまとめて名前をつけたものです。DNCLでは以下のように定義します。
関数 関数名(引数1, 引数2, ...)
処理
戻り値を返す
を定義する
# 関数の呼び出し
結果 = 関数名(値1, 値2, ...)
【例題9】次のプログラムを実行したとき、出力結果を答えよ。
関数 階乗(n)
もし n <= 1 ならば
1 を返す
そうでなければ
n * 階乗(n - 1) を返す
を実行する
を定義する
結果 = 階乗(5)
表示する(結果)
【解答と解説】
これは再帰関数の例です。自分自身を呼び出しています。
- 階乗(5) = 5 × 階乗(4)
- 階乗(4) = 4 × 階乗(3)
- 階乗(3) = 3 × 階乗(2)
- 階乗(2) = 2 × 階乗(1)
- 階乗(1) = 1(n <= 1 なので)
逆順に計算すると:
- 階乗(1) = 1
- 階乗(2) = 2 × 1 = 2
- 階乗(3) = 3 × 2 = 6
- 階乗(4) = 4 × 6 = 24
- 階乗(5) = 5 × 24 = 120
答え:120
これは数学の 5! = 5 × 4 × 3 × 2 × 1 = 120 と同じです。
【実践問題】共通テストレベルの総合問題
ここからは、実際の共通テストを想定した総合的な問題に挑戦しましょう。
【総合問題1】線形探索アルゴリズム
以下のプログラムは、配列の中から特定の値を探す「線形探索」を行います。空欄(ア)〜(ウ)に入る適切な内容を答えよ。(添字は0から始まる)
関数 線形探索(配列, 目標値)
i を 0 から (配列の要素数 - 1) まで 1 ずつ増やしながら繰り返す:
もし 【 (ア) 】 ならば
【 (イ) 】 を返す
を実行する
を繰り返す
【 (ウ) 】 を返す
を定義する
data = [5, 2, 8, 1, 9, 3, 7, 4, 6]
位置 = 線形探索(data, 9)
表示する(位置)
選択肢
- (ア)の選択肢:① 配列[i] == 目標値 ② 配列[i] != 目標値 ③ i == 目標値 ④ 配列[目標値] == i
- (イ)の選択肢:① 目標値 ② i ③ 配列[i] ④ -1
- (ウ)の選択肢:① 目標値 ② i ③ 配列の要素数 ④ -1
【解答と解説】
線形探索とは、配列の先頭から順に目標値と比較していく最も基本的な探索アルゴリズムです。
(ア) の解答:①
配列の各要素と目標値を比較する必要があります。「配列[i] == 目標値」が正解です。
(イ) の解答:②
目標値が見つかったとき、その位置(添字)を返します。「i」が正解です。
(ウ) の解答:④
ループが最後まで回っても見つからなかった場合、「見つからなかった」ことを示す値を返します。一般的に「-1」を使います。
プログラムの実行結果
data = [5, 2, 8, 1, 9, 3, 7, 4, 6] の中から 9 を探すと、添字4の位置にあります。
出力:4
【総合問題2】バブルソートアルゴリズム
以下のプログラムは、配列を昇順(小さい順)に並び替える「バブルソート」を行います。空欄(ア)〜(エ)に入る適切な内容を答えよ。(添字は0から始まる)
配列 = [64, 34, 25, 12, 22, 11, 90]
n = 配列の要素数
i を 0 から 【 (ア) 】 まで 1 ずつ増やしながら繰り返す:
j を 0 から 【 (イ) 】 まで 1 ずつ増やしながら繰り返す:
もし 【 (ウ) 】 ならば
# 要素の交換
temp = 配列[j]
配列[j] = 【 (エ) 】
配列[j + 1] = temp
を実行する
を繰り返す
を繰り返す
表示する(配列)
選択肢
- (ア)の選択肢:① n ② n - 1 ③ n - 2 ④ n + 1
- (イ)の選択肢:① n - 1 ② n - 2 ③ n - i - 1 ④ n - i - 2
- (ウ)の選択肢:① 配列[j] 配列[j + 1] ③ 配列[j] == 配列[j + 1] ④ 配列[i] > 配列[j]
- (エ)の選択肢:① 配列[i] ② 配列[j] ③ 配列[j + 1] ④ temp
【解答と解説】
バブルソートは、隣り合う要素を比較して、順序が逆なら交換することを繰り返すアルゴリズムです。泡(バブル)が水面に浮かび上がるように、大きな値が配列の後ろに移動していきます。
(ア) の解答:③ n - 2
外側のループは (n-1) 回実行すれば十分です。0 から n-2 まで(つまり n-1 回)のループになります。
(イ) の解答:④ n - i - 2
内側のループでは、i 回目の外側ループが終わった時点で、後ろから i 個の要素はすでに正しい位置にあります。そのため、比較する範囲を徐々に狭めていきます。
(ウ) の解答:② 配列[j] > 配列[j + 1]
昇順(小さい順)に並べるので、左の要素が右の要素より大きければ交換します。
(エ) の解答:③ 配列[j + 1]
交換処理では、一時変数tempに配列[j]を退避させ、配列[j]に配列[j+1]の値を入れ、最後に配列[j+1]にtempを入れます。
バブルソートの動作イメージ
初期状態:[64, 34, 25, 12, 22, 11, 90]
1回目のパス後:[34, 25, 12, 22, 11, 64, 90] ← 90が最後尾へ
2回目のパス後:[25, 12, 22, 11, 34, 64, 90] ← 64が後ろから2番目へ
...(省略)...
最終結果:[11, 12, 22, 25, 34, 64, 90]
【総合問題3】二分探索アルゴリズム
以下のプログラムは、ソート済みの配列から効率的に値を探す「二分探索」を行います。空欄(ア)〜(オ)に入る適切な内容を答えよ。(添字は0から始まる)
関数 二分探索(配列, 目標値)
left = 0
right = 配列の要素数 - 1
【 (ア) 】 の間繰り返す:
mid = (left + right) ÷ 2
もし 配列[mid] == 目標値 ならば
【 (イ) 】 を返す
そうでなくもし 【 (ウ) 】 ならば
left = 【 (エ) 】
そうでなければ
right = 【 (オ) 】
を実行する
を繰り返す
-1 を返す
を定義する
data = [11, 12, 22, 25, 34, 64, 90]
位置 = 二分探索(data, 25)
表示する(位置)
選択肢
- (ア)の選択肢:① left < right ② left right ④ left != right
- (イ)の選択肢:① 目標値 ② left ③ right ④ mid
- (ウ)の選択肢:① 配列[mid] 目標値 ③ mid < 目標値 ④ left < mid
- (エ)の選択肢:① mid ② mid + 1 ③ mid - 1 ④ left + 1
- (オ)の選択肢:① mid ② mid + 1 ③ mid - 1 ④ right - 1
【解答と解説】
二分探索は、探索範囲を半分ずつ狭めていく効率的なアルゴリズムです。ソート済みの配列でのみ使用可能です。
(ア) の解答:② left <= right
探索範囲が有効な間(leftがright以下の間)繰り返します。left > rightになったら範囲がなくなったことを意味します。
(イ) の解答:④ mid
目標値が見つかったら、その位置(mid)を返します。
(ウ) の解答:① 配列[mid] < 目標値
中央の値が目標値より小さければ、目標値は右半分にあります。
(エ) の解答:② mid + 1
右半分を探索するため、leftをmid + 1に更新します(midは既に確認済み)。
(オ) の解答:③ mid - 1
左半分を探索するため、rightをmid - 1に更新します。
二分探索の動作例(data = [11, 12, 22, 25, 34, 64, 90]、目標値 = 25)
| 回数 | left | right | mid | 配列[mid] | 比較結果 |
|---|---|---|---|---|---|
| 1回目 | 0 | 6 | 3 | 25 | 25 == 25 → 発見! |
出力:3
この例では1回で見つかりましたが、目標値が34の場合は以下のようになります:
| 回数 | left | right | mid | 配列[mid] | 比較結果 |
|---|---|---|---|---|---|
| 1回目 | 0 | 6 | 3 | 25 | 25 < 34 → 右半分へ |
| 2回目 | 4 | 6 | 5 | 64 | 64 > 34 → 左半分へ |
| 3回目 | 4 | 4 | 4 | 34 | 34 == 34 → 発見! |
二分探索の効率性
線形探索は最悪の場合n回の比較が必要ですが、二分探索は最悪でも log₂(n) 回で済みます。例えば、100万個のデータでも約20回の比較で探せます。これは数学の対数の概念そのものです。
【総合問題4】文字列処理
以下のプログラムは、文字列を逆順にする処理を行います。実行結果を答えよ。
関数 文字列逆転(文字列)
結果 = ""
長さ = 文字列の文字数
i を 長さ - 1 から 0 まで 1 ずつ減らしながら繰り返す:
結果 = 結果 + 文字列[i]
を繰り返す
結果 を返す
を定義する
元の文字列 = "PROGRAMMING"
逆転後 = 文字列逆転(元の文字列)
表示する(逆転後)
【解答と解説】
文字列 "PROGRAMMING" の各文字は以下のように配置されています(添字0から):
| 添字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 文字 | P | R | O | G | R | A | M | M | I | N | G |
ループは i = 10 から 0 まで逆順に実行されるので、G → N → I → M → M → A → R → G → O → R → P の順に結果に追加されます。
答え:GNIMMARGORP
【総合問題5】素数判定アルゴリズム
以下のプログラムは、与えられた数が素数かどうかを判定します。空欄(ア)〜(ウ)に入る適切な内容を答えよ。
関数 素数判定(n)
もし n < 2 ならば
偽 を返す
を実行する
もし n == 2 ならば
真 を返す
を実行する
もし 【 (ア) 】 ならば
偽 を返す
を実行する
i = 3
【 (イ) 】 の間繰り返す:
もし n % i == 0 ならば
偽 を返す
を実行する
i = 【 (ウ) 】
を繰り返す
真 を返す
を定義する
表示する(素数判定(17))
表示する(素数判定(18))
表示する(素数判定(97))
選択肢
- (ア)の選択肢:① n % 2 == 1 ② n % 2 == 0 ③ n == 3 ④ n < 3
- (イ)の選択肢:① i < n ② i <= n ③ i * i <= n ④ i * i < n
- (ウ)の選択肢:① i + 1 ② i + 2 ③ i * 2 ④ i * i
【解答と解説】
(ア) の解答:② n % 2 == 0
2以外の偶数は素数ではありません。n % 2 == 0 で偶数判定をして、偽を返します。
(イ) の解答:③ i * i <= n
素数判定では、√n までの数で割り切れるかを調べれば十分です。これは数学的に証明できます。もし n = a × b ならば、a と b のどちらかは必ず √n 以下だからです。i * i <= n は i <= √n と同じ意味です。
(ウ) の解答:② i + 2
偶数は既に除外済みなので、奇数だけを調べます。3, 5, 7, 9, ... と2ずつ増やしていきます。
実行結果
- 素数判定(17) → 真(17は素数)
- 素数判定(18) → 偽(18 = 2 × 9、素数ではない)
- 素数判定(97) → 真(97は素数)
【総合問題6】フィボナッチ数列
フィボナッチ数列は、F(1) = 1, F(2) = 1, F(n) = F(n-1) + F(n-2) (n ≥ 3)で定義される数列です。以下のプログラムを実行したとき、出力結果を答えよ。
関数 フィボナッチ(n)
もし n <= 2 ならば
1 を返す
そうでなければ
a = 1
b = 1
i を 3 から n まで 1 ずつ増やしながら繰り返す:
c = a + b
a = b
b = c
を繰り返す
b を返す
を実行する
を定義する
i を 1 から 10 まで 1 ずつ増やしながら繰り返す:
表示する(フィボナッチ(i))
を繰り返す
【解答と解説】
フィボナッチ数列の計算過程をトレースします:
| n | F(n) | 計算過程 |
|---|---|---|
| 1 | 1 | n <= 2 なので 1 |
| 2 | 1 | n <= 2 なので 1 |
| 3 | 2 | 1 + 1 = 2 |
| 4 | 3 | 1 + 2 = 3 |
| 5 | 5 | 2 + 3 = 5 |
| 6 | 8 | 3 + 5 = 8 |
| 7 | 13 | 5 + 8 = 13 |
| 8 | 21 | 8 + 13 = 21 |
| 9 | 34 | 13 + 21 = 34 |
| 10 | 55 | 21 + 34 = 55 |
答え:1, 1, 2, 3, 5, 8, 13, 21, 34, 55
フィボナッチ数列は数学でも頻出のテーマです。漸化式 a_n = a_{n-1} + a_{n-2} の理解が、プログラミングと数学の両方で役立ちます。
【応用テクニック】得点を伸ばすための戦略
テクニック1:トレース表を必ず作る
プログラムの動作を追跡するとき、必ず紙にトレース表を書くことを習慣にしてください。頭の中だけで追跡しようとすると、必ずミスが発生します。
トレース表の書き方のコツ
- すべての変数の列を用意する
- 行ごとに変数の値を記録する
- 変更があった値は目立つように記録する
- 条件分岐では、どちらに進んだかを明記する
テクニック2:問題文のヒントを活用する
共通テストの問題文には、必ず丁寧な誘導が含まれています。プログラムの目的、期待される動作、具体例などが説明されているので、これらを最大限に活用してください。
例えば、「このプログラムは配列の中から最大値を見つける」と書かれていれば、変数名が「max」であることや、比較演算子が「>」であることが推測できます。
テクニック3:具体的な値を代入してみる
抽象的なプログラムを見て混乱したときは、具体的な小さな値を代入して考えてみてください。
例えば、「配列の要素数n」と書かれていたら、n = 3 や n = 5 などの小さな数で考えると、ループの動作が理解しやすくなります。
テクニック4:数学的な検算を行う
プログラミング問題の多くは、数学的に検算できます。
- 合計を求めるプログラム → Σの公式で確認
- 最大・最小を求めるプログラム → 目視で確認
- ソートプログラム → 結果が昇順/降順になっているか確認
- 探索プログラム → 実際にその位置にあるか確認
よくある失敗パターンと対処法
失敗パターン1:添字のズレ(Off-by-One Error)
症状:配列のアクセスで1つずれた位置を参照してしまう
原因:添字が0から始まるか1から始まるかを混同している
対処法:
- 問題文で添字の開始位置を必ず確認する
- 配列の要素数がnなら、0始まりの場合は添字0〜n-1、1始まりの場合は添字1〜n
- 「配列の要素数 - 1」という表現が出てきたら、0始まりの可能性が高い
【典型的なミス例】
配列 = [10, 20, 30, 40, 50](添字0から)で、「5番目の要素」を取得しようとして配列[5]と書いてしまう。
正解:「5番目」は添字4なので、配列[4] = 50
失敗パターン2:ループ範囲の間違い
症状:ループが1回多く/少なく実行される
原因:「から」「まで」の境界条件の理解不足
対処法:
- 「1から5まで」は 1, 2, 3, 4, 5 の5回(両端を含む)
- 「1から5未満まで」は 1, 2, 3, 4 の4回(5を含まない)
- 迷ったら、具体的な数値で確認する
失敗パターン3:条件式の論理ミス
症状:条件分岐が期待通りに動作しない
原因:「かつ」と「または」の混同、否定の誤用
対処法:
- 「かつ」(and):両方の条件が真のときだけ真
- 「または」(or):どちらか一方でも真なら真
- 複雑な条件は、真理値表を書いて確認する
【典型的なミス例】
「xが0以上10以下」を表現したいとき:
× (x >= 0) または (x <= 10) → これはほぼすべての数が該当してしまう
○ (x >= 0) かつ (x <= 10) → 正しい
失敗パターン4:変数の上書き忘れ・不要な上書き
症状:変数の値が期待と異なる
原因:変数を更新すべき場所でしていない、または不要な場所で更新している
対処法:
- トレース表で各ステップの変数値を確認する
- 特に「swap(交換)」処理では一時変数の使い方に注意
【典型的なミス例】
a と b の値を交換したいとき:
× a = b ← この時点で元のaの値が消える b = a ← 両方とも同じ値になる ○ temp = a a = b b = temp
失敗パターン5:無限ループ
症状:プログラムが終了しない(想定上)
原因:ループの終了条件が永遠に満たされない
対処法:
- while文では、ループ内で終了条件に関わる変数が必ず変化することを確認
- カウンタ変数が正しい方向に増加/減少しているか確認
【典型的なミス例】
i = 10
i > 0 の間繰り返す:
表示する(i)
i = i + 1 ← 増えていくので永遠に i > 0
を繰り返す
【正解】
i = i - 1 ← 減っていくのでいずれ i <= 0 になる
失敗パターン6:整数除算と通常の除算の混同
症状:計算結果が期待と異なる
原因:「/」(通常の除算)と「÷」または「//」(整数除算)の混同
対処法:
- 問題文で使用されている演算子を確認する
- 整数除算は小数点以下を切り捨てることを覚えておく
| 計算 | 通常の除算 (/) | 整数除算 (÷) |
|---|---|---|
| 7 / 2 | 3.5 | 3 |
| 10 / 3 | 3.333... | 3 |
| -7 / 2 | -3.5 | -4(または-3、言語による) |
失敗パターン7:時間配分のミス
症状:プログラミング問題に時間をかけすぎて、他の問題ができなくなる
原因:完璧主義、または効率的な解法を知らない
対処法:
- 共通テストは60分で100点満点。プログラミング問題は約15〜20分を目安に
- トレースに時間がかかりすぎる場合は、部分点狙いで先に進む
- 穴埋め問題は、前後の文脈から推測できることが多い
保護者・生徒へのQ&A
Q1:プログラミング経験がまったくありませんが、大丈夫ですか?
A:はい、大丈夫です。
共通テストの「情報I」で使用されるDNCLは、日本語をベースとした擬似言語であり、特定のプログラミング言語の知識は必要ありません。
むしろ重要なのは論理的思考力です。「もし〜ならば」「〜の間繰り返す」といった基本的な構造は、日常生活でも使っている考え方です。これを形式化したものがプログラミングだと理解してください。
数学の「場合分け」や「数列の漸化式」を学んできた皆さんには、すでにプログラミング的思考の基礎があります。
Q2:学校の授業だけで十分ですか?
A:学校や先生によって大きく異なります。
2025年度が「情報I」必修化後の初めての共通テストでした。そのため、学校によって指導の充実度に差があるのが現状です。
特に以下のような場合は、追加の対策をお勧めします:
- 情報科の専任教員がいない学校
- 授業でプログラミングの実習が少ない
- プログラミング問題の演習量が不足している
大学入試センターの公式サイトで公開されている試作問題や、過去問に相当する問題集を使った自主学習を強くお勧めします。
Q3:PythonやJavaScriptを学んだ方が良いですか?
A:共通テスト対策としては必須ではありませんが、役立ちます。
DNCLは特定の言語に依存しない設計ですが、実際のプログラミング言語を学ぶことで、以下のメリットがあります:
- 実行して確認できる:自分でコードを書いて動かすことで、動作を深く理解できる
- エラーから学べる:間違いを発見・修正する経験が、論理的思考力を高める
- 将来に役立つ:大学や社会でプログラミングスキルは必須になりつつある
特にPythonはDNCL(新DNCL/DNCL2)と文法が似ているため、学習効果が高いと言われています。
ただし、共通テスト対策に特化するなら、まずはDNCLの文法と典型的なアルゴリズムをしっかり習得することを優先してください。
Q4:数学が苦手でもプログラミング問題は解けますか?
A:解けます。ただし、数学的な考え方があると有利です。
プログラミング問題の多くは、数学的な内容を含んでいます。例えば:
- 合計や平均を求める → 数学のΣ(シグマ)
- 素数判定 → 数学の約数・倍数
- 二分探索 → 数学の対数(log)
- フィボナッチ数列 → 数学の漸化式
しかし、高度な数学知識がなくても、基本的なプログラムの動作は理解できます。「トレース(追跡)」という技術を使えば、1行ずつ実行結果を追うことで答えにたどり着けます。
むしろ、プログラミングを学ぶことで数学への理解が深まるケースも多いです。プログラミングと数学は相互に補完し合う関係にあると言えます。
Q5:どのくらいの学習時間が必要ですか?
A:目安として、集中的に学習すれば2〜3ヶ月で基礎は身につきます。
以下は推奨する学習スケジュールです:
| 期間 | 学習内容 | 目安時間(週あたり) |
|---|---|---|
| 1〜2週目 | DNCL基礎文法(変数、演算子、条件分岐) | 3〜5時間 |
| 3〜4週目 | 繰り返し処理、配列 | 3〜5時間 |
| 5〜6週目 | 基本アルゴリズム(探索、ソート) | 4〜6時間 |
| 7〜8週目 | 関数、応用アルゴリズム | 4〜6時間 |
| 9週目以降 | 実践演習、過去問・模試対策 | 5〜8時間 |
もちろん、個人差はあります。大切なのは毎日少しずつでも継続することです。
Q6:情報Iの他の分野との関連はありますか?
A:はい、密接に関連しています。
「情報I」は以下の4つの分野で構成されています:
- 情報社会の問題解決
- コミュニケーションと情報デザイン
- コンピュータとプログラミング
- 情報通信ネットワークとデータの活用
プログラミングの知識は、特に「データの活用」分野で役立ちます。統計処理やデータ分析の問題では、プログラミング的な考え方が必要になることがあります。
また、「情報社会の問題解決」でも、アルゴリズムの効率性や計算量の概念が問われることがあります。
Q7:共通テストの情報Iで高得点を取るコツは?
A:以下の3つを意識してください。
① 基礎を徹底的に固める
DNCLの基本文法、基本的なアルゴリズム(探索、ソート、集計など)は完璧に理解してください。応用問題も、基礎の組み合わせで解けることが多いです。
② 問題文を丁寧に読む
共通テストの問題文には、丁寧な誘導や具体例が含まれています。焦って読み飛ばさず、しっかり読み込んでください。
③ 時間配分を意識する
60分で全問解く必要があります。難しい問題に時間をかけすぎず、確実に取れる問題から解いていく戦略が重要です。
Q8:おすすめの参考書や学習リソースはありますか?
A:以下のリソースをお勧めします。
公式資料
- 大学入試センター公式サイトの試作問題・サンプル問題
- 共通テスト手順記述標準言語(DNCL)の説明資料
オンラインツール
- DNCL2実行環境(ブラウザ上でDNCLを実行できるサイト)
- DNCL Blockly(ブロックを使ってDNCLプログラムを作成できる教材)
学習のポイント
- 必ず手を動かしてプログラムを書く・トレースする
- 間違えた問題はなぜ間違えたかを分析する
- 同じ問題を時間を置いて繰り返す
Q9:保護者として、どのようにサポートすればよいですか?
A:以下の3点を心がけてください。
① 焦らせない
プログラミングは「習うより慣れろ」の世界です。最初は理解できなくても、繰り返し取り組むことで必ず身につきます。「まだできないの?」というプレッシャーは逆効果です。
② 学習環境を整える
パソコンやタブレットで実際にコードを書いて試せる環境があると、学習効率が大幅に上がります。特にDNCLをブラウザ上で実行できるサイトは、すぐに結果が確認できるため有効です。
③ 興味を持って聞いてみる
「今日はどんなプログラムを勉強したの?」「どういう仕組みなの?」と聞いてみてください。人に説明することは、最高の学習方法です。たとえ保護者の方がプログラミングを知らなくても、聞き役になるだけで十分です。
Q10:試験本番で気をつけることは?
A:以下の点に注意してください。
① 添字の確認
問題文で「配列の添字は0から始まる」「配列の添字は1から始まる」のどちらか確認してください。これを間違えると、すべての答えがずれてしまいます。
② トレース表を書くスペースを確保
問題冊子の余白を使って、トレース表を書けるようにしてください。頭の中だけで追うのは危険です。
③ 見直しの時間を確保
プログラミング問題は、ケアレスミスが起きやすい分野です。時間があれば、別の方法で検算してください。
④ 分からない問題は後回し
プログラミング問題で詰まったら、先に他の大問を解いてから戻ってきてください。頭を切り替えることで、解けることもあります。
藤原進之介からのメッセージ
ここまでお読みいただき、ありがとうございます。
私は数学を教える立場から、プログラミングと数学には深い関係があると常々感じています。
変数は未知数、条件分岐は場合分け、繰り返しは数列、アルゴリズムは証明——このように、プログラミングの概念の多くは、数学で学んできた内容と重なっています。
数学が得意な人にとって、プログラミングは新しい言語で数学を表現するようなものです。逆に、数学が苦手な人にとっても、プログラミングを通じて「なぜこの公式が成り立つのか」を実感できる機会になります。
2025年度から「情報I」が共通テストの正式科目となり、初年度の平均点は約69〜73点と比較的高い水準でした。しかし、これは「簡単だった」ということではありません。問題の読解力、論理的思考力、そして基礎的なアルゴリズムの知識がバランスよく求められる、総合力を試す科目だということです。
特にプログラミング領域は、対策した人としていない人で大きな差がつく分野です。今から始めれば、十分に間に合います。
学習のモチベーションを保つために
プログラミング学習で最も大切なのは、「動いた!」という成功体験を積み重ねることです。
最初は単純なプログラムでも構いません。「1から10までの合計を計算する」「入力された数が偶数か奇数か判定する」——こんな小さなプログラムでも、自分で考えて、書いて、動かして、正しい結果が出たときの喜びは格別です。
その小さな成功体験の積み重ねが、やがて複雑なアルゴリズムを理解する力につながっていきます。
失敗を恐れないでください
プログラミングでは、エラーは当たり前です。プロのエンジニアでも、毎日何十回もエラーに遭遇し、修正を繰り返しています。
大切なのは、なぜエラーになったのかを理解することです。「ここでこう書いたから、こういう結果になった」という因果関係を理解できれば、それは立派な学びです。
エラーを恐れず、たくさん間違えてください。その経験が、本番での自信につながります。
最後に
「情報I」という科目は、これからの社会を生きていく皆さんにとって、単なる受験科目以上の意味を持っています。
AI、IoT、ビッグデータ——私たちの生活は、すでにプログラムによって動いています。その仕組みを理解することは、これからの時代を主体的に生きる力を身につけることに他なりません。
共通テストのための勉強が、皆さんの将来にとっても価値ある学びになることを願っています。
分からないことがあれば、一人で悩まず、学校の先生や塾の講師に相談してください。私たち数強塾・日本数学塾も、皆さんの学びを全力でサポートします。
一緒に頑張りましょう!
日本数学塾・数強塾 講師
藤原進之介
日本数学塾・数強塾でさらに伸ばそう
ここまでお読みいただいた方は、「情報I」のプログラミング問題について、かなりの理解が深まったのではないでしょうか。
しかし、本当に得点力を上げるためには、個別の弱点を把握し、効率的に克服していくことが必要です。一人ひとり、つまずくポイントは異なります。
数強塾・日本数学塾の特徴
数強塾と日本数学塾は、数学を中心に、論理的思考力を育成する専門塾です。
① 個別指導で弱点を徹底克服
プログラミング問題でつまずきやすいポイントは人それぞれ。「ループの理解が苦手」「配列の添字でよく間違える」「アルゴリズムの意図が読み取れない」など、個別の課題に合わせた指導を行います。
② 数学×プログラミングの相乗効果
数学とプログラミングには深い関係があります。数学の学習を通じてプログラミング的思考を養い、プログラミングの学習を通じて数学への理解を深める——この相乗効果を最大限に引き出します。
③ オンライン対応で全国どこからでも
オンライン授業に対応しているため、全国どこからでも受講可能です。部活や他の習い事との両立も可能な、柔軟なスケジュールで学習を進められます。
藤原進之介の著書紹介(累計約15万部)
私、藤原進之介は、これまでに9冊の著書を出版し、累計発行部数は約15万部に達しています。数学の学習法から受験対策まで、幅広いテーマで執筆しています。
| 書籍タイトル | 概要 |
|---|---|
| 『数学の基礎が面白いほどわかる本』 | 数学が苦手な人でも基礎から理解できる入門書。論理的思考の土台を築きます。 |
| 『高校数学 計算力トレーニング』 | 計算ミスを減らし、スピードを上げるための実践的なトレーニング集。 |
| 『数学I・A 共通テスト対策』 | 共通テストの傾向を分析し、効率的な対策法を解説。 |
| 『数学II・B 共通テスト対策』 | 数学II・Bの共通テスト対策に特化した一冊。 |
| 『場合の数・確率 完全攻略』 | 苦手な人が多い「場合の数・確率」を徹底的に解説。プログラミングにも通じる内容。 |
| 『数列・漸化式マスター』 | 数列と漸化式を完全理解。プログラミングのループ処理の理解にも役立ちます。 |
| 『ベクトル完全理解』 | ベクトルの基礎から応用まで、視覚的にわかりやすく解説。 |
| 『論理的思考力を鍛える数学』 | 数学を通じて論理的思考力を養う方法を解説。プログラミング学習にも直結します。 |
| 『受験数学 最短合格ルート』 | 効率的な受験勉強の進め方を具体的に解説。 |
これらの著書で培ったノウハウを、日々の指導に活かしています。
無料体験授業のご案内
「本当に自分に合っているか分からない」「どんな授業なのか試してみたい」という方のために、無料体験授業をご用意しています。
無料体験授業の内容
- 現在の学力レベルの診断
- 苦手分野の特定と学習アドバイス
- 実際の授業スタイルの体験
- 今後の学習計画のご提案
所要時間:約60分
費用:完全無料(入会の義務はありません)
まずはお気軽にお問い合わせください。
まとめ:情報Iプログラミング問題 攻略のポイント
最後に、本記事の内容をまとめます。
DNCLの基本文法
- 変数と代入:「=」は代入を意味する
- 演算子:特に整数除算(÷)と剰余(%)に注意
- 条件分岐:「もし〜ならば」で場合分け
- 繰り返し:for文とwhile文の使い分け
- 配列:添字の開始位置(0から or 1から)に注意
- 関数:処理のまとまり、再帰関数も理解する
重要なアルゴリズム
- 線形探索:配列を先頭から順に調べる
- 二分探索:ソート済み配列で効率的に探す
- バブルソート:隣接要素を比較・交換して並べ替え
- 最大値・最小値探索:変数を更新しながら調べる
- 合計・平均計算:ループで集計する
解法のテクニック
- トレース表を必ず書く
- 問題文のヒントを活用する
- 具体的な値を代入して考える
- 数学的に検算する
よくある失敗パターン
- 添字のズレ(Off-by-One Error)
- ループ範囲の間違い
- 条件式の論理ミス
- 変数の上書き忘れ・不要な上書き
- 無限ループ
- 整数除算と通常の除算の混同
- 時間配分のミス
「情報I」のプログラミング問題は、正しい方法で学習すれば、必ず得点源にできます。
本記事が皆さんの学習の一助となれば幸いです。
ご質問やご相談があれば、数強塾・日本数学塾までお気軽にお問い合わせください。
皆さんの合格を心より応援しています!
```
