ホーム » 2013 » 5月 » 08

日別アーカイブ: 2013年5月8日

2013年5月
« 4月   6月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

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つの音を発することができればかかる)とかを説明する。