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

計算機言語 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/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)

2 繰り返し (loop, 教科書 , 4 )

計算機概論

I

awk

のプログラミングで

, for

文による繰り返し処理を学びました

. C

でも

for

文は利用 できますが

,

それは

,

教科書に従って最後にし

, while

文および

do–while

文からはじめます

.

書き方自体は難しくないので

,

教科書に従って説明します

.

教科書の補足

教科書では

,

繰り返し処理の例として

, 1 + 2 + · · · + 10

を計算させています

.

これは

,

あくまでも繰り返し 処理を説明するための例であり

,

n

k=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

(3)

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=1

1 k

2

= π

2

6 .

件名

: gengo2021 report 5-1,

締切

: 5

24

(

), 10:00 (AM) JST.

• (

必修ではないが提出すると加点

,

微積の応用問題

) log 2 = 0.693147...

15

桁程度正しく計算するプ ログラムを書け

. (/usr/include/math.h

log 2

の値は書かれているので結果のチェックに使う

.)

件名

: gengo2021 report 5-2,

締切

:

この講義の成績をつける日まで

.

3

参照

関連したドキュメント

教科書 p.93, 6.7 節 , 再帰 recursion の補足 再帰とは, 関数の処理の途中で自分自身を関数呼び出しすることです.. ただし, 教科書のHanoiの塔の様に再帰でしか書けないような処理もありますし, 繰り返し処理に変換する

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

1.到達目標 ■繰り返し文を利用して,複数データの入出力ができる。

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 でやりましたので,

ただし, 現在, PC の世界で標準的に利用されている文字コー ドUTF-8では,文字列の長さ文字数に注意をすれば, Asciiとほぼ同じようにプログラムできます.. Cでは, 文字列はchar 型の配列で,文字列の終端を示す文字終端文字, NULL文字,エスケープシーケン

教科書に対するコメント プログラム11.2 教科書, プログラム11.2 はわかりづらいソースの典型例で, このようなプログラムを書いてはいけません し,現在では, 実際上書くこともありませんプログラム 11.4のようなものを利用する... なにが分かりづら いかというと,プログラムのfor文の中のif文 if str2[i]=str1[i] == ’\0’

time_t 型を人間が使いやすい時刻の構造体に変換するライブラリ関数がいくつかあり , List 13–3 では localtime という関数が利用されています.

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