如何修改C语言代码以实现指定行数的特定星号图形输出?
C语言星号图形输出问题修正
问题描述
需实现C语言程序,根据用户输入的奇数行数打印特定样式星号图形:
- 输入7行预期输出:
**
*
**
- 输入5行预期输出:
**
*
**
现有代码运行后不符合预期,例如输入9行时输出:
**
*
**
需修改代码以得到正确图形。
现有代码
#include <stdio.h> int main() { int n, i, j, k; // 提示用户输入行数 printf("请输入要绘制的行数: "); scanf("%d", &n); // 验证输入是否为奇数 if (n % 2 == 0) { printf("行数必须为奇数。\n"); return 1; } // 打印图形上半部分 for (i = 0; i < n/2+1; i++) { for (j = 0; j < i; j++) { printf(" "); } for (k = 0; k < n/2+1-i; k++) { printf("*"); } printf("\n"); } // 打印图形下半部分 for (i = n/2-1; i >= 0; i--) { for (j = 0; j < i; j++) { printf(" "); } for (k = 0; k < n/2+1-i; k++) { printf("*"); } printf("\n"); } return 0; }
问题分析与修正
现有代码的核心问题是下半部分的空格逻辑错误:上半部分通过递增空格、递减星号实现了从多到少的星号排列,但下半部分错误地沿用了上半部分的空格递减逻辑,导致图形呈现对称缩进,不符合需求。
正确的逻辑应为:下半部分所有行的缩进需与中间行(星号最少的行)保持一致,星号数量从2开始递增至与第一行相同。
修改关键点
- 新增
mid变量存储n/2,简化重复计算,明确中间行的空格数与星号基准值 - 下半部分空格循环改为固定打印
mid个空格,确保缩进统一 - 下半部分星号数量从2开始,每次循环递增1,直至达到
mid+1个(与上半部分首行星号数一致)
修正后的代码
#include <stdio.h> int main() { int n, i, j, k; int mid; // 提示用户输入行数 printf("请输入要绘制的行数: "); scanf("%d", &n); // 验证输入是否为奇数 if (n % 2 == 0) { printf("行数必须为奇数。\n"); return 1; } mid = n / 2; // 打印图形上半部分(从最多星号到中间行的1个星号) for (i = 0; i <= mid; i++) { // 打印i个空格 for (j = 0; j < i; j++) { printf(" "); } // 打印(mid + 1 - i)个星号 for (k = 0; k < mid + 1 - i; k++) { printf("*"); } printf("\n"); } // 打印图形下半部分(从2个星号递增到最多星号) for (i = 1; i <= mid; i++) { // 固定打印mid个空格 for (j = 0; j < mid; j++) { printf(" "); } // 打印(i + 1)个星号 for (k = 0; k < i + 1; k++) { printf("*"); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Grimm
相关产品推荐
相关产品推荐

