FIELD 05 / PROGRAMMING

共通テスト用表記で、処理の流れを読み解く

共通テスト用プログラム表記を土台に、変数・配列・分岐・反復・関数・探索と整列を学びます。まず処理を読み、その後で表や図を使って値の変化を確かめます。

READING GUIDE

学び方を選ぶ

重要キーワード用語や仕組みを選んで、必要な部分だけ確認します

順番に読んでいます

01

COMMON TEST NOTATION

共通テスト用プログラム表記

特定のプログラミング言語に依存せず、変数・配列・分岐・反復の考え方を共通の表記で示します。

大学入学共通テスト「情報Ⅰ」では、学校ごとに学ぶプログラミング言語が異なることを踏まえ、問題中でを使います。特定の実装言語に依存せず処理の考え方を示すであり、問題文の説明と照らしながら処理を読むための共通表記です。

項目表記と例読むときの要点
変数kosukingaku_goukei英字で始まる英数字と「_」の並び
配列変数Tokuten[3]Data[2,4]配列名の先頭は大文字。特に説明がなければ添字は0から始まる
文字列moji = "情報Ⅰ"
message = "情報" + "Ⅰ"
ダブルクォーテーションで囲み、+で連結
代入kosu = 3
nyuryoku = 【外部からの入力】
右辺の値を左辺の変数に代入する。
算術演算+ - * / ÷ % **÷は整数の商、は余り、**はべき乗
比較演算== != > < >= <===は左辺と右辺の値が等しいときに真となる。!=は等しくないときに真となる。>=は≧、<=は≦を表す。
論理演算and or not条件を組み合わせる/否定する
関数kazu = 要素数(Data)
表示する("データの要素数は", kazu, "です")
「表示する」以外は、基本的に問題文中で働きが説明される
コメントatai = 乱数() # 0以上1未満1行内の#以降は処理の対象にならない
問題文の説明を優先する

配列の添字、関数の働き、繰返しの端などは、問題文の指定に沿って読みます。特に、添字は1から始まることがあるので注意します。

縦線の記号は、処理の範囲を示す

は次の行も同じ分岐・反復の中、はそのまとまりの最後の行であることを示します。行頭の(1)(2)などは参照用の行番号です。

02

ALGORITHM · FLOWCHART

手順を、順次・分岐・反復で組み立てる

共通テスト用プログラム表記とフローチャートで、アルゴリズムの流れを読めるようにします。

は問題を解くための明確で有限な手順です。アルゴリズムを共通テスト用プログラム表記などで記述し、コンピュータが実行できる形にしたものがです。

(1)width = 【外部からの入力】
(2)height = 【外部からの入力】
(3)area = width * height
(4)表示する(area)
入力

外部から値を受け取る。

保存

値を変数へ代入。

処理

式や制御構造で計算。

出力

表示する(...)で結果を示す。

複雑なプログラムも、文を上から実行する、条件によって処理を選ぶ、同じ範囲を繰り返すを組み合わせて作ります。

開始と終了を含む順次・分岐・反復のフローチャートを、処理・入出力・判断・繰返し始端と終端の正しい記号で表した図
反復は繰返し始端と繰返し終端を対にして範囲を示し、分岐の線には条件の結果を書きます。
記号役割
端子角丸の長方形開始・終了
処理長方形計算、代入、手続き
入出力平行四辺形入力、表示、読込み、書出し
判断ひし形条件に応じて経路を選ぶ
繰返し始端と終端を対にした記号指定条件で範囲を繰り返す

アルゴリズムは、正しい結果だけでなく、終了すること、手順が曖昧でないこと、扱う入力の範囲が明確であることも重要です。

03

VALUES · VARIABLES · OPERATORS

値・変数・演算を読み、式の結果を予測する

代入と演算の規則を押さえ、共通テスト用表記の式を一行ずつ追います。

(1)x = 2
(2)y = x + 3
(3)x = y * 2

xyなどがです。=は右辺を先に計算し、その結果を左辺へします。

種類表記読み方
代入kosu = 3右辺の値を左辺へ入れる
算術演算+ - * / ÷ % **加減乗除、商、余り、べき乗
比較演算== != > < >= <=条件が成り立つかを調べる
論理演算and or not条件を組み合わせる、否定する

代入の=と、等しいか比較する==を区別します。÷は整数の商、は余りを表します。

式は、右辺を計算してから左辺を更新する

x = x + 1では、更新前のxへ1を加え、その結果を左辺のxへ入れ直します。

さらに詳しく:トレース表で代入後の値を追う
実行した文xy
x = 22
y = x + 325
x = y * 2105
04

CONDITIONAL BRANCHING

条件を上から評価し、実行する処理を一つ選ぶ

条件を上から順に調べ、縦線で処理のまとまりを追います。

(1)score = 【外部からの入力】
(2)もし score >= 80 ならば:
(3)| grade = "A"
(4)そうでなくもし score >= 60 ならば:
(5)| grade = "B"
(6)そうでなければ:
(7)⎿ grade = "C"
(8)表示する(grade)

もしの条件が真なら、その下のまとまりを実行します。そうでなくもしは別の条件を調べ、そうでなければはどの条件も真でなかった場合を受け持ちます。

条件は上から順に評価し、最初に真になったまとまりだけを実行します。85点はA、75点はB、40点はCです。範囲が重なる条件は、高いしきい値から先に判定します。

さらに詳しく:点数を入力したときの分岐を追う

(1)で点数を受け取ったら、(2)から条件を上から順に調べます。条件が真になったまとまりだけを実行し、その分岐の後ろにある(8)へ進みます。

score条件の判定実行する行表示
85(2)85 >= 80 は真(3)を実行し、(4)〜(7)を飛ばして(8)へA
70(2)は偽、(4)70 >= 60 は真(3)を飛ばし、(5)を実行して(8)へB
40(2)も(4)も偽(3)(5)を飛ばし、(7)を実行して(8)へC

85を入力すると、(2)のscore >= 80が真になります。(3)でgrade = "A"を実行した後は、同じ分岐の残りの条件(4)〜(7)を調べず、(8)へ進んでAと表示します。

70を入力すると、(2)は偽なので(3)は実行せず、(4)へ進みます。(4)のscore >= 60が真になるため(5)を実行し、(6)(7)は飛ばして(8)でBと表示します。40なら(2)と(4)がともに偽なので、(6)の「そうでなければ」に進み、(7)でCを代入します。

境界値を試す

59、60、79、80のように条件が切り替わる直前・直後を試します。

例:料金区分
(1)age = 【外部からの入力】
(2)もし age < 18 ならば:
(3)| fee = "子ども"
(4)そうでなくもし age < 65 ならば:
(5)| fee = "一般"
(6)そうでなければ:
(7)⎿ fee = "シニア"

0〜17、18〜64、65以上の範囲を重複なく分けられます。

さらに詳しく:年齢を入力したときの判定を追う

(1)で年齢を受け取り、(2)の条件から順に判定します。最初の条件が真なら(3)だけを実行し、(4)以降は調べません。最初の条件が偽のときだけ、(4)の条件を調べます。

age判定の順序実行する行fee
17(2)17 < 18 は真(3)を実行し、(4)〜(7)を飛ばす子ども
18(2)は偽、(4)18 < 65 は真(3)を飛ばし、(5)を実行する一般
65(2)も(4)も偽(3)(5)を飛ばし、(7)を実行するシニア

18は最初の条件に含まれませんが、二つ目の条件には含まれるため「一般」になります。65はage < 65も偽なので、最後の「そうでなければ」に進みます。このように、<の境界を確認すると範囲の分け方を間違えません。

複数の条件を、正確な意味で読む

A and Bは「AとBがどちらも成り立つとき」、A or Bは「AとBの少なくとも一方が成り立つとき」と読みます。

(1)x = 8
(2)y = 3
(3)もし x > 0 and y > 0 ならば:
(4)| 表示する("xもyも正")
(5)そうでなくもし x == 0 or y == 0 ならば:
(6)| 表示する("xまたはyが0")
(7)そうでなければ:
(8)⎿ 表示する("xもyも0ではない")

x = 8y = 3では、(3)のandの左右がともに真なので(4)を実行します。例えばx = 0y = 3なら(3)は偽になり、(5)のorで少なくとも一方が真なので(6)を実行します。

さらに詳しく:条件の重なりと抜けを数直線で確かめる

score > 60では60が含まれず、score >= 60では60を含みます。境界の両側へ具体的な値を代入して確かめます。

05

FIXED REPETITION

回数や範囲を決めた反復を追う

処理する回数や要素が分かっているときの表記を読みます。

(1)goukei = 0
(2)n を 1 から 5 まで 1 ずつ増やしながら繰り返す:
(3)⎿ goukei = goukei + n
(4)表示する(goukei)

回数指定反復では、指定された値を順番に取り出して同じまとまりを実行します。nは1、2、3、4、5と変わり、合計は15です。

「1から5まで」のような範囲は通常、両端を含みます。開始値・終了値・増減値を先に書き出します。

値の変化を表で確かめる

n開始前12345
goukei01361015
どの文が値を変えるかを確認してから追跡します。
さらに詳しく:二重の反復を具体例で追う

QUESTION 015あたりの例のように、外側のiを行、内側のjを列に対応させて、二重の反復で表を作ります。この例では問題文の指定により、配列Kukuの添字は1から始まるものとします。まずiを一つの値に固定し、その間にjを最初から最後まで動かします。

(1)i を 1 から 5 まで 1 ずつ増やしながら繰り返す:
(2)| j を 1 から 3 まで 1 ずつ増やしながら繰り返す:
(3)⎿ ⎿ Kuku[i, j] = i * j
(4)表示する(Kuku)
外側 i内側 j(3)の処理
11 → 2 → 3Kuku[1,1] = 1Kuku[1,2] = 2Kuku[1,3] = 3
21 → 2 → 3Kuku[2,1] = 2Kuku[2,2] = 4Kuku[2,3] = 6
3〜4それぞれ1 → 2 → 3同じ順序で各行へ積を代入
51 → 2 → 3Kuku[5,1] = 5Kuku[5,2] = 10Kuku[5,3] = 15

i = 1のときは、まずj = 1、次に2、最後に3を実行します。内側の反復が終わるとiを2に増やし、jを再び1から始めます。これをi = 5まで続けるので、(3)の処理は5×3=15回です。外側が行、内側が列に対応するため、最後に表示される表は次のようになります。

123
246
369
4812
51015
06

CONDITIONAL REPETITION

条件が真である間の反復を追う

初期値・条件・更新を一組で読みます。

(1)n = 1
(2)n < 100 の間繰り返す:
(3)⎿ n = n * 2
(4)表示する(n)

条件反復では、反復の前に条件を調べます。nが100未満なら2倍し、128になった時点で条件が偽になるため終了します。

条件反復では、を一組で探します。

判定する時点をそろえてトレースする

判定時のn1248163264128
n<100
無限ループを防ぐ

条件に関係する変数が、条件を偽へ近づけるよう更新されなければ終了しません。

さらに詳しく:0が入力されるまで合計する
(1)goukei = 0
(2)number = 【外部からの入力】
(3)number != 0 の間繰り返す:
(4)| goukei = goukei + number
(5)⎿ number = 【外部からの入力】
(6)表示する(goukei)

入力を順に5、3、0とすると、最初の入力5で条件は真になり、goukeiは0から5になります。次の入力3でも条件は真なので、goukeiは5から8になります。最後に0が入力されると(3)のnumber != 0が偽になり、(4)(5)を実行せず(6)へ進んで8と表示します。0自体は合計へ加えず、反復を終了する合図にします。

07

ARRAY · INDEX

複数の値を配列へまとめ、添字で一つを指定する

同じ意味の値を配列へまとめ、添字と反復を組み合わせて処理します。

(1)Scores = [72, 85, 91, 68]
(2)表示する(Scores[0])
(3)Scores[3] = 70

は複数の値を順番にまとめたものです。配列の先頭の要素の添字は、特に説明がなければ0です。4個の要素の添字は0、1、2、3です。

表し方読み方
一次元配列Scores[2]添字2、つまり3番目の要素
二次元配列Data[1,3]二つの添字で位置を指定
要素と添字を混同しない

Scores[2]の2は位置を表す添字で、この例では要素91です。

さらに詳しく:二次元配列は行と列の順番

「プログラミング・変数・配列」のQUESTION 020のように、二次元配列を表として読む問題では、添字を[行, 列]の順に確認します。

行\列0(名前)1(年齢)2(性別)
0田中25男性
1山田30女性
2鈴木23女性
3佐藤44男性
(1)表示する(Kaiin[0, 0], "さんは", Kaiin[0, 1], "歳の", Kaiin[0, 2], "です。")
(2)表示する(Kaiin[1, 0], "さんは", Kaiin[1, 1], "歳の", Kaiin[1, 2], "です。")
(3)表示する(Kaiin[2, 0], "さんは", Kaiin[2, 1], "歳の", Kaiin[2, 2], "です。")

最初の添字が行、次の添字が列です。Kaiin[1, 0]は2行目・名前列なので「山田」、Kaiin[0, 1]は1行目・年齢列なので25を表します。行と列を逆にすると別のデータを参照するため、問題文の表と添字の順番を対応させます。

08

FUNCTION · ARGUMENT · RETURN VALUE

関数を呼び出し、引数と戻り値を追う

処理を名前の付いたまとまりとして読み、入力と出力の関係を明確にします。

(1)面積 = 長方形の面積(4, 3)
(2)表示する(面積)

共通テストでは、関数の働きや定義方法が問題文中で示されます。呼出し時に渡す値と、返ってくる値を確認します。

関数は、引数を受け取り、戻り値を返すまとまりとして読む

定義の書き方は問題文に従います。仕組みを説明するため、ここでは次のように表します。

(1)関数「長方形の面積」(たて, よこ)を定義する:
(2)| 面積 = たて * よこ
(3)⎿ 面積を返す
呼出し元長方形の面積(4, 3)引数を渡す
関数の作業領域たて=4 よこ=3面積=12を計算
戻り値面積を返す呼出し元の面積へ代入
引数で値を受け取り、関数内で処理し、戻り値を呼出し元へ返します。

関数定義のたて・よこを、呼出し時の4・3をといいます。

必要な値は引数で受け取り、戻り値で返すと、処理のつながりが明確になります。

一つの関数に一つの役割

入力、計算、表示を分けると、どの部分が誤っているかを確かめやすくなります。

10

TEST · DEBUG · PRACTICE

正常値・境界値・異常値を試し、原因を切り分ける

プログラムは、想定した範囲で正しく動くかを確かめます。

正常値

典型的な入力で期待する結果になるか。

境界値

条件が切り替わる直前・直後。

異常値

文字列、範囲外、欠損など。

表記の規則に合わない誤り、実行中に不正な処理が起こる誤り、実行できても答えが誤るを区別します。問題文の定義と処理の流れに照らして、結果がずれた場所を探します。

練習1:偶数判定

整数nを入力し、偶数なら「偶数」、奇数なら「奇数」と表示しましょう。

解答例・解説
(1)n = 【外部からの入力】
(2)もし n % 2 == 0 ならば:
(3)| 表示する("偶数")
(4)そうでなければ:
(5)⎿ 表示する("奇数")

2で割った余りが0なら偶数です。

練習2:うるう年

400の倍数、100の倍数、4の倍数の順に条件を確認して、うるう年か平年かを表示しましょう。

解答例・解説
(1)year = 【外部からの入力】
(2)もし year % 400 == 0 ならば:
(3)| 表示する("うるう年")
(4)そうでなくもし year % 100 == 0 ならば:
(5)| 表示する("平年")
(6)そうでなくもし year % 4 == 0 ならば:
(7)| 表示する("うるう年")
(8)そうでなければ:
(9)⎿ 表示する("平年")

1900は平年、2000と2024はうるう年です。

練習3:素数判定

2以上の整数nが素数か調べましょう。

解答例・解説
(1)n = 【外部からの入力】
(2)is_prime = 1
(3)i を 2 から n-1 まで 1 ずつ増やしながら繰り返す:
(4)| もし n % i == 0 ならば:
(5)⎿ ⎿ is_prime = 0
(6)もし is_prime == 1 ならば:
(7)| 表示する("素数")
(8)そうでなければ:
(9)⎿ 表示する("素数ではない")

どの値でも割り切れなければ素数です。

デバッグでは、入力・途中の変数・条件式・出力を小さく確認します。原因を推測して一度に多く直すのではなく、を固定して検証します。

期待する答えを先に決めてから実行する

入力と期待する出力を先に書き、実際の出力と比べます。間違ったときは、途中の変数を表にして原因の場所を絞ります。

さらに詳しく:乱数を使うシミュレーション
(1)Counts = [0, 0, 0, 0, 0, 0]
(2)i を 1 から 1000 まで 1 ずつ増やしながら繰り返す:
(3)| 出目 = 整数(乱数() * 6) + 1
(4)⎿ Counts[出目-1] = Counts[出目-1] + 1

乱数で1〜6の出目を作り、出目ごとの回数を配列へ数えます。