嗨我想绘制一个正方形,其中*为大纲,点位于中间,大小范围为4-20。
*****
*...*
*...*
*...*
*****
我很难让高度与长度相等。 这是我的代码,请你帮忙..谢谢
class Main
{
public static void printSquare( int size )
{
if ( size >= 20 && size >= 4)
{ size = 4; }
int squareLenght = size;
int i = 1;
int p = 1;
if ( p <= size )
{
int t = 1;
while ( t <= squareLenght )
{
System.out.print( "*" );
t = t + 1;
}
}
System.out.println(); // Newline
i = i + 1;
while ( i <= squareLenght )
{
int d = 1;
int s = 1;
if ( s < squareLenght );{
System.out.print( "*" );
s = s + 1;
}
while ( d < size-1 )
{
System.out.print( "." );
d = d + 1;
}
System.out.println( "*" );
i = i + 1;
}
if ( p <= size )
{
int t = 1;
while ( t <= squareLenght )
{
System.out.print( "*" );
t = t + 1;
}
}
System.out.println();
i = i + 1;
}
}
答案 0 :(得分:2)
由于此行,您在正文中打印了太多行(在边框之间):
while ( i <= squareLenght )
它应该是while ( i < squareLenght)
或 while ( i <= squareLenght - 1 )
,因为中间应该有2个边框和size - 2
行组成高度。
此外,这没有任何意义:
if ( size >= 20 && size >= 4)
{ size = 4; }
也许是你想要的范围:
if (size > 20) size = 20;
else if (size < 4) size = 4;
无论如何,你的代码对于不必要的if
语句以及事物的整体结构有点混乱。 for
循环也是一个好主意,你有while
循环的初始化,条件和修饰符/增量。我不会为你改变它,因为它听起来像是家庭作业。
无论如何你想要把它搞定,想想你正在做的事情的实际结构和模式,因为它很简单:
size
个星号('*'
)和一个新行(顶部边框)size - 2
次:(如果size
为5,则边框之间有3条线,即size - 2
)
'*'
'.'
size - 2
次'*'
size
个星号('*'
)和一个新行(底部边框) 编辑:我知道您已将问题标记为已回答,但我只是建议您使用printRepeatedly(char c, int count)
之类的功能来减少您重复的循环次数(它只是一个for
循环和一个打印语句。)
我刚刚重写了您的代码,我只需要printSquare
中的11行代码,加上printRepeatedly
中的2代码。如果你要重复代码,你应该几乎总是使用函数/方法。
答案 1 :(得分:1)
问题在于你的一个while循环中的条件。
while ( i <= squareLenght )
应该是:
while ( i < squareLenght )
答案 2 :(得分:1)
这是很多代码做你想做的事情; )
没有参加“代码混淆”比赛,有几种方法可以缩短它。
像这样:
public static void printSquare( int size ) {
final int n = Math.max( 4, Math.min(20, size) );
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
System.out.print( x == 0 || y == 0 || x == n - 1 || y == n - 1 ? "*" : "." );
}
System.out.println();
}
}