Download : sample-001.c ( SJIS 版 )
/*
* 2014/11/21 sample-001.c
*/
/*
* 条件式
* (C 言語での)「条件」は、「(整数の)値」を持つ
* 1 : 真(条件が成り立つ場合)の時
* 0 : 偽(条件が成り立たない場合)の時
* 逆に、整数値は、常に「条件(値)」と見做す事ができる
* 「条件」が要求された場合に、「(条件の)値」は、次のように「解釈」される
* 「偽」: 0 の時
* 「真」: それ (0) 以外の時 ( 1 でなくても良い )
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-001.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-001 1 < 2 は成立するので 1 になる。 3 < 2 は成立しないので 0 になる。 1 < 2 は成立しました。 3 < 2 は成立しませんでした。 1 は「真」と見做されました。 0 は「偽」と見做されました。 3 は「真」と見做されました。 -10 は「真」と見做されました。 C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/*
* 2014/11/21 sample-002.c
*/
/*
* 条件式
* (C 言語での)「条件」は、「(整数の)値」を持つ
* 「条件」を「引数」に渡す事ができる。
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-002.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-002 整数値 1 は「真」と見做されました。 0 は「偽」と見做されました。 3 は「真」と見做されました。 -10 は「真」と見做されました。 --- 不等号 条件式「 1 < 2 」を引数に指定 1 は「真」と見做されました。 条件式「 3 < 2 」を引数に指定 0 は「偽」と見做されました。 --- 等号 条件式「 1 == 1 」を引数に指定 1 は「真」と見做されました。 条件式「 1 != 1 」を引数に指定 0 は「偽」と見做されました。 条件式「 1 == 0 」を引数に指定 0 は「偽」と見做されました。 条件式「 1 != 0 」を引数に指定 1 は「真」と見做されました。 C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/*
* 2014/11/21 sample-003.c
*/
/*
* 「条件値」の計算
* 「条件値」は、「整数値」なので計算できる
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-003.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-003 条件値の計算 (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 C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/*
* 2014/11/21 sample-004.c
*/
/*
* 「条件値」の計算
* 「条件値」は、「整数値」なので計算できる
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-004.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-004 (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)」になります。 C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/*
* 2014/11/21 sample-005.c
*/
/*
* 「論理値」の計算
* 演算子 「&&」 : 論理積を計算する
* a && b : a と b のどちらか一方でも 0(偽) なら 0(偽)、それ以外は 1(真)
* 演算子 「||」 : 論理和を計算する
* a || b : a と b の両方が 0(偽) なら 0(偽)、それ以外は 1(真)
* 演算子 「!」 : 否定を計算する
* !a : a が 0(偽) なら 1(偽)、それ以外は 0(偽)
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-005.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-005 (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)」になります。 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/*
* 2014/11/21 sample-006.c
*/
/*
* 「論理計算」と if 文
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-006.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-006 (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)」になります。 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/*
* 2014/11/21 sample-010.c
*/
/*
* 複数条件の分岐
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-010.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-010 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/*
* 2014/11/21 sample-011.c
*/
/*
* 複数条件の分岐(論理演算子を利用した場合)
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-011.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-011 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 C:\usr\c>
Download : sample-012.c ( SJIS 版 )
/*
* 2014/11/21 sample-012.c
*/
/*
* 複数条件の分岐(case 文を利用した場合)
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-012.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-012 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 C:\usr\c>
Download : sample-013.c ( SJIS 版 )
/*
* 2014/11/21 sample-013.c
*/
/*
* 複数条件の分岐(case 文と if 文の混合)
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-013.c
* 実行
* BASENAME
*/
#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;
}
C:\usr\c>sample-013 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 C:\usr\c>
#include <stdio.h>
void print_double ( double v ) {
printf ( "value = %f\n", v );
}
int main(int ac, char *av[] ) {
print_double ( 1.2 );
return 0;
}
#include <stdio.h>
void print_double ( double v ) { /* 引数は double 型(浮動小数点数) を期待 */
printf ( "value = %f\n", v );
}
int main(int ac, char *av[] ) {
print_double ( "1.2" ); /* 望みと違う、文字列(浮動小数点型でない)を渡す */
/* エラーになる */
return 0;
}
/*
* 2014/11/21 sample-001.c
*/
/*
* 条件式
* (C 言語での)「条件」は、「(整数の)値」を持つ
* 1 : 真(条件が成り立つ場合)の時
* 0 : 偽(条件が成り立たない場合)の時
* 逆に、整数値は、常に「条件(値)」と見做す事ができる
* 「条件」が要求された場合に、「(条件の)値」は、次のように「解釈」される
* 「偽」: 0 の時
* 「真」: それ (0) 以外の時 ( 1 でなくても良い )
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-001.c
* 実行
* BASENAME
*/
#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;
}
/*
* 2014/11/21 sample-002.c
*/
/*
* 条件式
* (C 言語での)「条件」は、「(整数の)値」を持つ
* 「条件」を「引数」に渡す事ができる。
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-002.c
* 実行
* BASENAME
*/
#include <stdio.h>
/*
* void condition_check ( int condition )
* int condition 条件(値)
* 条件が真なら「真と見做される」、偽なら「偽と見做される」と表示
*/
void condition_check ( int condition ) {
if ( condition ) {
/* C 言語では、「条件」が要求される所に整数値を取る式をかいてよい */
/* その整数値が 0 ときは「偽」、それいがいは「真」として扱われる */
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 になってから渡される */
/*
まず、「1<2」 が計算されて 「1」という値になり、その「1」が
関数野引数として渡される
[ポイント] 関数側では、「1」が来るだけなので、元が「1<2」という
条件式であったかどうかは知る事ができない
*/
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;
}
/*
* 2014/11/21 sample-003.c
*/
/*
* 「条件値」の計算
* 「条件値」は、「整数値」なので計算できる
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-003.c
* 実行
* BASENAME
*/
#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;
}
/*
* 2014/11/21 sample-004.c
*/
/*
* 「条件値」の計算
* 「条件値」は、「整数値」なので計算できる
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-004.c
* 実行
* BASENAME
*/
#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;
}
/*
* 2014/11/21 sample-005.c
*/
/*
* 「論理値」の計算
* 演算子 「&&」 : 論理積(かつ) を計算する
* a && b : a と b のどちらか一方でも 0(偽) なら 0(偽)、それ以外は 1(真)
* 演算子 「||」 : 論理和 (または) を計算する
* a || b : a と b の両方が 0(偽) なら 0(偽)、それ以外は 1(真)
* 演算子 「!」 : 否定を計算する
* !a : a が 0(偽) なら 1(偽)、それ以外は 0(偽)
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe sample-005.c
* 実行
* BASENAME
*/
#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;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int x; /* 条件をチェックする値を入れる変数 */
printf ( "整数を一つ入力してください : " );
scanf ( "%d", &x );
/* 二つの条件が共に成立している場合を考える */
/* [例]
変数 x の値が、10 と 20 の間(境界も含む)にある場合
-> 次の二つ条件が成立
10 <= x
x <= 20
*/
/* これまでの記述方法 */
/* 条件分岐なので、if 文を利用するが、
if 文は、一つの条件しかチェックできない
二つの条件をチェックする場合は、if 文が二つ必要
*/
if ( 10 <= x ) { /* とりあえず、一方の条件をチェック */
/* こでは、一方の条件が成立しているので、他方もチェック */
if ( x <= 20 ) { /* ここでもう一方も成立している.. */
printf ( "%d は 10 以上、20 以下の数です。\n", x );
} else {
printf ( "不成立\n" );
}
} else {
printf ( "不成立\n" );
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int x; /* 条件をチェックする値を入れる変数 */
printf ( "整数を一つ入力してください : " );
scanf ( "%d", &x );
/* 二つの条件が共に成立している場合を考える */
/* [例]
変数 x の値が、10 と 20 の間(境界も含む)にある場合
-> 次の二つ条件が成立
10 <= x
x <= 20
*/
/* 論理演算子を利用した形 (new) */
/* 二つの条件 P, Q が共に成立しているのは 「P かつ Q」の時 */
/* この 「 P かつ Q 」を C 言語では、「 P && Q 」で表現する */
if ( 10 <= x && x <= 20 ) { /* 二つの条件を一度にチェック */
printf ( "%d は 10 以上、20 以下の数です。\n", x );
/*
if ( 10 <= x <= 20 ) { .. } は駄目
*/
} else { /* 残りの場合は、いずれにせよ、不成立でよい */
printf ( "不成立\n" );
}
/*
「二つの条件が必要」という事が一目で解る
その他の記述(不成立の場合)が一つにまとまって簡潔になった
*/
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int x; /* 条件をチェックする値を入れる変数 */
printf ( "整数を一つ入力してください : " );
scanf ( "%d", &x );
/* 二つの条件の何れかが成立している場合を考える */
/* [例]
変数 x の値が、10 より小さいかと 20 より大きい
-> 次の二つ条件のいずれかが成立
x < 10
20 < x
*/
/* これまでの記述方法 */
/* 条件分岐なので、if 文を利用するが、
if 文は、一つの条件しかチェックできない
二つの条件をチェックする場合は、if 文が二つ必要
*/
if ( x < 10 ) { /* とりあえず、一方の条件をチェック */
/* 一方が成立すればよいので、ここでは、取り敢えず OK */
printf ( "%d は 10 より小さいか、あるいは 20 より大きい\n", x );
} else {
/* どちらか一方という条件なので、
一方が不成立でも、まだ決断はできない
もう一つの条件をチェックする必要がある。
*/
if ( 20 < x ) { /* ここではもう一方が成立している.. */
printf ( "%d は 10 より小さいか、あるいは 20 より大きい\n", x );
} else {
printf ( "不成立\n" );
}
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int x; /* 条件をチェックする値を入れる変数 */
printf ( "整数を一つ入力してください : " );
scanf ( "%d", &x );
/* 二つの条件の何れかが成立している場合を考える */
/* [例]
変数 x の値が、10 より小さいかと 20 より大きい
-> 次の二つ条件のいずれかが成立
x < 10
20 < x
*/
/* 論理演算子を使う */
/* 二つの条件 P , Q に対して、どちらか一方という場合は
「P また Q」が成立するので、これは C 言語では 「P || Q」と表現
*/
if ( x < 10 || 20 < x ) { /* ここではもう一方が成立している.. */
printf ( "%d は 10 より小さいか、あるいは 20 より大きい\n", x );
} else {
printf ( "不成立\n" );
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int x; /* 条件をチェックする値を入れる変数 */
printf ( "整数を一つ入力してください : " );
scanf ( "%d", &x );
/* 条件が不成立の場合 */
/* [例]
x が 0 より大きくない時
-> 次の条件が不成立の場合
0 < x ( x が 0 より大きい )
*/
/* これまでの記述方法 */
/* 条件分岐なので、if 文を利用するが、
条件が成立している事をチェックする
*/
if ( 0 < x ) { /* 条件が成立してしまうので、まずい.. */
printf ( "不成立\n" );
} else { /* そうでない場合が目的 */
printf ( "%d は 0 より大きくない\n", x );
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int x; /* 条件をチェックする値を入れる変数 */
printf ( "整数を一つ入力してください : " );
scanf ( "%d", &x );
/* 条件が不成立の場合 */
/* [例]
x が 0 より大きくない時
-> 次の条件が不成立の場合
0 < x ( x が 0 より大きい )
*/
/* 論理演算子を利用した場合 */
/* 否定を表すには ! を使う */
if ( !(0 < x) ) { /* 条件の否定が成立 */
printf ( "%d は 0 より大きくない\n", x );
} else { /* そうでない場合が目的 */
printf ( "不成立\n" );
}
return 0;
}
/*
* 2014/11/14 sample-006.c
*/
/*
* オセロ盤プログラム (version 9 : 2014/11/14)
*
* 機能
* 初期化の部分
* 表示の部分 : 位置を表す記号 1 〜 8, A 〜 F
* 入力の部分(コマを置いてみたい..)
* 入力の指示はキーボード
* ゲームをしてみたい
* 繰返し入力をする
* 繰返しは while で実現できるが
* いつまで繰り返すか ?
* -> ルールでは、両方パスするまで
* とりあえず、サボって
* 無限に繰り返す事にする
* ( 終了は 'Z' を入れる )
* v8 に向けて
* 着手禁止の所にはうてないようにしたい
* 「着手禁止の所」
* 既にコマがある
* 相手のコマをひっくりかえせない
* 挟んだコマを自動的にコマをひっくりかえして欲い
* ->
* コマを引っくり返す
* 自分のコマで、相手のコマを挟む
* イメージ : 黒で白を挟む
* *oooo* -> ******
* ^ ^
* 元々 打つ手
* 上記の例は打つ手の左の状況
* この他に全部で 8 方向あるので、
* 他の 7 方向も考える
* 取り敢えず、右横方向だけを考える
*
* 右方向の着手チェック
*
*/
#include <stdio.h>
/* 表示の部分 */
/*
print_board : 与えらたボードデータを表示する
<<ポイント>>
配列の引数には特殊事情がある : 後回し
*/
void print_board ( char board[8][8] ) {
int tate; /* 縦の添字 */ /* 追加(Copy) */
int yoko; /* 横の添字 */
/* 表示機能 (移動) */
/* ボードの内容を出力する */
/* 8x8 の内容を全て出力(標準出力)すればよい */
/* 配列の出力 -> for 文でやればよい */
/* 二次元配列なので、二重ループになる */
/*
A B C D E F G H
\yoko 0 1 2 3 4 5 6 7
tate 1 0 +---->
2 1 |
3 2 v
4 3
5 4
6 5
7 6
8 7
*/
printf ( " A B C D E F G H\n" );
printf ( " ┏━┳━┳━┳━┳━┳━┳━┳━┓\n" );
for ( tate = 0; tate < 8; tate++ ) {
printf ( "%d ┃", tate + 1 ); /* 左の、この行の枠 */
for ( yoko = 0; yoko < 8; yoko++ ) {
if ( board[tate][yoko] == ' ') { /* 空き */
printf ( " " );
} else if ( board[tate][yoko] == 'o') { /* 白 */
printf ( "◯" );
} else /* if board[tate][yoko] == 'x') */ { /* 黒 */
printf ( "●" );
}
printf ( "┃" ); /* コマとコマの間の枠 */
}
printf ( "\n" ); /* 改行 */
if ( tate < 8 - 1 ) { /* 最後は、これを使わない */
printf ( " ┣━╋━╋━╋━╋━╋━╋━╋━┫\n" );
} else { /* 最後の行に使うのはこれ */
printf ( " ┗━┻━┻━┻━┻━┻━┻━┻━┛\n" );
}
}
}
/*
* 初期化
*/
void init_board( char board[8][8] ) {
int tate; /* 縦の添字 */
int yoko; /* 横の添字 */
/* ゲーム盤の初期化 */
/* とりあえず、全部 ' ' にして、後から真ん中の4つを置く */
/* とりあえず、全部空白 */
for ( tate = 0; tate < 8; tate++ ) {
for ( yoko = 0; yoko < 8; yoko++ ) {
board[tate][yoko] = ' '; /* 全ての場所を空白に */
}
}
/* 真ん中の 4 つだけ特別処理 */
board[3][3] = 'o'; /* D4 なので白 */
board[4][4] = 'o'; /* E5 なので白 */
board[3][4] = '*'; /* D5 なので黒 */
board[4][3] = '*'; /* E4 なので黒 */
}
/* ボードを作る */
/* ボードは、8x8 の要素からなる */
/* ボードの一つの要素には 空、黒、白のいずかが入る */
/* 空 ' ' , 白 'o', 黒 '*' -> 一文字 */
/*
'A2' に黒 -> put_board_black ( 'A', '2' )
-> board[1][0] = '*';
*/
char get_board ( char board[8][8], char yoko, char tate ) {
return board[tate-'1'][yoko-'A'];
}
void put_board ( char board[8][8], char yoko, char tate, char color ) {
board[tate-'1'][yoko-'A'] = color;
/* 本当は、ここで tate, yoko, color が正しい値かを
チェックする必要がある (後回し)
*/
}
void put_board_black ( char board[8][8], char yoko, char tate ) {
put_board ( board, yoko, tate, '*' );
/*
put_board_black ( 'A', '2' )
->
board['2'-'1']['A'-'A'] = '*';
->
board[1][0] = '*';
*/
}
void put_board_white ( char board[8][8], char yoko, char tate ) {
put_board ( board, yoko, tate, 'o' );
}
/*
* oposit ( char color )
* 自分の色を指定して、相手の色を返す
* '*' -> 'o'
* 'o' -> '*'
*/
char oposit ( char color ) {
/*
if ( color == '*' ) {
return 'o';
} else if ( color == 'o' ) {
return '*';
}
*/
return 'o' + '*' - color;
}
/*
横方向のチェックを行う
*/
int check_yoko ( char yoko ) {
if ( yoko <= 'F' ) {
if ( 'A' <= yoko ) {
return 1; /* 'A' <= yoko <= 'F' なので OK */
}
}
return 0; /* その他の場合は、駄目 */
}
/*
横方向のチェックを行う
*/
int check_tate ( char tate ) {
if ( tate <= '8' ) {
if ( '1' <= tate ) {
return 1; /* '1' <= tate <= '8' なので OK */
}
}
return 0; /* その他の場合は、駄目 */
}
int check_play ( char yoko, char tate ) {
if ( check_yoko ( yoko ) ) {
if ( check_tate ( tate ) ) {
return 1;
}
}
return 0;
}
int check_sandwich_play_direct_sub ( char board[8][8], char yoko, char \
tate, char color, char ocolor, int ydir, int tdir ) {
yoko = yoko + ydir;
tate = tate + tdir;
if ( check_play ( yoko, tate ) ) { /*右も左両方*/
if ( get_board ( board, yoko, tate ) == color ) {
return 1;
} else if ( get_board ( board, yoko, tate ) == ocolor ) {
return check_sandwich_play_direct_sub ( board, yoko, tate, color, \
ocolor, ydir, tdir );
}
}
return 0;
}
/*
* check_sandwich_play_direct ( char board[8][8], char yoko, char tate, char \
color )
*
* P : 現在のゲーム盤 (board) の状態で、(yoko,tate) に color のコマが置けるかどうか ?
* 置けたら 1 (0 以外 : C 言語の「真」) / 置けない場合は 0 (C 言語の「偽」)
*/
int check_sandwich_play_direct ( char board[8][8], char yoko, char tate, \
char color, int ydir, int tdir ) {
/* 「置ける」条件 */
if ( get_board ( board, yoko, tate ) == ' ' ) {
/* まず、そこに他のコマがない事を確認 */
yoko = yoko + ydir; /* 一つ横にずらす */
tate = tate + tdir; /* 一つ横にずらす */
if ( check_play ( yoko, tate ) ) { /* 盤外でない事を確認 */
char ocolor = oposit ( color ); /* 相手の色を入手 */
/* color == 'o' -> '*', color == '*' -> 'o' */
if ( get_board ( board, yoko, tate ) == ocolor ) {
/* 一つ右が相手の色である事を確認 */
return check_sandwich_play_direct_sub ( board, yoko, tate, color, \
ocolor, ydir, tdir );
/* 後は Q に任せる */
}
}
}
return 0; /* どれかの条件が不成立なら、全体として不成立 (偽:0) を返す */
}
int check_sandwich_all_direct ( char board[8][8], char yoko, char tate, \
char color ) {
int ydir;
int tdir;
for ( ydir = -1; ydir <= 1; ydir++ ) {
for ( tdir = -1; tdir <= 1; tdir++ ) {
if ( tate * tate + yoko * yoko != 0 ) {
/* tate = yoko = 0 の時だけ不成立 */
if ( check_sandwich_play_direct ( board, yoko, tate, color, ydir, tdir ) \
) {
return 1;
}
}
}
}
return 0;
}
int main(int argc, char *argv[]) {
char board[8][8]; /* ゲームボード */
char yoko; /* 横の記号 'A' 〜 'F' */
char tate; /* 縦の記号 '1' 〜 '8' */
char color; /* 色の記号 '*' : 黒 / 'o' : 白 */
init_board ( board ); /* 引数に配列名しか指定しない */
print_board ( board ); /* 引数に配列名しか指定しない */
while ( 0 < 1 ) {
printf ( "次の一手> " );
/* ここで入力をする */
/* キーボードから 「A2*<改行>」とされた事を想定 */
yoko = getchar(); /* 横の指定の一文字 'A' を入力 */
if ( yoko == 'Z' ) { /* 'Z' が入ったら.. */
printf ( "プログラムを終了します...\n" );
return 0; /* プログラムを終了 */
}
tate = getchar(); /* 縦の指定の一文字 '2' を入力 */
color = getchar(); /* 色の記号 '*' を入力 */
getchar(); /* 改行を読み飛ばす */
printf ( "着手 (%c,%c) %c ", yoko, tate, color );
if ( check_sandwich_all_direct ( board, yoko, tate, color ) ) {
printf ( "置く事ができます。\n" );
} else {
printf ( "置く事ができません。\n" );
}
/* その結果が反映されているかどうかを確認する */
print_board ( board );
}
return 0;
}
v11 の作りかた
v10 の中身を全部 copy
othello.c の中の二つの関数
print_board
init_board
を、新に作成した board.c に「移動」する
board.c の頭の方に、#include <stdio.h> を挿入する
===
一つのファイル内
される側
|
(関係)
|
利用する側
-> 問題ない
関係が正しいなら、それまで
関係が誤っていれば、チェックできる
二つのファイルにわかれている
される側
利用する側
-> 関係がこわれてしまう
関係を示す情報を与える
関係が誤っていても、しることができない
二つのファイルにわかれている
利用する側
される側の情報を追加する
される側
-> もし、「追加した情報」が正しいならば、問題ない
でも「追加した情報」は正しいのか ?
「おなじ情報を『共有』しているかどうか?」
# 「正しい」<ー>「同じ物である」
二つのファイルにわかれている
-> 何らかの方法で、同じ情報を共有する事が本質
利用する側
される側
-> ヘーダーファイルを作成し、情報を共有する(解決)
==
if 文と条件式の話
if ( 2 < 3 ) { oo } else { xx }
-> if ( 1 ) { oo } else { xx }
/* 2<3 は成立するので 1 という値になる */
-> oo
/* 1 は「真(0 以外)」なので、条件が成立した場合となる*/
例: オセロのプログラム
while ( 1 ) { /* 1 は、恒真を表す事になる */
... /* この ... の部分は、無限に繰り返される.. */
}
「条件式」が「値」を持つ
-> 「計算」ができたり、関数の引数に渡せる
-> より柔軟(複雑)な、記述が可能になる
「条件」は、実は、評価の結果 0(偽)/1(真)という整数値を求める式
(1<2) + (2<3) = 2 真 + 真 = 真
(1<2) + (3<2) = 1 真 + 偽 = 真
(2<1) + (2<3) = 1 偽 + 真 = 真
(2<1) + (3<2) = 0 偽 + 偽 = 偽
+ | 真 | 偽
---+----+------
真 | 真 | 真
---+----+------
偽 | 真 | 偽
どちらか一方でも真なら、真、それいがいは偽
「または(論理和)」と同じ
(1<2) * (2<3) = 1 真 * 真 = 真
(1<2) * (3<2) = 0 真 * 偽 = 偽
(2<1) * (2<3) = 0 偽 * 真 = 偽
(2<1) * (3<2) = 0 偽 * 偽 = 偽
* | 真 | 偽
---+----+------
真 | 真 | 偽
---+----+------
偽 | 偽 | 偽
両方も真なら、真、それ以外は偽
「かつ(論理積)」と同じ
v10
/*
* othello v10 (2014/11/14) の main.c
*/
#include <stdio.h>
/*
* main
*/
int main(int argc, char *argv[]) {
char board[8][8]; /* ゲームボード */
char yoko; /* 横の記号 'A' 〜 'F' */
char tate; /* 縦の記号 '1' 〜 '8' */
char color; /* 色の記号 '*' : 黒 / 'o' : 白 */
init_board ( board ); /* 引数に配列名しか指定しない */
print_board ( board ); /* 引数に配列名しか指定しない */
while ( 0 < 1 ) {
printf ( "次の一手> " );
/* ここで入力をする */
/* キーボードから 「A2*<改行>」とされた事を想定 */
yoko = getchar(); /* 横の指定の一文字 'A' を入力 */
if ( yoko == 'Z' ) { /* 'Z' が入ったら.. */
printf ( "プログラムを終了します...\n" );
return 0; /* プログラムを終了 */
}
tate = getchar(); /* 縦の指定の一文字 '2' を入力 */
color = getchar(); /* 色の記号 '*' を入力 */
getchar(); /* 改行を読み飛ばす */
printf ( "着手 (%c,%c) %c ", yoko, tate, color );
if ( check_sandwich_all_direct ( board, yoko, tate, color ) ) {
printf ( "置く事ができます。\n" );
} else {
printf ( "置く事ができません。\n" );
}
/* その結果が反映されているかどうかを確認する */
print_board ( board );
}
return 0;
}
/*
* オセロ盤プログラム (version 10 : 2014/11/14)
*
* 機能
* 初期化の部分
* 表示の部分 : 位置を表す記号 1 〜 8, A 〜 F
* 入力の部分(コマを置いてみたい..)
* 入力の指示はキーボード
* ゲームをしてみたい
* 繰返し入力をする
* 繰返しは while で実現できるが
* いつまで繰り返すか ?
* -> ルールでは、両方パスするまで
* とりあえず、サボって
* 無限に繰り返す事にする
* ( 終了は 'Z' を入れる )
* v8 に向けて
* 着手禁止の所にはうてないようにしたい
* 「着手禁止の所」
* 既にコマがある
* 相手のコマをひっくりかえせない
* 挟んだコマを自動的にコマをひっくりかえして欲い
* ->
* コマを引っくり返す
* 自分のコマで、相手のコマを挟む
* イメージ : 黒で白を挟む
* *oooo* -> ******
* ^ ^
* 元々 打つ手
* 上記の例は打つ手の左の状況
* この他に全部で 8 方向あるので、
* 他の 7 方向も考える
* 取り敢えず、右横方向だけを考える
*
* 右方向の着手チェック
*
*/
#include <stdio.h>
/* 表示の部分 */
/*
print_board : 与えらたボードデータを表示する
<<ポイント>>
配列の引数には特殊事情がある : 後回し
*/
void print_board ( char board[8][8] ) {
int tate; /* 縦の添字 */ /* 追加(Copy) */
int yoko; /* 横の添字 */
/* 表示機能 (移動) */
/* ボードの内容を出力する */
/* 8x8 の内容を全て出力(標準出力)すればよい */
/* 配列の出力 -> for 文でやればよい */
/* 二次元配列なので、二重ループになる */
/*
A B C D E F G H
\yoko 0 1 2 3 4 5 6 7
tate 1 0 +---->
2 1 |
3 2 v
4 3
5 4
6 5
7 6
8 7
*/
printf ( " A B C D E F G H\n" );
printf ( " ┏━┳━┳━┳━┳━┳━┳━┳━┓\n" );
for ( tate = 0; tate < 8; tate++ ) {
printf ( "%d ┃", tate + 1 ); /* 左の、この行の枠 */
for ( yoko = 0; yoko < 8; yoko++ ) {
if ( board[tate][yoko] == ' ') { /* 空き */
printf ( " " );
} else if ( board[tate][yoko] == 'o') { /* 白 */
printf ( "◯" );
} else /* if board[tate][yoko] == 'x') */ { /* 黒 */
printf ( "●" );
}
printf ( "┃" ); /* コマとコマの間の枠 */
}
printf ( "\n" ); /* 改行 */
if ( tate < 8 - 1 ) { /* 最後は、これを使わない */
printf ( " ┣━╋━╋━╋━╋━╋━╋━╋━┫\n" );
} else { /* 最後の行に使うのはこれ */
printf ( " ┗━┻━┻━┻━┻━┻━┻━┻━┛\n" );
}
}
}
/*
* 初期化
*/
void init_board( char board[8][8] ) {
int tate; /* 縦の添字 */
int yoko; /* 横の添字 */
/* ゲーム盤の初期化 */
/* とりあえず、全部 ' ' にして、後から真ん中の4つを置く */
/* とりあえず、全部空白 */
for ( tate = 0; tate < 8; tate++ ) {
for ( yoko = 0; yoko < 8; yoko++ ) {
board[tate][yoko] = ' '; /* 全ての場所を空白に */
}
}
/* 真ん中の 4 つだけ特別処理 */
board[3][3] = 'o'; /* D4 なので白 */
board[4][4] = 'o'; /* E5 なので白 */
board[3][4] = '*'; /* D5 なので黒 */
board[4][3] = '*'; /* E4 なので黒 */
}
/* ボードを作る */
/* ボードは、8x8 の要素からなる */
/* ボードの一つの要素には 空、黒、白のいずかが入る */
/* 空 ' ' , 白 'o', 黒 '*' -> 一文字 */
/*
'A2' に黒 -> put_board_black ( 'A', '2' )
-> board[1][0] = '*';
*/
char get_board ( char board[8][8], char yoko, char tate ) {
return board[tate-'1'][yoko-'A'];
}
void put_board ( char board[8][8], char yoko, char tate, char color ) {
board[tate-'1'][yoko-'A'] = color;
/* 本当は、ここで tate, yoko, color が正しい値かを
チェックする必要がある (後回し)
*/
}
void put_board_black ( char board[8][8], char yoko, char tate ) {
put_board ( board, yoko, tate, '*' );
/*
put_board_black ( 'A', '2' )
->
board['2'-'1']['A'-'A'] = '*';
->
board[1][0] = '*';
*/
}
void put_board_white ( char board[8][8], char yoko, char tate ) {
put_board ( board, yoko, tate, 'o' );
}
/*
* oposit ( char color )
* 自分の色を指定して、相手の色を返す
* '*' -> 'o'
* 'o' -> '*'
*/
char oposit ( char color ) {
/*
if ( color == '*' ) {
return 'o';
} else if ( color == 'o' ) {
return '*';
}
*/
return 'o' + '*' - color;
}
/*
横方向のチェックを行う
*/
int check_yoko ( char yoko ) {
if ( yoko <= 'F' ) {
if ( 'A' <= yoko ) {
return 1; /* 'A' <= yoko <= 'F' なので OK */
}
}
return 0; /* その他の場合は、駄目 */
}
/*
横方向のチェックを行う
*/
int check_tate ( char tate ) {
if ( tate <= '8' ) {
if ( '1' <= tate ) {
return 1; /* '1' <= tate <= '8' なので OK */
}
}
return 0; /* その他の場合は、駄目 */
}
int check_play ( char yoko, char tate ) {
if ( check_yoko ( yoko ) ) {
if ( check_tate ( tate ) ) {
return 1;
}
}
return 0;
}
int check_sandwich_play_direct_sub ( char board[8][8], char yoko, char \
tate, char color, char ocolor, int ydir, int tdir ) {
yoko = yoko + ydir;
tate = tate + tdir;
if ( check_play ( yoko, tate ) ) { /*右も左両方*/
if ( get_board ( board, yoko, tate ) == color ) {
return 1;
} else if ( get_board ( board, yoko, tate ) == ocolor ) {
return check_sandwich_play_direct_sub ( board, yoko, tate, color, \
ocolor, ydir, tdir );
}
}
return 0;
}
/*
* check_sandwich_play_direct ( char board[8][8], char yoko, char tate, char \
color )
*
* P : 現在のゲーム盤 (board) の状態で、(yoko,tate) に color のコマが置けるかどうか ?
* 置けたら 1 (0 以外 : C 言語の「真」) / 置けない場合は 0 (C 言語の「偽」)
*/
int check_sandwich_play_direct ( char board[8][8], char yoko, char tate, \
char color, int ydir, int tdir ) {
/* 「置ける」条件 */
if ( get_board ( board, yoko, tate ) == ' ' ) {
/* まず、そこに他のコマがない事を確認 */
yoko = yoko + ydir; /* 一つ横にずらす */
tate = tate + tdir; /* 一つ横にずらす */
if ( check_play ( yoko, tate ) ) { /* 盤外でない事を確認 */
char ocolor = oposit ( color ); /* 相手の色を入手 */
/* color == 'o' -> '*', color == '*' -> 'o' */
if ( get_board ( board, yoko, tate ) == ocolor ) {
/* 一つ右が相手の色である事を確認 */
return check_sandwich_play_direct_sub ( board, yoko, tate, color, \
ocolor, ydir, tdir );
/* 後は Q に任せる */
}
}
}
return 0; /* どれかの条件が不成立なら、全体として不成立 (偽:0) を返す */
}
int check_sandwich_all_direct ( char board[8][8], char yoko, char tate, \
char color ) {
int ydir;
int tdir;
for ( ydir = -1; ydir <= 1; ydir++ ) {
for ( tdir = -1; tdir <= 1; tdir++ ) {
if ( tate * tate + yoko * yoko != 0 ) {
/* tate = yoko = 0 の時だけ不成立 */
if ( check_sandwich_play_direct ( board, yoko, tate, color, ydir, tdir ) \
) {
return 1;
}
}
}
}
return 0;
}
# # v10 の makefile # # - makefile の基本的な構造 # -- rule の集合 # -- rule の書き方 # 作りたい物 : 材料 # <TAB> 作り方 # # rule の意味 # 「作りたい物」が作りたければ「材料」を利用して、「作り方」を実行する # 材料がなければ、材料も作ろうとする !! # # - make コマンドの実行 # make で引数を指定しなければ、最初のルールを実行しようとする # 引数(作りたい物)が指定されると、指定された物を作ろうとする # <ポイント> # 既に、作りたいものが存在して、材料より新しいなら、何もしない # 作りたいものがないか、材料より古いならば、作り直す # 作り方をしらない物が材料に指定されていても、「それがあれば」よい # 材料がなく、作り方もしらないとエラーになる # othello.exe : othello.o main.o cc -o othello.exe othello.o main.o othello.o : othello.c cc -c othello.c main.o : main.c cc -c main.c clean : rm *.o *.exe
v11
/*
* board.c
*/
#include <stdio.h>
/* 表示の部分 */
/*
print_board : 与えらたボードデータを表示する
<<ポイント>>
配列の引数には特殊事情がある : 後回し
*/
void print_board ( char board[8][8] ) {
int tate; /* 縦の添字 */ /* 追加(Copy) */
int yoko; /* 横の添字 */
/* 表示機能 (移動) */
/* ボードの内容を出力する */
/* 8x8 の内容を全て出力(標準出力)すればよい */
/* 配列の出力 -> for 文でやればよい */
/* 二次元配列なので、二重ループになる */
/*
A B C D E F G H
\yoko 0 1 2 3 4 5 6 7
tate 1 0 +---->
2 1 |
3 2 v
4 3
5 4
6 5
7 6
8 7
*/
printf ( " A B C D E F G H\n" );
printf ( " ┏━┳━┳━┳━┳━┳━┳━┳━┓\n" );
for ( tate = 0; tate < 8; tate++ ) {
printf ( "%d ┃", tate + 1 ); /* 左の、この行の枠 */
for ( yoko = 0; yoko < 8; yoko++ ) {
if ( board[tate][yoko] == ' ') { /* 空き */
printf ( " " );
} else if ( board[tate][yoko] == 'o') { /* 白 */
printf ( "◯" );
} else /* if board[tate][yoko] == 'x') */ { /* 黒 */
printf ( "●" );
}
printf ( "┃" ); /* コマとコマの間の枠 */
}
printf ( "\n" ); /* 改行 */
if ( tate < 8 - 1 ) { /* 最後は、これを使わない */
printf ( " ┣━╋━╋━╋━╋━╋━╋━╋━┫\n" );
} else { /* 最後の行に使うのはこれ */
printf ( " ┗━┻━┻━┻━┻━┻━┻━┻━┛\n" );
}
}
}
/*
* 初期化
*/
void init_board( char board[8][8] ) {
int tate; /* 縦の添字 */
int yoko; /* 横の添字 */
/* ゲーム盤の初期化 */
/* とりあえず、全部 ' ' にして、後から真ん中の4つを置く */
/* とりあえず、全部空白 */
for ( tate = 0; tate < 8; tate++ ) {
for ( yoko = 0; yoko < 8; yoko++ ) {
board[tate][yoko] = ' '; /* 全ての場所を空白に */
}
}
/* 真ん中の 4 つだけ特別処理 */
board[3][3] = 'o'; /* D4 なので白 */
board[4][4] = 'o'; /* E5 なので白 */
board[3][4] = '*'; /* D5 なので黒 */
board[4][3] = '*'; /* E4 なので黒 */
}
/*
* othello v10 (2014/11/14) の main.c
*/
#include <stdio.h>
/*
* main
*/
int main(int argc, char *argv[]) {
char board[8][8]; /* ゲームボード */
char yoko; /* 横の記号 'A' 〜 'F' */
char tate; /* 縦の記号 '1' 〜 '8' */
char color; /* 色の記号 '*' : 黒 / 'o' : 白 */
init_board ( board ); /* 引数に配列名しか指定しない */
print_board ( board ); /* 引数に配列名しか指定しない */
while ( 0 < 1 ) {
printf ( "次の一手> " );
/* ここで入力をする */
/* キーボードから 「A2*<改行>」とされた事を想定 */
yoko = getchar(); /* 横の指定の一文字 'A' を入力 */
if ( yoko == 'Z' ) { /* 'Z' が入ったら.. */
printf ( "プログラムを終了します...\n" );
return 0; /* プログラムを終了 */
}
tate = getchar(); /* 縦の指定の一文字 '2' を入力 */
color = getchar(); /* 色の記号 '*' を入力 */
getchar(); /* 改行を読み飛ばす */
printf ( "着手 (%c,%c) %c ", yoko, tate, color );
if ( check_sandwich_all_direct ( board, yoko, tate, color ) ) {
printf ( "置く事ができます。\n" );
} else {
printf ( "置く事ができません。\n" );
}
/* その結果が反映されているかどうかを確認する */
print_board ( board );
}
return 0;
}
/*
* オセロ盤プログラム (version 10 : 2014/11/14)
*
* 機能
* 初期化の部分
* 表示の部分 : 位置を表す記号 1 〜 8, A 〜 F
* 入力の部分(コマを置いてみたい..)
* 入力の指示はキーボード
* ゲームをしてみたい
* 繰返し入力をする
* 繰返しは while で実現できるが
* いつまで繰り返すか ?
* -> ルールでは、両方パスするまで
* とりあえず、サボって
* 無限に繰り返す事にする
* ( 終了は 'Z' を入れる )
* v8 に向けて
* 着手禁止の所にはうてないようにしたい
* 「着手禁止の所」
* 既にコマがある
* 相手のコマをひっくりかえせない
* 挟んだコマを自動的にコマをひっくりかえして欲い
* ->
* コマを引っくり返す
* 自分のコマで、相手のコマを挟む
* イメージ : 黒で白を挟む
* *oooo* -> ******
* ^ ^
* 元々 打つ手
* 上記の例は打つ手の左の状況
* この他に全部で 8 方向あるので、
* 他の 7 方向も考える
* 取り敢えず、右横方向だけを考える
*
* 右方向の着手チェック
*
*/
#include <stdio.h>
/* ボードを作る */
/* ボードは、8x8 の要素からなる */
/* ボードの一つの要素には 空、黒、白のいずかが入る */
/* 空 ' ' , 白 'o', 黒 '*' -> 一文字 */
/*
'A2' に黒 -> put_board_black ( 'A', '2' )
-> board[1][0] = '*';
*/
char get_board ( char board[8][8], char yoko, char tate ) {
return board[tate-'1'][yoko-'A'];
}
void put_board ( char board[8][8], char yoko, char tate, char color ) {
board[tate-'1'][yoko-'A'] = color;
/* 本当は、ここで tate, yoko, color が正しい値かを
チェックする必要がある (後回し)
*/
}
void put_board_black ( char board[8][8], char yoko, char tate ) {
put_board ( board, yoko, tate, '*' );
/*
put_board_black ( 'A', '2' )
->
board['2'-'1']['A'-'A'] = '*';
->
board[1][0] = '*';
*/
}
void put_board_white ( char board[8][8], char yoko, char tate ) {
put_board ( board, yoko, tate, 'o' );
}
/*
* oposit ( char color )
* 自分の色を指定して、相手の色を返す
* '*' -> 'o'
* 'o' -> '*'
*/
char oposit ( char color ) {
/*
if ( color == '*' ) {
return 'o';
} else if ( color == 'o' ) {
return '*';
}
*/
return 'o' + '*' - color;
}
/*
横方向のチェックを行う
*/
int check_yoko ( char yoko ) {
if ( yoko <= 'F' ) {
if ( 'A' <= yoko ) {
return 1; /* 'A' <= yoko <= 'F' なので OK */
}
}
return 0; /* その他の場合は、駄目 */
}
/*
横方向のチェックを行う
*/
int check_tate ( char tate ) {
if ( tate <= '8' ) {
if ( '1' <= tate ) {
return 1; /* '1' <= tate <= '8' なので OK */
}
}
return 0; /* その他の場合は、駄目 */
}
int check_play ( char yoko, char tate ) {
if ( check_yoko ( yoko ) ) {
if ( check_tate ( tate ) ) {
return 1;
}
}
return 0;
}
int check_sandwich_play_direct_sub ( char board[8][8], char yoko, char \
tate, char color, char ocolor, int ydir, int tdir ) {
yoko = yoko + ydir;
tate = tate + tdir;
if ( check_play ( yoko, tate ) ) { /*右も左両方*/
if ( get_board ( board, yoko, tate ) == color ) {
return 1;
} else if ( get_board ( board, yoko, tate ) == ocolor ) {
return check_sandwich_play_direct_sub ( board, yoko, tate, color, \
ocolor, ydir, tdir );
}
}
return 0;
}
/*
* check_sandwich_play_direct ( char board[8][8], char yoko, char tate, char \
color )
*
* P : 現在のゲーム盤 (board) の状態で、(yoko,tate) に color のコマが置けるかどうか ?
* 置けたら 1 (0 以外 : C 言語の「真」) / 置けない場合は 0 (C 言語の「偽」)
*/
int check_sandwich_play_direct ( char board[8][8], char yoko, char tate, \
char color, int ydir, int tdir ) {
/* 「置ける」条件 */
if ( get_board ( board, yoko, tate ) == ' ' ) {
/* まず、そこに他のコマがない事を確認 */
yoko = yoko + ydir; /* 一つ横にずらす */
tate = tate + tdir; /* 一つ横にずらす */
if ( check_play ( yoko, tate ) ) { /* 盤外でない事を確認 */
char ocolor = oposit ( color ); /* 相手の色を入手 */
/* color == 'o' -> '*', color == '*' -> 'o' */
if ( get_board ( board, yoko, tate ) == ocolor ) {
/* 一つ右が相手の色である事を確認 */
return check_sandwich_play_direct_sub ( board, yoko, tate, color, \
ocolor, ydir, tdir );
/* 後は Q に任せる */
}
}
}
return 0; /* どれかの条件が不成立なら、全体として不成立 (偽:0) を返す */
}
int check_sandwich_all_direct ( char board[8][8], char yoko, char tate, \
char color ) {
int ydir;
int tdir;
for ( ydir = -1; ydir <= 1; ydir++ ) {
for ( tdir = -1; tdir <= 1; tdir++ ) {
if ( tate * tate + yoko * yoko != 0 ) {
/* tate = yoko = 0 の時だけ不成立 */
if ( check_sandwich_play_direct ( board, yoko, tate, color, ydir, tdir ) \
) {
return 1;
}
}
}
}
return 0;
}
# # v11 の makefile # # - makefile の基本的な構造 # -- rule の集合 # -- rule の書き方 # 作りたい物 : 材料 # <TAB> 作り方 # # rule の意味 # 「作りたい物」が作りたければ「材料」を利用して、「作り方」を実行する # 材料がなければ、材料も作ろうとする !! # # - make コマンドの実行 # make で引数を指定しなければ、最初のルールを実行しようとする # 引数(作りたい物)が指定されると、指定された物を作ろうとする # <ポイント> # 既に、作りたいものが存在して、材料より新しいなら、何もしない # 作りたいものがないか、材料より古いならば、作り直す # 作り方をしらない物が材料に指定されていても、「それがあれば」よい # 材料がなく、作り方もしらないとエラーになる # # board.c 系列がふえた.. # othello.exe : othello.o main.o board.o cc -o othello.exe othello.o main.o board.o othello.o : othello.c cc -c othello.c main.o : main.c cc -c main.c board.o : board.c cc -c board.c clean : rm *.o *.exe makezip : zip v11.zip makefile main.c othello.c board.c