Download : sample-001.c
/*
* 2021/10/22 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.exe 正 正でない 正でない $
Download : sample-002.c
/*
* 2021/10/22 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.exe 正 $
Download : sample-003.c
/*
* 2021/10/22 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.exe 正 $
Download : sample-004.c
/*
* 2021/10/22 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.exe 正 $
Download : sample-005.c
/*
* 2021/10/22 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.exe 1 < 2 は成立するので 1 になる。 3 < 2 は成立しないので 0 になる。 1 < 2 は成立しました。 3 < 2 は成立しませんでした。 1 は「真」と見做されました。 0 は「偽」と見做されました。 3 は「真」と見做されました。 -10 は「真」と見做されました。 $
Download : sample-006.c
/*
* 2021/10/22 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.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
/*
* 2021/10/22 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.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
/*
* 2021/10/22 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.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
/*
* 2021/10/22 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.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
/*
* 2021/10/22 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.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
/*
* 2021/10/22 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-012.c
/*
* 2021/10/22 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-013.c
/*
* 2021/10/22 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-014.c
/*
* 2021/10/22 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
/*
* 課題 20211022-01
*
* 20211022 20211022-01-QQQQ.c
*
* 標準入力から三つの整数数値読込み、それを小さい順に出力する (if 文のみ)
* N1,N2,N3 ( 1,2,3 三つの数値が色々な順番で入ってきた.. )
* => 可能性 : 3! ( 3 の数の順列の個数の場合がある .. )
* 3! = 6 > 2 : if 構文の入れ子が必要
* !! 仮定:三つの数は、全て異なる
*/
#include <stdio.h>
/*
* main
*/
int main( void )
{
int i1; /* 三つの整数値を入力するので、三つの整数型変数(i1〜i3)を準備する */
int i2;
int i3; /* 入力はキーボードから scanf で入力 */
int o1; /* 結果も三つの整数値なので、同様に三つ (o1〜o3) を準備する */
int o2;
int o3; /* 入力された値を出力する変数に代入する */
/*
例: (入力は、 1,2,3 として考える )
1) i1, i2, i3 <= 1,2,3
o1 = i1 (1)
o2 = i2 (2)
o3 = i3 (3)
2) i1, i2, i3 <= 3,2,1
o1 = i3 (1)
o2 = i2 (2)
o3 = i1 (3)
=> 入力された値の大小により、
出力される変数にどの変数の値を入れるかを
適切に指定する必要がある
*/
/*
* とりあえず、三つの整数値を標準入力から入力
*/
/* 一つ目整数値の入力 */
printf ( "一つ目の整数値を入力してください : " );
scanf ( "%d", &i1 );
/* 二つ目整数値の入力 */
printf ( "二つ目の整数値を入力してください : " );
scanf ( "%d", &i2 );
/* 三つ目整数値の入力 */
printf ( "三つ目の整数値を入力してください : " );
scanf ( "%d", &i3 );
/*
* 入力された整数値の大小により、小さい順に変数 o1 〜 o3 に値を代入
*/
if ( i1 < i2 ) { /* i1 の値 が i2 の値より小さい */
if ( i1 < i3 ) { /* 更に i1 の値が i3 の値より小さい */
/* i1, は、i2, i3 の両方より小さい */
/* i1 は、i1,i2,i3 の中で、最も小さい数 => o1 に代入 */
o1 = i1; /* 一番小さいのは、i1 の値 */
if ( i2 < i3 ) { /* i2 の値 が i3 の値より小さい */
o2 = i2; /* ニ番目に小さいのは、i2 の値 */
o3 = i3;
} else { /* i3 の値の方が小さい */
o2 = i3; /* ニ番目に小さいのは、i3 の値 */
o3 = i2;
}
} else { /* i3 の値の方が小さい */
/* 「i1 < i3」が不成立 (すべてが異なるので) 「i1>i3」が成立 */
/*
一つ目の条件 i1 < i2
二つめの条件 i3 < i1
i3 < i1 < i2
| | |
v v v
o1 o2 o3
*/
o1 = i3;
o2 = i1; /* i1 < i2 は確認済なので i1 の値はニ番目 */
o3 = i2;
}
} else { /* i2 の値 が i1 の値より小さい */
/* 「i1 < i2」が不成立(すべてが異なるので)「i1 > i2」が成立 */
/* -> i1 と i2 の立場をいれかえて考える */
if ( i2 < i3 ) { /* 更に i2 の値が i3 の値より小さい */
o1 = i2; /* 一番小さいのは、i2 の値 */
/* 残る i1 と i3 の大小関係が問題になる.. */
if ( i1 < i3 ) {
o2 = i1;
o3 = i3;
} else {
o2 = i3;
o3 = i1;
}
} else { /* i3 の方が小さい */
o1 = i3; /* 一番小さいのは、i2 の値 */
o2 = i2; /* i2 < i1 は確認済なので i2 はニ番目 */
o3 = i1;
}
}
/*
* 変数 o1 〜 o3 に整数値が小さい順に入っているので、それを出力
*/
printf ( "入力された値を小さい順に並べると %d, %d, %d になります。\n",
o1, o2, o3 );
return 0;
}
#include <stdio.h>
/*
例:
画面に 0 ? 9 の整数値を表示する
*/
int main(int argc, char *argv[]) {
int i; /* 繰り返しを制御する変数 */
for ( i = 0; i < 10; i++ ) { /* i++ <-> i = i + 1 */
printf ( "%d\n", i ); /* ++i */
}
return 0;
}
#include <stdio.h>
/*
例:
画面に 0 ? 9 の整数値を表示する
while 版
for => while
0) for を while 変更
1) 初期化を while の前に移動
2) 継続を命令の後ろに移動
=> 制御変数(i)の記述が散らばってしまう
!! 制御変数の変更が直接、くり返しに影響する場合は、
!! while 構文より、 for 構文の方が解りやすい
*/
int main(int argc, char *argv[]) {
int i; /* 繰り返しを制御する変数 */
i = 0;
while ( i < 10 ) {
printf ( "%d\n", i );
i++; /* i++ は、for 構文以外でもつかえる */
}
return 0;
}
#include <stdio.h>
/*
例:
画面に 0 ? 9 の整数値を表示する
while => for に戻す
0) while を for に変更
1) for の後ろの括弧の中の条件の両側に「;」をつける
*/
int main(int argc, char *argv[]) {
int i; /* 繰り返しを制御する変数 */
i = 0; /* この部分を初期化のところへ */
for ( ; i < 10; ) {
printf ( "%d\n", i );
i++; /* この部分を継続にところへ移動 */
} /* それぞれ移動すれば、p-001.c と同じ */
return 0;
}
#include <stdio.h>
/*
微分係数:
<数学>
f(c+h)-f(c)
f'(c) = lim --------------
h->0 h
!! h -> 0 (数学)
<計算機>
離散化 : h <- 0.00001
f(c+h)-f(c)
f'(c) '=, -------------- (h = 0.00001)
h
sin(x) を微分
*/
#include <stdio.h>
#include <math.h> /* sin/cos/PI */
#define H 0.0001
int main(int argc, char *argv[]) {
double x;
printf ( "x, sin(x), sin'(x)\n" );
for ( x = 0.0; x < 2 * M_PI; x = x + 0.1 ) {
printf ( "%f, %f, %f\n", x, sin(x),
(sin(x+H)-sin(x))/H );
}
return 0;
}
#include <stdio.h>
/*
キーボードから整数値を入力して、
正なら、「正の数」
正でないならな「非正の数」
と表示するプログラム
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " ); /* プロンプト */
scanf ( "%d", &number ); /* 整数値の入力 */
if ( number > 0 ) { /* 0 より大きいならば「正の数」になる */
printf ( "正の数\n" );
} else {
printf ( "非正の数\n" );
}
return 0;
}
#include <stdio.h>
/*
キーボードから整数値を入力して、
正なら、「正の数」
正でないならな「非正の数」
と表示するプログラム
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " ); /* プロンプト */
scanf ( "%d", &number ); /* 整数値の入力 */
if ( number > 0 )
printf ( "正の数\n" ); /* 命令が一命令なので {} を外す */
else
printf ( "非正の数\n" );
return 0;
}
#include <stdio.h>
/*
キーボードから整数値を入力して、
正なら、「正の数」
正でないならな「非正の数」
と表示するプログラム
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " ); /* プロンプト */
scanf ( "%d", &number ); /* 整数値の入力 */
if ( number > 0 )
printf ( "正の数\n" );
/* else 節がない場合は、else ごと省略してよい */
return 0;
}
#include <stdio.h>
/*
p-006.c のぶら下がり構文から
失敗例を作る
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " );
scanf ( "%d", &number );
if ( number > 0 ); /*うっかり、「;」をつけちゃった */
printf ( "正の数\n" );
/* => 負の数を入力した時の動作が変 */
/*
else
printf ( "非正の数\n" );
*/
return 0;
}
#include <stdio.h>
/*
p-006.c のぶら下がり構文から
失敗例を作る
=> 解説
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " );
scanf ( "%d", &number );
if ( number > 0 ); /*うっかり、「;」をつけちゃった */
printf ( "正の数\n" );
/* => 負の数をいれた時の振る舞いが変 */
/*
気分
if ( number > 0 )
printf ( "正の数\n" );
前期の方針
if ( number > 0 ) {
printf ( "正の数\n" );
} else {
}
実際に(;をつけたために)
if ( number > 0 );
printf ( "正の数\n" );
|
v
if ( number > 0 );
printf ( "正の数\n" );
|
v
if ( number > 0 ) {
; 空命令
} else {
}
printf ( "正の数\n" ); 無条件に実行する
=> 前期ルール
if () { <= ; をつけるミスはしないし、つけても問題ない
}
*/
/*
else
printf ( "非正の数\n" );
*/
return 0;
}
#include <stdio.h>
/*
p-006.c のぶら下がり構文から
失敗例を作る
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " );
scanf ( "%d", &number );
if ( number > 0 ) {; /*うっかり、「;」をつけちゃった */
printf ( "正の数\n" );
}
/* => 万が一、間違えても、悪影響がない */
/*
else
printf ( "非正の数\n" );
*/
return 0;
}
#include <stdio.h>
/*
失敗例(その2)
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " ); /* プロンプト */
scanf ( "%d", &number ); /* 整数値の入力 */
if ( number > 0 )
printf ( "正の数\n" );
printf ( "黒字\n" ); /* <= 命令を後から増やしたい */
return 0;
}
#include <stdio.h>
/*
失敗例(その2)
*/
int main(int argc, char *argv[]) {
int number; /* キーボードから入力された整数値を保存する変数 */
printf ( "整数値を入力してください : " ); /* プロンプト */
scanf ( "%d", &number ); /* 整数値の入力 */
if ( number > 0 ) {
printf ( "正の数\n" );
printf ( "黒字\n" );
}
/* ぶらさがり構文は、「命令が一つ」の時だけ.. */
/* 後で変更があって、「命令の数が変化」した場合 */
/* その時には、{, } を追加する必要がある */
/* => 忘れると問題 */
/* はじめから、 {, } があれば、問題ない */
return 0;
}
#include <stdio.h>
#include <stdlib.h> /* atoi を利用する場合 */
/*
コマンドライン引数で指定した整数値(を表す文字列)が、
二桁の正の整数であるかどうかを判定したい
=>
値が 10 ? 99 の範囲
*/
int main(int argc, char *argv[]) {
int number; /* 引数で指定した文字列の表す整数値 */
if ( argc == 2 ) { /* 引数が一個指定されていれば、
argc は 1+1 = 2 になる */
number = atoi ( argv[1] ); /* 最初のコマンドライン引数 */
/* 関数 atoi で、文字列を整数値に変換 */
/*
atoi : 文字列を、それが表す整数値に変換
*/
/* number が 10 ? 99 の範囲 */
/* 数学での表現 : 10 <= number <= 99 */
/* => このような「表現」は C 言語では使えない */
/*
二つの条件が両方成立している場合と考える
10 <= number
number <= 99
*/
if ( 10 <= number ) { /* 一つ目の条件をチェック */
/* ここでは、一つ目の条件が成立しているので.. */
if ( number <= 99 ) { /* 二つ目の条件をチェック */
/* ここでは、二つ目の条件が成立しているが、
すでに、一つ目の条件が成立している事が解っているので */
/* ここでは、二つの条件が共に成立しているので、全体の条件が成立しているとわかる */
printf ( "二桁の正の整数です\n" );
} else {
/* 一つ目の条件は成立していても、二つ目が不成立なので、
結果的に、全体の条件も不成立 */
}
} else {
/* 一つ目の条件が不成立なので、(当然..)全体も不成立 */
}
} else {
printf ( "コマンドライン引数で、整数値を一個指定してください\n" );
}
return 0;
}
/*
本質的な部分を抜き出す:
if ( 10 <= number ) {
if ( number <= 99 ) {
printf ( "二桁の正の整数です\n" ); => 真/真
} else {
=> 真/偽
}
} else {
=> 偽/(真,偽)
}
if 構文の中に if 構文を入れる(入れ子:ネスト)事により、
1. 二つの条件が共に成立するような場合の条件を表現できる
2. 三つ以上の分岐が可能になっている
cf.
条件が一つ => 真(成立)/偽(不成立) の二通り
条件が二つ =>
1 | 2
------------+--------------
真(成立) | 真(成立)
| 偽(不成立)
------------+--------------
偽(不成立) | 真(成立)
| 偽(不成立)
2 x 2 = 4 通り
一般に、条件が n(>0) 個あるならば、2^n 個の状態がある
*/
#include <stdio.h>
int main(int argc, char *argv[]) {
/* 比較条件式を「整数値」として表示してみる */
printf ( "0 == 0 -> %d\n", 0 == 0 );
printf ( "0 == 1 -> %d\n", 0 == 1 );
printf ( "0 != 0 -> %d\n", 0 != 0 );
printf ( "0 != 1 -> %d\n", 0 != 1 );
printf ( "0 < 0 -> %d\n", 0 < 0 );
printf ( "0 < 1 -> %d\n", 0 < 1 );
printf ( "0 > 0 -> %d\n", 0 > 0 );
printf ( "0 > 1 -> %d\n", 0 > 1 );
printf ( "0 <= 0 -> %d\n", 0 <= 0 );
printf ( "0 <= 1 -> %d\n", 0 <= 1 );
printf ( "0 >= 0 -> %d\n", 0 >= 0 );
printf ( "0 >= 1 -> %d\n", 0 >= 1 );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
/* さっきは、条件式を、整数式としてみた */
/* 今度は、整数式を、条件式 */
if ( 0 ) {
printf ( "0 が真と解釈される\n" );
} else {
printf ( "0 が偽と解釈される\n" );
}
if ( 1 ) {
printf ( "1 が真と解釈される\n" );
} else {
printf ( "1 が偽と解釈される\n" );
}
if ( -123 ) {
printf ( "-123 が真と解釈される\n" );
} else {
printf ( "-123 が偽と解釈される\n" );
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
printf ( "0 == 0 -> %d\n", 0 == 0 ); /* 1 (真) */
printf ( "0 != 0 -> %d\n", 0 != 0 ); /* 0 (偽) */
if ( ( 0 == 0 ) * ( 0 == 0 ) ) {
/* ( 0 == 0 ) -> 1 */
/* ( 0 == 0 ) * ( 0 == 0 ) -> 1 * 1 -> 1 -> 真 */
printf ( "真になった\n" );
} else {
printf ( "偽になった\n" );
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[] ) {
int p;
int q;
scanf ( "%d", &p );
scanf ( "%d", &q );
if ( p ) {
printf ( "p は真\n" );
} else {
printf ( "p は偽\n" );
}
if ( q ) {
printf ( "q は真\n" );
} else {
printf ( "q は偽\n" );
}
if ( p * q ) {
printf ( "p * q は真\n" );
} else {
printf ( "p * q は偽\n" );
}
return 0;
}
/*
p q p*q
---------------------------
0(偽) 0(偽) 0(偽)
1(真) 0(偽)
1(真) 0(偽) 0(偽)
1(真) 1(真)
p*q は p と q がともに真の時だけ、真
=> 論理積 ( and )
P and Q という論理式が、 p*q という整数の掛け算で表現できてしまう
*/
#include <stdio.h>
int main(int argc, char *argv[]) {
int p;
int q;
printf( "\tp\tq\tp&&q\tp||q\t!p\n" );
for ( p = 0; p <= 1; p++ ) { /* p = 0 - 1 (偽 ? 真) */
for ( q = 0; q <= 1; q++ ) { /* q = 0 - 1 (偽 ? 真) */
printf ( "\t%d\t%d\t%d\t%d\t%d\n",
p, q, p&&q, p||q, !p );
}
}
return 0;
}
2021/10/22 09:00- ソフトウェア概論 B
前回の内容
for 構文
もう一つの「繰返し」構文
すでに、動作が解っている命令を「繰り返す」ための構文
# 構文: 命令から命令をつくる記述 ( 命令そのものではない )
# for 構文 / while 構文 / if 構文
# 文: 命令を直接記述したもの
# 関数呼び出し / 代入文 / i++
cf.
他の繰り返し構文 : while 構文
基本 while 構文と for 構文は、簡単に相互変換
for 構文は ( while 構文に比較して ) 制御変数の扱いが楽
=> for 構文の最初の括弧の中に、まとめてかける
構文:
for ( 初期化; 条件; 継続 ) {
命令
}
初期化 : 最初に一度だけ、必ず、実行される
条件 : 命令を繰り返すかどうかの判定
初回は、初期化の後に行われ、以下、
条件が成立している間、
次の繰り返しの前にチェックされる
命令 : 条件が成立している間、実行される
継続 : 命令の後に実行される
|
v
初期化
|
+------>|
| |
| v
| 条件 =(不成立)=> for 構文の実行は終了(次の命令へ)
| |
| (成立)
| |
| v
| 命令
| |
| v
| 継続
| |
+-------+
意味:
最初に初期化をおこない、以下
条件が成立しているあいだ、
命令と継続を繰り返す
while 構文との関係 : 相互に変換できる
for => while
0) for を while に変更
1) 初期化を while の前に移動
2) 継続を命令の後ろに移動
while => for
0) while を for に変更
1) for の後ろの括弧の中の条件の両側に「;」をつける
=> 初期化と継続を「空(式)」(なにもしない)にしている
for 構文と while 構文の使い訳
! 一方があれば、他方はいらない(再帰があれば両方いらない)
! 両方使うなら、「使い分け」をすべき
制御変数が明確なら for 構文の方がよい
特に、くり返し回数が、for 構文の一行でわかる場合、効果的
くり返し回数が、明確でない場合は while 構文の方がおすすめ
# 制御の変数の変化が解っても、回数がすぐにわからない場合
while で、「条件が成立するまで」という表現の方が自然
=> 無理に、for 構文を使うと「誤解」する可能性がある
数値計算
リーマン積分
積分の数学的な定義(極限[無限の概念]を含む)から、
それを有限化(離散化)することにより、
近似値を求める
例: 「n -> 無限」=>「n -> 有限の値」
「ε -> 0」=> 「ε -> 0 に近い小さな値」
数学:正確な値 => 計算機:近似値
適用範囲が狭い => 数学で求められない場合でも答えが得られる
おまけ
MS-Excel との連携 (csv ファイルの利用) : グラフの描画
[2021/10/22]
条件分岐 (if 構文)
条件分岐 (条件によって二つの命令の一方を実行)
# 三つ制御構造の一つ
# 順接: 命令を並べて、順に実行する
# # f(g(x)) => y=g(x), z=f(y)
# # 1+2*3 => 2*3 -> 6, 1 + 6 -> 7
# 条件分岐: 条件によって、二つの命令のうちの一つを実行
# くり返し: 条件が成立している間、命令を繰り返す
if 構文 の構文 (前期)
if (「条件」) {
「条件成立時の命令」
} else {
「条件不成立時の命令」
}
if 文 の意味
まず「条件」をチェック ( 0 なら偽、それ以外なら真 )
「条件」が真なら「条件成立時の命令」を実行
そうでなければ「条件不成立時の命令」を実行
if 構文 ( 後期 )
if (「条件式」)
「条件成立時の命令」
[ else
「条件不成立時の命令」
]
# [ ? ] は、「省略可能」の意味
if 文 の意味 ( 後期 )
まず「条件」をチェック ( 0 なら偽、それ以外なら真 )
「条件」が真なら「条件成立時の命令」を実行
そうでなければ
else 節があれば、「条件不成立時の命令」を実行
else 節がなければなにもしない
!! 前期の if 構文
!! {} が必要 => 不要
!! {} は、n 個 ( n >= 0 ) の命令を一つの命令にする仕組み(ブロック)
!! 命令が一つの場合、無駄になるだけで、悪さはしない
!! 「条件成立時の命令」が 1 命令の場合は、{} がなくてもよい
!! else が必要 => 省略可能
!! 「条件不成立時の命令」がなければ、無駄になるだけ悪さをしない
!! 「条件不成立時の命令」がない場合は、省略する
!! !! 後期の形をしっていても、前期の形を推奨(間違いが少なくなる)
if 文の色々なパターン
else 節の省略 : 「条件不成立時の命令」がない時
「
if (「条件」) {
「条件成立時の命令」
}
」
だけで 「else 以下」は省略
「命令が一つ」の時 :
「
if (「条件」)
「条件成立時の命令」
」
だけで 「{」、「}」は不要
注意 : 「{」、「}」の省略はお勧めできない !!
「ぶら下がり構文」の悲劇
「{」、「}」で、明示的に範囲指定しないと、
「自分が思っていた事」と違う結果になってしまう...
if 構文の応用
if 構文の入れ子 (ネスト)
動機: if 構文では、二つの命令の一つしか選べない
=> 2 分岐
<= 応用としては、n 分岐 (n>1) なので
単体の if 構文では、これが実現できない
=>
if 構文を組み合わせる事により、
多分岐を実現する事ができる
条件式
機能
条件分岐 ( if ) や、繰返し ( while, for ) で条件の判定に利用される式
これまで : 大小比較 / 一致・不一致を利用してきた
整数値 : ==, !=, >, <. >=, <=
文字列 : !strcmp で一致しているかどうか
=> 成立(真)/不成立(偽)
=>
整数値をとる式
=> 条件式として、利用される場合は、
0 の場合は「偽」(不成立)
0 以外の場合は「真」(成立)
として扱われる。
特に、真偽値を返す場合は、
偽の時は 0 を、真の時は 1 を返す約束
後期(真実) 整数値 => 計算ができる (追加の情報処理が可能)
色々なものが入れられる
|
v
「条件式」--+--> 成立(真) ---> 1 ---> if 構文(真)
| | |
| +------------------------+
|
+--> 不成立(偽) --> 0 ---> if 構文(偽)
構文
整数値(真偽値ではない..)を取る式
意味
結果が 0 ならば「偽」、
そうでなければ(どんな値でも 0 でない限り)「真」
論理(真偽)値 :
0(偽) か 1(真) を取る値 (条件式は論理値になる)
条件式で利用される演算子
論理演算子 : 以下の説明では「真(1)」にならない時は「偽(0)」になる
等号 (==) : 両辺の値が等しい時のみ 真(1)
等号否定 (!=) : 両辺の値が異る時のみ 真(1)
不等号 (>, <, >=, <=) : 両辺の値を比較し、不等式が成立した時のみ 真(1)
論理演算子
論理積 (&&) : 両辺が共に真(0 でない)の時のみ真(1)
論理和 (||) : 両辺の共に偽(0)の時のみ偽(0)
否定(!) : 条件式の前に前置し、それが偽(0)の時のみ真(1)
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20211022-01.c
/*
* 課題 20211022-01
*
* 20211022 20211022-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
$ ./20211022-01-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 20211022-02.c
/*
* 課題 CNAME-02
*
* 20211022 20211022-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
$ ./20211022-02-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 20211022-03.c
/*
* 課題 CNAME-03
*
* 20211022 20211022-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;
}
$ ./20211022-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 | +---+---+----+------+------+ $
Download : 20211022-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;
}
$ ./20211022-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 | +---+---+---------+------------+ $