Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

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

サンプルファイル

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2015/10/30 sample-001.c
 */

/*
 *  多次元配列
 *
 * 利用方法
 *		コンパイル
 *			cc -I../include -o BASENAME.exe sample-001.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 *	main
 *
 */

int main( int argc, char *argv[] )
{
	int a[3][4];	/* 二次元配列の宣言 3 x 4 個の変数を宣言 */
					/* int a00, a01, .., a03, a10, .., a13, .., a23; と同様 */
	int i;
	int j;

	a[0][0] = 0;	/* 添字は、二つ必要 ( 二次なので.. ) で、0 から始まる */
	a[2][3] = 6;	/* 添字の大きさは、配列の大きさ - 1 まで */

	/* 0 〜 2 と 0 〜 3 のかけ算表をつくってみる */
	for ( i = 0; i < 3; i++ )	{
		for ( j = 0; j < 4; j++ ) {
			a[i][j] = i * j;
		}
	}

	printf ( "2 * 1 = %d\n", a[2][1] );	/* 2 と表示される筈 */

	if ( a[1][2] == a[2][1] ) {	/* 1 * 2 = 2 * 1 か ? */
		printf ( "1 * 2 = 2 * 1 が成立\n" );
	} else {
		printf ( "1 * 2 = 2 * 1 が成立しない.. 何か変だ..\n" );
	}

	/* 0 〜 2 と 0 〜 3 のかけ算表を画面に表示 */

	printf ( " * |" );
	for ( j = 0; j < 4; j++ ) {
		printf ( "%2d", j );
	}
	printf ( "\n" );
	printf ( "---+---------\n" );

	for ( i = 0; i < 3; i++ )	{
		printf ( " %1d |", i );
		for ( j = 0; j < 4; j++ ) {
			printf ( "%2d", a[i][j] );
		}
		printf ( "\n" );
	}

	return 0;
}
sample-001.c の実行結果
Can not access : program/sample-001.out

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2015/10/30 sample-002.c
 */

/*
 * 集合の操作は操作の集合
 *
 * 利用方法
 *		コンパイル
 *			cc -I../include -o BASENAME.exe sample-002.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 *	main
 *
 */

#define	ARRAY_SIZE	5		/* 配列のサイズを 5 とする */

int main( int argc, char *argv[] )
{
	int a[ARRAY_SIZE];	/* ARRAY_SIZE の配列の宣言 */
	int i;

	for ( i = 0; i < ARRAY_SIZE; i++ ) {
		a[i] = 2 * i;		/* 一桁の偶数の表を作る */
	}

	/* 偶数を出力 */
	for ( i = 0; i < ARRAY_SIZE; i++ ) {
		printf ( "%d ", a[i] );
	}
	printf ( "\n" );

	/* 全ての要素に 1 を加えれば奇数の表になる */

	for ( i = 0; i < ARRAY_SIZE; i++ ) {
		a[i] = a[i] + 1;
	}

	/* 奇数を出力 */
	for ( i = 0; i < ARRAY_SIZE; i++ ) {
		printf ( "%d ", a[i] );
	}
	printf ( "\n" );

	return 0;
}
sample-002.c の実行結果
Can not access : program/sample-002.out

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2015/10/30 sample-003.c
 */

/*
 *  文字配列と文字列 (1)
 *
 * 利用方法
 *		コンパイル
 *			cc -I../include -o BASENAME.exe sample-003.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 *	main
 *
 */

#define	CSIZE	10
#define	EOS		'\0'

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

	cary[0] = 'a';
	cary[1] = 'b';
	cary[2] = 'c';
	cary[3] = EOS;
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'c'|EOS| ? | ? | ? | ? | ? | ? |
		*/

	printf ( "普通に文字列 \"abc\" を出力してみる : %s\n", "abc" );
		/* 文字列を出力する場合の書式は「%s」を利用する */

	printf ( "文字列の代りに文字配列を出力してみる : %s\n", cary );
		/* 文字列の代りに文字配列名が使える */

	return 0;
}
sample-003.c の実行結果
$ ./sample-003.exe
普通に文字列 "abc" を出力してみる : abc
文字列の代りに文字配列を出力してみる : abc
$ 

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2015/10/30 sample-004.c
 */

/*
 *  文字配列と文字列 (2)
 *
 * 利用方法
 *		コンパイル
 *			cc -I../include -o BASENAME.exe sample-004.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 *	main
 *
 */

#define	CSIZE	10
#define	EOS		'\0'

int main( int argc, char *argv[] )
{
	char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS };
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
		*/
	int i;
	int l;

	/*
	 *	文字列と文字配列
	 */

	printf ( "最初の cary = %s\n", cary );

	/*
	 *	文字の変更
	 */

	cary[2] = 'A';	/* 文字列の途中の文字を差し替える */
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|'d'|'e'|EOS| ? | ? | ? | ? |
		*/

	printf ( "文字列の途中の文字を変更すると cary = %s\n", cary );

	/*
	 *	文字の尻尾を切断
	 */

	cary[3] = EOS;	/* 文字列の後ろを切断 */
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|EOS|'e'|EOS| ? | ? | ? | ? |
		*/
	printf ( "文字列を途中で切ると cary = %s\n", cary );

	/*
	 *	文字を尻尾に追加
	 */

	cary[3] = 'X';
	cary[5] = 'Y';
	cary[6] = 'Z';
	cary[7] = EOS;		/* 文字列の最後に EOS を忘れずに !! */

		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? |
		*/

	printf ( "文字列の後ろに文字を追加すると cary = %s\n", cary );

	/*
	 *	文字配列の出力
	 */

	 printf ( "printf を使わず、文字配列を文字列のように出力すると : " );
	 for ( i = 0; cary[i] != EOS; i++ ) {
	 	putchar ( cary[i] );
	 }
	 printf ( "と、なります。\n" );

	 /* 文字列の長さを求める */

	 for ( l = 0; cary[l] != EOS; l++ ) {
		/* やる事は何もない (l を増やす事が目的) */
	 }

	/* cary の中の文字列の長さは、変数 l に入る */

	 printf ( "文字列 %d の長さは %d です。\n", cary, l );

	/*
	 *	途中の文字を削除
	 */

	for ( i = 3; cary[i] != EOS; i++ ) {
		cary[i] = cary[i+1];
	}

		/* 文字列の途中(4 文字目)の文字('X')を削除 */

		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? |
				  |   |   |     /   /   /   /
			    |'a'|'b'|'A'|'e'|'Y'|'Z'|EOS|EOS| ? | ? |
		*/

	printf ( "文字列の途中の文字を削除すると cary = %s\n", cary );

	return 0;
}
sample-004.c の実行結果
Can not access : program/sample-004.out

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2015/10/30 sample-005.c
 */

/*
 *  文字配列と文字列 (2)
 *
 * 利用方法
 *		コンパイル
 *			cc -I../include -o sample-005.exe sample-005.c
 *		実行
 *			./sample-005.exe
 */

#include <stdio.h>

/*
 *	main
 *
 */

#define	CSIZE	10
#define	EOS		'\0'

int main( int argc, char *argv[] )
{
	char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS };
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
		*/
	int i;
	int l;

	/*
	 *	文字列と文字配列
	 */

	printf ( "最初の cary = %s\n", cary );

	/*
	 *	文字の変更
	 */

	cary[2] = 'A';	/* 文字列の途中の文字を差し替える */
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|'d'|'e'|EOS| ? | ? | ? | ? |
		*/

	printf ( "文字列の途中の文字を変更すると cary = %s\n", cary );

	/*
	 *	文字の尻尾を切断
	 */

	cary[3] = EOS;	/* 文字列の後ろを切断 */
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|EOS|'e'|EOS| ? | ? | ? | ? |
		*/
	printf ( "文字列を途中で切ると cary = %s\n", cary );

	/*
	 *	文字を尻尾に追加
	 */

	cary[3] = 'X';
	cary[5] = 'Y';
	cary[6] = 'Z';
	cary[7] = EOS;		/* 文字列の最後に EOS を忘れずに !! */

		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? |
		*/

	printf ( "文字列の後ろに文字を追加すると cary = %s\n", cary );

	/*
	 *	文字配列の出力
	 */

	 printf ( "printf を使わず、文字配列を文字列のように出力すると : " );
	 for ( i = 0; cary[i] != EOS; i++ ) {
	 	putchar ( cary[i] );
	 }
	 printf ( "と、なります。\n" );

	 /* 文字列の長さを求める */

	 for ( l = 0; cary[l] != EOS; l++ ) {
		/* やる事は何もない (l を増やす事が目的) */
	 }

	/* cary の中の文字列の長さは、変数 l に入る */

	 printf ( "文字列 %d の長さは %d です。\n", cary, l );

	/*
	 *	途中の文字を削除
	 */

	for ( i = 3; cary[i] != EOS; i++ ) {
		cary[i] = cary[i+1];
	}

		/* 文字列の途中(4 文字目)の文字('X')を削除 */

		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? |
				  |   |   |     /   /   /   /
			    |'a'|'b'|'A'|'e'|'Y'|'Z'|EOS|EOS| ? | ? |
		*/

	printf ( "文字列の途中の文字を削除すると cary = %s\n", cary );

	return 0;
}
sample-005.c の実行結果
Can not access : program/sample-005.out

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2015/10/30 sample-010.c
 */

/*
 * 様々な配列の要素の参照方法
 *
 * 利用方法
 *		コンパイル
 *			cc -I../include -o BASENAME.exe sample-010.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 *	main
 *
 */

int main( int argc, char *argv[] )
{
	int a[3][4];	/* 二次元配列の宣言 3 x 4 個の変数を宣言 */
					/* int a00, a01, .., a03, a10, .., a13, .., a23; と同様 */
	int i;
	int j;

	a[0][0] = 0;	/* 添字は、二つ必要 ( 二次なので.. ) で、0 から始まる */
	a[2][3] = 6;	/* 添字の大きさは、配列の大きさ - 1 まで */

	/* 0 〜 2 と 0 〜 3 のかけ算表をつくってみる */
	for ( i = 0; i < 3; i++ )	{
		for ( j = 0; j < 4; j++ ) {
			a[i][j] = i * j;
		}
	}

	printf ( "2 * 1 = %d\n", a[2][1] );	/* 2 と表示される筈 */

	if ( a[1][2] == a[2][1] ) {	/* 1 * 2 = 2 * 1 か ? */
		printf ( "1 * 2 = 2 * 1 が成立\n" );
	} else {
		printf ( "1 * 2 = 2 * 1 が成立しない.. 何か変だ..\n" );
	}

	/* 0 〜 2 と 0 〜 3 のかけ算表を画面に表示 */

	printf ( " * |" );
	for ( j = 0; j < 4; j++ ) {
		printf ( "%2d", j );
	}
	printf ( "\n" );
	printf ( "---+---------\n" );

	for ( i = 0; i < 3; i++ )	{
		printf ( " %1d |", i );
		for ( j = 0; j < 4; j++ ) {
			printf ( "%2d", a[i][j] );
		}
		printf ( "\n" );
	}

	return 0;
}
sample-010.c の実行結果
Can not access : program/sample-010.out

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

本日の課題

課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。

なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。

課題 20151030-01 : 配列の要素の和を求める

Download : 20151030-01.c ( SJIS 版 )

20151030-01.c
/*
 * 課題 20151023-01
 *
 * 2015/10/23 20151023-01-QQQQ.c
 *
 *	浮動小数点数の配列の要素内の数値の総和を求める。
 */

#include <stdio.h>

/*
 *  浮動小数点数の配列の要素内の数値の総和を求める。
 *
 * 利用方法
 *		コンパイル
 *			cc -o BASENAME.exe 20151023-01-QQQQ.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 * double dsum ( double ary[], int size )
 *		浮動小数点数の配列の要素内の数値の総和を求める関数
 *	double ary[]; 総和を求める要素を含む配列
 *	int size; 配列のサイズ
 */

double dsum ( double ary[], int size ) {
	double sum = 0.0;	/* 総和は最初は 0 */
	int i;				/* 配列の要素を参照する添字変数 */

	for ( i = 0; i < size; i++ ) {	/* i = 0 〜 sum - 1 の間.. */

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

								/* 「sum += ary[i]」とも書きける */
	}

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

}

/*
 *	main
 */

#define	ARY_SIZE	5

int main( int argc, char *argv[] )
{
	double data[ARY_SIZE];	/* 大きさ ARY_SIZE の配列の宣言 */
	int i;					/* 配列の要素を参照する添字変数 */
	double sum;				/* 総和の計算結果を保持する */

	printf ( "%d 個のデータを入力します。\n", ARY_SIZE );
	for ( i = 0; i < ARY_SIZE; i++ ) {
		printf ( "%d 番目の数値を入力してください : ", i + 1 );

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

	}

	sum = dsum ( data, ARY_SIZE );

	printf ( "入力されたデータの総和は %f です。\n", sum );

	return 0;
}
入力例
2.3
9.1
5.9
2.7
3.2
20151030-01.c の実行結果
$ ./20151030-01-QQQQ.exe
5 個のデータを入力します。
1 番目の数値を入力してください : 2.300000
2 番目の数値を入力してください : 9.100000
3 番目の数値を入力してください : 5.900000
4 番目の数値を入力してください : 2.700000
5 番目の数値を入力してください : 3.200000
入力されたデータの総和は 23.200000 です。
$ 

課題 20151030-02 : 文字の挿入

Download : 20151030-02.c ( SJIS 版 )

20151030-02.c
/*
 * 課題 20151023-02
 *
 * 20151023 20151023-02-QQQQ.c
 *
 * 文字列の途中に文字を挿入する
 *
 * 利用方法
 *		コンパイル
 *			cc -o BASENAME.exe 20151023-02-QQQQ.c
 *		実行
 *			./BASENAME.exe
 */

#include <stdio.h>

/*
 *
 */

/*
 *	main
 *
 */

#define	CSIZE	10
#define	EOS		'\0'

int main( int argc, char *argv[] )
{
	char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS };
		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
		*/
	int i;
	int l;

	printf ( "最初の cary = %s\n", cary );

	/*
		文字列 "abcde" の入った文字配列 cary の
		3 文字目 ('c') と 4 文字目 'd' の間に、一文字 'X' を入れる
	*/

	 /* 文字列の長さを求める */


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


	/* cary の中の文字列の長さは、変数 l に入る */

	 for ( i = l; 3 <= i; i-- )	{		/* 後ろからコピーする必要がある */

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

	 }
	 cary[3] = 'X';						/* 空けた場所に 'X' を入れる */

		/*
		 		| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
			cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
			      |   |   |     \   \   \
			cary|'a'|'b'|'c'|'X'|'d'|'e'|EOS| ? | ? | ? | ? |
		*/

	printf ( "'X' を挿入した結果 : %s\n", cary );

	return 0;
}
入力例
123
987
456
20151030-02.c の実行結果
$ ./20151030-02-QQQQ.exe
最初の cary = abcde
'X' を挿入した結果 : abcXde
$