サイトマップ / C言語講座出入り口総目次目次:流れの制御>gotoとlabel

青い直線

gotoとlabel

青い直線

[マクロ処理]←このソース→[getchar( )とputchar( )]

/* goto と label */

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

青い直線

サイトマップ / C言語講座出入り口総目次目次:流れの制御>gotoとlabel