C++星号与点金字塔实现求助:下半部分输出不符合预期
C++ 星号金字塔下半部分输出错误修复
我需要用C++实现由星号(*)和点(.)组成的金字塔,目前代码上半部分输出正确,但下半部分存在错误。输入size=4、n=7时,当前下半部分输出为.***、..**、...*,期望输出为***.、**..、*...。
原代码:
#include <iostream> using namespace std; int main() { int size, n; cin >> size; cin >> n; for (int R = 1; R <= size; R++) { if (R > n) { break; } for (int i = 1; i <= size; i++) { if (i > R) { cout << "."; } else { cout << "*"; } } cout << endl; } for (int R = 1; R <= size - 1; R++) { if (R > n) { break; } for (int i = 1; i <= size; i++) { if (i > R) { cout << "*"; } else { cout << "."; } } cout << endl; } return 0; }
当前输出:
*... **.. ***. **** .*** ..** ...*
期望输出:
*... **.. ***. **** ***. **.. *...
问题分析与修复
问题出在下半部分的内层循环判断逻辑:原逻辑是当i > R时输出星号,否则输出点,这会导致每行开头的点随R增大而增多,与期望结果完全相反。我们需要每行的星号数量从size-1递减到1,点的数量从1递增到size-1,可以通过两种方式修复:
方式1:调整内层判断条件
修改下半部分的内层循环判断逻辑,当i <= (size - R)时输出星号,否则输出点:
#include <iostream> using namespace std; int main() { int size, n; cin >> size; cin >> n; // 上半部分:从1个星号到size个星号 for (int R = 1; R <= size; R++) { if (R > n) { break; } for (int i = 1; i <= size; i++) { cout << (i > R ? "." : "*"); } cout << endl; } // 下半部分:从size-1个星号递减到1个星号 for (int R = 1; R <= size - 1; R++) { if (R > n) { break; } for (int i = 1; i <= size; i++) { cout << (i <= (size - R) ? "*" : "."); } cout << endl; } return 0; }
方式2:调整循环变量方向
让下半部分的R从size-1递减到1,直接复用上半部分的判断逻辑,代码更简洁:
#include <iostream> using namespace std; int main() { int size, n; cin >> size; cin >> n; // 上半部分:从1个星号到size个星号 for (int R = 1; R <= size && R <= n; R++) { for (int i = 1; i <= size; i++) { cout << (i > R ? "." : "*"); } cout << endl; } // 下半部分:从size-1个星号递减到1个星号 for (int R = size - 1; R >= 1 && R <= n; R--) { for (int i = 1; i <= size; i++) { cout << (i > R ? "." : "*"); } cout << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Shelly12
相关产品推荐
相关产品推荐

