Download : 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.exe 正 正でない 正でない $
Download : 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.exe 正 $
Download : 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.exe 正 $
Download : 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.exe 正 $
Download : 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.exe 1 < 2 は成立するので 1 になる。 3 < 2 は成立しないので 0 になる。 1 < 2 は成立しました。 3 < 2 は成立しませんでした。 1 は「真」と見做されました。 0 は「偽」と見做されました。 3 は「真」と見做されました。 -10 は「真」と見做されました。 $
Download : 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.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
/*
* 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.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
/*
* 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.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
/*
* 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.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
/*
* 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.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
/*
* 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : 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.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
/*
* 課題 20181116-01
*
* 20181116 20181116-01-QQQQ.c
*
* 標準入力から三つの整数数値読込み、それを小さい順に出力する (if 文のみ)
*/
#include <stdio.h>
/*
* main
*/
int main( void )
{
/* 入力した、三つの値をそれぞれ保存する変数
i1, i2, i3 を宣言
*/
int i1; /* 三つの整数値を入力するので、三つの整数型変数(i1〜i3)を準備する */
int i2;
int i3;
/* 出力する、すでに小さい順になった三つの値をそれぞれ保存する変数
o1, o2, o3 を宣言
*/
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 の値の方が小さい */
o1 = i3;
/* この時点で、i1 と i2 では、もう i1 が小さい事が判明している */
/* 改めて、比較するまでもなく、i1 の値が、二番目に小さい事が分かる */
o2 = i1; /* i1 < i2 は確認済なので i1 の値はニ番目 */
o3 = i2;
}
} else { /* i2 の値 が i1 の値より小さい */
if ( i2 < i3 ) { /* 更に i2 の値が i3 の値より小さい */
o1 = i2; /* 一番小さいのは、i2 の値 */
/* i1 と i3 で、どっちが小さいかを考える */
/* これまで、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>
/*
a (a == 0)
func ( a ) = {
1/a (a == 1)
*/
int func(int f) {
if ( f == 0 ) {
return f;
} else { /* f == 1 */
return 1/f;
}
}
int main(int argc, char *argv[]) {
printf ( "func(%d, %d) = %d\n", 0, 10, func(0,10) );
/* => 10 */
printf ( "func(%d, %d) = %d\n", 1, 100, func(1,100) );
/* => -100 */
return 0;
}
#include <stdio.h>
/*
b (a == 0)
func ( a, b ) = {
-b (a == 1)
*/
int func(int f, int v) {
return (1-f)*v + f*(-v);
/*
f = 0 or 1
f=0 => (1-0)*v + 0*(-v) => v
f=1 => (1-1)*v + 1*(-v) => -v
*/
/*
制御 : 場合によっては、式だけで表現できてしまう
*/
}
int main(int argc, char *argv[]) {
printf ( "func(%d, %d) = %d\n", 0, 10, func(0,10) );
/* => 10 */
printf ( "func(%d, %d) = %d\n", 1, 100, func(1,100) );
/* => -100 */
return 0;
}
#include <stdio.h>
/*
a (a == 0)
func ( a ) = {
1/a (a == 1)
*/
int func(int f) {
if ( f == 0 ) {
return f;
} else { /* f == 1 */
return 1/f;
}
}
int main(int argc, char *argv[]) {
printf ( "func(%d, %d) = %d\n", 0, 10, func(0,10) );
/* => 10 */
printf ( "func(%d, %d) = %d\n", 1, 100, func(1,100) );
/* => -100 */
return 0;
}
#include <stdio.h>
/*
a (a == 0)
func ( a ) = {
1/a (a == 1)
*/
int func(int f) {
return (1-f)*f + f*(1/f);
/* f=0 の時、破綻する .. */
}
int main(int argc, char *argv[]) {
printf ( "func(%d, %d) = %d\n", 0, 10, func(0,10) );
/* => 10 */
printf ( "func(%d, %d) = %d\n", 1, 100, func(1,100) );
/* => -100 */
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
switch ( argc ) {
case 1: /* コマンドライン引数がない */
printf ( "引数なし\n" );
break; /* break は、ここで、switch を終了 */
case 2: /* コマンドライン引数が 1 つ */
printf ( "最初の引数は %s\n", argv[1] );
/* 書式指定の「%s」は、文字列の指定を意味する */
break;
default: /* それ以外 */
printf ( "たくさんあります\n" );
break;
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
if ( argc == 1 ) { /* コマンドライン引数がない */
printf ( "引数なし\n" );
} else if ( argc == 2 ) {/* コマンドライン引数が 1 つ */
printf ( "最初の引数は %s\n", argv[1] );
} else { /* それ以外 */
printf ( "たくさんあります\n" );
}
/* if 構文を利用すれば、switch と同様な事は実現できる */
/* 整数値での多重分岐は、 switch - case 構文の方が分かりやすい */
return 0;
}
#include <stdio.h>
/*
1 ? n の総和を計算する
*/
int main(int argc, char *argv[]) {
int i; /* 制御変数 */
int sum = 0; /* 総和の計算を積み上げる変数 */
int n; /* キーボードから入力する値 */
printf ( "n を入力してください : " );
scanf ( "%d", &n ); /* scanf を利用して、キーボードから整数値
を読み出し、それを変数 n に保存する */
/* 1 から n まで、それらの和を計算する */
/* => n 回繰り返す */
for ( i = 0; i < n; i++ ) { /* i++ : ここでは i = i + 1 の意味 */
/* ここに記述された命令は n 回実行される */
sum = sum + (i+1); /* sum += i+1 */
}
printf ( "1 ? %d の和は %d\n", n, sum );
return 0;
}
#include <stdio.h>
/*
1 ? n の総和を計算する
*/
int main(int argc, char *argv[]) {
int i; /* 制御変数 */
int sum = 0; /* 総和の計算を積み上げる変数 */
int n; /* キーボードから入力する値 */
printf ( "n を入力してください : " );
scanf ( "%d", &n ); /* scanf を利用して、キーボードから整数値
を読み出し、それを変数 n に保存する */
/* 1 から n まで、それらの和を計算する */
/* => n 回繰り返す */
i = 0;
while ( i < n ) {
/* ここに記述された命令は n 回実行される */
sum = sum + (i+1); /* sum += i+1 */
i++; /* i++ : ここでは i = i + 1 の意味 */
}
printf ( "1 ? %d の和は %d\n", n, sum );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
i=0;
while ( i < 10 ) {
printf ( "i=%d\n", i );
printf ( "i*i=%d\n", i*i );
i++;
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
i=0;
while ( i < 10 ) {
printf ( "i=%d\n", i );
if ( i == 5 ) {
break; /* 繰り返しを終了させる */
}
printf ( "i*i=%d\n", i*i );
i++;
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
i=0;
while ( i < 10 ) {
printf ( "i=%d\n", i );
if ( i == 5 ) {
continue; /* 繰り返しの先頭[条件判定]に行く */
}
printf ( "i*i=%d\n", i*i );
i++;
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
i=0;
while ( i < 10 ) {
printf ( "i=%d\n", i );
i++;
if ( i == 5 ) {
continue; /* 繰り返しの先頭[条件判定]に行く */
}
printf ( "i*i=%d\n", i*i );
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
i=0;
while ( i < 10 ) {
printf ( "i=%d\n", i );
i++;
if ( i == 5 ) {
/* continue; */ /* 繰り返しの先頭[条件判定]に行く */
} else {
printf ( "i*i=%d\n", i*i );
}
}
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
for ( i=0; i < 10; i++ ) {
printf ( "i=%d\n", i );
if ( i == 5 ) {
continue; /* 繰り返しの先頭[条件判定]に行く */
}
printf ( "i*i=%d\n", i*i );
}
return 0;
}
#include <stdio.h>
/*
v が a と b の間にある場合
例 : v が小文字である v が 'a' 以上 'z' 以下
*/
char toupper ( char ch ) {
/* 引数の ch が小文字なら、大文字、そうでなければ、そのまま返す */
if ( 'a' <= ch ) {
if ( ch <= 'z' ) {
return ch - 'a' + 'A'; /* 小文字を大文字に変換 */
} else {
/* なにもしない */
}
} else {
/* なにもしない */
}
return ch; /* 元のコードをそのまま返す (変換しない) */
}
int main(int argc, char *argv[]) {
char ch;
putchar ( toupper ( getchar() ) );
return 0;
}
#include <stdio.h>
/*
v が a と b の間にある場合
例 : v が小文字である v が 'a' 以上 'z' 以下
*/
char toupper ( char ch ) {
/* 引数の ch が小文字なら、大文字、そうでなければ、そのまま返す */
if ( 'a' <= ch && ch <= 'z' ) { /* 'a' <= ch <= 'z' */
/*
if 構文の条件式の値は、整数値
0 は偽
0 以外は、真
通常、条件式が真である事を示すために 1 の値を使う
*/
return ch - 'a' + 'A'; /* 小文字を大文字に変換 */
} else {
/* なにもしない */
}
return ch; /* 元のコードをそのまま返す (変換しない) */
}
int main(int argc, char *argv[]) {
char ch;
putchar ( toupper ( getchar() ) );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int v; /* 入力する値 */
printf ( "v の値を入力してください : " );
scanf ( "%d", &v );
printf ( "v=%d\n", v );
if ( v ) { /* 条件式の所に「v」という整数値を持つ式がある */
printf ( "真と解釈されました\n" );
} else {
printf ( "偽と解釈されました\n" );
}
printf ( "v が 10 を大きいかどうかを示す : %d\n", v > 10 );
return 0;
}
#include <stdio.h>
int func(int v) {
printf ( "v=%d\n", v );
return v%2; /* v が偶数の時に 0 / 奇数の時 1 */
/* => func は奇数かどうかを判定する関数 */
}
int main(int argc, char *argv[]) {
if ( func ( 2 ) ) {
printf ( "2 では成立する\n" );
} else {
printf ( "2 では不成立する\n" );
}
if ( func ( 123 ) ) {
printf ( "123 では成立する\n" );
} else {
printf ( "123 では不成立する\n" );
}
if ( func(2) * func(123) ) {
printf ( "成立する\n" );
} else {
printf ( "不成立する\n" );
}
if ( func(2) && func(123) ) {
printf ( "成立する\n" );
} else {
printf ( "不成立する\n" );
}
return 0;
}
#include <stdio.h>
int main( int argc, char *argv[] ) {
int flag; /* 旗(真偽値)を持つ変数 */
flag = 1 < 2; /* 1 になる */
/* 条件式の値が整数なので、整数型変数にいれて利用できる */
if ( flag ) { /* 変数に保存されている真偽値を参照して */
printf ( "旗が立っている\n" );
} else {
pritnf ( "旗が降ろされている\n" );
}
if ( flag ) { /* 変数に保存されている真偽値を参照して */
printf ( "旗が立っている\n" );
} else {
pritnf ( "旗が降ろされている\n" );
}
return 0;
}
[先週の復習]
switch 構文
for 構文
# 構文 : 他の文から新しい文を作る仕組み
# if 構文 / while 構文 / 関数の定義
# => 命令の制御(実行順序)を行う [ 単純に命令を集めただけとは異なる ]
# 制御 : やってはいけない命令をしないようにできる
# cf. 「計算式」だけで、同じ機能を実現しようとすると、
# やってはいけない命令を実行せざるを得なくなる
switch 構文
用途 : 多重分岐 ( cf. if 構文は 2 分岐 )
switch 構文では、分岐のための条件が整数の等式で表現できる条件だけ
=> 表現がわかりやすくなる / 高速になる
形式 :
switch ( 式 ) {
case-並び
}
case - 並び
case 定数式 : 命令列
default : 命令列
が繰り返される
意味 :
「式」の値と同じ値を持つ「定数式」のついた case の
ところから命令を実行する
for 構文
用途 : 繰り返しを記述する ( cf. while / 再帰 )
while や再帰があるので、利用できなくても困らない
while と比較して、制御変数の操作をまとめてかけるのがうれしい
形式 : for ( 初期化;条件;ステップ ) { 繰り返し命令 }
意味 :
初期化
while ( 条件 ) {
繰り返し命令
ステップ
}
for 構文と while 構文は、上記規則で基本的に対応するが、
例外がある
continue を利用したとき...
[break/contine]
break は、繰り返し構文を中断し、即時、繰り返しの次の文に行く
繰り返し構文 : while / for / [do while]
cf. switch 構文でも、構文の終了に利用している
continue は、繰り返し構文の先頭に戻る
# と考えると、for / while に差ができるが、
# こうではなく、「構文の最後に移動」と考えれば、
# for / while の差がなくなって、統一的に理解できる
[条件式(if 構文)]
(if 構文の) 条件式の値は、整数値
0 は偽
0 以外は、真
通常、条件式が真である事を示すために 1 の値を使う
条件式は「成立する/しない」、「真/偽」
=> C 言語では整数
=> 条件式の値を計算によって求める事が可能になる
例 : v, u という二つの変数があるとする
v と u が共に、0 である場合だけ、処理をしたい
v^2 + u^2 == 0 <=> v=0 かつ u=0
(u == 0)
u が 0 の時に 1 になる (そうでないときは 0)
(v == 0)
v が 0 の時に 1 になる
(u == 0)*(v==0) u==0 v==0 (u == 0)*(v==0)
u = 0, v = 0 1 1 1
u = 0, v = 1 1 0 0
u = 1, v = 0 0 1 0
u = 1, v = 1 0 0 0
(u==0)&&(v==0)
&& 論理積演算子
A && B の値は
A と B のどちらか一方が 0 の時 0
それ以外は 1 になる
例:
'a' <= ch && ch <= 'z'
1 && 100 => 1
100 && 0 => 0
!! [注意] ショートカット機能がある
!! A && B で、 A が 0 だと、B は評価されない
|| 論理和演算子
A || B の値は
A と B のどちらか一方が 0 でない時 1
それ以外は 0 になる
例:
ch == 'a' || ch == 'A'
ch が大文字か小文字の A である
1 || 100 => 1
100 || 0 => 1
0 || 0 => 0
!! [注意] ショートカット機能がある
!! A || B で、 A が 1 だと、B は評価されない
条件が、値(操作可能な)なので、
条件を計算したり、代入したりできる
真偽値(に対応する整数型の値)を保持する変数の事を「フラグ」
フラグという考え方は、プログラムをデータ化する
# プログラムの振る舞いを、データと同じレベルで、操作できる
=> あまりも強力なので、「乱用禁止」です。
[ポイント] 真偽値(条件式が持つ値)を利用して新しい真偽値をとる
演算子がある(真偽値が操作できる)
! C 言語では、真偽値が、実は整数値
! 値は、変数に保存したり、関数への引数や値にできる
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 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-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 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-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 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-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 : 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-QQQQ.exe +---+---+---------+------------+ | P | Q | !(P&&Q) | (!P)||(!Q) | +---+---+---------+------------+ | 0 | 0 | 1 | 1 | | 0 | 1 | 1 | 1 | | 1 | 0 | 1 | 1 | | 1 | 1 | 0 | 0 | +---+---+---------+------------+ $