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

Slides:



Advertisements
Similar presentations
情報処理演習C2 ファイル操作について (2).
Advertisements

5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
プログラミング言語としてのR 情報知能学科 白井 英俊.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
基本情報技術概論(第4回) 埼玉大学 理工学研究科 堀山 貴史
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
情報工学概論 (アルゴリズムとデータ構造)
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
第8回 プログラミングⅡ 第8回
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラミング論 II 電卓,逆ポーランド記法電卓
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
大岩 元 慶応大学環境情報学部 数式の表現と日本語 大岩 元 慶応大学環境情報学部
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第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.
情報処理Ⅱ 第2回:2003年10月14日(火).
プログラミング演習I 2004年5月19日(第5回) 理学部数学科・木村巌.
明星大学 情報学科 2012年度 後期   情報技術Ⅱ   第8回
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
プログラミング 3 2 次元配列.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
ポインタとポインタを用いた関数定義.
プログラミング論 ポインタ
コンピュータアーキテクチャ 第 4 回.
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
pf-6. スタック (Python プログラミング基礎を演習で学ぶシリーズ)
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング 4 文字列.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

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

前回までの復習 文字列とポインタ 文字列の操作 動的なメモリの確保

今日学ぶこと 関数ポインタ 教科書10.5から(p. 337~) スタックというデータ構造と、配列を使ったスタックの実現 逆ポーランド記法 逆ポーランド記法計算機の実装例(+, -のみ)

関数ポインタ ポインタ変数とは、さまざまなオブジェクト(int, char, double型の値や、それらの配列など)のアドレスを格納する変数だった アドレスとは、メモリ上の場所(通し番号)だった 関数も、メモリ上に一定の場所を占める 関数のアドレスもある 関数ポインタ

関数ポインタの宣言 関数ポインタの宣言 たとえば pMは、int型を二つ取り、int型を返す関数へのポインタ 戻り値の型  (*関数ポインタ) (引数リスト); たとえば int (*pM) (int x, int y); pMは、int型を二つ取り、int型を返す関数へのポインタ

関数ポインタにアドレスを代入 関数ポインタに、関数のアドレスを代入する たとえば 関数ポインタに代入された関数の呼び出し 関数ポインタ = 関数名; &はいらない(関数名は関数のアドレスそのもの) たとえば pM = max; pMは関数max()を指す 関数ポインタに代入された関数の呼び出し (*pM)(5, 10) /* max(5, 10)と同じ */

関数ポインタの利用と応用 Sample16.cを入力して、コンパイル・実行してみよう 関数ポインタの応用 たとえば、関数ポインタを配列に格納し、必要に応じて異なる関数を呼び出すことができる Sample17.cを入力して、コンパイル・実行してみよう

ポインタと配列の応用:スタック これまで学んだ、ポインタと配列との関係の応用として、スタック(stack)というデータ構造を実装してみよう スタックとは、ある型のデータをpush, popできるデータ構造 aをpush, bをpushすると、最初のpopでbが、次のpopでaが得られる(First In, Last Out) お皿やお盆を積み重ねたようなもの

popするとcが飛び出し、残りが一つ筒繰り上がる スタックの概略図 popするとcが飛び出し、残りが一つ筒繰り上がる aをpush bをpush cをpush 空 a b c 空のスタック

スタックを配列により実現 例えば、文字列をpush, popできるスタックを作るには? char *の配列stack(長さdを持つ)を用意 int型の変数stackptr (スタックポインタ)を用意 最初はstackptr = 0と初期化 文字列sをpush: stackptr++; stack[stackptr] = s; stackをpopする:return stack[--stack];

cをpop. 2番目の要素を返して、スタックポインタを減らす スタックと配列 1 2 3 4 a b c スタックポインタ = 0 aをpush bをpush スタックポインタ = 1 cをpush スタックポインタ = 2 cをpop. 2番目の要素を返して、スタックポインタを減らす 次のpushの際に、2番目の要素cが上書きされる

配列を使ったスタックの実装例 stack.c, stack.h, stack-example.cを参照

逆ポーランド記法(RPN) 逆ポーランド記法:Reverse Polish Notation 1 + 2 を、1 2 +のように記述する 1 + 2 – 3 なら 1 2 + 3 - 1 + 2 * 3なら 1 2 3 * + (1 + 2) * 3なら 1 2 + 3 * 演算子の優先順位が決まっていれば、曖昧さはない 通常の記述を、中間記法(infix notation)という

逆ポーランド記法とスタックを用いた計算 逆ポーランド記法で記述された式が与えられたら、先頭から読み出して 読み出した文字が数字ならスタックにpush 読み出した文字が演算子なら、その演算子の引数の数だけスタックからpopし、演算結果をpush 読み出す文字が無くなったときに、スタックに1つだけ数字が残っていれば、それが結果 読み出す文字が無くなったときに、上の状態でなければ、式が間違っていたということ

例 1 2 + が与えられた式の場合 1をpush 2をpush +なので、popした結果の2と、もう一度popした結果1とを足した値3をpush 3が結果となる

例2 1 2 - 3 + が与えられた式の場合 1をpush 2をpush - なので、1 - 2 = -1をpush. 2が結果

stack.cを使って、逆ポーランド記法計算機を実装 rpncalc-ez.cを参照 char *program[] = {“1”, “2”, “sub”, “3”, “add”}; は、1 2 – 3 + で、例2と同じもの

今日学んだこと 関数ポインタ 教科書10.5から(p. 337~348) スタックというデータ構造と、配列を使ったスタックの実現 逆ポーランド記法 逆ポーランド記法計算機の実装例(+, -のみ)

レポート課題 (1)1 + 3 – 5 を逆ポーランド記法で書け (2) (1 + 3) * (2 + 4) を逆ポーランド記法で書け (3・やや難) rpncalc-ez.cを改良して、掛け算も可能なようにせよ.(2)の答えを、そのプログラムで実際に計算せよ (発展問題) 中間記法で書かれた式を、逆ポーランド記法に変換する手続きについて考えてみよ.また、文献を調査し、結果をまとめよ.

レポート課題(続) 締め切り:2004年12月13日一杯(日本時間で) 提出:メールで木村(iwao@sci.toyama-u.ac.jp)まで. 感想などあると木村が喜びます

休講通知 12月7日(火)のプログラミング演習IIは休講です(木村が出張のため)