C言語 ~理解を深めよう~
Download
Report
Transcript C言語 ~理解を深めよう~
C言語
~理解を深めよう~
H10709M
山村 直也
やりたいこと
ロバストなプログラムを書こう
入力時のエラーを無くそう
型にとらわれないプログラムを書こう
ポインタに慣れよう
要素を動的に確保しよう
プログラム
プログラム1
問題点(バグが起きる)
型チェックがない
改行や空白も入力文字として取られる
バッファオーバーランが起きる
改善策
fgets関数:入力関数
fflush関数:バッファ削除
char *fgets(char *s, int n, FILE *fp)
int fflush(FILE *fp)
sscanf関数:フォーマット関数
int sscanf(const char *str, const char
*format, ・・・)
プログラム
プログラム2
型にとらわれないソート処理
プログラム3
型にとらわれないソート処理
比較関数を作成する
ソート関数に比較関数を渡す
C言語の場合
関数ポインタを使う
voidポインタとキャストを使う
関数ポインタ
関数を指すポインタ
宣言は以下のように行う
戻り値の型 (*ポインタ名) (引数リスト)
以下のように使う
int myabs(int num);
int (*p) (int num);
p = myabs;
ans = (*p) (-100);
プログラム
プログラム4
voidポインタとキャスト
voidポインタ
どのような型にでもキャストできる
汎用ポインタと呼ばれる
どのような型でも受け取れる関数を作成でき
る
使用するときに使いたい型にキャスト
例)void* malloc(size_t size)
プログラム
プログラム5
qsort関数
クイックソートを行う関数
void qsort(void* base, size_t n, size_t
size, int(*fnc)(const void*, const void*))
ソート対象となる配列のアドレス
配列に含まれている要素数
配列の要素1つ1つの大きさ
比較関数のアドレス
比較関数
並べ替えるための基準を指定する関数
2つの引数を持ち、int型を返り値
第1引数の方が大きいなら正の値
第2引数の方が大きいなら負の値
両者が同じなら0
プログラム
プログラム6
課題
10個の整数値をコンソールから入力し、
入力値と平均と標準偏差を表示せよ
構造体のメンバに2つのint型変数と関数
ポインタを宣言する
関数ポインタには2つの引数を加算する関
数を渡す
構造体の配列を作成し、メンバは乱数を用
いて入力し、加算結果を表示せよ
課題
int, doubleをqsortを使って並び変えよ。
ソート前と後を表示せよ
名前とGPAを持つ構造体の配列をqsort
を使って並び変えよ
並び変えの基準はGPAの降順、GPAが同じ
場合は名前の昇順
参考
http://www.st.chukyo-u.ac.jp/h10709m/
今までの発表
C言語~理解を深めよう~
動的に連続領域に確保する
リスト構造を使用する
構造体とポインタを使用して実現
配列を動的に確保する
malloc, calloc, realloc, free関数を使用して
実現
動的確保の利点
必要な場所で必要な量だけ確保する事
が可能
好きな時に、解放する事が出来る
スコープが自由に決められる
プログラム
プログラム7
メモリ確保関数
void* malloc(size_t size)
void* calloc(size_t n, size_t size)
void* realloc(void *ptr, size_t size)
void free(void *ptr)
void* malloc(size_t size)
メモリを確保する関数
引数には確保したいメモリサイズを指定
する
確保した領域のアドレスを返す
任意の領域を確保するために、voidポイ
ンタ型が使われている
void* calloc(size_t n, size_t size)
配列を動的に確保する時に便利な関数
引数には配列の要素数と要素のメモリサ
イズを指定する
確保した領域の先頭アドレスを返す
確保した領域は全てのビットを0
プログラム
プログラム8
void* realloc(void *ptr, size_t size)
配列のサイズを再定義する
前に確保した要素はできる限りコピーさ
れる
引数には再定義したい配列のアドレス、
再定義後のメモリサイズを指定する
成功したら、確保した先頭アドレス、失敗
したら、NULLが返る
プログラム
プログラム9
課題
int型の動的配列を作成し、表示せよ
ユーザに任意の数の入力をさせよ
入力した値の標準偏差を求めよ
任意の構造体を作成し、その動的配列を
作成し、表示せよ
ユーザに任意の数の入力をさせよ
課題
名前とGPAを持つ構造体の配列をqsort
を使って並び変えよ
並び変えの基準はGPAの降順、GPAが同じ
場合は名前の昇順
ユーザに任意の数を入力させよ