Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

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

Download : sample-001.c

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

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

#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/16 sample-002.c
 */

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

#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/16 sample-003.c
 */

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

#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/16 sample-004.c
 */

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

#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/16 sample-005.c
 */

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

#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/16 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/16 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/16 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/16 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/16 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/16 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/16 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/16 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/16 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 の表すカードは、範囲外です。
$ 

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

本日の課題

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

課題 20181116-01 : 三つの整数の比較(if

Download : 20181116-01.c

20181116-01.c
/*
 * 課題 20181116-01
 *
 * 20181116 20181116-01-QQQQ.c
 *
 *	標準入力から三つの整数数値読込み、それを小さい順に出力する (if 文のみ)
 */

#include <stdio.h>

/*
 *	main
 */

int main( void )
{
	int i1;	/* 三つの整数値を入力するので、三つの整数型変数(i1〜i3)を準備する */

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

	int i3;
	int o1;	/* 結果も三つの整数値なので、同様に三つ (o1〜o3) を準備する */
	int o2;

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


	/*
	 * とりあえず、三つの整数値を標準入力から入力
	 */

		/* 一つ目整数値の入力 */
	printf ( "一つ目の整数値を入力してください : " );
	scanf ( "%d", &i1 );

		/* 二つ目整数値の入力 */

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


		/* 三つ目整数値の入力 */
	printf ( "三つ目の整数値を入力してください : " );
	scanf ( "%d", &i3 );

	/*
	 * 入力された整数値の大小により、小さい順に変数 o1 〜 o3 に値を代入
	 */

	 if ( i1 < i2 ) {			/* i1 の値 が i2 の値より小さい */
	 	if ( i1 < i3 )	{		/* 更に i1 の値が i3 の値より小さい */
			o1 = i1;			/* 一番小さいのは、i1 の値 */
			if ( i2 < i3 )	{	/* i2 の値 が i3 の値より小さい */
				o2 = i2;		/* ニ番目に小さいのは、i2 の値 */
				o3 = i3;
			} else {			/* i3 の値の方が小さい */
				o2 = i3;		/* ニ番目に小さいのは、i3 の値 */
				o3 = i2;
			}
		} else {				/* i3 の値の方が小さい */

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

			o2 = i1;			/* i1 < i2 は確認済なので i1 の値はニ番目 */
			o3 = i2;
		}
	} else {					/* i2 の値 が i1 の値より小さい */
	 	if ( i2 < i3 )	{		/* 更に i2 の値が i3 の値より小さい */
			o1 = i2;			/* 一番小さいのは、i2 の値 */

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

		} else {				/* i3 の方が小さい */
			o1 = i3;			/* 一番小さいのは、i2 の値 */
			o2 = i2;			/* i2 < i1 は確認済なので i2 はニ番目 */
			o3 = i1;
		}
	}

	/*
	 * 変数 o1 〜 o3 に整数値が小さい順に入っているので、それを出力
	 */

	 printf ( "入力された値を小さい順に並べると %d, %d, %d になります。\n",
	 	o1, o2, o3 );

	return 0;
}
入力例
123
987
456
20181116-01.c の実行結果
$ ./20181116-01-QQQQ.exe
一つ目の整数値を入力してください : 123
二つ目の整数値を入力してください : 987
三つ目の整数値を入力してください : 456
入力された値を小さい順に並べると 123, 456, 987 になります。
$ 

課題 20181116-02 : 三つの整数の比較(論理積版)

Download : 20181116-02.c

20181116-02.c
/*
 * 課題 CNAME-02
 *
 * 20181116 20181116-02-QQQQ.c
 *
 *	標準入力から三つの整数値を読込み、それを小さい順に出力する (論理和)
 */

#include <stdio.h>

/*
 *	main
 */

int main( void )
{
	int i1;	/* 三つの整数値を入力するので、三つの整数型変数(i1〜i3)を準備する */
	int i2;

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

	int o1;	/* 結果も三つの整数値なので、同様に三つ (o1〜o3) を準備する */

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

	int o3;

	/*
	 * とりあえず、三つの整数値を標準入力から入力
	 */

		/* 一つ目整数値の入力 */
	printf ( "一つ目の整数値を入力してください : " );
	scanf ( "%d", &i1 );

		/* 二つ目整数値の入力 */
	printf ( "二つ目の整数値を入力してください : " );
	scanf ( "%d", &i2 );

		/* 三つ目整数値の入力 */

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


	/*
	 * 入力された整数値の大小により、小さい順に変数 o1 〜 o3 に値を代入
	 */

	 /* 最初に、まず、一番小さい数をみつけてしまう */

	 if ( (i1 < i2) && (i1 < i3) ) {/* i1 の値は i2, i3 の双方の値より小さい */
	 	o1 = i1;					/* 一番小さいのは i1 の値 */
		if ( i2 < i3 ) {			/* 残る二つの値を比較 */
			o2 = i2;
			o3 = i3;
		} else {

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

		}
	} else if ( (i2 < i1) && (i2 < i3) ) {	/* i2 の値が.. */
	 	o1 = i2;						/* 一番小さいのは i2 の値 .. */

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

	} else {							/* 残る可能性は i3 の値が最少ってこと */

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

		if ( i1 < i2 ) {
			o2 = i1;
			o3 = i2;
		} else {
			o2 = i2;
			o3 = i1;
		}
	}

	/*
	 * 変数 o1 〜 o3 に整数値が小さい順に入っているので、それを出力
	 */

	 printf ( "入力された値を小さい順に並べると %d, %d, %d になります。\n",
	 	o1, o2, o3 );

	return 0;
}
入力例
123
987
456
20181116-02.c の実行結果
$ ./20181116-02-QQQQ.exe
一つ目の整数値を入力してください : 123
二つ目の整数値を入力してください : 987
三つ目の整数値を入力してください : 456
入力された値を小さい順に並べると 123, 456, 987 になります。
$ 

課題 20181116-03 : 真偽表

Download : 20181116-03.c

20181116-03.c
/*
 * 課題 CNAME-03
 *
 * 20181116 20181116-03-QQQQ.c
 *
 *	真偽表の作成
 *
 */

#include <stdio.h>

/*
 *	main : 真偽表の作成
 */

int main(void)
{
	int P;		/* 論理値は、整数値なので、整数変数を二つ (P,Q) 利用 */

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


		/* 真偽値表 */

	printf ( "+-------+----+-------------+\n" );
	printf ( "| 論理値|否定|論理積|論理和|\n" );
	printf ( "+---+---+----+------+------+\n" );

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

	printf ( "+---+---+----+------+------+\n" );

	for ( P = 0; P <= 1; P++ )	{		/* これで P = 0(偽), 1(真) となる */

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

			printf ( "| %d | %d |  %d |   %d  |   %d  |\n",
					    P,    Q,   !P,  P&&Q,     P||Q
			);
		}
	}
	printf ( "+---+---+----+------+------+\n" );

	return 0;
}
20181116-03.c の実行結果
$ ./20181116-03-QQQQ.exe
+-------+----+-------------+
| 論理値|否定|論理積|論理和|
+---+---+----+------+------+
| P | Q | !P | P&&Q | P||Q |
+---+---+----+------+------+
| 0 | 0 |  1 |   0  |   0  |
| 0 | 1 |  1 |   0  |   1  |
| 1 | 0 |  0 |   0  |   1  |
| 1 | 1 |  0 |   1  |   1  |
+---+---+----+------+------+
$ 

課題 20181116-04 : ド・モルガン

Download : 20181116-04.c

20181116-04.c
/*
 * 課題 CNAME-04
 *
 * CDATE FILENAME
 *
 *	ド・モルガンの定理 !(P&&Q) == (!P)||(!Q)
 *
 */

#include <stdio.h>

/*
 *	not_and ( P, Q ) == !(P&&Q)
 */

int not_and ( int P, int Q ) {

	return !(P&&Q);
}

/*
 *	or_not ( P, Q ) == (!P)||(!Q)
 */

int or_not ( int P, int Q ) {


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

}

/*
 *	main : 真偽表の作成
 */

int main(void)
{
	int P;		/* 論理値は、整数値なので、整数変数を二つ (P,Q) 利用 */

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


		/* 真偽値表 */

	printf ( "+---+---+---------+------------+\n" );

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

	printf ( "+---+---+---------+------------+\n" );

	for ( P = 0; P <= 1; P++ )	{		/* これで P = 0(偽), 1(真) となる */
		for ( Q = 0; Q <= 1; Q++ )	{
			printf ( "| %d | %d |    %d    |     %d      |\n",
				P, Q, not_and(P,Q), or_not(P,Q)
			);
		}
	}
	printf ( "+---+---+---------+------------+\n" );

	return 0;
}
20181116-04.c の実行結果
$ ./20181116-04-QQQQ.exe
+---+---+---------+------------+
| P | Q | !(P&&Q) | (!P)||(!Q) |
+---+---+---------+------------+
| 0 | 0 |    1    |     1      |
| 0 | 1 |    1    |     1      |
| 1 | 0 |    1    |     1      |
| 1 | 1 |    0    |     0      |
+---+---+---------+------------+
$