-3

私はこのコードを書きましたが、正方形を作成するために新しい数値を入力するようにユーザーに要求すると、正方形が印刷されません。誰でも説明/助けてもらえますか?

// ask user to repeat the process again at end of the first promt

while ( num > 1 || num < 20 )
    {
  ask user to repeat the process again at end of the first promt
    while ( num > 1 || num < 20 )
    {
        // ask user t enter a square
        cout << "Please enter size of square between #1-20: \n";
        cin >> buf; num = atoi (buf.c_str());
        cin.ignore(1000, 10);


        // process of printing square
        while ( num >= a)
        {
            b = 1;
            while ( num >= b )
            {
                if ( a == 1 || a == num || b == 1 || b == num )
                    cout << "*";
                else
                    cout << " ";
                b++;
            }
            cout << endl;
            a++;
        }
4

2 に答える 2

2

1 に初期化するコードが表示されないaため、任意の値を持つ可能性があります。その任意の値が より大きい場合num、外側のループは開始されません。

価値があるのforは、次の擬似コードのような制限が事前にわかっているため、この場合はループを使用することです。

# Top line
for i = 1 to num (inclusive):
    output "*"
output newline

# Middle lines
for i = 2 to num-1:
    output "*"               # Left char
    for j = 2 to num-1:      # Middle chars
        output " "
    output "*" and newline   # Right char

# Bottom line
for i = 1 to num (inclusive):
    output "*"
output newline

その後、ループ本体内の条件チェックについて心配する必要はありません。

経験則としてはfor、開始前に既知の反復回数、つまり、反復whileする頻度が事前にわからないループに使用することです。

別の可能性のある問題は、あなたの状態です。

while ( num > 1 || num < 20 )

の値に関係なく、numlogical-or を使用しているため、これは常に true です||。可能性を考えてみましょう:

num <= 1     : false or true  -> true
num == 2..19 : true  or true  -> true
num >= 20    : true  or false -> true

1..20 の範囲の値を持っている間にループを続けたい場合は、次を使用する必要があります。

while ( num < 1 || num > 20 )

そして、あなたは次のようになります:

num <  1     : true  or false -> true
num == 1..20 : false or false -> false
num >  20    : false or true  -> true

コードには他にも潜在的な問題がいくつかあります。

  • 外側のループが 2 回あるようです。
  • bまたはを定義していないようnumです。
  • num外側のループ(チェックする)の前に設定しているようには見えません。
  • while ( num > 1 || num < 20 )呼び出しの直後にループを閉じるcin.ignore()つもりだったのではないかと思います。これは、1 から 20 の値を取得して正方形描くまでループを続けることを意図しているためです。このままでは99を入力しても四角が描かれます。
于 2013-08-28T02:33:55.223 に答える
0

おそらく最良のコードではありませんが、6 行で実行できます。ここに行きます。

   for (int y = o; y < height; ++ y) {
       for (int x = 0; x < width; ++x) {
          cout << (y == 0 || y == (height - 1) || x == 0 || x == (width - 1) ? '*' : ' ' );
       }
       cout << endl;
    }
于 2013-08-28T04:23:12.210 に答える