掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27990

goto文の代替について知恵を貸してください。。
投稿者---Masumi(2006/08/26 18:14:29)


はじめまして。
下記のようにgoto文が使用されたものを、
C言語でgoto文を使用せずに再現しようとしているのですが、
行き詰まっています。
何かアイディアがありましたら知恵を貸してください。

/*** Start ****/
A_1:
  printf("A");
B_1:
  printf("C");
  FLG1 = SyoriA();
  if ( FLG1 != 0) {
    goto A_1;
  }
C_1:
  printf("E");
  FLG2 = SyoriB();
  if (FLG2 != 0){
    goto B_1;
  }
/*** End ***/

goto文の役割をwhile文でカバーをしようと、
下記のようなC言語ソースを書いたのですが、
C_1からB_1に戻すのに、どのようにするか悩んでいます。

/*** Start ****/
while(True){/* 無限ループ*/
  printf("A"); /* A_1 */
  printf("C"); /* B_1 */
  FLG1 = SyoriA();
  if ( FLG1 != 0) {
    continue;
  }
  break;
}
printf("E"); /* C_1 */
FLG2 = SyoriB();
if (FLG2 != 0){
  /* goto文を使用せずにB_1に戻る */
}
/*** End ***/

よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:goto文の代替について知恵を貸してください。。 27991 KING・王 2006/08/26 20:25:27
<子記事> Re:goto文の代替について知恵を貸してください。。 27993 shu 2006/08/26 22:11:54
<子記事> 返信ありがとうございます。 27994 Masumi 2006/08/27 00:24:41
<子記事> Re:goto文の代替について知恵を貸してください。。 27996 円零 2006/08/28 19:01:25


No.27991

Re:goto文の代替について知恵を貸してください。。
投稿者---KING・王(2006/08/26 20:25:27)


とりあえずこんなかんじでどうでしょうか?
#テストしてないのでミスがあるかもしれませんが。。。

bool bFlagDoA = true;
bool bFlagDoB = true;
bool bFlagDoC = true;

while( true ){
    /*A_1*/
    if( bFlagDoA ){
        /*実行要求フラグをOFFにする*/
        bFlagDoA = false;
        /*A_1の処理の実行*/
        printf( "A" );
    }

    /*B_1*/
    if( bFlagDoB ){
        /*実行要求フラグをOFFにする*/
        bFlagDoB = false;
        /*B_1の処理の実行*/
        printf("C");
        FLG1 = SyoriA();
        if( FLG1 != 0 ){
            /*再実行用に実行要求フラグをONにする*/
            bFlagDoB = true;
            continue;
        }
    }

    /*C_1*/
    if( bFlagDoC ){
        /*実行要求フラグをOFFにする*/
        bFlagDoC = false;
        /*C_1の処理の実行*/
        printf( "E" );
        FLG2 = SyoriB();
        if( FLG2 != 0 ){
            /*再実行用に実行要求フラグをONにする*/
            bFlagDoC = true;
            continue;
        }
    }

    /*ループを抜ける*/
    break;
}/*ここまでwhileループ*/






この投稿にコメントする

削除パスワード

No.27992

Re:goto文の代替について知恵を貸してください。。
投稿者---near(2006/08/26 21:45:33)


フラグ三つよりこっちの方が分かりやすくないですか?

int syoriNo = 1;

while(1)
{
    if(syoriNo == 1)
    {
        printf("A");
        syoriNo = 2;
    }
    else if(syoriNo == 2)
    {
        printf("C");
        FLG1 = SyoriA();
        if(FLG1 != 0)
            syoriNo = 1;
        else
            syoriNo = 3;
    }
    else if(syoriNo == 3)
    {
        printf("E");
        FLG2 = SyoriB();
        if(FLG2 != 0)
            syoriNo = 2;
        else
            break;
    }
    else
    {
        printf("error");
    }
}



この投稿にコメントする

削除パスワード

No.27993

Re:goto文の代替について知恵を貸してください。。
投稿者---shu(2006/08/26 22:11:54)


c言語での文法上、Masumiさんのプログラムからは、
gotoとwhileの文法が相反するものになるので、
直接的にwhileループに変換することができません。

プログラムから出力される結果のみを眺めたみると、
ac ac ac ...か
ce ce ce ...の二通りのパターンしかないことがわかった。

それをふまえて、サンプルプログラムを書いておきます。

//
//	サンプルプログラム
//

{
    //	パターン1
    while (条件1) {
        if (条件2) {
            printf("%s", "AC");
        }
        else {
            printf("%s", "CE");
        }
    }
    
    //	パターン2
    while (条件1) {
        printf("%s", (条件2) ? "AC" : "CE");
    }
}



この投稿にコメントする

削除パスワード

No.27995

Re:goto文の代替について知恵を貸してください。。
投稿者---shu(2006/08/28 18:14:56)


>プログラムから出力される結果のみを眺めたみると、
>ac ac ac ...か
>ce ce ce ...の二通りのパターンしかないことがわかった。

↑ec ec ec ...の間違い。

//
//	サンプルプログラム(修正版)
//

int main(void)
{
    int FLG1, FLG2;
    
    FLG1 = FLG2 = 1;	//	初期値の設定
    //
    while (FLG2) {
        //	二者択一
        if (FLG1) {
            putchar('A');
        }
        else {
            putchar('E');
        }
        
        putchar('C');	//	毎回実行
        
        //	条件の変化
        FLG1 = SyoriA();
        FLG2 = SyoriB();
    }
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.27997

Re:goto文の代替について知恵を貸してください。。
投稿者---かずま(2006/08/28 19:48:16)


>> プログラムから出力される結果のみを眺めたみると、
>> ac ac ac ...か
>> ce ce ce ...の二通りのパターンしかないことがわかった。
>
> ↑ec ec ec ...の間違い。

それも間違い。元のプログラムが C で終わることはありません。


>        //    条件の変化
>        FLG1 = SyoriA();
>        FLG2 = SyoriB();
>    }

元のプログラムが、SyoriA() のあとに必ず SyoriB() を実行するとは
限りません。



さて、フラグを用いないプログラムを書いてみましょうか。

int main(void)
{
    printf("A");
    for (;;) {
        printf("C");
        if (SyoriA())
            printf("A");
        else {
            printf("E");
            if (!SyoriB()) break;
        }
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.27998

Re:goto文の代替について知恵を貸してください。。
投稿者---shu(2006/08/28 21:37:49)


goto文を使用せずに再現という主題より、
もっと単純に出来る、もっとこうした方が良い、そういう思い考えが先走り、
元々のプログラムの流れをおろそかにしてしまいました。

かずまさんのプログラムの中で、はじめのprintf("A")をループの前に書くというのは、
凄く単純だけれども、なかなか思いつかないものでした。



この投稿にコメントする

削除パスワード

No.27994

返信ありがとうございます。
投稿者---Masumi(2006/08/27 00:24:41)


皆様、返信ありがとうございました。

なるほど!
ループの中でIF文で区切って、
フラグで制御するなんて思いつきませんでした。
教えていただいたやり方で先に進めそうです。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.27996

Re:goto文の代替について知恵を貸してください。。
投稿者---円零(2006/08/28 19:01:25)


一部別関数に切り出してみる手もありますね。

#include <stdio.h>

/***** テスト用 *****/
int SyoriA(){
    int i;
    printf("\nShoriA:");
    scanf("%d", &i);
    return i;
}

int SyoriB(){
    int i;
    printf("\nShoriB:");
    scanf("%d", &i);
    return i;
}
/***** ここまで *****/

funcA(int *flg1){
    printf("C");
    *flg1 = SyoriA();
    return *flg1;
}

int main(void){
    int FLG1, FLG2;

    do{
        printf("A");
        if( funcA(&FLG1) )continue;
        do{
            printf("E");
        } while( FLG2 = SyoriB() && !funcA(&FLG1) );
    } while(FLG1);
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧