Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

Download

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

Download : sample-001.c

sample-001.c
/*
 * 2018/11/09 sample-001.c
 */

/*
 *  色々な if 文 : if 文の基本
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-001.exe sample-001.c
 *		実行
 *			sample-001
 */

#include <stdio.h>

/*
 * void isPositive ( int value )
 *
 * 	value が正なら「正」と出力し、そうでなければ「正でない」と出力する関数
 */

void isPositive ( int value ) {

	if ( value > 0 ) {	/* value が 0 より大きい場合.. */
		printf ( "正\n" );
	} else {	/* そうでない場合 */
		printf ( "正でない\n" );
	}
}


/*
 *	main
 *
 */

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

	isPositive ( 3 );	/* 「正」と出るはず */
	isPositive ( -5 );	/* 「正でない」と出るはず */
	isPositive ( 0 );	/* 「正でない」と出るはず */

	return 0;
}
sample-001.c の実行結果
$ ./sample-001.exe
正
正でない
正でない
$ 

Download : sample-002.c

sample-002.c
/*
 * 2018/11/09 sample-002.c
 */

/*
 *  色々な if 文 : else 節の内容が何もない場合
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-002.exe sample-002.c
 *		実行
 *			sample-002
 */

#include <stdio.h>

/*
 * void isPositive ( int value )
 *
 * 	value が正なら「正」と出力し、そうでなければ何もしない
 */

void isPositive ( int value ) {

	if ( value > 0 ) {	/* value が 0 より大きい場合.. */
		printf ( "正\n" );
	} else {	/* そうでない場合 */
		/* 何もしなくてよいので、中身は空っぽ */
	}
}


/*
 *	main
 *
 */

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

	isPositive ( 3 );	/* 「正」と出るはず */
	isPositive ( -5 );	/* 何もでない */
	isPositive ( 0 );	/* 何もでない */

	return 0;
}
sample-002.c の実行結果
$ ./sample-002.exe
正
$ 

Download : sample-003.c

sample-003.c
/*
 * 2018/11/09 sample-003.c
 */

/*
 *  色々な if 文 : else 節の省略
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-003.exe sample-003.c
 *		実行
 *			sample-003
 */

#include <stdio.h>

/*
 * void isPositive ( int value )
 *
 * 	value が正なら「正」と出力し、そうでなければ何もしない
 */

void isPositive ( int value ) {

	if ( value > 0 ) {	/* value が 0 より大きい場合.. */
		printf ( "正\n" );
	}

	/* 条件が不成立の時の文が何もなければ else 以下(else 節)を省略可能 */
}


/*
 *	main
 *
 */

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

	isPositive ( 3 );	/* 「正」と出るはず */
	isPositive ( -5 );	/* 何もでない */
	isPositive ( 0 );	/* 何もでない */

	return 0;
}
sample-003.c の実行結果
$ ./sample-003.exe
正
$ 

Download : sample-004.c

sample-004.c
/*
 * 2018/11/09 sample-004.c
 */

/*
 *  色々な if 文 : 単文の場合 「{」,「}」も省略可能
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-004.exe sample-004.c
 *		実行
 *			sample-004
 */

#include <stdio.h>

/*
 * void isPositive ( int value )
 *
 * 	value が正なら「正」と出力し、そうでなければ何もしない
 */

void isPositive ( int value ) {

	if ( value > 0 )
		printf ( "正\n" );

	/* 単文の場合は、 「{」,「}」が省略可能 */
	/* 注意 : 省略は *絶対に* お勧めしない !!
	 *		if 文では常に「{」,「}」を付ける習慣を身に付ける(「行儀」の問題)
	 * ただし、「行儀の悪い人」もいるので、「知っている」必要がある。
	 */
}


/*
 *	main
 *
 */

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

	isPositive ( 3 );	/* 「正」と出るはず */
	isPositive ( -5 );	/* 何もでない */
	isPositive ( 0 );	/* 何もでない */

	return 0;
}
sample-004.c の実行結果
$ ./sample-004.exe
正
$ 

Download : sample-005.c

sample-005.c
/*
 * 2018/11/09 sample-005.c
 */

/*
 * 条件式
 *		(C 言語での)「条件」は、「(整数の)値」を持つ
 *				1 : 真(条件が成り立つ場合)の時
 *				0 : 偽(条件が成り立たない場合)の時
 *			逆に、整数値は、常に「条件(値)」と見做す事ができる
 *				「条件」が要求された場合に、「(条件の)値」は、次のように「解釈」される
 *				「偽」: 0 の時
 *				「真」: それ (0) 以外の時 ( 1 でなくても良い )
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-005.exe sample-005.c
 *		実行
 *			sample-005
 */

#include <stdio.h>

/*
 *	main
 *
 */

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

	/* 「条件(式)」は「(整数)値」を持つ */
	printf ( "1 < 2 は成立するので %d になる。\n",  1 < 2 );
	printf ( "3 < 2 は成立しないので %d になる。\n",  3 < 2 );

	if ( 1 < 2 ) {	/* この条件は常に成立するので.. */
		printf ( "1 < 2 は成立しました。\n" );	/* こちらを実行 */
	} else {
		printf ( "1 < 2 は成立しませんでした。\n" );
	}

	if ( 3 < 2 ) {	/* この条件は常に成立しないので.. */
		printf ( "3 < 2 は成立しました。\n" );
	} else {
		printf ( "3 < 2 は成立しませんでした。\n" );	/* こちらを実行 */
	}

	if ( 1 ) {	/* 1 は 0 でないので、「真」と見做される */
		printf ( " 1 は「真」と見做されました。\n" );	/* こちらを実行 */
	} else {
		printf ( " 1 は「偽」と見做されました。\n" );
	}

	if ( 0 ) {	/* 0 は、「偽」と見做される */
		printf ( " 0 は「真」と見做されました。\n" );
	} else {
		printf ( " 0 は「偽」と見做されました。\n" );	/* こちらを実行 */
	}

	if ( 3 ) {	/* 3 は 0 でないので、「真」と見做される */
		printf ( " 3 は「真」と見做されました。\n" );	/* こちらを実行 */
	} else {
		printf ( " 3 は「偽」と見做されました。\n" );
	}

	if ( -10 ) {	/* -10 は 0 でないので、「真」と見做される */
		printf ( " -10 は「真」と見做されました。\n" );	/* こちらを実行 */
	} else {
		printf ( " -10 は「偽」と見做されました。\n" );
	}

	return 0;
}
sample-005.c の実行結果
$ ./sample-005.exe
1 < 2 は成立するので 1 になる。
3 < 2 は成立しないので 0 になる。
1 < 2 は成立しました。
3 < 2 は成立しませんでした。
 1 は「真」と見做されました。
 0 は「偽」と見做されました。
 3 は「真」と見做されました。
 -10 は「真」と見做されました。
$ 

Download : sample-006.c

sample-006.c
/*
 * 2018/11/09 sample-006.c
 */

/*
 * 条件式
 *		(C 言語での)「条件」は、「(整数の)値」を持つ
 *			「条件」を「引数」に渡す事ができる。
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-006.exe sample-006.c
 *		実行
 *			sample-006
 */

#include <stdio.h>

/*
 * void condition_check ( int condition )
 *		int condition	条件(値)
 *		条件が真なら「真と見做される」、偽なら「偽と見做される」と表示
 */

void condition_check ( int condition ) {

	if ( condition ) {
		printf ( " %d は「真」と見做されました。\n", condition );
	} else {
		printf ( " %d は「偽」と見做されました。\n", condition );
	}

}

/*
 *	main
 *
 */

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

	/* 「整数値」は、「条件値」として利用できる */

	/* 整数値 */
	printf ( "整数値\n" );

	condition_check ( 1 );
	condition_check ( 0 );
	condition_check ( 3 );
	condition_check ( -10 );

	/* 不等号 */
	printf ( "---\n" );
	printf ( "不等号\n" );

	/* 「条件式」は、評価されて「条件値」になるが、これは「整数値」になる */
	printf ( "条件式「 1 < 2 」を引数に指定\n" );
	condition_check ( 1 < 2 );	/* 引数には 1 < 2 とあるが、これは評価されて 1 になってから渡される */

	printf ( "条件式「 3 < 2 」を引数に指定\n" );
	condition_check ( 3 < 2 );	/* 引数には 3 < 2 とあるが、これは評価された 0 になってから渡される */

	/* 等号 */
	printf ( "---\n" );
	printf ( "等号\n" );

	printf ( "条件式「 1 == 1 」を引数に指定\n" );
	condition_check ( 1 == 1 );

	printf ( "条件式「 1 != 1 」を引数に指定\n" );
	condition_check ( 1 != 1 );

	printf ( "条件式「 1 == 0 」を引数に指定\n" );
	condition_check ( 1 == 0 );

	printf ( "条件式「 1 != 0 」を引数に指定\n" );
	condition_check ( 1 != 0 );

	return 0;
}
sample-006.c の実行結果
$ ./sample-006.exe
整数値
 1 は「真」と見做されました。
 0 は「偽」と見做されました。
 3 は「真」と見做されました。
 -10 は「真」と見做されました。
---
不等号
条件式「 1 < 2 」を引数に指定
 1 は「真」と見做されました。
条件式「 3 < 2 」を引数に指定
 0 は「偽」と見做されました。
---
等号
条件式「 1 == 1 」を引数に指定
 1 は「真」と見做されました。
条件式「 1 != 1 」を引数に指定
 0 は「偽」と見做されました。
条件式「 1 == 0 」を引数に指定
 0 は「偽」と見做されました。
条件式「 1 != 0 」を引数に指定
 1 は「真」と見做されました。
$ 

Download : sample-007.c

sample-007.c
/*
 * 2018/11/09 sample-007.c
 */

/*
 * 「条件値」の計算
 *		「条件値」は、「整数値」なので計算できる
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-007.exe sample-007.c
 *		実行
 *			sample-007
 */

#include <stdio.h>

/*
 * void condition_check ( int condition )
 *		int condition	条件(値)
 *		条件が真なら「真と見做される」、偽なら「偽と見做される」と表示
 */

void condition_check ( int condition ) {

	if ( condition ) {
		printf ( " %d は「真」と見做されました。\n", condition );
	} else {
		printf ( " %d は「偽」と見做されました。\n", condition );
	}

}

/*
 *	main
 *
 */

int main( int argc, char *argv[] )
{
		/* 条件値の計算 */

	printf ( "条件値の計算\n" );
	printf ( "(1<2) + (2<3) = %d + %d = %d\n", (1<2), (2<3), (1<2) + (2<3) );
	printf ( "(1<2) * (2<3) = %d * %d = %d\n", (1<2), (2<3), (1<2) * (2<3) );
	printf ( "(1<2) - (2<3) = %d - %d = %d\n", (1<2), (2<3), (1<2) - (2<3) );
	printf ( "(1<2) / (2<3) = %d / %d = %d\n", (1<2), (2<3), (1<2) / (2<3) );

	printf ( "---\n" );

		/* (1<2)「真」と (2<3)「真」の場合 */
	printf ( "(1<2) + (2<3) = %d\n", (1<2) + (2<3) );
	printf ( "(1<2) * (2<3) = %d\n", (1<2) * (2<3) );

		/*  (1<2)「真」と (3<2)「偽」の場合  */
	printf ( "(1<2) + (3<2) = %d\n", (1<2) + (3<2) );
	printf ( "(1<2) * (3<2) = %d\n", (1<2) * (3<2) );

		/*  (2<1)「偽」と (2<3)「真」の場合  */
	printf ( "(2<1) + (2<3) = %d\n", (2<1) + (2<3) );
	printf ( "(2<1) * (2<3) = %d\n", (2<1) * (2<3) );

		/*  (2<1)「偽」と (3<2)「偽」の場合  */
	printf ( "(2<1) + (3<2) = %d\n", (2<1) + (3<2) );
	printf ( "(2<1) * (3<2) = %d\n", (2<1) * (3<2) );

	return 0;
}
sample-007.c の実行結果
$ ./sample-007.exe
条件値の計算
(1<2) + (2<3) = 1 + 1 = 2
(1<2) * (2<3) = 1 * 1 = 1
(1<2) - (2<3) = 1 - 1 = 0
(1<2) / (2<3) = 1 / 1 = 1
---
(1<2) + (2<3) = 2
(1<2) * (2<3) = 1
(1<2) + (3<2) = 1
(1<2) * (3<2) = 0
(2<1) + (2<3) = 1
(2<1) * (2<3) = 0
(2<1) + (3<2) = 0
(2<1) * (3<2) = 0
$ 

Download : sample-008.c

sample-008.c
/*
 * 2018/11/09 sample-008.c
 */

/*
 * 「条件値」の計算
 *		「条件値」は、「整数値」なので計算できる
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-008.exe sample-008.c
 *		実行
 *			sample-008
 */

#include <stdio.h>

/*
 * void condition_print ( int condition )
 *		int condition	条件(値)
 *		条件が真なら「真」、偽なら「偽」と表示
 */

void condition_print ( int condition ) {

	if ( condition ) {
		printf ( "「真(%d)」", condition );
	} else {
		printf ( "「偽(%d)」", condition );
	}

}

/*
 * void condition_add ( int c1, int c2 )
 *	int c1; 条件値 1
 *	int c2; 条件値 2
 * 	二つの条件値の「和」の振る舞いを表示
 */

void condition_add ( int c1, int c2 ) {

	 condition_print ( c1 );
	 printf ( "と" );
	 condition_print ( c2 );
	 printf ( "の和は" );
	 condition_print ( c1 + c2 );
	 printf ( "になります。\n" );
}

/*
 * void condition_mul ( int c1, int c2 )
 *	int c1; 条件値 1
 *	int c2; 条件値 2
 * 	二つの条件値の「積」の振る舞いを表示
 */

void condition_mul ( int c1, int c2 ) {

	 condition_print ( c1 );
	 printf ( "と" );
	 condition_print ( c2 );
	 printf ( "の積は" );
	 condition_print ( c1 * c2 );
	 printf ( "になります。\n" );
}

/*
 *	main
 *
 */

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

		/* (1<2)「真」と (2<3)「真」の場合 */
    printf ( "(1<2)「真」と (2<3)「真」の場合\n" );
	condition_add ( (1<2), (2<3) );
	condition_mul ( (1<2), (2<3) );

    printf ( "(1<2)「真」と (3<2)「偽」の場合\n" );
	condition_add ( (1<2), (3<2) );
	condition_mul ( (1<2), (3<2) );

    printf ( "(2<1)「偽」と (2<3)「真」の場合\n" );
	condition_add ( (2<1), (2<3) );
	condition_mul ( (2<1), (2<3) );

    printf ( "(2<1)「偽」と (3<2)「偽」の場合\n" );
	condition_add ( (2<1), (3<2) );
	condition_mul ( (2<1), (3<2) );

    printf ( "1「真」と 1「真」の場合\n" );
	condition_add ( 1, 1 );
	condition_mul ( 1, 1 );

    printf ( "1「真」と -1「真」の場合\n" );
	condition_add ( 1, -1 );
	condition_mul ( 1, -1 );

	return 0;
}
sample-008.c の実行結果
$ ./sample-008.exe
(1<2)「真」と (2<3)「真」の場合
「真(1)」と「真(1)」の和は「真(2)」になります。
「真(1)」と「真(1)」の積は「真(1)」になります。
(1<2)「真」と (3<2)「偽」の場合
「真(1)」と「偽(0)」の和は「真(1)」になります。
「真(1)」と「偽(0)」の積は「偽(0)」になります。
(2<1)「偽」と (2<3)「真」の場合
「偽(0)」と「真(1)」の和は「真(1)」になります。
「偽(0)」と「真(1)」の積は「偽(0)」になります。
(2<1)「偽」と (3<2)「偽」の場合
「偽(0)」と「偽(0)」の和は「偽(0)」になります。
「偽(0)」と「偽(0)」の積は「偽(0)」になります。
1「真」と 1「真」の場合
「真(1)」と「真(1)」の和は「真(2)」になります。
「真(1)」と「真(1)」の積は「真(1)」になります。
1「真」と -1「真」の場合
「真(1)」と「真(-1)」の和は「偽(0)」になります。
「真(1)」と「真(-1)」の積は「真(-1)」になります。
$ 

Download : sample-009.c

sample-009.c
/*
 * 2018/11/09 sample-009.c
 */

/*
 * 「論理値」の計算
 *		演算子 「&&」 : 論理積を計算する
 *			a && b : a と b のどちらか一方でも 0(偽) なら 0(偽)、それ以外は 1(真)
 *		演算子 「||」 : 論理和を計算する
 *			a || b : a と b の両方が 0(偽) なら 0(偽)、それ以外は 1(真)
 *		演算子 「!」 : 否定を計算する
 *			!a : a が 0(偽) なら 1(偽)、それ以外は 0(偽)
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-009.exe sample-009.c
 *		実行
 *			sample-009
 */

#include <stdio.h>

/*
 * void condition_print ( int condition )
 *		int condition	条件(値)
 *		条件が真なら「真」、偽なら「偽」と表示
 */

void condition_print ( int condition ) {

	if ( condition ) {
		printf ( "「真(%d)」", condition );
	} else {
		printf ( "「偽(%d)」", condition );
	}

}

/*
 * void condition_or ( int c1, int c2 )
 *	int c1; 条件値 1
 *	int c2; 条件値 2
 * 	二つの条件値の「論理和」の振る舞いを表示
 */

void condition_or ( int c1, int c2 ) {

	 condition_print ( c1 );
	 printf ( "と" );
	 condition_print ( c2 );
	 printf ( "の論理和は" );
	 condition_print ( c1 || c2 );	/* 演算子「||」は「論理和」を表す */
	 printf ( "になります。\n" );
}

/*
 * void condition_and ( int c1, int c2 )
 *	int c1; 条件値 1
 *	int c2; 条件値 2
 * 	二つの条件値の「論理積」の振る舞いを表示
 */

void condition_and ( int c1, int c2 ) {

	 condition_print ( c1 );
	 printf ( "と" );
	 condition_print ( c2 );
	 printf ( "の論理積は" );
	 condition_print ( c1 && c2 );	/* 演算子「&&」は「論理積」を表す */
	 printf ( "になります。\n" );
}

/*
 * void condition_not ( int c )
 *	int c; 条件値
 * 	一つの条件値の「否定」の振る舞いを表示
 */

void condition_not ( int c ) {

	 condition_print ( c );
	 printf ( "の否定は" );
	 condition_print ( !c );	/* 演算子「!」は「否定」を表す */
	 printf ( "になります。\n" );
}

/*
 *	main
 *
 */

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

		/* (1<2)「真」と (2<3)「真」の場合 */
    printf ( "(1<2)「真」と (2<3)「真」の場合\n" );
	condition_or ( (1<2), (2<3) );
	condition_and ( (1<2), (2<3) );

    printf ( "(1<2)「真」と (3<2)「偽」の場合\n" );
	condition_or ( (1<2), (3<2) );
	condition_and ( (1<2), (3<2) );

    printf ( "(2<1)「偽」と (2<3)「真」の場合\n" );
	condition_or ( (2<1), (2<3) );
	condition_and ( (2<1), (2<3) );

    printf ( "(2<1)「偽」と (3<2)「偽」の場合\n" );
	condition_or ( (2<1), (3<2) );
	condition_and ( (2<1), (3<2) );

    printf ( "1「真」と 1「偽」の場合\n" );
	condition_or ( 1, 1 );
	condition_and ( 1, 1 );

    printf ( "1「真」と -1「真」の場合\n" );
	condition_or ( 1, -1 );
	condition_and ( 1, -1 );

    printf ( "1 の否定\n" );
	condition_not ( 1 );

    printf ( "0 の否定\n" );
	condition_not ( 0 );

    printf ( "-1 の否定\n" );
	condition_not ( -1 );

	return 0;
}
sample-009.c の実行結果
$ ./sample-009.exe
(1<2)「真」と (2<3)「真」の場合
「真(1)」と「真(1)」の論理和は「真(1)」になります。
「真(1)」と「真(1)」の論理積は「真(1)」になります。
(1<2)「真」と (3<2)「偽」の場合
「真(1)」と「偽(0)」の論理和は「真(1)」になります。
「真(1)」と「偽(0)」の論理積は「偽(0)」になります。
(2<1)「偽」と (2<3)「真」の場合
「偽(0)」と「真(1)」の論理和は「真(1)」になります。
「偽(0)」と「真(1)」の論理積は「偽(0)」になります。
(2<1)「偽」と (3<2)「偽」の場合
「偽(0)」と「偽(0)」の論理和は「偽(0)」になります。
「偽(0)」と「偽(0)」の論理積は「偽(0)」になります。
1「真」と 1「偽」の場合
「真(1)」と「真(1)」の論理和は「真(1)」になります。
「真(1)」と「真(1)」の論理積は「真(1)」になります。
1「真」と -1「真」の場合
「真(1)」と「真(-1)」の論理和は「真(1)」になります。
「真(1)」と「真(-1)」の論理積は「真(1)」になります。
1 の否定
「真(1)」の否定は「偽(0)」になります。
0 の否定
「偽(0)」の否定は「真(1)」になります。
-1 の否定
「真(-1)」の否定は「偽(0)」になります。
$ 

Download : sample-010.c

sample-010.c
/*
 * 2018/11/09 sample-010.c
 */

/*
 * 「論理計算」と if 文
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-010.exe sample-010.c
 *		実行
 *			sample-010
 */

#include <stdio.h>

/*
 *	main
 *
 */

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

	/* 二つの条件が成立する場合 */

	if ( 2 > 1 ) {
		if ( 3 > 2 ) {
			printf ( "(2>1) かつ (3>2)\n" );
		} else {
	} else {
	}

	return 0;
}
sample-010.c の実行結果
$ ./sample-010.exe
(1<2)「真」と (2<3)「真」の場合
「真(1)」と「真(1)」の論理和は「真(1)」になります。
「真(1)」と「真(1)」の論理積は「真(1)」になります。
(1<2)「真」と (3<2)「偽」の場合
「真(1)」と「偽(0)」の論理和は「真(1)」になります。
「真(1)」と「偽(0)」の論理積は「偽(0)」になります。
(2<1)「偽」と (2<3)「真」の場合
「偽(0)」と「真(1)」の論理和は「真(1)」になります。
「偽(0)」と「真(1)」の論理積は「偽(0)」になります。
(2<1)「偽」と (3<2)「偽」の場合
「偽(0)」と「偽(0)」の論理和は「偽(0)」になります。
「偽(0)」と「偽(0)」の論理積は「偽(0)」になります。
1「真」と 1「偽」の場合
「真(1)」と「真(1)」の論理和は「真(1)」になります。
「真(1)」と「真(1)」の論理積は「真(1)」になります。
1「真」と -1「真」の場合
「真(1)」と「真(-1)」の論理和は「真(1)」になります。
「真(1)」と「真(-1)」の論理積は「真(1)」になります。
1 の否定
「真(1)」の否定は「偽(0)」になります。
0 の否定
「偽(0)」の否定は「真(1)」になります。
-1 の否定
「真(-1)」の否定は「偽(0)」になります。
$ 

Download : sample-011.c

sample-011.c
/*
 * 2018/11/09 sample-011.c
 */

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

#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-011.c の実行結果
$ ./sample-011.exe
数値 -1 の表すカードは、範囲外です。
数値 0 の表すカードは、ジョーカーです。
数値 1 の表すカードは、エースです。
数値 7 の表すカードは、7 の数カードです。
数値 10 の表すカードは、10 の数カードです。
数値 13 の表すカードは、キングです。
数値 20 の表すカードは、範囲外です。
$ 

Download : sample-012.c

sample-012.c
/*
 * 2018/11/09 sample-012.c
 */

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

#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 ( 1 < number && number < 11 ) {	/* 番号が 2 〜 10 の時 */
		printf ( "%d の数カード", number );
	} else {   									/* それ以外は.. */
	 	printf ( "範囲外" );
	}

	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-012.c の実行結果
$ ./sample-012.exe
数値 -1 の表すカードは、範囲外です。
数値 0 の表すカードは、ジョーカーです。
数値 1 の表すカードは、エースです。
数値 7 の表すカードは、7 の数カードです。
数値 10 の表すカードは、10 の数カードです。
数値 13 の表すカードは、キングです。
数値 20 の表すカードは、範囲外です。
$ 

Download : sample-013.c

sample-013.c
/*
 * 2018/11/09 sample-013.c
 */

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

#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-013.c の実行結果
$ ./sample-013.exe
数値 -1 の表すカードは、範囲外です。
数値 0 の表すカードは、ジョーカーです。
数値 1 の表すカードは、エースです。
数値 7 の表すカードは、7 の数カードです。
数値 10 の表すカードは、10 の数カードです。
数値 13 の表すカードは、キングです。
数値 20 の表すカードは、範囲外です。
$ 

Download : sample-014.c

sample-014.c
/*
 * 2018/11/09 sample-014.c
 */

/*
 *  複数条件の分岐(case 文と if 文の混合)
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-014.exe sample-014.c
 *		実行
 *			sample-014
 */

#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;
	default:				/* それ以外は.. */
		if ( 2 <= number && number <= 10 ) {
			/* if 文ならば、「範囲」も指定できる */
			printf ( "%d の数カード", number );
		} else {
		 	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-014.c の実行結果
$ ./sample-014.exe
数値 -1 の表すカードは、範囲外です。
数値 0 の表すカードは、ジョーカーです。
数値 1 の表すカードは、エースです。
数値 7 の表すカードは、7 の数カードです。
数値 10 の表すカードは、10 の数カードです。
数値 13 の表すカードは、キングです。
数値 20 の表すカードは、範囲外です。
$ 

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

本日の課題

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

課題 20181109-01 : curses

Download : 20181109-01.c

20181109-01.c
/*
 * 20181109-01-QQQQ.c
 *
 *	curses を利用して画面に、「回」の文字を書く
 *
 *	コンパイル : curses を利用するのでリンク時に「-lncursesw」が必要
 *		cc -c 20181109-01-QQQQ.c
 *		cc -o 20181109-01-QQQQ.exe 20181109-01-QQQQ.o -lncursesw
 *	実行 :
 *		./20181109-01-QQQQ.exe
 *
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncurses の利用 */
#include <unistd.h>

/*
 *
 */

#define	OUT_X_POS	20	/* 「回」の外側の左上の x 座標 ( 1 〜 80 ) */
#define	OUT_Y_POS	5	/* 「回」の外側の左上の y 座標 ( 1 〜 25 ) */

#define	OUT_Y_SIZE	10				/* 「回」の外側の縦の長さ */
#define	OUT_X_SIZE	(OUT_Y_SIZE*2)	/* 「回」の外側の横の長さ */
#define	IN_Y_SIZE	6				/* 「回」の内側の縦の長さ */
#define	IN_X_SIZE	(IN_Y_SIZE*2)	/* 「回」の内側の横の長さ */

#define	IN_X_POS	(OUT_X_POS+(OUT_X_SIZE-IN_X_SIZE)/2)	/* 「回」の内側の左上の x 座標 */
#define	IN_Y_POS	(OUT_Y_POS+(OUT_Y_SIZE-IN_Y_SIZE)/2)	/* 「回」の内側の左上の y 座標 */

/*
 * draw_rect ( int px, int py, int xs, int ys )
 *		(px, py) の位置 に xs * ys の矩形を書く
 */

void draw_rect ( int px, int py, int xs, int ys ) {
	int x;	/* カーソルの x 座標を表す変数 */
	int y;	/* カーソルの y 座標を表す変数 */

		/* 矩形の上下の線を書く */
	for ( x = px; x < px + xs; x++ ) {				/* 横方向に移動 */

		move ( py,          x ); addch ( '*' );		/* 上 */
		move ( py + ys - 1, x ); addch ( '*' );		/* 下 */

	}

		/* 矩形の左右の線を書く */
	for ( y = py; y < py + ys; y++ ) {				/* 縦方向に移動 */

		move ( y, px          ); addch ( '*' );		/* 左 */

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


	}

}

/*
 *	main
 */

int main( void )
{

	/* ncurses の初期化 */

	initscr();		/* 画面を初期化 (クリアされる) */
	cbreak();		/* 文字の入力をリアルタイムにする */
	noecho();		/* 文字の入力をエコーバックしない */

	/* 画面に「回」を書く */

		/* 外の四角 */
	draw_rect ( OUT_X_POS, OUT_Y_POS, OUT_X_SIZE, OUT_Y_SIZE );

		/* 内の四角 */

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


	/* 描画結果の反映 */

	refresh();					/* 書き換えた内容を画面に描画 */

	/* 何かキーが押されるまで末 */

	getch();  					/* 文字の入力待ち */

	/* 後始末 */

	endwin();					/* curses の後始末 */

	return 0;
}
入力例
123
987
456
20181109-01.c の実行結果
                    ********************
                    *                  *
                    *   ************   *
                    *   *          *   *
                    *   *          *   *
                    *   *          *   *
                    *   *          *   *
                    *   ************   *
                    *                  *
                    ********************

Links

関連 Link