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 の表すカードは、範囲外です。 $
/*
* 課題 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;
case 'e': /* 'e' の時は、英語にする */
printf ( "Hello\n" );
break;
case 'c': /* 'c' の時は、中国語にする */
printf ( "ニイハオ\n" );
break;
case 'f': /* 'f' の時は、フランス語にする */
printf ( "Bonjour\n" );
break;
case '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;
}
/*
* 20181012-01-QQQQ.c
*
* 一つ浮動小数点数値をキーボードから入力し、その立方根を出力する
* 手段としては、「二分法」を使う
*
* コンパイル :
* cc -I ~/c/include -c 20181012-01-QQQQ.c
* cc -o 20181012-01-QQQQ.exe 20181012-01-QQQQ.o
* 実行 :
* ./20181012-01-QQQQ.exe
*
* double 型を利用して、「収束」による、数値計算の例
*
* [立方根]
* 実数値 a の立法根は、代数方程式 x^3 - a = 0 の実根
* a の立法根を α とすると、代数方程式 x^3 - a = 0 の根(解)は、
* α, αω, αω^2
* 但し、ω は、実数でない x^3-1 = 0 の根
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
*
*/
#define EPSILON 0.00000001 /* 誤差幅 */
/* 答えの誤差の上限を与える => 数学的には、無限回繰り返す事により、0 にできる */
/* 「#define A B」は、以下、A ができたら、全部 B に置き換える */
/*
* double regula_falsi_cubic_root ( double a, double min, double mid, double max )
* double a 立方根の元になる数(正を仮定している)
* => x^3-a は、解の右で、正、解の左で負
* => f(min) < 0 < f(max)
* double min, max 根の入る区間の範囲
* double mid min と mid の中点
* return a 立方根
* 二分法により、a の立方根を求める
* 0 < min < a の立方根 < max
*
* 現時点で、a の立方根が、区間 [min,max] の間にある事がわかっているとする..
* mid は、事前に、(min+max)/2.0 の値が入っているものとする
*/
double regula_falsi_cubic_root ( double a, double min, double mid, double max ) {
if ( max - min < EPSILON ) { /* 十分に精度が上った */
return mid; /* 中点の値を答として返す */
} else { /* まだ、狭める必要がある */
/* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */
/* f(x)=x^3-a */
if ( mid * mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */
/* f(x)=x^3-a の時に、f(mid) の負号を考える */
/* 解が、[mid,max] に含まれる */
return regula_falsi_cubic_root ( a, mid, (mid+max)/2.0, max );
} else { /* 解が、[min,mid] に含まれる */
return regula_falsi_cubic_root ( a, min, (min+mid)/2.0, mid );
}
}
}
/*
* double cubic_root ( double a )
* double a 立方根の元になる数
* return a 立方根
* a の立方根を求めて結果として返すが、
* 計算の基本は、regula_falsi_cubic_root にまかせる
* ここでは、引数の「正規化」を行う
* a >= 0
* f(min) < 0 < f(max) となるように、min と max を決める
*/
double cubic_root ( double a ) {
if ( a < 0.0 ) { /* a が負の数ならば.. */
/* -a の立方根を計算し、負数を返す */
return - cubic_root ( - a );
/* a>0 の時の立方根をαとすると、b=-a < 0 の立方根が -α になるから */
/* 問題を解く時には、
制約(仮定)が多い方が、答えを求めやすい
=> 仮定が、答え(結論)を導くために、利用できるから
[問題の解法のテクニック]
与えらえた問題を、(適当な仮定を加えて)特殊な場合に関して解く
一般の問題を、上記の仮定を満たすように、変型する
*/
} else if ( a < 1.0 ) { /* |a| が 1.0 以下なら */
/*
0 < a < 1 => 0 < α < 1
=> min と max が決められる
*/
return regula_falsi_cubic_root ( a, 0.0, (0.0+1.0)/2.0, 1.0 );
/* 立方根は 0.0 と 1.0 の間にある */
} else { /* そうでなければ.. */
/*
1 < a => 1 < α < a
=> min と max が決められる
*/
return regula_falsi_cubic_root ( a, 1.0, (1.0+a)/2.0, a );
/* 立方根は 1.0 と a の間にある */
}
}
/*
* void print_cubic_root ( double a )
* double a 立方根を計算する数
* 元の数と、立方根を出力する
*/
void print_cubic_root ( double a ) {
s_print_double ( a );
s_print_string ( " の立方根は " );
s_print_double ( cubic_root ( a ) ); /* double 値の出力 */
/* printf を使うべきだった.. */
s_print_string ( " です。\n" );
}
/*
* main
*/
int main( double argc, char *argv[] )
{
s_print_string ( "実数値を一つ入力してください : " );
print_cubic_root ( s_input_double() );
return 0;
}
/*
* 20191018-03-QQQQ.c
*
* 関数 sin(x) の区間 [0,π/4] の定積
*
* コンパイル :
* cc -I ~/c/include -c 20191018-03-QQQQ.c
* cc -o 20191018-03-QQQQ.exe 20191018-03-QQQQ.o
* 実行 :
* ./20191018-03-QQQQ.exe
*
*/
#include <stdio.h>
#include <math.h> /* 数学的関数 sin を利用するので.. */
#include "s_input.h"
#include "s_print.h"
/*
* リーマン積分を利用する
*/
#define FRACTIONAL 1000 /* 区間の等分数 */
/*
* f(x)=sin(x)
*/
double f(double x) {
/*
* 引数 x に対して、x の 正弦値 sin(x) を値として返す関数
*/
return sin(x);
}
/*
reman_sum ( int i, int n, double min, double max )
S_i 〜 S_{n^1} の和を計算する
*/
double reman_sum ( int i, int n, double min, double max ) {
if ( i < n ) { /* まだ計算が必要 */
/* 注目している短冊の面積と、残りの部分の面積の和を計算する */
return
reman_sum ( i + 1, n, min, max )
+
f(min+i*(max-min)/n)*(max-min)/n;
} else { /* もう、全て計算した */
return 0.0; /* 残る結果は 0 になる */
}
}
/*
* リーマン積分
*
* 関数の積分値が、小さな幅の短冊の面積の和で近似できる事を利用
*
* solove_reaman ( double min, double max )
*
*/
double solve_reman ( double min, double max ) {
/*
min から max までを積分
基本は reman_sum に任せる
*/
return reman_sum ( 0, FRACTIONAL, min, max );
}
/*
* main 関数
*/
int main ( void ) {
s_print_string ( "関数 f(x)=sin(x) を区間[0,π/4]で数値定積分する。\n" );
s_print_string ( "リーマンの定義に従って計算した答えは : " );
s_print_double ( solve_reman ( 0.0, M_PI/4.0 ) );
s_print_string ( "になりました。\n" );
s_print_string ( "解析的な計算の結果は 1-√2/2 なので、誤差は " );
s_print_double ( solve_reman ( 0.0, M_PI/4.0 ) - (1.0-sqrt(2.0)/2.0) );
s_print_string ( " になり、ほぼ答えに近い事がわかります\n" );
return 0;
}
#include <stdio.h>
/*
e = \lim_{n \to \infty} \sum_{i=1}^n \frac{1}{n!}
*/
#define EPS 0.0000001
int main(int argc, char *argv[]) {
double i; /* i = 1.0, 2.0, ... */
double fac; /* fac = i! */
double sum;
fac = 1.0;
sum = 0.0;
for ( i = 1.0; 1.0/fac > EPS; i = i + 1.0 ) {
/* for 構文では、制御変数となる i の処理が、一か所にまとまっている */
/* fac が i の関数(i!)になっているので.. */
/*
求める値は sum に保存されている
収束したかどうかは、コーシー列として考え、
特に、|a_m,-a_n| -> 0 の n=i, m=i+1 の場合を考えてる
1.0/fac は、今の sum と次の sum の差になっているので、
更新前と更新後の値の差が十分に小さい (EPS 以下)なら、収束と判定する
*/
sum = sum + 1.0/fac; /* 1.0/fuc の総和計算 */
fac = fac * i; /* (i+1)! = i! * (i+1) */
printf ( "i=%f, fac = %f, sum = %f\n", i, fac, sum );
}
printf ( "e = %20.18f\n", sum );
return 0;
}
/*
* 20181012-01-QQQQ.c
*
* 一つ浮動小数点数値をキーボードから入力し、その立方根を出力する
* 手段としては、「二分法」を使う
*
* コンパイル :
* cc -c 20181012-01-QQQQ.c
* cc -o 20181012-01-QQQQ.exe 20181012-01-QQQQ.o
* 実行 :
* ./20181012-01-QQQQ.exe
*
* double 型を利用して、「収束」による、数値計算の例
*
* [立方根]
* 実数値 a の立法根は、代数方程式 x^3 - a = 0 の実根
* a の立法根を α とすると、代数方程式 x^3 - a = 0 の根(解)は、
* α, αω, αω^2
* 但し、ω は、実数でない x^3-1 = 0 の根
*/
#include <stdio.h>
/*
*
*/
#define EPSILON 0.00000001 /* 誤差幅 */
/* 答えの誤差の上限を与える => 数学的には、無限回繰り返す事により、0 にできる */
/* 「#define A B」は、以下、A ができたら、全部 B に置き換える */
/*
* double regula_falsi_cubic_root ( double a, double min, double mid, double max )
* double a 立方根の元になる数(正を仮定している)
* => x^3-a は、解の右で、正、解の左で負
* => f(min) < 0 < f(max)
* double min, max 根の入る区間の範囲
* double mid min と mid の中点
* return a 立方根
* 二分法により、a の立方根を求める
* 0 < min < a の立方根 < max
*
* 現時点で、a の立方根が、区間 [min,max] の間にある事がわかっているとする..
* mid は、事前に、(min+max)/2.0 の値が入っているものとする
*/
double regula_falsi_cubic_root ( double a, double min, double mid, double max ) {
while ( max - min >= EPSILON ) { /* 十分に精度が上った */
/* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */
/* f(x)=x^3-a */
if ( mid * mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */
/* f(x)=x^3-a の時に、f(mid) の負号を考える */
/* 解が、[mid,max] に含まれる */
min = mid; /* 引数も変数なので、代入が可能 */
} else { /* 解が、[min,mid] に含まれる */
max = mid;
}
mid = (min+max)/2.0;
}
return mid; /* 中点の値を答として返す */
}
/*
* double cubic_root ( double a )
* double a 立方根の元になる数
* return a 立方根
* a の立方根を求めて結果として返すが、
* 計算の基本は、regula_falsi_cubic_root にまかせる
* ここでは、引数の「正規化」を行う
* a >= 0
* f(min) < 0 < f(max) となるように、min と max を決める
*/
double cubic_root ( double a ) {
if ( a < 0.0 ) { /* a が負の数ならば.. */
/* -a の立方根を計算し、負数を返す */
return - cubic_root ( - a );
/* a>0 の時の立方根をαとすると、b=-a < 0 の立方根が -α になるから */
/* 問題を解く時には、
制約(仮定)が多い方が、答えを求めやすい
=> 仮定が、答え(結論)を導くために、利用できるから
[問題の解法のテクニック]
与えらえた問題を、(適当な仮定を加えて)特殊な場合に関して解く
一般の問題を、上記の仮定を満たすように、変型する
*/
} else if ( a < 1.0 ) { /* |a| が 1.0 以下なら */
/*
0 < a < 1 => 0 < α < 1
=> min と max が決められる
*/
return regula_falsi_cubic_root ( a, 0.0, (0.0+1.0)/2.0, 1.0 );
/* 立方根は 0.0 と 1.0 の間にある */
} else { /* そうでなければ.. */
/*
1 < a => 1 < α < a
=> min と max が決められる
*/
return regula_falsi_cubic_root ( a, 1.0, (1.0+a)/2.0, a );
/* 立方根は 1.0 と a の間にある */
}
}
/*
* void print_cubic_root ( double a )
* double a 立方根を計算する数
* 元の数と、立方根を出力する
*/
void print_cubic_root ( double a ) {
printf ( "%f の立方根は %f です。\n", a, cubic_root ( a ) );
}
/*
* main
*/
int main( double argc, char *argv[] )
{
double a;
printf ( "実数値を一つ入力してください : " );
scanf ( "%lf", &a );
print_cubic_root ( a );
return 0;
}
/*
* 2019/10/18 p-003.c
* 課題 20191018-03 の一つの解
*/
/*
* リーマン積分
*
* 利用方法
* コンパイル
* cc -I ~/c/include -c sample-002.c
* リンク
* cc -o sample-002.exe sample-002.c
* 実行
* ./sample-002.exe
*/
/*
*
* 定積分
* \int_0^1 x^2 dx
* を「数値的」に解く
*
*/
#include <stdio.h>
#include <math.h> /* 数学関数 ( sin, cos, tan, sqrt, exp, etc.. ) */
/*
*
*/
#define FRACTIONAL 10000 /* 区間の等分数 */
/*
* f(x)=x^2
*/
double f(double x) {
/*
* 引数 x に対して、x の 二乗を値として返す関数
*/
/* return x * x; */
return sin(x); /* sin(x) の積分なので... */
}
/*
reman_sum ( int i, int n, double min, double max )
S_i 〜 S_{n^1} の和を計算する
S_k = \sum_{i=1}^k f(x_i)
S_{k+1} = S_k + f(x_{k+1})
*/
double reman_sum ( int i, int n, double min, double max ) {
if ( i < n ) { /* まだ計算が必要 */
/* 注目している短冊の面積と、残りの部分の面積の和を計算する */
return
reman_sum ( i + 1, n, min, max )
+
f(min+i*(max-min)/n)*(max-min)/n;
} else { /* もう、全て計算した */
return 0.0; /* 残る結果は 0 になる */
}
}
/*
* リーマン積分
*
* 関数の積分値が、小さな幅の短冊の面積の和で近似できる事を利用
*
* solove_reaman ( double min, double max )
*
* \int_{min}^{max} f(x) dx
*
*/
double solve_reman ( double min, double max ) {
/*
min から max までを積分
基本は reman_sum に任せる
*/
return reman_sum ( 0, FRACTIONAL, min, max );
}
/*
* main 関数
*/
int main ( void ) {
double tv = (2.0-sqrt(2.0))/2.0;
printf ( "関数 f(x)=sin(x) を区間[0,π/4]で数値定積分する。\n" );
printf ( "リーマンの定義に従って計算した答えは : %f になりました。\n",
solve_reman ( 0.0, M_PI/4.0 ) /* M_PI は math.h の中で円周率の値として定義されている */
);
printf ( "解析的な計算の結果は %f なので、誤差は %f になり、ほぼ答えに近い事がわかります\n",
tv,
solve_reman ( 0.0, M_PI/4.0 ) - tv
);
return 0;
}
#include <stdio.h>
/*
アラビア数字一文字を、漢数字に変換して、出力する
n = '0' ? '9' => 零, 一, .., 九
複数分岐
*/
void kanji_number ( char n ) {
switch ( n ) { /* n の値によって、分岐する */
case '0': /* 「文字」は、小さな整数 ( 0 ? 255 ) で表現 */
printf ( "零" );
break; /* もし、ここで break がないと、次の case の命令も実行する */
case '1':
printf ( "一" );
break; /* ここで、switch 構文の次の命令に行く */
case '2':
printf ( "二" );
break;
/* 途中は、同様なので省略 */
default:
printf ( "数字でない" );
break;
}
}
int main(int argc, char *argv[] ) {
printf ( "数字を一文字入力してください : " );
kanji_number ( getchar() );
printf ( "\n" );
return 0;
}
#include <stdio.h>
void print_tranp ( int card ) {
/* ?g?????v??J?[?h?????????A1 ?` 13 ??^????A??????o????? */
/* ???????A 1 ?` 10 ??A???????A11, 12, 13 ??A J, Q, K ???o????? */
switch ( card ) {
case 1:
/* ????????? */
/* break ????????A??????Acase 2 ?????.. */
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
/* ??????l??A????????????????Abreak ??????????????????\ */
case 9:
case 10:
printf ( "%d", card );
break;
/* .. */
case 11:
printf ( "J" );
break;
case 12:
printf ( "Q" );
break;
case 13:
printf ( "K" );
break;
default:
printf ( "???" );
break;
}
}
int main(int argc, char *argv[] ) {
int i;
for ( i = 1; i <= 13; i++ ) {
print_tranp ( i );
putchar ( ' ' );
} /* => 1 2 3 .. 10 J Q K */
printf ( "\n" );
return 0;
}
/*
* 2019/10/18 sample-002.c
*/
/*
* リーマン積分
*
* 利用方法
* コンパイル
* cc -I ~/c/include -c sample-002.c
* リンク
* cc -o sample-002.exe sample-002.c
* 実行
* ./sample-002.exe
*/
/*
*
* 定積分
* \int_0^1 x^2 dx
* を「数値的」に解く
*
*/
#include <stdio.h>
/*
*
*/
#define FRACTIONAL 10000 /* 区間の等分数 */
/*
* f(x)=x^2
*/
double f(double x) {
/*
* 引数 x に対して、x の 二乗を値として返す関数
*/
return x * x;
}
/*
reman_sum ( int i, int n, double min, double max )
S_i 〜 S_{n^1} の和を計算する
S_k = \sum_{i=1}^k f(x_i)
S_{k+1} = S_k + f(x_{k+1})
*/
double reman_sum ( int i, int n, double min, double max ) {
if ( i < n ) { /* まだ計算が必要 */
/* 注目している短冊の面積と、残りの部分の面積の和を計算する */
return
reman_sum ( i + 1, n, min, max )
+
f(min+i*(max-min)/n)*(max-min)/n;
} else { /* もう、全て計算した */
return 0.0; /* 残る結果は 0 になる */
}
}
/*
* リーマン積分
*
* 関数の積分値が、小さな幅の短冊の面積の和で近似できる事を利用
*
* solove_reaman ( double min, double max )
*
* \int_{min}^{max} f(x) dx
*
*/
double solve_reman ( double min, double max ) {
/*
min から max までを積分
基本は reman_sum に任せる
*/
return reman_sum ( 0, FRACTIONAL, min, max );
}
/*
* main 関数
*/
int main ( void ) {
printf ( "関数 f(x)=x^2 を区間[0,1]で数値定積分する。\n" );
printf ( "リーマンの定義に従って計算した答えは : %f になりました。\n",
solve_reman ( 0.0, 1.0 )
);
printf ( "解析的な計算の結果は 1/3 なので、誤差は %f になり、ほぼ答えに近い事がわかります\n",
solve_reman ( 0.0, 1.0 ) - 1.0/3.0
);
return 0;
}
8
?O??(2019/10/18)????e
?????????_?? (double ?^) ????p
?????????_????A?u?L???????l?v??\??????
(?^???I??..) ?????l?????p??????????B
# ????????????????????A??????????????
(?^???I?I??..) ??????A?????????p?????
?u?????v????l??v?Z
?v???O??????l????(??v?A?A???S???Y??..)?????A
?u?????l????????????A???????A??????????Â????????v
??????u??@?v???g????
?? : Deep Learning ??w?K???A????A?u??????????????????o?????????????Â???v?A?v???[?`
# ?????I(???w?I)???A??????w?K?f?[?^???????w?K???????????A???????A?u???m?v??w?K???\????...
???l?v?Z (???????????@) :
???????u???????v??????邱?????(?????I??????[?L??]??A????????????????????????????@
<=> ?????鐔?w?I(???I)??@??A?????????????A??肪??????????(???????@??????????????)
n ???????????????A???f???????(?d???????) n ??????????
=> ?K?E?X????
5 ???????????????A?????l????p????p????A???????????u?????v???????
=> ?K???A/?A?[?x??????
=> ???l?I??A?v???[?`????A???m?????]???????A???????u??????v??????????
=> ??@
for ?\??
?\?? for ( ??????; ????; ??????? ) { ?J???????? }
??????; ????; ??????? ??A??????????????A????????????A????????X?V??
?s??????????A?J???????????????????L?q????????????????A
=> ???????
???_?C???N?V????
???s????R?}???h?? "> ?t?@?C????" ??????L?q????????
?????o????A?t?@?C??????????(?u?o???v???_?C???N?V????)????@?\
?v???O??????????o???????e???A?t?@?C????L?^?????鎖?????
???s????R?}???h?? "< ?t?@?C????" ??????L?q????????
?L?[?{?[?h?????????A?t?@?C??????????@?\(???????_?C???N?V????)
?????t?@?C????L?^???f?[?^???A?v???O?????^???鎖???????
!!! ???A?t?@?C????L?^??????????A?u?J???????p?v?????
!!! ?o????t?@?C???????????????A??????????????A?v???O?????????s??????????
!!! ??????t?@?C???????????????A????????????x???A?L?[?{?[?h????????K?v????????
!!! => ?v???O??????e?X?g??????L??
!!! => ????v???O??????o????A????v???O??????????????
[?{??????e]
???l?v?Z?????
??????????A?????A?????????????
???l???????????B
???w??????`????????(?????????)??@??A
?v?Z?@??A??????L???????????A???????`??????A
???I??????????????A????????????
switch ?\?? (2019/09/27)
?v???O??????A???????g?????????
?????g????????i??A?O???\??
?O?? : ????, ????????, ?J????
?O?????A???????? => if ?\??, ?J???? => ??A??яo??
??????A?J???? => while ?\??, for ?\??
[???K]
if ?\??
???@ : if ( <????> ) { <?????????????????????> } else { <???????s???????????> }
??? : <????>???`?F?b?N???A?????????? <?????????????????????> ?????s???A
???????????A<???????s???????????> ?????????s????
!! ????????????A?????????????????s????
if ?\????g?????(?C?f?I???????????..)
if ?\???????q => ??????????I??????\
if (P) {
if (Q) {
C
} else {
D
}
} else {
if(R) {
E
} else {
F
}
}
P ?? Q ??????????? C
P ?????????AQ ????????????? D
P ???????????AR ??????????? E
P ?? R ????????????? F
else if
if ( P ) {
C
} else {
if ( Q ) {
D
} else {
if ( R ) {
E
} else {
Z
}
}
}
=> ????AP,Q,R ???????????????????????`?F?b?N???
if ( P ) {
C
} else if ( Q ) {
D
} else if ( R ) {
E
} else {
Z
}
?? : ??? v ??l???A?????[????A??????????????
if ( v > 0.0 ) {
?????
} else ( v < 0.0 ) {
?????
} else {
??????????????? (0 ???)
}
switch ?\?? : ???????????????A??????l????????????????????A
?????????L?q???@
???@:
switch ( <?]????> ) {
case <??1>:
<?]????>??l?? <??1> ???v?????????
break;
case <??2>:
<?]????>??l?? <??2> ???v?????????
break;
...
case <??k>:
<?]????>??l?? <??k> ???v?????????
break;
default:
<??L?????????????>?????
break;
}
???(????????????????)
if ( <?]????> == <??1> ) {
<?]????>??l?? <??1> ???v?????????
} else ( <?]????> == <??2> ) {
<?]????>??l?? <??2> ???v?????????
} ...
} else {
<??L?????????????>?????
}
if ?\?????Aswitch ?\???????????????
# ???????l???A??????????l???v?????????????f??A?????????????????A
# => ??????
# => ?????????
break -- ??????A?\?????I??????
?????g???????
=> ?\?????????????????
??????w??\????A????? ?v???O?????? 99% ????
# ???????v???O?????????????A?O??????e????\
# => ?????A????l????????????????A???????w?K
# ????A?????
# do while / goto / break/continue ??g????..
# longjump .. ????????????????..
???W???[????A?I????????A?????~?A?f?[?^?\????b??
実数値を一つ入力してください : 8.000000 の立方根は 2.000000 です。
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20191025-01.c
/*
* 課題 20191025-01
*
* 20191025 20191025-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
$ ./20191025-01-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 20191025-02.c
/*
* 課題 CNAME-02
*
* 20191025 20191025-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
$ ./20191025-02-QQQQ.exe 一つ目の整数値を入力してください : 123 二つ目の整数値を入力してください : 987 三つ目の整数値を入力してください : 456 入力された値を小さい順に並べると 123, 456, 987 になります。 $
Download : 20191025-03.c
/*
* 課題 CNAME-03
*
* 20191025 20191025-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;
}
$ ./20191025-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 : 20191025-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;
}
$ ./20191025-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 | +---+---+---------+------------+ $