0

我必须使用方法创建一个十字形,参数是十字的“大小”。输入一个数字,如果数字是奇数则画叉,所以如果我输入一个 5,输出看起来就像我添加到底部的屏幕截图

中心线是真正让我失望的,因为我上周才开始使用方法,但到目前为止我有:

import java.util.Scanner;

public class Cross {

    public static void main(String[] arg) {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please type a number: ");
        int num = keyboard.nextInt(); 
        drawCross(num);
    }

    public static void drawCross(int num){
        for (int = 1; i <= num; i++) {
            if ((num % 2) != 0) {
                System.out.println(i + "*");
            }
        }
    }

}

我知道这可能很遥远,但我是方法的新手。

截屏:

4

4 回答 4

5

在开始编程之前分析问题。将任务分解为步骤:

  1. 检查是否num对这个问题有效。
    • num必须是积极的。
    • num一定很奇怪。
    • 请注意,您正在检查是否num多次有效。num在开始时检查它,如果无效则退出并显示错误消息。或者,抛出异常,并main捕获并报告给用户。
      • 在你知道如何使用异常之后,就是这样。
    • 顺便说一句,num这个变量的名字不好。太笼统了。除了循环索引,尽量让你的名字具有描述性。
  2. *计算除中心输出行之外的所有空格之前必须有多少空格。
  3. 计算哪条线是中心输出线。
  4. 对输出的上半部分进行循环。
    • 不要System.out.println()用于单个字符。
    • 该方法每行只应调用一次。
  5. 打印中心线。
  6. 为输出的下半部分循环。

现在,您应该尝试停止在main其他静态方法中执行所有操作。 Cross是一个类,您应该创建该类的一个实例并让它完成工作。

public class Cross {
    public static void main(String[] arg) {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please type a number: ");
        int num = keyboard.nextInt();
        Cross cross = new Cross();
        cross.drawCross(num);
    }

    private void drawCross(int size) {
        // Your turn.
    }
}

为什么?所以你可以测试它。Java 编程中最宝贵的工具之一是 JUnit 库。您将希望将您的逻辑卸载到微小的方法中,例如:

public boolean validSize(int size) {
    // You fill this in.
}

在测试类中CrossTest,您将编写如下代码:

@Test
public void negativeSizesAreIllegal() {
    Cross cross = new Cross();
    // Test whether cross.validSize(-13) returns false.
    // Look at the JUnit web site or any book describing the tool.
}

弄清楚你对方法的要求是什么,并编写测试来检查每一个。对于 0、奇数和偶数,您也会有类似的测试。但是如果你在静态方法中编写所有代码,那就更难了。这样,当您更改程序时,您将知道您的更改是否破坏了您的测试。这就像计算一个不定积分,然后对其进行微分以检查您是否犯了错误。

最后,简化您的工作。我概述你的问题的方式,会有很多代码重复。看看能不能写个方法来替换第4步和第6步的重复代码,调用两次。继续前进;你会看到很多缩短程序的机会。进行测试对此非常宝贵。您还可以使用java.lang.String类中的标准方法来进一步简化事情。

你看见了吗

System.out.println(i + "*");

没有做你认为的那样?

于 2013-11-12T23:37:36.163 回答
0

不是最佳解决方案。但是我在 2 分钟内想出了这个:

public static void drawCross(int num){
    if (num % 2 != 0)  {
     for(int i = 0; i < num; i++) {
            for(int j = 0; j < num; j++) {
                if((i == num / 2) || (j == num / 2)) 
                    System.out.print("*");
                else 
                    System.out.print(" ");
            }
            System.out.println();
        }
    }
}
于 2013-11-12T23:07:30.653 回答
0

这是一些应该可以工作的代码:

public static void drawCross(int num)
{
    if(num % 2 != 0) //if "num" is odd
    {
        for(int y = 0; y < num; y++) //loop through the following code "num" times
        {
            for(int x = 0; x < num; x++) //loop through the following code "num" times
            {
                if(x == (int)(num / 2) || y == (int)(num / 2)) //if "x" or "y" is in the middle
                    /*(note that at this point "num" will always be odd, so "num / 2" will always 
                    be #.5. That's why the "(int)" is there: to change it from "#.5" to "#"*/
                {
                    System.out.print("*"); //print "*"
                }
                else //if "x" or "y" is NOT in the middle
                {
                    System.out.print(" "); //print a space
                }
            }
            System.out.println(); //create a new line
        }
    }
}
于 2013-11-12T23:11:24.073 回答
-1
public static void drawCross(int num){
    if(num % 2 != 0){
        for(int line = 0;line < num;line++){
            for(int col = 0;col < num;col++){
                if(line == num / 2 || col == num / 2) System.out.print("*");
                else System.out.print(" ");
            }
            System.out.println("");
        }
    }
}
于 2013-11-12T22:58:50.357 回答