我想创建一个创建金字塔的程序。其大小(行数)由用户输入确定。
这是我到目前为止尝试过的。它只显示了金字塔的一半。
#include <iostream>
using namespace std;
int main()
{
//delcare all the variables
int n, m, i, j;
cout << "Enter the number of lines: ";
cin >> n;
for (i = 1; i <= n; i++)
{
//prints the spaces in between row and column using loop
for(j = 1; j <= n - i; j++)
{
cout <<" ";
}
//prints the element of using loop
for (j = i; j >= 1; j--)
{
cout <<" ";
}
//prints first and last elements using loop
for (j = 2; j <= i; j++)
{
cout << " " << j << " ";
}
//elements in new line printed
cout << "\n";
}
return 0;
}
当我输入数字7时,我期望整个金字塔,但是当前输出仅为金字塔的一半,即从2到7。
答案 0 :(得分:2)
将变量声明为尽可能靠近变量的使用位置。给他们起有意义的名字:
#include <iostream>
#include <iomanip>
int main()
{
std::cout << "Enter the number of lines: ";
int num_lines;
if (!(std::cin >> num_lines) || num_lines < 1 || 15 < num_lines) {
std::cerr << "Input error. Bye :(\n\n";
return EXIT_FAILURE;
}
for (int current_line{ 1 }; current_line <= num_lines; ++current_line) {
for(int spaces = 0; spaces < num_lines - current_line; ++spaces)
std::cout << " ";
for(int number = current_line; number; --number)
std::cout << std::setw(2) << std::right << number << ' ';
for (int number = 2; number <= current_line; ++number)
std::cout << std::setw(2) << std::right << number << ' ';
std::cout.put('\n');
}
}
Enter the number of lines: 15
1
2 1 2
3 2 1 2 3
4 3 2 1 2 3 4
5 4 3 2 1 2 3 4 5
6 5 4 3 2 1 2 3 4 5 6
7 6 5 4 3 2 1 2 3 4 5 6 7
8 7 6 5 4 3 2 1 2 3 4 5 6 7 8
9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9
10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10
11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11
12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12
13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13
14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15
的解释:我正在使用std::wetw()
将数字的输出填充到两位数。 std::right
在这两个字符内右对齐输出:1
〜> " 1"
但11
〜> { {1}}。我这样做是为了在打印每行开头的空格时不必编写更复杂的代码。一个印刷的数字总是三个字符宽-两个代表数字,后面跟空格分隔数字。
谈论太空人物开始的每一行:在金字塔的底部,从15到1的所有数字,再到15再次被打印。因此,数字之前的空格数必须是第一行的三乘14倍,第二行的三乘以13倍,第三行的三乘以12倍,依此类推,直到最后一行(第15行)为三乘以零。如您所见,空格数是"11"
乘以三。这就是第一个内部num_lines - current_line
循环的作用。
另外两个内部for()
循环应该是自我计划的。一个从for()
倒数到current_line
,另一个倒数到1
。向上计数的循环从current_line
开始,不会打印数字2
的两倍。