2017-07-21 4 views
-4

無限ループを使用して14から156までのすべての奇数を印刷したい場合は、中断して続行してください。しかし、私はそれを実行すると何も表示されません!すべての奇数をどのように印刷するのですか?

int main() 
{ 
    int x; 
    int y = 14; 
    while(x) { 
     if(y % 2 == 0) { 
      continue; 
     } 
     else if(y % 3 == 0) { 
      printf("%d\n", y); 
     } 
     if(y == 156) { 
      break; 
     } 
     y++; 
    } 
    return 0; 
} 
+2

変更'。おそらく 'x'はゼロに初期化されます。 –

+3

ちょうど奇数を探しているなら、なぜy%3を使っていますか? – Kai

+0

@MadPhysicistはそれを信じていません:初期化されていない変数を使用することは未定義の動作です。 'x'はまったく初期化されません。 –

答えて

0

ブレークを伴う無限ループは、これを行う正しい方法ではありません。 "for"ループを使用すると、コードがはっきりします。 15時にそれを開始し、156まで2ずつ増やしてください。

2

あなたのコードの問題は、予測できない結果を伴う操作を使用することです。具体的には、int x;を初期化せずに宣言してから、while(x)の終了条件として使用することが問題です。多くのプラットフォームやコンパイラでは、これはすでにメモリにある値がすべてxであったものを保持します。その場合、xが値ゼロで始まり、ループは決して実行されないので、印刷ステートメントは表示されません。

あなたは無限ループにあなたのループを作る必要があります。これは156自体を除く値を出力します

int main() 
{ 
    int x; 
    for(x = 14; ; x++) { 
     if(x % 2 == 0) { 
      continue; 
     } 
     if(x >= 156) { 
      break; 
     } 
     printf("%d\n", x); 
    } 
    return 0; 
} 

[IDEOne link]

156を含めるには、printf呼び出しの後break条件を置く:

printf("%d\n", x); 
if(x >= 156) { 
    break; 
} 

代わりにあなただけの>>=を変更することができます。

breakまたはcontinueの場合は、elseは必要ありません。

int main() { 
    int x = 14; 
    while(1) { 
     if(x % 2 == 0) { 
      x++; 
      continue; 
     } 
     if(x >= 156) { 
      break; 
     } 
     printf("%d\n", x++); 
    } 
    return 0; 
} 

[IDEOne Link]

あなたが避けることができます:あなたはあなたcontinueは無限ループを避けるために、前にインクリメントする必要があるため

あなたは、whileループを使用する必要がある場合は、状況は少し複雑です余分な増分あなたはcontinueを見送ることができた場合:

int main() { 
    int x = 14; 
    while(1) { 
     if(x % 2) { 
      printf("%d\n", x); 
     } 
     if(x++ == 156) { 
      break; 
     } 
    } 
    return 0; 
} 

[IDEOne Link]

x % 3 == 0のチェックを削除しました。その目的が問題の制約内にあるかどうかは不明なためです。無限ループで

+0

あなたのコードを実行しようとしましたか?つまり、最初の 'while(1)'の例で、これはとにかく "完全"ではありません。 @ WedeVane。 –

+0

いいえ、私は(あなたが最初に尋ねた時に)私はしませんでしたが、私は今して、それに応じて更新しました。 –

1

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

int y=14; 
while(1){ 
    if(y & 1){ 
     printf("%d\n",y); 
    } 

    if(y>=156){ 
     break; 
    } 

    y++; 
} 

return 0; 
} 

兼ね備え方法、forループで:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

int start=14; 
start |= 1; //This will increment by one if your start value is even 
for (start; start<=146; start+=2) { 
    printf("%d\n", start); 
} 

return 0; 
} 
+0

'0b1'は私が知っている限りGNUのみの拡張です。 '0x1'、または単に'%2'でテストする方が移植性が高くなります。実際、 'start&1'は正確に0または1であることが保証されているので、全体の三項式は' start + =(start&1) 'で置き換えることができます。 –

+0

'start = start&0b1?start:start + 1; '===>' start | = 1; '... – twalberg

+0

これらの提案で編集しました、ありがとう! 'start | = 1;'これを行うためのクールな方法です、私はそれが好きです。 – jacoblaw

0

あなたのロジックにはいくつかの問題があります。

1. Variable `x` is of no use. You can use variable `y` to terminate the loop. 
2. No need to check if the number is a multiple of 3. 
3. No need to check for even numbers is either. 

私はコードを修正しましたが、正しい結果が得られましたが、上記の点を読んでコードを正しく取得しようとします。

int main() 
{ 
    int y = 14; 
    while(y) { 
     if (y==156) 
      break; 
     if(y % 2 != 0) { 
      printf("%d ",y); 
     } 
     y++; 
    } 
    return 0; 
} 

良好かつ迅速な方法は、15で開始し、その< = 156まで2によって可変yの値をインクリメントすることであろう。

int main() 
    { 
     int y = 15; 
     while(y) { 
      if (y==157) 
       break; 
      printf("%d ",y); 
      y+=2; 
     } 
     return 0; 
    } 
0

変数xが初期化されていないとwhile文で条件として使用されているので、あなたのコードは未定義の動作をしています。これをwhile (1)で修正できますが、プログラムの無限ループは、156の終了テストの前に起こります。奇数のみを列挙、このように単純化することができる

#include <stdio.h> 

int main(void) { 
    for (int y = 14; y < 156; y++) { 
     if (y % 2 != 0) { 
      printf("%d\n", y); 
     } 
    } 
    return 0; 
} 

#include <stdio.h> 

int main(void) { 
    for (int y = 15; y < 156; y += 2) { 
     printf("%d\n", y); 
    } 
    return 0; 
} 

あなたがbreakを使用する必要がある場合は、continue

問題は、単に標準forループで解決されます無限ループの場合、実際には永遠の永久Cループ、終了条件のないforループを使用することができます:

#include <stdio.h> 

int main(void) { 
    for (int y = 14;; y++) { 
     if (y == 156) 
      break; 
     if (y % 2 == 0) 
      continue; 
     printf("%d\n", y); 
    } 
    return 0; 
} 
0

(x)は ``(1)しばらく `にしばらくうーん...

#include <stdio.h> 
#include <stdint.h> 
#include <errno.h> 

/* Prints even or add numbers between to and from. 
    Works for negative numbers. 
    Works up and down. 
*/ 
int print_even_or_odd(long long from, long long to, int even) 
{ 
    if (((INT32_MAX < from) || (INT32_MIN > from)) || 
     ((INT32_MAX < to) || (INT32_MIN > to))) 
    { 
    fprintf(stderr, "Invalid input.\n"); 
    errno = EINVAL; 
    return -1; 
    } 

    printf("from=%d to %d\n", (int) from, (int) to); 

    int sign = (to < from) ?-1 :1; 

    /* Adjust "from" to next even/odd number. */ 
    if ((!even && !(from & 1)) || (even && (from & 1))) 
    { 
    from += sign; 
    } 

    /* Adjust "to" to the previous even/odd number. */ 
    if ((!even && !(to & 1)) || (even && (to & 1))) 
    { 
    to -= sign; 
    } 

    { 
    size_t steps = (size_t) (sign * ((to - from)/2)) + 1; 

    if (0 == steps) 
    { 
     printf("Nothing to do.\n"); 
     return 0; 
    } 

    while (1) 
    { 
     if (0 >= steps) 
     { 
     break; 
     } 

     --steps; 

     printf("%d\n", (int) (to - sign * 2 * (int) steps)); 

     continue; /* as having continue is a requirement ... ;-) */ 
    } 
    } 

    return 0; 
} 

int main(void) 
{ 
    print_even(14, 156, 0); 
    print_even(156, 14, 0); 
    print_even(-14, -156, 0); 
    print_even(-156, -14, 0); 
} 
+0

@chqrlie:Ups ...まあ、「偶」、「奇妙」なんて誰でも気にします;-)これを修正します。そして確かにはい。私は、無限ループの要件を逃しました。しかし、休憩のループは、もはや無限とは思えませんでした。 – alk

+0

@chqrlieいずれにしても、固定されています。 – alk

+0

Mr picky: '(to - from)'は算術オーバーフローの可能性があります。 – chqrlie

関連する問題