サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−