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

Java 如何用我的程序解决这些问题?(内部解释了许多问题),java,Java,这个问题不适合胆小的人,而且会很费时 我正在学习Java,我想知道是否有人可以带我浏览我的程序,告诉我我做错了什么,以及如何修复它,以便我可以学习 我的整个计划(如果需要): 任务: 不允许使用全局变量! 你被要求写一个程序 给一个真的假的结果打分 测验并在中显示结果 表格形式。测验由10个部分组成 问题。此文件的数据文件 问题由一组正确的答案组成 第一行和第二行的回答(answerkey) 包含四个字符的后续行 数字学生识别号 然后是那个学生的10分 响应。(学生人数 在当前未知的环境中进行测

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

我正在学习Java,我想知道是否有人可以带我浏览我的程序,告诉我我做错了什么,以及如何修复它,以便我可以学习

我的整个计划(如果需要):

任务:

不允许使用全局变量! 你被要求写一个程序 给一个真的假的结果打分 测验并在中显示结果 表格形式。测验由10个部分组成 问题。此文件的数据文件 问题由一组正确的答案组成 第一行和第二行的回答(answerkey) 包含四个字符的后续行 数字学生识别号 然后是那个学生的10分 响应。(学生人数 在当前未知的环境中进行测验。)

数据文件的格式如下:

TFFTTFTT

0461 ttftftftt

3218 TFFTTTFT

您的程序应该读取密钥并 将其存储在一维数组中。 然后,它应该读取并处理每个 下一行,存储学生 一张单子里的识别号 量纲数组与矩阵的级数 两个独立的一维数组- 一个用于数字等级,另一个用于 字母等级

数字等级转换为字母 根据以下制度: A(10),B(9),C(8-7),D(6-5),F(4-0)

程序输出应包括 以下:

  • 每个学生的四位数识别号,数字 等级和他们的字母等级

  • 有多少学生参加测验的打印计数

  • 整个班级的数字测验平均值

  • A、B、C、D和F的频率计数 全班同学

  • 编辑:

    哦,嘿。对不起,我仍在掌握如何做这一切的诀窍:(好的,开始了

    程序没有编译,我很确定这取决于我的逻辑(以及一些语法方面的东西)

    我遇到的问题是: 1) 如何将所有参数传递给每个不同的方法,如下所示。我想做的是将我返回的所有值(如回答键、学生回答、数字分数、平均值等)放在这里,以便我可以使用并打印它们。但我不知道怎么做

    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对应,如下所示

    我试图做的是检查特定元素中的每个字母,如果值为“correct”或==to 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;
        }
    

    我现在编辑完我的文章。我希望这就足够了:)

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

    我不确定这会有多大帮助,但我想给出一些关于如何处理这一问题的一般提示

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

    第二,从小处做起。做一些有用的东西——即使它只是读入值并证明它们被正确读入,然后扩展它。不断地测试。无论何时向代码中添加代码,都要在测试中添加一行代码,以确保新代码与之前的代码一样工作

    这样,如果有什么东西坏了,你就会确切地知道是什么东西坏了它——这是你最后编辑的东西

    要进行这种快速测试,您应该学习使用JUnit进行单元测试,或者制作一个只用于测试的main,这样您就可以点击一个按钮并立即得到答案。(JUnit其实并不难,它内置于Eclipse中。哦,是的,下一个提示)

    使用ECLIPSE或NetBeans


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

    我已经快速浏览了第2点和第3点):

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

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

    3)你应该考虑返回一个能够存储等级计数的不同对象。例如,你可以考虑一个<代码>地图>代码>,其中地图的键是等级,值是等级频率。

    < p> java是一种面向对象语言。从对象的角度思考。这只不过是用Java编写的C或Fortran。我看不到任何封装或信息隐藏

    这可能是因为这是第一节编程课,你的教授可能不懂对象。但这正是Java的发展方向


    我希望看到像学生、班级、年级(可能作为枚举)、报告卡这样的班级。相反,我看到的都是原语。有朝一日,您会将此视为如何糟糕地编写Java的一个示例。

    由于您仍在忙于编译,在处理代码中的逻辑之前,我将尝试帮助您克服这个障碍

    有一些规则会导致代码不符合
    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;
        }
    
    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;
        }
    
    someField cannot be resolved
    
    public static String[] getData() throws IOException {
      // other code
    
      String[] studentAnswers = new String[50];
    
      // other code 
    
      String answerKey = strTkn.nextToken();
    
      // other code
    }
    
     // 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 line
    
    Cannot invoke charAt(int) on the primitive type int
    
    total = studentAnswers[i].charAt(a);