Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加資料

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

sample-001

Download : sample-001.c ( SJIS 版 )

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

#include <stdio.h>
#include "s_print.h"	/* 出力のために必要 */

/*
 * main
 */

int main(void)
{

  s_print_double ( 2.3 );	/* 浮動小数点数の表示 */
  s_print_newline();		/* 改行 */

  return 0;

}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c>sample-001
2.300000
C:\usr\c> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2012/06/29 sample-002.c
 */

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

/*
 * 浮動小数点数の引数宣言
 */

double wa ( double a, double b ) {
	/* 浮動小数点数の引数の型は double */

	s_print_double ( a );
	s_print_string ( " と " );
	s_print_double ( b );
	s_print_string ( " の和は " );
	s_print_double ( a + b );		/* 浮動小数点の和の計算 */
	s_print_string ( " です。" );
	s_print_newline();		/* 改行 */

	return a + b;					/* 計算結果を値として返す */
}

/*
 * main
 */

int main(void)
{

  wa ( 2.3, 4.5 );		/* 関数の値は無視してもよいし.. */

  s_print_double ( 1.0 + wa ( -9.8, 2.1 ) * 10000.0  );
						/* 式の中で利用する事もでみる */

  s_print_string ( "は、返ってきた値を 10000 倍して 1 を加えた結果\n" );

  return 0;

}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c>sample-002
2.300000 と 4.500000 の和は 6.800000 です。
-9.800000 と 2.100000 の和は -7.700000 です。
-76999.000000は、返ってきた値を 10000 倍して 1 を加えた結果
C:\usr\c> 

sample-003

Download : sample-003.c ( SJIS 版 )

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

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * 2 倍を表示
 */

void doubleDouble ( double number ) {

	s_print_double ( number );
	s_print_string ( "の 2 倍は " );
	s_print_double ( 2.0 * number );	/* 数値を二倍して出力 */
	s_print_string ( " です。" );
	s_print_newline();

}

/*
 * main
 */

int main(void)
{

  s_print_string ( "実数値を入力してください : " );
  doubleDouble ( s_input_double() );		/* キーボードから実数値を入力 */

  return 0;

}

/*
 *
 */
入力例
123.456
sample-003.c の実行結果
C:\usr\c>sample-003<  sample-003.in
実数値を入力してください : 123.456000
123.456000の 2 倍は 246.912000 です。
C:\usr\c> 

sample-004

Download : sample-004.c ( SJIS 版 )

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

#include <stdio.h>
#include <float.h>		/* DBL_MIN, DBL_MAX */
#include "s_print.h"

/*
 * main
 */

int main(void)
{

  s_print_string ( "DBL_MIN=" );		
  s_print_doublee ( DBL_MIN );
  s_print_string ( ", DBL_MAX=" );
  s_print_doublee ( DBL_MAX );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c>sample-004
DBL_MIN=2.225074e-308, DBL_MAX=1.797693e+308
C:\usr\c> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2012/06/29 sample-005.c
 */

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

/*
 * error_check
 */

void error_check ( double a, double b ) {

	s_print_double ( a );
	s_print_string ( " と " );
	s_print_double ( b );
	s_print_string ( " は、" );

	if ( a == b ) {	/* 二つの浮動小数点数を比較するのは危険 */
		s_print_string ( "等しいです\n" );
	} else {
		s_print_string ( "等しくないです\n" );
	}

}

/*
 * main
 */

int main(void)
{

  error_check ( 1.0, 1.0 );
  error_check ( 1.0-0.7, 0.3 );
  error_check ( 1.001,1.002 );
  error_check ( 1.000000000001,1.000000000002 );

  return 0;

}

/*
 *
 */
sample-005.c の実行結果
C:\usr\c>sample-005
1.000000 と 1.000000 は、等しいです
0.300000 と 0.300000 は、等しくないです
1.001000 と 1.002000 は、等しくないです
1.000000 と 1.000000 は、等しくないです
C:\usr\c> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2012/06/29 sample-006.c
 */

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

/*
 * error_check_long
 */

void error_check_long ( double a, double b ) {

	s_print_doublel ( a );		/* 長い形式の出力 */
	s_print_string ( " と " );
	s_print_doublel ( b );		/* 長い形式の出力 */
	s_print_string ( " は、" );

	if ( a == b ) {	/* 二つの浮動小数点数を比較するのは危険 */
		s_print_string ( "等しいです\n" );
	} else {
		s_print_string ( "等しくないです\n" );
	}

}

/*
 * main
 */

int main(void)
{

  error_check_long ( 1.0, 1.0 );
  error_check_long ( 1.0-0.7, 0.3 );
  error_check_long ( 1.001,1.002 );
  error_check_long ( 1.000000000001,1.000000000002 );

  return 0;

}

/*
 *
 */
sample-006.c の実行結果
C:\usr\c>sample-006
1.00000000000000000000 と 1.00000000000000000000 は、等しいです
0.30000000000000004441 と 0.29999999999999998890 は、等しくないです
1.00099999999999988987 と 1.00200000000000000178 は、等しくないです
1.00000000000100008890 と 1.00000000000199995576 は、等しくないです
C:\usr\c> 

sample-007

Download : sample-007.c ( SJIS 版 )

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

#include <stdio.h>
#include <math.h>		/* fabs に必要 */
#include "s_print.h"

/*
 * error_check_with_epsilon
 */

#define	EPSILON	(0.00000001)	/* 最小誤差を(自分で)决める */

void error_check_with_epsilon ( double a, double b ) {

	s_print_double ( a );		/* 長い形式の出力 */
	s_print_string ( " と " );
	s_print_double ( b );		/* 長い形式の出力 */
	s_print_string ( " は、" );

	if ( fabs ( a - b ) < EPSILON ) {	/* 差の絶対値を最小誤差と比較 */
		s_print_string ( "等しいです\n" );
	} else {
		s_print_string ( "等しくないです\n" );
	}

}

/*
 * main
 */

int main(void)
{

  error_check_with_epsilon ( 1.0, 1.0 );
  error_check_with_epsilon ( 1.0-0.7, 0.3 );
  error_check_with_epsilon ( 1.001,1.002 );
  error_check_with_epsilon ( 1.000000000001,1.000000000002 );
		/* 1.000000000001 と 1.000000000002 の差は EPSILON より小さい */

  return 0;

}

/*
 *
 */
sample-007.c の実行結果
C:\usr\c>sample-007
1.000000 と 1.000000 は、等しいです
0.300000 と 0.300000 は、等しいです
1.001000 と 1.002000 は、等しくないです
1.000000 と 1.000000 は、等しいです
C:\usr\c> 

sample-008

Download : sample-008.c ( SJIS 版 )

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

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

/*
 * fact
 */

double fact ( int n ) {

	if ( n > 0 ) {
		return fact ( n - 1 ) * n;
	} else {
		return 1.0;
	}
}

/*
 *	sum_1_n ( n ) = 1/1! + 1/2! + .. + 1/n!
 */

double sum_1_n ( int n ) {

	   if ( n >= 0 ) {
	   	  return sum_1_n ( n - 1 ) + 1.0 / fact( n );
	   } else {
		   return 0.0;
	   }
}

/*
 *	sum_n_1 ( n ) = 1/n! + 1/(n-1)! + .. + 1/1!
 */

double sum_n_1_sub ( int n, double sum ) {

	if ( n >= 0 ) {
		return sum_n_1_sub ( n - 1, sum + 1.0 / fact( n ) );
	} else {
	   return sum;
	}

}

double sum_n_1 ( int n ) {

	return sum_n_1_sub ( n, 0.0 );
}

/*
 * main
 */

int main(void)
{

  s_print_string ( "1 to 1000 = " );
  s_print_doublel ( sum_1_n ( 1000 ) );
  s_print_newline();

  s_print_string ( "1000 to 1 = " );
  s_print_doublel ( sum_n_1 ( 1000 ) );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c>sample-008
1 to 1000 =                   2.71828182845904553488
1000 to 1 =                   2.71828182845904509080
C:\usr\c> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2012/06/29 sample-009.c
 */

#include <stdio.h>
#include <math.h>		/* exp に必要 */
#include "s_print.h"

/*
 * main
 */

int main(void)
{

  s_print_string ( "exp(" );
  s_print_double ( 1.0 );
  s_print_string ( ")=" );
  s_print_doublel ( exp(1.0) );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c>sample-009
exp(1.000000)=                  2.71828182845904509080
C:\usr\c> 

sample-010

Download : sample-010.c ( SJIS 版 )

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

#include <stdio.h>
#include <math.h>		/* sin, M_PI に必要 */
#include "s_print.h"

/*
 * main
 */

int main(void)
{

  s_print_string ( "sin(" );
  s_print_double ( M_PI/4.0 );	/* M_PI は円周率 */
  s_print_string ( ")=" );
  s_print_double ( sin( M_PI/4.0 ) );
  s_print_newline();

  s_print_string ( "sin^2(" );
  s_print_double ( M_PI/4.0 );
  s_print_string ( ")=" );
  s_print_double ( sin( M_PI/4.0 ) * sin( M_PI/4.0 ) );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-010.c の実行結果
C:\usr\c>sample-010
sin(0.785398)=0.707107
sin^2(0.785398)=0.500000
C:\usr\c> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2012/06/29 sample-011.c
 */

#include <stdio.h>
#include <math.h>	/* 数学関数を利用する場合はこれを追加する */
#include "s_print.h"

/*
 *
 */

void plot_dot_sub ( double pos, double value ) {

  if ( pos >= value ) {			/* 印刷位置まだきた */
	s_print_char ( '*' );			/* 「点」を出力 */
	s_print_newline ();			/* この行は終り */
  } else {
	s_print_char ( ' ' );			/* 空白を出力 */
	plot_dot_sub ( pos + 1.0, value );	/* 続きを計算 */
  }
}

/*
 *	0 〜 79 で、 -1.0 〜 1.0 を表現するには、
 *		x | -1.0 〜 1.0 |       x
 *		--+-------------+---------------
 *		y |    0 〜  79 | ( x + 1 ) * 40 
 */

#define	WIDTH	80.0			/* 一行の中のカラム数を定義 */

void plot_dot ( double value ) {

  plot_dot_sub ( 0.0, ( value + 1.0 ) * WIDTH/2.0 );
}

/*
 *
 */

void print_sin_curve( double top, double end, double step ) {

  if ( top >= end ) {
	/* 何もする必要はない */
  } else {
	plot_dot ( sin ( top ) );			/* sin は正弦関数 */
	print_sin_curve ( top + step, end, step );	/* 次のステップを実行 */
  }

}

/*
 *
 */

int main ( void ) {

  print_sin_curve( 0, 2 * M_PI, 0.1 );

  return 0;
}

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

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2012/06/29 sample-012.c
 */

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

/*
 *	二分法による平方根の計算
 *
 */

#define	EPSILON	(0.00000001)	/* 最小誤差を(自分で)决める */

double mysqrt_sub ( double min, double max, double mid, double number ) {

	   if ( max - min < EPSILON ) {

				/*
				 * 十分に精度が得られたので、その結果を値とする
				 */

			return mid;

	   } else if ( mid * mid - number < 0.0 ) {

				/*
				 * 答は mid と max の間にある
				 */

			return mysqrt_sub ( mid, max, (mid+max)/2.0, number );

	   } else {

				/*
				 * 答は min と mid の間にある
				 */

			return mysqrt_sub ( min, mid, (min+mid)/2.0, number );
	   }

}

double mysqrt ( double number ) {

	   if ( number > 1.0 ) {

			/*
			 *	n > 1.0 なら
			 *		0.0 < mysqrt(n) < n
			 */

	   	  return mysqrt_sub ( 0.0, number, number/2.0, number );

	   } else {

			/*
			 *	n < 1.0 なら
			 *		0.0 < mysqrt(n) < 1.0
			 */

	   	  return mysqrt_sub ( 0.0, 1.0, 0.5, number );
	   }
}

/*
 *
 */

void print_result ( double number ) {

	s_print_double ( number );
	s_print_string ( " の平方根は " );
	s_print_double ( mysqrt ( number ) );
	s_print_string ( " です。\n" );

}

/*
 *
 */

int main ( void ) {

	s_print_string ( "数値を入力してください : " );
	print_result ( s_input_double() );

  return 0;
}

/*
 *
 */
入力例
2.0
sample-012.c の実行結果
C:\usr\c>sample-012<  sample-012.in
数値を入力してください : 2.000000
2.000000 の平方根は 1.414214 です。
C:\usr\c> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2012/06/29 sample-013.c
 */

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

/*
 *
 */

void has_arg ( int n ) {

	 s_print_string ( "変数 n の値は " );
	 s_print_int ( n );
	 s_print_string ( " です\n" );

}

/*
 *
 */

int main ( void ) {

	has_arg ( 10 );
	has_arg ( 30 );

	return 0;
}

/*
 *
 */
sample-013.c の実行結果
C:\usr\c>sample-013
変数 n の値は 10 です
変数 n の値は 30 です
C:\usr\c> 

sample-014

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 2012/06/29 sample-014.c
 */

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

/*
 *
 */

int main ( void ) {

	s_print_string ( "変数 n の値は " );
	s_print_int ( 10 );
	s_print_string ( " です\n" );

	s_print_string ( "変数 n の値は " );
	s_print_int ( 30 );
	s_print_string ( " です\n" );

	return 0;
}

/*
 *
 */
sample-014.c の実行結果
C:\usr\c>sample-014
変数 n の値は 10 です
変数 n の値は 30 です
C:\usr\c> 

sample-015

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * 2012/06/29 sample-015.c
 */

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

/*
 *
 */

int main ( void ) {
	int n;	/* 変数 n の宣言 */

	n = 10;	/* 代入文 */
	s_print_string ( "変数 n の値は " );
	s_print_int ( n );
	s_print_string ( " です\n" );

	n = 30;
	s_print_string ( "変数 n の値は " );
	s_print_int ( n );
	s_print_string ( " です\n" );

	return 0;
}

/*
 *
 */
sample-015.c の実行結果
C:\usr\c>sample-015
変数 n の値は 10 です
変数 n の値は 30 です
C:\usr\c> 

sample-016

Download : sample-016.c ( SJIS 版 )

sample-016.c
/*
 * 2012/06/29 sample-016.c
 */

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

/*
 *		
 */

int assign ( int n ) {

  /* n の値を参照 */

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


  n = 100;			/* n に 100 を代入 */

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


  n = 1 + 2 + 3;			/* n に 1 + 2 + 3 を代入 */

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

}


/*
 *
 */

int main ( void ) {

  /*
   * assign ( 5 )
   */

  s_print_string ( "assgin ( 5 )\n" );
  assign ( 5 );

  /*
   *
   */

  s_print_newline();

  /*
   * assign ( 5 )
   */

  s_print_string ( "assgin ( 10 )\n" );
  assign ( 10 );

  return 0;
}

/*
 *
 */
sample-016.c の実行結果
C:\usr\c>sample-016
assgin ( 5 )
n = 5
n = 100
n = 6

assgin ( 10 )
n = 10
n = 100
n = 6
C:\usr\c> 

sample-017

Download : sample-017.c ( SJIS 版 )

sample-017.c
/*
 * 2012/06/29 sample-017.c
 */

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

/*
 *		なにやら複雑な計算をしたとする..	( 二乗の計算しかしていないが.. )
 */

int any_complex_calculus ( int n ) {

  s_print_string ( "Function Called !!\n" );

  return n * n;
}

/*
 *		
 */

int assign_and_refer ( int n, int m ) {

  /* n の値を参照 */

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

  n = any_complex_calculus ( m );

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

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

}

/*
 *		
 */

int function_call_again ( int n, int m ) {

  /* n の値を参照 */

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

  s_print_string ( "any_complex_calculus ( " );
  s_print_int ( m );
  s_print_string ( " ) = " );
  s_print_int ( any_complex_calculus ( m ) );
  s_print_newline();

  s_print_string ( "any_complex_calculus ( " );
  s_print_int ( m );
  s_print_string ( " ) = " );
  s_print_int ( any_complex_calculus ( m ) );
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  /*
   * assign_and_refer ( 10, 5 );
   */

  s_print_string ( "assign_and_refer ( 10, 5 )\n" );
  assign_and_refer ( 10, 5 );

  /*
   *
   */

  s_print_newline();

  /*
   * function_call_again ( 10, 5 );
   */

  s_print_string ( "function_call_again ( 10, 5 )\n" );
  function_call_again ( 10, 5 );

  /*
   *
   */

  return 0;
}

/*
 *
 */
sample-017.c の実行結果
C:\usr\c>sample-017
assign_and_refer ( 10, 5 )
n = 10
Function Called !!
any_complex_calculus ( 5 ) = 25
any_complex_calculus ( 5 ) = 25

function_call_again ( 10, 5 )
n = 10
any_complex_calculus ( 5 ) = Function Called !!
25
any_complex_calculus ( 5 ) = Function Called !!
25
C:\usr\c> 

sample-018

Download : sample-018.c ( SJIS 版 )

sample-018.c
/*
 * 2012/06/29 sample-018.c
 */

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

/*
 *		
 */

void modify_with_self ( int n ) {

  /* n の値を参照 */

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

  n = n * 2;		/* 自分の値を利用して次の自分の値を求める事ができる */

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

  n = n - 10;		/* 自分の値を利用して次の自分の値を求める事ができる */

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

}

/*
 *
 */

int main ( void ) {

  /*
   * modify_with_self ( 5 )
   */

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

  /*
   *
   */

  s_print_newline();


  /*
   * modify_with_self ( -8 )
   */

  s_print_string ( "modify_with_self ( -8 )\n" );
  modify_with_self ( -8 );

  /*
   *
   */

  return 0;
}

/*
 *
 */
sample-018.c の実行結果
C:\usr\c>sample-018
modify_with_self ( 5 )
n = 5
n = 10
n = 0

modify_with_self ( -8 )
n = -8
n = -16
n = -26
C:\usr\c> 

sample-019

Download : sample-019.c ( SJIS 版 )

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

Download : sample-020.c ( SJIS 版 )

sample-020.c
/*
 * 2012/06/29 sample-020.c
 */

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

/*
 * swap
 *
 *		値の交換 : 失敗
 */

int swap ( int n, int m ) {

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

  s_print_string ( "swap\n" );

  n = m;		/* この時点で n の値は失われる.. */
  m = n;		/* 思った通りにはならない .. */

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

}


/*
 *
 */

int main ( void ) {

  /*
   * swap ( 10, 15 )
   */

  swap ( 10, 15 );

  return 0;
}

/*
 *
 */
sample-020.c の実行結果
C:\usr\c>sample-020
n = 10, m = 15
swap
n = 15, m = 15
C:\usr\c> 

sample-021

Download : sample-021.c ( SJIS 版 )

sample-021.c
/*
 * 2012/06/29 sample-021.c
 */

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

/*
 * swap
 *
 *		値の交換 : 成功
 */

int swap ( int n, int m, int w ) {

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", m = " );
  s_print_int ( m );
  s_print_string ( ", w = " );
  s_print_int ( w );
  s_print_newline();

  s_print_string ( "swap\n" );

  w = n;		/* この時点で w の値は失われるし.. */
  n = m;		/* n の値も消えてしまうが.. */
  m = w;		/* w にのこっているので、m,n の交換は可能.. */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", m = " );
  s_print_int ( m );
  s_print_string ( ", w = " );
  s_print_int ( w );
  s_print_newline();

}


/*
 *
 */

int main ( void ) {

  /*
   * swap ( 10, 15, 0 )
   */

  swap ( 10, 15, 0 );

  return 0;
}

/*
 *
 */
sample-021.c の実行結果
C:\usr\c>sample-021
n = 10, m = 15, w = 0
swap
n = 15, m = 10, w = 10
C:\usr\c> 

sample-022

Download : sample-022.c ( SJIS 版 )

sample-022.c
/*
 * 2012/06/29 sample-022.c
 */

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

/*
 *		
 */

void function_argument ( int n ) {

  /* n の値を参照 */

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

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

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

}

/*
 *
 */

int main ( void ) {

  /*
   * function_argument ( 5 );
   */

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

  /*
   *
   */

  return 0;
}

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

sample-023

Download : sample-023.c ( SJIS 版 )

sample-023.c
/*
 * 2012/06/29 sample-023.c
 */

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

/*
 *
 */

int assign_variable ( int n ) {

  /* n の値を参照 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

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

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

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

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

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

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

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

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

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

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

}

/*
 *		
 */

void function_argument ( int n ) {

  /* n の値を参照 */

  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &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-023.c の実行結果
C:\usr\c>sample-023
assign_variable ( 5 )
n = 5, &n = bf97b160
n = 4, &n = bf97b160
n = 3, &n = bf97b160
n = 2, &n = bf97b160
n = 1, &n = bf97b160
n = 0, &n = bf97b160

function_argument ( 5 )
n = 5, &n = bf97b160
n = 4, &n = bf97b140
n = 3, &n = bf97b120
n = 2, &n = bf97b100
n = 1, &n = bf97b0e0
n = 0, &n = bf97b0c0
C:\usr\c> 

sample-024

Download : sample-024.c ( SJIS 版 )

sample-024.c
/*
 * 2012/06/29 sample-024.c
 */

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

/*
 *		
 */

void function_argument ( int n ) {

  /* n の値を参照 */

  s_print_string ( "(pre) n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

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

  s_print_string ( "(post) n = " );
  s_print_int ( n );
  s_print_string ( ", &n = " );
  s_print_hex ( &n );
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  /*
   * function_argument ( 5 );
   */

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

  /*
   *
   */

  return 0;
}

/*
 *
 */
sample-024.c の実行結果
C:\usr\c>sample-024
function_argument ( 5 )
(pre) n = 5, &n = bfd11a90
(pre) n = 4, &n = bfd11a70
(pre) n = 3, &n = bfd11a50
(pre) n = 2, &n = bfd11a30
(pre) n = 1, &n = bfd11a10
(pre) n = 0, &n = bfd119f0
(post) n = 0, &n = bfd119f0
(post) n = 1, &n = bfd11a10
(post) n = 2, &n = bfd11a30
(post) n = 3, &n = bfd11a50
(post) n = 4, &n = bfd11a70
(post) n = 5, &n = bfd11a90
C:\usr\c> 

sample-025

Download : sample-025.c ( SJIS 版 )

sample-025.c
/*
 * 2012/06/29 sample-025.c
 */

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

/*
 * swap_sub
 *
 *		引数上で値の交換
 */

void swap_sub ( int n, int m ) {

  s_print_string ( "swap_sub " );

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

}

/*
 * swap
 *
 *		値の交換
 */

int swap ( int n, int m ) {

  s_print_string ( "swap " );
  s_print_string ( "n = " );
  s_print_int ( n );
  s_print_string ( ", m = " );
  s_print_int ( m );
  s_print_newline();

  swap_sub ( m, n );	/* 引数の上では交換可能 */

}


/*
 *
 */

int main ( void ) {

  /*
   * swap ( 10, 15 )
   */

  swap ( 10, 15 );

  return 0;
}

/*
 *
 */
sample-025.c の実行結果
C:\usr\c>sample-025
swap n = 10, m = 15
swap_sub n = 15, m = 10
C:\usr\c> 

sample-026

Download : sample-026.c ( SJIS 版 )

sample-026.c
/*
 * 2012/06/29 sample-026.c
 */

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

/*
 * swap
 *
 *		値の交換 : 局所変数の利用
 */

int swap ( int n, int m ) {
  int w;		/* 局所変数 w の宣言 (w には何がはいっているか解らない..) */

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

  s_print_string ( "swap\n" );

  w = n;		/* この時点で w の値が初めて意味を持つ */
  n = m;		/* n の値も消えてしまうが.. w にコピーがある */
  m = w;		/* w にのこっているので、m,n の交換は可能.. */

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

}


/*
 *
 */

int main ( void ) {

  /*
   * swap ( 10, 15 )
   */

  swap ( 10, 15 );

  return 0;
}

/*
 *
 */
sample-026.c の実行結果
C:\usr\c>sample-026
n = 10, m = 15
swap
n = 15, m = 10
C:\usr\c> 

sample-027

Download : sample-027.c ( SJIS 版 )

sample-027.c
/*
 * 2012/06/29 sample-027.c
 */

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

/*
 *
 */

int main ( void ) {
  int w;	/* 変数を宣言するだけでは値が定まならない */

  s_print_string ( "w = " );
  s_print_int ( w );			/* どんな値になるかは神のみ知るぞ.. */
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-027.c の実行結果
C:\usr\c>sample-027
w = 1075765236
C:\usr\c> 

sample-028

Download : sample-028.c ( SJIS 版 )

sample-028.c
/*
 * 2012/06/29 sample-028.c
 */

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

/*
 *
 */

int main ( void ) {
  int w = 15;	/* 初期代入をする */

  s_print_string ( "w = " );
  s_print_int ( w );			/* 15 である事が保証される */
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-028.c の実行結果
C:\usr\c>sample-028
w = 15
C:\usr\c> 

sample-029

Download : sample-029.c ( SJIS 版 )

sample-029.c
/*
 * 2012/06/29 sample-029.c
 */

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

/*
 *	
 */

int main ( int argc, char *argv[] ) {
	int m;	/* 変数 m の宣言 */
	int n;	/* 変数 n の宣言 */
	int wa;	/* 変数 wa の宣言 */

	/*
	 * m,n の値の入力
	 */

	s_print_string ( "imput m = " );
	m = s_input_int();	

	s_print_string ( "imput n = " );
	n = s_input_int();	

	/*
	 * wa の計算
	 */

	wa = m + n;

	/*
	 * wa の結果出力
	 */

	 s_print_int ( m );
	 s_print_string ( " と " );
	 s_print_int ( n );
	 s_print_string ( " の和は " );
	 s_print_int ( wa );
	 s_print_string ( " です。\n" );

  return 0;
}

/*
 *
 */
入力例
12
5
sample-029.c の実行結果
C:\usr\c>sample-029<  sample-029.in
imput m = 12
imput n = 5
12 と 5 の和は 17 です。
C:\usr\c> 

sample-030

Download : sample-030.c ( SJIS 版 )

sample-030.c
/*
 * 2012/06/29 sample-030.c
 */

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

/*
 *	
 */

int prompt ( char *var_name ) {

  s_print_string ( "imput " );
  s_print_string ( var_name );
  s_print_string ( " = " );

  return s_input_int();
}

/*
 *	
 */

void print_result ( int m, int n, char *calc, int result ) {

	 s_print_int ( m );
	 s_print_string ( " と " );
	 s_print_int ( n );
	 s_print_string ( " の" );
	 s_print_string ( calc );
	 s_print_string ( "は " );
	 s_print_int ( result );
	 s_print_string ( " です。\n" );

}

/*
 *	
 */

void four_calc_sub ( int m, int n ) {

  print_result ( m, n, "和", m + n );
  print_result ( m, n, "差", m - n );
  print_result ( m, n, "積", m * n );
  print_result ( m, n, "商", m / n );
  print_result ( m, n, "余り", m % n );

}

/*
 *	
 */

void four_calc ( int m ) {

  four_calc_sub ( m, prompt ( "n" ) );
}

/*
 *	
 */

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

  four_calc ( prompt ( "m" ) );

  return 0;
}

/*
 *
 */
入力例
12
5
sample-030.c の実行結果
C:\usr\c>sample-030<  sample-030.in
imput m = 12
imput n = 5
12 と 5 の和は 17 です。
12 と 5 の差は 7 です。
12 と 5 の積は 60 です。
12 と 5 の商は 2 です。
12 と 5 の余りは 2 です。
C:\usr\c> 

sample-031

Download : sample-031.c ( SJIS 版 )

sample-031.c
/*
 * 2012/06/29 sample-031.c
 */

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

/*
 * swap
 *
 *		値の交換 : 他の変数を利用しなくても済む方法
 */

int swap ( int n, int m ) {

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

  s_print_string ( "swap\n" );

  n = n + m;
  m = n - m;
  n = n - m;

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

}

/*
 *
 */

int main ( void ) {

  /*
   * swap ( 10, 15 )
   */

  swap ( 10, 15 );

  return 0;
}

/*
 *
 */
sample-031.c の実行結果
C:\usr\c>sample-031
n = 10, m = 15
swap
n = 15, m = 10
C:\usr\c> 

本日の課題

課題 20120629-01

Download : 20120629-01.c ( SJIS 版 )

20120629-01.c
/*
 * 20120629-01-QQQQ.c
 *
 *	二つの実数を入力して、その四則を計算する
 */

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

/*
 *	print_result
 */

void print_result ( double a, double b, double r, char *message ) {

	s_print_double ( a );

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

	s_print_string ( message );
	s_print_string ( "は " );
	s_print_double ( r );
	s_print_string ( " です。" );
	s_print_newline();

}

/*
 *	wa
 */

void wa ( double a, double b ) {

	print_result ( a, b, a + b, "和" );

}

/*
 *	sa
 */

void sa ( double a, double b ) {


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


}


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


/*
 *	shisoku
 */

void shisoku ( double one, double two ) {


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

	sa ( one, two );		/* 差 */
	seki ( one, two );		/* 積 */
	sho ( one, two );		/* 商 */

}

/*
 *	input2
 */

void input2 ( double one ) {	/* 変数 one には一つ目の数値 */

  s_print_string ( "二つ目の実数を入力してください : " );
  shisoku ( one, s_input_double() );
	/* 二つ目の数値を入力して shisoku を呼ぶ */

}

/*
 *	main
 */

int main()
{

  s_print_string ( "一つ目の実数を入力してください : " );
  input2 ( s_input_double() );		/* 一つ目の数値を入力して input2 を呼ぶ */

  return 0;
}

/*
 *
 */
入力例
123.456
922.031
20120629-01.c の実行結果
C:\usr\c\20120629>20120629-01
一つ目の実数を入力してください : 123.456000
二つ目の実数を入力してください : 922.031000
123.456000 と 922.031000 の和は 1045.487000 です。
123.456000 と 922.031000 の差は -798.575000 です。
123.456000 と 922.031000 の積は 113830.259136 です。
123.456000 と 922.031000 の商は 0.133896 です。
C:\usr\c\20120629>

課題 20120629-02

Download : 20120629-02.c ( SJIS 版 )

20120629-02.c
/*
 * 20120629-01-QQQQ.c
 *
 *	方程式 cos(x) = x の根を二分法を用いて求める
 */

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

/*
 *	二分法による、方程式「cos(x) = x」の根の計算
 */

#define	EPSILON	(0.00000001)	/* 最小誤差を(自分で)决める */

double cosx_x_sub ( double min, double max, double mid ) {

	   if ( max - min < EPSILON ) {

				/*
				 * 十分に精度が得られたので、その結果を値とする
				 */


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


	   } else if ( cos(mid) - mid > 0.0 ) {

				/*
				 * 答は mid と max の間にある
				 */


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


	   } else {

				/*
				 * 答は min と mid の間にある
				 */

			return cosx_x_sub ( min, mid, (min+mid)/2.0 );
	   }

}

double cosx_x ( void ) {

		/*
		 *	COS(x) = x の解は 0 と π/2 の間にある
		 */

	   return cosx_x_sub ( 0, M_PI/2.0, M_PI/4.0 );

}

/*
 *
 */

int main ( void ) {

	s_print_string ( "COS(x) = x の方程式の解は " );
	s_print_double ( cosx_x() );
	s_print_string ( "です\n" );

	s_print_string ( "確かに " );
	s_print_double ( cosx_x() );
	s_print_string ( " = " );
	s_print_double ( cos(cosx_x()) );
	s_print_string ( " です\n" );

  return 0;
}

/*
 *
 */
入力例
123.456
922.031
20120629-02.c の実行結果
C:\usr\c\20120629>20120629-02
COS(x) = x の方程式の解は 0.739085です
確かに 0.739085 = 0.739085 です
C:\usr\c\20120629>

Links

関連 Link