You need to enable JavaScript to run this app. C++课程项目:控制台*号菱形打印无奇数星号致形状异常求助
优惠活动
大模型
产品
解决方案
定价
更多

C++课程项目:控制台*号菱形打印无奇数星号致形状异常求助

C++控制台菱形打印异常修复

核心异常根因

  • 重复输出最宽行:上半段循环执行到x=rowNum时已经打印了菱形最宽的中间行,下半段循环从x=rowNum开始又重复打印了同一行,直接造成结构冗余歪斜
  • 行宽未统一对齐:原循环里每行的总输出长度等于当前x值,并非和最长行等长,逐行长度递增/递减的逻辑会让星号无法居中排布,最终输出的每行星数是连续自然数,无法满足奇数个星的对称要求
  • 空格计数逻辑错位:原判断y <= rowNum - x的偏移值没有和行总宽度匹配,实际缩进量和预期居中位置偏差1-2个字符,控制台等宽字体下错位会被放大

修复实现逻辑

  1. 调整上下段循环边界,跳过重复的中间行:上半段走完最宽行后,下半段直接从rowNum-1开始倒序循环,消除冗余重复行
  2. 统一每行的总输出宽度为2*rowNum -1,即菱形最长行的星号总长度,保证所有行左右对齐
  3. 逐行匹配输出规则:先输出(最长行宽度 - 当前行星数)/2个前导空格,再输出对应数量的奇数个星号,保证星数逐行以2为步长增减,全程保持奇数

修复后可直接运行代码

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
    int rowNum;
    cout << " 请输入3-15之间的行数: " << endl;
    cin >> rowNum;

    if (rowNum >= 3 && rowNum <= 15) {
        int maxWidth = 2 * rowNum - 1;
        // 上半部分:从1个星递增到最长行的星数
        for (int x = 1; x <= rowNum; x++) {
            int starCount = 2 * x - 1;
            int spaceCount = (maxWidth - starCount) / 2;
            // 输出前导空格完成居中
            for (int y = 0; y < spaceCount; y++) {
                cout << " ";
            }
            // 输出星号
            for (int y = 0; y < starCount; y++) {
                cout << "*";
            }
            cout << endl;
        }
        // 下半部分:从次宽行递减回1个星,跳过已打印的最宽中间行
        for (int x = rowNum - 1; x >= 1; x--) {
            int starCount = 2 * x - 1;
            int spaceCount = (maxWidth - starCount) / 2;
            for (int y = 0; y < spaceCount; y++) {
                cout << " ";
            }
            for (int y = 0; y < starCount; y++) {
                cout << "*";
            }
            cout << endl;
        }
    } else {
        cout << "输入数字无效,请重试" << endl;
    }
    return 0;
}

修复效果

  • 任意输入3-15之间的整数,输出的菱形每行星数均为1、3、5……的奇数序列,无重复行、无错位
  • 所有行统一居中对齐,控制台等宽字体下输出规整,无歪斜畸形问题

内容的提问来源于stack exchange,提问作者Gus Robins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 02:45:04