DNCL
中西渉
watayan@meigaku.ac.jp
名古屋高等学校

2022.07.31
2022 年度高等学校情報科教員研修（このスライドのデータは https://watayan.net/doc/ にあります）

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

2 / 49

はじめに

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

3 / 49

はじめに

1. はじめに
DNCL とは…
大学入試センター試験・大学入学共通テスト「情報関係基礎」プログラミング問題で用いられる擬似言語
日本語ベースDaigaku Nyuushi Center (shiken) Language（と言われている）

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

4 / 49はじめに

歴史

これまでの経緯（と予想）1997 「情報関係基礎」
BASIC，COBOL，Pascal で出題
1998 日本語ベースの擬似言語「読めばわかる」
2002 仕様公開
2003 DNCL と命名
2011 仕様を事前公開
2021 共通テストにあわせて仕様調整
2025 「情報 I」共通テストで新 DNCL（？）

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

5 / 49

はじめに

文法

コードの例
旧 DNCLn ← 100n > 1 の間，
｜ もし n % 2 = 0 ならば｜ ｜ n ← n ÷ 2｜ を実行し，そうでなければ｜ ｜ n ← 3 * n + 1｜ を実行する｜ n を表示するを繰り返す

中西渉 (名古屋高等学校)

新 DNCL（一部想像）n = 100n > 1 の間：
｜ もし n % 2 == 0 ならば：
｜ └ n = n / 2｜ そうでなければ：｜ └ n = 3 * n + 1└ 表示する (n)DNCL2022 年度高等学校情報科教員研修

6 / 49

はじめに

実行環境

PEN(Programming Environment for Novice)
大阪市立大学・大阪学院大学で開発
変数宣言などを追加（xDNCL）
入力支援ボタン中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

7 / 49

はじめに

実行環境

PenFlowchart
PEN にフローチャートを付加
フローチャート ↔ プログラム実行部分は PEN そのまま

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

8 / 49

はじめに

実行環境

Java アプリケーション→ Web アプリケーション
WaPEN
どんくり
wPEN
Tetra, XTetra…
新 DNCL への対応も
PyPEN
つちのこ
…

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

9 / 49

はじめに

実行環境

PyPEN

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

10 / 49

はじめに

実行環境

PyPEN のインストール
1. Git を使う
git clone https://github.com/watayan/PyPEN
answer.js-dist を answer.js にコピー
sample.js-dist を sample.js にコピー
2. Git を使わない
https://watayan.net/prog/pypen.html から PyPEN.zip をダウンロード
適当なフォルダに展開
本研修のためにセットアップした PyPEN は
https://watayan.net/misc/ipsj2022/にあります中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

11 / 49

はじめに

実行環境

PyPEN での新 DNCL の文法（構文）
入力

出力

代入

《変数》に《型》を入力する 表示する (《値》)《変数》 = 《値》

選択

繰り返し

もし《条件》ならば：《処理》
そうでなければ：《処理》《条件》の間：《処理》

回数を決めた繰り返し《変数》を《値》から《値》まで《値》ずつ増やしながら：《処理》
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

12 / 49

はじめに

実行環境

PyPEN での新 DNCL の文法（演算子）
+
*
/
//
%
**
==
!=
>
<
>=
<=

値の演算
加算
& ビット ANDand 論理 AND
減算| ビット ORor 論理 OR
乗算
^ ビット XOR
not 論理 NOT余りを出さない除算 ~ ビット反転
余りを出す除算<< ビット左シフト
除算の余り>> ビット右シフト
べき乗
値の比較
その他
等しい
《配列》の中に《値》
配列の中に値があるか等しくない《整数》個の《値》
値を整数個並べた配列
大なり《配列》に《値》を追加する
小なり《配列》に《配列》を連結する
大なりイコール
小なりイコール
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

13 / 49

プログラムの例

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

14 / 49

プログラムの例

2. プログラムの例
ガチャのプログラムを作ってみる
景品は 10 個（等確率）全部揃うまでクジを引き続ける
回数とどの景品を取ったかを，毎回表示する
方針：

random(9) で 0〜9 の整数の乱数が得られる
配列に 10 個の 0 を入れておく
取った景品番号に対応する値を 1 にする
配列が全部 1 になったら終わり

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

15 / 49

プログラムの例

ガチャのプログラム （サンプル 1）
n = 0
a = 10 個の 0
a != 10 個の 1 の間：
n = n + 1
b = random(9)もし a[b] == 0 ならば：表示する (b, "ゲット！")
a[b] = 1
表示する (n, a)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

16 / 49

プログラムの例（参考）クーポンコレクター問題
n 個の景品が揃うまでの回数の期待値は次の式で表される：


1 1 1
1
n
+ + + ··· +1 2 3nn = 10 のときは約 29.3 回

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

17 / 49

プログラムの例

どんな改造が考えられるか
景品数を増やしてみる
レアアイテムを考える
何度も繰り返して平均回数を求める…

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

18 / 49

プログラムの例

景品数を増やしてみる （サンプル 2）
n = 0
a = 100 個の 0
a != 100 個の 1 の間：
n = n + 1
b = random(99)もし a[b] == 0 ならば：表示する (b, "ゲット！")
a[b] = 1
表示する (n, a)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

19 / 49

プログラムの例

景品数を増やしてみる（改良版） （サンプル 3）
N = 100
n = 0
a = N 個の 0
a != N 個の 1 の間：
n = n + 1
b = random(N - 1)
もし a[b] == 0 ならば：表示する (b, "ゲット！")
a[b] = 1
表示する (n, a)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

20 / 49

プログラムの例

レアアイテムを考える （サンプル 4）
n = 0
a = 10 個の 0
a != 10 個の 1 の間：
n = n + 1
b = random(9)もし b == 0 ならば：
b = random(9)もし a[b] == 0 ならば：表示する (b, "ゲット！")
a[b] = 1
表示する (n, a)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

21 / 49

プログラムの例

何度も繰り返して平均回数を求める （サンプル 5）関数 gacha(N)：n = 0
a = N 個の 0
a != N 個の 1 の間：
n = n + 1
b = random(N - 1)
a[b] = 1
n を返す

s = 0
n を 1 から 100 まで 1 ずつ増やしながら：s = s + gacha(10)表示する (s / 100)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

22 / 49

センター試験問題より

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

23 / 49

センター試験問題より

3. センター試験問題よりよくある誤解「出題のコードはそのまま実行できる」
データの初期化部分は出題のコードにはない→補わないと動くコードにならない中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

24 / 49

センター試験問題より

例：2018 年度問題（迷路）中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

25 / 49

センター試験問題より問題文

中西渉 (名古屋高等学校)

コード

DNCL

2022 年度高等学校情報科教員研修

26 / 49

センター試験問題より

新 DNCL 版のコード （サンプル 8）

冒頭に必要なコード

nutta = 1
nutta != 0 の間：
nutta = 0
y を 1 から tate-2 まで 1 ずつ増やしながら：x を 2 から yoko-2 まで 1 ずつ増やしながら：
s = Masu[x-1,y]+Masu[x+1,y]（次の行に続く）+Masu[x,y-1]+Masu[x,y+1]
もし Masu[x,y] == 0 and s == 3 ならば：
Masu[x,y] = 1
nutta = 1
y を 0 から tate-1 まで 1 ずつ増やしながら：
x を 0 から yoko-1 まで 1 ずつ増やしながら：もし Masu[x,y] == 1 ならば：改行なしで表示する ("■")
そうでなければ：
改行なしで表示する ("□")
改行する

tate = 9
yoko = 11
Masu = [[1,1,1,1,1,1,1,1,1],[1,0,0,0,1,0,0,0,1],[1,1,1,0,0,0,1,0,1],[9,0,0,0,1,0,1,0,1],[1,1,1,0,1,0,1,0,1],[1,0,1,1,1,0,1,1,1],[1,0,0,0,1,0,1,0,1],[1,1,1,0,0,0,1,0,9],[1,0,0,0,1,1,1,0,1],[1,0,1,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1]]

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

27 / 49

センター試験問題より（参考）改良版のコード （サンプル 9）
y を 1 から tate-2 まで 1 ずつ増やしながら：
x を 1 から yoko-2 まで 1 ずつ増やしながら：
i = x
j = y
Masu[i,j]== 0 and （次の行に続く）
Masu[i+1,j]+Masu[i-1,j]+Masu[i,j+1]+Masu[i,j-1]==3 の間：
Masu[i,j] = 1
di = Masu[i-1,j]-Masu[i+1,j]
dj = Masu[i,j-1]-Masu[i,j+1]
i = i + dij = j + dj
…表示部分は同じ…

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

28 / 49

センター試験問題より（参考）改良版のコード…の更に書き換えた版 （サンプル 10）
y を 1 から tate-2 まで 1 ずつ増やしながら：
x を 1 から yoko-2 まで 1 ずつ増やしながら：
i = x
j = y
s = Masu[i+1,j]+Masu[i-1,j]+Masu[i,j+1]+Masu[i,j-1]
Masu[i,j]== 0 and s == 3 の間：
Masu[i,j] = 1
di = Masu[i-1,j]-Masu[i+1,j]
dj = Masu[i,j-1]-Masu[i,j+1]
i = i + dij = j + dj
s = Masu[i+1,j]+Masu[i-1,j]+Masu[i,j+1]+Masu[i,j-1]…表示部分は同じ…
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

29 / 49

試作・サンプル問題より

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

30 / 49

試作・サンプル問題より

4. 試作・サンプル問題より
大学入学共通テストに「情報」が追加される→問題イメージの公開試作問題（検討用イメージ）
サンプル問題中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

31 / 49

試作・サンプル問題より試作問題より

試作問題のプログラミング問題

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

32 / 49

試作・サンプル問題より試作問題より文字の出現頻度を調べるプログラム…の前に中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

33 / 49

試作・サンプル問題より試作問題より関数の実装 （サンプル 11）関数 yousosuu(a)：length(a) を返す
関数 sabun(a)：s = "abcdefghijklmnopqrstuvwxyz"
i を 0 から 25 まで 1 ずつ増やしながら：もし s[i]==a ならば：
i を返す
-1 を返す関数 moji(a)：s = "abcdefghijklmnopqrstuvwxyz"
もし a>=0 and a<=25 ならば：
s[a] を返す
そうでなければ："アルファベットでない"を返す
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

34 / 49

試作・サンプル問題より試作問題より

いよいよプログラム本体…と思ったらどれだけ省略されているかというと…
pyeb cmybo kxn cofox iokbc kqy yeb pkdrobc lbyeqrd pybdr yx drsc myxdsxoxd, k xog xkdsyx, myxmosfon sx vslobdi, kxn nonsmkdon dy dro
zbyzycsdsyx drkd kvv wox kbo mbokdon oaekv. xyg go kbo oxqkqon sx k qbokd msfsv gkb, docdsxq grodrob drkd xkdsyx, yb kxi xkdsyx cy
myxmosfon kxn cy nonsmkdon, mkx vyxq oxnebo. go kbo wod yx k qbokd lkddvo-psovn yp drkd gkb. go rkfo mywo dy nonsmkdo k zybdsyx yp
drkd psovn, kc k psxkv bocdsxq zvkmo pyb dryco gry robo qkfo drosb vsfoc drkd drkd xkdsyx wsqrd vsfo. sd sc kvdyqodrob psddsxq kxn
zbyzob drkd go cryevn ny drsc. led, sx k vkbqob coxco, go mkx xyd nonsmkdo -- go mkx xyd myxcombkdo -- go mkx xyd rkvvyg -- drsc qbyexn.
dro lbkfo wox, vsfsxq kxn nokn, gry cdbeqqvon robo, rkfo myxcombkdon sd, pkb klyfo yeb zyyb zygob dy knn yb nodbkmd. dro gybvn gsvv
vsddvo xydo, xyb vyxq bowowlob grkd go cki robo, led sd mkx xofob pybqod grkd droi nsn robo. sd sc pyb ec dro vsfsxq, bkdrob, dy lo
nonsmkdon robo dy dro expsxscron gybu grsmr droi gry pyeqrd robo rkfo drec pkb cy xylvi knfkxmon. sd sc bkdrob pyb ec dy lo robo nonsmkdon
dy dro qbokd dkcu bowksxsxq lopybo ec -- drkd pbyw droco ryxybon nokn go dkuo sxmbokcon nofydsyx dy drkd mkeco pyb grsmr droi qkfo dro
vkcd pevv wokcebo yp nofydsyx -- drkd go robo rsqrvi bocyvfo drkd droco nokn crkvv xyd rkfo nson sx fksx -- drkd drsc xkdsyx, exnob qyn,
crkvv rkfo k xog lsbdr yp pboonyw -- kxn drkd qyfobxwoxd yp dro zoyzvo, li dro zoyzvo, pyb dro zoyzvo, crkvv xyd zobscr pbyw dro okbdr.
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

35 / 49

試作・サンプル問題より試作問題より

本当にその通りのプログラムにすると… （サンプル 12）…関数定義…
Angoubun=["p","y","e","b"," ","c","m","y","b","o"," ","k","x","n"," ","c","o","f","o","x"," ","i","o","k","b","c"," ","k","q","y"," ","y","e","b"," ","p","k","d","r","o","b","c"," ","l","b","y","e","q","r","d"," ","p","y","b","d","r"," ","y","x"," ","d","r","s","c"," ","m","y","x","d","s","x","o","x","d"," ","k"," ","x","o","g"," ","x","k","d","s","y","x"," ",…100 行以上省略…
"z","o","b","s","c","r"," ","p","b","y","w"," ","d","r","o"," ","o","k","b","d","r","."]
Hindo = 26 個の 0
i を 0 から yousosuu(Angoubun)-1 まで 1 ずつ増やしながら：
bangou = sabun(Angoubun[i])もし bangou != -1 ならば：Hindo[bangou] = Hindo[bangou] + 1
表示する (Hindo)
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

36 / 49

試作・サンプル問題より試作問題よりFile I/O もどきを使ってみる （サンプル 13）…関数定義…
Angoubun=[]f = openr("crypt.txt")
c = getchar(f)c != ""の間：
Angoubun に c を追加する
c = getchar(f)close(f)Hindo = 26 個の 0
i を 0 から yousosuu(Angoubun)-1 まで 1 ずつ増やしながら：
bangou = sabun(Angoubun[i])もし bangou != -1 ならば：Hindo[bangou] = Hindo[bangou] + 1
表示する (Hindo)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

37 / 49

試作・サンプル問題より試作問題より復号のプログラム （サンプル 14）…関数定義…
…ファイル読み込み…
Hirabun = yousosuu(Angoubun) 個の""hukugousuu = 26 - 10
i を 0 から yousosuu(Angoubun)-1 まで 1 ずつ増やしながら：
bangou = sabun(Angoubun[i])もし bangou != -1 ならば：Hirabun[i] = moji((bangou + hukugousuu) % 26)
そうでなければ：
Hirabun[i] = Angoubun[i]表示する (Hirabun)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

38 / 49

試作・サンプル問題より

サンプル問題よりサンプル問題のプログラミング問題
比例代表選挙の当選者数

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

39 / 49

試作・サンプル問題より

中西渉 (名古屋高等学校)

サンプル問題より

DNCL

2022 年度高等学校情報科教員研修

40 / 49

試作・サンプル問題より

サンプル問題より前ページのプログラム （サンプル 15）
Tomei = ["A 党","B 党","C 党","D 党"]
Tokuhyo = [1200,660,1440,180]
sousuu = 0
giseki = 6
m を 0 から 3 まで 1 ずつ増やしながら：sousuu = sousuu + Tokuhyo[m]kizyunsuu = sousuu / giseki
表示する ("基準得票数：", kizyunsuu)
表示する ("比例配分")m を 0 から 3 まで 1 ずつ増やしながら：表示する (Tomei[m], ":", Tokuhyo[m] / kizyunsuu)

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

41 / 49

試作・サンプル問題より

中西渉 (名古屋高等学校)

サンプル問題より

DNCL

2022 年度高等学校情報科教員研修

42 / 49

試作・サンプル問題より

サンプル問題より前ページのプログラム （サンプル 16）
Tomei = ["A 党","B 党","C 党","D 党"]
Tokuhyo = [1200,660,1440,180]
Tosen = [0,0,0,0]
Hikaku = [0,0,0,0]
tosenkei = 0
giseki = 6
m を 0 から 3 まで 1 ずつ増やしながら：Hikaku[m] = Tokuhyo[m]tosenkei < giseki の間：
max = 0i を 0 から 3 まで 1 ずつ増やしながら：もし max < Hikaku[i] ならば：
max = Hikaku[i]maxi = iTosen[maxi] = Tosen[maxi] + 1
tosenkei = tosenkei + 1
Hikaku[maxi] = Tokuhyo[maxi] // (Tosen[maxi] + 1)
k を 0 から 3 まで 1 ずつ増やしながら：表示する (Tomei[k],":","Tosen[k],"名")中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

43 / 49

新 DNCL の文法について思うこと

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

44 / 49

新 DNCL の文法について思うこと

5. 新 DNCL の文法について思うこと
新 DNCL は文法が固まっていない
ループは「繰り返す」が必要？

!=はあるが==はまだ見てない
割り算の区別論理式の解釈順
旧 DNCL では「左から」なので「A かつ B でない」は「(A かつ B) でない」
a<b<c を許すか

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

45 / 49

新 DNCL の文法について思うこと（個人的に）できてほしいこと
配列を添え字を使わずになめる
Python でいう「for 《変数》 in 《リスト》」
PyPEN では「《配列》の要素《変数》について」で実装
配列にある値が含まれるかの判定
Python でいう「《値》in《リスト》」
PyPEN では「《配列》の中に《値》」で実装

PyPEN で「あえて」実装していないこと
sum などの「よく使う」関数
sort などの「よく使う」手続き

中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

46 / 49

おわりに

1

はじめに
歴史
文法
実行環境

2

プログラムの例

3

センター試験問題より

4

試作・サンプル問題より試作問題よりサンプル問題より

5

新 DNCL の文法について思うこと6

おわりに
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

47 / 49

おわりに

6. おわりに
新 DNCL でありそうな話

共通テストでは新 DNCL が使われるだろう
新 DNCL には実行環境が存在する→ 新 DNCL で「情報 I」の授業をすればいいのでは？
※筆者は賛成しない中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

48 / 49

おわりに筆者の思う DNCL
DNCL「だけ」の授業ではいけない「情報 I」の学習活動に活かせるプログラミング→実用的な言語を使えるようにしたい
導入・演習だけなら有効か
PyPENっていろんなことできますよね

その通りでもPythonに踏み出せば
もっといろんなことができる

ある日の授業後…
中西渉 (名古屋高等学校)

DNCL

2022 年度高等学校情報科教員研修

49 / 49