以下是我必须做的事情:
你要编写一个程序,将一个由#符号组成的正方形绘制到网格上。用户将输入左下角的大小(边长),x坐标和y坐标 网格上的方块作为命令行参数按顺序编程。
换句话说,这三个值将存储在程序开头的String数组args中,作为值
args[0], args[1], and args[2]
。您可以使用命令Integer.parseInt()
将String转换为int。假设输入参数是有效的int。
例如,在DrJava的“交互”面板中:
在2 5 1 1上运行Que s ti 意味着我们想绘制一个边长为5的正方形,其左下角位于(1,1)位置。 此问题中的所有距离都是字符数。默认情况下,程序应该打印 平方到15x15网格上,但如果方形不合适,网格必须相应地延伸。
我试图分三个步骤构建我的程序。
编写代码以正确显示轴。
构建一个解决方案,其中方块始终适合15x15网格。
如何扩展程序,使其适用于较大的正方形或偏移太大以适应15x15网格的正方形。
到目前为止我的代码是:
import java.util.Scanner;
public class drawS {
public static void main(String[] args) {
Scanner ask = new Scanner(System.in);
int length = ask.nextInt();
int i;
int r = 15;
int xmax = 15;
int ymax = 15;
drowLine(length);
System.out.println();
if (i == 0 && j == 0) {
System.out.print("+");
}
if (i == 0 && j <= ymax) {
System.out.print("|");
}
if (j == ymax) {
System.out.print("^");
}
for (int j = ymax; j >= 0; j--) {
for (int i = 0; i <= xmax; i++) {
for (i = 0; i < length - 2; i++) {
drowEmptyLine(length);
System.out.println();
}
drowLine(length);
}
public static void drowLine ( int n){
for (int i = 0; i < n; i++) {
System.out.print("");
}
}
public static void drowEmptyLine ( int n){
System.out.print("");
for (int i = 0; i < n - 2; i++) {
System.out.print("# ");
}
System.out.print('#');
}
}
}
}
答案 0 :(得分:0)
显然是在挖一点坟墓:-)
首先,我们必须获取CLI上给出的args,并将其转换为经过清理的int。
public static void main(String[] args) {
try {
int size = Integer.parseInt(args[0]);
int x = Integer.parseInt(args[1]);
int y = Integer.parseInt(args[2]);
if (size < 1 || size > 30) {
System.out.println("Setting size to 5");
size = 5;
}
if (x < 0 || x > 30) {
System.out.println("Setting x to 2");
x = 2;
}
if (y < 0 || y > 30) {
System.out.println("Setting y to 2");
y = 2;
}
int height = Math.max(y + size + 1, 15);
int width = Math.max(x + size + 1, 15);
drawSquare(height, width, size, x, y);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
要绘制正方形,我们必须自上而下,因为我们使用的是CLI。另外,也可以填满一个大的char[][]
并将其打印在末尾-从上到下:-)。
部分代码中的整个“ -1”基本上是由于数组等基于0的事实。
static void drawSquare(int height, int width, int size, int x, int y) {
for (int line = height -1 ; line >= 0; line--) {
drawline(line, size, x, y, width);
}
}
行可以分为空行,即代表正方形的顶部和底部,以及代表正方形内容的空行。
static void drawline(int line, int size, int x, int y, int width) {
if (line > y + size - 1 || line < y) {
drawEmptyLine(width);
} else if (line == y + size - 1 || line == y) {
drawBorder(x, size, width);
} else {
drawContent(x, size, width);
}
}
空行很简单:
static void drawEmptyLine(int width) {
draw(emptyLine(width));
}
static char[] emptyLine(int width) {
char[] dots = new char[width];
Arrays.fill(dots, 0, width, '.');
return dots;
}
static void draw(char[] chars) {
StringBuffer sb = new StringBuffer(chars.length);
sb.append(chars);
System.out.println(sb);
}
边界线和内容线只是用一些散列替换空行中的点:
static void drawContent(int x, int size, int width) {
char[] dots = emptyLine(width);
dots[x] = '#';
dots[x + size - 1] = '#';
draw(dots);
}
static void drawBorder(int x, int size, int width) {
char[] dots = emptyLine(width);
Arrays.fill(dots, x, x + size, '#');
draw(dots);
}
就是这样。