ループ文について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
robinson

ループ文について

#1

投稿記事 by robinson » 4年前

aに正の数を代入してaが奇数の場合3かけて1たしたものを改めてaに代入し、aが偶数なら2でわってaに代入する。これを繰り返し1になったら終了する。

こういうプログラムがあって

コード:

#include<stdio.h>

int main(void){
    int a;

    
    printf("input->");
    scanf("%d",&a);
    
  while(a<=0){
        
      printf("reinput->");
        scanf("%d",&a);
    }
    
     while(a!=1){    
     
        if(a%2==1){
            a=a*3+1;
            printf("%d\n",a);
        }
           if(a%2==0){
            a=a/2;
            printf("%d\n",a);
        }
    
    }

    printf("finish\n");

    return 0;
}
このようなコードを打てばきちんとしたプログラムができるのですが、2つ目のwhile文のif文の位置を変えると無限ループに入りますが、原因がわかりません。どなたか原因のわかる方お願いいたします。

Math

Re: ループ文について

#2

投稿記事 by Math » 4年前

これは 当たり前ですよね。

aに正の数を代入し といいながら 1 は 条件 while(a!=1){ ではじかれる。

したがって 終了条件は ”aが偶数なら2でわってaに代入する” 直前が 2 のときである。

しかし if の順 を逆にすると 折角 1 になったのに 1は奇数だから 4になり

4->2->1ー>4->2->1 の 無限ループになる。

( aが奇数の場合3かけて1たしたものを改めてaに代入し は奇数を 偶数化 するだけ )
  

robinson

Re: ループ文について

#3

投稿記事 by robinson » 4年前

a=1になればプログラムが終了すると思っていたのが盲点でした。
ご丁寧に教えていただきありがとうございます。

かずま

Re: ループ文について

#4

投稿記事 by かずま » 4年前

作りたいプログラムは、

コード:

a が 1 でない間繰り返す
	a が奇数の場合
		3を掛けて 1を足したものを a に代入
	a が偶数の場合、
		2で割って a に代入
ところが、元のプログラムの if(a%2==0){ の a は
最初の if(a%2==1){ の a と同じものではありません。
a=a*3+1; で変更された結果の a である場合があります。
つまり、

コード:

	a が奇数の場合
		3を掛けて 1を足したものを a に代入し、それを 2で割って a に代入
となっています。

正しくするには、次のように else を使わないといけません。

コード:

		if (a % 2 == 1) {
			a = a * 3 + 1;
			printf("%d\n", a);
		}
		else {         // else if (a % 2 == 0) { と書いても同じだが無駄
			a = a / 2;
			printf("%d\n", a);
		}

Math

Re: ループ文について

#5

投稿記事 by Math » 4年前

君の頭の中では

コード:

while(1){    
        if(a%2==0){
            a=a/2;
            printf("%d\n",a);
        }
        
       if( a==1)break;
       
       if(a%2==1){
            a=a*3+1;
            printf("%d\n",a);
        }    
    }
だったんだろうが
実際には

コード:

while(1){   

       if( a==1)break;
 
        if(a%2==0){
            a=a/2;
            printf("%d\n",a);
        }
       
       if(a%2==1){
            a=a*3+1;
            printf("%d\n",a);
        }    
    }
だからね。

フローチャートを思い浮かべるといいすよ。
何千行、何万行と書くとつまらないことに引っかかて何日もロスるよね!(^^;

返信

“C言語何でも質問掲示板” へ戻る