有理数の算術演算を実行する計算機を作ろうとしています。このため私はRational
クラスを持っています。プログラムでは、引数をコマンドラインから実行する必要があります:cmdからJavaプログラムをコンパイルすると、 "エラー:シンボルを見つけることができません"というメッセージが表示されます。
のjava(...)NUM/denom演算子(+ - /。)NUM/denom
のインスタンスを作成するときにコンパイルエラーが出るように思えRational
クラスです。これはcmdからコンパイルしようとすると発生します。私はEclipseでコンパイルするときにこのエラーは発生しません。計算機ロジックを使用したmain
メソッドは現時点ではちょっと面倒なので、私はRationalのインスタンスを作成するテストクラスのサンプルを貼り付けます。 Rational
のコードも貼り付けます。
テスト方法以下:
public class TestRational {
public static void main(String[] args) {
Rational r1 = new Rational(1, 2);
Rational r2 = new Rational(1, 2);
Rational result = new Rational();
result = r1.add(r2);
System.out.println("r1 + r2 = " + result);
}
}
Rational
クラス:
public class Rational extends Number implements Comparable<Rational> {
private long numerator = 0;
private long denominator = 1;
private long[] r = new long[2];
// numerator: r[0]
// denominator: r[1]
public Rational() {
this(0, 1);
}
public Rational(long numerator, long denominator) {
long gcd = gcd(numerator, denominator);
this.r[0] = ((denominator > 0) ? 1 : -1) * numerator/gcd;
this.r[1] = Math.abs(denominator)/gcd;
}
private static long gcd(long n, long d) {
long n1 = Math.abs(n);
long n2 = Math.abs(d);
int gcd = 1;
for (int k = 1; k <= n1 && k <= n2; k++) {
if (n1 % k == 0 && n2 % k == 0)
gcd = k;
}
return gcd;
}
public long getNumerator() {
return r[0];
}
public long getDenominator() {
return r[1];
}
public Rational add(Rational secondRational) {
long n = r[0] * secondRational.getDenominator()
+ r[1] * secondRational.getNumerator();
long d = r[1] * secondRational.getDenominator();
return new Rational(n, d);
}
public Rational subtract(Rational secondRational) {
long n = r[0] * secondRational.getDenominator()
- r[1] * secondRational.getNumerator();
long d = r[1] * secondRational.getDenominator();
return new Rational(n, d);
}
public Rational multiply(Rational secondRational) {
long n = r[0] * secondRational.getNumerator();
long d = r[1] * secondRational.getDenominator();
return new Rational(n, d);
}
public Rational divide(Rational secondRational) {
long n = r[0] * secondRational.getDenominator();
long d = r[1] * secondRational.getNumerator();
return new Rational(n, d);
}
@Override
public String toString() {
if (r[1] == 1)
return r[0] + "";
else
return r[0] + "/" + r[1];
}
@Override
public boolean equals(Object other) {
return (((this.subtract((Rational)(other))).getNumerator() == 0));
}
@Override
public int intValue() {
return (int)doubleValue();
}
@Override
public float floatValue() {
return (float)doubleValue();
}
@Override
public double doubleValue() {
return r[0] * 1.0/r[1];
}
@Override
public long longValue() {
return (long)doubleValue();
}
@Override
public int compareTo(Rational o) {
if (this.subtract(o).getNumerator() > 0)
return 1;
else if (this.subtract(o).getNumerator() < 0)
return -1;
else
return 0;
}
}
エラーメッセージは次のようになります。
TestRational.java:7: error: cannot find symbol
Rational r1 = new Rational(1, 2)
^
symbol: class Rational
location: class TestRational
私はそれぞれの出現に対して1つのエラーメッセージが表示されます合理的な単語で、 "^"は "R"を指す。
私はこの記事を読んだことがあるが、問題を解決することができていない: link
誰がエラーを引き起こしているかを見ることができ、かつcommandlinde用のプログラムをコンパイルするときに、なぜそれが唯一の原因は?
あなたはクラスパスをspecifingていますか? http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html – m0skit0
* cmdからコンパイルしようとすると* - すべてのクラスを一緒にコンパイルする必要があるためです。 Ant/Maven/Gradleのようなビルドツールを使用すると、実際にそのように役立ちます。 –
@ m0skit0:JDE/JDK/Eclipseをインストールする際に標準チュートリアルの指示に従ってクラスパスを設定しました。 – Esben86