【问题标题】:How to pass an array to a method from one class to another method of different class [closed]如何将数组传递给一个类的方法到另一个类的另一个方法[关闭]
【发布时间】:2021-03-17 11:49:04
【问题描述】:

平均成绩计算

开发一个智能应用程序作为学生成绩计算器 (SGC)。

创建具有以下私有属性的学生类:

int id

字符串名称

标记(整数数组)

浮动平均值

字符等级

包括适当的 getter 和 setter 方法和构造函数。

getter 方法名称应为 getId、getName、getMarks、getAverage 和 getGrade,而 setter 方法名称应为 setId、setName、setMarks、setAverage 和 setGrade。

按 id、name 和标记的顺序编写一个公共 3 参数构造函数。

在 Student 类中编写以下方法:

public void calculateAvg()- 该方法应该计算当前学生的平均分并设置平均分。

public void findGrade()- 此方法应根据计算的平均值设置等级。如果平均值在 80 到 100 之间,则返回成绩为“O”,否则返回“A”。如果学生在任何科目中的成绩低于 50,则返回成绩为“F”。使用适当的 setter 方法为学生设置成绩。

(注意:主题数应大于零,如果不显示为“无效的主题数”并再次获取主题数,则假设主题的标记应在0-100范围内。如果不显示a消息“无效标记”并再次获得标记)

编写一个StudentMain类并编写main方法。

在这个类中,写一个方法

public static Student getStudentDetails() - 此方法应从用户那里获取学生的输入,使用这些详细信息创建一个学生对象并返回该对象。

主要通过调用 getStudentDetails 方法创建学生对象。还可以使用适当的方法计算该学生对象的平均值和成绩。

SGC 应用应获取输入并显示快照中指定的输出:

示例输入 1: 输入身份证: 123 输入名称: 汤姆 输入科目数: 3 为主题 1 输入标记: 95 为主题 2 输入标记: 80 输入主题 3 的标记: 75

样本输出 1:

编号:123 姓名:汤姆 平均:83.33 等级:O

示例输入 2:

输入编号: 123 输入名称: 汤姆 输入科目数: 0

主题数无效

输入科目数:

3 为主题 1 输入标记: 75 为主题 2 输入标记: 49 输入主题 3 的标记: 90

示例输出 2:

编号:123 姓名:汤姆 平均:71.33 等级:F

import java.util.*;

public class Student {
private int id;
private String name;
private int marks[];
private float average;
private char grade;

//Student(int id, String name, int marks[]){}
Student(){}

public void setId(int id) {
    this.id =id;
}
public void setName(String name) {
    this.name=name;
}
public void setMarks(int marks[]) {
    this.marks =marks;
}
public void setAverage(float average) {
    this.average=average;
}
public void setGrade(char grade) {
    System.out.println("grade");
    this.grade=grade;
}
public void calculateAvg() {
    float average = (Arrays.stream(marks).sum())/(marks.length);
    Student student = new Student();
    student.setAverage(average);
}
public void findGrade() {
    Student sm = new Student();
    if(average>80.0 && average <= 100.0) {
        sm.setGrade('O');
    }
    else if(average<50) {
        sm.setGrade('F');
    }
    else
        sm.setGrade('A');
}
public int getId() {
    return id;  
}
public String getName() {
    return name;
}
public int[] getMarks() {
    return marks;
}
public float getAverage() {
    System.out.println("average");
    return average;
}
public char getGrade() {
    System.out.println("null");
    return grade;
}

}

import java.util.Scanner;

public class StudentMain {

public static void main(String[] args) {
    StudentMain object = new StudentMain();
    object.getStudentDetails();

}
public static Student getStudentDetails() { 
    int i; int m[] = new int[100];
    Scanner sc = new Scanner(System.in);
    Student student = new Student();
    System.out.println("Enter the id:");
    int id= sc.nextInt();
    student.setId(id);sc.nextLine();
    System.out.println("Enter the name:");
    student.setName(sc.nextLine());
    do {
    System.out.println("Enter the no of subjects:");
    i = sc.nextInt();
    if(i==0) {
        System.out.println("Invalid number of subject");
        }
    }while(i==0);
    for(int j = 1;j<=i;j++) {
        System.out.println("Enter mark for subject "+j+":");
        m[j-1]=sc.nextInt();
    }
    student.setMarks(m);
    
    System.out.println("Id:"+student.getId());
    System.out.println("Name:"+student.getName());
    System.out.println("Average:"+student.getAverage());
    System.out.println("Grade:"+student.getGrade());
    return student;
}

}

运行代码后,我发现 setMarks(m) 没有将数组传递给 Student 类中的方法,输出是
ID: 姓名 : 平均:0.0 年级: Avg 和 Grade 没有给出预期的输出。enter code here

【问题讨论】:

  • 当你写了一个方法但不使用它的时候,为什么你仍然期望它被使用?
  • 请参阅minimal reproducible example。您无需向我们提供您的全部作业和所有代码。专注于您需要帮助的基本问题,并尝试提出仅显示该问题的代码。这样做很可能让你自己已经解决了问题……如果没有,你可以把它带给其他人。请记住,您希望其他人免费为您花费时间,因此请投入您的时间,使其尽可能简单和直接。我,老实说,我读了 3 行之后就停止了阅读,甚至懒得看你的代码。
  • 是的,问题很可能是您的代码没有调用findGrade() 方法。或者计算平均值的那个。
  • 不,兄弟,我不是想免费花别人的时间。我已经在这个问题上工作了 2 天,但仍然无法弄清楚我在做什么..

标签: java object arraylist


【解决方案1】:

你必须 setAverage()。由于是 calculateAvg(int m[]) 完成了这项工作,

        
        student.setMarks(m);
        student.setAverage(student.calculateAvg(m)); // add this line

        System.out.println("Id:"+student.getId());
        System.out.println("Name:"+student.getName());
        System.out.println("Average:"+student.getAverage());
        System.out.println("Grade:"+student.getGrade());

为了改进,你的工作状态有一个public void calculateAvg(),为此,不需要传递marks[],直接修改内部的average

// firstly remove parameter and update internal average
    public void calculateAvg() {
        this.average = ((float) Arrays.stream(marks).sum()) / (marks.length);
        // OR as spotted by @Lino
        // this.average = (float) Arrays.stream(marks).asDoubleStream().average().orElse(0.0);
    }

// secondly, in your main, just call calculateAvg()
        student.setMarks(m);
        student.calculateAvg();

        System.out.println("Id:"+student.getId());
        System.out.println("Name:"+student.getName());
        System.out.println("Average:"+student.getAverage());
        System.out.println("Grade:"+student.getGrade());
        return student;

【讨论】:

  • (Arrays.stream(marks).asLongStream().sum()) / (marks.length)也可以写成Arrays.stream(marks).average().orElse(0.0),见IntStream.average()
  • 另请注意,您当前的方法是使用整数除法,它会丢弃小数点后的值,这可能是不希望的
【解决方案2】:

您说您“发现 setMarks(m) 没有将数组传递给 Student 类中存在的方法”。是什么让您认为是这种情况?

您的getAverage() 方法返回字段average 的值。该字段在哪里设置?

您应该通过在调试器中单步调试您的类。如果您还没有学会如何使用调试器,只需放置一些临时 System.out.println 跟踪。但是学习使用调试器是非常值得的。

【讨论】:

  • 全部正确,但不是真正的答案。这将是一个很好的评论,但它真的不是一个答案
  • 当我打印“m”时,输出类似于 1@142ac04
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多