サイトマップ / C言語講座>出入り口>総目次>目次:流れの制御>gotoとlabel
[マクロ処理]←このソース→[getchar( )とputchar( )]
/* Cには、for、while、do { } while、switch などのプログラムの流れを制御する機能が豊富に揃っています。それらに加えて、goto と label も用意されています。その使い方は、
goto ラベル名;
ラベル名:処理(プログラムのどこに書いても良い)
というものです。gotoを使うとプログラムの可読性が低下します。gotoは特別の場合にのみ使用します。
今回のソースプログラムはその一例です。クイズで虫食い算というものがあります。今回は、英文字版虫食い算とでもいうものです。
banana, apple, orange の各英文字に、それぞれ何かの数字が対応しているとします。banana から apple を引くと orange になるような対応関係を探します。パズルでは、文字が異なれば対応する数字も異なるのが普通ですが、ソースプログラムが複雑になるので、今回は無視します。b と a と o は数字の先頭に来るので、ゼロにはなりません。b は 2 以上で、かつ、o は b より1小さいはずです。これらの条件はたやすく見つけられるでしょう。これらの条件を加味して、8重の for ループを作ります。このような複雑なループから一気に抜け出す時に、gotoを使います。 */
#include <stdio.h>
int Calc(long a, long b, long e, long g, long l, long n, long o, long p, long r);
void main(void);
long banana, apple, orange;
/* banana から apple を引くと orange になるか調べる */
int Calc(long a, long b, long e, long g, long l, long n, long o, long p, long r)
{
banana = b * 100000 + a * 10000 + n * 1000 + a * 100 + n * 10 + a;
apple = a * 10000 + p * 1000 + p * 100 + l * 10 + e;
orange = o * 100000 + r * 10000 + a * 1000 + n * 100 + g * 10 + e;
/* 足し算ではなく引き算でした。micchanさんご指摘ありがとうございました。 */
if (orange == banana - apple) /* 条件を満たせば */
return (1); /* 1 を返す */
else /* 条件を満たさなければ */
return (0); /* 0 を返す */
}
void main(void)
{
long a, b, e, g, l, n, o, p, r;
for (a = 1; a <= 9; a++) /* a は 0にならない */
for (b = 2; b <= 9; b++) /* b は 2 以上 */
for (e = 0; e <= 9; e++)
for (g = 0; g <= 9; g++)
for (l = 0; l <= 9; l++)
for (n = 0; n <= 9; n++) {
o = b - 1; /* o は b より1小さい */
for (p = 0; p <= 9; p++)
for (r = 0; r <= 9; r++)
if (Calc(a, b, e, g, l, n, o, p, r)) /* 条件を満たせば */
goto result; /* ここから飛ぶ */
else
; /* 条件を満たさなければ続行 */
}
/* ここへ飛ぶ */
result: printf("banana:%ld\n", banana);
printf("-apple: %ld\n" , apple);
printf("______ _____\n");
printf("orange:%ld\n", banana - apple);
}
|
/* 今回は一つだけ、解を求めました。もし、全ての解を求めるならば、解を表示する関数を作って、ソースプログラムの中の goto result; の位置に、重ね書きして下さい。 */
[マクロ処理]←このソース→[getchar( )とputchar( )]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−