Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/07/01 sample-001.c
 */

/*
 *	連続した引数を間接的に参照する
 */

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

/*
 *
 */

void print_data_while_positive ( int *pv ) {

  if ( *pv <= 0 ) {		/* 値が負だった */
		/* なにもすることはない */

	  /*
			+-----------+
			|	3		|
			+-----------+
			|	4		|
			+-----------+
			|	9		|
			+-----------+
			|	12		|
			+-----------+
			|	-1		|	<- pv : 最後を指している
			+-----------+
	  */


  } else {
	s_print_int ( *pv );					/* とりあえず、一個出力 */
	s_print_string ( " " );					/* 間に空白を入れて.. */
	print_data_while_positive ( pv + 1 );	/* 残りは再帰で */

	  /*
			+-----------+
			|	3		|
			+-----------+
	 *pv =>	|	4		|	<- pv : 途中を指している
			+-----------+
			|	9		|	<- pv + 1 : 残りを指している
			+-----------+
			|	12		|
			+-----------+
			|	-1		|
			+-----------+
	  */

  }

}

/*
 *
 */

void print_many_args ( int v, ... ) {		/* ... は、幾つ引数があるかわからないという事.. */

	print_data_while_positive ( &v );	/* 複数の引数の先頭のポインターを渡す */
	s_print_newline();

	  /*
			+-----------+
	  v =>	|	3		| <- &v
			+-----------+
			|	4		|
			+-----------+
			|	9		|
			+-----------+
			|	12		|
			+-----------+
			|	-1		|
			+-----------+
	  */

}

/*
 *
 */

int main ( void ) {

  print_many_args ( 3, 4, 9, 12, -1 );

	  /*
			+-----------+
	引数	|	3		|
			+-----------+
			|	4		|
			+-----------+
			|	9		|
			+-----------+
			|	12		|
			+-----------+
			|	-1		|
			+-----------+
	  */

  print_many_args ( 9, 2, 8, -2, 3, 5, -1 );

	  /*
			+-----------+
	引数	|	9		|
			+-----------+
			|	2		|
			+-----------+
			|	8		|
			+-----------+
			|	-2		|
			+-----------+
			|	3		|
			+-----------+
			|	5		|
			+-----------+
			|	-1		|
			+-----------+
	  */

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c\> ./sample-001
3 4 9 12 
9 2 8 
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2011/07/01 sample-002.c
 */

/*
 *	階乗の計算 ( 数学的な解釈 )
 */

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

/*
 *							1					( n == 1 の時 )	: 規則 1
 *	factrial ( n ) = {
 *						n * factrial ( n - 1 )	( n > 1 の時 )	: 規則 2
 */

int factrial ( int n ) {

  if ( n == 1 ) {					/* n == 1 なので.. */
	return 1;						/* 規則 1 を使う */
  } else {							/* それ以外は.. ( n > 1 だろうから.. ) */
	return n * factrial ( n - 1 );	/* 規則 2 を使う */
  }
}

/*
 *
 */

int main ( void ) {

  s_print_string ( "4! = " );
  s_print_int ( factrial ( 4 ) );
  s_print_newline();

/*
	数学的解釈
		f ( 4 )										( 最初の呼出 )
			=> 4 * f ( 3 )							( 4 > 1 なので 規則 2 を使う )
			=> 4 * ( 3 * f ( 2 ) )					( 3 > 1 なので 規則 2 を使う )
			=> 4 * ( 3 * ( 2 * f ( 1 ) ) )			( 2 > 1 なので 規則 2 を使う )
			=> 4 * ( 3 * ( 2 * 1 ) )				( 1 == 1 なので 規則 1 を使う )
			=> 4 * ( 3 * 2 )						( 後は順に計算するだけ )
			=> 4 * 6
			=> 24
*/

  s_print_string ( "6! = " );
  s_print_int ( factrial ( 6 ) );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c\> ./sample-002
4! = 24
6! = 720
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2011/07/01 sample-003.c
 */

/*
 *	階乗の計算 ( メモリモデル的解釈 )
 */

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

/*
 *
 */

int factrial ( int n ) {

  s_print_string ( "メモリ : " );
  s_print_hex ( &n );
  s_print_string ( " -> " );
  s_print_int ( n );
  s_print_newline();

  if ( n == 1 ) {
	return 1;
  } else {
	return n * factrial ( n - 1 );
  }
}

/*
 *
 */

int main ( void ) {

  s_print_string ( "4! = " );
  s_print_int ( factrial ( 4 ) );
  s_print_newline();

/*
	メモリモデル
		f ( 4 )
			+---------------+
		n=>	|	4			|
			+---------------+

			=> f ( 3 )
			+---------------+
			|	4			|
			+---------------+
			|	?			|
			+---------------+
		n=>	|	3			|
			+---------------+

			=> f ( 2 )
			+---------------+
			|	4			|
			+---------------+
			|	?			|
			+---------------+
			|	3			|
			+---------------+
			|	?			|
			+---------------+
		n=>	|	2			|
			+---------------+

			=> f ( 1 )
			+---------------+
			|	4			|
			+---------------+
			|	?			|
			+---------------+
			|	3			|
			+---------------+
			|	?			|
			+---------------+
			|	2			|
			+---------------+
			|	?			|
			+---------------+
		n=>	|	1			|
			+---------------+

			=> return 1;
			=> 1

			+---------------+
			|	4			|
			+---------------+
			|	?			|
			+---------------+
			|	3			|
			+---------------+
			|	?			|
			+---------------+
		n=>	|	2			|
			+---------------+

			=> return n * 1;
				=> return 2 * 1;
				=> return 2;
			=> 2

			+---------------+
			|	4			|
			+---------------+
			|	?			|
			+---------------+
		n=>	|	3			|
			+---------------+

			=> return n * 2;
				=> return 3 * 2;
				=> return 6;
			=> 6

			+---------------+
		n=>	|	4			|
			+---------------+

			=> return n * 6;
				=> return 4 * 6;
				=> return 24;
			=> 24

*/

  s_print_string ( "6! = " );
  s_print_int ( factrial ( 6 ) );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-003.c の実行結果
C:\usr\c\> ./sample-003
4! = メモリ : bff9ce10 -> 4
メモリ : bff9cdf0 -> 3
メモリ : bff9cdd0 -> 2
メモリ : bff9cdb0 -> 1
24
6! = メモリ : bff9ce10 -> 6
メモリ : bff9cdf0 -> 5
メモリ : bff9cdd0 -> 4
メモリ : bff9cdb0 -> 3
メモリ : bff9cd90 -> 2
メモリ : bff9cd70 -> 1
720
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2011/07/01 sample-004.c
 */

/*
 *	ポインター型変数のポインター値
 */

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

/*
 *
 */

#define	EOS	'\0'

/*
 *
 */

void print_many_string_args_while_empty ( char *ptr[] ) 
{
  if ( *ptr[0] == EOS ) {		/* 空文字列が与えられた */
	/* なにもする必要はない */

  /*
		+-----------+										+-----+
		|	*-------+------------------------------------->	| 'a' |
		+-----------+							+-----+		+-----+
		|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+	+-----+		+ '日'+		+-----+		+-----+
ptr ->	|	*-------+->	| \0  |		|	  |		| '3' |		|'\0' |
		+-----------+	+-----+		+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

  } else {						/* プリントするものがある */
	s_print_string ( ptr[0] );	/* 先頭の文字列を出力 */
	s_print_newline();
	print_many_string_args_while_empty ( ptr + 1 );	/* 残りを出力 */

  /*
		+-----------+										+-----+
ptr  ->	|	*-------+------------------------------------->	| 'a' |	<- ptr[0]
		+-----------+							+-----+		+-----+
ptr+1->	|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+	+-----+		+ '日'+		+-----+		+-----+
		|	*-------+->	| \0  |		|	  |		| '3' |		|'\0' |
		+-----------+	+-----+		+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

  }
}

/*
 *
 */

void print_many_string_args ( char *top, ... ) {	/* 引数が沢山 */

  print_many_string_args_while_empty ( &top );

  /*
		+-----------+										+-----+
 top =>	|	*-------+------------------------------------->	| 'a' |
		+-----------+							+-----+		+-----+
		|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+	+-----+		+ '日'+		+-----+		+-----+
		|	*-------+->	| \0  |		|	  |		| '3' |		|'\0' |
		+-----------+	+-----+		+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

}

/*
 *
 */

int main ( void ) {

  print_many_string_args ( "abc", "12345", "日本語", "" );
  s_print_newline();

  /*
		+-----------+										+-----+
		|	*-------+------------------------------------->	| 'a' |
		+-----------+							+-----+		+-----+
		|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+	+-----+		+ '日'+		+-----+		+-----+
		|	*-------+->	| \0  |		|	  |		| '3' |		|'\0' |
		+-----------+	+-----+		+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

  print_many_string_args ( "1111", "bbb", "漢漢漢漢漢", "A", "" );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c\> ./sample-004
abc
12345
日本語

1111
bbb
漢漢漢漢漢
A

C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2011/07/01 sample-005.c
 */

/*
 *	何も指さないポインター値 (NULL)
 */

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

/*
 *
 */

#define	EOS	'\0'

/*
 *
 */

void print_many_string_args_while_empty ( char *ptr[] ) 
{
  if ( ptr[0] == NULL ) {		/* 何も指すないポインタ値(NULL)が指定された */
	/* なにもする必要はない */

  /*
		+-----------+										+-----+
		|	*-------+------------------------------------->	| 'a' |
		+-----------+							+-----+		+-----+
		|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+				+ '日'+		+-----+		+-----+
ptr ->	|	NULL    | <= ptr[0]		|	  |		| '3' |		|'\0' |
		+-----------+				+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

  } else {						/* プリントするものがある */
	s_print_string ( ptr[0] );	/* 先頭の文字列を出力 */
	s_print_newline();
	print_many_string_args_while_empty ( ptr + 1 );	/* 残りを出力 */

  /*
		+-----------+										+-----+
ptr  ->	|	*-------+------------------------------------->	| 'a' |	<- ptr[0]
		+-----------+							+-----+		+-----+
ptr+1->	|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+				+ '日'+		+-----+		+-----+
		|	NULL    |				|	  |		| '3' |		|'\0' |
		+-----------+				+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

  }
}

/*
 *
 */

void print_many_string_args ( char *top, ... ) {	/* 引数が沢山 */

  print_many_string_args_while_empty ( &top );

  /*
		+-----------+										+-----+
 top =>	|	*-------+------------------------------------->	| 'a' |
		+-----------+							+-----+		+-----+
		|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+	+-----+		+ '日'+		+-----+		+-----+
		|	*-------+->	| \0  |		|	  |		| '3' |		|'\0' |
		+-----------+	+-----+		+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

}

/*
 *
 */

int main ( void ) {

  print_many_string_args ( "abc", "12345", "日本語", NULL );
  s_print_newline();

  /*
		+-----------+										+-----+
		|	*-------+------------------------------------->	| 'a' |
		+-----------+							+-----+		+-----+
		|	*-------+------------------------>	| '1' |		| 'b' |
		+-----------+				+-----+		+-----+		+-----+
		|	*-------+------------->	|	  |		| '2' |		| 'c' |
		+-----------+	+-----+		+ '日'+		+-----+		+-----+
		|	*-------+->	| \0  |		|	  |		| '3' |		|'\0' |
		+-----------+	+-----+		+-----+		+-----+		+-----+
									|	  |		| '4' |
									+ '本'+		+-----+
									|	  |		| '5' |
									+-----+		+-----+
									|	  |		|'\0' |
									+ '語'+		+-----+
									|	  |
									+-----+
									|'\0' |
									+-----+
   */

  print_many_string_args ( "1111", "bbb", "漢漢漢漢漢", "A", NULL );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-005.c の実行結果
C:\usr\c\> ./sample-005
abc
12345
日本語

1111
bbb
漢漢漢漢漢
A

C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2011/07/01 sample-006.c
 */

/*
 *	main 関数の引数
 */

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

/*
 *
 */

void print_many_string_args_while_empty ( int argc, char *argv[]  ) {

  if ( argc <= 0 ) {			/* 引数の個数 ( 0 個なら終 ) で終了判定 */
	/* 何もする必要はない */
  } else {						/* プリントする文字列がある */
	s_print_string ( argv[0] );	/* 先頭の文字列を出力 */
	s_print_newline();
	print_many_string_args_while_empty ( argc - 1, argv + 1 );
  }
}

/*
 *
 */

int main ( int argc, char *argv[] ) {

/*

  sample-006 abc 123 uvwxyz の時

			引数
        +-----------+
argc => |    4      |	<= 「引数の個数 + 1」が入っている
		+-----------+   +-----------+										+-----+
argv => |	*-------+->	|	*-------+------------------------------------->	| \
    's' | <= argv[0][0]
		+-----------+	+-----------+							+-----+		+-----+
						|	*-------+------------------------->	| 'a' |		| 'a' | <= argv[0][1]
						+-----------+				+-----+		+-----+		+-----+
						|	*-------+------------->	| '1' |		| 'b' |		| 'm' |
						+-----------+	+-----+		+-----+		+-----+		+-----+
			argv[3] =>	|	*-------+->	| 'u' |		| '2' |		| 'c' |		| 'p' |
						+-----------+	+-----+		+-----+		+-----+		+-----+
						|	NULL	|	| 'v' |		| '3' |		| EOS |		| 'l' |
						+-----------+	+-----+		+-----+		+-----+		+-----+
										| 'w' |		| EOS |					| 'e' |
										+-----+		+-----+					+-----+
										| 'x' |								| '-' |
										+-----+								+-----+
										| 'y' |	<= argv[3][4]				| '0' |
										+-----+								+-----+
										| 'z' |								| '0' |
										+-----+								+-----+
										| EOS |								| '6' |
										+-----+								+-----+
																			| '.' |
																			+-----+
																			| 'e' |
																			+-----+
																			| 'x' |
																			+-----+
																			| 'e' |
																			+-----+
																			| EOS |
																			+-----+

*/


  /*
   *	引数 argc に、コマンドラインの引数の個数 + 1 が入っているので、それを利用する
   */

  print_many_string_args_while_empty ( argc, argv );

  return 0;
}

/*
 *
 */
sample-006.c の実行結果
C:\usr\c\> sample-006 abc 12345 日本語 zzz
sample-006.exe
abc
12345
日本語
zzz
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2011/07/01 sample-007.c
 */

/*
 *	main 関数の引数
 */

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

/*
 *
 */

void print_many_string_args_while_null ( char *argv[]  ) {

  if ( *argv == NULL ) {		/* 最後の要素 ( NULL なら最後 ) で終了判定 */
	/* 何もする必要はない */
  } else {						/* プリントする文字列がある */
	s_print_string ( argv[0] );	/* 先頭の文字列を出力 */
	s_print_newline();
	print_many_string_args_while_null ( argv + 1 );
  }
}

/*
 *
 */

int main ( int argc, char *argv[] ) {

/*

  sample-006 abc 123 uvwxyz の時

			引数
        +-----------+
argc => |    4      |	<= 「引数の個数 + 1」が入っている
		+-----------+   +-----------+										+-----+
argv => |	*-------+->	|	*-------+------------------------------------->	| \
    's' | <= argv[0][0]
		+-----------+	+-----------+							+-----+		+-----+
						|	*-------+------------------------->	| 'a' |		| 'a' | <= argv[0][1]
						+-----------+				+-----+		+-----+		+-----+
						|	*-------+------------->	| '1' |		| 'b' |		| 'm' |
						+-----------+	+-----+		+-----+		+-----+		+-----+
			argv[3] =>	|	*-------+->	| 'u' |		| '2' |		| 'c' |		| 'p' |
						+-----------+	+-----+		+-----+		+-----+		+-----+
	最後に NULL がある	|	NULL	|	| 'v' |		| '3' |		| EOS |		| 'l' |
						+-----------+	+-----+		+-----+		+-----+		+-----+
										| 'w' |		| EOS |					| 'e' |
										+-----+		+-----+					+-----+
										| 'x' |								| '-' |
										+-----+								+-----+
										| 'y' |	<= argv[3][4]				| '0' |
										+-----+								+-----+
										| 'z' |								| '0' |
										+-----+								+-----+
										| EOS |								| '6' |
										+-----+								+-----+
																			| '.' |
																			+-----+
																			| 'e' |
																			+-----+
																			| 'x' |
																			+-----+
																			| 'e' |
																			+-----+
																			| EOS |
																			+-----+

*/


  /*
   *	引数 argv には、コマンドラインの引数だけなく、最後に NULL も入っているので、それを利用する。
   */

  print_many_string_args_while_null ( argv );

  return 0;
}

/*
 *
 */
sample-007.c の実行結果
C:\usr\c\> sample-007 abc 12345 日本語 zzz
sample-007.exe
abc
12345
日本語
zzz
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2011/07/01 sample-008.c
 */

/*
 *	main 関数の引数
 */

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

/*
 *
 */

void hello ( char *now  ) {

  if ( !strcmp ( now, "朝" ) ) {	/* 「朝」だったら.. */
	s_print_string ( "おはようございます\n" );
  } else if ( !strcmp ( now, "夜" ) ) {	/* 「夜」だったら.. */
	s_print_string ( "こんばんは\n" );
  } else {			/* 多分、「昼」なんだろう.. */
	s_print_string ( "こんにちは\n" );
  }
}

/*
 *
 */

int main ( int argc, char *argv[] ) {

  /*
   * argc の値をみることによって、引数の個数を知る事ができる
   */

  if ( argc - 1 == 1 ) {	/* 引数が一つだけ */
	hello ( argv[1] );		/* 最初の引数を関数に渡す */
  } else {
	s_print_string ( "引数は「朝」「夜」「昼」の一つを指定してください\n" );
  }

  return 0;
}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c\> sample-008 朝
おはようございます
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2011/07/01 sample-009.c
 */

/*
 *	main 関数の引数
 */

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

/*
 *	
 */

#define	EOS	'\0'

/*
 *	atoi : 「数字列」を十進数と見做してた時の「数値」を返す
 */

/*
 *	0 : "12345"
 *		=> 0 * 10 + '1' - '0' : "2345"
 *		== 1 : "2345"
 *			=> 1 * 10 + '2' - '0' : "345"
 *			== 12 : "345"
 *				=> 12 * 10 + '3' - '0' : "45"
 *				== 123 : "45"
 *					=> 123 * 10 + '4' - '0' : "5"
 *					== 1234 : "5"
 *						=> 1234 * 10 + '5' - '0' : ""
 *						== 12345 : ""
 *						<= 12345
 *					<= 12345
 *				<= 12345
 *			<= 12345
 *		<= 12345
 *	12345
 *
 */

int atoi_sub ( int value, char *string ) {

  if ( *string == EOS ) {
	return value;
  } else {
	return atoi_sub ( value * 10 + string[0] - '0', string + 1 );
  }

}

int atoi ( char *string ) {

  return atoi_sub ( 0, string );
}

/*
 *
 */

int main ( int argc, char *argv[] ) {

  /*
   * argc の値をみることによって、引数の個数を知る事ができる
   */

  switch ( argc - 1 ) {
  case 1:							/* 引数が一つ */
	s_print_string ( argv[1] );		/* 計算は不要 */
	break;
  case 3:
	switch ( argv[2][0] ) {			/* 二つ目の引数は、演算子かも */
	case '+':						/* '+' なら.. */
	 s_print_int ( atoi( argv[1] ) + atoi ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を整数値として足し算 */
	  break;
	case '-':						/* '-' なら.. */
	 s_print_int ( atoi( argv[1] ) - atoi ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を整数値として引き算 */
	  break;
	case '*':						/* '*' なら.. */
	 s_print_int ( atoi( argv[1] ) * atoi ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を整数値として掛け算 */
	  break;
	case '/':						/* '/' なら.. */
	 s_print_int ( atoi( argv[1] ) / atoi ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を整数値として割り算 */
	  break;
	case '%':						/* '%' なら.. */
	 s_print_int ( atoi( argv[1] ) % atoi ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を整数値として余りの計算 */
	  break;
	default:
	  s_print_string ( "引数は「数 演算子 数」の三つを指定する" );
	  break;
	}
	s_print_newline();
	break;
  defaut:		/* 何れでもない */
	s_print_string ( "引数は「数 演算子 数」の三つを指定する\n" );
	break;
  }

  return 0;
}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c\> sample-009 123 + 89
212
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2011/07/01 sample-009.c
 */

/*
 *	main 関数の引数
 */

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

/*
 *	
 */

#define	EOS	'\0'

/*
 * strlne ( char *string ) : 文字列の長さを返す
 */

int strlen ( char *string ) {

  if ( *string == EOS ) {				/* 空文字列ならば.. */
	return 0;							/* 長さは 0 */
  } else {								/* そうでなければ */
	return 1 + strlen ( string + 1 );	/* 先頭を取り除いた文字列の長さに 1 を加えればよい */
  }

}

/*
 *
 */

int main ( int argc, char *argv[] ) {

  /*
   * argc の値をみることによって、引数の個数を知る事ができる
   */

  if ( argc - 1 == 1 ) {		/* 引数が 1 つの場合 */
	return strlen ( argv[1] );	/* 一つしかない引数の文字列の長さを status として返す */
  } else {						/* それ以外はエラーにする */
	return -1;					/* 文字列の長さが負になることはないので、エラーだと判る */
  }

  return 0;
}

/*
 *
 */
sample-010.c の実行結果
C:\usr\c\> check abc
123 の長さは 3 でした
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2011/07/01 sample-011.c
 */

/*
 *	再三「Hello, World」
 */

#include <stdio.h>		/* 他のファイルを取り込む命令 : printf の宣言がふくまれる .. */

/*
 *	main
 */

int main ( int argc, char *argv[] ) {	/* 引数にはコマンドラインの情報が与えられる */

  printf ( "Hello, World\n" );			/* printf は文字列を出力する、ライブラリ関数 */
										/* 文字列は、文字の並びで、最後には EOS がある */ 
										/* 引数に文字列を指定すると、文字ポインター型の値が渡される */

  return 0;								/* main は int 型の値を返し、それは stauts となる */
}

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

本日の課題

課題 20110701-01

Download : 20110701-01.c ( SJIS 版 )

20110701-01.c
/*
 * 20110701-1-QQQQ.c
 *	コマンド引数で与えた式を数が八進数だとして計算して出力しなさい
 */

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

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

/*
 *	
 */

#define	EOS	'\0'

/*
 *	atoo : 「数字列」を八進数と見做してた時の「数値」を返す
 */


int atoo_sub ( int value, char *string ) {

  if ( *string == EOS ) {
	return value;
  } else {

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

  }

}

int atoo ( char *string ) {

  return atoo_sub ( 0, string );
}

/*
 *
 */

int main ( int argc, char *argv[] ) {

  /*
   * argc の値をみることによって、引数の個数を知る事ができる
   */

  switch ( argc - 1 ) {
  case 1:							/* 引数が一つ */
	s_print_string ( argv[1] );		/* 計算は不要 */
	break;
  case 3:
	switch ( argv[2][0] ) {			/* 二つ目の引数は、演算子かも */
	case '+':						/* '+' なら.. */
	 s_print_oct ( atoo( argv[1] ) + atoo ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を八進数値として足し算 */
	  break;
	case '-':						/* '-' なら.. */
	 s_print_oct ( atoo( argv[1] ) - atoo ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を八進数値として引き算 */
	  break;
	case '*':						/* '*' なら.. */
	 s_print_oct ( atoo( argv[1] ) * atoo ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を八進数値として掛け算 */
	  break;
	case '/':						/* '/' なら.. */
	 s_print_oct ( atoo( argv[1] ) / atoo ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を八進数値として割り算 */
	  break;
	case '%':						/* '%' なら.. */
	 s_print_oct ( atoo( argv[1] ) % atoo ( argv[3] ) );		/* \
    一つ目と三つ目を夫々を八進数値として余りの計算 */
	  break;
	default:
	  s_print_string ( "引数は「数 演算子 数」の三つを指定する" );
	  break;
	}
	s_print_newline();
	break;
  defaut:		/* 何れでもない */
	s_print_string ( "引数は「数 演算子 数」の三つを指定する\n" );
	break;
  }

  return 0;
}

/*
 *
 */
20110701-01.c の実行結果
C:\usr\c\> 01 123 - 45
56
C:\usr\c\>