情報処理Ⅱ 2005年12月9日(金).

Slides:



Advertisements
Similar presentations
情報処理Ⅱ 第8回 2004 年 11 月 30 日(火). 2 本日学ぶこと 関数と変数 目的  関数を自分で定義し,変数の利用方法・範囲を明示的に制 限することで,適切な機能分割(モジュール化,再利用) を図る. してはいけないこと  main 関数のみで 100 行以上のプログラム  グローバル変数を駆使するプログラム.
Advertisements

情報処理Ⅱ 第7回:2003年12月2日(火). 問題(授業がつまらない人のため に) ぷよ連結問題 前提 : フィールドを2次元 配列で定義し,各マスの 「ぷよ」を int 型の値で表現 する. ある地点を入力に取り,そ れと連結する「ぷよ」の個 数を求めよ. 消去できる「ぷよ」 (N 個以上 連結するぷよと,それに隣接する特.
情報処理Ⅱ 第11回 2004年12月21日(火).
情報処理Ⅱ 2006年12月8日(金).
情報処理Ⅱ 第10回 2004年12月14日(火).
第11回 整列 ~ シェルソート,クイックソート ~
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
情報処理Ⅱ 2007年12月17日(月).
プログラミング演習(2組) 第12回
基礎プログラミング 第13回(2007年5月28日) 「関数」の補足説明 Report-Fの解説.
第10回 ソート(1):単純なソートアルゴリズム
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
情報処理Ⅱ 2005年12月22日(木).
問題 1 フィボナッチ数列 xn は次で定義される。
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
アルゴリズムとデータ構造 2011年6月13日
データ構造とアルゴリズム 分割統治 ~ マージソート~.
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
情報処理Ⅱ 第9回 2004年12月7日(火).
第11回 整列 ~ シェルソート,クイックソート ~
情報処理Ⅱ 2007年11月5日(月).
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
情報処理Ⅱ 2007年12月3日(月) その2.
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
第5回放送授業.
情報処理Ⅱ 第14回 2006年1月23日(月).
第2回課題 配布した通り.氏名・学生番号を忘れないこと.
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
オブジェクト指向プログラミングと開発環境
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
ポインタとポインタを用いた関数定義.
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2013年7月1日
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
情報処理Ⅱ 2006年11月8日(金).
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
情報処理Ⅱ 2007年2月2日(金).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
第10回 関数と再帰.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
値渡しと参照渡しについて.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第8回:2003年12月9日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

情報処理Ⅱ 2005年12月9日(金)

第1回レポートについて 解説(PDF)を作って,授業ページからリンクしました. 以下の人は,見ておいてください. 課題は公開しません. 問2で小数点以下31桁まで解答してくれた人 問4の出題意図がよく分からなかった人 実はプログラムにバグがあるんじゃないかと思った人 期末試験でちょっとでもいい点をとりたい人

前回学んだこと 関数を自分で定義し,変数の利用方法・範囲を明示的に制限することで,適切な機能分割を図る. 関数を自分で定義することができる.関数を呼び出すとき,引数は値渡しで授受される. 「変数の定義」と「オブジェクトの生成」は別. オブジェクトの生成・破棄のタイミングに注意する.

本日学ぶこと 関数の補足 並べ替え問題 再帰(recursion)

補足1:引数の授受 Cの関数呼び出しでは必ず値渡し(call by value)になる. 値渡し: 実引数のコピーが仮引数に格納される.その後,仮引数の値を変更しても,実引数の値には影響しない. 参照渡し(call by reference)をしたければ,ポインタ値を引数とすればよい. 参照渡し: 仮引数の値を変更すれば,実引数の値もそれに変わる.Cではこの意味での参照渡しをすることができないが,ポインタ値を渡すことで,その参照先の値を変えることができる. 実引数を,配列変数の名前,または変数の前に「&」をつけたものにする. 仮引数はポインタ変数にする.

補足2:ポインタ値の値渡し 関数: 呼び出し側: message wakayama 'W' 'a' 'k' 'a' 'y' 'a' 'm' void print_message(char *message) { printf("%s\n", message); } 呼び出し側: char wakayama[] = "wakayama"; print_message(wakayama); 実引数の値(ポインタ値)は変更不可. 参照先(文字列 "Wakayama"の 中身)は変更可. 関数print_messageの中 message wakayama 'W' 'a' 'k' 'a' 'y' 'a' 'm' 'a' '\0'

補足3:複数の値を返すには ポインタ値を渡して,関数の中で参照先の値を変更する. 例 x y void swapint(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } int a = 3; b = 5; swapint(&a, &b); a=3 b=5 swapint x y tmp a=5 b=3

並べ替え問題 処理対象:intの1次元配列 並べ替えは「ソート(sort)」,「ソーティング(sorting)」,「整列」とも呼ばれる. 4 処理前: 4 2 5 1 6 8 3 7 処理後: 1 7 8 6 5 4 3 2

ソートとは データを,何らかの基準で順番に並べること. 例 試験の点数順に学生番号を出力する 時系列で出力される情報を,キーワードごとに並べる 学生番号:0003 氏名:さしすせそ 情処Ⅰの点数:90 情処Ⅱの点数:0 修得単位数: 24 学生番号:0002 氏名:かきくけこ 情処Ⅰの点数:60 情処Ⅱの点数:99 修得単位数: 48 学生番号:0002 氏名:かきくけこ 情処Ⅰの点数:60 情処Ⅱの点数:99 修得単位数: 48 学生番号:0001 氏名:あいうえお 情処Ⅰの点数:80 情処Ⅱの点数:75 修得単位数: 52 学生番号:0001 氏名:あいうえお 情処Ⅰの点数:80 情処Ⅱの点数:75 修得単位数: 52 学生番号:0003 氏名:さしすせそ 情処Ⅰの点数:90 情処Ⅱの点数:0 修得単位数: 24 学生番号で昇順ソート 情処Ⅰの点数で降順ソート (ソートの)「キー」という

並べ替え問題:定義する関数 int get_array_length(int *array); 配列の要素数を求める. × sizeof(array)/sizeof(array[0]) void print_array(const char *message, int *array); メッセージと,配列の各値を出力する. void sort_by_selection(int *array); 選択法を用いて並べ替える. 配列の中身を書き換える.

関数の呼び出し関係 main print_array sort_by_selection get_array_length

再帰呼び出しとは 関数の内部で自分自身を呼び出すことを,再帰呼び出し(recursive call)という. 用途 注意点 再帰的(帰納的,循環的)な定義 バックトラック(backtrack) 分割統治法(divide-and-conquer) 注意点 無限ループにならないようにする. 再帰を使わないほうがよいこともある.

カウントダウンするプログラム 自作関数countdownの定義の中で,countdownを呼び出している.

カウントアップするプログラム 出力の位置を変えると,カウントアップになる. カウントアップ,カウントダウンともに,再帰呼び出しなしの プログラムのほうが,効率はよい. なぜ再帰呼び出しは効率が悪いか? …関数呼び出しのコスト(オーバーヘッド)があるから.

なぜ再帰呼び出しが可能なのか? 同一の変数名x に対して複数の このようなデータ 構造を,「スタック」 オブジェクトが という. 生成される. このようなデータ 構造を,「スタック」 という. countdown x = 0 countdown x = 1 countdownの再帰呼び出しを終えたときの戻り先 countdownの呼び出し(関数処理)を終えたときの戻り先 countdown関数処理時に 生成されるオブジェクト main x = 2 main関数処理時に 生成されるオブジェクト num = 2

再帰的な定義の例 階乗 フィボナッチ数列 再帰呼び出しを用いれば,シンプルに書ける. しかしこれらも,whileループのほうが効率がよい. 0! = 1, 1! = 1 n! = n×(n-1)! (n≧2) フィボナッチ数列 a1 = 1, a2 = 1 an = an-1 + an-2  (n≧3) 再帰呼び出しを用いれば,シンプルに書ける. しかしこれらも,whileループのほうが効率がよい.

分割統治法 対象領域を細分化して求め(分割),全体として正しい解になる(統治)ようにする. 例: クイックソート 4 7 3 8 6 1 2 5 2 8 5 7 6 1 3 4 「4より小」と 「4より大」に 分ける. 1 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8

クイックソートの関数呼び出し 配列領域,開始位置,終了位置を引数とする. 4 7 3 8 6 1 2 5 2 3 1 4 6 7 8 5 1

関数の呼び出し関係 (quicksort.c) main get_array_length quicksort print_array 再帰!

まとめ 再帰呼び出しを用いて関数を定義すると,プログラムがすっきり書けることがある. 一般に,再帰を用いないほうが効率的である. 再帰的に定義された問題に適用すると,効果的. 一般に,再帰を用いないほうが効率的である. 関数内のauto変数は,関数呼び出しごとに生成される.

今後の予定 第10回:12月16日(金) 第11回:12月22日(木) 16:30~18:00 第12回:1月13日(金) 第11回:12月22日(木) 16:30~18:00 (12月23日(金)は祝日) 第12回:1月13日(金) 第13回:1月19日(木) 16:30~18:00 (?) 第14回:1月20日(金) (1月27日(金)は村川出張のため休講) (試験持込用の書籍を購入しておく?) 試験:2月3日(金)