C言語レクチャー

C言語レクチャー
H108097
H108102
H108137
H108139
成瀬基樹
濱口賢人
山崎貴英
山下佳隆
1
今回の内容
関数ポインタ
 qsort

2
関数ポインタとは?


関数のアドレスを保有するポインタ
変数のように使用できる
3
関数ポインタの構造

宣言


代入


(返却値の型) (*変数名)(引数…)
変数名=関数名
使用方法

(*変数名)(引数…)
4
実際の使い方

lect3_fncptr.cを開く
5
関数ポインタのメリット
複数の関数を配列で管理できる
 動的な関数の呼び出しができる
 etc…

6
メリットの例

lect3_fncptr2.cを開く
7
qsortとは?
C言語標準のソート関数
 配列をソートできる

8
宣言

void qsort(void *base,
size_t n,
size_t size,
int(*fnc)(const void*,
const void*))
9
第一引数



void qsort(
void *base,
size_t n,
size_t size,
int(*fnc)(const void*,const void*))
ソート対象になる配列のポインタ
基本型、構造体どちらでも良い
10
第二引数



void qsort(
void *base,
size_t n,
size_t size,
int(*fnc)(const void*,const void*))
配列に格納されている要素の個数
添字0から添字nまでがソートされる
11
第三引数



void qsort(
void *base,
size_t n,
size_t size,
int(*fnc)(const void*,const void*))
配列の要素一つ一つの大きさ
intならsizeof(int)で得られる
12
第四引数


void qsort(
void *base,
size_t n,
size_t size,
int(*fnc)(const void*,const void*))
比較関数の関数ポインタ
13
比較関数



qsortの第四引数における関数ポイン
タで渡すべき比較の基準となる関数
返却値は整数
引数はキャストして用いる
14
比較関数の引数と返却値


比較関数の引数は配列の2つの要素
返却値はこの2要素の関係により決定


第1引数を後に持ってきたいなら正値
第1引数を前に持ってきたいなら負値
15
実際の使い方

lect_qsort.cを開く
16
構造体における比較関数

lect_qsort2.cを開く
17
課題1


関数ポインタを用いた電卓を作成せよ
条件
 四則演算と余りの導出
 四則演算と余りの計算は関数化する
引数として2つの数値
 計算結果を返却する

18
課題2-A


qsortを用いて前々回の成績管理ソフトを
改良せよ
条件
 GPAでソートできるように
19
課題2-B

条件


GPAが同じだった場合、学籍番号でソートする
こと
ユーザに名前、学籍番号、GPAのどれかで
ソートするか選択させること
20
課題3


課題2の内容をさらに改良せよ
条件



ソートを昇順、降順のどちらでもできるように
ユーザに昇順、降順のどちらかを選択させる
昇順、降順の比較関数は関数ポインタで管理
する
21
ラシゼミ恒例課題


これまで習った内容をフル活用して
オリジナルプログラムを作成せよ
条件



ポインタを用いる
構造体を用いる
努力目標

データ保存用ファイルを用意し、
前回の記録を復元できるようにする
22
アドバイス


コードを書くとき、一番最初にコメント
でどこで何をするかを記述する
頭の中で何を書くか整理できる
23