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

要約

このレッスンは、制御フローにあてられた、コースの第四単元の始まりである。まず単元の目的を説明する。すなわち、プログラムの文が実行される順序を分岐とループによって制御すること、そしてその正しさについて推論すること、つまりどの場合も処理され、どのループもなすべきことをし、しかも停止することを確かめる方法を教えることである。さらに、単元の四つのレッスンとそれらを貫く筋道を示し、単元が前提とすること、とりわけ第三単元の複合条件を思い出させる。そして単元が解決する問題、つまり決まった段数で最大公約数を計算し、データによっては誤った答えを返すか、0 による除算で止まってしまうプログラムの問題を提示する。不変条件を、単元がそのループを正当化するための道具として前もって紹介し、最後に、この先の単元と「C++ プログラミング II」コースへどうつながるかを示す。

学習目標

  1. 単元の内容の流れを説明し、各レッスンがそのすぐ後に続くレッスンに何をもたらすかを説明する。
  2. 第三単元の複合条件(論理結合子、短絡評価、ド・モルガンの法則による否定)を思い出し、必要なら復習する。
  3. 推論の道具としての不変条件を、例を通して前もって知る。不変条件とは、反復が保ち、終わったときに結果を与える、変数どうしの関係である。
  4. 単元を終えたときにできるようになっているべきことを見きわめ、それをこの先の単元で学ぶことと区別する。

導入テスト

単元に取りかかる前に、出発点を測っておくとよい。このテストは自己チェックのためのもので、採点はしない。目的はただ学習の方向づけにある。最初の四問は、単元が前提とすることを確かめる。複合条件の否定、短絡評価、レッスン 1.1 の反復のトレース、そして int の限界である。続く七問は、レッスンの順に、単元の中心となる考え方を扱い、そのいくつかは学校の数学から出発する。最大公約数、総和記号、手続きの停止性である。まだ正解できなくてもかまわないし、そのうちのいくつかでは「まだわからない」が誠実な答えである。正解であれ不正解であれ、どの答えもその要点を説明し、それを扱うレッスンを示すからである。同じ技能は、単元の最後のまとめのレッスンで再び測る。

導入テスト

単元を始める前に、自分の出発点を測りましょう。短い自己評価です。採点はされず、結果はあなたのブラウザーにだけ保存されます。

  1. 問 1前の単元から条件 1 <= n && n <= 10 の否定はどれか。

  2. 問 2前の単元からint d{0}; と int n{5}; のもとで、d != 0 && n / d > 2 を計算すると何が起こるか。

  3. 問 3前の単元からレッスン 1.1 の引き算の繰り返しによる割り算は q=0q = 0、r=ar = a から始め、「r≥br \geq b である間、bb を rr から引き、qq に 1 を足す」を繰り返す。a=20a = 20、b=5b = 5 のとき、反復の本体は何回実行されるか。

  4. 問 4前の単元から32 ビットの int で、46341 * 46341 の値について規格は何を保証するか。

  5. 問 5あるプログラムは次の分岐の連鎖を含む。「合格」と出力する if (score >= 50)、「優」と出力する else if (score >= 90)、そして「不合格」と出力する else である。score が 95 のとき、何を出力するか。

  6. 問 6次の式のうち、和 1+2+⋯+n1 + 2 + \cdots + n を表すのはどれか。

  7. 問 7int total{0}; のもとで、for (int i{0}; i < 5; ++i) { total += i; } の後、std::println("{}", total); は何を出力するか。

  8. 問 8引き算の繰り返しによる割り算(q=0q = 0、r=ar = a とし、r≥br \geq b である間、rr を r−br - b に、qq を q+1q + 1 にする)で、条件が計算されるたびに成り立つ変数どうしの関係はどれか。

  9. 問 9ある手続きは任意の整数 nn(正、0、負のいずれでもよい)から出発し、「n>0n > 0 である間、nn から 2 を引く」を繰り返す。すべての nn について停止するか。

  10. 問 1084 と 36 の最大公約数はいくつか。

  11. 問 11約数を試して 101 が素数かどうかを判定するには、どの約数まで試せば十分か。