mallocを使ったプログラム課題作成
前回の授業でmallocについて説明をしたので、今日は実際に使ってみるということで、 課題。課題のテーマは以下の通り。
mallocを使ったデータベースの作成
構造体を使った昨年度の課題で、例えば「名前と電話番号」で、入力データをすべて記憶し、 そのデータを検索などに取り組んだ。 今回は、これを拡張し、malloc を使ってプログラムを作成する。 例えば、名前は寿限無のような長い名前の人がいるかもしれない。 構造体の配列は1クラスの50人程度ではなくって、1000人かもしれない。 プログラムの実行の前に、想定する最大データ件数を入力してから、データを覚える。
さまざまな宣言でメモリのイメージの違い
上記課題に取り組む前に、さまざまな宣言で、データのイメージがどう違うのかを説明した。
(( 名前の配列 )) // 基本10文字50人なら char name[ 50 ][ 10 ] ; // 名前に寿限無のような人がいるかも... char *name[ 50 ] ; for( i = 0 ; i < 50 ; i++ ) { char buff[ 1000 ] ; scanf( "%s" , buff ) ; name[ i ] = (char*)malloc( strlen( buff ) + 1 ) ; if ( name[ i ] != NULL ) { strcpy( name[ i ] , buff ) ; } } // クラスも最大何人かは、動かす時にしかわからない? char **name ; int size ; scanf("%d" , &size ) ; // データ件数を入力 name = (char**)malloc( sizeof( char* ) * size ) ; if ( name != NULL ) { for( i = 0 ; i < size ; i++ ) { char buff[ 1000 ] ; scanf( "%s" , buff ) ; name[ i ] = strdup( buff ) ; // malloc+strcpy } }
構造体の場合
構造体を使う例として、複素数のデータの配列の作り方の違いも、説明。
(( 構造体を使う例 )) struct Complex { double re , im ; } ; // 基本 50 個の複素数 struct Complex array[ 50 ] ; array[ 0 ].re = 1 ; // array[ 0 ] = 1 + j2 ; array[ 0 ].im = 2 ; // ポインタの配列 struct Complex *array[ 50 ] ; array[ 0 ] = (struct Complex*)malloc( sizeof( struct Complex ) ) ; if ( array[ 0 ] != NULL ) { array[ 0 ]->re = 1 ; array[ 0 ]->im = 2 ; } // 配列へのポインタ struct Complex *array ; array = (struct Complex*)malloc( sizeof( struct Complex ) * 50 ) ; if ( array != NULL ) { array[ 0 ].re = 1 ; array[ 0 ].im = 2 ; }
配列サイズを途中で倍にするテクニック
配列のサイズが実行中もわからない場合のテクニックとして、 配列が不足した際に、配列サイズを倍にする方法を説明。
(( 整数配列サイズがわからない場合 )) int *array ; int rsize = 0 ; int msize = 10 ; int x ; array = (int*)malloc( sizeof( int ) * msize ) ; while( scanf( "%d" , &x ) == 1 ) { // 配列に入れる前に、サイズ不足の場合 if ( rsize >= msize ) { int *n_array ; n_array = (int*)malloc( sizeof( int ) * msize * 2 ) ; if ( n_array == NULL ) break ; // 倍の配列に中身をコピー for( int i = 0 ; i < msize ; i++ ) n_array[ i ] = array[ i ] ; // 元の配列を捨てる free( array ) ; // 倍の配列を使うように array = n_array ; msize *= 2 ; } // 配列に追加 array[ rsize ] = x ; rsize++ ; }
雑談:学生さんが、電話場号を覚える時はどうする?という話をしていたので、 int型で電話を覚えるのはアリだけど、090 とか 0778 といった番号は使えないよね… という説明をする。桁数は?というから、ダイヤルトーン使えば長い番号もあるよね〜 と説明をしたけど、今の学生さんはダイヤルトーンのピポパ音を知らない。
ということで、ダイヤルパルスの話(110番に電話したけりゃ、オンフックボタンを、 ポン、ポン、ポポポポポポポポポポ(1秒以内に10回連打)とすればかかる)とか、 DTMF音(低群と高群の2つの音の合成で、正確に2つの音を発することができればかかる)とかを説明する。