program7app.ppt

Similar documents
プログラミング及び演習 第1回 講義概容・実行制御

gengo1-8

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

02: 変数と標準入出力

第9回 配列(array)型の変数

Microsoft Word - Cプログラミング演習(12)

memo

Prog1_10th

02: 変数と標準入出力

第1回 プログラミング演習3 センサーアプリケーション

memo

Microsoft PowerPoint - 11.pptx

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

Microsoft Word - 3new.doc

Taro-リストⅠ(公開版).jtd

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - no12.doc

PowerPoint プレゼンテーション

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

PowerPoint プレゼンテーション

プログラミング基礎

kiso2-09.key

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(C 言語 ) サンプル問題 知識科目 第 1 問 (

Microsoft PowerPoint - 5Chap15.ppt

memo

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

PowerPoint プレゼンテーション - 物理学情報処理演習

memo

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - 09.pptx

02: 変数と標準入出力

gengo1-11

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

講習No.9

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - lec10.ppt

Taro-ポインタ変数Ⅰ(公開版).j

02: 変数と標準入出力

02: 変数と標準入出力

Taro-再帰関数Ⅲ(公開版).jtd

02: 変数と標準入出力

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

< F2D837C E95CF CF68A4A94C5816A2E6A>

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Prog1_6th

PowerPoint プレゼンテーション

ポインタ変数

memo

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft Word - no15.docx

memo

演算増幅器

PG13-6S

PowerPoint プレゼンテーション

Microsoft PowerPoint pptx

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft PowerPoint - kougi11.ppt

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

プレポスト【解説】

データ構造

PowerPoint プレゼンテーション

02: 変数と標準入出力

PowerPoint プレゼンテーション

プログラミングI第10回

Microsoft PowerPoint - handout07.ppt [互換モード]

Microsoft PowerPoint - 計算機言語 第7回.ppt

基礎プログラミング2015

2006年10月5日(木)実施

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

PowerPoint プレゼンテーション - 物理学情報処理演習

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

02: 変数と標準入出力

Microsoft PowerPoint - ruby_instruction.ppt

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Prog1_12th

Microsoft Word - no11.docx

PowerPoint プレゼンテーション

C 言語講座 Vol 年 5 月 29 日 CISC

Taro-再帰関数Ⅱ(公開版).jtd

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

PowerPoint プレゼンテーション

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

cp-7. 配列

C言語7

Microsoft PowerPoint - prog08.ppt

Java講座

02: 変数と標準入出力

第2回

PowerPoint プレゼンテーション

プログラミング基礎

Prog1_6th

Microsoft Word - no202.docx

PowerPoint Presentation

模擬試験問題(第1章~第3章)

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

Microsoft PowerPoint - 12.ppt [互換モード]

プログラミング基礎

Transcription:

プログラム理論と言語第 7 回 ポインタと配列, 高階関数, まとめ 有村博紀 吉岡真治 公開スライド PDF( 情報知識ネットワーク研 HP/ 授業 ) http://www-ikn.ist.hokudai.ac.jp/~arim/pub/proriron/ 本スライドは,2015 北海道大学吉岡真治 プログラム理論と言語, に基づいて, 現著者の承諾のもとに, 改訂者 ( 有村 ) が加筆修正しています. 本スライドに誤り等があった場合には, 内容の文責は改訂者にありますのでご注意ください. 2016 北海道大学, 有村博紀

ポインタと配列 n 配列へのポインタ char x[4]; shor int y[3]; px = &x[0]; py=&y[0] *(px +1) は x[1] と同じ *(py+1) は y[1] と同じ ポインタのタイプに応じて アドレスに加えられる値が異なる

多次元配列 n 多次元配列 : 配列を配列としたもの 一次元配列の特殊系としてアクセス #include<stdio.h> void main() { int i,j; int a[2][12] = {{31,28,31,30, 31,30,31,31,30,31,30,31}, {31,29,31,30, 31,30,31,31,30,31,30,31}}; for(i =0; i < 2; i++) { for(j =0; j < 12; j++) { printf("%d %d %d\n", i, j, a[i][j]); printf("%d %d %d\n", i, j, *(a[i] + j)); printf("%d %d %d\n", i, j, *(((int*)(a + i)) + j)); } } }

文字列とポインタ n 文字列は char 型の配列として取り扱う 文字列の最後には 文字列の最後を示すヌル文字 \0 が登録される そのため 配列の長さは 文字数 +1 となる char* a = abc char a[] = abc char a b c \0 1 2 3 4

文字列のポインタ n 格納する文字の数によって 必要なメモリ領域が異なるので double や int などのように固定長の領域をとることができない n あらかじめ 必要な領域を確保して 文字列を記述し 文字列の終わりを示す記号 \0 で終端を表す int strlen(char *a){ int count =0; while(*a!= \0 ) { a++; count++; } return count; } 15400 a b c \0

文字列のソート n int や float 型のソート データを格納している領域の入れ替えが単純な代入操作で可能 n 文字列は データを格納する領域が大きく 単純にコピーをしてデータを並べ替えるのはコストがかかる n ポインタ変数を用いた並べ替え データを格納する領域を並べ替えるのではなく データの格納されている場所 ( ポインタ ) を並び替える

2 つの並べ替え方 n 長さ 10 の char 型の配列を 4 個用意 char data[4][10] data = 15400 (char 型のポインタ ) 15400 15410 15420 15430 15440 a b c \0 c c b \0 a r b \0 a a a a a \0 strcpy による並べ替え 15400 15410 15420 15430 15440 a a a a a \0 a b c \0 a r b \0 c c b \0 ポインタの並べ替え 15430 15400 15420 15410

ポインタによる並べ替え n ポインタを保存するための配列を作成 char data[4][10] char *dataptr[4]; int i; for(i = 0; i < 4; i++){ dataptr[i] = data[i]; } n dataptr を data を参照しながら並べ替える n dataptr の順番に従って出力 多次元配列では 最大次元以外の要素は計算で求まるため 上記の場合に data[2]=data[3] といった操作はできない

While と if 文 n if 文 複数の命令を行う場合に {} を利用 if(...) operation1; operation2; if(...){ operation1; operation2; } n while 文 条件を満たす間 operation1 を実行し 条件を満たさない時に ループを抜ける while( 条件 ){ operation1; }

データ構造 n 基本的なデータ構造の組み合わせ 基本データ : 文字列 数値 組み合わせのデータ 学生 : 名前 ( 文字列 )+ 学生証番号 ( 数値 ) 語と出現回数 : 語 ( 文字列 )+ 出現回数 ( 数値 )

C におけるデータ構造の定義 n 構造体 struct 宣言子による定義 構造体のメンバーを列挙 名前と変数のタイプを指定 例 : 文字の出現回数 struct wordcount { char *word; int count; };

構造体の利用 n 構造体の初期化 n 構造体のメンバーの参照. 演算子 ( ドット演算子 ) -> 演算子 ( アロー演算子 ) int main(int argc, char *argv[]){ struct wordcount wc = { "abc", 1}; char word[4] ="def"; char word2[4] ="ghi"; printf("word: %s count: %d\n", wc.word, wc.count); wc.word = word; wc.count = 5; printf("word: %s count: %d\n", wc.word, wc.count); (&wc)->word = word2; (&wc)->count = 3; printf("word: %s count: %d\n", wc.word, wc.count); return 0; }

構造体を利用したプログラム n ソート済みの文字列の出現回数でソート qsort ライブラリを利用 関数へのポインタ ( 高階関数が利用可能 ) 出現回数の大小で並べ替え 同数の場合は文字列の順序で並べ替え int wordcomp(const void *a, const void *b) { if (((struct wordcount*) a)->count == ((struct wordcount*) b)->count) return strcmp(((struct wordcount*) a)->word, ((struct wordcount*) b)->word); else return ((struct wordcount*) a)->count - ((struct wordcount*) b)->count; } メイン関数からの呼び出し struct wordcount wc[maxsize]; qsort(wc, i, sizeof(struct wordcount), *wordcomp);

高階関数 n 関数を引数とする関数 一般に 関数を引数としない関数を一階関数 関数を引数としない関数のみを関数の引数とする関数を二階関数と呼ぶ 高階関数とは 関数を引数とする関数を繰り返し参照しながら定義できる関数

高階関数の例 n n n 全ての要素に対して 一定の操作を行う関数 iterate(f,c,x) = if is_nil(x) then c else f(first(x), iterate(f,c,rest(x)) 実行過程 sum(x, y) = x + y, count(x, y) = 1 + y, times(x,y)=x*y iterate(sum, 0, (1 2))= sum(1, iterate(sum,0, (2))) = sum(1, 2 + iterate(sum 0 nil)) = sum(1, 2 + 0) = 3 iterate(count, 0, (1 2))= count (1, iterate(count,0, (2))) = count (1, 1 + iterate(count 0 nil)) = count (1, 1 + 0) = 2 iterate(times, 1, (1 2))= count (1, iterate(times,1, (2))) = count (1, 2 * iterate(times 1 nil)) = count (1, 2*1) = 2

高階関数の例 n 全ての要素に対して 成立するかどうかを調べる n forall(f,x) = if is_nil(x) then true else if f(first(x)) then forall(f,c,rest(x)) else false n 実行過程 even(x) = if mod(x, 2) = 0 then true else false forall(even, (2 4 5 6)) = forall(even, (4 5 6)) = forall(even, (5 6)) = false forall(even, (2 4 6)) = forall(even, (4 6 )) = forall(even, (6)) = forall(even, nil) = true

C 言語による高階関数 n 関数ポインタ 関数の名前と引数を組み合わせて実行する qsort 関数は 関数ポインタを利用して 高階関数のような処理を行っている

比較 :C のクイックソート ( 関数へのポインタ ) QSORT(3) Linux Programmer's Manual QSORT(3) 名前 qsort - 配列を並べ変える書式 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); 説明 qsort() 関数は 大きさ size の nmemb 個の要素をもつ配列を並べ変える base 引数は配列の先頭へのポインタである compar をポインタとする比較関数によって 配列の中身は昇順 ( 値の大きいものほど後に並ぶ順番 ) に並べられる 比較関数の引数は比較されるふたつのオブジェクトのポインタである 比較関数は 第一引数が第二引数に対して 1) 小さい 2) 等しい 3) 大きいのそれぞれに応じて 1) ゼロより小さい整数 2) ゼロ 3) ゼロより大きい整数のいずれかを返さなければならない ふたつの要素の比較結果が等しいとき 並べ変えた後の配列では ふたつの順序は定義されていない 返り値 qsort() は値を返さない 注意 compar 引数に使用するのに適しているライブラリルーチンとして strcmp, alphasort, versionsort がある

前半の授業のまとめ n 様々なプログラミング言語 手続き型言語 関数型言語 オブジェクト指向言語 n 同じ作業が様々な形式で表現可能 人間に理解しやすい言語 計算機にとって効率の良い言語

手続き型言語と関数型言語 n 共通点 手続きの塊を抽象化 n 異なる点 関数の定義と再利用 手続き型言語 逐次的に行う作業を手順として記述し実行 関数型言語 再帰などによる関数定義を用い 関数の解釈 ( 簡約 ) により作業が実行

言語の考え方と個別言語の仕様 n 実際のプログラミング言語はいろいろな考え方が応用可能 手続き型言語でも再帰プログラミングは可能 Lisp は 変数の定義や逐次作業の実行といった手続き型言語の考え方が入っている

試験について n 後半部分と合わせて 学期の最後に試験をします n 語句説明と授業の最後にやった課題でやったような内容が出題されます