有人可以用简单的方法告诉我在C#中实现空心矩形吗?
我已经能够制作一个简单的矩形,但我看到的空心矩形程序包含在数组中,或者是数组还是非常复杂的。例如,another forum上的解决方案似乎过于具有挑战性,this answer on CodeReview.SE难以理解。
这就是我所做的,它显示了一个简单的(填充)矩形。如果可能,如何使用if
逻辑输出空心矩形?
class Nested_Loops_Hollow_Rectangles
{
public void RunExercise()
{
// how are now supposed to make this hollow?
// columns are side by side, rows is number of top to bottom
// see tut
Console.WriteLine("Welcome to the HollowRectanglePrinter Program.");
Console.WriteLine("How many columns wide should the rectangle be?"); //i.e. 4
int iColMax, iRowMax;
string userChoiceC = Console.ReadLine();
Int32.TryParse(userChoiceC, out iColMax);
Console.WriteLine("How many rows tall should the rectangle be? "); //i.e. 4
string userChoiceR = Console.ReadLine();
Int32.TryParse(userChoiceR, out iRowMax);
Console.WriteLine("Here you go:");
if (iRowMax > 0 || iColMax > 0)
{
for (int iRow = 0; iRow < iRowMax; iRow++)
{
for (int iCol = 0; iCol < iColMax; iCol++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
}
}
答案 0 :(得分:6)
您申请的基本部分可以简化为:
private void DrawFillRectangle(int width, int height)
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
顺便说一下(通过将逻辑放在专用方法中来分离逻辑和输入)就是你应该做的事情。有关详细信息,请参阅Separation of concerns。
上一个方法绘制一个填充的矩形,那么如何绘制一个空心的?
开始查看输出。例如,对于(5,3),输出为:
*****
*****
*****
你想要的是:
*****
* *
*****
你怎么能这样做?可能在某些情况下用空格代替星星。哪些?
好吧,再看一下输出。第一行是未触及的,因此使用空格而不是星形的条件仅限于第一行以外的行,即:
private void DrawRectangle(int width, int height)
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (y > 0)
{
// Print either a star or a space.
}
else
{
Console.Write("*");
}
}
Console.WriteLine();
}
}
现在,您必须在条件中包含其他案例:第一列,最后一列和行。
为了结合条件,您可以使用&&
和||
运算符。第一个意味着如果两个操作数都为真,则条件为真,第二个意味着第一个或第二个操作数为真。
可能您的最终状况将变得难以阅读。你可以做两件事。第一件事是使用中间变量。例如:
if (a && b && c && d)
{
}
可以重构为:
var e = a && b;
var f = c && d;
if (e && f)
{
}
如果将a
与b
和c
与d
重新组合是有意义的。您可以做的第二件事是将条件放在一个单独的方法中,如果您找到方法的好名称,这可能会提高可读性:
private void DrawRectangle(int width, int height)
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (this.IsInsideRectangle(x, y))
{
// Print either a star or a space.
}
else
{
Console.Write("*");
}
}
Console.WriteLine();
}
}
private bool IsInsideRectangle(int x, int y)
{
return y > 0 && ...
}
希望你能做所有这些练习。根据您在课程中的进展,您可能也会对这些方面感兴趣:
您可以避免在if/else
块中重复代码,而不是:
if (...)
{
Console.Write(" ");
}
else
{
Console.Write("*");
}
您最终只能写Write()
:
Console.Write(...)
你能用C# operator做什么?
在执行工作之前验证其输入的方法是一种很好的做法。如果您已经了解了哪些例外,那么如何使用它们来验证width
和height
?为什么在当前情况下不过滤负值和零值可能有意义(换句话说,如果width
等于-5
,应用程序会崩溃吗? )?
答案 1 :(得分:1)
class emptyRectangle:Shape
{
byte width;
byte height;
public emptyRectangle(byte width,byte height)
{
this.width = width;
this.height = height;
}
public override void area()
{
Console.WriteLine("\n----------");
for (int i = 0; i < height; i++)
{
Console.WriteLine("");
for (int k = 0; k < width; k++)
{
if (i > 0 && k > 0)
{
if (i < height - 1 && k < width - 1)
{
Console.Write(" ");
}
else
Console.Write('*');
}
else
Console.Write("*");
}
}
}
}
答案 2 :(得分:0)
在绘制角色的位置添加一个IF语句:
如果是第一行或最后一行或第一列或最后一列,请写下*
除了空间。
为了更有趣,在矩形中创建一个可变大小的矩形“洞”。
答案 3 :(得分:0)
static void Main()
{
int width = 0, height = 0;
width = int.Parse(Console.ReadLine());
height = int.Parse(Console.ReadLine());
for (int i = 1; i <= height; i++)
{
for (int j = 1; j <= width; j++)
{
if ((i == 1 || i == height || j == 1 || j == width))
Console.Write("*");
else
Console.Write(" ");
}
Console.WriteLine();
}
Console.ReadKey();
}