3

好的,我是编程新手,因此决定阅读这本名为 Accelerated C++ 的书。我只在第二章,我尝试按照练习进行操作,即创建一个询问您的姓名的程序,然后输出它并在其周围加上一个框架和填充。

当我执行它时,它似乎没有移动到下一行。我猜这与我的 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

5

考虑将列计数器 c 移动到更靠近您使用它的位置,然后正如 tuckermi 所说,它将从 0 开始为每一行。

while (r != rows) {
    string::size_type c = 0;
    while(c != cols) {
于 2013-08-01T08:19:55.087 回答
4

在外部循环的底部,您需要将变量 c 重置为零,否则它将保持其旧值并且不会重新进入内部循环。

实现此目的的一个好方法是将变量的定义/初始化移到外循环的开头。这样 c 将在每次启动内部循环之前重新初始化。

于 2013-08-01T08:16:02.080 回答
1

您快到了。

您需要清除 c 每一行,并且需要从 greetings.size() 中删除一个以使其格式正确(考虑到您将在循环中稍后增加它的事实)

// 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;


while (r != rows) {
string::size_type c = 0;
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()-1); // adjust invariant
            } else {
                 cout << " ";
            }
        }
        ++c;
    }
    ++r;
    cout << std::endl;
}

return 0;
}

http://ideone.com/mb9InW

于 2013-08-01T08:29:24.573 回答
0

除了在外部循环中重置变量 c 之外,您不会在星号和消息之间获得填充。因此,在您打印消息的位置之后包括以下代码。

for(int i = 0;i<pad;i++)
{
    cout<<" ";
}
于 2013-08-01T08:30:45.533 回答