コンテンツへスキップ
Topos Uranos

要約

プログラムは入力を出力に変換する。このレッスンでは、その変換の両端と、両端のあいだで失敗しうることを学ぶ。std::print と std::println による出力を、幅・配置・小数の桁数を定めるプレースホルダと書式指定とともに学び、std::cin による数の読み取りを学ぶ。さらに、ユーザーが求められたものと違うものを入力したときに何が起きるかを予測する。C++ のような入力の仕組みでは、それは警告にはならず、エラー状態のストリームと、ゼロの入った変数を生む。最後に、プログラムのエラーを、現れる時点によって四つの種類に分類する。コンパイルエラー、リンクエラー、実行時エラー、論理エラーである。締めくくりに、コンパイラのメッセージを順序立てて読む方法を扱う。

学習目標

  1. std::cin でデータを読み取り、std::println で結果を書き出すプログラムを、幅と小数の桁数の書式指定を使って書ける。
  2. std::print と std::println を何度も呼び出すプログラムの正確な出力を、改行も含めて予測できる。
  3. 入力が期待した形をしていないとき(数の代わりに文字が来たとき)に何が起きるかを説明し、読み取りの状態を確かめられる。
  4. エラーをコンパイルエラー、リンクエラー、実行時エラー、論理エラーのいずれかに分類し、その現れ方から場所を突き止められる。

プログラムとその境界

レッスン 問題からアルゴリズムへ では、それぞれの問題を、何が入り何が出るかによって規定した。プログラムはその仕様を実現する。データを受け取り、それを変換し、結果を渡す。しかし、データはプログラムの内部で生まれるのではなく、外部、つまり使う人のキーボード、ファイル、別のプログラムからやって来る。結果も内部にとどまらず、画面、ファイル、別のプログラムへと出ていく。この外部とのやりとりは、オペレーティングシステムがどのプログラムにも起動時に開く二つの通路を通して行われる。標準入力は、ターミナルではキーボードで打ち込むものであり、標準出力は、ターミナルが表示するものである。C++ はこれらをストリームとして表す。順番に、一つずつ消費されたり生み出されたりする文字の並びである。

二つの端は対称ではない。出力を決めるのはプログラムであり、だから正確に書くことができる。画面に現れる文字の一つ一つは、プログラムが書けと命じた文字である。これに対して入力を決めるのは他人である。プログラムは数を求めるが、キーボードの前にいる人は、単語を打つかもしれないし、小数点にコンマを使った数、大きすぎる数を打つかもしれないし、何も打たないかもしれない。そうであれば、入力は信頼できない境界であり、データを読み取るプログラムはすべて、受け取ったものが期待した形をしていないときにどうするかを前もって考えておかなければならない。このレッスンでは、まず出力を、次に読み取りを、次に読み取りが失敗したときに何が起きるかを学び、最後に、ユーザーの誤りではなくプログラムのエラーを、それが現れる時点によって見分ける方法を学ぶ。