Powered by SmartDoc

ソフトウェア概論A/B (2013/06/28)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

Download

次のファイルを、c:\usr\cに保存する。

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

サンプルファイル

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2013/06/28 sample-001.c
 */

/*
 * 色々な型
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o sample-001.exe sample-001.c
 *		実行
 *			sample-001
 */

#include <stdio.h>

#include "s_input.h"
#include "s_print.h"

/*
 *	main 関数
 */

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

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

	s_print_string ( "文字の '9' に 1 を加えると「" );
	s_print_char ( '9' + 1 );
	s_print_string ( "」になります。\n" );

	s_print_string ( "整数値の 9 に 1 を加えると「" );
	s_print_int ( 9 + 1 );
	s_print_string ( "」になります。\n" );

	/*
	 * 整数と浮動小数点数の違い
	 */

	s_print_string ( "13 を 2 で割ると「" );
	s_print_int ( 13 / 2 );
	s_print_string ( "」になります。\n" );

	s_print_string ( "13.0 を 2.0 で割ると" );
	s_print_double ( 13.0 / 2.0 );
	s_print_string ( "」になります。\n" );

	return 0;
}
sample-001.c の実行結果
C:\usr\c>sample-001
文字の '9' に 1 を加えると「:」になります。
整数値の 9 に 1 を加えると「10」になります。
13 を 2 で割ると「6」になります。
13.0 を 2.0 で割ると6.500000」になります。
C:\usr\c> 

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2013/06/28 sample-002.c
 */

/*
 * 関数の例
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o sample-002.exe sample-002.c
 *		実行
 *			sample-002
 */

#include <stdio.h>

#include "s_input.h"
#include "s_print.h"

/*
 *	int minus_int ( int number )
 *		int number		符号を反転したい整数の値
 *		return			number の値の符号を変換
 *
 *		minus_int を int を引数に int を返す関数
 */

int minus_int ( int number ) {

	return number * (-1);		/* 元の数に (-1) をかけると符号が反転する */
}

/*
 * void print_message ( int number );
 *		int number;
 *			処理結果を出力する
 */

void print_message ( int number ) {

	 s_print_int ( number );
	 s_print_string ( " の符号を反転すると " );
	 s_print_int ( minus_int ( number ) );
	 s_print_string ( " になります。\n" );

}


/*
 *	main 関数
 */

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

	print_message ( 12 );
	print_message ( 0 );
	print_message ( -12 );

	return 0;
}
sample-002.c の実行結果
C:\usr\c>sample-002
12 の符号を反転すると -12 になります。
0 の符号を反転すると 0 になります。
-12 の符号を反転すると 12 になります。
C:\usr\c> 

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2013/06/28 sample-003.c
 */

/*
 * 関数の例
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o sample-003.exe sample-003.c
 *		実行
 *			sample-003
 */

#include <stdio.h>

#include "s_input.h"
#include "s_print.h"

/*
 *	double minus_double ( double number )
 *		double number	符号を反転したい浮動小数点数の値
 *		return			number の値の符号を変換
 *
 *		minus_double を double を引数に double を返す関数
 */

double minus_double ( double number ) {

	return number * (-1.0);		/* 元の数に (-1.0) をかけると符号が反転する */
}

/*
 * void print_message ( double number );
 *		double number;
 *		処理結果を出力する
 */

void print_message ( double number ) {

	 s_print_double ( number );
	 s_print_string ( " の符号を反転すると " );
	 s_print_double ( minus_double ( number ) );
	 s_print_string ( " になります。\n" );

}


/*
 *	main 関数
 */

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

	print_message ( 12.0 );
	print_message ( 0.0 );
	print_message ( -12.0 );

	return 0;
}
sample-003.c の実行結果
C:\usr\c>sample-003
12.000000 の符号を反転すると -12.000000 になります。
0.000000 の符号を反転すると -0.000000 になります。
-12.000000 の符号を反転すると 12.000000 になります。
C:\usr\c> 

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2013/06/28 sample-004.c
 */

/*
 * 関数の例
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o sample-004.exe sample-004.c -lm
 *		実行
 *			sample-004
 */

#include <stdio.h>

	/* sqrt/sin を利用するために、必要 */
	/* コンパイルする場合に -lm を追加する必要がある事に注意 */

#include <math.h>

#include "s_input.h"
#include "s_print.h"

/*
 *	main 関数
 */

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

	s_print_string ( "円周率(π)は " );
	s_print_double ( M_PI );				/* math.h 内で定義 */
	s_print_string ( " です。\n" );

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

	s_print_string ( "π/6 の正弦は " );
	s_print_double ( sin ( M_PI/6.0 ) );
	s_print_string ( " です。\n" );

	return 0;
}
sample-004.c の実行結果
C:\usr\c>sample-004
円周率(π)は 3.141593 です。
2.0 の平方根は 1.414214 です。
π/6 の正弦は 0.500000 です。
C:\usr\c> 

講議中に作成したプログラム

本日の課題

課題 20130628-01 : キーボードから入力された一行の文字列を全て大文字にして出力する

Download : 20130628-01.c ( SJIS 版 )

20130628-01.c
/*
 * 課題 20130628-01
 *
 * 2013/06/28 20130628-01-QQQQ.c
 *
 *	キーボードから一行分の文字列を読込み、その中の小文字を全て大文字にする
 */

#include <stdio.h>

#include "s_input.h"
#include "s_print.h"

/*
 * char to_upper_case ( char ch )
 *		char ch		大文字にしたい文字の文字コード
 *		return		ch が小文字ならば大文字にした文字コード、そうでなければ元の値
 */

char to_upper_case ( char ch ) {

	if ( 'a' <= ch && ch <= 'z' ) { 	/* もし ch が小文字ならば */
		/* 対応する大文字に変換して返す */

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

	} else {							/* そうでなければ.. */
		return ch;						/* 入力された文字コードをそのまま返す */
	}

}

/*
 *	void print_upper_line ( char next )
 *		char next	次に処理すべき文字 (文字を先読みする)
 */

void print_upper_line ( char next )	{

	if ( next == '\n' )	{	/* 次の処理すべき文字が改行ならば */
		s_print_newline();		/* 改行を出力して終わり */
	} else {					/* 改行でないならば.. */
								/* その文字を大文字にして出力し.. */
		s_print_char ( to_upper_case ( next ) );
								/* 次の文字を読込み、処理を続ける */
								/* 文字の読込みには getchar() を使う */

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

	}
}

/*
 *	main
 */

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

	/* 最初の文字を読込み、関数を読み込む */

	print_upper_line ( getchar() );

	/* s_input_char() でなく getchar() を利用するのは、
	 * s_input_char() が空白や改行を読み捨てるようになっているため
	 * 今回は、改行も読み出したいので getchar() を利用する
	 */

	return 0;
}
入力例
ABC123abc456UvW
20130628-01.c の実行結果
C:\usr\c\> 20130628-01-QQQQ
AABBCC112233aAbBcC445566UUvVWW

C:\usr\c\> 

課題 20130628-02 : 入力された数の 3 乗根(の近似値)を求める

Download : 20130628-02.c ( SJIS 版 )

20130628-02.c
/*
 * 課題 20130628-02
 *
 * 2013/06/28 DATE-02-QQQQ.c
 *
 *	一つ浮動小数点数値をキーボードから入力し、その立方根を出力する
 *	手段としては、「二分法」を使う
 */

#include <stdio.h>

#include "s_input.h"
#include "s_print.h"

/*
 *
 */

#define	EPSILON	0.00000001		/* 誤差幅 */

/*
* double regula_falsi_cubic_root ( double a, double min, double mid, double \
    max )
 *		double a	立方根の元になる数(正を仮定している)
 *		double min, max 根の入る区間の範囲
 *		double mid	min と mid の中点
 *		return		a 立方根
 *			二分法により、a の立方根を求める
 *			0 < min < a の立方根 < max
 */

double regula_falsi_cubic_root ( double a, double min, double mid, double \
    max ) {

	if ( max - min < EPSILON ) {	/* 十分に精度が上った */
		return mid;					/* 中点の値を答として返す */
	} else {						/* まだ、狭める必要がある */
		/* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */
		/* f(x)=x^3-a */
		if ( mid * mid * mid - a < 0.0 ) {	/* f(mid) の符号を確認 */
					/* 解の左にあった */

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

		} else {	/* 解の右にあった */
			return regula_falsi_cubic_root ( a, min, (min+mid)/2.0, mid );
		}
	}
}


/*
 * double cubic_root ( double a )
 *		double a	立方根の元になる数
 *		return		a 立方根
 *			a の立方根を求めて結果として返すが、
 *			計算の基本は、regula_falsi_cubic_root にまかせる
 *			ここでは、計算の正規化を行う
 */

double cubic_root ( double a ) {

	if ( a < 0.0 ) {					/* a が負の数ならば.. */
		/* -a の立方根を計算し、負数を返す */

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

	} else if ( a < 1.0 ) {				/* a が 1.0 以下なら */

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

										/* 立方根は a と 1.0 の間にある */
	} else {							/* そうでなければ.. */
		return regula_falsi_cubic_root ( a, 1.0, (1.0+a)/2.0, a );
										/* 立方根は 1.0 と a の間にある */
	}

}

/*
 * void print_cubic_root ( double a )
 *		double a	立方根を計算する数
 *			元の数と、立方根を出力する
 */

void print_cubic_root ( double a ) {

	 s_print_double ( a );
	 s_print_string ( " の立方根は " );

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

	 s_print_string ( " です。\n" );

}

/*
 *	main
 */

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

	s_print_string ( "実数値を一つ入力してください : " );	
	print_cubic_root ( s_input_double() );

	return 0;
}
入力例
12.34
20130628-02.c の実行結果
C:\usr\c\> 20130628-02-QQQQ
実数値を一つ入力してください : 12.34
 12.340000 の立方根は 2.310850 です。
C:\usr\c\> 

Links