这是经过评估的工作,所以请不要给出答案,只是建议!
我试图让我的程序返回字符串传递,补偿传递或失败,具体取决于用户输入的值。但是,它没有返回值,而且我收到了“加权”错误。早些时候它工作,但不是以合适的方式,因为它不会总是在结果之前返回正确的结果。我添加了阵列因为我认为需要什么,但现在我只是得到一个错误。欢呼声。
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);
}
}
答案 0 :(得分:0)
weighting
和marks
是不同长度的数组,但您正在进行循环
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放在底部。在大型项目中,它有助于保持良好的风格,因为它使代码更易于阅读和理解。
这些参考资料可能有助于您了解更多信息: