Download : sample-001.c
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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
/* * 2020/10/23 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 の表すカードは、範囲外です。 $
/* * 課題 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; /* break は switch を抜ける */ case 'e': /* 'e' の時は、英語にする */ printf ( "Hello\n" ); break; case 'c': /* 'c' の時は、中国語にする */ printf ( "ニイハオ\n" ); break; case 'f': /* 'f' の時は、フランス語にする */ printf ( "Bonjour\n" ); break; case 'g': /* 'g' の時は、ドイツ語にする */ 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; }
/* * 課題 20201023-01 * * 20201023 20201023-01-QQQQ.c * * 標準入力から三つの整数数値読込み、それを小さい順に出力する (if 文のみ) */ #include <stdio.h> /* * main */ int main( void ) { int i1; /* 三つの整数値を入力するので、三つの整数型変数(i1〜i3)を準備する */ int i2; int i3; int o1; /* 結果も三つの整数値なので、同様に三つ (o1〜o3) を準備する */ int o2; int o3; /* * とりあえず、三つの整数値を標準入力から入力 */ /* 一つ目整数値の入力 */ printf ( "一つ目の整数値を入力してください : " ); scanf ( "%d", &i1 ); /* 二つ目整数値の入力 */ printf ( "二つ目の整数値を入力してください : " ); scanf ( "%d", &i2 ); /* 三つ目整数値の入力 */ 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 の値の方が小さい */ /* i1 < i2 と i3 < i1 がわかっている */ /* i3 < i1 < i2 */ o1 = i3; o2 = i1; /* i1 < i2 は確認済なので i1 の値はニ番目 */ o3 = i2; } } else { /* i2 の値 が i1 の値より小さい */ if ( i2 < i3 ) { /* 更に i2 の値が i3 の値より小さい */ o1 = i2; /* 一番小さいのは、i2 の値 */ /* i1 と i3 の関係が不明なので.. */ if ( i1 < i3 ) { /* i1 の値 が i3 の値より小さい */ o2 = i1; /* ニ番目に小さいのは、i1 の値 */ o3 = i3; } else { /* i3 の値の方が小さい */ o2 = i3; /* ニ番目に小さいのは、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; }
/* * 課題 CNAME-02 * * 20201023 20201023-02-QQQQ.c * * 標準入力から三つの整数値を読込み、それを小さい順に出力する (論理和) */ #include <stdio.h> /* * main */ int main( void ) { int i1; /* 三つの整数値を入力するので、三つの整数型変数(i1〜i3)を準備する */ int i2; int i3; int o1; /* 結果も三つの整数値なので、同様に三つ (o1〜o3) を準備する */ int o2; int o3; /* * とりあえず、三つの整数値を標準入力から入力 */ /* 一つ目整数値の入力 */ printf ( "一つ目の整数値を入力してください : " ); scanf ( "%d", &i1 ); /* 二つ目整数値の入力 */ printf ( "二つ目の整数値を入力してください : " ); scanf ( "%d", &i2 ); /* 三つ目整数値の入力 */ printf ( "三つ目の整数値を入力してください : " ); scanf ( "%d", &i3 ); /* * 入力された整数値の大小により、小さい順に変数 o1 〜 o3 に値を代入 */ /* 最初に、まず、一番小さい数をみつけてしまう */ if ( (i1 < i2) && (i1 < i3) ) {/* i1 の値は i2, i3 の双方の値より小さい */ o1 = i1; /* 一番小さいのは i1 の値 */ if ( i2 < i3 ) { /* 残る二つの値を比較 */ o2 = i2; o3 = i3; } else { o2 = i3; o3 = i2; } } else if ( (i2 < i1) && (i2 < i3) ) { /* i2 の値が.. */ o1 = i2; /* 一番小さいのは i2 の値 .. */ if ( i1 < i3 ) { /* 残る二つの値を比較 */ o2 = i1; o3 = i3; } else { o2 = i3; o3 = i1; } } 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; }
#include <stdio.h> /* hello world を 10 回出力する while 構文 */ int main(void) { int i = 0; /* 何度、描画したか ? 回数 */ /* 条件が満たされるまで繰り返す */ /* 目的 : hello world を 10 回出力する */ /* 変数 i が、「表示回数」を表している */ /* 変数 i が 10 になるまで ... */ /* i が、だんだんとふえてゆく */ while ( i < 10 ) { printf ( "Hello, World\n" ); i++; /* 上の行で、一度出力したので、回数を増やす */ } /* while 構文が、命令を繰り返すかどうか ? の判定を 1. 変数 i の値で行っている 繰り返しを制御する変数を「ループの制御変数」 a) while 構文の前に初期化されている必要がある b) while 構文の条件式に現れる c) while 構文の本体で、更新される 2. 変数 i は、while 構文の本体(繰り返す部分)で更新されている */ return 0; }
#include <stdio.h> /* hello world を 10 回出力する for 構文 # for 構文と while 構文は、互いに相互変換可能 # => 一方があれば、他方は不要 # => 表現が違うの同じ機能でも、 # (プログラマの)意図を表す事ができる # => 「わかりやすい」プログラムを書く */ int main(void) { int i; /* 何度、描画したか ? 回数 */ for ( i = 0; i < 10; i++ ) { /* 制御変数関係は一か所 */ printf ( "Hello, World\n" ); /* 繰り返したい内容だけになっている */ } /* for 構文が、命令を繰り返すかどうか ? の判定を 変数 i の値で行っている 繰り返しを制御する変数を「ループの制御変数」 a) 制御変数の初期化が、for 構文の初期化部分 b) 条件判定が for 構文の条件式 c) 制御変数の更新が、for 構文の更新部 */ /* 繰り返し振る舞い ( 10 回繰り返す ) 明確な場合 => 制御変数を明示して、for 構文を利用する 何度繰り返すかわからない場合 # cf. 収束したかどうかの判定 => while 構文 */ return 0; }
#include <stdio.h> /* キーボードからの入力に合わせて、 入力される文字は、一つ(共通) 色々な事を行う 入力が 'h' ならば、"Hello" 入力が 'o' ならば、"おはよう" 入力が 'n' ならば、"ニーハオ" それ以外なら '?' if 構文 */ int main(void) { int ch; printf ( "文字を一文字入力して、改行してください : " ); ch = getchar(); /* 一文字入力 */ if ( ch == 'h' ) { printf ( "Hello\n" ); } else if ( ch == 'o' ) { printf ( "おはよう\n" ); } else if ( ch == 'n' ) { printf ( "ニーハオ\n" ); } else { printf ( "?\n" ); } /* if 構文は、二分岐しかできない 多分岐を行うためには、if 構文を複数組み合わせる 特に、同じもの ( ch の値 ) に対し、 複数の条件を確認する場合は、 else if イデオムが使える */ return 0; }
#include <stdio.h> /* キーボードからの入力に合わせて、 入力される文字は、一つ(共通) 色々な事を行う 入力が 'h' ならば、"Hello" 入力が 'o' ならば、"おはよう" 入力が 'n' ならば、"ニーハオ" それ以外なら '?' switch 構文 版 */ int main(void) { int ch; /* 入力された文字(コード)を保存する */ printf ( "文字を一文字入力して、改行してください : " ); ch = getchar(); /* 一文字入力 */ switch ( ch ) { case 'h': /* if ( ch == 'h' ) */ printf ( "Hello\n" ); break; case 'o': /* if ( ch == 'o' ) */ printf ( "おはよう\n" ); break; case 'n': printf ( "ニーハオ\n" ); break; default: printf ( "?\n" ); break; } /* switch 構文では、一つの(共通な)式の値に対し、 複数の値に等しい場合の条件に対応した命令 多分岐が、一度に表現できる */ return 0; }
#include <stdio.h> /* 変数 i = 0 ? 3 の値によって、 同じ事(Helloの出力)を i 回だけ実行する switch で実現 */ int main(void) { int i; printf ( "繰り返す回数を入力してください ( 0 ? 3 ) : " ); scanf ( "%d", &i ); /* キーボードから整数値を入力し変数 i に代入 */ switch ( i ) { case 3: printf ( "Hello, World\n" ); case 2: printf ( "Hello, World\n" ); case 1: printf ( "Hello, World\n" ); default: break; } return 0; }
#include <stdio.h> /* break の使い方 トランプの数に対する表記 1 ? 10 : そのまま 11, 12, 13 : J, Q, K を出力 */ int main(void) { int number; /* キーボードから整数値を入力する変数 */ /* トランプの数 */ printf ( "整数値を一つ入力してください : " ); scanf ( "%d", &number ); switch ( number ) { case 13: printf ( "K\n" ); break; case 12: printf ( "Q\n" ); break; case 11: printf ( "J\n" ); break; /* case 10: printf ( "10\n" ); */ default: if ( 0 < number ) { if ( number < 11 ) { /* 1 ? 10 */ printf ( "%d\n", number ); break; /* <= 「注目」: switch をぬけている */ } } printf ( "?\n" ); /* 35 行目の break が実行されなかったら */ break; } return 0; }
#include <stdio.h> /* break の使い方 トランプの数に対する表記 1 ? 10 : そのまま 11, 12, 13 : J, Q, K を出力 */ int main(void) { int number; /* キーボードから整数値を入力する変数 */ /* トランプの数 */ printf ( "整数値を一つ入力してください : " ); scanf ( "%d", &number ); switch ( number ) { case 13: printf ( "K\n" ); break; case 12: printf ( "Q\n" ); break; case 11: printf ( "J\n" ); break; /* case 10: printf ( "10\n" ); */ default: switch ( number ) { case 100: printf ( "%d\n", number ); break; /* <= 「注目」: 内側の switch だけをぬけている */ } printf ( "?\n" ); /* 35 行目の break が実行されてもここに来る */ break; } return 0; }
#include <stdio.h> /* n が 0 ? 99 の間で、 n^2 を出力する n^2 が 49 の場合に終了する # 繰り返しの途中で、ある条件が成立したら、 # 繰り返しを「中断する」場合を考える [ポイント] 繰り返しの条件が、二つある場合 一方を、繰り返し条件 もう一方を、中断条件の形で、分離した方がわかりやすい GT法 : 与えらえた集合の中から、条件を満たす解を探す場合 繰り返し条件は、「すべての集合の要素調べる」 中断条件は、「求める解が見つかった」 */ int main(void) { int i; for ( i = 0; i < 100; i++ ) { /* 0 ? 99 */ printf ( "%d^2 = %d\n", i, i * i ); if ( i*i == 49 ) { /* 中断条件が成立 */ break; /* for 構文を中断 */ /* この後の命令は、実行しない */ } } return 0; }
#include <stdio.h> int main(void) { /* 条件式が、整数値をとる事の確認 */ printf ( "(1==1)[真] = %d\n", 1 == 1 ); printf ( "(1==0)[偽] = %d\n", 1 == 0 ); return 0; }
#include <stdio.h> int main(void) { /* 整数値が「条件」の代わりになる事を示す */ if ( 0 ) { /* 条件式に整数値 0 を指定 */ printf ( "条件式が 0 なので、こっちにはこない\n" ); } else { printf ( "条件式が 0 つまり偽なので、こちらに来る\n" ); } if ( 1 ) { /* 条件式に整数値 1 を指定 */ printf ( "条件式が 1 ( 0 でない ) なので、こっちに来る\n" ); } else { printf ( "条件式が 1 つまり真なので、こちらに来ない\n" ); } if ( 123 ) { /* 条件式に整数値 123 を指定 */ printf ( "条件式が 123 ( 0 でない ) なので、こっちに来る\n" ); } else { printf ( "条件式が 123 つまり真なので、こちらに来ない\n" ); } return 0; }
#include <stdio.h> /* 入力された文字が、「数字」かどうかを判定する 「(算用)数字」: '0' ? '9' の 10 通りしかない ! 「数値」は、無限にある ch が数字である事の条件 '0' 以上で、 '9' 以下 '0' <= ch ch <= '9' 二つの条件を満たす必要がある => if 構文を組み合わせる */ int main(void) { int ch; /* 文字コードは、小さな整数なので char でなく int でいれてもよい.. */ /* 特に getchar() で入力する場合は、 getchar() 文字コード ( ASCII Code : 1 byte = char 型の範囲 ) の 他に、「入力に失敗した」という意味の「-1 (int だが charでない)」値 を返す事があるので、char ではなく int を利用する習慣がある */ printf ( "一文字入力して、改行を押してください : " ); ch = getchar(); /* 文字コードを入力 */ /* 入力された値が「数字」を表す、すなわち '0' <= ch <= '9' と、二つの条件 '0' <= ch ch <= '9' が 成立している事を if 構文で確認する */ if ( '0' <= ch ) { /* まずは、一つ目の条件の確認 */ /* ここでは、一つ目条件が成立している */ if ( ch <= '9' ) { /* 二つ目の条件を確認 */ /* ここでは、二つの条件が両方とも成立している */ printf ( "%c は、数字です\n", ch ); } else { printf ( "%c は、数字ではありません\n", ch ); } } else { printf ( "%c は、数字ではありません\n", ch ); } /* 二つの条件をチェックするために、 if 構文を二つ組み合わせた => 二つの条件をチェックする事ができた 三つの場合分けが生じた そのうちの二つは、同じ処理 # ちょっと気持ち悪い <= 「条件」の所は、 実は、「条件式(整数値とる式)」なので、 「計算」が可能 */ return 0; }
#include <stdio.h> /* 入力された文字が、「数字」かどうかを判定する 「(算用)数字」: '0' ? '9' の 10 通りしかない ! 「数値」は、無限にある ch が数字である事の条件 '0' 以上で、 '9' 以下 '0' <= ch ch <= '9' 二つの条件を満たす必要がある 条件式が、整数値である事を利用すると... */ int main(void) { int ch; printf ( "一文字入力して、改行を押してください : " ); ch = getchar(); /* 文字コードを入力 */ /* 二つの条件 '0' <= ch ch <= '9' が両立してほしい => ('0' <= ch) -> 1 ( 成立しなければ 0 になる ) (ch <= '9') -> 1 ( 成立しなければ 0 になる ) そこで、 ('0' <= ch) * (ch <= '9') という式 <真偽表> '0' <= ch | ch <= '9' | ('0' <= ch) * (ch <= '9') ----------------+---------------+---------------------------- | 真(1) | 1*1 = 1 (真) 両方成立 真(1) +---------------+---------------------------- | 偽(0) | 1*0 = 0 (偽) ----------------+---------------+---------------------------- | 真(1) | 0*1 = 0 (偽) 偽(0) +---------------+---------------------------- | 偽(0) | 0*0 = 0 (偽) ----------------+---------------+---------------------------- */ if ( ('0' <= ch) * (ch <= '9') ) { /* 「('0' <= ch) * (ch <= '9')」が 1 (0でない) */ /* => 二つの条件が両立している */ /* ここでは、二つの条件が両方とも成立している */ printf ( "%c は、数字です\n", ch ); } else { printf ( "%c は、数字ではありません\n", ch ); } /* 二つの条件をチェックするために、 二つの条件を含む、「(複雑な..) 条件式を一つ作る」 一つのif 構文で、複雑な条件をチェックする事ができ => 二つの条件をチェックするが、 一つの if 構文しかつかわないので、 場合分けも二つで済んでいる */ return 0; }
#include <stdio.h> /* 入力された文字が、「数字」かどうかを判定する 「(算用)数字」: '0' ? '9' の 10 通りしかない ! 「数値」は、無限にある ch が数字である事の条件 '0' 以上で、 '9' 以下 '0' <= ch ch <= '9' 二つの条件を満たす必要がある 二つの条件が両立している事を表す演算子として 「&&」 P && Q <-> P と Q がともに真の場合だけ真になる 「論理式」になる */ int main(void) { int ch; printf ( "一文字入力して、改行を押してください : " ); ch = getchar(); /* 文字コードを入力 */ /* 二つの条件 '0' <= ch ch <= '9' が両立してほしい => ('0' <= ch) -> 真 (ch <= '9') -> 真 そこで、 ('0' <= ch) && (ch <= '9') という式 <真偽表> '0' <= ch | ch <= '9' | ('0' <= ch) && (ch <= '9') ----------------+---------------+---------------------------- | 真(1) | 真&&真 = 真 両方成立 真(1) +---------------+---------------------------- | 偽(0) | 真&&偽 = 偽 ----------------+---------------+---------------------------- | 真(1) | 偽&&真 = 偽 偽(0) +---------------+---------------------------- | 偽(0) | 偽&&偽 = 偽 ----------------+---------------+---------------------------- */ if ( ('0' <= ch) * (ch <= '9') ) { /* 「('0' <= ch) * (ch <= '9')」が 1 (0でない) */ /* => 二つの条件が両立している */ /* ここでは、二つの条件が両方とも成立している */ printf ( "%c は、数字です\n", ch ); } else { printf ( "%c は、数字ではありません\n", ch ); } /* 二つの条件をチェックするために、 二つの条件を含む、「(複雑な..) 条件式を一つ作る」 一つのif 構文で、複雑な条件をチェックする事ができ => 二つの条件をチェックするが、 一つの if 構文しかつかわないので、 場合分けも二つで済んでいる */ return 0; }
for 構文 命令の繰り返しを行う構文 cf. while 構文 for 構文は、 繰り返しを制御する、制御変数を、 一か所にまとめて記述する事ができる => (while に比較すると..) わかりやすい switch 構文 条件分岐を行う構文 cf. if 構文 switch 構文は、 (if 構文が二分岐であるのに対し) 多分岐である (if 構文が、一般的な条件で判断するのに対し) 一つの式の値で分岐を判断する !! if 構文に switch 構文の方が表現力が弱い !! if 構文にできて switch 構文にできない事がある !! # 逆はない !! => !! switch 構文の意義 !! 表現力の問題 ( 多分岐がまとめて書ける ) !! 「表現力の『弱さ』の代わり『効率がよく』なっている」 !! トレードオフ switch 構文内で利用される break 命令は、 その命令を実行した時点で、switch 構文を「抜ける」という意味 逆に、break 命令がないと、どんどん下に行って、命令を実行する break 文 それが含まれる直近(最内)の switch/繰り返し 構文を終了(抜ける) switch 構文の中の break は、switch 構文を抜ける while/for 構文も break を利用して抜ける事ができる !! if 構文の中で break を利用した場合は、 !! if 構文を含む、直近(最内)の switch/繰り返し 構文を抜ける !! (if 構文は、break に関して透過的) if 構文 条件分岐を行う基本構文 条件(成立/不成立:真/偽)に従って、二つの命令のどちらかを実行する => 二分岐が可能 <= 多分岐がしたい場合 - if 構文を組み合わせればよい - 条件式を利用する事できる 条件分岐 (if 構文) 条件分岐 (条件によって二つの命令の一方を実行) if 文 の構文 if (「条件」) { 「条件成立時の命令」 } else { 「条件不成立時の命令」 } # 原則 # 「{,}」を必ず書く # else 節を省略しない if 文 の意味 まず「条件(整数値になる)」をチェック ( 0 なら「偽(不成立)」、それ以外なら「真(成立)」 ) !! 「真」となるよにしたい場合は、「1」の値を使う事が多い 「条件」が真なら 「条件成立時の命令」を実行、 そうでなければ 「条件不成立時の命令」を実行 if 構文の色々なパターン else 節の省略 「条件不成立時の命令」がない時 # 「else {}」=> 省略してもよい 「 if (「条件」) { 「条件成立時の命令」 } 」だけで 「else 以下 ( else{} )」は省略 <新規> 「命令が一つ」の時 : # ブレース「{,}」を省略してもよい 「 if (「条件」)「条件成立時の命令」 」 だけで 「{」、「}」は不要 [本当の事] if 構文は 「if ( 条件 ) 命令 else 命令」 # 「命令」の所に「{ 命令列 }」を書いてもよい 注意 : 「{」、「}」の省略はお勧めできない !! 「{,}」を付けない方針の場合、 誤りのリスクが増大する 例: 命令があとから増えた時 当然、「{,}」*も* も追加する必要がある しかし、忘れがち if 構文は、組み合わせる ( ネストにする ) 事により、 任意の条件を判断する事が可能 「条件」の真実 「条件」は、「整数値をとる『条件式』」であり、 「0」という整数値の時に、『偽(不成立)』と扱い それ以外(「0」以外の整数値)の時には、『真(成立)』とみなす !! if 構文だけでなく for/while など、 !! 「条件」が現れる、すべての状況で、共通 複雑な条件式を作って、複雑な条件を一度に判定できるようになる
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20201023-01.c
/* * 課題 20201023-01 * * 20201023 20201023-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
$ ./20201023-01-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 20201023-02.c
/* * 課題 CNAME-02 * * 20201023 20201023-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
$ ./20201023-02-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 20201023-03.c
/* * 課題 CNAME-03 * * 20201023 20201023-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; }
$ ./20201023-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 : 20201023-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; }
$ ./20201023-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 | +---+---+---------+------------+ $