1997年度後期期末情報構造論テスト

教科書・ノート持ち込み不可。
解答に使用するプログラム言語は、 問題の趣旨に沿っていれば何を用いても良い。
解答を裏に書く場合、どの設問に対する答か解るようにすること。

1.構造体の理解度チェック

ファイル名そのファイルの作られた日付 のデータが、以下のような構造体と その配列struct fstat file_list[]で格納されている。

また、昨日の日付がstruct tm yesterday に格納されている。

ここで、日付 yesterday より古いファイルの内容をすべて印刷する 処理を main にて実行している。 プログラム中の3つの『未完成部分』と、2つの下線(___)の部分を 埋めて、プログラムを完成させよ。

解答は、下のプログラム中の余白部分などに、書き込むこと。

	#include 
	#define MaxFileNameLength 256

	struct fstat {  /* ファイル名と日付のデータ構造 */
	    char fs_name[ MaxFileNameLength ] ; /* ファイル名 */
	    int  fs_day ;  /* 日 */
	    int  fs_mon ;  /* 月 */
	    int  fs_year ; /* 年 */
	} ;
	struct tm {     /* 日付だけのデータ構造 */
	    int  tm_day ;  /* 日 */
	    int  tm_mon ;  /* 月 */
	    int  tm_year ; /* 年 */
	} ;

	struct tm    yesterday = { 25 , 2 , 1998 } ;
	struct fstat file_list[ 5 ] = {
	    { "birthday.dat" , 7 ,  2 , 1998 } ,
	    { "/etc/hosts" ,   1 ,  1 , 1985 } ,
	    { ".profile" ,    24 , 12 , 1997 } ,
	    { "RMAIL" ,       26 ,  2 , 1998 } ,
	    { "/tmp/Ex1234" , 26 ,  2 , 1998 }
	} ;

	int  tm_cmp( struct tm* t , struct fstat* f )
	{
	    if ( t->tm_year != f->fs_year ) {
	        if ( t->tm_year > f->fs_year )
	            return 1 ;
	        else
	            return -1 ;
	    } else if ( t->tm_mon != f->fs_mon ) {
	        /* 未完成部分(1) */

	    } else if ( t->tm_day != f->fs_day ) {
	        /* 未完成部分(2) */

	    } else {
	        return 0 ;
	    }
	}
	int  catalog_file( char* fn )
	{
	    /* 指定されたファイルの内容を表示する関数 */
	    FILE* fp ;
	    if ( (fp = fopen( fn , "rt" )) == NULL ) {
	        return -1 ;
	    } else {
	        int   c ;
	        printf( "::%s::\n" , fn ) ;
	        while( (c = getc( fp )) != EOF )
	            putchar( c ) ;
	        fclose( fp ) ;
	        return 0 ;
	    }
	}

	void main() {
	    int  i ;
	    for( i = 0 ; i < 5 ; i++ ) {
	        if ( tm_cmp( &yesterday , __________ ) ______ ) {
	            /* 未完成部分(3) */

	        }
	    }
	}

2.リスト処理の理解度チェック

整数を扱うリスト構造が、以下に示すプログラムのように与えられた。 このリスト構造の中から、指定された数(min)以上でかつ 指定された数未満(max)のデータだけを表示したい。 関数 print_data_range() の内部の未完成を埋めよ。

データの表示には、通常の printf() を使用すれば良い。

	#include 
	struct List {
	    int          data ;
	    struct List* next ;
	} ;
	void print_data_range( struct List* p , int min , int max )
	{
	    /* 未完成部分 */


	}
	void main() {
	    struct List* p ;

		/* 何らかの処理で p に数値のデータを読み込む */
	    /* [例] p = ( -10 , 0 , 2 , 5 , 13 , 21 , 50 , 80 , 100 , 123 ) ; */

	    print_data_range( p , 10 ,  22 ) ; /* 10≦data<22 を表示      */
	                                       /* 例: 13,21が表示される    */
	    print_data_range( p , 0 ,  100 ) ; /* 0≦data<100 を表示      */
	                                       /* 例:-10,100,123以外が表示 */
	}

3.少し複雑な文字列処理

入力された1行の文字列の中に、特定の文字列が『何個』含まれているか 数えるための関数を作りたい。下記に示したプログラムの未完成部分を 作成せよ。

	#include 

	int strcount( char* str1 , char* str2 )
	{
	    /* 未完成部分 */


	}

	char string[] = "this is a pen. that is a pencil" ;
	         /*  is :  ^^ ^^             ^^           */
	         /* pen :          ^^^            ^^^     */
	void main()
	{
	    printf( "%d\n" , strcount( string , "is" ) ) ;  /* 3が表示される */
	    printf( "%d\n" , strcount( string , "pen" ) ) ; /* 2が表示される */
	}