計算機言語 I 第 5 回 繰り返し処理 , レポートに対するコメント
この資料: http://www.math.u-ryukyu.ac.jp/~suga/gengo/2019-1/05.pdf
1 レポートへのコメント
前回のレポートですが,問題にあるように15桁程度出力させると,解に微妙な誤差が現れます. これは,近い数の引き算で情報落ちが起こっているからです.
−b±√
b2−4ac 2a
の計算において,分子が0に近く分母の絶対値が小さいときには,情報落ちのせいで解の誤差が現れます(情報 落ちの誤差が,絶対値の小さい割り算で拡大する). この様なことを避ける工夫は, 2次方程式の根と係数の関 係を用います.
ax2+bx+c=a(x−α)(x−β) =⇒a(α+β) =−b, aαβ=c
絶対値の大きい根は,根の公式を利用し,小さい方は大きい根と根と係数の関係を利用して計算します.
b >0 =⇒α=−b−√
b2−4ac
2a , β= c
2aα b <0 =⇒α=−b+√
b2−4ac
2a , β= c
2aα
2次方程式の根をできる限り正確に出力するには,上の様に bの値で条件分岐するプログラムを書きます.
2 繰り返し (loop)
計算機概論Iのawkのプログラミングで,for文による繰り返し処理を学びました. Cでもfor文は利用 できますが,それは,教科書に従って最後にし,while文およびdo–while文からはじめます.
書き方自体は難しくないので, White board で説明します.
教科書の補足
教科書では, 繰り返し処理の例として, 1 + 2 +· · ·+ 10を計算させています. これは,あくまでも繰り返し 処理を説明するための例であり,
∑n k=1
k= n(n+ 1)
2 を利用した方が繰り返しで計算させるより, 計算効率が良 いので,通常はこちらを使います.
1
p.58,インクリメント,デクリメント
i++,++iの意味は, 変数iの立場から見ると, 整数型変数iの値を1増やすという意味になりますが,プロ グラムでの動作は微妙に異なります. その違いを見るのが, p. 59プログラム4.2です. 1の増加がどのタイミ ングで実行されているかを注意深く考えて下さい. ただし,最近では,この様な誤解を与えるコードは書くこと は少ないです. (2つの動作をひとまとまりに書くから, 動作の順が問題になるわけです. 別に書けば順は書い た順に起こることがわかるので,問題にならない).
p. 61代入演算子
ここにある代入演算子は,awkと同じです. 当然,awkがCの真似をしています.
p. 62変数の初期化
Awkでは, 変数は全て初期値として0が与えられていると解説しましたが, C の仕様では, 変数の初期値は
「不定」です. 従って,変数を宣言した際は,なにがしかの代入をしない限り,その値は「ゴミ」が入っています.
無限ループ
繰り返しの終了条件が成立しない形の繰り返しを無限ループと言います. この様な場合でも, 前回述べた breakを利用すれば繰り返しは終了します.
この無限ループは, 普段皆さんが利用しているアプリケーションで起こっているものです. 普段よく使うア プリケーションでは,次の様な処理がされています.
main() {
アプリケーションの初期設定; for ( ;; ) {
キーボード, マウス(タッチパネル) の入力を読む if (終了が選ばれた)
break;
else
キーボード, マウス(タッチパネル)入力に対する動作; }
アプリケーションの終了処理; }
p. 65, continue
ループでは,条件が成立している限り,ブロック内の動作を最初から最後まで順に実行します. これを途中で 中止してループの条件判定まで戻すのが,continueというキーワード(予約語)です. 従って,continueとい う単語も変数名,関数名に使うことはできません.
2
無条件分岐,演算子の優先順位
無条件分岐(goto文)については,今ではほとんど使われないので,ここでは解説しません.
演算子の優先順位ですが, Cが開発された当初はこれを使ったtrickyなプログラムが多く見られました. 開 発当初は,コンパイラの最適化処理も弱く,「ハードウェアの動作を想定しながらより早いコードを書く」と言 うのがCの利用のされ方のひとつであったためです. 現在は,コンパイラの性能も上がっていますので,「演 算子の優先順位を利用した早いプログラム」は起こりません. 複数の動作をひとまとめで書くときには,括弧 (, )を利用して,操作の順番をわかりやすく書くのが通常です.
ただし,たくさん使われすぎて「イデオム化」している記述もありますので, それらは現れたときに解説し ます.
レポート問題
• (必修)教科書p. 69,練習問題4.3 (1) で, 6
100000∑
k=1
1
k2 を計算させていますが,これを,k= 1から順に k= 100000まで計算した結果と,k= 100000からk= 1まで計算した結果を比較せよ. (やはり 15桁 程度の計算結果を表示させて下さい.
件名: gengo2019-1 report 5-1,締切: 5月20日(月), 10:00 (AM) JST.
• (必修ではないが提出すると加点, 微積の応用問題) log 2 = 0.693147...を15桁程度正しく計算するプ ログラムを書け. (/usr/include/math.hにlog 2の値は書かれているので結果のチェックに使う.) 件名: gengo2019-1 report 5-2,締切: この講義の成績をつける日まで.
3