我在绘制以下方格时遇到了麻烦:
* # # # # #
* * # # # #
* * * # # #
* * * * # #
* * * * * #
* * * * * *
这是我写的方法,但它不应该正常工作:
public void Draw(int width){
char asterisk = '*';
char hash = '#';
int counter = 0;
for (int h = 0; h < 6; h++) { //height?
for (int w = 0; w < width; w++) {
if (h == counter)
Console.Write (asterisk);
else
Console.Write (hash);
}
counter++;
Console.WriteLine ();
}
Console.WriteLine ();
}
关于我应该做什么的任何建议? 我知道,当它是第一行时它应该只绘制一个星号,当它是第二行时两个星号等等,但我真的不知道该怎么做那..请帮忙。
答案 0 :(得分:5)
您可以将条件从if (h == counter)
更改为if (h >= w)
,而不是使用计数器值。
答案 1 :(得分:3)
使用h == counter
w <= counter
此外,您可以删除counter
,因为它始终等于h
答案 2 :(得分:1)
为什么你不使用像这样的重复构造函数。
public void Draw(int width){
int w_counter = 1;
for (int l = 0; l < 6; l++) {
var asterisk = new String('*', w_counter);
var hash = new String('#', width - w_counter);
Console.WrilteLine(asterisk + hash);
w_counter++;
}
}
答案 3 :(得分:1)
本课程旨在教导学生使用嵌套循环,并了解内循环的每个实例都可以访问外循环的状态。不幸的是,大多数老师不明白他们教学的内容,只是给你解决问题而不解释为什么练习是有用的。
因为你总是想要与你所在的行完全相同的星数,所以你应该直接比较列索引和当前行。
public void DrawSquare(int sideLength)
{
for(int row = 1; row <= sideLength; row++)
{
for (int col = 1; col <= sideLength; col++)
{
if (col <= row)
Console.Write('*');
else
Console.Write('#');
}
Console.WriteLine();
}
}
有许多快捷方式和c#技巧可以让你更快,但这是你应该尝试做的事情的本质。
答案 4 :(得分:0)
由于counter
始终等于h
,因此您将获得所有星号。与行号w
相比,行上的字符位置h
决定了要打印的字符。因此,将条件更改为w <= h
此外,由于您要打印正方形,因此高度和宽度将具有相等的边长。将方法签名更改为
public void DrawSquare(int sideLength)
然后,两个循环都必须针对sideLength
测试循环变量。
答案 5 :(得分:0)
实际上我正在寻找一些不错的算法来编写,所以这里是我的解决方案只有1个for循环:
private static void Draw(int width)
{
int numOfS = 1;
string temp = "";
int numOfH = width-1;
int t1, t2;
for (int i = 0; i < width; i++)
{
t1 = numOfS;
t2 = numOfH;
while (t1 > 0)
{
temp += "*";
t1--;
}
while (t2 > 0)
{
temp += "#";
t2--;
}
Console.WriteLine(temp);
numOfH--;
numOfS++;
temp = "";
}
}