Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2012/09/28 sample-001.c
 */

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

/*
 *
 */

int assign_variable ( int n ) {

  /* n の値を参照 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

  n = n - 1;		/* 代入 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

  n = n - 1;		/* 代入 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

  n = n - 1;		/* 代入 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

  n = n - 1;		/* 代入 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

  n = n - 1;		/* 代入 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

}

/*
 *		
 */

void function_argument ( int n ) {

  /* n の値を参照 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

  if ( n > 0 ) {
	function_argument ( n - 1 );
  }

}

/*
 *
 */

int main ( void ) {

  /*
   * assign_variable
   */

  s_print_string ( "assign_variable ( 5 )\n" );
  assign_variable ( 5 );

  /*
   *
   */

  s_print_newline();

  /*
   * function_argument ( 5 );
   */

  s_print_string ( "function_argument ( 5 )\n" );
  function_argument ( 5 );

  /*
   *
   */

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c>sample-001
assign_variable ( 5 )
n = 5
n = 4
n = 3
n = 2
n = 1
n = 0

function_argument ( 5 )
n = 5
n = 4
n = 3
n = 2
n = 1
n = 0
C:\usr\c> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2012/09/28 sample-002.c
 */

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

/*
 *
 */

int argument_variable ( int n ) {

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

}

/*
 *
 */

int local_variable ( void ) { /* 引数はないので「void」を指定 */
  int n;		/* 局所変数「n」の型宣言( n は int 型 ) */

  n = 5;		/* 代入によって値(5)を指定 */

				/* それ以外は、argument_variable と同じ */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_newline();

}

/*
 *		
 */

int main ( void ) {

  /*
   * 引数による 「5」の出力
   */

	argument_variable ( 5 );	/* 実引数「5」を指定する */

  /*
   * 局所変数による「5」の出力
   */

   local_variable();			/* 実引数は指定しない/する必要がない/できない */

   /*
    *
    */

  return 0;
}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c>sample-002
n = 5
n = 5
C:\usr\c> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2012/09/28 sample-003.c
 */

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

/*
 * input - process - output
 */

/*
 *	結果の出力
 */

void result_out ( int m, int n, char *message, int result ) {

	s_print_int ( m );
	s_print_string ( " と " );
	s_print_int ( n );
	s_print_string ( " の" );
	s_print_string ( message );
	s_print_string ( "は " );
	s_print_int ( result );
	s_print_string ( " です。" );
	s_print_newline();

}

/*
 * main
 */

int main ( void ) {
	int m;	/* 一つ目の整数を納める */
	int n;	/* 二つ目の整数を納める */
	int wa;	/* 和の計算結果を納める */

	/*
	 * 入力
	 */

	/* 一つ目の整数の入力 */
	s_print_string ( "m の値を入力してください : " );
	m = s_input_int();		/* m に、キーボードから一つ目の整数を入力し代入 */

	/* 二つ目の整数の入力 */
	s_print_string ( "n の値を入力してください : " );
	n = s_input_int();		/* n に、キーボードから二つ目の整数を入力し代入 */

	/*
	 * 処理
	 */

	/* 和の計算 */
	wa = m + n;			/* 二つの整数の和を計算し、変数 wa に代入 */

	/*
	 * 出力
	 */

	/* 結果の出力 */
	result_out ( m, n, "和", wa );

	return 0;
}

/*
 *
 */
入力例
12
5
sample-003.c の実行結果
C:\usr\c>sample-003<  sample-003.in
m の値を入力してください : 12
n の値を入力してください : 5
12 と 5 の和は 17 です。
C:\usr\c> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2012/09/28 sample-004.c
 */

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

/*
 *	再帰を利用した sum
 */

int sum ( int n ) {

	if ( n > 0 ) {
		return sum ( n - 1 ) + n;
	} else {
		return 1;
	}

}

/*
 *
 */

int main ( void ) {

	int m;	/* 一つ目の整数を納める */
	int s;	/* 総和の計算結果を納める */

	/*
	 * 入力
	 */

	/* 一つ目の整数の入力 */
	s_print_string ( "n の値を入力してください : " );
	n = s_input_int();		/* n に、キーボードから一つ目の整数を入力し代入 */

	/*
	 * 処理
	 */

	s = sum ( n );

	/*
	 * 出力
	 */

	s_print_int ( n );
	s_print_string ( " までの総和は " );
	s_print_int ( s );
	s_print_string ( " です。" );
	s_print_newline();

	/*
	 *
	 */

  return 0;
}

/*
 *
 */
入力例
10
sample-004.c の実行結果
C:\usr\c>sample-004<  sample-004.in
m の値を入力してください : 10
n の値を入力してください : 134516608
10 と 134516608 の和は 134516618 です。
C:\usr\c> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2012/09/28 sample-005.c
 */

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

/*
 *	while を利用した sum
 */

int sum ( int n ) {
	int resutl = 0;

	while ( n > 0 ) {
		result = result + n;
		n = n - 1 ;
	}

	return result;
}

/*
 *
 */

int main ( void ) {

	int m;	/* 一つ目の整数を納める */
	int s;	/* 総和の計算結果を納める */

	/*
	 * 入力
	 */

	/* 一つ目の整数の入力 */
	s_print_string ( "n の値を入力してください : " );
	n = s_input_int();		/* n に、キーボードから一つ目の整数を入力し代入 */

	/*
	 * 処理
	 */

	s = sum ( n );

	/*
	 * 出力
	 */

	s_print_int ( n );
	s_print_string ( " までの総和は " );
	s_print_int ( s );
	s_print_string ( " です。" );
	s_print_newline();

	/*
	 *
	 */

  return 0;
}

/*
 *
 */
入力例
10
sample-005.c の実行結果
C:\usr\c>sample-005<  sample-005.in
m の値を入力してください : 10
n の値を入力してください : 134516608
10 と 134516608 の和は 134516618 です。
C:\usr\c> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2012/09/28 sample-006.c
 */

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

/*
 *	2 進数 / 10 進数 / 16 進数
 */

int main ( void ) {

	/*
	 * 0
	 */

	s_print_string ( "00000 " );
	s_print_int ( 0 );
	s_print_string ( " " );
	s_print_hex ( 0 );
	s_print_newline();

	/*
	 * 1
	 */

	s_print_string ( "00001 " );
	s_print_int ( 1 );
	s_print_string ( " " );
	s_print_hex ( 1 );
	s_print_newline();

	/*
	 * 2
	 */

	s_print_string ( "00010 " );
	s_print_int ( 2 );
	s_print_string ( " " );
	s_print_hex ( 2 );
	s_print_newline();

	/*
	 * 3
	 */

	s_print_string ( "00011 " );
	s_print_int ( 3 );
	s_print_string ( " " );
	s_print_hex ( 3 );
	s_print_newline();

	/*
	 * 4
	 */

	s_print_string ( "00100 " );
	s_print_int ( 4 );
	s_print_string ( " " );
	s_print_hex ( 4 );
	s_print_newline();

	/*
	 * 9
	 */

	s_print_string ( "01001 " );
	s_print_int ( 9 );
	s_print_string ( " " );
	s_print_hex ( 9 );
	s_print_newline();

	/*
	 * 10
	 */

	s_print_string ( "01010 " );
	s_print_int ( 10 );
	s_print_string ( " " );
	s_print_hex ( 10 );
	s_print_newline();

	/*
	 * 11
	 */

	s_print_string ( "01011 " );
	s_print_int ( 11 );
	s_print_string ( " " );
	s_print_hex ( 11 );
	s_print_newline();

	/*
	 * 12
	 */

	s_print_string ( "01100 " );
	s_print_int ( 12 );
	s_print_string ( " " );
	s_print_hex ( 12 );
	s_print_newline();

	/*
	 * 15
	 */

	s_print_string ( "01111 " );
	s_print_int ( 15 );
	s_print_string ( " " );
	s_print_hex ( 15 );
	s_print_newline();

	/*
	 * 16
	 */

	s_print_string ( "10000 " );
	s_print_int ( 16 );
	s_print_string ( " " );
	s_print_hex ( 16 );
	s_print_newline();

	/*
	 * 17
	 */

	s_print_string ( "10001 " );
	s_print_int ( 17 );
	s_print_string ( " " );
	s_print_hex ( 17 );
	s_print_newline();

	/*
	 * 20
	 */

	s_print_string ( "10100 " );
	s_print_int ( 20 );
	s_print_string ( " " );
	s_print_hex ( 20 );
	s_print_newline();

	/*
	 * 40
	 */

	s_print_string ( "101000 " );
	s_print_int ( 40 );
	s_print_string ( " " );
	s_print_hex ( 40 );
	s_print_newline();

  return 0;
}

/*
 *
 */
sample-006.c の実行結果
C:\usr\c>sample-006
00000 0 0
00001 1 1
00010 2 2
00011 3 3
00100 4 4
01001 9 9
01010 10 a
01011 11 b
01100 12 c
01111 15 f
10000 16 10
10001 17 11
10100 20 14
101000 40 28
C:\usr\c> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2012/09/28 sample-007.c
 */

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

/*
 *	10 進 to 2 進数
 */

void bin_print ( int n ) {

  if ( n != 0 ) {
	bin_print ( n / 2 );
	s_print_int ( n % 2 );
  }

}

/*
 *
 */

void print_int_and_bin ( int n ) {

  s_print_int ( n );
  s_print_string ( " = " );
  bin_print ( n );
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  print_int_and_bin ( 1 );
  print_int_and_bin ( 2 );
  print_int_and_bin ( 3 );
  print_int_and_bin ( 10 );
  print_int_and_bin ( 100 );

  return 0;
}

/*
 *
 */
sample-007.c の実行結果
C:\usr\c>sample-007
1 = 1
2 = 10
3 = 11
10 = 1010
100 = 1100100
C:\usr\c> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2012/09/28 sample-008.c
 */

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

/*
 *	2 のべき乗の計算 (再帰版)
 *
  *   2^n == power( n )
  *           もし n が 0 の時は 1 になる
  *           そうでなければ、
  *                       2^n == 2^(n-1) * 2
  *                           == 2^(n-1) + 2^(n-1)
  *                            == power( n-1 )+power( n-1 )
 */

int power ( int n ) {

	s_print_string ( "Call Power\n" );

	if ( n > 0 ) {
		return power ( n - 1 ) + power ( n - 1 );
	} else {		/* おそらく n は 0 */
		return 1;
	}

}

/*
 *
 */

int main ( void ) {

  s_print_int ( power ( 3 ) );
  s_print_newline(); 

  return 0;
}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c>sample-008
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
Call Power
8
C:\usr\c> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2012/09/28 sample-009.c
 */

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

/*
 *	2 のべき乗の計算 (再帰版)
 *
  *   2^n == power( n )
  *           もし n が 0 の時は 1 になる
  *           そうでなければ、
  *                       2^n == 2^(n-1) * 2
  *                           == 2^(n-1) + 2^(n-1)
  *                            == power( n-1 )+power( n-1 )
 */

int power ( int n ) {

	s_print_string ( "Call Power\n" );

	if ( n > 0 ) {
		int pr = power ( n - 1 );
			/* 局所変数 pr に計算結果を保存 */
		return  pr + pr;
			/* 値を二度利用している(再計算しない) */
	} else {		/* おそらく n は 0 */
		return 1;
	}

}

/*
 *
 */

int main ( void ) {

  s_print_int ( power ( 3 ) );
  s_print_newline(); 

  return 0;
}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c>sample-009
Call Power
Call Power
Call Power
Call Power
8
C:\usr\c> 

講義中に作成したサンプルプログラム

本日の課題

課題 20121005-01

Download : 20121005-01.c ( SJIS 版 )

20121005-01.c
/*
 * DATE-DIR-QQQQ.c
 *	二つの整数をキーボードから入力し、四則の結果を出力(代入版)
 */

/*
 *	
 */

#define	EOS	'\0'

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

/*
 *	結果の出力
 */

void result_out ( int m, int n, char *message, int result ) {

	s_print_int ( m );
	s_print_string ( " と " );
	s_print_int ( n );
	s_print_string ( " の" );
	s_print_string ( message );
	s_print_string ( "は " );
	s_print_int ( result );
	s_print_string ( " です。" );
	s_print_newline();

}

/*
 *
 */

int main ( int argc, char *argv[] ) {
	int m;	/* 一つ目の整数を納める */
	int n;	/* 二つ目の整数を納める */
	int wa;	/* 和の計算結果を納める */

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

	int sho;	/* 商の計算結果を納める */

	/* 一つ目の整数の入力 */
	s_print_string ( "m の値を入力してください : " );
	m = s_input_int();		/* m に、キーボードから一つ目の整数を入力し代入 */

	/* 二つ目の整数の入力 */

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


	/* 四則の計算 */
	wa = m + n;			/* 二つの整数の和を計算し、変数 wa に代入 */
	sa = m - n;			/* 二つの整数の差を計算し、変数 sa に代入 */

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


	/* 結果の出力 */
	result_out ( m, n, "和", wa );

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

	result_out ( m, n, "積", seki );

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


  return 0;
}

/*
 *
 */
入力例
13
4
20121005-01.c の実行結果
C:\usr\c\> 20121005-01
m の値を入力してください : 13
n の値を入力してください : 4
13 と 4 の和は 17 です。
13 と 4 の差は 9 です。
13 と 4 の積は 52 です。
13 と 4 の商は 3 です。
C:\usr\c\> 

課題 20121005-02

Download : 20121005-02.c ( SJIS 版 )

20121005-02.c
/*
 * DATE-DIR-QQQQ.c
 *	n の階乗を求める ( while & 代入版 )
 */

/*
 *	
 */

#define	EOS	'\0'

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

/*
 *	階乗の計算
 */

int factrial ( int n ) {
	int result = 1;			/* 計算結果を納める変数 ( 1 で初期化 ) */

	while ( n > 0 ) {			/* n が正の間、繰り返す */

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

	}

	return result;				/* 結果を返す */

}

/*
 *
 */

int main ( int argc, char *argv[] ) {
	int n;	/* 入力された整数数を納める */
	int f;	/* 階乗の計算結果を納める */

	/* 整数の入力 */
	s_print_string ( "n の値を入力してください : " );
	n = s_input_int();		/* n に、キーボードから整数を入力し代入 */

	/* 階乗の計算 : 関数 factrial を呼び出す */

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


	/* 結果の出力 */
	s_print_int ( n );
	s_print_string ( " の階乗は " );
	s_print_int ( f );
	s_print_string ( " です。" );
	s_print_newline();

  return 0;
}

/*
 *
 */
入力例
5
20121005-02.c の実行結果
C:\usr\c\> 20121005-02
n の値を入力してください : 5
5 の階乗は 120 です。
C:\usr\c\>