計算機言語 I 第 5 回 繰り返し処理 , レポートに対するコメント
この資料
: http://www.math.u-ryukyu.ac.jp/~suga/gengo/2021/05.pdf
1 レポートへのコメント
FizzBuzz
は有名な問題だそうです.
最もわかりやすい条件分岐は,
次でしょう.
「条件分岐をできるだけわかりやすくする」は
,
プログラムを書く前に実行すべき事です. if (i%15==0){
printf("FizzBuzz\n");
}
else if (i%3==0){
printf("Fizz\n");
}
else if (i%5==0){
printf("Buzz\n");
} else {
printf("%d\n", i);
}
3000000000
を入力したときに,
何が起こるか?
問題です.通常
,
キーボードから987654321
という文字が入力されたとき,
これを整数値に変換するには,
次のような 動作を行って数を作るのが自然です(Horner (
ホーナー)
の方法).
各桁の文字コードを上の操作で対応する数 に変換した後,
次の計算をします.
9
→9
×10+8
→(9
×10+8)
×10+7
→(((9
×10+8)
×10+7)
×10+6
→...
2
31< 3000000000 < 2
32なので, 3000000000
をそのまま整数変換すると,
最上位のbit
は1
となり, 2
の 補数表示の決め方から負の数となります.
3000000000 + 1294967296 = 4294967296 = 2
32≡ 0 (mod 2
32)
なので,
入力されてた数は, − 1294967296
と同じになります.
1
2 繰り返し (loop, 教科書 , 第 4 章 )
計算機概論
I
のawk
のプログラミングで, for
文による繰り返し処理を学びました. C
でもfor
文は利用 できますが,
それは,
教科書に従って最後にし, while
文およびdo–while
文からはじめます.
書き方自体は難しくないので
,
教科書に従って説明します.
教科書の補足
教科書では
,
繰り返し処理の例として, 1 + 2 + · · · + 10
を計算させています.
これは,
あくまでも繰り返し 処理を説明するための例であり,
∑
nk=1
k = n(n + 1)
2
を利用した方が繰り返しで計算させるより,
計算効率が良 いので,
通常はこちらを使います.
p.58,
インクリメント,
デクリメントi++, ++i
の意味は,
変数i
の立場から見ると,
整数型変数i
の値を1
増やすという意味になりますが,
プロ グラムでの動作は微妙に異なります.
その違いを見るのが, p. 59
プログラム4.2
です. 1
の増加がどのタイミ ングで実行されているかを注意深く考えて下さい.
ただし,
最近では,
この様な誤解を与えるコードは書くこと は少ないです. (2
つの動作をひとまとまりに書くから,
動作の順が問題になるわけです.
別に書けば順は書い た順に起こることがわかるので,
問題にならない).
p. 61
代入演算子ここにある代入演算子は
, awk
と同じです.
当然, awk
がC
の真似をしています.
p. 62
変数の初期化Awk
では,
変数は全て初期値として0
が与えられていると解説しましたが, C
の仕様では,
変数の初期値は「不定」です
.
従って,
変数を宣言した際は,
なにがしかの代入をしない限り,
その値は「ゴミ」が入っています.
無限ループ
繰り返しの終了条件が成立しない形の繰り返しを無限ループと言います
.
この様な場合でも,
前回述べたbreak
を利用すれば繰り返しは終了します.
この無限ループは
,
普段皆さんが利用しているアプリケーションで起こっているものです.
普段よく使うア プリケーションでは,
次の様な処理がされています.
2
main() {
アプリケーションの初期設定
; for ( ;; ) {
キーボード
,
マウス(
タッチパネル)
の入力を読むif (
終了が選ばれた)
break;
else
キーボード
,
マウス(
タッチパネル)
入力に対する動作; }
アプリケーションの終了処理
; }
p. 65, continue
ループでは
,
条件が成立している限り,
ブロック内の動作を最初から最後まで順に実行します.
これを途中で 中止してループの条件判定まで戻すのが, continue
というキーワード(
予約語)
です.
従って, continue
とい う単語も変数名,
関数名に使うことはできません.
無条件分岐
,
演算子の優先順位無条件分岐
(goto
文)
については,
今ではほとんど使われないので,
ここでは解説しません.
演算子の優先順位ですが
, C
が開発された当初はこれを使ったtricky
なプログラムが多く見られました.
開 発当初は,
コンパイラの最適化処理も弱く,
「ハードウェアの動作を想定しながらより早いコードを書く」と言 うのがC
の利用のされ方のひとつであったためです.
現在は,
コンパイラの性能も上がっていますので,
「演 算子の優先順位を利用した早いプログラム」は起こりません.
複数の動作をひとまとめで書くときには,
括弧(, )
を利用して,
操作の順番をわかりやすく書くのが通常です.
ただし
,
たくさん使われすぎて「イデオム化」している記述もありますので,
それらは現れたときに解説し ます.
レポート問題
• (
必修)
教科書p. 69,
練習問題4.3 (1)
で, 6 ×
100000
∑
k=1
1
k
2 を計算させていますが,
これを, k = 1
から順 にk = 100000
まで計算した結果と, k = 100000
からk = 1
まで計算した結果を比較せよ. (15
桁程度 の計算結果を表示させて下さい.
ちなみに,
∑
∞ k=11 k
2= π
26 .
件名