← 基本情報 道場

出題範囲 › 第 15 章

第 15 章 擬似言語プログラミング

科目B のプログラム問題を、トレースで読み解く。この章では次の 16 個の知識点を、解説・インタラクティブ教材・練習問題で学びます。

第 15 章 伪代码程序设计:用追踪读懂科目B 的程序题

科目B の概要と読み方

科目B は 100 分で 20 問。そのうち 16 問がアルゴリズムとプログラミング(擬似言語で書かれたプログラムを読む問題)、4 問が情報セキュリティ。アルゴリズムの問題は大きく「空欄に入る式や文を選ぶ(空欄補充)」と「実行結果を求める(トレース)」の 2 タイプ。どちらも、まず「何を入れると何が出てくるプログラムか」をつかむのが第一歩。

科目B 概要与读题方法:科目B 100 分钟 20 题,其中 16 题是算法与编程(阅读用伪代码写的程序),4 题是信息安全。算法题大致分两类:选择填入空栏的式子或语句(填空),以及求执行结果(追踪)。两类题的第一步都是先弄清「输入什么、输出什么」。

宣言・型・注釈

○ で始まる行が手続・関数の宣言。○整数型: f(整数型: n) なら「整数を 1 つ受け取り、整数を返す関数 f」、戻り値の型がない ○p(…) は値を返さない手続。変数は 整数型: i のように型: 名前で宣言し、← 0 で初期値も付けられる。配列は 整数型の配列: a ← {1, 2, 3}、{} は要素数 0 の配列。どの関数からも使える変数は 大域: を付けて宣言する(大域変数)。/* … */ と // … は注釈で、処理には影響しないがヒントが書かれていることが多い。

声明、类型与注释:以 ○ 开头的行是过程/函数声明。○整数型: f(整数型: n) 表示「接收一个整数、返回整数的函数 f」,没有返回类型的 ○p(…) 是不返回值的过程。变量用「类型: 名字」声明,可用 ← 0 赋初值。数组写作 整数型の配列: a ← {1, 2, 3},{} 是元素个数为 0 的数组。加上 大域: 的是所有函数都能用的全局变量。/* … */ 和 // … 是注释,不影响执行,但常写有提示。

順次処理と演算子

プログラムは上から 1 行ずつ実行される(順次)。x ← 式 は右辺をその時点の値で計算して x に入れる代入。演算子は + − × ÷ のほか、剰余の mod、商の整数部分を取る ÷ … の商、論理演算の and・or・not、比較の = ≠ < ≦ > ≧。優先順位は not → × ÷ mod → + − → 比較 → and → or。

顺序处理与运算符:程序从上往下逐行执行(顺序)。x ← 式 用「当时」的值计算右边再放进 x(赋值)。运算符除 + − × ÷ 外,还有取余 mod、取商整数部分的「÷ … の商」、逻辑运算 and/or/not、比较 = ≠ < ≦ > ≧。优先级:not → × ÷ mod → + − → 比较 → and → or。

選択処理(if 文)

if (条件1) … elseif (条件2) … else … endif は、上から順に条件を調べ、最初に true になった枝の処理だけを実行して endif の次へ進む。後ろの elseif に来た時点で「前の条件はすべて false だった」ことが分かっているので、条件を短く書ける。return は値を返してその場で関数を終える。

选择处理(if 语句):if (条件1) … elseif (条件2) … else … endif 从上往下判断,只执行第一个为 true 的分支,然后跳到 endif 之后。走到后面的 elseif 时,前面的条件都已经是 false,所以条件可以写得更短。return 返回值并立即结束函数。

繰返し処理(while・do・for)

while (条件) … endwhile は先に条件を調べ、true の間くり返す(最初から false なら 1 回も実行しない)。do … while (条件) は先に 1 回実行してから条件を調べる。for (i を 1 から n まで 1 ずつ増やす) は i を 1, 2, …, n と変えながらくり返す(減らす なら逆向き)。途中で抜けるのが「繰返し処理を終了する」、その回の残りを飛ばして次へ進むのが「繰返し処理をスキップする」。

循环处理(while、do、for):while (条件) … endwhile 先判断条件,为 true 时重复(一开始就是 false 则一次也不执行)。do … while (条件) 先执行一次再判断。for (i を 1 から n まで 1 ずつ増やす) 让 i 依次取 1, 2, …, n(「減らす」则倒着走)。中途退出循环是「繰返し処理を終了する」,跳过本轮剩余部分进入下一轮是「繰返し処理をスキップする」。

配列の操作

a[i] は配列 a の i 番目の要素。aの要素数 で長さ、aの末尾 に x を追加する で後ろに 1 つ増やせる。二次元配列は m[行, 列]、mの行数・mの列数 で大きさを得る。2 つの要素を入れ替えるには、片方を一時変数に退避してから上書きする(tmp ← a[i]、a[i] ← a[j]、a[j] ← tmp)。要素番号が 1 始まりか 0 始まりかで、最後の要素の番号(要素数 か 要素数 − 1 か)が変わる。

数组操作:a[i] 是数组 a 的第 i 个元素;aの要素数 取长度,aの末尾 に x を追加する 在末尾追加一个。二维数组用 m[行, 列],用 mの行数、mの列数 取大小。交换两个元素要先把一个存到临时变量再覆盖。下标从 1 开始还是 0 开始,决定了最后一个元素的编号是「元素数」还是「元素数 − 1」。

トレース(変数の値を追う)

トレースは、プログラムを 1 行ずつ実行したつもりで、変数の値の変化を表に書き出す技術。行に「実行した処理」、列に「変数」をとり、値が変わったときだけ書く。繰返しは「何回目か」と「条件の判定結果」も書く。科目B のすべての問題の土台で、空欄補充でも選択肢を当てはめたあとの確認に使う。

追踪(跟踪变量的值):追踪就是假装自己是计算机逐行执行,把变量值的变化写成表:行是执行的处理,列是变量,只在值变化时记录。循环还要记「第几轮」和「条件判断结果」。这是所有科目B 题的基础,填空题代入选项后也要靠它确认。

関数の呼出しと再帰

関数・手続を呼び出すと、呼び出された側を最後まで実行してから、呼び出した行の続きに戻る。戻り値はその呼出し式の値になる。関数の中で自分自身を呼び出すのが再帰。再帰には必ず呼び出さずに値を返す枝(終了条件)があり、引数が終了条件に近づくように呼び出す。値を求めるときは、終了条件から逆に積み上げると速い。

函数调用与递归:调用函数或过程时,先把被调用的一方执行到底,再回到调用行继续。返回值成为调用表达式的值。函数里调用自己就是递归。递归一定有不再调用、直接返回值的分支(终止条件),每次调用的参数要向终止条件靠近。求值时从终止条件倒着往上推最快。

オブジェクト指向の擬似言語(クラス・インスタンス)

問題に出てくるクラスは、必ず説明の表(コンストラクタ・メンバ変数・メソッド)とセットで示される。Menu: m ← Menu("カレー", 800) でインスタンスを作って変数 m に入れ、m.price でメンバ変数、m.subtotal(2) でメソッドを使う。クラス型の変数に入っているのはインスタンスそのものではなく参照(どのインスタンスかを指す情報)なので、c ← a とすると c と a は同じインスタンスを指す。

面向对象的伪代码(类与实例):题目中的类总会配一张说明表(构造函数、成员变量、方法)。Menu: m ← Menu("カレー", 800) 生成实例并放进变量 m,用 m.price 访问成员变量,m.subtotal(2) 调用方法。类类型变量存放的不是实例本身而是引用(指向哪个实例的信息),所以 c ← a 之后 c 和 a 指向同一个实例。

リストのプログラム(追加・削除)

単方向リストの各要素は、値 val と次の要素への参照 next をもつインスタンス(クラス ListElement)。先頭は大域変数 listHead が指し、最後の要素の next は未定義。末尾への追加は「next が未定義の要素までたどって、その next に新しい要素をつなぐ」。削除は「1 つ前の要素の next を、消す要素の次(next.next)につなぎ替える」。先頭を消すときだけは listHead 自体を書き換える。

链表程序(追加与删除):单向链表的每个元素是带有值 val 和指向下一个元素引用 next 的实例(类 ListElement)。全局变量 listHead 指向开头,最后一个元素的 next 为未定义。在末尾追加:顺着走到 next 为未定义的元素,把新元素接到它的 next;删除:把前一个元素的 next 改接到被删元素的下一个(next.next)。只有删除开头时才改写 listHead 本身。

ビット演算のプログラム

∧(ビットごとの論理積)は取り出す、∨(論理和)は立てる・合成する、<<・>>(論理シフト)は位置をずらす操作。たとえば x ∧ 00000001 は最下位ビットだけを取り出し、(r << 1) ∨ b は r を 1 桁左へずらして空いた最下位に b を入れる。整数のまま mod 2ⁿ で下位 n ビット、÷ 2ⁿ の商 で右シフトと同じことができる(UTF-8 の符号化など)。

位运算程序:∧(按位与)用于取出,∨(按位或)用于置位、合成,<<、>>(逻辑移位)用于移动位置。例如 x ∧ 00000001 只取最低位,(r << 1) ∨ b 把 r 左移一位、在空出的最低位放入 b。用整数运算时,mod 2ⁿ 取低 n 位,÷ 2ⁿ の商 相当于右移 n 位(如 UTF-8 编码)。

探索・整列・最大公約数のプログラム

科目B では、2分探索法・クイックソート・ビンソート・最大公約数などの定番アルゴリズムが、擬似言語で書かれて出題される。アルゴリズム自体を知っていると読むのが速いが、問われるのは「この書き方でどう動くか」。境界(low と high が隣り合ったとき、要素数が 1 や 2 のとき)でわざと動かしてみると、不具合や空欄の答えが見つかる。

查找、排序与最大公约数程序:科目B 常把二分查找、快速排序、桶排序、最大公约数等经典算法写成伪代码来考。熟悉算法本身能读得更快,但考的是「这种写法会怎么运行」。在边界情况(low 与 high 相邻、元素个数为 1 或 2 等)故意跑一跑,就能发现缺陷或空栏答案。

データ構造のプログラム

スタック(後入れ先出し)・キュー(先入れ先出し)・優先度付きキューは、クラスのメソッド(push / pop、enqueue / dequeue)か、配列と「次に入れる位置」を表す変数で表される。2 分木は「子の番号の配列」や TreeNode クラスで表し、再帰で中間順などにたどったり、キューで幅優先探索をしたりする。ハッシュ表はハッシュ関数で格納位置を決め、衝突したら別の位置を探す(オープンアドレス法)。ヒープは親子の大小関係を保つように要素を入れ替える。

数据结构程序:栈(后进先出)、队列(先进先出)、优先级队列,用类的方法(push/pop、enqueue/dequeue),或用数组加「下一个存放位置」变量来表示。二叉树用「子节点编号数组」或 TreeNode 类表示,用递归做中序等遍历,或用队列做广度优先搜索。散列表用散列函数决定存放位置,冲突时另找位置(开放寻址法)。堆通过交换元素维持父子大小关系。

数値計算・文字列・統計のプログラム

問題文に計算式(ユークリッド距離、構成比、移動平均、チェックデジットなど)が示され、それをプログラムにしたときの空欄を問う形が多い。式の各部分(分子・分母・Σ の中身)が、プログラムのどの変数・どの繰返しに対応するかを線で結ぶように読むのがコツ。答えの確認には、問題文の具体例(「例えば…は 1.0 である」)をそのまま計算する。

数值计算、字符串与统计程序:这类题多会给出计算公式(欧几里得距离、构成比、移动平均、校验位等),问把它写成程序时的空栏。诀窍是把公式各部分(分子、分母、Σ 内部)与程序中的变量、循环一一连线对应。验证答案时,直接用题目中的具体例子(「例如…为 1.0」)算一遍。

ゲーム木の評価(ミニマックス法)

三目並べのように 2 人が交互に手を選ぶゲームでは、考えられる手をすべて展開したゲーム木で最善手を決める。葉(勝負がついた局面)に評価値(勝ち 10・引き分け 0・負け −10 など)を付け、自分の手番の節は子の最大値、相手の手番の節は子の最小値を、下から順に節の評価値とする(ミニマックス法)。相手は常に自分にとって最も不利な手を選ぶ、と考えるのがポイント。

博弈树的评价(极小化极大法):像井字棋这种双方轮流走的游戏,把所有可能的走法展开成博弈树来决定最佳走法。给叶子(胜负已分的局面)标上评价值(胜 10、平 0、负 −10 等),我方回合的节点取子节点最大值,对方回合的节点取最小值,从下往上依次求出(极小化极大法)。关键是假设对方总会选对我方最不利的走法。

グラフと動的計画法のプログラム

グラフ(頂点と辺)は、辺の両端を並べた辺の配列か、i 行 j 列に辺の有無や重みを入れた隣接行列(二次元配列)で表す。無向グラフの隣接行列は対称([u, v] と [v, u] の両方に入れる)。最短距離は、すべての頂点の組について「k を経由した方が近ければ更新」を k = 1〜n でくり返すワーシャル–フロイド法や、近い頂点から確定していくダイクストラ法で求める。編集距離のように、小さな部分問題の答えを表に記録して積み上げる考え方が動的計画法。

图与动态规划程序:图(顶点与边)用「把边两端排列起来的边数组」或「i 行 j 列存边有无或权重的邻接矩阵(二维数组)」表示。无向图的邻接矩阵是对称的([u, v] 和 [v, u] 都要写)。最短距离可用 Floyd–Warshall 算法(对所有顶点对,k = 1〜n 依次判断「经由 k 是否更近,更近就更新」)或从近到远逐个确定的 Dijkstra 算法求得。像编辑距离那样把子问题答案记在表里逐步累积的方法叫动态规划。

基本情報 道場で学習を始める →

← 第 14 章 マネジメント 第 16 章 模擬試験 →