プログラムの変数と処理を追う
要点と定義
プログラムは、データを受け取り、変数や配列に保持し、演算と制御構造を組み合わせて処理する手順です。処理を読むときは、各変数が何を表すか、いつ更新されるか、条件がどの時点で判定されるかを追います。変数の値は、代入の前後で異なることがあります。たとえば x ← x + 1 では、右辺の更新前の値に1を加えてから、左辺の変数へ代入します。
データ型、演算、変数
整数型は個数や位置などの整数値、文字型は一つの文字、文字列型は文字の並びを扱います。配列は複数の値を順番にまとめ、要素番号を指定して参照・更新します。要素番号の開始位置は言語や問題の約束に従います。例題では、ファイルのバイト位置は0から数える一方、配列の要素番号は1から数える場合があります。両方を混同しないようにします。
算術演算には加算や乗算、比較演算には等しいか・大きいかの判定、論理演算には条件の否定・論理積・論理和があります。ビット演算は整数の各ビットに対する演算です。たとえば x AND 0x0F は下位4ビットを取り出す用途があります。これは、二つの条件を結び付ける論理積とは対象も意味も異なります。
バイトを16進数の2桁で表すとき、上位桁は x >> 4、下位桁は x AND 0x0F で得られます。たとえば 0x69 の下位桁は 9 です。ビット演算のAND記号と、条件をまとめる論理ANDを取り違えると、値の計算と条件判定のどちらも誤ります。
手続、関数、呼出し順
手続は一連の処理を名前でまとめて呼び出せる仕組みです。関数は処理に加え、呼出し元へ戻り値を返します。引数は呼出し時に渡す値です。局所変数はその手続・関数の中で使われる変数です。処理を分割すると、同じ処理を再利用しやすくなり、全体の読みやすさや保守性にも役立ちます。
呼出しは、呼び出された処理が終わってから呼出し元の次の処理へ戻るのが基本です。たとえば、手続Aが「Cを呼ぶ、Bを出力する」の順に実行し、手続Cが「Cを出力する」なら、Aの出力順はC、Bです。さらに別の手続がAの後に「Aを出力する、Cを呼ぶ」と実行するなら、全体はC、B、A、Cとなります。呼出し関係を追うときは、呼出し先の処理をその場で展開し、戻った後の処理へ進みます。
適用条件と例
ループ、配列、カウンタ
繰返し処理では、ループの各回で添字やカウンタがどの値を持つかを確認します。カウンタが「読み込んだ総バイト数」を表すなら、0から読み始めた場合、位置99の1バイトを読み込んだ直後のカウンタは100です。カウンタは最後に読み込んだ位置そのものではなく、読み込んだ個数を表しているためです。
ファイル読込みの例では、読込み関数がファイル末尾でEOFを返します。位置99の1バイトを処理した後、もう一度読み込んでEOFになった場合、表示した個数は 100 − 99 = 1 バイトです。ファイルが空なら最初の読込みでEOFとなり、表示個数は 0 − 0 = 0 バイトです。終了理由を示す表示は、EOFに到達したか、指定位置まで処理して止めたかで変わります。個数を求める式と終了理由の判定は別々に確認します。
繰返しの上限や終了条件にも注意します。たとえば cnt <= to で指定位置まで処理するなら、to の位置も含む条件です。一方、読込みでEOFになった時点では、最後の読込みはデータではなくEOFなので、カウンタが実データの個数を表しているかを確認します。問題で与えられた入力条件が通常の前提を満たさないケースでは、前提を補って推測せず、実際に示された初期値とループ条件から動作を追います。
二進数の文字列を整数にする
二進数を左から順に読むときは、これまでの値を2倍して、新しいビットを加えます。ビット b が0または1なら、更新は 値 ← 値 × 2 + b です。たとえば 10010 は、初期値0から 1, 2, 4, 9, 18 と更新され、整数18になります。左から読むたびに、既存の各桁の重みが2倍になるため、この更新で位取りが保たれます。
単にビットを加算すると、桁の重みが失われます。また、右から左へ同じ更新をすると、元のビット列とは逆向きの値になります。この方法は入力が0と1だけで構成された文字列であるという条件に基づきます。
配列で集計する
配列を使った集計では、各配列が何を数えるかを先に定義します。注文データの例なら、ある商品が含まれる注文の数、別の商品も同時に含まれる注文の数、全注文数はそれぞれ異なる値です。各注文を一度ずつ調べ、二つの商品が同じ注文にあれば共起回数を増やします。全注文数は注文配列の要素数であり、商品一覧の要素数ではありません。
この節の続き
- 漸化式を少量の記憶領域で計算する
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む