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が同じ
場合は名前の昇順

ユーザに任意の数を入力させよ