这个问题不适合胆小的人,而且会很费时。
我正在学习Java,我想知道是否有人能让我通过我的程序告诉我我做错了什么,以及如何修复它,以便我能够学习。
我的整个程序(如果需要的话):http://pastie.org/private/xpbgpypetvfmivcs88gbcq
任务:
不允许使用全局变量!你被要求编写一个程序来对一个真实的、错误的测试结果进行评分,并以表格的形式显示结果。这个测验由10个问题组成。该问题的数据文件包括1组正确的回答(答案键)在第一行和随后的行包含一个四位数字的学生识别号码,然后是该学生的10个回应。(目前不知道参加测验的学生人数。) 数据文件的形式如下: TFFTFTTFTT 0461 TTFTTFTFTT 3218 TFFTTTTTFT . ... 您的程序应该读取密钥并将其存储在一维数组中。然后,它应该读取并处理接下来的每一行,将学生标识号存储在一个一维数组中,将分数存储在两个独立的一维数组中--一个用于数字年级,另一个用于字母等级。 数字等级按照以下系统转换为字母: A(10)、B(9)、C(8-7)、D (6-5)、F(4-0)。 程序输出应包括以下内容:
编辑:
哦,嘿。对不起,我还在掌握怎么做这一切的窍门:(好的,开始了。)
这个程序没有编译,我很确定这是我的逻辑所致。(还有一些句法)。
我遇到的问题是: 1)如何将所有参数传递给每个不同的方法,如这里所示。我想要做的是让我返回的所有值(如answerKey、studentAnswers、numericGrade、average等)都在这里,这样我就可以使用它们并打印它们。但我不知道怎么做。
int[] numericGrade = computeNumericGrade(answerKey, studentAnswers);
int[] letterGrade = computeLetterGrade(numericGrade);
double average = average(numericGrade);
int gradeTally = gradeTally(letterGrade);
int studentCount = studentCount(numericGrade);2)我不知道如何单独检查每个T或F值,并检查它是否与答案键中的T或F相对应,如下所示。
我要做的是在一个特定的元素上检查每个字母,如果值是“正确的”或==为answerKey,那么添加到该元素的总numericGrade中。
public static int[] computeNumericGrade(int[] answerKey, int[] studentAnswers) {
int[] numericGrade = new int[50];
int total = 0;
for(int i = 0; i < 50;i++) {
for(int a = 0;a == 10;a++) {
total = studentAnswers[i].charAt(a);
if(total == answerKey[i]) numericGrade[i]++;
}
}
return numericGrade;
}3)我不知道如何返回所有这些不同的价值观,因为我需要它们!我想要这组代码检查每个元素的字母等级,如果找到这个元素,++对应它的变量,所以我知道有多少这个字母级别被调用了。
public static int gradeTally(String[] letterGrade) {
int a, b, c, d, f = 0;
for(int i = 0;i < letterGrade.length;i++) {
if(letterGrade[i] == 'A') a++;
else if (letterGrade[i] == 'B') b++;
else if (letterGrade[i] == 'C') c++;
else if (letterGrade[i] == 'D') d++;
else if (letterGrade[i] == 'F') f++;
}
return a + b + c + d + f;
}4)我搞不懂.我想我已经接近了。在这里,我试图读取文件,标记它,然后对每个令牌将它添加到数组1×1中。
public static String[] getData() throws IOException {
int[] studentID = new int[50];
String[] studentAnswers = new String[50];
int total = 0;
String line = reader.readLine();
strTkn = new StringTokenizer(line);
String answerKey = strTkn.nextToken();
while(line != null) {
studentID[total] = Integer.parseInt(strTkn.nextToken());
studentAnswers[total] = strTkn.nextToken();
total++;
}
return studentAnswers;
}我现在已经不再编辑我的帖子了。我希望这已足够:)
发布于 2010-01-31 23:00:23
我想你从评论中意识到这是很难帮助的。
我不知道这会有多大帮助,但我想给出一些关于你如何处理这个问题的一般性建议。
首先,我可能会扔掉你的东西,重新开始。我从来没有后悔扔掉代码--从长远来看,它总是帮助你的代码,而且你第二次学到了更多的东西。
第二,从小开始。做一些有用的东西--即使它只是读取值并证明它们被正确读取,然后展开它。不断地测试。无论何时添加到代码中,都要在测试中添加一行代码,以确保新代码以及前面的所有代码都能正常工作。
这样,如果有什么东西坏了,你就会知道到底是什么打破了它--你编辑的最后一件东西。
要进行这种快速测试,您要么学习使用JUnit进行单元测试,要么只为测试而制作一个主测试,这样您就可以按下一个按钮并得到一个即时的答案。(JUnit并不难,它是内置在Eclipse中的。哦,是的,下一个提示)。。
使用ECLIPSE或NetBeans!
这些都是经验丰富的程序员知道并自动完成的事情。从长远来看,在开始的时候投入一点时间和精力可以节省很多痛苦。
发布于 2010-01-31 23:44:02
由于您仍然停留在编译上,所以在处理代码中的逻辑之前,我将尽力帮助您克服这个绊脚石。
有些规则会导致代码不编译,包括语法规则,但这些规则通常不被称为“逻辑”。我会将逻辑错误描述为运行程序,但不执行您希望它做的事情。总之..。
许多编译器错误的形式如下:
someField cannot be resolved当您试图引用编译器无法“看到”的变量时,就会发生这种情况。在您的例子中,这是因为当您想要引用变量时,您已经在无法看到它们的地方声明了这些变量。
main()方法中的几个字段就是这种情况。这取决于范围问题。要能够引用变量(如answerKey或studentAnswers ),它们必须在作用域中。全局范围是当您可以从任何地方引用一个变量时,这就是您想要避免的。您已经在方法中声明了变量answerKey,studentAnswers,如下所示:
public static String[] getData() throws IOException {
// other code
String[] studentAnswers = new String[50];
// other code
String answerKey = strTkn.nextToken();
// other code
}您对这些声明所做的是,说studentAnswers和answerKey“在getData()方法的范围内”。这意味着它们不能在其他地方引用,并且是main()中编译器错误的原因。
这样做的一种方法是全局声明变量--比如public static String answerKey;就在public class GradeResults {下面,但是有人特别要求您不要这样做(并且出于很好的理由,我不会讨论这个问题)。
我建议的另一种方法是“封装”变量。这是一个花哨的编程词,大致意思是将数据和行为封装到一个对象中,让对象决定如何行为,并改变自己。我会给你一个方法,你可以开始这个(有很多,很多方法你可以这样做)。也就是说,将有关学生的所有信息封装在一个对象中,我们可以使用一个名为Student的新类来创建该对象。
// this is a new class, and will have to be saved in a file called Student.java
public class Student {
// these are field declarations
private int id;
private String answers;
// this is the constructor, it creates a new instance of Student
public Student(int newStudentsId, String newStudentsAnswers) {
// these lines take the parameters (in brackets on the line above)
// and assign them to the fields of this instance
this.id = newStudentsId;
this.answers = newStudentsAnswers;
}
// after this you could have getters for the fields,
// these are often referred to as "accessors" in introductory texts
// this is all I'll give you of this example, to get you started
} // End of class Student.java您看到的其余编译器错误稍微容易一些:
Incompatible operand types String and char在守则中:
public static int gradeTally(String[] letterGrade) {
// other code
if(letterGrade[i] == 'A') a++; // error on this lineletterGrade[i]引用的变量的类型是一个字符串,常量'A'是一个字符。有两种方法可以解决这个问题
'A'更改为"A",注意双引号而不是单引号,单引号用于char类型,double用于String类型。其他选择是:letterGrade数组的类型更改为声明它的char[] letterGrade (在方法签名的参数列表中)。这与导致编译器错误的问题大致相同:
Cannot invoke charAt(int) on the primitive type int密码如下:
total = studentAnswers[i].charAt(a);charAt是String类的方法,因此studentAnswers[i]必须引用类型为String的变量。但它被声明为int[] studentAnswers,因此存在“类型不匹配”。
这里有很多需要思考的地方,我留下了很多空白,你必须自己去填补。一篇关于用Java (例如对象首先使用Java)进行面向对象编程的好的介绍性文章应该涵盖您所需要的一切。
发布于 2010-01-31 23:00:39
我快速浏览了第二和第三点:
2)本文的目的是通过检查studentAnswers数组中哪些元素与answerKey中的元素相等来确定正确答案的数量。假设这是我的目标,那么我的建议是:
java.lang.String类上的一个方法,但是您根本没有使用Strings。3)你应该考虑返回一个能够存储分数的不同的对象。例如,您可以考虑一个Map<Character, Integer>,其中映射的键是等级,值是等级频率。
https://stackoverflow.com/questions/2173616
复制相似问题