プログラミング演習I 2003年6月11日(第9回) 木村巌.

Slides:



Advertisements
Similar presentations
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
Advertisements

情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング論 I 関数の再帰呼び出し
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
情報処理Ⅱ 2005年12月9日(金).
第8回 プログラミングⅡ 第8回
問題 1 フィボナッチ数列 xn は次で定義される。
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月6日、H.16(‘04)] 今日のメニュー 1 前回の課題の復習
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第10章 これはかなり大変な事項!! ~ポインタ~
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
知能情報工学演習I 第12回(後半第6回) 課題の回答
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
高度プログラミング演習 (08).
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
プログラミング演習I 2004年5月19日(第5回) 理学部数学科・木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング演習I 2003年4月30日(第3回) 木村巌.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
高度プログラミング演習 (11).
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
第10回 関数と再帰.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
情報処理Ⅱ 第8回:2003年12月9日(火).
プログラミング演習I 補講用課題
プログラミング 3 ポインタ(1).
プログラミング 2 静的変数.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

プログラミング演習I 2003年6月11日(第9回) 木村巌

今日やること 関数の続き 関数の再帰呼び出し 配列を引数とする関数 変数のスコープ、エクステント 大復習大会!質問コーナー!!

知識編:関数 引数として幾つかの値を取り、一定の処理をして、値を返す……関数 例: int main (int ac, char *av[]){} int型のac, char型のポインタの配列avを取り、int型の値を返す. 定義の仕方は前回の資料を見よ(教科書8章)

配列を引数とする関数 左の例だと、main()内のaの値は、foo()の呼出し後も変わらない 教科書8.2節 void foo(int a) { int a = 2; return; } int main (void) { int a = 1; foo(a); printf (“%d\n”, a); return 0;

配列を引数とする関数 void foo(int a[]) { a[0]= 2; return; } int main (void) { foo(a); printf (“%d\n”, a[0]); return 0; 左の例では、実際にa[0]が書き換えられる 配列を引数とすると、配列の0番目の成分の(メモリ上の)場所(ポインタ)が渡される foo()では、その場所に2を書き込んでいる

関数の再帰呼び出し 関数の中で、自分自身を呼び出すことが可能. これを「再帰呼び出し」、もしくは単に「再帰」という(recursive call, recursion) 例: 階乗の計算.n! = n * (n – 1)!そのもの long factorial (long n) { if (n == 1) return 1; else return n * factorial (n – 1); }

関数の再帰呼び出し 再帰呼び出しの別: 前者は、一種のgoto文とみなせる 最後に、その関数を呼び出しているだけ(真正な末尾再帰、proper tail recursion) 最後に、その関数呼び出しを含むある式を評価している 前者は、一種のgoto文とみなせる プログラミング言語によっては、真正な末尾再帰を実際にgoto文として取り扱うものもある 例:プログラミング言語Scheme

末尾再帰の例 unsigned long tmp = 1; unsigned long factorial_pr (unsigned long n, unsigned long t) { if (n == 1) return tmp; else { tmp *= n; return factorial_pr (n – 1, tmp); }

再帰の他の例 Fibonacci数列:f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n – 2). long fib (long n) { if (n == 0) return 0; if (n == 1) return 1; return fib (n – 1) + fib (n – 2); }

再帰の他の例 再帰的なデータ構造の操作(リスト、ツリーなど) ある種のソート 後でやりましょう

変数のスコープ 変数にはスコープ(可視範囲、通用範囲)がある. ファイルスコープ 関数スコープ ブロックスコープ

ファイルスコープ すべての関数の外で宣言された変数は、そのファイル全体にわたって可視.ファイルスコープという. 複数の関数から可視.しかしファイルスコープの変数を使ってデータのやり取りをすべきではない(プログラムの見通しが悪くなる)

ファイルスコープ変数の例 #include <stdio.h> int a = 1; void foo (void) { return; } void bar (void) { a = 3; int main (void) { printf (“%d\n”, a); foo (); printf(“%d\n”, a); bar (); return 0; }

関数スコープ 関数スコープ:関数内で宣言された変数は、その関数の内部からのみ可視 他の関数に同じ変数名があっても、独立している

関数スコープの変数:例 int foo (void) { int a = 1; return a; } int bar (void) { int main (void) { printf (“%d, %d\n”, foo(), bar()); return 0; } /* 1, 2 と表示される */

ブロックスコープ 複合文(ブロック)の先頭で宣言された変数. その複合文の内部からのみ可視 同じ関数内でも、異なる複合文からは不可視

変数のエクステント 変数には、可視範囲(プログラムの字面上、どこから見えるか)のほかに、生存期間(エクステント)がある. プログラムの実行中、いつからいつまでその変数が有効か? Cでは、変数の記憶クラス(storage class)として指定する

auto変数 auto変数(自動変数)は、関数スコープ、ブロックスコープの変数のデフォルトの記憶クラス. その変数の可視範囲にプログラムの制御がわたった時点で有効になり、プログラムの制御がその変数の可視範囲から外れた時点で無効になる.

外部変数 ファイルスコープ変数のエクステントは、プログラムの実行期間と等しい. プログラムが実行される直前(main()に制御がわたる直前)に有効になり、main()からreturnした時点で無効になる

static変数 auto変数は、関数、もしくは複合文から制御が離れた時点で、無効化される 再び同じ関数、もしくは複合文に制御がわたると、前に保持された値が再び見える

まとめ 関数の再帰呼び出し 配列を引数とする関数 変数のスコープ、エクステント

教科書で既にやった範囲 テキストの内容でまだやってないのは、 それ以外(1~6章、8, 10章)は既に学んだ事項です.よく復習しておくこと! 文字列に関する箇所 コンソール入出力(7章) ポインタ 標準ライブラリ関数の大半 ファイル入出力の大半 それ以外(1~6章、8, 10章)は既に学んだ事項です.よく復習しておくこと!

レポート課題 今回はレポートなし 中間試験に備えてください. 試験がなくても備えてください.備えよ常に. おまけ;レポートがなくて退屈なあなたに スーパーコンピュータコンテスト2003予選問題 高校生向けのコンテストです.