Powered by SmartDoc

ソフトウェア概論A/B (2017/11/17)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

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

Download : sample-001.c

sample-001.c
/*
 * 2017/11/17 sample-001.c
 */

/*
 * 文字列の入力\n *\tscanf の「%s」で文字列を入力する事ができる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-001.c
 *		リンク 
 *			cc -o sample-001.exe sample-001.c 
 *		実行
 *			./sample-001.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

#define	LINE_SIZE	128		/* 入力する文字列より大きなサイズにする */

int main ( int argc, char *argv[] ) {
	char line[LINE_SIZE];	/* 入力する文字列を収める文字型配列 */

	printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " );

	scanf ( "%s", line );	/* 書式は「%s」で、文字型配列名を直接使う(&)は不要 */

	printf ( "あなたが入力した文字列は「%s」です。\n", line );
		/* 空白文字(空白/タブ/改行)があると、「文字列の区切」とみなされる */

	return 0;
}
入力例
空白(' ')を含んだ、適当な長さの文字列
sample-001.c の実行結果
$ ./sample-001.exe < sample-001.in
キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: 空白('
あなたが入力した文字列は「空白('」です。
$ 

Download : sample-002.c

sample-002.c
/*
 * 2017/11/17 sample-002.c
 */

/*
 * 文字列の入力 (2)\n *\tgets で文字列を入力する事ができる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-002.c
 *		リンク 
 *			cc -o sample-002.exe sample-002.c 
 *		実行
 *			./sample-002.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

#define	LINE_SIZE	128		/* 入力する文字列より大きなサイズにする */

int main ( int argc, char *argv[] ) {
	char line[LINE_SIZE];	/* 入力する文字列を収める文字型配列 */

	printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " );

	gets ( line );
		/* gets では、「一行(改行の直前迄:改行含まず)」の文字列が入力される */

	printf ( "あなたが入力した文字列は「%s」です。\n", line );
		/* gets は一行(改行)までを入力する */

	return 0;
}
入力例
空白(' ')を含んだ、適当な長さの文字列
sample-002.c の実行結果
$ ./sample-002.exe < sample-002.in
キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: 空白(' ')を含んだ、適当な長さの文字列
あなたが入力した文字列は「空白(' ')を含んだ、適当な長さの文字列」です。
$ 

Download : sample-003.c

sample-003.c
/*
 * 2017/11/17 sample-003.c
 */

/*
 * 文字列の入力 (3)\n *\tfgets で文字列を入力する事ができる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-003.c
 *		リンク 
 *			cc -o sample-003.exe sample-003.c 
 *		実行
 *			./sample-003.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

#define	LINE_SIZE	128		/* 入力する文字列より大きなサイズにする */

int main ( int argc, char *argv[] ) {
	char line[LINE_SIZE];	/* 入力する文字列を収める文字型配列 */

	printf ( "キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: " );

	fgets ( line, LINE_SIZE, stdin );
		/* 入力先は、「標準入力 (stdin)」となる */
		/* fgets では、文字列サイズが指定できる (安全) */
		/* 指定したサイズより長い文字列は、入力が「待たされ」る */

	printf ( "あなたが入力した文字列は「%s」です。\n", line );
		/* 入力文字列内には、「改行」も含まれる */

	return 0;
}
入力例
空白(' ')を含んだ、適当な長さの文字列
sample-003.c の実行結果
$ ./sample-003.exe < sample-003.in
キーボードから、「空白(' ')を含んだ、適当な長さの文字列」と入力して Enter キーを押してください。: 空白(' ')を含んだ、適当な長さの文字列
あなたが入力した文字列は「空白(' ')を含んだ、適当な長さの文字列
」です。
$ 

Download : sample-011.c

sample-011.c
/*
 * 2017/11/17 sample-011.c
 */

/*
 * sizeof 演算子\n *\t型名を指定する事により、そのサイズ(byte 単位)を得る事ができる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-011.c
 *		リンク 
 *			cc -o sample-011.exe sample-011.c 
 *		実行
 *			./sample-011.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

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

	printf ( "sizeof ( char   ) = %d\n", sizeof ( char ) );
	printf ( "sizeof ( int    ) = %d\n", sizeof ( int ) );
	printf ( "sizeof ( double ) = %d\n", sizeof ( double ) );

	return 0;
}
sample-011.c の実行結果
$ ./sample-011.exe
sizeof ( char   ) = 1
sizeof ( int    ) = 4
sizeof ( double ) = 8
$ 

Download : sample-012.c

sample-012.c
/*
 * 2017/11/17 sample-012.c
 */

/*
 * sizeof 演算子 (2)\n *\t変数名を指定する事により、そのサイズ(byte 単位)を得る事ができる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-012.c
 *		リンク 
 *			cc -o sample-012.exe sample-012.c 
 *		実行
 *			./sample-012.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

int main ( int argc, char *argv[] ) {
	char cvar;
	int ivar;
	double dvar;

	printf ( "sizeof ( cvar ) = %d\n", sizeof ( cvar ) );
	printf ( "sizeof ( ivar ) = %d\n", sizeof ( ivar ) );
	printf ( "sizeof ( dvar ) = %d\n", sizeof ( dvar ) );

	return 0;
}
sample-012.c の実行結果
$ ./sample-012.exe
sizeof ( cvar ) = 1
sizeof ( ivar ) = 4
sizeof ( dvar ) = 8
$ 

Download : sample-013.c

sample-013.c
/*
 * 2017/11/17 sample-013.c
 */

/*
 * sizeof 演算子 (3)\n *\t配列名を指定する事により、そのサイズ(byte 単位)を得る事ができる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-013.c
 *		リンク 
 *			cc -o sample-013.exe sample-013.c 
 *		実行
 *			./sample-013.exe
 */


#include <stdio.h>

/*
 * main 関数
 */

int main ( int argc, char *argv[] ) {
	char cary[100];
	int iary[100];
	double dary[100];

	printf ( "sizeof ( cary ) = %d\n", sizeof ( cary ) );
	printf ( "sizeof ( iary ) = %d\n", sizeof ( iary ) );
	printf ( "sizeof ( dary ) = %d\n", sizeof ( dary ) );

	return 0;
}
sample-013.c の実行結果
$ ./sample-013.exe
sizeof ( cary ) = 100
sizeof ( iary ) = 400
sizeof ( dary ) = 800
$ 

Download : sample-014.c

sample-014.c
/*
 * 2017/11/17 sample-014.c
 */

/*
 * sizeof 演算子 (4)\n *\t値を指定する事もできる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-014.c
 *		リンク 
 *			cc -o sample-014.exe sample-014.c 
 *		実行
 *			./sample-014.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

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

	printf ( "sizeof ( 'a'  ) = %d\n", sizeof ( 'a' ) );
			/* sizeof ( int ) [整数] になっている */
	printf ( "sizeof ( 123  ) = %d\n", sizeof ( 123 ) );
	printf ( "sizeof ( 12.3 ) = %d\n", sizeof ( 12.3 ) );

	return 0;
}
sample-014.c の実行結果
$ ./sample-014.exe
sizeof ( 'a'  ) = 4
sizeof ( 123  ) = 4
sizeof ( 12.3 ) = 8
$ 

Download : sample-015.c

sample-015.c
/*
 * 2017/11/17 sample-015.c
 */

/*
 * sizeof 演算子 (5)\n *\t式のサイズも得られる\n *\tchar 型のデータは、計算の時に、int 型に昇格する
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-015.c
 *		リンク 
 *			cc -o sample-015.exe sample-015.c 
 *		実行
 *			./sample-015.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

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

	printf ( "sizeof ( ch ) = %d\n", sizeof ( ch ) );
			/* sizeof ( char ) [文字] になっている */

	printf ( "sizeof ( ch + dh ) = %d\n", sizeof ( ch + dh ) );
			/* sizeof ( int ) [整数] になっている */
			/* 無条件の型の昇格がおきている */

	return 0;
}
sample-015.c の実行結果
$ ./sample-015.exe
sizeof ( ch ) = 1
sizeof ( ch + dh ) = 4
$ 

Download : sample-016.c

sample-016.c
/*
 * 2017/11/17 sample-016.c
 */

/*
 * 型の昇格\n *\tint 型から double 型への変換
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-016.c
 *		リンク 
 *			cc -o sample-016.exe sample-016.c 
 *		実行
 *			./sample-016.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

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

	printf ( "sizeof ( num )       = %d\n", sizeof ( num ) );
	printf ( "sizeof ( num + 'A' ) = %d\n", sizeof ( num + 'A' ) );
	printf ( "sizeof ( num + mum ) = %d\n", sizeof ( num + mum ) );
	printf ( "sizeof ( num + 1.0 ) = %d\n", sizeof ( num + 1.0 ) );

	return 0;
}
sample-016.c の実行結果
$ ./sample-016.exe
sizeof ( num )       = 4
sizeof ( num + 'A' ) = 4
sizeof ( num + mum ) = 4
sizeof ( num + 1.0 ) = 8
$ 

Download : sample-017.c

sample-017.c
/*
 * 2017/11/17 sample-017.c
 */

/*
 * 型の変換\n *\t代入では、必要に応じて型変換が行わる
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-017.c
 *		リンク 
 *			cc -o sample-017.exe sample-017.c 
 *		実行
 *			./sample-017.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

int main ( int argc, char *argv[] ) {
	char ch = 'A';		/* そもそも 'A' は int 型 */
	int num = 'A';
	double fp = 'A';	/* int 型から double 型へ */

	ch = ch - 'A' + 'a';	/* int 型から char 型へ */
	ch = num;				/* int 型から char 型へ */
	num = fp;				/* double 型から int 型へ */

	printf ( "ch  = %c\n", ch );
	printf ( "num = %d\n", num );
	printf ( "fp  = %f\n", fp );

	return 0;
}
sample-017.c の実行結果
$ ./sample-017.exe
ch  = A
num = 65
fp  = 65.000000
$ 

Download : sample-018.c

sample-018.c
/*
 * 2017/11/17 sample-018.c
 */

/*
 * 型の変換 (2)\n *\tサイズの大きい方から、小さい方への変換は危険
 *
 * 利用方法
 *		コンパイル 
 *			cc  -c sample-018.c
 *		リンク 
 *			cc -o sample-018.exe sample-018.c 
 *		実行
 *			./sample-018.exe
 */

#include <stdio.h>

/*
 * main 関数
 */

int main ( int argc, char *argv[] ) {
	char ch = 'A';
	int num = 'A';
	double fp = 'A';

	/* 個々に適切な値を入れれば問題はない */

	printf ( "[適切な値]\n" );
	printf ( "\tch  = '%c' [%d]\n", ch, ch );
	printf ( "\tnum = %d\n", num );
	printf ( "\tfp  = %f\n", fp );

	/* char 型に収まらないサイズの値を代入すると ?? */

	num = 1000;		/* 1000 > 255 なので、1000 は char 型に収まらない */
	ch = num;		/* 代入を行うとどうなるか */

	printf ( "[char に大きな値]\n" );
	printf ( "\tch  = '%c' [%d]\n", ch, ch );
	printf ( "\tnum = %d\n", num );

	/* int 型に収まらないサイズの値を代入すると ?? */

	fp = 1000000000000;
	num = fp;
	ch = fp;

	printf ( "[int に大きな値]\n" );
	printf ( "\tch  = '%c' [%d]\n", ch, ch );
	printf ( "\tnum = %d\n", num );
	printf ( "\tfp  = %f\n", fp );

	return 0;
}
sample-018.c の実行結果
$ ./sample-018.exe
[適切な値]
	ch  = 'A' [65]
	num = 65
	fp  = 65.000000
[char に大きな値]
	ch  = '?' [-24]
	num = 1000
[int に大きな値]
	ch  = '' [0]
	num = -2147483648
	fp  = 1000000000000.000000
$ 

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

本日の課題

課題 20171117-01 : 一行文の文字列を入力して、その中の文字列を全て大文字に変換する

Download : 20171117-01.c

20171117-01.c
/*
 * 20171117-01-QQQQ.c
 *	一行文の文字列を入力して、その中の文字列を全て大文字に変換する
 */

#include <stdio.h>

/*
 *  islower (ch) : 指定された文字が、小文字かどうかを判定する
 */

int islower ( int ch ) {

	return 'a' <= ch && ch <= 'z';	/* 'a' 〜 'z' なら小文字 */
}

/*
 * toupper ( ch ) : 指定された文字が、小文字なら大文字に変換
 */

int toupper ( int ch ) {

	if ( islower ( ch ) ) {		/* 小文字だった.. */

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

	} else {					/* そうでないなら */
		return ch;				/* そのまま返す */
	}
}

/*
 * main
 */

#define	EOS			'\0'	/* EOS を定義 */
#define	LINE_SIZE	128		/* 入力するのに十分に大きなサイズにする */

int main ( void ) {
	char line[LINE_SIZE];
	int i;

	printf ( "小文字を含んだ文字列を入力してください : " );


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


	for ( i = 0; line[i] != EOS; i++ ) {
		line[i] = toupper ( line[i] );	/* 小文字を大文字に変換 */
	}

	printf ( "結果 : %s", line );

	return 0;
}
入力例
小文字(abc)と大文字(ABC)を入力
20171117-01.c の実行結果
$ ./20171117-01-QQQQ.exe
小文字を含んだ文字列を入力してください : 結果 : 小文字(ABC)と大文字(ABC)を入力
$ 

Links

関連 Link