这个想法是打印4个形状,前两个形状打印精细,接下来的两个形状使用setw意味着镜子,但仍然打印低于它们。
我的理解是setw制作了一种文本框,它从参数中指定的文本位置开始从右到左输出,它适用于我尝试过的其他示例。但由于某些原因,当通过这些for循环时,它只是添加了设定数量的制表空间,并打印在setw位置的错误一侧。
#include <conio.h>
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int x = 1;
for (int i = 0; i < 9; i++)
{
for (int i = 1; i <= x; i++)
cout << "*";
x++;
cout << endl;
}
cout << endl;
x = x - 1;
for (int i = 0; i < 9; i++)
{
for (int i = 1; i <= x; i++)
cout << "*";
x--;
cout << endl;
}
cout << endl;
for (int i = 0; i < 9; i++)
{
cout << setw(10);
for (int i = 1; i <= x; i++)
cout << "*";
x++;
cout << endl;
}
cout << endl;
for (int i = 0; i < 9; i++)
{
cout << setw(10);
for (int i = 1; i <= x; i++)
cout << "*";
x--;
cout << endl;
}
_getch();
}
答案 0 :(得分:2)
我无法看到您的输出,但此信息可能有所帮助。
setw
用于指定下一个数字或字符串值的最小空间。这意味着如果指示的空间大于数值或字符串,则会添加一些填充。
最重要的是setw
不会更改输出流的内部状态,因此它只会确定下一个输入的大小,这意味着它只适用于for循环的第一次迭代。
答案 1 :(得分:0)
您setw()
一次,然后输出x
次。 setw()
仅影响 next 输出,即第一个字符 - 按照您的指示从右向左设置 - 并附加剩余的字符。
所以你的内环(用一个环形计数器遮住外部的一个...... 颤抖)无法正常工作 - 你需要一次性打印你的形状线setw()
要有效。这可以通过一个非常有用的std::string
构造函数来完成:
basic_string( size_type count,
CharT ch,
const Allocator& alloc = Allocator() );
构造具有字符ch的计数副本的字符串。如果count> gt = = npos。
,则行为未定义
(资料来源:cppreference.com)
然后就是第三种形状的问题,其中一条线比另一条线少。
固定代码:
#include <iostream>
#include <iomanip>
#include <string>
// <conio.h> is not available on non-Windows boxes,
// and if MSVC were smart enough to keep the console
// window open, this kludge wouldn't be necessary
// in the first place.
#ifdef _WIN32
#include <conio.h>
#endif
using namespace std;
int main()
{
int x = 1;
for (int i = 0; i < 9; i++)
{
cout << string( x, '*' ) << "\n";
x++;
}
cout << endl;
x = x - 1;
for (int i = 0; i < 9; i++)
{
cout << string( x, '*' ) << "\n";
x--;
}
cout << endl;
for (int i = 0; i < 9; i++)
{
// increment first, or the loop will not print
// the last line, making the third shape different.
x++;
cout << setw(10) << string( x, '*' ) << "\n";
}
cout << endl;
for (int i = 0; i < 9; i++)
{
cout << setw(10) << string( x, '*' ) << "\n";
x--;
}
#ifdef _WIN32
_getch();
#endif
}
这可以通过创建一个 string
进一步简化,然后在每个循环中打印它的子串(而不是每次都创建一个新的临时string
),但是我想要接近原始代码。