我想要这样的输出:
示例输入= 4
*
** **
*** *** ***
**** **** **** ****
它与模式(行和列)重复相同
我已经写了程序,但是我不知道如何只显示最后一列,直到所有的列都显示出来
这是我写的程序:
#include <iostream>
using namespace std;
int main() {
int x;
int repeat = 0;
cin >> x;
do {
for (int b = 0; b <= x; b++)
{
for (int c = b; c <= x; c++)
{
cout << " ";
}
for (int c = 0; c < b; c++)
{
cout << "*";
}
cout << endl;
}
++repeat;
} while (repeat != x);
return 0;
}
我想这个练习有两个目标。它试图教你如何将一个任务分解成更小的任务,并要求你打印一些*
和空格。我会帮助你与第一但至少离开奈你。
把一个大问题分成几个小问题的方法不止一种。我将做如下操作:您想打印由若干块组成的列和行。
columns ->
* rows
** ** |
*** *** *** v
**** **** **** ****
^--^ one piece
main
部分可以像这样:
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
std::string get_piece(int row, int col,int width);
int main() {
int x = 4;
for (int row=0; row < x; ++row){
for (int col = 0; col < x ; ++col){
std::cout << get_piece(row,col,x) << " ";
}
std::cout << "n";
}
}
打印x
行和x
列。现在你只需要弄清楚各个部分。这是一个开始(它使用std::setw
和std::setfill
):
std::string get_piece(int row, int col,int width){
std::stringstream ss;
ss << std::setw(width) << std::setfill('x') << row << col;
// ^^ this is actually flawed, but you wont notice unless row or col are >9
return ss.str();
}
输出如下:
xxx00 xxx01 xxx02 xxx03
xxx10 xxx11 xxx12 xxx13
xxx20 xxx21 xxx22 xxx23
xxx30 xxx31 xxx32 xxx33
这是一个完全不同的模式(这次使用std::string
构造函数接受一个字符和重复该字符的数字):
std::string get_piece(int row, int col,int width){
int num_stars = (row+col)/2;
return std::string(num_stars,' ') + std::string(width-num_stars,'*');
}
结果是:
**** **** *** ***
**** *** *** **
*** *** ** **
*** ** ** *
现在你只需要弄清楚根据row
,col
和width
这些部件的外观。
一种方法是反向操作。创建这个:
*
**
...
**** **** **** ****
和空格填充每一行,这样所有的行都是相同的长度。但是不是将每一行从0打印到n,而是从n打印到0。也就是说,你实际上并没有这样打印它们——你只是构建了一个字符串数组,然后按相反的顺序打印字符串。
另一个选择是在你当前的大多数代码之前,对于每一行,确定有多少组星星不应该存在,然后在前面填充空间。这将保留大部分现有的代码。