Powered by SmartDoc

ソフトウェア概論A/B (2019/09/27)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

Download

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

Download : sample-001.c

sample-001.c
/*
 * CDATE sample-001.c
 */

/*
 *  複数条件の分岐
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-001.exe sample-001.c
 *		実行
 *			sample-001
 */

#include <stdio.h>

/*
 * trump
 *   トランプの番号から、その名前を表示する
 */

void trump ( int number ) {

	printf ( "数値 %d の表すカードは、", number );

	if ( number == 1 ) {	/* 番号が 1 なら エース (A) */
	 	printf ( "エース" );
	} else if ( number == 11 ) {	/* 番号が 11 なら ジャック (J) */
	 	printf ( "ジャック" );
	} else if ( number == 12 ) {	/* 番号が 12 なら クイーン (Q) */
	 	printf ( "クイーン" );
	} else if ( number == 13 ) {	/* 番号が 13 なら キング (K) */
	 	printf ( "キング" );
	} else if ( number == 0 ) {	/* 番号が 0 の場合は例外的に ジョーカー ($) */
	 	printf ( "ジョーカー" );
	} else {	/* それ以外 */
		if ( number < 0 ) {		/* 番号が負の場合は.. */
		 	printf ( "範囲外" );
		} else if ( 13 < number )	{	/* 番号が 13 より大きい場合は.. */	
		 	printf ( "範囲外" );
		} else {   						/* それ以外は.. */
			printf ( "%d の数カード", number );
		}
	}

	printf ( "です。\n" );

}

/*
 *	main
 *
 */

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

	trump ( -1 );
	trump ( 0 );
	trump ( 1 );
	trump ( 7 );
	trump ( 10 );
	trump ( 13 );
	trump ( 20 );

	return 0;
}
sample-001.c の実行結果
$ ./sample-001.exe
数値 -1 の表すカードは、範囲外です。
数値 0 の表すカードは、ジョーカーです。
数値 1 の表すカードは、エースです。
数値 7 の表すカードは、7 の数カードです。
数値 10 の表すカードは、10 の数カードです。
数値 13 の表すカードは、キングです。
数値 20 の表すカードは、範囲外です。
$ 

Download : sample-002.c

sample-002.c
/*
 * 2019/09/27 sample-002.c
 */

/*
 *  複数条件の分岐(case 文を利用した場合)
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-002.exe sample-002.c
 *		実行
 *			sample-002
 */

#include <stdio.h>

/*
 * trump
 *   トランプの番号から、その名前を表示する
 */

void trump ( int number ) {

	printf ( "数値 %d の表すカードは、", number );

	switch ( number ) {		/* 一つの式の値で分岐 */
	case 1:					/* 番号が 1 なら エース (A) { (開きブロック) */
	 	printf ( "エース" );
		break;				/* ここで 1 の場合がおわる  } (閉じブロック) */
	case 11:				/* 番号が 11 なら ジャック (J) */
	 	printf ( "ジャック" );
		break;
	case 12:				/* 番号が 12 なら クイーン (Q) */
	 	printf ( "クイーン" );
		break;
	case 13:				/* 番号が 13 なら キング (K) */
	 	printf ( "キング" );
		break;
	case 0: 				/* 番号が 0 の場合は例外的に ジョーカー ($) */
	 	printf ( "ジョーカー" );
		break;
	case 2:					/* 範囲は指定できないので、全て列挙 */
							/* 2 の場合は 3 の場合と同じなので break しない */
	case 3:
	case 4:
	case 5:
	case 6:
	case 7:
	case 8:
	case 9:
	case 10:
		printf ( "%d の数カード", number );
		break;				/* 2 〜 10 の場合はここで、終了 */
	default:				/* それ以外は.. */
	 	printf ( "範囲外" );
		break;				/* これは不要だが、つける習慣を (マナー) */
	}

	printf ( "です。\n" );

}

/*
 *	main
 *
 */

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

	trump ( -1 );
	trump ( 0 );
	trump ( 1 );
	trump ( 7 );
	trump ( 10 );
	trump ( 13 );
	trump ( 20 );

	return 0;
}
sample-002.c の実行結果
$ ./sample-002.exe
数値 -1 の表すカードは、範囲外です。
数値 0 の表すカードは、ジョーカーです。
数値 1 の表すカードは、エースです。
数値 7 の表すカードは、7 の数カードです。
数値 10 の表すカードは、10 の数カードです。
数値 13 の表すカードは、キングです。
数値 20 の表すカードは、範囲外です。
$ 

Download : sample-003.c

sample-003.c
/*
 * 2019/09/27 sample-003.c
 */

#include <stdio.h>

/*
 * for 文を利用して、0 から 9 の数値を表示する
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-003.exe sample-003.c
 *		実行
 *			sample-003
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */

  for ( i = 0; i < 10; i = i + 1 ) {/* i を 0 〜 9 迄変化 */
	printf ( "%d\n", i );			/* i を出力 */
  }

  return 0;
}
sample-003.c の実行結果
$ ./sample-003.exe
0
1
2
3
4
5
6
7
8
9
$ 

Download : sample-004.c

sample-004.c
/*
 * 2019/09/27 sample-004.c
 */

#include <stdio.h>

/*
 * for 文を利用して、1 から 10 の数値を表示する
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-004.exe sample-004.c
 *		実行
 *			sample-004
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */

  for ( i = 1; i <= 10; i = i + 1 ) {/* i を 1 〜 10迄変化 */
	printf ( "%d\n", i );			/* i を出力 */
  }

  return 0;
}
sample-004.c の実行結果
$ ./sample-004.exe
1
2
3
4
5
6
7
8
9
10
$ 

Download : sample-005.c

sample-005.c
/*
 * 2019/09/27 sample-005.c
 */

#include <stdio.h>

/*
 * for 文を利用して、0 から 9 の数値を表示する
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-005.exe sample-005.c
 *		実行
 *			sample-005
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */

  for ( i = 0; i < 10; i++ ) {	/* i を 0 〜 9 迄変化 */
								/* i++ は i = i + 1 と同じ */
	printf ( "%d\n", i );		/* i を出力 */
  }

  return 0;
}
sample-005.c の実行結果
$ ./sample-005.exe
0
1
2
3
4
5
6
7
8
9
$ 

Download : sample-006.c

sample-006.c
/*
 * 2019/09/27 sample-006.c
 */

#include <stdio.h>

/*
 * for 文を利用して、0 から 9 迄の 10 個の数値を和を表示する
 * sum = \sum_{i=0}^{9} i
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-006.exe sample-006.c
 *		実行
 *			sample-006
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  int sum = 0;

  for ( i = 0; i < 10; i++ ) {	/* i を 0 〜 9 迄変化 */
								/* i++ は i = i + 1 と同じ */
	sum = sum + i;				/* sum に i の値を加える */
	printf ( "%d %d\n", i, sum );		/* i と sum を出力 */
  }

  printf ( "最終的には sum = %d\n", sum );

  return 0;
}
sample-006.c の実行結果
$ ./sample-006.exe
0 0
1 1
2 3
3 6
4 10
5 15
6 21
7 28
8 36
9 45
最終的には sum = 45
$ 

Download : sample-007.c

sample-007.c
/*
 * 2019/09/27 sample-007.c
 */

#include <stdio.h>

/*
 * for 文を利用して、0 から 9 の数値を表示する
 * プログラムを while に書き直す
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-007.exe sample-007.c
 *		実行
 *			sample-007
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */

  /* 元々のプログラム

	  for ( i = 0; i < 10; i++ ) {
		printf ( "%d\n", i );
	  }

	step-1
		<初期化式> を前にもってくる

	  i = 0;
	  for ( i < 10; i++ ) {
		printf ( "%d\n", i );
	  }

	step-2
		<再初期化式> を、繰返し文の後にもって行く

	  i = 0;
	  for ( i < 10 ) {
		printf ( "%d\n", i );
		i++;					<= { 〜 } の一番最後
	  }

	step-3
		for を while に書き換える

	  i = 0;
	  while ( i < 10 ) {
		printf ( "%d\n", i );
		i++;
	  }

  */

  /* 元々のプログラム

	  for ( i = 0; i < 10; i++ ) {
		printf ( "%d\n", i );
	  }
  */

	  i = 0;
	  while ( i < 10 ) {
		printf ( "%d\n", i );
		i++;
	  }

  return 0;
}
sample-007.c の実行結果
$ ./sample-007.exe
0
1
2
3
4
5
6
7
8
9
$ 

Download : sample-008.c

sample-008.c
/*
 * 2019/09/27 sample-008.c
 */

#include <stdio.h>

/*
 * for 文では、条件式がサボれる
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-008.exe sample-008.c
 *		実行
 *			sample-008
 */

int main(int ac, char *av[] ) {

  for ( ;; ) {
	/* while では条件を省略できないが for 文ではできる .. */
	/* 条件が省略されると、「常に真」になるので無限ループ */
	/* プログラムを停止させるには
	 *	 Ctrl-C ([Ctrl] キーを押しながら [C] キーを押す)
	 * を押す。
	 */

	printf ( "動いています...\n" );
  }

  return 0;
}
sample-008.c の実行結果
動いています...
動いています...
動いています...
動いています...

	....

動いています...
動いています...
動いています...
動いています...
動いてい^C

Download : sample-009.c

sample-009.c
/*
 * 2019/09/27 sample-009.c
 */

#include <stdio.h>

/*
 * for 文を利用して、0 から 99 の偶数の数値
 *		アプローチ
 *		(その一)	i を 0 〜 99 として、但し偶数だけを出す
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-009.exe sample-009.c
 *		実行
 *			sample-009
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */

  for ( i = 0; i < 100; i++ ) {	/* i を 0 〜 99 迄変化 */
	/* 但し、i が偶数の時だけ → if 文を利用する */
	if ( i % 2 == 0 ) {	/* i を 2 で割った余り(i%2)が 0 */
	  					/* 即ち i が偶数の時.. */
		printf ( "%d\n", i );		/* i を出力 */
	}
  }

  return 0;
}
sample-009.c の実行結果
$ ./sample-009.exe
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
$ 

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

本日の課題

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

課題 20190927-01 : switch 構文

Download : 20190927-01.c

20190927-01.c
/*
 * 課題 CNAME-01
 *
 * CDATE FILENAME
 *
 *	キーボードから一文字入力し、その文字によって異る国の挨拶をする
 */

#include <stdio.h>

/*
 * hello ( char contry )
 *	char contry : 国を表す一文字
 *		j : 日本
 *		e : 英語
 *		c : 中国
 *		f : フランス語
 *		g : ドイツ語
 */

void hello ( char cmd ) {

	switch ( cmd ) {
	case 'j':					/* 'j' の時は、日本語にする */
		printf ( "こんにちは\n" );
		break;
    case 'e':					/* 'e' の時は、英語にする */

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

		break;
	case 'c':					/* 'c' の時は、中国語にする */
		printf ( "ニイハオ\n" );

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

	case 'f':					/* 'f' の時は、フランス語にする */
		printf ( "Bonjour\n" );
		break;

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

		printf ( "Guten tag\n" );
		break;
	default:					/* どれでもなければ.. */
		printf ( "???\n" );
		break;					
	}
}

/*
 *	main
 */

int main( void )
{

	printf ( "国を表す文字を入力してください\n" );
	printf ( "\tj\t日本\n" );
	printf ( "\te\t英語\n" );
	printf ( "\tc\t中国\n" );
	printf ( "\tf\tフランス\n" );
	printf ( "\tg\tドイツ\n" );

	hello ( getchar() );	/* getchar() で文字を入力し、それに対応する結果を出す */

	 return 0;
}
入力例
f
20190927-01.c の実行結果
$ ./20190927-01-QQQQ.exe
国を表す文字を入力してください
	j	日本
	e	英語
	c	中国
	f	フランス
	g	ドイツ
Bonjour
$ 

課題 20190927-02 : for 構文

Download : 20190927-02.c

20190927-02.c
/*
 * 課題 CNAME-02
 *
 * 20190927 20190927-02-QQQQ.c
 *
 *	0 〜 99 の偶数を出力する
 *
 */

#include <stdio.h>

/*
 * for 文を利用して、0 から 99 の偶数の数値
		(そのニ)	i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す
 */

int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */

  for ( i = 0; i < 100; /* p:ここ */ ) {
						/* i++ だと i = 0, 1, 2, .. */
						/* ○○とすれば i = 0, 2, 4, .. */
		printf ( "%d\n", i );		/* i を出力 */
  }

  return 0;
}
20190927-02.c の実行結果
$ ./20190927-02-QQQQ.exe
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
$