Powered by SmartDoc

ソフトウェア概論A (2012/06/08)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加資料

  1. このフォルダは今日のファイルをおくために作成する。

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2012/06/08 sample-001.c
 */

/*
 * 関数を利用しない場合 (各国語で、挨拶を二回ずつ繰り返す)
 */

#include <stdio.h>

void main ( void ) {

	printf ( "Hello, World\n" );
	printf ( "Hello, World\n" );
	printf ( "こんにちは、皆さん\n" );
	printf ( "こんにちは、皆さん\n" );
	printf ( "ニーハオ、ダァジァハァオ\n" );
	printf ( "ニーハオ、ダァジァハァオ\n" );

}
sample-001.c の実行結果
C:\usr\c>sample-001
Hello, World
Hello, World
こんにちは、皆さん
こんにちは、皆さん
ニーハオ、ダァジァハァオ
ニーハオ、ダァジァハァオ
C:\usr\c> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2012/06/08 sample-003.c
 */

/*
 * 各国語毎に関数を作成
 */

#include <stdio.h>

void english ( void ) {
	printf ( "Hello, World\n" );
	printf ( "Hello, World\n" );
}

void japanese ( void ) {
	printf ( "こんにちは、皆さん\n" );
	printf ( "こんにちは、皆さん\n" );
}

void chainese ( void ) {
	printf ( "ニーハオ、ダァジァハァオ\n" );
	printf ( "ニーハオ、ダァジァハァオ\n" );
}

void main ( void ) {

	english();
	japanese();
	chainese();

}
sample-002.c の実行結果
C:\usr\c>sample-002
Hello, World
Hello, World
こんにちは、皆さん
こんにちは、皆さん
ニーハオ、ダァジァハァオ
ニーハオ、ダァジァハァオ
C:\usr\c> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2012/06/08 sample-003.c
 */

/*
 * 挨拶を二回繰り返すという、引数付の関数を作る
 */

#include <stdio.h>

void sayTwice ( char *hello ) {

	printf ( hello );
	printf ( hello );
}

void english ( void ) {
	sayTwice ( "Hello, World\n" );
}

void japanese ( void ) {
	sayTwice ( "こんにちは、皆さん\n" );
}

void chainese ( void ) {
	sayTwice ( "ニーハオ、ダァジァハァオ\n" );
}

void main ( void ) {

	english();
	japanese();
	chainese();

}
sample-003.c の実行結果
C:\usr\c>sample-003
Hello, World
Hello, World
こんにちは、皆さん
こんにちは、皆さん
ニーハオ、ダァジァハァオ
ニーハオ、ダァジァハァオ
C:\usr\c> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2012/06/08 sample-004.c
 */

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

#include <stdio.h>

void main ( void ) {

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

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

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2012/06/08 sample-005.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-005.c の実行結果
C:\usr\c>sample-005
Hello, World
C:\usr\c> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2012/06/08 sample-006.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-006.c の実行結果
C:\usr\c>sample-006
「\」 を出すには 「'\\'」とする ==> \
「'」を出すには 「'\''」とする ==> '
「ビープ音」を出すには 「'\a'」とする ==> 
「"」を出すには 「'"'」だけでよい ==> "
C:\usr\c> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2012/06/08 sample-007.c
 */

/*
 * 文字列
 */

#include <stdio.h>

void main ( void ) {

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

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

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2012/06/08 sample-008.c
 */

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

#include <stdio.h>

void main ( void ) {

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

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

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2012/06/08 sample-009.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-009.c の実行結果
C:\usr\c>sample-009
"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> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2012/06/08 sample-010.c
 */

/*
 * 仮引数の型宣言と実引数の型
 */

#include <stdio.h>

void tenChar ( char x ) {		/* 文字を 10 回出力する */

	/*
		引数(x)は「文字列」ではなく、「文字」なので「char」で宣言する
	*/

	 putchar ( x );		/* 「char」型(文字型) なので putchar を使う */
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );

	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
}

void tenString ( char *x ) {		/* 文字列を 10 回出力する */
	/*
		引数(x)は「文字列」なので「char *」で宣言する
	*/

	 printf ( x );		/* 「char *」型(文字列型) なので printf を使う */
	 printf ( x );
	 printf ( x );
	 printf ( x );
	 printf ( x );

	 printf ( x );
	 printf ( x );
	 printf ( x );
	 printf ( x );
	 printf ( x );

}

void main ( void ) {

	printf ( "'a' を 10 回、出力する\n" );
	tenChar ( 'a' );
	printf ( "\n" );

	printf ( "\"a\" を 10 回、出力する\n" );
	tenString ( "a" );
	printf ( "\n" );

	/*
		tenChar ( "a" ) とか tenString ( 'a' ) とすると.. ?
	*/

}
sample-010.c の実行結果
C:\usr\c>sample-010
'a' を 10 回、出力する
aaaaaaaaaa
"a" を 10 回、出力する
aaaaaaaaaa
C:\usr\c> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2012/06/08 sample-009.c
 */

/*
 * 文字列の計算
 */

#include <stdio.h>

void tenChar ( char x ) {		/* 文字を 10 回出力する */

	/*
		引数(x)は「文字列」ではなく、「文字」なので「char」で宣言する */
	*/

	 putchar ( x );		/* 「char」型(文字型) なので putchar を使う */
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );

	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
	 putchar ( x );
}

void tenString ( char *x ) {		/* 文字列を 10 回出力する */
	/*
		引数(x)は「文字列」なので「char *」で宣言する */
	*/

	 printf ( x );		/* 「char *」型(文字列型) なので printf を使う */
	 printf ( x );
	 printf ( x );
	 printf ( x );
	 printf ( x );

	 printf ( x );
	 printf ( x );
	 printf ( x );
	 printf ( x );
	 printf ( x );

}

void main ( void ) {

	printf ( "'a' を 10 回、出力する\n" );
	tenChar ( 'a' );
	printf ( "\n" );

	printf ( "\"a\" を 10 回、出力する\n" );
	tenString ( "a" );
	printf ( "\n" );

	/*
		tenChar ( "a" ) とか tenString ( 'a' ) とすると.. ?
	*/

}
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> 

sample-101

Download : sample-101.c ( SJIS 版 )

sample-101.c
/*
 * 2012/06/08 sample-001.c
 */

/*
 * 整数の扱い
 */

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

int main ( void ) {

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

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

sample-102

Download : sample-102.c ( SJIS 版 )

sample-102.c
/*
 * 2012/06/08 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-102.c の実行結果
C:\usr\c>sample-102
123
123
C:\usr\c> 

sample-103

Download : sample-103.c ( SJIS 版 )

sample-103.c
/*
 * 2012/06/08 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-103.c の実行結果
C:\usr\c>sample-103
C:\usr\c> 

sample-104

Download : sample-104.c ( SJIS 版 )

sample-104.c
/*
 * 2012/06/08 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-104.c の実行結果
C:\usr\c>sample-104
C:\usr\c> 

sample-105

Download : sample-105.c ( SJIS 版 )

sample-105.c
/*
 * 2012/06/08 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-105.c の実行結果
C:\usr\c>sample-105
123 と 957 の和は 1080 です。
-21 と 45 の和は 24 です。
C:\usr\c> 

sample-106

Download : sample-106.c ( SJIS 版 )

sample-106.c
/*
 * 2012/06/08 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-106.c の実行結果
C:\usr\c>sample-106
10 と 20 では 20 の方が大きい。
40 と 30 では 40 の方が大きい。
4 と -4 では 4 の方が大きい。
C:\usr\c> 

sample-107

Download : sample-107.c ( SJIS 版 )

sample-107.c
/*
 * 2012/06/08 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-107.c の実行結果
C:\usr\c>sample-107
10 と 20 は等しくないです。
30 と 30 は等しいです。
C:\usr\c> 

sample-108

Download : sample-108.c ( SJIS 版 )

sample-108.c
/*
 * 2012/06/08 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-108.c の実行結果
C:\usr\c>sample-108
10 と 20 は等しくないです。
30 と 30 は等しいです。
C:\usr\c> 

sample-109

Download : sample-109.c ( SJIS 版 )

sample-109.c
/*
 * 2012/06/08 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-109.c の実行結果
C:\usr\c>sample-109
5 〜 1 : 
5
4
3
2
1

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

sample-110

Download : sample-110.c ( SJIS 版 )

sample-110.c
/*
 * 2012/06/08 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-110.c の実行結果
C:\usr\c>sample-110
1 から 5 : 合計は 15です。
1 から 10 : 合計は 55です。
C:\usr\c> 

sample-111

Download : sample-111.c ( SJIS 版 )

sample-111.c
/*
 * 2012/06/08 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-111.c の実行結果
C:\usr\c>sample-111
Hello, World
Hello, World
Hello, World
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
C:\usr\c> 

sample-112

Download : sample-112.c ( SJIS 版 )

sample-112.c
/*
 * 2012/06/08 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-112.c の実行結果
C:\usr\c>sample-112
***
**
*

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

sample-113

Download : sample-113.c ( SJIS 版 )

sample-113.c
/*
 * 2012/06/08 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-113.c の実行結果
C:\usr\c>sample-113
7
14
C:\usr\c> 

sample-114

Download : sample-114.c ( SJIS 版 )

sample-114.c
/*
 * 2012/06/08 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-114.c の実行結果
C:\usr\c>sample-114
12
40
C:\usr\c> 

sample-115

Download : sample-115.c ( SJIS 版 )

sample-115.c
/*
 * 2012/06/08 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-115.c の実行結果
C:\usr\c>sample-115
4
5
C:\usr\c> 

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

本日の課題

課題 20120608-01

Download : 20120608-01.c ( SJIS 版 )

20120608-01.c
/*
 * DATE-DIR-QQQQ.c
 *
 *	putchar で自分の名前(ローマ字)を出力する
 */

#include <stdio.h>

/*
 *	main
 */

int main( void )
{

	/*
     * putchar を使って、自分名前を表示する
	 * 以下は "Kurino Shun-ichi" の場合
     */

	 putchar ( 'K' );
	 putchar ( 'u' );
	 putchar ( 'r' );
	 putchar ( 'i' );
	 putchar ( 'n' );
	 putchar ( 'o' );

	 putchar ( ' ' );

	 putchar ( 'S' );
	 putchar ( 'h' );
	 putchar ( 'u' );
	 putchar ( 'n' );
	 putchar ( '-' );
	 putchar ( 'c' );
	 putchar ( 'h' );
	 putchar ( 'i' );

	 putchar ( '\n' );

	 return 0;
}
20120608-01.c の実行結果
C:\usr\c\> 20120608-01
Kurino Shun-chi
C:\usr\c\> 

課題 20120608-02

Download : 20120608-02.c ( SJIS 版 )

20120608-02.c
/*
 * DATE-DIR-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;
}
20120608-02.c の実行結果
C:\usr\c\> 20120608-02
10 mod 4 = 2
10 mod 3 = 1
10 mod 2 = 0
C:\usr\c\>