首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用我的程序解决这些问题?(内部解释了许多问题)

如何用我的程序解决这些问题?(内部解释了许多问题)
EN

Stack Overflow用户
提问于 2010-01-31 22:21:36
回答 4查看 2.4K关注 0票数 3

这个问题不适合胆小的人,而且会很费时。

我正在学习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. 每个学生的四位数字识别号码,他们的数字等级和他们的字母等级。
  2. 有多少学生参加了测验的书面统计。
  3. 整个类的数字测验平均值。
  4. 全班A,B,C,D和F数的频率计数。

编辑:

哦,嘿。对不起,我还在掌握怎么做这一切的窍门:(好的,开始了。)

这个程序没有编译,我很确定这是我的逻辑所致。(还有一些句法)。

我遇到的问题是: 1)如何将所有参数传递给每个不同的方法,如这里所示。我想要做的是让我返回的所有值(如answerKey、studentAnswers、numericGrade、average等)都在这里,这样我就可以使用它们并打印它们。但我不知道怎么做。

代码语言:javascript
复制
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中。

代码语言:javascript
复制
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)我不知道如何返回所有这些不同的价值观,因为我需要它们!我想要这组代码检查每个元素的字母等级,如果找到这个元素,++对应它的变量,所以我知道有多少这个字母级别被调用了。

代码语言:javascript
复制
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中。

代码语言:javascript
复制
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;
    }

我现在已经不再编辑我的帖子了。我希望这已足够:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-31 23:00:23

我想你从评论中意识到这是很难帮助的。

我不知道这会有多大帮助,但我想给出一些关于你如何处理这个问题的一般性建议。

首先,我可能会扔掉你的东西,重新开始。我从来没有后悔扔掉代码--从长远来看,它总是帮助你的代码,而且你第二次学到了更多的东西。

第二,从小开始。做一些有用的东西--即使它只是读取值并证明它们被正确读取,然后展开它。不断地测试。无论何时添加到代码中,都要在测试中添加一行代码,以确保新代码以及前面的所有代码都能正常工作。

这样,如果有什么东西坏了,你就会知道到底是什么打破了它--你编辑的最后一件东西。

要进行这种快速测试,您要么学习使用JUnit进行单元测试,要么只为测试而制作一个主测试,这样您就可以按下一个按钮并得到一个即时的答案。(JUnit并不难,它是内置在Eclipse中的。哦,是的,下一个提示)。。

使用ECLIPSE或NetBeans!

这些都是经验丰富的程序员知道并自动完成的事情。从长远来看,在开始的时候投入一点时间和精力可以节省很多痛苦。

票数 4
EN

Stack Overflow用户

发布于 2010-01-31 23:44:02

由于您仍然停留在编译上,所以在处理代码中的逻辑之前,我将尽力帮助您克服这个绊脚石。

有些规则会导致代码不编译,包括语法规则,但这些规则通常不被称为“逻辑”。我会将逻辑错误描述为运行程序,但不执行您希望它做的事情。总之..。

许多编译器错误的形式如下:

代码语言:javascript
复制
someField cannot be resolved

当您试图引用编译器无法“看到”的变量时,就会发生这种情况。在您的例子中,这是因为当您想要引用变量时,您已经在无法看到它们的地方声明了这些变量。

main()方法中的几个字段就是这种情况。这取决于范围问题。要能够引用变量(如answerKeystudentAnswers ),它们必须在作用域中。全局范围是当您可以从任何地方引用一个变量时,这就是您想要避免的。您已经在方法中声明了变量answerKeystudentAnswers,如下所示:

代码语言:javascript
复制
public static String[] getData() throws IOException {
  // other code

  String[] studentAnswers = new String[50];

  // other code 

  String answerKey = strTkn.nextToken();

  // other code
}

您对这些声明所做的是,说studentAnswersanswerKey“在getData()方法的范围内”。这意味着它们不能在其他地方引用,并且是main()中编译器错误的原因。

这样做的一种方法是全局声明变量--比如public static String answerKey;就在public class GradeResults {下面,但是有人特别要求您不要这样做(并且出于很好的理由,我不会讨论这个问题)。

我建议的另一种方法是“封装”变量。这是一个花哨的编程词,大致意思是将数据和行为封装到一个对象中,让对象决定如何行为,并改变自己。我会给你一个方法,你可以开始这个(有很多,很多方法你可以这样做)。也就是说,将有关学生的所有信息封装在一个对象中,我们可以使用一个名为Student的新类来创建该对象。

代码语言:javascript
复制
 // 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

您看到的其余编译器错误稍微容易一些:

代码语言:javascript
复制
Incompatible operand types String and char

在守则中:

代码语言:javascript
复制
public static int gradeTally(String[] letterGrade) {
  // other code
    if(letterGrade[i] == 'A') a++;  // error on this line

letterGrade[i]引用的变量的类型是一个字符串,常量'A'是一个字符。有两种方法可以解决这个问题

  • 'A'更改为"A",注意双引号而不是单引号,单引号用于char类型,double用于String类型。其他选择是:
  • letterGrade数组的类型更改为声明它的char[] letterGrade (在方法签名的参数列表中)。

这与导致编译器错误的问题大致相同:

代码语言:javascript
复制
Cannot invoke charAt(int) on the primitive type int

密码如下:

代码语言:javascript
复制
total = studentAnswers[i].charAt(a);

charAtString类的方法,因此studentAnswers[i]必须引用类型为String的变量。但它被声明为int[] studentAnswers,因此存在“类型不匹配”。

这里有很多需要思考的地方,我留下了很多空白,你必须自己去填补。一篇关于用Java (例如对象首先使用Java)进行面向对象编程的好的介绍性文章应该涵盖您所需要的一切。

票数 3
EN

Stack Overflow用户

发布于 2010-01-31 23:00:39

我快速浏览了第二和第三点:

2)本文的目的是通过检查studentAnswers数组中哪些元素与answerKey中的元素相等来确定正确答案的数量。假设这是我的目标,那么我的建议是:

  • 你为什么要返回数组?当然,返回一个等于匹配总数的整数会更有意义吗?
  • 您应该能够将代码构造为一个单独的循环,这样您就可以使用索引(例如i)来迭代,比较两个数组的元素。
  • 对charAt的引用是错误的;这是java.lang.String类上的一个方法,但是您根本没有使用Strings。

3)你应该考虑返回一个能够存储分数的不同的对象。例如,您可以考虑一个Map<Character, Integer>,其中映射的键是等级,值是等级频率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2173616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档