首页 > 解决方案 > 如何用星号打印星号图案

问题描述

我正在为我的学校图书馆做这个,我需要用 * 打印如下星号模式

*     *
 *   *
  ***
*******
  ***
 *   *
*     *

以下是我尝试过的,

using System;
using System.Text;

namespace Patterns
{
    class Asterisks
    {
        static void Main(string[] args)
        {
            int n = 7;
            
            for(int i = 1; i<=n; i++){
               for(int j =1; j<=n; j++){
                 if(j==i || j==n-i+1 || i==n/2+1){
                    Console.Write("*");
                 }else{
                    Console.Write(" ");
                 }
              }
               Console.WriteLine();
            }

        }
    }
}
      

以下输出:

*     *
 *   *
  * *
*******
  * *
 *   *
*     *

我上面的逻辑是错误的,我尝试了对循环和条件的几个编辑,但在某个地方我出错了。需要帮助来解决这个问题。谢谢

标签: c#

解决方案


将模式分成几部分,并分别为它们编写检查。如果任何一项检查通过,则打印一个*,否则打印一个空格。这似乎是您已经在做的事情。您似乎只是在 if 语句中遗漏了一些析取词。

现在,您打印 a 的条件*是:

j==i || // the "\" part
j==n-i+1 || // the "/" part
i==n/2+1 // the "-" part

你真的只需要一个条件,这两个缺失的位置会匹配。检查这一点的一种方法是检查列 ( j) 是否是中间列,以及行 ( i) 是否与中间行相距一格。

j == n / 2 + 1 && (i == n / 2 + 2 || i == n / 2)

你的条件有很多+ 1s。如果您从 0 开始循环,则可以删除它们n / 2。您可以提取到一个变量,而不是一直重复。

你的代码最终是这样的:

int n = 7;
int midRow = n / 2;

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        if (j == i ||
            j == n - i - 1 ||
            i == midRow ||
            j == midRow && (i == midRow + 1 || i == midRow - 1))
        {
            Console.Write("*");
        }
        else
        {
            Console.Write(" ");
        }
    }
    Console.WriteLine();
}

输出:

*     *
 *   * 
  ***  
*******
  ***  
 *   * 
*     *

推荐阅读