数组不返回字符串

时间:2013-11-07 12:06:25

标签: java arrays

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

我试图让我的程序返回字符串传递,补偿传递或失败,具体取决于用户输入的值。但是,它没有返回值,而且我收到了“加权”错误。早些时候它工作,但不是以合适的方式,因为它不会总是在结果之前返回正确的结果。我添加了阵列因为我认为需要什么,但现在我只是得到一个错误。欢呼声。

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 个答案:

答案 0 :(得分:0)

weightingmarks是不同长度的数组,但您正在进行循环

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

weighting时会超出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和考试创建单独的数组,因为它们是不同的项目,并且会让你自己更容易阅读和调试。

答案 1 :(得分: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(带有标记数组)

答案 2 :(得分:0)

你会遇到一个错误,因为“线程中的异常”主“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 [] marks,int []称量){         int [] formula = new int [12];         String [] results = new String [weigh.length];

    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;
}

答案 3 :(得分: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)最好在类中的字段上显式设置访问修饰符。所以你应该:

'private static int [] weightings = new int [NUM_TESTS];`

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

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

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

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

Java Coding Style Guide

Oracle Tutorial on access-modifiers