在C#编程基础练习中,打印n行菱形是一个很经典的练习题,它能帮助开发者熟练掌握循环嵌套的使用逻辑,理解图形打印问题中行列数量的关系。解决这个问题的核心是先拆分菱形的结构,再分别处理每一行的输出内容。

菱形结构分析
一个完整的n行菱形(n为奇数)可以分为上下两个部分:上半部分是递增的三角形,下半部分是递减的三角形。我们需要先明确每一行的空格数量和星号数量的规律。
假设n是菱形的总行数,且n为奇数,那么上半部分的行数是(n+1)/2,下半部分的行数是(n-1)/2。对于第i行(从1开始计数):
- 如果是上半部分的第i行,空格数量为
(n-1)/2 - (i-1),星号数量为2*i - 1 - 如果是下半部分的第j行(j从1开始计数),空格数量为
j,星号数量为n - 2*j
完整实现代码
下面是一个通用的C#控制台程序,支持输入任意奇数n,打印对应的菱形:
using System;
namespace DiamondPrintDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入菱形的总行数(需要为奇数):");
// 读取用户输入的行数
int n = int.Parse(Console.ReadLine());
// 校验输入是否为奇数,不是则提示重新输入
if (n % 2 == 0)
{
Console.WriteLine("输入的行数不是奇数,无法打印完整菱形,请重新运行程序输入奇数。");
return;
}
// 计算上半部分行数
int topRows = (n + 1) / 2;
// 打印上半部分
for (int i = 1; i <= topRows; i++)
{
// 打印空格
for (int k = 1; k <= (n - 1) / 2 - (i - 1); k++)
{
Console.Write(" ");
}
// 打印星号
for (int s = 1; s <= 2 * i - 1; s++)
{
Console.Write("*");
}
// 换行
Console.WriteLine();
}
// 计算下半部分行数
int bottomRows = (n - 1) / 2;
// 打印下半部分
for (int j = 1; j <= bottomRows; j++)
{
// 打印空格
for (int k = 1; k <= j; k++)
{
Console.Write(" ");
}
// 打印星号
for (int s = 1; s <= n - 2 * j; s++)
{
Console.Write("*");
}
// 换行
Console.WriteLine();
}
}
}
}
代码逻辑说明
上述代码首先获取用户输入的行数,先校验是否为奇数,避免打印出残缺的菱形。之后拆分上下两部分分别处理:
- 上半部分循环从1到
(n+1)/2,每一行先计算需要打印的空格数,再打印对应数量的星号,最后换行 - 下半部分循环从1到
(n-1)/2,同样先计算空格数,再打印星号,完成换行操作
如果输入n为7,运行程序后输出的菱形效果如下:
* *** ***** ******* ***** *** *
常见错误与优化
新手在编写这类代码时容易出现的错误有:行数计算错误、空格和星号的数量关系搞反、忘记换行导致所有内容输出在同一行。如果要优化代码,可以把打印单行的逻辑封装成独立的方法,提高代码的复用性,比如:
static void PrintLine(int spaceCount, int starCount)
{
for (int i = 0; i < spaceCount; i++)
{
Console.Write(" ");
}
for (int i = 0; i < starCount; i++)
{
Console.Write("*");
}
Console.WriteLine();
}
之后在主程序中直接调用PrintLine方法即可,让代码结构更清晰。