画面下の「▶」で再生開始、「⏸」で一時停止
画面右下の「>」で次頁へ、「<」で前頁へ
青字下線の部分は、まとめプリントの穴埋め
「作業」のところでは、ファイルをダウンロードしてコンパイル・実行
教科書 pp.227–253
再帰的 (recursive) — 関数の定義の中で自分自身を呼び出すこと。一般に \(x\) の定義に \(x\) 自 身を使用すること。
factorial(4) → 4 * factorial(3) → 4 * 3 * factorial(2) → 4 * 3 * 2 * factorial(1) → 4 * 3 * 2 * 1 * factorial(0) → 4 * 3 * 2 * 1 * 1
作業: List 8-7 を実行する
factorial
の場合 n
)は別々に確保されるfor
, while
)で簡単に実現できることを、
再帰で書くのは(C 言語の場合)良いこととはいえない
まとめのプリント・章末
#include <stdio.h>
void move(int n, int a, int b) {
printf("ディスク%dを棒%dから棒%dへ\n", n, a, b);
}
void hanoi(int n, int a, int b, int c) { // n枚のディスクをaからbに移動する手順
if (n > 0) {
hanoi(n - 1, a, c, b);
move(n, a, b);
hanoi(n - 1, c, b, a);
}
}
int main(void) {
int n;
printf("円盤は何枚ですか? "); scanf("%d", &n);
hanoi(n, 1, 2, 3);
return 0;
}
作業: hanoi.cを実行する
まとめのプリント・章末
#include <stdio.h>
#include <math.h>
void drawTree(int d, double x, double y, double r, double t) {
/* d --- 再帰の深さ、 (x, y) --- 枝の根元の座標、
r --- 枝の長さ、 t --- 枝の伸びる向き(ラジアン)*/
double r1;
if (d == 0) return; /* 打切り */
printf("%6.3f %6.3f %6.3f %6.3f\n", x, y, x + r * cos(t), y + r * sin(t));
drawTree(d - 1, x + r * cos(t), y + r * sin(t), 0.5 * r, t);
r1 = 0.5 * r;
drawTree(d - 1, x + r1 * cos(t), y + r1 * sin(t), 0.5 * r, t + 3.1416 / 2);
drawTree(d - 1, x + r1 * cos(t), y + r1 * sin(t), 0.5 * r, t - 3.1416 / 2);
}
int main(void) {
drawTree(6, 128, 255, 128, -3.1416 / 2);
return 0;
}
作業: tree.cを実行する
getchar
関数(教 p.244)標準入力から文字を読み込んで返す関数
EOF
(教 p.244)getchar
などが、入力の終わり(End of File
に由来)に達した場合に返す値をマクロで EOF
と書く。(stdio.h に
定義されている。)
この値は、通常の文字とは区別される。
作業: List 8-8 を実行する
教科書を読んでおく
コマンド < ファイル名 |
– | ファイルの内容をコマンドの標準入力に渡す |
コマンド > ファイル名 |
– | コマンドの標準出力をファイルに書込む |
コマンド >> ファイル名 |
– | コマンドの標準出力をファイルの最後に追加する形で書込む |
ASCII での文字コードの抜粋:
文字 | 10 進 | 16 進 |
---|---|---|
'0' | 48 | 0x30 |
'A' | 65 | 0x41 |
'a' | 97 | 0x61 |
作業: List 8-11 を実行する
\n
」の他に、「\t
」, 「\a
」,
「\b
」などいくつかの特殊文字を表す表記がある\\
」と書く