• 検索結果がありません。

計算機言語 I 第 5 回 繰り返し処理 , レポートに対するコメント

N/A
N/A
Protected

Academic year: 2021

シェア "計算機言語 I 第 5 回 繰り返し処理 , レポートに対するコメント"

Copied!
3
0
0

読み込み中.... (全文を見る)

全文

(1)

計算機言語 I 5 回 繰り返し処理 , レポートに対するコメント

この資料: http://www.math.u-ryukyu.ac.jp/~suga/gengo/2019-1/05.pdf

1 レポートへのコメント

前回のレポートですが,問題にあるように15桁程度出力させると,解に微妙な誤差が現れます. これは,近い数の引き算で情報落ちが起こっているからです.

−b±√

b24ac 2a

の計算において,分子が0に近く分母の絶対値が小さいときには,情報落ちのせいで解の誤差が現れます(情報 落ちの誤差が,絶対値の小さい割り算で拡大する). この様なことを避ける工夫は, 2次方程式の根と係数の関 係を用います.

ax2+bx+c=a(x−α)(x−β) =⇒a(α+β) =−b, aαβ=c

絶対値の大きい根は,根の公式を利用し,小さい方は大きい根と根と係数の関係を利用して計算します.









b >0 =⇒α=−b−√

b24ac

2a , β= c

2aα b <0 =⇒α=−b+

b24ac

2a , β= c

2aα

2次方程式の根をできる限り正確に出力するには,上の様に bの値で条件分岐するプログラムを書きます.

2 繰り返し (loop)

計算機概論Iawkのプログラミングで,for文による繰り返し処理を学びました. Cでもfor文は利用 できますが,それは,教科書に従って最後にし,while文およびdo–while文からはじめます.

書き方自体は難しくないので, White board で説明します.

教科書の補足

教科書では, 繰り返し処理の例として, 1 + 2 +· · ·+ 10を計算させています. これは,あくまでも繰り返し 処理を説明するための例であり,

n k=1

k= n(n+ 1)

2 を利用した方が繰り返しで計算させるより, 計算効率が良 いので,通常はこちらを使います.

1

(2)

p.58,インクリメント,デクリメント

i++,++iの意味は, 変数iの立場から見ると, 整数型変数iの値を1増やすという意味になりますが,プロ グラムでの動作は微妙に異なります. その違いを見るのが, p. 59プログラム4.2です. 1の増加がどのタイミ ングで実行されているかを注意深く考えて下さい. ただし,最近では,この様な誤解を与えるコードは書くこと は少ないです. (2つの動作をひとまとまりに書くから, 動作の順が問題になるわけです. 別に書けば順は書い た順に起こることがわかるので,問題にならない).

p. 61代入演算子

ここにある代入演算子は,awkと同じです. 当然,awkCの真似をしています.

p. 62変数の初期化

Awkでは, 変数は全て初期値として0が与えられていると解説しましたが, C の仕様では, 変数の初期値は

「不定」です. 従って,変数を宣言した際は,なにがしかの代入をしない限り,その値は「ゴミ」が入っています.

無限ループ

繰り返しの終了条件が成立しない形の繰り返しを無限ループと言います. この様な場合でも, 前回述べた breakを利用すれば繰り返しは終了します.

この無限ループは, 普段皆さんが利用しているアプリケーションで起こっているものです. 普段よく使うア プリケーションでは,次の様な処理がされています.

main() {

アプリケーションの初期設定; for ( ;; ) {

キーボード, マウス(タッチパネル) の入力を読む if (終了が選ばれた)

break;

else

キーボード, マウス(タッチパネル)入力に対する動作; }

アプリケーションの終了処理; }

p. 65, continue

ループでは,条件が成立している限り,ブロック内の動作を最初から最後まで順に実行します. これを途中で 中止してループの条件判定まで戻すのが,continueというキーワード(予約語)です. 従って,continueとい う単語も変数名,関数名に使うことはできません.

2

(3)

無条件分岐,演算子の優先順位

無条件分岐(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,締切: 520(), 10:00 (AM) JST.

(必修ではないが提出すると加点, 微積の応用問題) log 2 = 0.693147...15桁程度正しく計算するプ ログラムを書け. (/usr/include/math.hlog 2の値は書かれているので結果のチェックに使う.) 件名: gengo2019-1 report 5-2,締切: この講義の成績をつける日まで.

3

参照

関連したドキュメント

Python で学ぶプログラミング 27 “文字列”* 回数 と書くことで、同じ文字列を指定回数だけ繰り返した文字列となる。 【★課題】

bash-4.4$ mkdir gengo bash-4.4$ cd gengo bash-4.4$ mkdir chap01 bash-4.4$ cd chap01 コマンドcdはchange directoryの略で, Gnome 端末のshellのワーキングディレクトリを変更するコ... この意味は, 計算機概論 I でやりましたので,

り,パルス関数の挙動をしていることが分かる.これ は,IP でのガード条件判定において,時刻 3 の “直後” では PULSE のガード条件

括弧 () も利用でき , これも 数学の計算ルールに一致します.. これまでに ,

fread() では , 読み込んだ値を第一引数のポインタ値が指すメモリに順に格納 ( コピー )

( 必修ではないが提出すると加点 ) 上の問題の

26 にあるように , int 型と float 型の計算では , int 型が float 型に変換されて計 算されます.. これは , 24bit 以上の整数型を float

文字列の扱う際には , この NULL 文字を目印に文字