Powered by SmartDoc

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

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

目次

お知らせ

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/06/03 sample-001.c
 */

/*
 * 整数の扱い
 */

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

int main ( void ) {

  s_print_int ( 1 );	/* 整数 1 を出力する */
  s_print_newline();	/* 改行 */

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

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2011/06/03 sample-002.c
 */

/*
 * 整数と文字列の扱い
 */

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

int main ( void ) {

  s_print_int ( 123 );		/* 整数 123 を出力する */
  s_print_newline();		/* 改行 */

  s_print_string ( "123" );	/* 文字列 "123" を出力する */
  s_print_newline();		/* 改行 */

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

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2011/06/03 sample-003.c
 */

/*
 * 整数と文字列と取り違えると .. ?
 */

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

int main ( void ) {

  s_print_int ( "123" );	/* 文字列を整数として出力しようとした */
  s_print_newline();		/* 改行 */

  s_print_string ( 123 );	/* 整数を文字列として出力しようとした */
  s_print_newline();		/* 改行 */

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

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2011/06/03 sample-004.c
 */

/*
 * 関数に整数を渡す
 */

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

/*
 * 同じ整数を二度出力する
 */

void print_int_two ( int n ) {	// 引数が整数なので、引数の宣言は int になる

  s_print_int ( n );
  s_print_newline();
  s_print_int ( n );
  s_print_newline();

}

/*
 * main
 */

int main ( void ) {

  s_print_int_two ( 123 );	/* 整数 123 を二度出力する */

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

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2011/06/03 sample-005.c
 */

/*
 * 整数の計算
 */

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

/*
 * 二つの和を出力する
 */

void print_int_wa ( int n, int m ) {

  s_print_int ( n );
  s_print_string ( " と " );
  s_print_int ( m );
  s_print_string ( " の和は " );
  s_print_int ( n + m );
  s_print_string ( " です。" );
  s_print_newline();

}

/*
 * main
 */

int main ( void ) {

  print_int_wa ( 123, 957 );
  print_int_wa ( -21, 45 );

  return 0;
}
sample-005.c の実行結果
C:\usr\c\> sample-005
123 と 957 の和は 1080 です。
-21 と 45 の和は 24 です。
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2011/06/03 sample-006.c
 */

/*
 * 整数の大小比較
 */

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

/*
 * 二つの比較結果を出力する
 */

void print_int_compare ( int n, int m ) {

  s_print_int ( n );
  s_print_string ( " と " );
  s_print_int ( m );
  s_print_string ( " では " );

  if ( n > m ) {	/* n の方が大きければ.. */
	  s_print_int ( n );
  } else {
	  s_print_int ( m );
  }

  s_print_string ( " の方が大きい。" );
  s_print_newline();

}

/*
 * main
 */

int main ( void ) {

  print_int_compare ( 10, 20 );
  print_int_compare ( 40, 30 );
  print_int_compare ( 4, -4 );

  return 0;
}
sample-006.c の実行結果
C:\usr\c\> sample-006
10 と 20 では 20 の方が大きい。
40 と 30 では 40 の方が大きい。
4 と -4 では 4 の方が大きい。
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2011/06/03 sample-007.c
 */

/*
 * 整数の等号比較 ( == を使う )
 */

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

/*
 * 二つの比較結果を出力する
 */

void print_int_equal ( int n, int m ) {

  s_print_int ( n );
  s_print_string ( " と " );
  s_print_int ( m );
  s_print_string ( " は等し" );

  if ( n == m ) {	/* n と m は等しい */
	s_print_string ( "い" );
  } else {
	s_print_string ( "くない" );
  }

  s_print_string ( "です。" );
  s_print_newline();

}

/*
 * main
 */

int main ( void ) {

  print_int_equal ( 10, 20 );
  print_int_equal ( 30, 30 );

  return 0;
}
sample-007.c の実行結果
C:\usr\c\> sample-007
10 と 20 は等しくないです。
30 と 30 は等しいです。
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2011/06/03 sample-008.c
 */

/*
 * 整数の等号比較 ( != を使う )
 */

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

/*
 * 二つの比較結果を出力する
 */

void print_int_equal ( int n, int m ) {

  s_print_int ( n );
  s_print_string ( " と " );
  s_print_int ( m );
  s_print_string ( " は等し" );

  if ( n != m ) {	/* n と m は等しくない */
	s_print_string ( "くない" );
  } else {
	s_print_string ( "い" );
  }

  s_print_string ( "です。" );
  s_print_newline();

}

/*
 * main
 */

int main ( void ) {

  print_int_equal ( 10, 20 );
  print_int_equal ( 30, 30 );

  return 0;
}
sample-008.c の実行結果
C:\usr\c\> sample-008
10 と 20 は等しくないです。
30 と 30 は等しいです。
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2011/06/03 sample-009.c
 */

/*
 * 再帰と整数
 */

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

/*
 * n から 1 までを出力する
 */

void print_n_to_one ( int n ) {

  if ( n == 0 ) {			/* n が 0 の時 */
	/* なにもしなくてよい */
  } else {				/* そうでなければ... */
	s_print_int ( n );		/* n を出し.. */
	s_print_newline();
	print_n_to_one ( n - 1 );	/* 再帰で残りをする */
  }
}

/*
 * main
 */

int main ( void ) {

  s_print_string ( "5 〜 1 : \n" );
  print_n_to_one ( 5 );	/* 5 〜 1 を出力 */

  s_print_newline();
  s_print_string ( "10 〜 1 : \n" );
  print_n_to_one ( 10 );	/* 10 〜 1 を出力 */

  return 0;
}
sample-009.c の実行結果
C:\usr\c\> sample-009
5 〜 1 : 
5
4
3
2
1

10 〜 1 : 
10
9
8
7
6
5
4
3
2
1
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2011/06/03 sample-010.c
 */

/*
 * 総和の計算
 */

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

/*
 * n から 1 までを sum に加えた結果を出力する
 */

void print_n_to_one_sum_sub ( int n, int sum ) {

  if ( n == 0 ) {			/* n が 0 の時 */
	/* もう計算しなくてもよいので結果を出力 */
	s_print_string ( "合計は " );
	s_print_int ( sum );
	s_print_string ( "です。" );
	s_print_newline();
  } else {				/* そうでなければ... */
	print_n_to_one_sum_sub ( n - 1, sum + n );
					/* 再帰処理 */
  }
}

void print_n_to_one_sum ( int n ) {

  print_n_to_one_sum_sub ( n, 0 );	/* 最初は 1 〜 n を 0 に加える */
}

/*
 * main
 */

int main ( void ) {

  s_print_string ( "1 から 5 : " );
  print_n_to_one_sum ( 5 );

  s_print_string ( "1 から 10 : " );
  print_n_to_one_sum ( 10 );

  return 0;
}
sample-010.c の実行結果
C:\usr\c\> sample-010
1 から 5 : 合計は 15です。
1 から 10 : 合計は 55です。
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2011/06/03 sample-011.c
 */

/*
 * 何かを n 回繰り返す
 */

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

/*
 * 文字列を 10 回出力する
 */

void print_string_n_times ( int n, char *str ) {

  if ( n == 0 ) {			/* n が 0 の時 */
	/* 仕事はすんだので何もしない */
  } else {				/* そうでなければ... */
	s_print_string ( str );	/* 取りあえず、文字列を出力し.. */
	print_string_n_times ( n - 1, str );
					/* 再帰処理 */
  }
}

/*
 * main
 */

int main ( void ) {

print_string_n_times ( 3, "Hello, World\n" );	/* "Hello, World\n" を 3 回出力 \
    */

  print_string_n_times ( 5, "こんにちは\n" );		/* "こんにちは\n" を 5 回出力 */

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

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2011/06/03 sample-012.c
 */

/*
 * 何かを n 回繰り返す
 */

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

/*
 * "*" を n 回出力
 */

void print_asta_n_times ( int n ) {

  if ( n == 0 ) {			/* n が 0 の時 */
	/* 仕事はすんだので何もしない */
  } else {				/* そうでなければ... */
	s_print_string ( "*" );	/* 取りあえず、"*" 出力し.. */
	print_asta_n_times ( n - 1 );
					/* 再帰処理 */
  }
}

void print_triangle ( int n ) {

  if ( n == 0 ) {			/* n が 0 の時 */
	/* 仕事はすんだので何もしない */
  } else {				/* そうでなければ... */
	print_asta_n_times ( n );	/* アスタリスクを n 個出力 */
	s_print_newline();

	print_triangle ( n - 1 );
					/* 再帰処理 */
  }
}

/*
 * main
 */

int main ( void ) {

  print_triangle ( 3 );

  s_print_newline();

  print_triangle ( 5 );

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

*****
****
***
**
*
C:\usr\c\> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2011/06/03 sample-013.c
 */

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

/*
 * ペアノの公理 (自然数の定義)
 *   i) 0 は自然数
 *  ii) x が自然数ならば x + 1 も自然数
 * iii) i) と ii) 以外に自然数はない
 */

/*
 * 和の定義
 *	n, m が自然数の時に n + m とは何か
 * 
 *                m        	( n が 0 の時 )
 *      n + m { 
 *		( x + m ) + 1   ( n = x + 1 の時 )
 */

/*
 * a と b の和を計算する
 */

void addition ( int n, int m ) {

  if ( n == 0 ) {	/* n が 0 の時 */
	s_print_int ( m );
  } else {
	addition ( n - 1, m + 1 );	/* x + m を計算 */
  }
}

main()
{

  addition ( 3, 4 );
  printf ( "\n" );

  addition ( 5, 9 );
  printf ( "\n" );

  /* 足し算をする */

}
sample-013.c の実行結果
C:\usr\c\> sample-013
7
14
C:\usr\c\> 

sample-014

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 2011/06/03 sample-014.c
 */

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

/*
 * 積の定義
 *	n, m が自然数の時に n * m とは何か
 * 
 *                  0      	( n が 0 の時 )
 *      n + m { 
 *		( x * m ) + m   ( n = x + 1 の時 )
 */

/*
 * n と m のかけ算
 */

void multiply_sub ( int n, int m, int mul ) {

  if (  n == 0 ) {	/* n が 0 の時 */
	s_print_int ( mul );			/* 結果を出力 */
  } else {
	multiply_sub ( n - 1, m, mul + m );	/* x * m を計算 */
  }
}

void multiply ( int n, int m ) {

  multiply_sub ( n, m, 0 );
}

main()
{

  multiply ( 3, 4 );
  s_print_newline();

  multiply ( 5, 8 );
  s_print_newline();

}
sample-014.c の実行結果
C:\usr\c\> sample-014
12
40
C:\usr\c\> 

sample-015

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * 2011/06/03 sample-015.c
 */

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

/*
 * 引き算の定義
 *	n, m が自然数の時に n - m とは何か ( n >= m )
 * 
 *                n        	( m が 0 の時 )
 *      n - m { 
 *		 y - x          ( m = x + 1 の時 )
 *		                ( n = y + 1 の時 )
 */

/*
 * n と m の差
 */

void diffirence ( int n, int m ) {

  if ( m == 0 ) {	/* m が 0 の時 */
	s_print_int ( n );
  } else {
	diffirence ( n - 1, m - 1 );	/* y - x を計算 */
  }
}

main()
{

  diffirence ( 7, 3 );
  printf ( "\n" );

  diffirence ( 13, 8 );
  printf ( "\n" );

}
sample-015.c の実行結果
C:\usr\c\> sample-015
4
5
C:\usr\c\> 

本日の課題

課題 20110603-01

Download : 20110603-01.c ( SJIS 版 )

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

#include <stdio.h>

#include "s_print.h"

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

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

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

  } else if ( n == 0 ) {	/* n が 0 : m の方が大きかった */
        s_print_int ( nn );					/* 余りを出力 */
  } else {

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

  }

}

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

void remainder ( int n, int m ) {


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

}

/*
 *	main
 */

int main()
{

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

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

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

  return 0;
}
20110603-01.c の実行結果
C:\usr\c\> 20110603-01
10 mod 4 = 2
10 mod 3 = 1
10 mod 2 = 0
C:\usr\c\> 

課題 20110603-02

Download : 20110603-02.c ( SJIS 版 )

20110603-02.c
/*
 * 20210603-2-QQQQ.c
 *	忍者を歩かせて、八角形に二周目回るようにしなさい
 */

#include <stdio.h>

#include "s_ninja.h"


/*
 * 引数 n だけ turn する
 */

void n_turn( int n ) {

	 if ( n == 0 ) {
		/* n が 0 のときはなにもしなくてよい */
	 } else {
		s_ninja_turn();	/* とりあえず、1 回向きをかえて */
		n_turn ( n - 1 );	/* 残りは再帰で処理 */
	 }
}

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

void turn_and_step() {

	s_ninja_turn();
	s_ninja_move();
	s_ninja_move();
}

/*
 * 引数 n だけ turn_and_step を行う
 */

void n_turn_and_step( int n ) {

	 if ( n == 0 ) {
		/* n が 0 のときはなにもしなくてよい */
	 } else {

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

	 }
}

/*
 * 八角形に歩く
 */

void walk_octagon() {


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


}

/*
 * 八角形に歩く
 */

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

	n_turn( 2 );

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

	walk_octagon();
	walk_octagon();

	/* 正面を向く */

	n_turn( 6 );

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

Links