Powered by SmartDoc

ソフトウェア概論A/B (2013/05/17)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

Download

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

サンプルファイル

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2013/05/17 sample-001.c
 */

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

/*
 *	文字列に 1 を加えると.. ?
 *		文字の長さが短くなる (頭の部分がなくなる..)
 */

/*
 * main
 */

int main ( void ) {

  printf ( "abcde\n" );		/* 当然 「abcde」が表示される.. */
  printf ( "abcde\n" + 1 );	/* 文字列に 1 を加えるってどうゆうこと.. ? */
  printf ( "abcde\n" + 2 );
printf ( "abcde\n" + 1 + 1 );	/* ("abcde\n" + 1) + 1 => "bcde\n" + 1 => \
    "cde\n" */

  return 0;
}
sample-001.c の実行結果
C:\usr\c>sample-001
abcde
bcde
cde
cde
C:\usr\c> 

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2013/05/17 sample-002.c
 */

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

/*
 *	void recursive ( char *string )
 *		char *string	指定した文字列からなる三角形を作る
 *			実行例
 *				recursive( "abc\n" );	
 *					->
 *						abc			"abc\n"
 *						bc			"bc\n"
 *						c			"c\n"
 *									"\n"
 *			再帰呼出しを利用
 */

void recursive ( char *string ) {

	if ( !strcmp ( string, "" ) ) {	/* もし空文字列 ( "" ) ならば */
		printf ( "" );				/* これで御仕舞い */
	} else {						/* そうでなければ、 */
		printf ( string );
		recursive ( string + 1 );	/* 再帰呼び出しする */
									/* +1 を忘れると悲惨な事に.. */
  }
}

/*
 * main
 */

int main ( void ) {

	recursive ( "abcdefg\n" );
	recursive ( "xyz\n" );

	return 0;
}
sample-002.c の実行結果
C:\usr\c>sample-002
abcdefg
bcdefg
cdefg
defg
efg
fg
g

xyz
yz
z

C:\usr\c> 

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2013/05/17 sample-003.c
 */

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

/*
 * 再帰呼出しを利用して、"Hello, World\n" を沢山出力する
 */


/*
 *	void rec_hello ( char *count )
 *		char *count	文字列を指定し、その長さで、繰り返えし回数の指数を指定
 *			与えられた文字列の長さを n とすると 2^n 回だけ出力する
 */

void rec_hello ( char *count ) {

	if ( !strcmp ( count, "" ) ) {		/* カラッポなら.. */
		printf ( "Hello, World\n" );	/* 一つだけ表示してみる */
	} else {							/* そうでなければ.. */
		rec_hello ( count + 1 );		/* 二倍にして再帰よびだし */
		rec_hello ( count + 1 );
	}
}

/*
 *	main
 */

int main ( void ) {

	rec_hello ( "****" );	/* 2^4 = 16 回出力 */

	/* 2^10 = 1024 だから、 "**********" を与えれば... */

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

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2013/05/17 sample-004.c
 */

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

/*
 *	フィボナッチ数の計算
 */

/*
 *	void fib ( char *n )
 *		char *n		n の長さで何番目の項かを表す
 *			n 番目のフィボナッチ数だけ '*' を表示する
 */

void fib ( char *n ) {

	if ( !strcmp ( n, "" ) ) {			/* カラッポ(0)なら.. */
		printf ( "*" );					/* 一つだけ : fib(0) = 1 だから */
	} else if ( !strcmp ( n, "*" ) ) {	/* 一つ(1)なら */
		printf ( "*" );					/* 一つだけ : fib(1) = 1 だから */
	} else {							/* そうでなければ.. */
		fib ( n + 1 );					/* fib ( n - 1 ) と */
		fib ( n + 2 );					/* fib ( n - 2 ) だけだす */
	}
}

/*
 *	main
 */

int main ( void ) {

  printf ( "fib 3 : " );
  fib ( "***" );
  printf ( "\n" );

  printf ( "fib 5 : " );
  fib ( "*****" ); 
  printf ( "\n" );

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

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * DATE sample-005.c
 */

#include <stdio.h>
#include <string.h>		/* strcmp に必要 */
#include "s_turtle.h"	/* 亀プログラムの場合に必要 */

/*
 * 亀プログラム
 */

/*
 * void jump_n ( char *n )
 *		char *n		足跡の長さを表す
 *			指定された長さだけ現在向いている方向に足跡を残こさず跳ねる
 */

void jump_n ( char *n ) {

	if ( !strcmp ( n, "" ) ) {
		/* n が空文字列 ("") なら何もしない */
	} else {
		s_turtle_jump();	/* とりあえず、一歩跳ねる */
		jump_n ( n + 1 );	/* 文字列を短くして、再帰呼出し */
	}
}	

/*
 *	void move_n ( char *n )
 *
 *		char *n		足跡の長さを表す
 *			指定された長さだけ現在向いている方向に足跡を残して歩く
 */

void move_n ( char *n ) {

	if ( !strcmp ( n, "" ) ) {
		/* n が空文字列 ("") なら何もしない */
	} else {
		s_turtle_move();	/* とりあえず、一歩歩く */
		move_n ( n + 1 );	/* 文字列を短くして、再帰呼出し */
	}
}

/*
 *	void turn_n ( char *n )
 *
 *		現在向いている方向から時計回りに n * 45 度向きを変える
 */

void turn_n ( char *n ) {

	if ( !strcmp ( n, "" ) ) {
		/* n が空文字列 ("") なら何もしない */
	} else {
		s_turtle_turn();	/* とりあえず、45 度向きをかえる */
		turn_n ( n + 1 );	/* 文字列を短くして、再帰呼出し */
	}

}

/*
 *	void turn_90 ( void )
 *
 *		現在向いている方向から時計回りに 90 度向きを
 *			進行方向の「右」に向きを変える
 */

void turn_90 ( void ) {

	turn_n ( "**" );
}

/*
 *	void turn_180 ( void )
 *
 *		現在向いている方向から時計回りに 180 度向きを
 *			進行方向の「後ろ」に向きを変える
 */

void turn_180(void) {

	turn_n ( "****" );
}

/*
 *	void turn_270 ( void )
 *
 *		現在向いている方向から時計回りに 270 度向きを
 *			進行方向の「左」に向きを変える
 */

void turn_270 ( void ) {

	turn_n ( "******" );
}

/*
 *	void move_n_and_turn ( char *n )
 *
 *		現在向いている方向から n 歩進んで右を向く
 *			四角形の一辺を書く
 */

void move_n_and_turn ( char *n ) {

	 move_n ( n );

	/* 向きを変える */

	turn_90();
}

/*
 *	void draw_n_sqare( char *n );
 *
 *		一辺が n の長さの四角形を書く
 */

void draw_n_sqare( char *n ) {

	 /* 「長さ n の辺を書いて右を向く」という事を 4 回繰り返す */

	move_n_and_turn(n);
	move_n_and_turn(n);
	move_n_and_turn(n);
	move_n_and_turn(n);
}

/*
 * main
 */

int main ( void ) {

	/*
	 * 最初は真中 (0,0) で上を向いている
	 */

	draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */

	turn_270();
	jump_n ( "****" );	/* 四歩ジャンプする */

	draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */

	turn_270();
	jump_n ( "****" );	/* 四歩ジャンプする */

	draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */

	turn_270();
	jump_n ( "****" );	/* 四歩ジャンプする */

	draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */

	turn_270();
	jump_n ( "****" );	/* 四歩ジャンプする */

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

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2013/05/17 sample-006.c
 */

/*
 * 文字「a」を出力する
 */

#include <stdio.h>

void main ( void ) {

	putchar ( 'a' );	/* 「a」という「文字」を画面に出力 */

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

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2013/05/17 sample-007.c
 */

/*
 * 文字版「Hello, World」
 */

#include <stdio.h>

void main ( void ) {

	putchar ( 'H' );
	putchar ( 'e' );
	putchar ( 'l' );
	putchar ( 'l' );
	putchar ( 'o' );
	putchar ( ',' );

	putchar ( ' ' );		/* 空白の出力 */

	putchar ( 'W' );
	putchar ( 'o' );
	putchar ( 'r' );
	putchar ( 'l' );
	putchar ( 'd' );

	putchar ( '\n' );		/* 改行の出力 */

}
sample-007.c の実行結果
C:\usr\c>sample-007
Hello, World
C:\usr\c> 

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2013/05/17 sample-008.c
 */

/*
 * エスケープコード (「\」)の利用
 */

#include <stdio.h>

void main ( void ) {

	 printf ( "「\\」 を出すには 「'\\\\'」とする ==> " );
	 putchar ( '\\' );
	 printf ( "\n" );

	 printf ( "「'」を出すには 「'\\''」とする ==> " );
	 putchar ( '\'' );
	 printf ( "\n" );

	 printf ( "「ビープ音」を出すには 「'\\a'」とする ==> " );
	 putchar ( '\a' );			/* ここで文字は表示されず、音が出る */
	 printf ( "\n" );

	 printf ( "「\"」を出すには 「'\"'」だけでよい ==> " );
	 putchar ( '"' );
	 printf ( "\n" );

}
sample-008.c の実行結果
C:\usr\c>sample-008
「\」 を出すには 「'\\'」とする ==> \
「'」を出すには 「'\''」とする ==> '
「ビープ音」を出すには 「'\a'」とする ==> ^G
「"」を出すには 「'"'」だけでよい ==> "
C:\usr\c> 

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2013/05/17 sample-009.c
 */

/*
 * 文字列
 */

#include <stdio.h>

void main ( void ) {

	printf ( "文字列\n" );	/* 「文字列」+「改行」が表示される */

}
sample-009.c の実行結果
C:\usr\c>sample-009
文字列
C:\usr\c> 

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2013/05/17 sample-010.c
 */

/*
 * 文字列の中のエスケープコード
 */

#include <stdio.h>

void main ( void ) {

	printf ( "エスケープコード(「\\」)の扱いは、基本文字と同じ\n" );
	printf ( "「\\」と出力したければ、「\\\\」とかけばよい\n" );
	printf ( "文字では「'」を出すのに「\\'」としたが文字列では「'」で良い\n" );
	printf ( "その代わりに文字列では「\"」を出すのには「\\\"」とする必要がある\n" );

}
sample-010.c の実行結果
C:\usr\c>sample-010
エスケープコード(「\」)の扱いは、基本文字と同じ
「\」と出力したければ、「\\」とかけばよい
文字では「'」を出すのに「\'」としたが文字列では「'」で良い
その代わりに文字列では「"」を出すのには「\"」とする必要がある
C:\usr\c> 

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2013/05/17 sample-011.c
 */

/*
 * 文字列の計算
 */

#include <stdio.h>

void main ( void ) {

	printf ( "\"abc\" に 1 を加えると \"bc\" と同じになる ==> " );
	printf ( "abc" + 1 );	/* 「bc」と表示される */
	printf ( "\n" );

	printf ( "*\"abc\" と頭に 「*」をつけると先頭の文字 ('a') になる ==> " );
	putchar ( *"abc\n" ); /* 文字列「abc」の先頭の文字「a」が表示される */
	printf ( "\n" );

	printf ( "\"abc\"[2] とお尻に 「[数値]」をつけると「『数値』番目の文字」になる ==> " );
	/* だだし、先頭(1文字目) は 0 番目であり 「n 番目」は 「n + 1 文字目」になる */

	putchar ( "abc\n"[2] ); /* 文字列「abc」の 2 番目(2+1文字目) の文字「c」が表示される */
	printf ( "\n" );

	if ( "abc"[0] == 'b' ) {
		printf ( "\"abc\"[0] と 'b' は等しいです\n" );
		printf ( "実際 \"abc\"[0] は " );
		putchar ( "abc"[0] );
		printf ( "でした\n" );
	} else {
		printf ( "\"abc\"[0] と 'b' は等しくないです\n" );
		printf ( "実際 \"abc\"[0] は " );
		putchar ( "abc"[0] );
		printf ( "でした\n" );
	}

	if ( "abc"[1] == 'b' ) {
		printf ( "\"abc\"[1] と 'b' は等しいです\n" );
		printf ( "実際 \"abc\"[1] は " );
		putchar ( "abc"[1] );
		printf ( "でした\n" );
	} else {
		printf ( "\"abc\"[1] と 'b' は等しくないです\n" );
		printf ( "実際 \"abc\"[1] は " );
		putchar ( "abc"[1] );
		printf ( "でした\n" );
	}

	if ( "abc"[3] == '\0' ) {
		printf ( "\"abc\"[3] は EOS (\\0) が入っています\n" );
	} else {
		printf ( "\"abc\"[3] は EOS (\\9) が入っていません\n" );
	}

}
sample-011.c の実行結果
C:\usr\c>sample-011
"abc" に 1 を加えると "bc" と同じになる ==> bc
*"abc" と頭に 「*」をつけると先頭の文字 ('a') になる ==> a
"abc"[2] とお尻に 「[数値]」をつけると「『数値』番目の文字」になる ==> c
"abc"[0] と 'b' は等しくないです
実際 "abc"[0] は aでした
"abc"[1] と 'b' は等しいです
実際 "abc"[1] は bでした
"abc"[3] は EOS (\0) が入っています
C:\usr\c> 

講議中に作成したプログラム

本日の課題

課題 20130517-01 : 渦巻模様 ( 10 辺 ) の絵を Turtle Graphics で書なさい

Download : 20130517-01.c ( SJIS 版 )

20130517-01.c
/*
 * 20130510-01-QQQQ.c
 *	
 */

#include <stdio.h>
#include "s_turtle.h"

/*
 *
 */

#define	EOS	'\0'	/* EOS を '\0' (End Of String) として使えるようにする */

/*
 *	draw_move ( char *str )
 *		str の長さと同じだけ前に進む
 */

void draw_move ( char *str ) {	/* str の長さと同じだけ前に進む */

	if ( *str == EOS ) {	/* str が空文字列 ( 長さ 0 ) なら.. */
		/* やる事は何もない */
	} else {				/* そうでなければ.. */
		s_turtle_move();	/* とりあえず一つだけ移動 */

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

	}

}

/*
 *	drawcoil ( char *str )
 *		str の長さの半分の回数の巻数の渦巻をかく
 */

void drawcoil ( char *str ) {

	if ( *str == EOS ) {	/* str が空文字列 ( 長さ 0 ) なら.. */
		/* やる事は何もない */
	} else {				/* そうでなければ.. */
							/* 渦の半分を書く */
							/* 渦の半分とは..
								+-----
								|
								|
							か、
									|
									|
								----+
							の事..			*/			

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


		drawcoil ( str + 1 );	/* 残りは再帰で.. */
	}
}

void main ( void ) {

   drawcoil ( "0123456789" );	/* 5 重の渦巻を書く */

}
20130517-01.c の実行結果
C:\usr\c\> 20130517-01-QQQQ
C:\usr\c\> 
表示結果

Links