如何使用 C++ 打印菱形
How to print diamond shape w/ c++
我需要帮助,我刚才创建了一个简短的小程序,它可以打印一个带有“*”的简单金字塔,如下所示:
*
***
*****
但我决定挑战自己,看看我是否可以像这样创建一个简单的菱形:
*
***
*****
***
*
到目前为止,这是我的代码。
我还要补充一点,您输入的值(例如 5)决定了钻石的大小。
#include <iostream>
#include <sstream>
using namespace std;
int main() {
int value = 0;
cout << "Please enter in a value: ";
cin >> value;
cout << endl;
for (int i = 0; i < value; i++) {
//print spaces v v v
for (int x = 0; x < (value - i - 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2 * i + 1); y++) {
cout << "*";
}
cout << endl;
}
for (int i = 0; i < value; i++) {
int number = 0;
number+= 2;
//print spaces v v v
for (int x = 0; x < (value - value + i + 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (/*ATTENTION: What do I do here? Plz help*/); y++) {
cout << "*";
}
cout << endl;
}
return 0;
}
我一直想做的是弄清楚要在括号内放置什么 (//ATTENTION)。我已经工作了至少一个小时来尝试做一些随机的事情,有一次当我输入 4 时它起作用了,但输入 5 时却不起作用,这非常困难。这是构建钻石的关键,尝试只输入值并编译以查看会发生什么。我需要它是对称的。
我需要知道括号内的内容。很抱歉,这很长,但如果您能提供帮助,我们将不胜感激。
如果我的代码混乱且难以阅读,我也深表歉意。
#include <iostream>
#include <sstream>
using namespace std;
int main() {
int value = 0;
cout << "Please enter in a value: ";
cin >> value;
cout << endl;
for (int i = 0; i < value; i++) {
//print spaces v v v
for (int x = 0; x < (value - i - 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2 * i + 1); y++) {
cout << "*";
}
cout << endl;
}
for (int i = 0; i < value-1; i++) {
// int number = 0;
// number+= 2;
// //print spaces v v v
for (int x = 0; x < i+1; x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2*(value-1-i)-1); y++) {
cout << "*";
}
cout << endl;
}
return 0;
}
我希望你会明白这个。同样在第二个 for 循环中,你通过将循环迭代到 value
来额外迭代它一次。但是由于金字塔是对称的,所以金字塔中的行数将是 2*value-1
。所以我在第二个循环中 i
应该变化到 value -1
。
此代码应该可以解决问题:
#include <sstream>
using namespace std;
void printSpaces(int howMany) {
for(int i = 0; i < howMany; i++) cout << " ";
}
void figure(int size) {
bool oddSize = size % 2 == 1;
int center = size / 2;
int spaces = size / 2;
// If figure is of an odd size adjust center
if (oddSize) {
center++;
} else { // Else if figure is of even size adjust spaces
spaces--;
}
for (int i = 1; i <= center; i++) {
printSpaces(spaces);
for(int j = 0; j < 1 + (i - 1) * 2; j++) cout << "*";
cout << endl;
spaces--;
}
spaces = oddSize ? 1 : 0; // If the figure's size is odd number adjust spaces to 1
center -= oddSize ? 1 : 0; // Adjust center if it's an odd size figure
for(int i = center; i >= 1; i--) {
printSpaces(spaces);
for(int j = 0; j < 1 + (i - 1) * 2; j++)
cout << "*";
cout << endl;
spaces++;
}
}
int main() {
int value = 0;
while(value < 3) {
cout << "Please enter in a value (>= 3): ";
cin >> value;
cout << endl;
}
figure(value);
return 0;
}
int number = 0;
and number+= 2;
value - value
inside for (int x = 0; x < (value - value + i + 1); x++) {
不需要。
括号内可以用
2*(value-i-1)-1
但是,我建议你先分析问题,然后尝试解决它,而不是尝试随机的事情。例如,让我们考虑偶数和奇数输入的情况,即 2 和 3。
偶数案例(2)
*
***
***
*
分析
Row Index Number of Spaces Number of Stars
0 1 1
1 0 3
2 0 3
3 1 1
对于行索引 < 值
- 空格数 =
value - row index - 1
- 星星数 =
2 * row index + 1
对于行索引 >=value
空间和星星的数量只是颠倒了。在一些奇怪的情况下,情况也类似,只是有一个小例外。
奇例 (3)
*
***
*****
***
*
分析
Row Index Number of Spaces Number of Stars
0 2 1
1 1 3
2 0 5
3 1 3
4 2 1
一个小例外是,在反转时,我们必须忽略行索引 = 值。
现在,如果我们将上面的分析放在代码中,我们就得到了解决方案
//Define the Print Function
void PrintDiamond(int rowIndex, int value)
{
//print spaces v v v
for (int x = 0; x < value - rowIndex -1; x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < 2 * rowIndex + 1; y++) {
cout << "*";
}
cout << endl;
}
然后在main里面
//Row index < value
for (int i = 0; i < value; i++) {
PrintDiamond(i,value);
}
//For row index >= value reversing the above case
//value-(value%2)-1 subtracts 1 for even and 2 for odd cases
//ignore the row index = value in odd cases
for (int i = value-(value%2)-1; i >=0; i--) {
PrintDiamond(i,value);
}
我需要帮助,我刚才创建了一个简短的小程序,它可以打印一个带有“*”的简单金字塔,如下所示:
*
***
*****
但我决定挑战自己,看看我是否可以像这样创建一个简单的菱形:
*
***
*****
***
*
到目前为止,这是我的代码。 我还要补充一点,您输入的值(例如 5)决定了钻石的大小。
#include <iostream>
#include <sstream>
using namespace std;
int main() {
int value = 0;
cout << "Please enter in a value: ";
cin >> value;
cout << endl;
for (int i = 0; i < value; i++) {
//print spaces v v v
for (int x = 0; x < (value - i - 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2 * i + 1); y++) {
cout << "*";
}
cout << endl;
}
for (int i = 0; i < value; i++) {
int number = 0;
number+= 2;
//print spaces v v v
for (int x = 0; x < (value - value + i + 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (/*ATTENTION: What do I do here? Plz help*/); y++) {
cout << "*";
}
cout << endl;
}
return 0;
}
我一直想做的是弄清楚要在括号内放置什么 (//ATTENTION)。我已经工作了至少一个小时来尝试做一些随机的事情,有一次当我输入 4 时它起作用了,但输入 5 时却不起作用,这非常困难。这是构建钻石的关键,尝试只输入值并编译以查看会发生什么。我需要它是对称的。
我需要知道括号内的内容。很抱歉,这很长,但如果您能提供帮助,我们将不胜感激。
如果我的代码混乱且难以阅读,我也深表歉意。
#include <iostream>
#include <sstream>
using namespace std;
int main() {
int value = 0;
cout << "Please enter in a value: ";
cin >> value;
cout << endl;
for (int i = 0; i < value; i++) {
//print spaces v v v
for (int x = 0; x < (value - i - 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2 * i + 1); y++) {
cout << "*";
}
cout << endl;
}
for (int i = 0; i < value-1; i++) {
// int number = 0;
// number+= 2;
// //print spaces v v v
for (int x = 0; x < i+1; x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2*(value-1-i)-1); y++) {
cout << "*";
}
cout << endl;
}
return 0;
}
我希望你会明白这个。同样在第二个 for 循环中,你通过将循环迭代到 value
来额外迭代它一次。但是由于金字塔是对称的,所以金字塔中的行数将是 2*value-1
。所以我在第二个循环中 i
应该变化到 value -1
。
此代码应该可以解决问题:
#include <sstream>
using namespace std;
void printSpaces(int howMany) {
for(int i = 0; i < howMany; i++) cout << " ";
}
void figure(int size) {
bool oddSize = size % 2 == 1;
int center = size / 2;
int spaces = size / 2;
// If figure is of an odd size adjust center
if (oddSize) {
center++;
} else { // Else if figure is of even size adjust spaces
spaces--;
}
for (int i = 1; i <= center; i++) {
printSpaces(spaces);
for(int j = 0; j < 1 + (i - 1) * 2; j++) cout << "*";
cout << endl;
spaces--;
}
spaces = oddSize ? 1 : 0; // If the figure's size is odd number adjust spaces to 1
center -= oddSize ? 1 : 0; // Adjust center if it's an odd size figure
for(int i = center; i >= 1; i--) {
printSpaces(spaces);
for(int j = 0; j < 1 + (i - 1) * 2; j++)
cout << "*";
cout << endl;
spaces++;
}
}
int main() {
int value = 0;
while(value < 3) {
cout << "Please enter in a value (>= 3): ";
cin >> value;
cout << endl;
}
figure(value);
return 0;
}
int number = 0;
andnumber+= 2;
value - value
insidefor (int x = 0; x < (value - value + i + 1); x++) {
不需要。
括号内可以用
2*(value-i-1)-1
但是,我建议你先分析问题,然后尝试解决它,而不是尝试随机的事情。例如,让我们考虑偶数和奇数输入的情况,即 2 和 3。
偶数案例(2)
*
***
***
*
分析
Row Index Number of Spaces Number of Stars
0 1 1
1 0 3
2 0 3
3 1 1
对于行索引 < 值
- 空格数 =
value - row index - 1
- 星星数 =
2 * row index + 1
对于行索引 >=value 空间和星星的数量只是颠倒了。在一些奇怪的情况下,情况也类似,只是有一个小例外。
奇例 (3)
*
***
*****
***
*
分析
Row Index Number of Spaces Number of Stars
0 2 1
1 1 3
2 0 5
3 1 3
4 2 1
一个小例外是,在反转时,我们必须忽略行索引 = 值。
现在,如果我们将上面的分析放在代码中,我们就得到了解决方案
//Define the Print Function
void PrintDiamond(int rowIndex, int value)
{
//print spaces v v v
for (int x = 0; x < value - rowIndex -1; x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < 2 * rowIndex + 1; y++) {
cout << "*";
}
cout << endl;
}
然后在main里面
//Row index < value
for (int i = 0; i < value; i++) {
PrintDiamond(i,value);
}
//For row index >= value reversing the above case
//value-(value%2)-1 subtracts 1 for even and 2 for odd cases
//ignore the row index = value in odd cases
for (int i = value-(value%2)-1; i >=0; i--) {
PrintDiamond(i,value);
}