1

这是评估工作,所以请不要给出答案,只是建议!

我试图让我的程序根据用户输入的值返回字符串通过、补偿通过或失败。但是,它没有返回值,并且我收到“加权”错误。早些时候它正在工作,但不是以合适的方式,因为它并不总是返回正确的之前结果。我添加了数组,因为我认为这是需要的,但现在我得到了一个错误。干杯。

enter code here

public class MarkCalculator {
static int[] marks = new int[12];
static int[] weighing = new int[6];

// public static Scanner keyboard = new Scanner(System.in);
public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    int weighting;
    int coursework;
    int exammark;

    for (int i = 0; i < marks.length / 2; i++) {
        System.out.println("Please enter course work weighting");
        weighting = kb.nextInt();
        weighing[i] = weighting;
    }

    for (int i = 0; i < marks.length / 2; i++) {
        System.out.println("Please enter course work mark ");
        coursework = kb.nextInt();
        marks[i] = coursework;
    }

    for (int i = 0; i < marks.length / 2; i++) {
        System.out.println("Please enter exam mark ");
        exammark = kb.nextInt();
        marks[i + 6] = exammark;
    }

    System.out.println("Calculating Marks");
    MarkCalculator mc = new MarkCalculator();
    String[] results = mc.computeMarks(marks, weighing);

    for (String result : results) {

        System.out.println("Results are " + result);
    }

}

public String[] computeMarks(int[] marks, int[] weighing) {
    int[] formula = new int[12];
    String[] results = new String[weighing.length];

    for (int i = 0; i < weighing.length; i++) {
        int exam = marks[i];
        int cw = marks[i+weighing.length];
        int weight = weighing[i];

        formula [i]= ((cw + weight) + (exam * (100 - weight)) / 100);

        if ((formula[i]<=39) && (formula[i] > 35)) {
            results[i] = "COMPENSATION PASS";}

        else if (formula[i] >= 40) {
            results[i] = "PASS";
        } 
        else {
            results[i] = "FAIL";
        }
    }
    return results;
}

public static void computeResult (int[] coursework, int[] exammark)
{

    computeResult(coursework,exammark);




}

}

4

4 回答 4

0

由于您也要求提供改进程序的提示,但没有特定代码,那么我会考虑执行以下操作:

1) 为考试和 cw 标记设置单独的数组。通过将它们连接在一起,您很难自己调试程序,这也是您的错误的根源。

2)假设你总是有与你做 cw 元素相同数量的考试,那么我会考虑在其中存储一个类变量MarkCalculator来存储测试的数量。像这样的东西:

private static int NUM_TESTS.

这样你就可以像这样初始化数组:

private static int[] examMarks = new int[NUM_TESTS]

你可以computeMarks像这样循环:

for (int i = 0; i < NUM_TESTS; i++)

这样,如果您决定要进行更多测试,您只需在一个地方更新代码。更改程序也很容易,以便用户可以定义应该计算多少测试。

3) 你在哪里:

weighting = kb.nextInt();
weightings[i] = weighting;

将其替换为:

weightings[i] = kb.nextInt();

因为可变权重似乎只在这个地方使用,因此是不必要的。这将减少程序必须执行的操作并减少屏幕上的代码量。在实践中,编译器可能会删除这个冗余变量,但最好考虑一下您正在执行多少操作以及哪些操作是不必要的。

4) 更好的做法是在类中的字段上显式设置访问修饰符。所以你应该有:

'私人静态int []权重=新int [NUM_TESTS];`

如果你想从另一个类访问它,你通常会指定一个 getter 方法,如下所示:

public int[] getWeightings() { return weightings; }

5)这不太重要,但我会移到main班级的底部。在 Java 中,更典型的是首先查看类字段,然后是构造函数,然后是公共方法,然后是私有方法,并且在底部有 main。在大型项目中,它有助于保持良好的风格,因为它使代码更易于阅读和理解。

这些参考资料可能会帮助您了解更多信息:

Java 编码风格指南

Oracle 访问修饰符教程

于 2013-11-07T13:32:19.257 回答
0

weighting并且marks是不同长度的数组,但您正在执行循环

for (int i = 0; i < marks.length; i++)

这将超出范围weightingwhen i > 5

看起来你需要做这样的事情:

for (int i = 0; i < weighting.length; i++) {
        int cw = marks[i];
        int exam = marks[i+weighting.length];
        int weight = weighing[i];

但这取决于您如何在marks数组中存储 cw 和考试的分数。我建议为 cw 和考试创建单独的数组,因为它们是不同的项目,并且会让你自己更容易阅读和调试。

于 2013-11-07T12:14:24.200 回答
0

作为评论发布:

您可以将标记分成两个更易于调试的数组吗?此外,您似乎可能正在查看数组索引以获取此行的权重

for (int i = 0; i < marks.length;i++) 
{ 
    int exam = marks[i]; 
    int cw = marks[i]; 
    int weight = weighing[i]; // Error is here
    //...
}

因为“称重”的范围是 0-5,而您正在循环到 0-11(使用标记数组)

于 2013-11-07T12:17:10.257 回答
0

您将遇到错误,如“线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:6”

这是因为在方法 computeMarks. 标记 (int[]) 的长度为 12。

你只需声明一个长度为 6 的变量来处理:

int[] formula = new int[6];

当 for 循环中的变量 i 达到 6 时。以下代码将抛出错误。

formula [i]= ((cw + weight) + (exam * (100 - weight)) / 100);

尝试声明它的长度为 12。

int[] formula = new int[12];

只需粘贴方法computeMarks的代码。

public String[] computeMarks(int[] 标记,int[] 称重) { int[] 公式 = new int[12]; 字符串 [] 结果 = 新字符串 [称重长度];

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < weighing.length; i++) {
        sb.setLength(0);

        int exam = marks[i];
        int cw = marks[i + weighing.length];
        int weight = weighing[i];
        formula[i] = ((cw + weight) + (exam * (100 - weight)) / 100);

        if ((formula[i] <= 39) && (formula[i] > 35)) {
            sb.append("COMPENSATION PASS");
        } else if (formula[i] >= 40) {
            sb.append("PASS");
        } else {
            sb.append("FAIL");
        }
        sb.append(" cw mark is ").append(cw).append(" and exam mark is ")
                .append(exam);
        results[i] = sb.toString();
    }
    return results;
}
于 2013-11-07T12:18:12.940 回答