Powered by SmartDoc

ソフトウェア概論B (2011/12/09)
Ver. 1.0

2011年12月9日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2011/soft/soft.html
ソフトウェア概論 A2011年12月9日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

講義で利用するサンプルプログラム

icell

Download : icell.c ( SJIS 版 )

icell.c
/*
 * icell.c
 */

#include <stdio.h>
#include <stdlib.h>

/*
 *
 */

#include "xalloc.h"
#include "icell.h"

/*
 *	new_ICell : 新しい ICell を確保 ( NULL は、確保に失敗した場合.. )
 *		int value; -- この Cell が保持する整数値データ
 */

ICell *new_ICell ( int value ) {
  ICell *newObject = xalloc ( ICell );	/* 新しい ICell を確保 */

  if ( newObject != NULL ) {		/* 確保できれば.. */
	newObject -> next = NULL;		/* 個々の ICell は最初は「次」がない */
	newObject -> data = value;
	/*
newObject
   |
   |	+-------+
   +-->	|	*-------->	NULL
		+-------+
	    |value	|
		+-------+
	 */
  }

  return newObject;					/* 確保した領域へのポインター値を返す */
}

/*
 *	free_ICell
 */

void free_ICell ( ICell *object ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	xfree ( object );
  }

}

/*
 *	printf_ICell
 */

void printf_ICell ( char *format, ICell *object ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	printf ( format, object -> data );
  }
}

/*
 *	print_ICell
 */

void print_ICell ( ICell *object ) {

  printf_ICell ( "%d", object );	/* 標準の出力形式は 「%d」で.. */

}

/*
 *	append_ICell
 */

ICell	*append_ICell ( ICell *here, ICell *append ) {

  if ( here != NULL ) {
	here -> next = append;
  }

  return append;

}

/*
 *
 */
icell.c の実行結果
C:\usr\c\> icell
C:\usr\c\> 

ilist

Download : ilist.c ( SJIS 版 )

ilist.c
/*
 * ilist.c
 */

#include <stdio.h>
#include <stdlib.h>

/*
 *
 */

#include "xalloc.h"
#include "icell.h"
#include "boolean.h"
#include "ilist.h"

/*
 *	new_IList : 新しい IList を確保 ( NULL は、確保に失敗した場合.. )
 */

IList *new_IList () {
  IList *newObject = xalloc ( IList );	/* 新しい IList を確保 */

  if ( newObject != NULL ) {		/* 確保できれば.. */
	newObject -> top = NULL;		/* 個々の IList は最初は「空」になる */
  }

  return newObject;					/* 確保した領域へのポインター値を返す */
}

/*
 * isEmpty_IList
 */

Boolean isEmpty_IList ( IList *object ) {
  if ( object != NULL ) {				/* NULL でなく.. */
	if ( object -> top != NULL ) {		/* 先頭の要素があれば.. */
	  return TRUE;						/* 「真(TRUE)」を返す */
	}
  }

  return FALSE;							/* その他の場合は「偽(FALSE)」を返す */
}

/*
 *	free_IList
 */

void free_IList ( IList *object ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	ICell *cp = object -> top;		/* 先頭のデータを取り出し */

	while ( cp != NULL ) {			/* まだ要素があれば.. */
	  ICell *nx = cp -> next;		/* 次の要素を予め取り出しておいて .. */

	  free_ICell ( cp );			/* その ICell を開放し.. */
	  cp = nx;						/* 次の要素を考える.. */
	}

	xfree ( object );				/* 中身が開放されたので安心して自分の開放 */
  }

}

/*
 *	printf_IList
 */

void printf_IList ( char *format, IList *object ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	ICell *cp = object -> top;		/* 先頭のデータを取出.. */

	while ( cp != NULL ) {			/* まだ要素があれば.. */
	  printf_ICell ( format, cp );	/* その要素を出力し */
	  cp = cp -> next;				/* 次の要素をみる */
	}
  }
}

/*
 *	print_IList
 */

void print_IList ( IList *object ) {

  printf_IList ( "%d ", object );
}

/*
 *	insert_IList
 */

IList	*insert_IList ( IList *object, int data ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	ICell *cp = new_ICell ( data );	/* 新しい ICell を作成し.. */

	if ( cp != NULL ) {				/* それが作れれば.. */
	  cp -> next = object -> top;	/* その要素を先頭に挿入 */
	  object -> top = cp;
	}
  }

  return object;
}

/*
 * delete_top_IList
 */

void delete_top_IList ( IList *object ) {

  if ( object != NULL ) {
	ICell *cp = object -> top;	/* 先頭の要素 */

	if ( cp != NULL ) {				/* 先頭の ICell があれば.. */
	  object -> top = cp -> next;	/* その ICell を取り外し.. */
	  free_ICell ( cp );			/* その ICell を開放 */
	}
  }
}

/*
 *	append_IList
 */

IList	*append_IList ( IList *object, int data ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	ICell *newICell = new_ICell ( data );	/* 新しい ICell を作成 */

	if ( newICell != NULL ) {		/* 新しい ICell が作れれば.. */

		/* 追加のために、まず、最後の要素の ICell を搜す */

		ICell *last = NULL;				/* 最後の要素候補へのポインター */
		ICell *cp = object -> top;		/* 先頭の要素 */

		while ( cp != NULL )	{		/* 最後の要素をさがす */
		  last = cp;					/* 最後の要素候補を更新 */
		  cp = cp -> next;				/* 次の要素を確認 */
		}

		if ( last == NULL ) {			/* 実は List は空だった */
		  object -> top = newICell;		/* 先頭に追加 */
		} else {
		  last -> next = newICell;		/* 最後の要素の次に追加 */
		}
	}
  }

  return object;
}

/*
 * delete_end_IList
 */

void delete_end_IList ( IList *object ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
		ICell *cp = object -> top;		/* 先頭の要素 */

		if ( cp != NULL ) {		/* 要素があった場合に初めて処理開始 */

		  /* 削除のために、まず、最後の要素の前の ICell を搜す */

			ICell *pre = NULL;	/* 最後の要素の前の要素候補へのポインター */
			ICell *last = cp;	/* 最後の要素候補へのポインター */

			cp = cp -> next;

			while ( cp != NULL ) {	/* 要素がある限り.. */
			  pre = last;			/* pre は last の前 */
			  last = cp;			/* last は cp の前 */
			  cp = cp -> next;		/* cp を次の要素に.. */
			}

			if ( pre == NULL ) {	/* 要素が一つしかなかった */
			  object -> top = NULL;	/* List は空に */
			} else {
			  pre -> next = NULL;	/* 最後の要素を取り外す */
			}

			free_ICell ( last );	/* 最後の要素を開放 */
		}
  }
}

/*
 * search_IList
 */

ICell *search_IList ( IList *object, int number ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	ICell *cp = object -> top;
	while ( cp != NULL ) {			/* 要素があれば.. */
	  if ( cp -> data == number ) {	/* データを比較 */
		return cp;					/* 見付かったのでそれを返す */
	  }
	  cp = cp -> next;				/* ちがったら、次を調べる */
	}
  }

  return NULL;						/* 見付からなかった場合は NULL を返す */
}

/*
 *
 */
ilist.c の実行結果
C:\usr\c\> ilist
C:\usr\c\> 

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/12/09 sample-001.c
 */

/*
 *
 */

#include <stdio.h>
#include <stdlib.h>

/*
 *
 */

#include "boolean.h"
#include "ilist.h"

/*
 *
 */

#define	COMMAND_LINE_SIZE	1024

/*
 *
 */

int main ( void ) {
  char cmdline [ COMMAND_LINE_SIZE ];
  IList	*list = new_IList();
  int cmd = 'h';
  int number = 0;

  /*
   * 
   */

  if ( list == NULL ) {
	printf ( "List が確保できませんでしたので終了します\n" );
	exit ( -1 );	/* プログラムを終了 */
  }

  /*
   * 
   */

  while ( cmd != 'q' ) {

	/* コマンドの実行 */

	switch ( cmd ) {
	default:
	  printf ( "I don't know %c command\n", cmd );
	  // break;
	case 'h':
		printf ( "Command Help, Quit, Print, Insert #, Append #, Check, delete \
    Top, delete End, Find #\n" );
		break;
	case 'q':
		break;
	case 'p':
	  print_IList ( list );
	  printf ( "\n" );
	  break;
	case 'i':
	  insert_IList ( list, number );
	  break;
	case 'a':
	  append_IList ( list, number );
	  break;
	case 'c':
	  if ( isEmpty_IList ( list ) == FALSE ) {
		printf ( "Empty\n" );
	  } else {
		printf ( "No Empty\n" );
	  }
	  break;
	case 't':
	  delete_top_IList ( list );
	  break;
	case 'e':
	  delete_end_IList ( list );
	  break;
	case 'f':
	  if ( search_IList ( list, number ) != NULL ) {
		printf ( "Found\n" );
	  } else {
		printf ( "Not Found\n" );
	  }
	  break;
	}

	/* コマンドの入力 */

	printf ( "cmd> " );

	fgets ( cmdline, COMMAND_LINE_SIZE, stdin );	/* 一行入力 */

	cmd = cmdline[0];				/* 先頭の一文字がコマンド */

	number = atoi ( cmdline + 2 );	/* 3 文字目以後は引数 */

  }

  /*
   * 
   */

  free_IList ( list );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
p
i 10
i 20
p
a -10
a -20
p
t
p
e
p
q
sample-001.c の実行結果
C:\usr\c\> sample-001<  sample-001.in
Command Help, Quit, Print, Insert #, Append #, Check, delete Top, \
    delete End, Find #
cmd> p

cmd> i 10
cmd> i 20
cmd> p
20 10 
cmd> a -10
cmd> a -20
cmd> p
20 10 -10 -20 
cmd> t
cmd> p
10 -10 -20 
cmd> e
cmd> p
10 -10 
cmd> q
C:\usr\c\> 

xalloc

Download : xalloc.h ( SJIS 版 )

xalloc.h
/*
 * xalloc.h
 */

#ifndef __XALLOC_H__
#define __XALLOC_H__

/*
 *
 */

#define	xalloc(Type)	((Type *)malloc(sizeof(Type)))
	/* 指定した型の領域を一つ分 alloc し、かつその型にキャストして返す */

#define	xfree(PTR)		(free(PTR))

/*
 *
 */

#endif

boolean

Download : boolean.h ( SJIS 版 )

boolean.h
/*
 * boolean.h
 */

#ifndef __BOOLEAN_H__
#define __BOOLEAN_H__

/*
 *
 */

#define	FALSE	(0)				/* 偽 (0) */
#define	TRUE	(!FALSE)		/* 真 (0 以外) */

/*
 *
 */

#define	Boolean	int				/* 真偽値は、単なる整数値 */

/*
 *
 */

#endif

icell

Download : icell.h ( SJIS 版 )

icell.h
/*
 * icell.h
 */

#ifndef __ICELL_H__
#define __ICELL_H__

/*
 *
 */

typedef	struct	icell	{	/* 構造体には構造体を区別するタグ名を付ける事ができる */
  struct icell	*next;		/* 次の ICell へのポインター */
							/* 本当は「ICell *」と書きたいが、この時点では存在しないので.. */
  int data;					/* 要素 ( int 型 ) */
} ICell;

/*
 *
 */

extern ICell *new_ICell ( int value );
extern void free_ICell ( ICell *object );
extern void printf_ICell ( char *format, ICell *object );
extern void print_ICell ( ICell *object );
extern ICell	*append_ICell ( ICell *here, ICell *append );

/*
 *
 */

#endif
icell.h の実行結果
C:\usr\c\> icell
C:\usr\c\> 

ilist

Download : ilist.h ( SJIS 版 )

ilist.h
/*
 * ilist.h
 */

#ifndef __ILIST_H__
#define __ILIST_H__

/*
 *
 */

#ifndef __ICELL_H__
#include "icell.h"
#endif

#ifndef __BOOLEAN_H__
#include "boolean.h"
#endif

/*
 *
 */

typedef	struct {
  ICell	*top;
} IList;

/*
 *
 */

extern IList *new_IList ();
extern void free_IList ( IList *object );
extern void printf_IList ( char *format, IList *object );
extern void print_IList ( IList *object );
extern ICell *search_IList ( IList *object, int number );

/*
 *
 */

#endif
ilist.h の実行結果
C:\usr\c\> ilist
C:\usr\c\> 

本日の課題

課題 20111209-01

Download : 20111209-01.c ( SJIS 版 )

20111209-01.c
/*
 * 20111209-1-QQQQ.c
 */

#include <stdio.h>

/*
 *
 */

#include "icell.h"
#include "boolean.h"
#include "ilist.h"

/*
 * nth_IList
 * 	number がリストの何番目かを答える関数を作る
 *		例 1 : List が 1,2,3,4 で、number が 3 の時には、2 が答になる
 *		例 2 : List が 1,2,3,4 で、number が 1 の時には、0 が答になる
 *		例 3 : List が 1,2,3,4 で、number が 5 の時には、-1 が答になる
 */

int nth_IList ( IList *object, int number ) {

  if ( object != NULL ) {			/* NULL の可能性があるのでチェック */
	ICell *cp = object -> top;
	int nth = 0;					/* 先頭なら 0 番目 */

	while ( cp != NULL ) {			/* 要素があれば.. */
	  if ( cp -> data == number ) {	/* データを比較 */
		/* 搜し物が見付かったので... */

	/*
	**	 この部分を完成させなさい
	*/

	  }
		/* ここにはなかったので、次の場所をみる.. */

	/*
	**	 この部分を完成させなさい
	*/

	  cp = cp -> next;				/* ちがったら、次を調べる */
	}
  }

  /* 最後までみたけど見付からなかった.. */

  return -1;						/* 見付からない場合は -1 を返す */
}

/*
 *
 */

void main()
{
	IList *list = new_IList();
	int i;

	if ( list != NULL ) {
		append_IList ( list, 20 );
		append_IList ( list, 30 );
		append_IList ( list, 10 );

		print_IList ( list );
		printf ( "\n" );

		for ( i = 0; i < 50; i += 10 ) {
			printf ( "%d is %dth elements\n", i, nth_IList ( list, i ) );
		}

		free_IList ( list );
	}

}
入力例
1
2
3
4
5
6
7
8
9
0
0
1
0
1
0
1
0
0
20111209-01.c の実行結果
C:\usr\c\> 01<  01.in
20 30 10 
0 is -1th elements
10 is 2th elements
20 is 0th elements
30 is 1th elements
40 is -1th elements
C:\usr\c\> 

Links

Othello