当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2012/10/26 sample-001.c
* 「/*」から「*/」の間は「コメント」であり「空白一つ」と扱われる
*/
#include <stdio.h>
/*
* printf を利用するために、printf の宣言の入った stdio.h を取り込む
*/
/*
*
*/
int main ( void ) {
/* main 関数の宣言 : 引数はなく(void)、返り値は int 型 */
/*
*
*/
printf ( "Hello, World\n" );
/* 関数呼出
* 関数 printf を一つの引数を渡して呼び出す
* 引数は、文字列を表すポインター値
* 結果として、画面上に、文字列が表示され、改行(\n)される
*/
/*
*
*/
return 0;
/*
* 関数を終了し、値として 0 を返す
*/
/*
*
*/
}
/*
*
*/
C:\usr\c>sample-001 Hello, World C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/*
* 2012/10/26 sample-002.c
*
* Input-Process-Output 型のプログラム
* 一つの数を入力し、その二倍を出力する
*/
#include <stdio.h>
/*
*
*/
int main ( void ) {
/*
* 「int」 は「整数型」を表わす。
*/
int input; /* 入力する(整数)値を保持するための変数 input の宣言 */
int output; /* 計算結果を保持し、出力の時に利用される変数 output の宣言 */
/*
* 変数宣言は、ブロック 「{」〜「}」の先頭で行う必要がある
*/
/*
* [Input]
* キーボードから値を入力する場合は、scanf 関数を使う
*/
printf ( "整数値を入力してください : " );
scanf ( "%d", &input ); /* scanf にはポインタ値を渡す必要がある */
/*
* [Process]
* 代入演算子「=」を利用して、変数の値を変更する(代入する)事ができる
*/
output = input * 2; /* output には input の二倍の値が入る */
/*
* [Output]
* printf を利用すると、書式を指定する事により、
* 文字列の中に、数値を埋め込んで出力する事ができる。
*/
printf ( "%d の二倍は %d です。\n", input, output );
/* 結果を書式付きで出力 */
/*
*
*/
return 0;
}
/*
*
*/
123
C:\usr\c>sample-002< sample-002.in 整数値を入力してください : 123 123 の二倍は 246 です。 C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/*
* 2012/10/26 sample-003.c
*
* Process 部分を関数に任せる
* 結果は関数の値として得られる
*/
#include <stdio.h>
/*
*
*/
int calc_twice ( int number ) {
/*
* 関数 calc_twice の宣言
* 関数の値の型は int 型
* 引数の個数は一個で、その名前は number であり、整数型
*/
return number * 2; /* 計算した値を結果として返す */
}
/*
*
*/
int main ( void ) {
/*
*
*/
int input;
int output;
/*
* [Input]
*/
printf ( "整数値を入力してください : " );
scanf ( "%d", &input );
/*
* [Process]
* 処理の内容は、関数 calc_twice に委ねられる
*/
output = calc_twice ( input );
/*
* 関数呼び出し
* 関数 calc_twice に引数として input の値を渡す
* 関数の値を、変数 output に代入する
*/
/*
* [Output]
*/
printf ( "%d の二倍は %d です。\n", input, output );
/*
*
*/
return 0;
}
/*
*
*/
987
C:\usr\c>sample-003< sample-003.in 整数値を入力してください : 987 987 の二倍は 1974 です。 C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/*
* 2012/10/26 sample-004.c
*
* 関数は何度でも呼び出す事ができる
*/
#include <stdio.h>
/*
*
*/
int absolute ( int number ) {
/*
* if 文を利用して、条件判断が可能
*/
if ( number < 0 ) { /* 引数の値が負の値ならば.. */
return - number; /* 符号を変えて、返す */
/* 「- X」は「(-1)*X」と同じ */
} /* そうでなければ.. */
return number; /* そのまま値を返す */
}
/*
*
*/
int main ( void ) {
/*
*
*/
int i1; /* 入力を三つ */
int i2;
int i3;
int o1; /* 出力も三つ */
int o2;
int o3;
/*
* [Input]
*/
printf ( "一つ目の整数値を入力してください : " );
scanf ( "%d", &i1 );
printf ( "二つ目の整数値を入力してください : " );
scanf ( "%d", &i2 );
printf ( "三つ目の整数値を入力してください : " );
scanf ( "%d", &i3 );
/*
* [Process]
*/
o1 = absolute ( i1 );
o2 = absolute ( i2 );
o3 = absolute ( i3 );
/*
* [Output]
*/
printf ( "%d の絶対値は %d です。\n", i1, o1 );
printf ( "%d の絶対値は %d です。\n", i2, o2 );
printf ( "%d の絶対値は %d です。\n", i3, o3 );
/*
*
*/
return 0;
}
/*
*
*/
456 -739 0
C:\usr\c>sample-004< sample-004.in 一つ目の整数値を入力してください : 456 二つ目の整数値を入力してください : -739 三つ目の整数値を入力してください : 0 456 の絶対値は 456 です。 -739 の絶対値は 739 です。 0 の絶対値は 0 です。 C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/*
* 2012/10/26 sample-005.c
*
* 関数は何度でも呼び出す事ができる
*/
#include <stdio.h>
/*
*
*/
int factrial ( int number ) {
/*
* 再帰を利用した関数定義
*/
if ( number < 1 ) { /* 引数の値が 1 より小さい値ならば.. */
return 1; /* 1 を返す */
} /* そうでなければ.. */
return factrial ( number - 1 ) * number; /* 再帰的に計算 */
}
/*
*
*/
int main ( void ) {
int in[5];
int out[5];
int no; /* 何番目の処理か */
/*
* [Input]
*/
no = 0;
while ( no < 5 ) { /* while 文で繰り返す */
/**/
printf ( "%d 番目の整数値を入力してください : ", no + 1 );
scanf ( "%d", &in[no] ); /* 「&in[no]」の替わりに「in + no」も可 */
/**/
no = no + 1; /* no の値を一つふやす */
}
/* n 回繰り返す典型的なイデオム */
/*
* [Process]
*/
no = 0;
while ( no < 5 ) {
out[no] = factrial ( in[no] );
no = no + 1;
}
/*
* [Output]
*/
no = 0;
while ( no < 5 ) {
printf ( "%d の階乗は %d です。\n", in[no], out[no] );
no = no + 1;
}
/*
*
*/
return 0;
}
/*
*
*/
3 7 2 0 4
C:\usr\c>sample-005< sample-005.in 1 番目の整数値を入力してください : 3 2 番目の整数値を入力してください : 7 3 番目の整数値を入力してください : 2 4 番目の整数値を入力してください : 0 5 番目の整数値を入力してください : 4 3 の階乗は 6 です。 7 の階乗は 5040 です。 2 の階乗は 2 です。 0 の階乗は 1 です。 4 の階乗は 24 です。 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/*
* 2012/10/26 sample-006.c
*
* for 文の例 / 蓄積による計算
*/
#include <stdio.h>
/*
*
*/
int factrial ( int number ) {
/*
* 繰返しを利用した階乗計算
*/
int result = 1;
while ( number > 0 ) { /* number が 0 より大きいなら */
result = result * number; /* result に number をかける */
number = number - 1; /* number を 1 減らす */
}
return result; /* 結果を返す */
}
/*
*
*/
#define NUMBER_OF_DATA 5 /* define で「マジックナンバー」を消す */
/*
*
*/
int main ( void ) {
int in[NUMBER_OF_DATA];
int out[NUMBER_OF_DATA];
int no;
/*
* [Input]
*/
/*
* for 文の利用 ( while より簡潔にかける )
*/
for ( no = 0; no < NUMBER_OF_DATA; no = no + 1 ) {
printf ( "%d 番目の整数値を入力してください : ", no + 1 );
scanf ( "%d", &in[no] );
}
/* n 回繰り返す典型的なイデオム */
/*
* [Process]
*/
for ( no = 0; no < NUMBER_OF_DATA; no = no + 1 ) {
out[no] = factrial ( in[no] );
}
/*
* [Output]
*/
for ( no = 0; no < NUMBER_OF_DATA; no = no + 1 ) {
printf ( "%d の階乗は %d です。\n", in[no], out[no] );
}
/*
*
*/
return 0;
}
/*
*
*/
3 7 2 0 4
C:\usr\c>sample-006< sample-006.in 1 番目の整数値を入力してください : 3 2 番目の整数値を入力してください : 7 3 番目の整数値を入力してください : 2 4 番目の整数値を入力してください : 0 5 番目の整数値を入力してください : 4 3 の階乗は 6 です。 7 の階乗は 5040 です。 2 の階乗は 2 です。 0 の階乗は 1 です。 4 の階乗は 24 です。 C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/*
* 2012/10/26 sample-007.c
*
*/
#include <stdio.h>
/*
*
*/
#define YES 1
#define NO 0
/*
*
*/
int is_prime ( int number ) {
/*
* 素数かどうかを判定する関数
* 素数なら YES そうでなければ NO を返す
*/
int i;
if ( number < 2 ) { /* 1 は素数でない ( 自然数以外も.. ) */
return NO;
}
for ( i = 2; i < number; i++ ) { /* 2 からその数より 1 つ小さい数まで.. */
/*
* 「i++」は、ほぼ「i = i + 1」と同じと思ってよい。
*/
if ( number % i == 0 ) { /* number が i で割り切れた */
/* (number を i で割った余りが 0) */
return NO; /* i が number の自明でない約数 */
/* つまり number は素数でない */
}
}
/*
* どれでも割り切れなかったので、素数である
*/
return YES;
}
/*
*
*/
#define NUMBER_OF_DATA 5
/*
*
*/
int main ( void ) {
int in[NUMBER_OF_DATA];
int no;
/*
* [Input]
*/
for ( no = 0; no < NUMBER_OF_DATA; no++ ) {
printf ( "%d 番目の整数値を入力してください : ", no + 1 );
scanf ( "%d", &in[no] );
}
/*
* [Process]/[Output]
*/
for ( no = 0; no < NUMBER_OF_DATA; no++ ) {
if ( is_prime ( in[no] ) == YES ) {
printf ( "%d は素数です。\n", in[no] );
}
}
/*
*
*/
return 0;
}
/*
*
*/
3 7 2 0 4
C:\usr\c>sample-007< sample-007.in 1 番目の整数値を入力してください : 3 2 番目の整数値を入力してください : 7 3 番目の整数値を入力してください : 2 4 番目の整数値を入力してください : 0 5 番目の整数値を入力してください : 4 3 は素数です。 7 は素数です。 2 は素数です。 C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/*
* 2012/10/26 sample-008.c
*
*/
#include <stdio.h>
/*
*
*/
#define YES 1
#define NO 0
/*
*
*/
int min ( int n, int m ) {
/*
* n と m の大きくない方を返す
*/
if ( n > m ) { /* m が n より小さい */
return m; /* m を返す */
}
/*
* ここでは、n > m でない、つまり、 n <= m となる
*/
return n; /* n を返せばよい ( n == m の時も n でよい ) */
}
/*
*
*/
int is_common_divisor ( int n, int m, int x ) {
/*
* x は n と m の公約数か ?
*/
if ( n % x != 0 ) { /* n は x で割り切れない */
return NO; /* n の約数でないから、公約数でない */
}
if ( m % x != 0 ) { /* m は x で割り切れない */
return NO; /* m の約数でないから、公約数でない */
}
/* x は n の約数であり、m の約数であるので、公約数 */
return YES;
}
/*
*
*/
int gcm ( int n, int m ) {
/*
* n と m の最大公約数は、n, m の双方より大きくなく、かつ公約数で最大の物
*/
int g;
for ( g = min(n,m); g > 1; g-- ) { /* min(m,n) から 2 まで.. */
if ( is_common_divisor ( n, m, g ) == YES ) { /* 公約数 */
return g; /* 最初に見付かったものが最大 */
}
}
return 1; /* 1 より大きい公約数がない場合は m,n は素 */
}
/*
*
*/
int main ( void ) {
int n;
int m;
int g;
/*
* [Input]
*/
printf ( " n の値を入力してください : " );
scanf ( "%d", &n );
printf ( " m の値を入力してください : " );
scanf ( "%d", &m );
/*
* [Process]
*/
g = gcm ( n, m );
/*
* [Output]
*/
printf ( " %d と %d の最大公約数は %d です。\n", n, m, g );
/*
*
*/
return 0;
}
/*
*
*/
12 18
C:\usr\c>sample-008< sample-008.in n の値を入力してください : 12 m の値を入力してください : 18 12 と 18 の最大公約数は 6 です。 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/*
* 2012/10/26 sample-009.c
*
* 一次方程式 ( a x + b = c ) の解を、虱潰し法で解く
* ただし、解は、一桁の自然数
*
* a x + b = c -> a x = c - b -> x = ( c - b ) / x
*
*/
#include <stdio.h>
/*
*
*/
#define YES 1
#define NO 0
/*
* a x + b = c ?
*/
int check_formula ( int a, int b, int c, int x ) {
if ( a * x + b == c ) { /* 方程式を満すか ? */
return YES;
}
return NO;
}
#define NOT_FOUND 0 /* みつからなかった */
/*
* 方程式 a x + b = c の解を、一桁の自然数の中から探す
* 見付かったら、その値を返す
* もし見付からなかったら NOT_FOUND(0) を返す
*/
int solve_formal ( int a, int b, int c ) {
int x;
for ( x = 1; x < 10; x++ ) { /* x = 0 〜 9 */
if ( check_formula ( a, b, c, x ) == YES ) { /* 見付かった */
return x; /* その値を返す */
}
}
/*
* 見付からなかったので..
*/
return 0; /* 見付からなかったので 1 〜 9 以外の数値 (今回は 0)を返す */
}
/*
*
*/
int main ( void ) {
int a;
int b;
int c;
int x;
/*
* [Input]
*/
printf ( "方程式 a x + b = c の解を 1 〜 9 の中から搜します。\n" );
printf ( " a の値を入力してください : " );
scanf ( "%d", &a );
printf ( " b の値を入力してください : " );
scanf ( "%d", &b );
printf ( " c の値を入力してください : " );
scanf ( "%d", &c );
/*
* [Process]
*/
x = solve_formal ( a, b, c );
/*
* [Output]
*/
if ( x == NOT_FOUND ) { /* NOT_FOUND が帰った */
printf ( "方程式 %d x + %d = %d の解を一桁の自然数からみつけられませんでした\n", a, b, c );
} else { /* 答がみつかった */
printf ( "方程式 %d x + %d = %d の解は %d です。\n", a, b, c, x );
}
/*
*
*/
return 0;
}
/*
*
*/
2 3 9
C:\usr\c>sample-009< sample-009.in 方程式 a x + b = c の解を 1 〜 9 の中から搜します。 a の値を入力してください : 2 b の値を入力してください : 3 c の値を入力してください : 9 方程式 2 x + 3 = 9 の解は 3 です。 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/*
* 2012/10/26 sample-010.c
*
* 不定方程式 ( a x + b y = gcm(a,b) ) の解を、虱潰し法で解く
* ただし、解は、-a <= y <= a, -b <= x <= b の中から探す
*/
#include <stdio.h>
/*
*
*/
#define YES 1
#define NO 0
/*
*
*/
int min ( int n, int m ) {
/*
* n と m の大きくない方を返す
*/
if ( n > m ) { /* m が n より小さい */
return m; /* m を返す */
}
/*
* ここでは、n > m でない、つまり、 n <= m となる
*/
return n; /* n を返せばよい ( n == m の時も n でよい ) */
}
/*
*
*/
int is_common_divisor ( int n, int m, int x ) {
/*
* x は n と m の公約数か ?
*/
if ( n % x != 0 ) { /* n は x で割り切れない */
return NO; /* n の約数でないから、公約数でない */
}
if ( m % x != 0 ) { /* m は x で割り切れない */
return NO; /* m の約数でないから、公約数でない */
}
/* x は n の約数であり、m の約数であるので、公約数 */
return YES;
}
/*
*
*/
int gcm ( int n, int m ) {
/*
* n と m の最大公約数は、n, m の双方より大きくなく、かつ公約数で最大の物
*/
int g;
for ( g = min(n,m); g > 1; g-- ) { /* min(m,n) から 2 まで.. */
if ( is_common_divisor ( n, m, g ) == YES ) { /* 公約数 */
return g; /* 最初に見付かったものが最大 */
}
}
return 1; /* 1 より大きい公約数がない場合は m,n は素 */
}
/*
* a x + b y = gcm( a, b )
*/
int check_formula ( int a, int b, int x, int y ) {
/* 方程式を満すか ? */
if ( a * x + b * y == gcm( a, b ) ) {
/* 満すなら結果を表示し.. */
printf ( "x = %d, y = %d\n", x, y );
printf ( "%d * %d + %d * %d = %d\n",
a, x, b, y, gcm( a, b ) );
return YES; /* YES を返す */
}
return NO; /* そうでなければ NO を返す */
}
/*
* 「y」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の yを探す
* 次がなければ NO を返す
*/
int find_y ( int a, int b, int x, int y ) {
/* 現在の「y」は答か */
if ( check_formula ( a, b, x, y ) == YES ) {
return YES; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
if ( y < a ) { /* 次の候補があれば */
return find_y ( a, b, x, y + 1 );
}
return NO; /* そうでなければ NO */
}
/*
* 「x」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の yを探す
* 次がなければ NO を返す
*/
int find_x ( int a, int b, int x ) {
/* 現在の「x」は答か */
if ( find_y ( a, b, x, -a ) == YES ) {
return YES; /* それなら 1 を返して終了 */
}
/* そうでないなら.. */
if ( x < b ) { /* 次の候補があれば */
return find_x ( a, b, x + 1 );
}
return NO; /* そうでなければ 0 */
}
/*
* 方程式 a x + b y = gcm(a,b) の解を探す
* 見付かったら、YES を、そうでなければ NO を返す
*/
int solve_formal ( int a, int b ) {
return find_x ( a, b, -b );
}
/*
*
*/
int main ( void ) {
int a;
int b;
/*
* [Input]
*/
printf ( "方程式 a x + b y = gcm(a,b) の解を搜します\n" );
printf ( " a の値を入力してください : " );
scanf ( "%d", &a );
printf ( " b の値を入力してください : " );
scanf ( "%d", &b );
/*
* [Process]/[Output]
*/
if ( solve_formal ( a, b ) == YES ) {
printf ( "解がみつかりました\n" );
} else {
printf ( "解がみつかりませんでした\n" );
}
/*
*
*/
return 0;
}
/*
*
*/
15 10
C:\usr\c>sample-010< sample-010.in 方程式 a x + b y = gcm(a,b) の解を搜します a の値を入力してください : 15 b の値を入力してください : 10 x = -9, y = 14 15 * -9 + 10 * 14 = 5 解がみつかりました C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/*
* DATE-DIR-QQQQ.c
* 覆面算の「ぴよ+ぴよ=ひよこ」を解く
*/
#include <stdio.h>
/*
*
*/
#define YES 1
#define NO 0
/*
* 答の候補 pi, yo, hi, ko の値が答になっていれば、
* それを出力し、 YES を返す
* そうでなければ NO を返す
*/
int calc_check ( int pi, int yo, int hi, int ko ) {
int piyo = pi * 10 + yo; /* 「ぴよ」を求める */
int hiyoko = hi * 100 + yo * 10 + ko; /* 「ひよこ」を求める */
/* 「ぴ」は先頭なので 0 だと駄目 */
if ( pi == 0 ) {
return NO;
}
/* 「ひ」は先頭なので 0 だと駄目 */
if ( hi == 0 ) {
return NO;
}
/* 「ぴ」と「ひ」は別 */
if ( pi == hi ) {
return NO;
}
/* 「ぴ」と「よ」は別 */
if ( pi == yo ) {
return NO;
}
/* 「ぴ」と「こ」は別 */
if ( pi == ko ) {
return NO;
}
/* 「ひ」と「よ」は別 */
if ( hi == yo ) {
return NO;
}
/* 「ひ」と「こ」は別 */
if ( hi == ko ) {
return NO;
}
/* 「よ」と「こ」は別 */
if ( yo == ko ) {
return NO;
}
if ( piyo + piyo == hiyoko ) { /* 計算があっていれば */
printf ( "ぴ = %d, ひ = %d, よ = %d, こ = %d\n",
pi, hi, yo, ko );
printf ( "%d + %d = %d\n", piyo, piyo, hiyoko );
/* 答を出力して.. */
return YES; /* YES を返す */
}
return NO; /* そうでなければ NO を返す */
}
/*
* 「こ」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「こ」を探す
* 次がなければ NO を返す
*/
int find_ko ( int pi, int hi, int yo, int ko ) {
/* 現在の「こ」は答か */
if ( calc_check ( pi, hi, yo, ko ) == YES ) {
return YES; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
if ( ko < 9 ) { /* 次の候補があれば */
return find_ko ( pi, hi, yo, ko + 1 ); /* 次を try */
}
return NO; /* そうでなければ NO */
}
/*
* 「よ」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「よ」を探す
* 次がなければ NO を返す
*/
int find_yo ( int pi, int hi, int yo ) {
/* 現在の「よ」は答か */
if ( find_ko ( pi, hi, yo, 0 ) == YES ) {
return YES; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
if ( yo < 9 ) { /* 次の候補があれば */
return find_yo ( pi, hi, yo + 1 ); /* 次を try */
}
return NO; /* そうでなければ NO */
}
/*
* 「ひ」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「ひ」を探す
* 次がなければ NO を返す
*/
int find_hi ( int pi, int hi ) {
/* 現在の「ひ」は答か */
if ( find_yo ( pi, hi, 0 ) == YES ) {
return YES; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
if ( hi < 9 ) { /* 次の候補があれば */
return find_hi ( pi, hi + 1 ); /* 次を try */
}
return NO; /* そうでなければ NO */
}
/*
* 「ぴ」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「ぴ」を探す
* 次がなければ NO を返す
*/
int find_pi ( int pi ) {
/* 現在の「ぴ」は答か */
if ( find_hi ( pi, 0 ) == YES ) {
return YES; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
if ( pi < 9 ) { /* 次の候補があれば */
return find_pi ( pi + 1 ); /* 次を try */
}
return NO; /* そうでなければ NO */
}
/*
*
*/
int main ( void ) {
/*
*
*/
printf ( "問 : ぴよ + ぴよ = ひよこ\n" ); /* 問題の出力 */
/*
*
*/
/* 「こ」の最初の候補として「0」を指定して答を検索 */
if ( find_pi ( 0 ) == YES ) { /* 答がみつかったら */
printf ( "解けた\n" ); /* 「解けた」と出力 */
} else {
printf ( "解けない\n" ); /* 「解けない」と出力 */
}
/*
* 結果の出力
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-011 問 : ぴよ + ぴよ = ひよこ ぴ = 6, ひ = 1, よ = 2, こ = 4 62 + 62 = 124 解けた C:\usr\c>
Download : 20121109-01.c ( SJIS 版 )
/*
* DATE-DIR-QQQQ.c
* printf と scanf の利用し、二つの整数を入力し、和を出力する
*/
#include <stdio.h>
/*
*
*/
int main ( void ) {
int a; /* 一つ目の整数値 */
int b; /* 二つ目の整数値 */
int wa; /* 和の計算結果 */
printf ( "一つ目の数値 = " );
scanf ( "%d", &a );
printf ( "二つ目の数値 = " );
/*
** この部分を完成させなさい
*/
/*
* 和の計算
*/
wa = a + b;
/*
* 結果の出力
*/
/*
** この部分を完成させなさい
*/
return 0;
}
/*
*
*/
12 34
C:\usr\c\> 20121109-01 一つ目の数値 = 12 二つ目の数値 = 34 12 + 34 = 46 C:\usr\c\>
Download : 20121109-02.c ( SJIS 版 )
/*
* DATE-DIR-QQQQ.c
*
* 覆面算の「こな+ここ=きなこ」を解く
*/
#include <stdio.h>
/*
*
*/
#define YES 1
#define NO 0
/*
* 答の候補 ko, na, ki の値が答になっていれば、
* それを出力し、 YES を返す
* そうでなければ NO を返す
*/
int calc_check ( int ko, int na, int ki ) {
int kona = ko * 10 + na; /* 「こな」を求める */
int koko = ko * 10 + ko; /* 「ここ」を求める */
int kinako = ki * 100 + na * 10 + ko; /* 「きなこ」を求める */
/* 「こ」は先頭なので 0 だと駄目 */
if ( ko == 0 ) {
return NO;
}
/* 「き」は先頭なので 0 だと駄目 */
/*
** この部分を完成させなさい
*/
/* 「こ」と「な」は別 */
if ( ko == na ) {
return NO;
}
/* 「こ」と「き」は別 */
/*
** この部分を完成させなさい
*/
if ( na == ki ) { /* 「な」と「き」は別 */
return NO;
}
if ( kona + koko == kinako ) { /* 計算があっていれば */
/*
** この部分を完成させなさい
*/
/* 答を出力して.. */
return YES; /* 1 を返す */
}
return NO; /* そうでなければ 0 を返す */
}
/*
* 「き」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「き」を探す
* 次がなければ NO を返す
*/
int find_ki ( int ko, int na, int ki ) {
/* 現在の「き」は答か */
if ( calc_check ( ko, na, ki ) == YES ) {
return YES; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
if ( ki < 9 ) { /* 次の候補があれば */
return find_ki ( ko, na, ki + 1 ); /* 次を try */
}
return NO; /* そうでなければ 0 */
}
/*
* 「な」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「な」を探す
* 次がなければ NO を返す
*/
int find_na ( int ko, int na ) {
/* 現在の「な」は答か */
/*
** この部分を完成させなさい
*/
/* そうでないなら.. */
if ( na < 9 ) { /* 次の候補があれば */
return find_na ( ko, na + 1 ); /* 次を try */
}
return NO; /* そうでなければ 0 */
}
/*
* 「こ」の候補を作り、答になっているかどうかを調べる
* 答がみつかったら、YES を返す
* そうでなければ、次の「こ」を探す
* 次がなければ NO を返す
*/
int find_ko ( int ko ) {
/* 現在の「こ」は答か */
if ( find_na ( ko, 0 ) == YES ) {
return 1; /* それなら YES を返して終了 */
}
/* そうでないなら.. */
/*
** この部分を完成させなさい
*/
return NO; /* そうでなければ 0 */
}
/*
*
*/
int main ( void ) {
/*
*
*/
printf ( "問 : こな + ここ = きなこ\n" ); /* 問題の出力 */
/*
*
*/
/* 「こ」の最初の候補として「0」を指定して答を検索 */
if ( find_ko ( 0 ) == YES ) { /* 答がみつかったら */
printf ( "解けた\n" ); /* 「解けた」と出力 */
} else {
printf ( "解けない\n" ); /* 「解けない」と出力 */
}
/*
* 結果の出力
*/
return 0;
}
/*
*
*/
12 34
C:\usr\c\> 20121109-02 問 : こな + ここ = きなこ こ = 5, な = 0, き = 1 50 + 55 = 105 解けた C:\usr\c\>