好吧,我是编程新手,决定跳进这本名为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;
}
答案 0 :(得分:5)
考虑将列计数器c移动到您使用它的位置,然后就像塔克米所说的那样,它将从每行的0开始。
while (r != rows) {
string::size_type c = 0;
while(c != cols) {
答案 1 :(得分:4)
在外部循环的底部,您需要将变量c重置为零,否则它将保留其旧值,并且不会重新进入内部循环。
实现此目的的一个好方法是将变量的定义/初始化移动到外部循环的开头。这样c将在每次启动内循环之前重新初始化。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
除了重置外部循环中的变量c之外,您还没有在星号和消息之间进行填充。因此,在您打印消息的地方之后包括以下代码。
for(int i = 0;i<pad;i++)
{
cout<<" ";
}