Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/05/27 sample-001.c
 */

/*
 * 最初のプログラムは "Hello, World"
 */

#include <stdio.h>

int main ( void ) {

printf ( "Hello, World\n" );	/* "Hello, World" という文字列と改行 ( "\n" ) を表示する */

  return 0;
}
sample-001.c の実行結果
C:\usr\c\> sample-001
Hello, World
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2011/05/27 sample-002.c
 */

/*
 * おまじないだらけのプログラム
 */

#include <stdio.h>		/* <= おまじない */

int main ( void ) {		/* <= おまじない */

  printf ( "Hello, World\n" );	/* ここに何かをかくと動く */

  return 0;			/* <= おまじない */
}				/* <= おまじない */
sample-002.c の実行結果
C:\usr\c\> sample-002
Hello, World
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2011/05/27 sample-003.c
 */

/*
 * "Hello, World" を出力するが..
 */

#include <stdio.h>

void prt ( char *str ) {

  printf ( str );
}

void myMain() {

  prt ( "Hello, World\n" );	/* この部分は sample-001.c の main と同じ */

}

int main ( void ) {

  myMain();

  return 0;
}

/*

	sample-001.c の構造
		[ main -> printf ]
	sample-003.c の構造
		main -> [ myMain -> pr ] -> printf
			sample-003 の「 myMain -> pr 」の部分は sample-001 の 「myMain -> pr」と同じ
		sample-001 の main は誰からか、勝手に呼出される
			sample-003 の myMain は main から呼出される
		sample-001 の printf は、何処でも定義していない
			sample-003 の prt は自分で定義している

*/
sample-003.c の実行結果
C:\usr\c\> sample-003
Hello, World
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2011/05/27 sample-004.c
 */

/*
 * main 関数への引数
 */

#include <stdio.h>

int main ( int argc, char *argv[] ) {	// またまた、新しいおまじない

  printf ( argv[1] );	// コマンドラインの一つ目の引数が表示される

  return 0;
}
sample-004.c の実行結果
C:\usr\c\> sample-004
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2011/05/27 sample-005.c
 */

#include <stdio.h>

/*
 * 別のファイルの関数を呼出す main 関数
 */

int main () {

  prt ( "Hello, World\n" );	// sample-006.c の中に定義されている prt 関数を利用している

  return 0;
}
sample-005.c の実行結果
C:\usr\c\> sample-005
Hello, World
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2011/05/27 sample-006.c
 */

#include <stdio.h>

/*
 *
 */

void prt ( char *str ) {	/* この関数は sample-005.c の main から呼出す */

  printf ( str );

}
sample-006.c の実行結果
C:\usr\c\> cc -c sample-006.c
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2011/05/27 sample-007.c
 */

/*
 * include も printf も使かわない main
 */

int main () {

  return 0;
}
sample-007.c の実行結果
C:\usr\c\> sample-007
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2011/05/27 sample-008.c
 */

/*
 * include はないが printf を使う main
 */

int main () {

  printf ( "Hello, World\n" );

  return 0;
}
sample-008.c の実行結果
C:\usr\c\> sample-008
Hello, World
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2011/05/27 sample-009.c
 */

/*
 * include の代わりにプロトタイプ宣言をする
 */

extern int printf ( char * );	/* プロトタイプ宣言 */

/*
 *
 */

int main () {

  printf ( "Hello, World\n" );

  return 0;
}
sample-009.c の実行結果
C:\usr\c\> sample-009
Hello, World
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2011/05/27 sample-010.c
 */

/*
 * sample-005.c に prt のプロトタイプ宣言をした 
 */

extern void prt ( char * );	/* prt のプロトタイプ */

/*
 *
 */

int main () {

  prt ( "Hello, World\n" );	// sample-006.c の中に定義されている prt 関数を利用している

  return 0;
}
sample-010.c の実行結果
C:\usr\c\> sample-010
Hello, World
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2011/05/27 sample-011.c
 */

#include "prt.h"	// prt のプロトタイプの代りに prt.h を include

/*
 *
 */

int main () {

  prt ( "Hello, World\n" );	// sample-006.c の中に定義されている prt 関数を利用している

  return 0;
}
sample-011.c の実行結果
C:\usr\c\> sample-011
Hello, World
C:\usr\c\> 

prt

Download : prt.h ( SJIS 版 )

prt.h
/*
 * 2011/05/27 prt.h
 */

extern int prt ( char * );	/* プロトタイプ宣言 */

/*
 *
 */

本日の課題

課題 20110527-01

Download : 20110527-01.c ( SJIS 版 )

20110527-01.c
/*
 * 20110527-1-QQQQ.c
 *	余りを計算するプログラム
 */

#include <stdio.h>
#include <string.h>

/*
 * 余りの定義
 *	n, m が自然数の時に n mod m ( n を m で割った余り ) とは何か ( m > 0 )
 * 
 *                	n        	( m > n の時 ) 
 *      n mod m { 
 *		 	(n-m) mod m	( その他の時 )
 */

void remainder_sub ( char *n, char *m, char *mm, char *nn ) {
	/*                 ^        ^ 変化*/
	/*                                  ^^ 最初の m を記憶して、後から利用できるようにしている */ 
	/*                                             ^^ 割り始め n を覚えておく */
  if ( !strcmp ( m, "" ) ) {		/* m が 0 : 引き算が終った */

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

  } else if ( !strcmp ( n, "" ) ) {	/* n が 0 : m の方が大きかった */
        printf ( nn );					/* 余りを出力 */
  } else {

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

  }

}

/*
 *	remainder : print ( n mod m )
 */

void remainder ( char *n, char *m ) {


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

}

/*
 *	main
 */

int main()
{

  printf ( "10 mod 4 = " );
  remainder ( "**********", "****" );
  printf ( "\n" );

  printf ( "10 mod 3 = " );
  remainder ( "**********", "***" );
  printf ( "\n" );

  printf ( "10 mod 2 = " );
  remainder ( "**********", "**" );
  printf ( "\n" );

  return 0;
}

/*

  remainder ( "**********", "****" )

  remainder_sub ( "**********", "****", "****", "**********" )

  remainder_sub ( "*********", "***", "****", "**********" )

  remainder_sub ( "********", "**", "****", "**********" )

  remainder_sub ( "*******", "*", "****", "**********" )

  remainder_sub ( "******", "", "****", "**********" )
	10 - 4 -> 6

  remainder_sub ( "******", "****", "****", "******" )

  remainder_sub ( "*****", "***", "****", "******" )

  remainder_sub ( "****", "**", "****", "******" )

  remainder_sub ( "***", "*", "****", "******" )

  remainder_sub ( "**", "", "****", "******" )
	(10 - 4) - 4 -> 2

  remainder_sub ( "**", "****", "****", "**" )

  remainder_sub ( "*", "***", "****", "**" )

  remainder_sub ( "", "**", "****", "**" )
	2 < 4

  printf ( "**" );

	なので答は「**」となる
*/
20110527-01.c の実行結果
C:\usr\c\> 20110527-01
10 mod 4 = **
10 mod 3 = *
10 mod 2 = 
C:\usr\c\> 

課題 20110527-02

Download : 20110527-02.c ( SJIS 版 )

20110527-02.c
/*
 * 20210527-2-QQQQ.c
 *	ミクを歩かせて、八角形に二周目回るようにしなさい
 */

#include <stdio.h>
#include <string.h>

#include "s_walk.h"


/*
 * 引数の文字列の長さ (n) だけ turn する
 */

void n_turn( char *str ) {

	 if ( !strcmp ( str, "" ) ) {
		/* str が 空文字 ("") の時はすることがない */
	 } else {
		s_walk_turn();		/* とりあえず、1 回向きをかえて */
		n_turn ( str + 1 );	/* 残りは再帰で処理 */
	 }
}

/*
 * 一度、向きをかえてから、ニ歩前に進む
 */

void turn_and_step() {

	s_walk_turn();
	s_walk_move();
	s_walk_move();
}

/*
 * 引数の文字列の長さ (n) だけ turn_and_step を行う
 */

void n_turn_and_step( char *str ) {

	 if ( !strcmp ( str, "" ) ) {
		/* str が 空文字 ("") の時はすることがない */
	 } else {

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

	 }
}

/*
 * 八角形に歩く
 */

void walk_octagon() {


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


}

/*
 * 八角形に歩く
 */

// main関数
int main()
{
	/* 向きをかえて */

	n_turn( "**" );

	/* 二度八角形に歩く */

	walk_octagon();
	walk_octagon();

	/* 正面を向く */

	n_turn( "******" );

	return 0;
}
20110527-02.c の実行結果
C:\usr\c\> 20110527-02
Loading Models... Done.
C:\usr\c\> 

Links