JDK Download/ Java-Fragen - Seite 5

Neue Frage »

Calvin Auf diesen Beitrag antworten »

Lasse meinen Code doch mal laufen und vergleiche die Ausgabe. Es ruft die 3 Methoden jeweils mit k=1 auf.
Gast11022013 Auf diesen Beitrag antworten »

Ja, Du hast Recht, es muss mit der if-Bedingung sein.

Die werde ich in meinen Code hinzufügen, dankesehr!

-----------------

Was sagst Du zu der Aufgabe, bei der man die do-while-schleife mit einer While-Schleife und einer if-else-Anweisung beschreiben soll?

Kann man den Innenteil einfach weglassen und hat die Lösung?


Zumindest mein Testen mit Eclipse zeigt, dass das Gleiche bei herauskommt.
Aber irgendwie kann das ja nicht die Lösung sein...
Gast11022013 Auf diesen Beitrag antworten »

Also ich habe jetzt hin- und herprobiert, aber komme immer wieder nur an bei

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public int mitWhile(int b){ 
int a = 0; 
if (b > 0) { 
a = a+3*b; 
} else { 
a = a-2*b; 
} 
while ( a < b ) 
{ if (b > 0){ 
  a = a+3*b; 
} else { 
  a= a-2*b; 
} 
} 
  return a; 
} 


Ich habe hier zwei if-else-Anweisungen, darf aber nur eine verwenden.

Wer könnte mir nochmal bitte einen Hinweis geben, was ich wo umändern könnte, damit am Ende nur eine if-else-Anweisung enthalten ist?


Das wäre sehr nett, denn ich komme an dieser Stelle einfach nicht weiter.

Wink
Gast11022013 Auf diesen Beitrag antworten »

Wäre es eine Möglichkeit, wenn man bei dem If-Fall und dem Else-Fall jeweils

x=3b bzw. x=-2b für ein int x setzt,

dann nach der if-else-Anweisung einmal

a=a+x rechnet,

dann bei der anschließenden while-Schleife als Bedingung weiterhin

a<b nimmt und in den Rumpf a=a+x schreibt?
Gast11022013 Auf diesen Beitrag antworten »

Zitat:
Original von Calvin
Zitat:
Original von Math1986
Zitat:
Original von Dennis2010
Ich glaube, ich weiß, wie man das ändern kann.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public int doWhileVerwenden(int k)
{
int i=1;
int j=1;

do{
      j*=i+1;
      i++;
} while(i<k);
return j;
}


Jetzt besser?!
Dieser Teil ja.

Die andere Aufgabe verstehe ich nicht, weder die Aufgabenstellung noch deine Begründung dazu.


Nein, das passt nicht. Grund ist, dass die doWhile-Schleife mindestens einmal durchlaufen wird. Mit Startwert i=0 ist das egal, weil j mit 1 multipliziert wird.

Damit es "immer" klappt, muss die Bedingung vorher einmal abgeprüft werden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
public class Beispiel {
	public static void main(String[] args) {
		Beispiel bsp = new Beispiel();
		System.out.println("forSchleifeVerwenden(1) gibt folgenden Wert zurück: "
				+ bsp.forSchleifeVerwenden(1));
		System.out.println("doWhileVerwenden(1) gibt folgenden Wert zurück: "
				+ bsp.doWhileVerwenden(1));
		System.out.println("doWhileKorrektVerwenden(1) gibt folgenden Wert zurück: "
				+ bsp.doWhileKorrektVerwenden(1));
	}

	public int forSchleifeVerwenden(int k) {
		int j = 1;
		for (int i = 1; i < k; i++) {
			j *= i + 1;
		}
		return j;
	}

	public int doWhileVerwenden(int k) {
		int i = 1;
		int j = 1;
		do {
			j *= i + 1;
			i++;
		} while (i < k);
		return j;
	}

	public int doWhileKorrektVerwenden(int k) {
		int i = 1;
		int j = 1;
		if (i < k) {
			do {
				j *= i + 1;
				i++;
			} while (i < k);
		}
		return j;
	}
}


Die andere Frage habe ich beim Überfliegen nicht verstanden.



Also ich habe es einmal mit dem vorgeschalteten if und einmal ohne ausprobiert, beides Mal kommt das Gleiche heraus!!

Egal, was ich für i,j,k einsetze!


EDIT: Sorry, vertan. :-) Du hast Recht.
Gast11022013 Auf diesen Beitrag antworten »

Hallo!

Die folgende Klasse soll ein Test sein.

Jedoch steht da

1.) "The Method tassert1 cannot be declared static."

2.) "The Method main cannot be declared static."


Was läuft hier falsch?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
class Uebung2Test {

		public static void tassert1(String aStr, boolean y){

		if(y) {
		System.out.println("PASS: " + aStr);
		} else {
		System.out.println("FAIL: " + aStr);
		}
		}

		public static void main(String[] args){

		Uebung2 z=new Uebung2();
		Uebung2 w=new Uebung2();
		Uebung2 m=new Uebung2();
		Uebung2 g=new Uebung2();
		Uebung2 h=new Uebung2();

		tassert1("z.theDoWhileMethod(5)", z.theDoWhileMethod(5)==z.aForMethod(5));
		tassert1("w.testWhile(3,7)", w.testWhile(3,7)==w.ifelseAnw(3,7));
		tassert1("m.performActionSwitch(5)", m.performActionSwitch('a')==m.performActionBranch('a'));
		tassert1("g.getWithWhile(5)", g.getWithWhile(5)==g.getWithDoWhile(5));
		tassert1("h.crucialFunction001(-200,50)", h.crucialFunction001(-200,50)==true);

		}




EDIT:

Okay, ich glaube mein Fehler war, daß ich diese Klasse in eine andere Klasse mit einbezogen habe (das hatten wir noch nicht mit inneren und äußeren Klassen). Ich habe die Klammerung geändert (also dies als ganz eigene Klasse deutlich gemacht) und jetzt sind zumindest die Fehlermeldungen 1.) und 2.) weg.

Aber wenn ich das ganze Program ausführen will, kommt jetzt:

"Could not find the main class."


Wie geht man da jetzt vor?
 
 
Gast11022013 Auf diesen Beitrag antworten »

Also ich muss das nochmal präzisieren.

Die exakte Fehlermeldung lautet:


java.lang.NoClassDefFoundError: Uebung2$Uebung2Test
Caused by: java.lang.ClassNotFoundException: Uebung2$Uebung2Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Exception in thread "main"


Bin echt ratlos.
Math1986 Auf diesen Beitrag antworten »

Zitat:
Original von Dennis2010
Also ich muss das nochmal präzisieren.

Die exakte Fehlermeldung lautet:


java.lang.NoClassDefFoundError: Uebung2$Uebung2Test
Caused by: java.lang.ClassNotFoundException: Uebung2$Uebung2Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Exception in thread "main"


Bin echt ratlos.
Die Java-Datei muss den selben Namen wie die in ihr definierte Klasse haben
Gast11022013 Auf diesen Beitrag antworten »

Also die Java-Datei habe ich

Uebung2.java genannt.


Und es kommen in der Datei zwei Klassen vor.

Die Klasse Uebung2, die die Methoden enthält.

Die Klasse Uebung2Test, die testen soll, ob die Methoden richtig sind.


Wenn ich das kompiliere erhalte ich komischerweise ZWEI Class-Dateien.

Einmal für Uebung2 und einmal für Uebung2Test.


Wenn ich

java Uebung2Test eingebe, dann kommt das Erwünschte.

Wenn ich

java Uebung2

eingebe, kommt die Fehlermeldung, ich nehme mal an, weil diese Klasse ja keine Main-Methode hat, sonder nur die Klasse Uebung2Test.




Ich möchte es aber so haben, dass das als EINE Klasse behandelt wird, dass ich also

java Uebung2


eingeben kann und das erscheint, was bei

java Uebung2Test

erscheint.


[Bei unserem ersten Übungblatt war die Datei genauso aufgebaut und funktionierte das...]
Gast11022013 Auf diesen Beitrag antworten »

Also ich sehe gerade, ich muss die java-Datei dann wohl so nennen wie die diejenige Methode, die die main-Mathode enthält?


Also in meinem Fall so wie die Methode, die den Test ausführt?


Wie kann ich den namen einer java-Datei so benennen, wie eine später im Code auftauchende Methode, denn automatisch wird ja immer der name der zuerst eingegebenen Methode für die java-datei genommen?
Math1986 Auf diesen Beitrag antworten »

Zitat:
Original von Dennis2010
Also ich sehe gerade, ich muss die java-Datei dann wohl so nennen wie die diejenige Methode, die die main-Mathode enthält?


Also in meinem Fall so wie die Methode, die den Test ausführt?
Ja.

Zitat:
Original von Dennis2010
Wie kann ich den namen einer java-Datei so benennen, wie eine später im Code auftauchende Methode, denn automatisch wird ja immer der name der zuerst eingegebenen Methode für die java-datei genommen?
Verstehe ich nicht... nenne sie doch so wie oben beschrieben verwirrt
Gast11022013 Auf diesen Beitrag antworten »

Ist wahrscheinlich eine blöde Frage.

Also wenn ich jetzt zuerst die Klasse Uebung 2 aufschreibe, heißt ja die java-Datei so.


Ich muss sie ja aber so nennen, wie die Klasse, die den Test ausführt und die main-Methode entrhält, die heißt hier Uebung2Test. Diese Klasse folgt aber in der Reihenfolge nach der Klasse Uebung2.


Wenn ich das jetzt kompiliere und das dann ausführe, muss ich ja

java Uebung2Test eingeben.

Also muss ich es irgendwie hinbekommen, daß die java-Datei Uebung2Test.java heißt und nicht (wie automatisch passiert: Uebung2.java).


Wie ändere/ mache ich das?
Math1986 Auf diesen Beitrag antworten »

Du kannst die Datei nicht einfach so umbenennen.
Die Datei muss den Namen der Klasse haben, die die Main-Methode enthält, mit der Reihenfolge hat dies nichts zu tun.
Gast11022013 Auf diesen Beitrag antworten »

Ja, aber mein Problem ist ja, daß der Name der Datei automatisch der ist, den die erste vorkommende Klasse trägt. Oder wo kann man ganz zu Beginn den Namen der Datei festlegen?!
Math1986 Auf diesen Beitrag antworten »

Zitat:
Original von Dennis2010
Ja, aber mein Problem ist ja, daß der Name der Datei automatisch der ist, den die erste vorkommende Klasse trägt.
Nochmals:
Zitat:
Die Datei muss den Namen der Klasse haben, die die Main-Methode enthält, mit der Reihenfolge hat dies nichts zu tun.


Zitat:
Original von Dennis2010
Oder wo kann man ganz zu Beginn den Namen der Datei festlegen?!
Nein, kann man nicht, und ich verstehe nach wie vor nicht, weshalb du es für notwendig erachtest, diese Datei umzubenennen. verwirrt
Gast11022013 Auf diesen Beitrag antworten »

Ich weiß nicht, ob wir aneinander vorbeireden.


Wir sollen eine Klasse Uebung2 schreiben (dort sollen bestimmte Methoden rein)

Und in die gleiche Datei soll auch die Klasse Uebung2Test (diese enthält die main-Methode + Tests).


Die Datei muss also Uebung2Test.java heißen.


Aber ich habe ja zuerst bei Eclipse die Klasse Uebung2 eingegeben, dann heißt das Dokument doch Uebung2.java.


Wie bekomme ich es also hin, daß die Datei Uebung2Test.java heißt.
Math1986 Auf diesen Beitrag antworten »

Zitat:
Original von Dennis2010
Ich weiß nicht, ob wir aneinander vorbeireden.


Wir sollen eine Klasse Uebung2 schreiben (dort sollen bestimmte Methoden rein)

Und in die gleiche Datei soll auch die Klasse Uebung2Test (diese enthält die main-Methode + Tests).


Die Datei muss also Uebung2Test.java heißen.
Soweit richtig.

Zitat:
Original von Dennis2010
Aber ich habe ja zuerst bei Eclipse die Klasse Uebung2 eingegeben, dann heißt das Dokument doch Uebung2.java.


Wie bekomme ich es also hin, daß die Datei Uebung2Test.java heißt.
Du kannst die Datei doch durch Rechtsklick umbenennen, wenn du das meinst
Gast11022013 Auf diesen Beitrag antworten »

Okay, mehr wollte ich gar nicht wissen. Augenzwinkern


Ich hatte nur gedacht, daß man den Namen auf diesem Weg nicht einfach anpassen darf, weil dann vielleicht irgendetwas durcheinander geht.

Danke.
Gast11022013 Auf diesen Beitrag antworten »

Und es ist korrekt, daß man am Ende dann eine Class-Datei für die Klasse Uebung2 und eine Class-Datei für die Klasse Uebung2Test hat, korrekt?
Math1986 Auf diesen Beitrag antworten »

Zitat:
Original von Dennis2010
Und es ist korrekt, daß man am Ende dann eine Class-Datei für die Klasse Uebung2 und eine Class-Datei für die Klasse Uebung2Test hat, korrekt?
Ja, natürlich, es sind ja zwei verschiedene Klassen
Gast11022013 Auf diesen Beitrag antworten »

Okay. Dann war es das erstmal.

Wieder viel dazu gelernt. Danke für die Hilfe, trotz vermutlich blöder Fragen. Wink


Bis zum nächsten Mal an gleicher Stelle.
Ibn Batuta Auf diesen Beitrag antworten »

Nur so als kurze Info. Für Java gibt es ein Paket für Matrizenoperationen, genannt: JAMA.

Geplant ist, dass sie dieses Framework noch erweitern. Ich verwende es schon eine Zeit lang und finde es ziemlich gut. Man spart sich an Arbeit und muss es nicht selbst implementieren. Beispielsweise kann man eine Multiple Linear Regression damit durchführen:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
package math;

import Jama.Matrix;
import Jama.QRDecomposition;

public class MatrixTest {
    private final int N;        // number of 
    private final int p;        // number of dependent variables
    private final Matrix beta;  // regression coefficients
    private double SSE;         // sum of squared
    private double SST;         // sum of squared

    public MatrixTest(double[][] x, double[] y) {
        if (x.length != y.length) throw new RuntimeException("dimensions don't agree");
        N = y.length;
        p = x[0].length;

        Matrix X = new Matrix(x);

        // create matrix from vector
        Matrix Y = new Matrix(y, N);

        // find least squares solution
        QRDecomposition qr = new QRDecomposition(X);
        beta = qr.solve(Y);

        // mean of y[] values
        double sum = 0.0;
        for (int i = 0; i < N; i++)
            sum += y[i];
        double mean = sum / N;

        // total variation to be accounted for
        for (int i = 0; i < N; i++) {
            double dev = y[i] - mean;
            SST += dev*dev;
        }

        // variation not accounted for
        Matrix residuals = X.times(beta).minus(Y);
        SSE = residuals.norm2() * residuals.norm2();

    }

    public double beta(int j) {
        return beta.get(j, 0);
    }

    public double R2() {
        return 1.0 - SSE/SST;
    }

    public static void main(String[] args) {
        double[][] x = { {  1,  10,  20 },
                         {  1,  20,  40 },
                         {  1,  40,  15 },
                         {  1,  80, 100 },
                         {  1, 160,  23 },
                         {  1, 200,  18 } };
        double[] y = { 243, 483, 508, 1503, 1764, 2129 };
        MatrixTest regression = new MatrixTest(x, y);

        System.out.printf("%.2f + %.2f beta1 + %.2f beta2  (R^2 = %.2f)\n",
                      regression.beta(0), regression.beta(1), regression.beta(2), regression.R2());
    }
}


Vergleiche hier: http://introcs.cs.princeton.edu/java/97d...ssion.java.html

Eric Eaton vom Bryn Mawr College hat das JAMA-Framework erweitert: http://cs.brynmawr.edu/~eeaton/software/Utils/javadoc/


Ibn Batuta
Math1986 Auf diesen Beitrag antworten »

Das klingt sehr interessant, ich verwende das JAMA-Paket selbst für ein Projekt.
Weißt du, was genau da erweitert wurde?
Ibn Batuta Auf diesen Beitrag antworten »

Hi Math1986,

die wichtigste Erweiterung ist das Package , die verschiedene Operationen, die bisher in JAMA fehlen, implementiert.

Nützlich sind v.a. die Funktionen wie das innere Produkt, Normalisierung einer Matrix oder auch die Tikhonov Regularisierung. Die API ist sehr gut dokumentiert: http://cs.brynmawr.edu/~eeaton/software/Utils/javadoc/

Da ich schon eine Weile mit dem Framework arbeite und einige Funktionen auch selbst implementiert habe, die es bei Eaton nicht gibt, überlege ich, ob ich ihm nicht eine E-Mail schreiben soll. Vielleicht kann man es ja somit auch ausbauen.


Ibn Batuta
Ibn Batuta Auf diesen Beitrag antworten »

Mit Erweiterungen meine ich z.B. Folgende:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
/** Schatten norm
   @return    p norms of the vector from the singular values of a matrix
   */

   public double normSchatten (double p) {
      double f = 0;
      SingularValueDecomposition singValDec = new SingularValueDecomposition(this);
      double[] r = singValDec.getSingularValues();
      if(p > 0) {
    	  for(double d : r) {
        	  f += Math.pow(d, p);
          }  
    	  f = Math.pow(f, 1/p);
      }
      return f;
   }



code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
/** Ky-Fan norm
   @return    sum of the first k singular values of a matrix
   */

   public double normKyFan (double k) {
      double f = 0;
      SingularValueDecomposition singValDec = new SingularValueDecomposition(this);
      double[] r = singValDec.getSingularValues();
      if(k > 0) {
    	  for(int i = 0; i < k; i++) {
        	  f += r[i]; 
          }
      }
      return f;
   }


Die Funktionen benötige ich hin und wieder, die es allerdings nicht im JAMA-Framework gab. Leider auch nicht in der Library von Eaton.

Nachtrag: Die Spektralnorm habe ich auch drin gehabt. Damit hätte man so ziemlich alle gängigen Matrixnormen im Framework auch drin.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
/** Spectral norm
   @return    the largest singular value of a matrix
   */

   public double normSpectralEuclidean () {
      double f = 0;
      SingularValueDecomposition singValDec = new SingularValueDecomposition(this);
      double[] r = singValDec.getSingularValues();
      Arrays.sort(r);
      f = r[r.length - 1];
      return f;
   }



Ibn Batuta
Math1986 Auf diesen Beitrag antworten »

Ibn Butata, kannst du dein Paket mal veröffentlichen?
Würde es mir gerne mal ansehen smile

Und als Anregung: Bei normSpectralEuclidean könntest du wohl optimieren, wenn du dir direkt das Maximum suchst, sort ist von der Laufzeit her da eher schlecht.

Ich dachte an sowas wie:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
/** Spectral norm
   @return    the largest singular value of a matrix
   */

   public double normSpectralEuclidean () {
      final SingularValueDecomposition singValDec = new SingularValueDecomposition(this);
      final double[] r = singValDec.getSingularValues();
      double norm = 0D;
      for(final double sing : r) {
          if(sing>norm) {
            norm = sing;
          }
      }
      return norm;
   }
Ist performanter als sort (sort braucht n*log(n) Aufwand, meine Variante oben nur n für n=r.length)
Ibn Batuta Auf diesen Beitrag antworten »

Ich hab' das in der Arbeit rumliegen und noch nicht ins SVN eingecheckt, sonst hätte ich es gleich veröffentlichen können.

Kann's nächstes Jahr mal reinstellen.

Ah und danke für die Verbesserung der Laufzeit! Ich war zu faul und hab die faulste Variante verwendet (was ich oft tu). Big Laugh


Ibn Batuta
Ibn Batuta Auf diesen Beitrag antworten »

Und wenn wir schon mit "Java for Mathematicians" dabei sind. Es gibt ein Programm für Lie-Algebren: http://code.google.com/p/simplie/

Man kann das Programm installieren und einfach ausführen....


...oder den Java-Code für eigene Zwecke missbrauchen, da es unter der GNU GPL v3-Lizenz steht. Big Laugh Das einzige Problem an der Sache ist, das ich bisher keine Dokumentation der API gefunden habe.


Ibn Batuta
Gast11022013 Auf diesen Beitrag antworten »

Tanzen

Juhu, Prüfung bestanden!


Ich bin froh, daß ich damit diese Java-Dinge erstmal wieder bei Seite legen kann.

Irgendwie konnte ich mich nicht so richtig mit Java anfreunden, aber zum Glück hat es jetzt trotzdem gereicht.

Ein großer Programmierer werde ich jedenfalls nicht. Big Laugh



Danke nochmal an alle, die mir hier geholfen haben!
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »