我想要的输出看起来像这样:
** ** ** ** **
**** **** **** **** ****
****** ****** ****** ****** ******
******** ******** ******** ******** ********
********** ********** ********** ********** **********
********** ********** ********** ********** **********
******** ******** ******** ******** ********
****** ****** ****** ****** ******
**** **** **** **** ****
** ** ** ** **
** ** ** ** **
**** **** **** **** ****
****** ****** ****** ****** ******
******** ******** ******** ******** ********
********** ********** ********** ********** **********
********** ********** ********** ********** **********
******** ******** ******** ******** ********
****** ****** ****** ****** ******
**** **** **** **** ****
** ** ** ** **
** ** ** ** **
**** **** **** **** ****
****** ****** ****** ****** ******
******** ******** ******** ******** ********
********** ********** ********** ********** **********
********** ********** ********** ********** **********
******** ******** ******** ******** ********
****** ****** ****** ****** ******
**** **** **** **** ****
** ** ** ** **
我已经能够弄清楚如何获得第一个钻石形状与以下:
//inside of a void function called printDots()
char dot = '*';
char blank = ' ';
for (int i = 1; i < 6; i++) {
for (int k = 6; k > i; k--) { // right-shifts the first triangle
std::cout << blank;
}
for (int j = 0; j < i; j++) { // first triangle
std::cout << dot;
}
for (int j = 0; j < i; j++) { // second triangle (left-aligned)
std::cout << dot;
}
std::cout << "n";
}
for (int i = 1; i < 6; i++) {
for (int k = 0; k < i; k++) { // right-shifts the third triangle
std::cout << blank;
}
for (int j = 6; j > i; j--) { // third triangle
std::cout << dot;
}
for (int j = 6; j > i; j--) { // fourth triangle (left-aligned)
std::cout << dot;
}
std::cout << "n";
}
我正在努力弄清楚如何在所需的模式中重复这个形状。我试过添加更多的for
循环来做同样的事情,我已经在做钻石的所有四个部分,但它似乎只是将星号垂直向下移动,破坏了图案,所有这些都没有达到任何水平输出。我可以用一个大的std::cout
语句手动输出模式,但我试图弄清楚如何生成形状,而不仅仅是复制和粘贴它。任何建议吗?
我会重新设计你的应用程序,让你有一个函数打印一行菱形:
初始程序是这样的:
void printDiamondLine(int line)
{
// You write this part
}
int main()
{
for(int loop = 0; loop < sizeOfDiamong; ++loop)
{
printDiamondLine(loop);
std::cout << "n";
}
}
这应该打印出来:
** Notice that each line is space filled on both sides.
****
******
********
**********
**********
********
******
****
**
现在你可以修改代码来打印多个菱形:
int main()
{
// Looping over the whole things
// to get multiple lines of diamonds.
for(int vertical = 0; vertical < verticalDiamonds; ++vertical)
{
for(int loop = 0; loop < sizeOfDiamong; ++loop)
{
// Printing each line of the diamond
// multiple times across.
for(int horz = 0; horz < horzDiamonds; ++horz)
{
printDiamondLine(loop);
std::cout << " ";
}
std::cout << "n";
}
}
}
你必须一次考虑一行。第一个大的for循环生成每个菱形的上半部分,第二个大的for循环生成下半部分,对吗?
我只处理它的一半,因为它从上到下变成了相同的解:
// This produces 5 lines of output.
for (int i = 1; i < 6; i++) {
// This puts out leading spaces as required for this line
for (int k = 6; k > i; k--) { // right-shifts the first triangle
std::cout << blank;
}
// This puts out the diamond itself -- just this line
for (int j = 0; j < i; j++) { // first triangle
std::cout << dot;
}
// And this puts out the second half of the diamond -- just this line
for (int j = 0; j < i; j++) { // second triangle (left-aligned)
std::cout << dot;
}
// Note: THIS IS WHERE WE'LL INSERT MORE CODE
// And this is why you're only getting 1
std::cout << "n";
}
我注释了代码。到目前为止,你做得还不错。但现在,让我们保留所有的代码,但我将在最后计数之前添加一点。
for (int k = 6; k > i; k--) {
std::cout << blank;
}
这样做的作用是空格填充行,以便(到目前为止)每行都是相同的长度。
然后你所要做的就是将大部分代码包装到另一个for循环中。你会得到这样的结果:
for (int i = 1; i < 6; i++) {
for (int whichDiamond = 0; whichDiamond < 3; ++whichDiamond) {
for (int k = 6; k > i; k--) { // right-shifts the first triangle
std::cout << blank;
}
for (int j = 0; j < i; j++) { // first triangle
std::cout << dot;
}
for (int j = 0; j < i; j++) { // second triangle (left-aligned)
std::cout << dot;
}
for (int k = 6; k > i; k--) { // right-shifts the first triangle
std::cout << blank;
}
}
std::cout << "n";
}
你可以对第二个大循环做同样的事情。
现在,可能有更聪明的方法来做到这一点,但这只适用于您现有的代码。