在c#上创建一个空心矩形

时间:2018-06-08 19:23:20

标签: c# algorithm

我是编程的新手,我正在尝试用*创建一个空心矩形,我所做的还是一个完整的矩形。我仍在尝试开发一个空洞的。 我知道我做错了什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            int length, width;
            Console.WriteLine("Enter the length of the hollow rectangle:");
            length = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Enter the width of the hollow rectangle:");
            width = Convert.ToInt32(Console.ReadLine());

            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    if (i == 0 || i == length - 1 || j == 0 || j == width - 1)
                     Console.WriteLine("*");
                    else
                    Console.WriteLine("\n");
                }              
            }
                Console.ReadKey();

        }
    }

}

1 个答案:

答案 0 :(得分:1)

<强>调试

正如评论员所说,处理这种情况的最常见方法是逐步调试调试器,看看发生了什么。这是有效的,非常有价值,您应该/将会学习如何随着时间的推移这样做。

<强>可读性

我想说一下你的代码的可读性有多少可以帮助你避免和发现bug(并帮助你在这种情况下开发算法)。

<强>命名

是的,改进代码的命名和可读性有助于提高代码问题的处理能力。

让我们从ij以及lengthwidth开始。哪一个是哪个?现在不容易立即知道吗?

我们如何使用widthheight以及xy?如果你参加过数学课,你现在就知道哪一个是立即的。这总是一个加分。

var width = 10;
var height = 10;

for (var x = 0; x < width; ++x)
{
    for (var y = 0; y < height; ++y)
    {

    }
}

因此,这部分代码立即对我们更有意义。现在让我们进入内脏。

细分条件

i == 0 || i == length - 1 || j == 0 || j == width - 1这段代码必须一次又一次地进行双重检查。你会怀疑自己是否错过了某些东西,而作为一个初学者,你可能会忘记你打算做什么(有时我们最好的)。

拯救变量!

var isFirstRow = x == 0;
var isLastRow = x == width - 1;
var isFirstColumn = y == 0;
var isLastColumn = y == height - 1;
var isBorderPosition = isFirstRow || isLastRow || isFirstColumn || isLastColumn;

现在这些变量的名称非常明确吗?现在你知道你的目标是跟踪你是否在矩形的边界以及你如何确定你是否在那里。

Bug Finding&amp;逻辑

现在问题似乎更明显了吗?如果您处于边框位置,则打印星号否则打印新行

if (isBorderPosition)
    Console.WriteLine("*");
else
    Console.WriteLine("\n");

这只会产生一行星号不行吗?你想在那里的空间不是吗?以下怎么样?

if (isBorderPosition)
{
    Console.Write("*");
}
else
{
    Console.Write(" ");
}

if (isLastColumn)
{
    Console.WriteLine("");
}

这有效,但坚持一秒钟。是否封闭了矩形?因此,当我们刚刚打印出一个星号时,我们才会有新的界限。

if (isBorderPosition)
{
    Console.Write("*");
    if (isLastColumn)
    {
        Console.WriteLine("");
    }
}
else
{
    Console.Write(" ");
}

将它们整合在一起

var width = 10;
var height = 10;

for (var x = 0; x < width; ++x)
{
    for (var y = 0; y < height; ++y)
    {
        var isFirstRow = x == 0;
        var isLastRow = x == width - 1;
        var isFirstColumn = y == 0;
        var isLastColumn = y == height - 1;
        var isBorderPosition = isFirstRow || isLastRow || isFirstColumn || isLastColumn;

        if (isBorderPosition)
        {
            Console.Write("*");
            if (isLastColumn)
            {
                Console.WriteLine("");
            }
        }
        else
        {
            Console.Write(" ");
        }
    }
}

只需插入代码即可检索widthheight,您应该好好去。我希望这有助于您在将来更好地处理一些错误,或者至少让您意识到代码可读性有多大帮助。

注意

我写这篇文章的时候确实有一个错误,我使用调试器来逐步调试并帮助我意识到我的错误(我将isLastColumn if语句作为else-if语句所以它只是印刷水平线的星号而不是垂直的星号,呵呵)。