memo

Similar documents
memo

memo

memo

memo

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

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

memo

プログラミング基礎

Microsoft PowerPoint - kougi9.ppt

PowerPoint Presentation

PowerPoint プレゼンテーション

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

gengo1-12

PowerPoint Presentation

gengo1-12

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

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

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

2006年10月5日(木)実施

Prog1_12th

Microsoft PowerPoint - 第3回目.ppt [互換モード]

memo

Taro-ファイル処理(公開版).jtd

PowerPoint プレゼンテーション

演算増幅器

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

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

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

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

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

slide5.pptx

プログラミング実習I

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint pptx

第3回 配列とリスト

プログラミングI第10回

PowerPoint プレゼンテーション

分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1

memo

gengo1-12

Microsoft PowerPoint - kougi6.ppt

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

PowerPoint プレゼンテーション

kiso2-09.key

ゲームエンジンの構成要素

Microsoft PowerPoint pptx

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

Microsoft Word - no204.docx

プログラミング基礎

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

Microsoft PowerPoint - lec10.ppt

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - 6.pptx

スライド 1

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

Microsoft Word - no15.docx

ファイル入出力

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

DVIOUT

ファイル入出力

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

情報処理演習 B8クラス

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

02: 変数と標準入出力

第3回 配列とリスト

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

02: 変数と標準入出力

講習No.12

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

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

file:///D|/C言語の擬似クラス.txt

memo

Microsoft PowerPoint - 11.pptx

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

slide4.pptx

Taro-スタック(公開版).jtd

デジタル表現論・第6回

memo

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

Microsoft Word - Training10_プリプロセッサ.docx

プログラミング演習3 - Cプログラミング -

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

Microsoft Word - no12.doc

cp-7. 配列

program7app.ppt

8 / 0 1 i++ i 1 i-- i C !!! C 2

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

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

Microsoft Word - 3new.doc

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

第2回

スライド タイトルなし

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Microsoft PowerPoint pptx

PowerPoint プレゼンテーション

Microsoft Word - no206.docx

Prog1_15th

Transcription:

数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1

今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2

プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int x, double y) { return (double)x * y; } int main() { double z; z = sub(1, 2.5); // OK } int main() { int z; z = sub(1, 2.5); // NG } double sub(int x, double y) { return (double)x * y; }

関数のプロトタイプ宣言 double sub(int x, double y); // 後 ( 下 ) に出てくる関数の型を示す int main() { double z; z = sub(1, 2.5); // OK } double sub(int x, double y) { return (double)x * y; } 4

ヘッダーファイル ( 標準 ) ライブラリに入っている関数や定数が宣言してある #include <stdio.h> // 標準入出力ヘッダー int main() { printf( Hello. n ); // stdio.h 内で宣言してある } 5

stdio.h で宣言してあるもの FILE 構造体 fopen, fclose, fprintf, fscanf, NULL EOF 6

stdlib.h で宣言してあるもの malloc, free exit atoi, atof rand ( 乱数発生 ) qsort ( ソート ) bsearch (2 分探索 ) 7

プログラムの分割 1つのファイルに全ての処理を書くと 長くて分かりにくい プログラムの再利用がしにくい ( 再コンパイルに時間がかかる ) まとまった処理ごとに分割してファイルを作る 行列演算 (matrix.c) 全体 (main.c) gcc main.c matrix.c 8 注 : それぞれのファイルは単独でコンパイルできるようにする ヘッダーファイルを使う

matrix.h の中身 typedef struct { int n,m; slist **R; } smatrix; smatrix *smatrix_read(file *fin); void smatrix_write(file *fout, smatrix *a); smatrix *smatrix_product(smatrix *A, smatrix *B); 9

matrix.c の中身 #include matrix.h // 構造体の定義を読み込む smatrix *smatrix_read(file *fin) { } // 関数の中身を書く void smatrix_write(file *fout, smatrix *a) { } // 自分で作ったファイルを読み込むときは で括る 10

main.c の中身 #include matrix.h // 構造体の定義や関数のプロトタイプ宣言 int main(int argc, char *argv[]) { smatrix *A, *B, *C; // smatrixは matrix.h で定義してある A = smatrix_read(stdin); B = smatrix_read(stdin); C = smatrix_product(a, B); smatrix_write(stdout, C); } 11

分割コンパイル 各ソースファイルを個別にコンパイルし, 最後に実行ファイルを作る gcc c o matrix.o matrix.c O3 #matrix.c のコンパイル gcc c o main.o main.c O3 #main.c のコンパイル gcc o main.out matrix.o main.o # リンク 修正したファイルだけ再コンパイルできる 注 : ヘッダーファイルを修正した場合, それをインクルードしている全てのソースファイルは再コンパイルする必要がある 自動化するには make コマンドを使用する 12

2 重インクルードの防止 ヘッダーファイル中で別のヘッダーファイルをインクルードする場合などに, 構造体等の宣言が 2 回出てくるとエラーになる 2 重インクルードを防止するために, ヘッダーファイル内にフラグを用意する #ifndef MATRIX_H // MATRIX_H が定義されていなければ以下が読まれる #define MATRIX_H // 1 回目に読まれたときに MATRIX_H を定義する // matrix.h の中身を書く #endif // #ifndef の行と対応 13

Tips 全ての関数は外部のオブジェクトファイル (.o) から参照できる 下手に名前をつけると, 名前の衝突が起きてしまう 外部で使用しない関数には static をつける // matrix.c static sub(smatrix *A) { } // matrix.c の外からは見えない smatrix *smatrix_transpose(smatrix *A) // 外から見える { smatrix *B; B = sub(a); // matrix.c 内ではsubは使える } 14

リストを用いた疎行列の表現 密行列の表現 各行は,1 次元配列 行列は,( 行へのポインタ ) の1 次元配列 R 疎行列の表現 各行は, 非零要素のリスト 行列は,( 行を表すリスト ) の1 次元配列 R R 1, 3.0 5, 1.0 2, 1.0 3, 1.0 4, 2.0 R 1 3 2 6 8 5 4 1 9 2 3 1 15

リストの要素を変更 typedef struct slobj { struct slobj *next; // 後の要素へのポインタ int j; // j 列目 data v; // 値 } slobj; リストに挿入する際は, 値の小さい順ではなく,j の小さい順にする typedef struct { slobj *head; slobj *tail; } slist; L head tail // 先頭要素のポインタ // 末尾要素のポインタ key next NULL 9 16 4 16

行列の構造体 typedef struct { int n,m; // 行数, 列数 slist **R; // 行ベクトルを表すリストの配列 } smatrix; R R[0] R[1] R[2] 1, 3.0 5, 1.0 2, 1.0 3, 1.0 4, 2.0 17

課題 2つの疎行列の積を計算する プログラムの仕様 入出力は標準入力 / 出力 標準入力から行列 A と B のデータを続けて読み込む 行列積 AB を標準出力に出力 締切 5/13( 水 ) 17:00 宛先 :miprogramming2015+5@gmail.com 18

注意 domjudge に投稿する際は, 必要なファイルすべてを選択してアップロードする ファイルを分割した場合, インクルードファイル内でも stdio.h 等をインクルードしないとエラーになる 19

行列のファイル形式 5 5 1 1.0 2 2.0-1 1 2.0 2 1.0 3 2.0-1 2 2.0 3 1.0-1 4 1.0-1 5 1.0-1 行数列数 1 行目 2 行目 3 行目 4 行目 5 行目 1.0 2.0 0 0 0 2.0 1.0 2.0 0 0 0 2.0 1.0 0 0 0 0 0 1.0 0 0 0 0 0 1.0 各要素は列の位置と要素の値で表現される行の最後には -1 を書く 20

ヒント ( 作成する関数 ) リストの末尾に r を追加 void slist_append(slist *L, slobj *r) 零行列を作る smatrix *smatrix_new(int n, int m) 行列 S の (i,j) 要素を x にする void smatrix_insert(smatrix *S, int i, int j, data x) 挿入前の (i,j) 要素は 0 と仮定してよい 行列 S の (i,j) 要素を求める data smatrix_access(smatrix *S, int i, int j) (i,j) 要素がリストになければ 0 を返す 21

疎行列を読み込み, 新たに確保した疎行列に代入 smatrix *smatrix_read(file *in); 疎行列を入力と同じ形式出力 void smatrix_write(file *out, smatrix *a); 2つの疎行列 A, B の積を計算し, 新たに確保した疎行列 C に代入 smatrix *smatrix_product(smatrix *A, smatrix *B); 行列のサイズが合わないときは C は確保せずに NULL を返す 演算の効率も考慮する 疎行列のメモリを開放する void smatrix_free(smatrix *A); 22