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