-1

我正在观看加州大学伯克利分校关于在 Java 中创建数组的讲座。教授展示了以下代码,并声称该代码将创建诸如 1/6、2/6 等分数。(我添加了 main() 以便对其进行测试。)

public class Test {
    public static void main(String[] args) {

        Fraction[] f = new Fraction[5];
        for (int i=0; i<5; i++){
          f[i] = new Fraction(i, 6);
        }

    }
}

我在 Eclipse 中对此进行测试,显然代码无法编译,因为没有类 Fraction,即使我将 Fraction 更改为加倍代码仍然不会产生任何分数。

我猜教授打算写这个:

public class Test {
    public static void main(String[] args) {

        double[] f = new double[5];
        for (int i=0; i<5; i++){
          f[i] = (i/6);
        }

    }
}

我的推理正确吗?


来源:https ://www.youtube.com/watch?v=wGibp2L5uCc @12:25 在此处输入图像描述

4

7 回答 7

5

首先,请注意这将从 开始0/6,而不是1/6。其次,教授很可能指的是存储精确Fraction分数的假设类(即分子和分母为两个s);a不能这样做。intdouble

现在,如果你想使用双精度数(它本身不会存储精确的分数,而是它们代表的近似数字),你必须使用双除法(而不是整数除法,就像你目前正在执行的那样):

f[i] = i/6.0;

正如@StephenTG 指出的那样,Fraction该类似乎是在此处实现的。

于 2013-08-09T17:31:54.983 回答
1

好吧,如果Fraction该类有一个返回 adouble或 a的方法float,那么实际上可以很好地构造它int

然后内部逻辑将负责处理并返回正确的类型。

考虑这个例子:

public static void main(String[] args) {
    System.out.println(new Fraction(1, 6).getFraction());
}
static class Fraction {
    private float fraction;
    public Fraction(int num, int den) {
        // TODO check that den != 0, otherwise we're in a world of trouble :D
        fraction = (float) num/den;
    }
    public float getFraction() {
        return fraction;
    }
}

输出:

0.16666667
于 2013-08-09T17:31:01.933 回答
1

是和不是。这个:

f[i] = new Fraction(i, 6);

方法

存储在 f 数组的位置 i 上,这个分数对象

f是 a Fraction[],意味着每个索引都包含一个Fraction类型化的对象。您需要创建一个新的(即new Ftaction(1,6))以存储1/6. 你对存储什么是正确的,你只是没有完全了解你如何表示它。

只是为了您的课程,我假设这Fraction是您的老师创建的类型并且您必须包含在您的项目中(正如其他人正确建议的那样,您可能正在搜索课程)

于 2013-08-09T17:34:15.057 回答
1

这里有分数类: http ://www.cs.berkeley.edu/~jrs/61bf98/labs/lab2/Fraction.java

我认为这也是您课程的一部分。您必须下载此文件并将其添加到您的项目中。

于 2013-08-09T17:35:04.137 回答
0

您需要创建类才能创建对象 Fraction数组。Fraction

从 StephenTG 的评论来看,您似乎需要导入Fraction.javaeclipse。

(这个 Fraction.java 有一个main用于测试目的的方法。您可以将代码放在该方法中,或者如果您想使用自己的方法,则需要删除该main方法。)

于 2013-08-09T17:31:25.273 回答
0

只有当你的Fraction类有一个constructor需要两个整数值的(例如)时,你的第一个片段才有意义:

class Fraction
{
    private int val1, val2;

    public Fraction(int val1, int val2)
    {
        this.val1 = val1;
        this.val2 = val2;
    }
}

对于问题的第二部分,您的循环将首先return是 an integer,然后type-castdouble. 因此,即使您知道不应该这样做,您的情况下的结果也将始终为零。要解决此问题,以下两行代码中的任何一行都可以。

f[i] = ((i + 0.0)/6);

或者

f[i] = (i/6.0);
于 2013-08-09T17:48:11.883 回答
0

您应该首先定义一个Fraction类:

public class Fraction
{
    int numerator;
    int denominator;

    public Fraction(){}

    /* watch out for a division by zero Exception! 
     * maybe throw a custom exception here
    */
    public Fraction(int n, int d){
        numerator = n;
        denominator = d;
    }

    public float getValue(){
       return numerator * 1.0f/denominator;
    }
}
于 2013-08-09T17:37:29.743 回答