1

我被要求提高空间效率,我假设我需要使用循环,但我不完全确定如何使用,将不胜感激。

(作为参考,这段代码的目的是使用已经在另一个程序中收集的数据将图形显示到另一个程序中)

 public class StudentChart 
{
    public StudentChart(int[] moduleMarks)  //Constructor
    {
        Bar y = new Bar();
        y.makeVisible();
        y.changeSize(1, 100);
        y.moveVertical(100);
        y.moveHorizontal(-1);
        y.changeColour(Colour.BLACK);
        //y-axis is produced
        Bar x = new Bar();
        x.makeVisible();
        x.changeSize(200,1);
        x.moveVertical(200);
        x.changeColour(Colour.BLACK);
        //x-axis is produced
        draw(moduleMarks);
        printSummary(moduleMarks);
    }

    public static void draw(int[] moduleMarks)
    {

        int a = moduleMarks[0];
        int b = moduleMarks[1];
        int c = moduleMarks[2];
        int d = moduleMarks[3];
        int e = moduleMarks[4];
        int f = moduleMarks[5];
        //stores module marks from array as variables to be used later
        Bar mod1 = new Bar();
        Bar mod2 = new Bar();
        Bar mod3 = new Bar();
        Bar mod4 = new Bar();
        Bar mod5 = new Bar();
        Bar mod6 = new Bar();

        mod1.makeVisible();
        mod2.makeVisible();
        mod3.makeVisible();
        mod4.makeVisible();
        mod5.makeVisible();
        mod6.makeVisible();
        //Bars are initialised and made visible
        mod1.moveVertical(200-a);
        mod2.moveVertical(200-b);
        mod3.moveVertical(200-c);
        mod4.moveVertical(200-d);
        mod5.moveVertical(200-e);
        mod6.moveVertical(200-f);
        //Bars are moved based on their height so that they touch the x-axis
        mod1.changeSize(15, a);
        mod2.changeSize(15, b);
        mod3.changeSize(15, c);
        mod4.changeSize(15, d);
        mod5.changeSize(15, e);
        mod6.changeSize(15, f);
        //Bar height changes depending on the module marks
        mod1.moveHorizontal(0);
        mod2.moveHorizontal(35);
        mod3.moveHorizontal(70);
        mod4.moveHorizontal(105);
        mod5.moveHorizontal(140);
        mod6.moveHorizontal(175);
        //Bars are moved across so can be seen on chart
        if (a<35)
        {
            mod1.changeColour(Colour.RED);
        }
        if (a>= 35 && a<40)
        {
            mod1.changeColour(Colour.YELLOW);
        }   
        if (a>= 40 && a<70)
        {
            mod1.changeColour(Colour.GREEN);
        }
        if (a>= 70)
        {
            mod1.changeColour(Colour.MAGENTA);
        }

        if (b<35)
        {
            mod2.changeColour(Colour.RED);
        }
        if (b>= 35 && a<40)
        {
            mod2.changeColour(Colour.YELLOW);
        }   
        if (b>= 40 && a<70)
        {
            mod2.changeColour(Colour.GREEN);
        }
        if (b>= 70)
        {
            mod2.changeColour(Colour.MAGENTA);
        }

        if (c<35)
        {
            mod3.changeColour(Colour.RED);
        }
        if (c>= 35 && a<40)
        {
            mod3.changeColour(Colour.YELLOW);
        }   
        if (c>= 40 && a<70)
        {
            mod3.changeColour(Colour.GREEN);
        }
        if (c>= 70)
        {
            mod3.changeColour(Colour.MAGENTA);
        }

        if (d<35)
        {
            mod4.changeColour(Colour.RED);
        }
        if (d>= 35 && a<40)
        {
            mod4.changeColour(Colour.YELLOW);
        }   
        if (d>= 40 && a<70)
        {
            mod4.changeColour(Colour.GREEN);
        }
        if (d>= 70)
        {
            mod4.changeColour(Colour.MAGENTA);
        }

        if (e<35)
        {
            mod5.changeColour(Colour.RED);
        }
        if (e>= 35 && a<40)
        {
            mod5.changeColour(Colour.YELLOW);
        }   
        if (e>= 40 && a<70)
        {
            mod5.changeColour(Colour.GREEN);
        }
        if (e>= 70)
        {
            mod5.changeColour(Colour.MAGENTA);
        }

        if (f<35)
        {
            mod6.changeColour(Colour.RED);
        }
        if (f>= 35 && a<40)
        {
            mod6.changeColour(Colour.YELLOW);
        }   
        if (f>= 40 && a<70)
        {
            mod6.changeColour(Colour.GREEN);
        }
        if (f>= 70)
        {
            mod6.changeColour(Colour.MAGENTA);
        }
        //Colour changes depending on module mark
        //Could be improved
    }

    public static void printSummary(int[] moduleMarks)
    {
        for(int i =0; i<moduleMarks.length; i=i+1)
        {
            System.out.println("Module "+ (i+1) + " " + moduleMarks[i]);
        }
        //Prints module marks in a table
    }

    public static void main(String[] args)
    {

    }
}
4

4 回答 4

2

你可以这样做:

    int horizontalMovement = 0;
    for (int moduleMark : moduleMarks) {
        Bar bar = new Bar();
        bar.makeVisible();
        bar.moveVertical(200 - moduleMark);
        bar.changeSize(15, moduleMark);
        bar.moveHorizontal(horizontalMovement);
        horizontalMovement = horizontalMovement + 35;
        if (moduleMark < 35) {
            bar.changeColour(Colour.RED);
        } else if (moduleMark < 40) {
            bar.changeColour(Colour.YELLOW);
        } else if (moduleMark < 70) {
            bar.changeColour(Colour.GREEN);
        } else {
            bar.changeColour(Colour.MAGENTA);
        }
    }
于 2013-11-07T16:13:36.263 回答
0

你可以在这里做很多事情:

    int a = moduleMarks[0];
    int b = moduleMarks[1];
    int c = moduleMarks[2];
    int d = moduleMarks[3];
    int e = moduleMarks[4];
    int f = moduleMarks[5];

在这里你可以创建一个 int 数组:

int modules[] = new int[moduleMarks.length()];

然后你可以通过一个for循环并添加:

for(int i = 0; i < 6; i++) {
   modules[i] = moduleMarks[i];
}

您可以以此为灵感对其余代码进行类似的更改。

于 2013-11-07T16:10:18.430 回答
0

现在这段代码只有在 moduleMarks 中的元素只有 6 个元素长时才有效。如果该数组中有 9 个元素,则只会绘制前 6 个元素。Sorta 使此代码不是非常有用。但是,您可以编写代码来接受任意长度的数组并做出相应的响应。

在给定的代码中,您已经获得了如何启动该过程的提示:

for(int i =0; i<moduleMarks.length; i=i+1)
{
    System.out.println("Module "+ (i+1) + " " + moduleMarks[i]);
}

这将遍历 moduleMark 的每个成员,而不管长度如何。所以你需要把这个想法应用到你程序的其余部分,这样无论 moduleMark 的大小如何,无论 draw 正在做什么都可以工作。

您会看到对于与 moduleMark 中的成员相对应的每个元素,都有很多重复的代码。使用循环来减少重复的代码。您必须使用数据(即数组)对事物进行建模,以便使用 for 循环重写该代码。

我尽量不给出答案,因为这显然是家庭作业,你应该自己弄清楚。

于 2013-11-07T16:15:56.510 回答
-3

将条形图放入数组 (Bar[])。将你的 moduleMarks 保存在它们最初进入的数组中。然后你可以使用一个循环或一组嵌套循环:

 for(int i = 0; i < modArray.size; ++i) {
      modArray[i].makeVisible();
      modArray[i].moveVertical(200-moduleMarks[i]);
      modArray[i].changeSize(15, moduleMarks[i]);
      modArray[i].moveHorizontal(35*i);

      //etc.
 }
于 2013-11-07T16:13:12.070 回答