2012-01-31 2 views
1

私はプログラミングにはとても慣れていますので、この質問が不合理に単純であると思われる場合はお詫びします。私はC++の本の現在の章でいくつか余分な質問に取り組んでいます。私は実際問題の正解を見つけましたが、そうしているうちに特定のソリューションがうまくいくのは分かりませんし、別のソリューションがうまくいかないことが分かりません。C++はループの行を表示します

この問題は32行から127行までのASCII値を1行に16文字の数行で出力するように求められます。私が(正確に動作する)解決策はこれです:

#include <iostream> 
using namespace std; 

int main() 
{ 
    char letter; 
    int count = 0; 

    for (letter = 32; letter < 127; letter++, count++) 
    { 
     if (count == 16) 
     { 
      cout << endl; 
      count = 0; 
     } 
     cout << letter << " "; 
    } 

    cout << endl; 

    return 0; 

} 

また、上記のコードはうまく動作し、私が望むことをします。この難しさは私がこれまでに試したことにあります。

#include <iostream> 
using namespace std; 

int main() 
{ 
    char letter = 32; 
    int count; 

    while (letter < 127) 
    { 
     count = 0; 
     while (count < 16) 
     { 
      cout << letter << " "; 
      letter++; 
      count++; 
     } 
     cout << endl; 
    } 

    cout << endl; 

    return 0; 

} 

このwhileループだけで無限に実行され、また、私が欲しいのASCII文字の後にいくつかのゴミを出してくれる、と私は理由を把握することはできません:そうは次のように私は、whileループネストされたと同じ問題を行うことを試みました。さらに奇妙なのは、whileループを使ってコード内の変数 'letter'をcharの代わりにintに変更した場合、それは必要なときに正確に実行され、終了するときに終了し、ASCIIの代わりに実際の数値を表示するだけです値。

「文字」が無限ループになる文字の場合のみです。私はそれが本当にシンプルなものだと確信しています、そして、私はちょうど今それを見るために疲れているかもしれませんが、どんな助け/ヒントも大いに感謝されるでしょう!私は技術的に答えを得ていますが、それは私が2番目の答えがひどく恐ろしく失敗する理由がわからないことを私に夢中にしています。

ありがとうございます。

答えて

4

答えは十分に本当、簡単です。ここで何が起こるのですか - (符号付き)charは、112までの行を出力した後、インナーループの[-128、127]の範囲の値を持つことができます。また、別の16でインクリメントして16をインクリメントします。文字を112 + 16 = 128にします。これは、符号付き文字の範囲が実際にあふれているため-128になります。したがって、この内部ループの実行後に、外部ループの状態はまだ保持されます。-128 < 127です。これは奇妙な文字を取得する理由です。これらは-128〜32の値になります。

問題?内側のループのチェックを変更します。 while (count < 16 && letter < 127)

+0

ああを。ありがとうございました! – nik

1

文字が== 48,64、...、128のときに内部whileループが終了しますが、(符号付きの)charであるため、128は-128と解釈され、外側のループは終了しません。あなたの最初の例と同じ動作を取得するために

while (count < 16 && letter < 127) 

に内部ループを変更 。 intに

または変更の手紙、127を含め、すべての文字を印刷するにはOKだ場合:

int letter = 32; 
... 
cout << (char)letter << " "; 
0

は、このコードを試してみてください:完璧な理にかなっている

#include <iostream> 
using namespace std; 

int main() 
{ 
    int letter; 
    for (letter = 32; letter < 128; ++letter) 
    { 
    if (letter != 32 && letter % 16 == 0) 
     cout << endl; 

    cout << (char)letter << ' '; 
    } 
} 
関連する問題