3

さて、私はプログラミングの初心者で、Accelerated C++ という本に飛び込むことにしました。私はまだ第 2 章に取り組んでいますが、演習に従ってみました。これは、名前を尋ねるプログラムを作成し、その周りにフレームとパディングを付けて出力するプログラムを作成するというものです。

実行すると、次の行に移動していないようです。while() ループに関係していると推測していますが、それが正確に何であるかを理解するにはあまりにも愚かです

// ask for a person's name, and greet the person
#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::string;

int main()
{
// fetch name
cout << "Please enter your first name: ";
string name;
cin >> name;

// message
const string greeting = "Hello, " + name + "!";
// padding
const int pad = 1;
//desired rows/columns
const int rows = pad * 2 + 3;
const string::size_type cols = greeting.size() + pad * 2 + 2;
// seperate output from input
cout << std::endl;
// invariants
int r = 0;
string::size_type c = 0;

while (r != rows) {
    while(c != cols) {
        if (r == 0 || r == rows -1 || c == 0 || c == cols -1) { // if in bordering column or row
            cout << "*";   //output *
        } else {
            if (r == pad + 1 && c == pad + 1) { //if on row for greeting
                cout << greeting; // write greeting
                c += greeting.size(); // adjust invariant
            } else {
                cout << " ";
            }
        }
        ++c;
    }
    ++r;
    cout << std::endl;
}

return 0;
}
4

4 に答える 4

4

外側のループの最後で、変数 c をゼロにリセットする必要があります。そうしないと、古い値が保持され、内側のループに再び入ることはありません。

これを実現する良い方法は、変数の定義/初期化を外側のループの先頭に移動することです。そうすれば、毎回内側のループを開始する前に c が再初期化されます。

于 2013-08-01T08:16:02.080 に答える