Willkommen im PC-Welt-Forum
Liebe Leser,
Wenn dies Ihr erster Besuch hier ist, lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Sie müssen sich vermutlich registrieren, bevor Sie Beiträge verfassen können. Klicken Sie rechts auf 'Jetzt registrieren.', um den Registrierungsprozess zu starten.
Wenn dies Ihr erster Besuch hier ist, lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Sie müssen sich vermutlich registrieren, bevor Sie Beiträge verfassen können. Klicken Sie rechts auf 'Jetzt registrieren.', um den Registrierungsprozess zu starten.
Ergebnis 1 bis 3 von 3
Thema: Java-Problem
-
12.04.2010, 20:41 #1
Byte
- Registriert seit
- 11.2007
- Beiträge
- 32
Java-Problem
Hi Leute,
ich habe hier ein schönes Problem für euch. Der Code unten funktioniert nicht so ganz wie er soll. Zweck ist, eine Wurzel mit Hilfe von Intervallschachtelung auf 10 Stellen zu berechen (Infos zur Mathetheorie: hier). Wie der Code genau funtioniert (oder funktioneren sollte), steht in den Kommentaren. Nur noch ein paar kleine Infos:
Wie sich vielleicht erahnen lässt, ist der Code für ein "Algorithmustestsystem" geschrieben. Die Methode bereiteVor() stellt lediglich alle benötigten Daten bereit. starte() ist der eigentliche Algorithmus.
Wer das Ganze testen will, entfernt einfach das extends TestAlgorithmus und ersetzt "testSys.schreibeLog" durch "System.out.print".
Haupziel soll es sein, diesen Code zum laufen zu bringen. Sonstige Kritiken können natürlich auch mitgeteilt werden, aber wenn, dann konstruktiv.Code:import algorithmustest.*; public class IntervallWurzel extends TestAlgorithmus { private double wurzel; private double radikand; private int stellen[] = new int[10]; // [0] vor Komma, der Rest danach private int wurzelExponent; public void bereiteVor() { radikand = 100*Math.random(); testSys.schreibeLog("Aktueller Radikand: " + String.valueOf(radikand) + "\n"); wurzelExponent = (int) Math.round(4*Math.random()+1); testSys.schreibeLog("Aktueller Wurzelexponent: " + String.valueOf(wurzelExponent) + "\n"); } public void starte() { for(int stelle=0; stelle<10; stelle++) { //Auf 10 Stellen genau berechnen double temp=0.0; // der bisher berechnete Wert for(int j=0; j<=stelle-1; j++) { if(j==0) { temp = stellen[j]; } else { temp += stellen[j]/(j*10); // <-- Dieser Teil will nicht } } // temp erhöhen und prüfen, ob die stelle gefunden for(int i=0; i<9; i++) { if(stelle==0) { temp = i; } else { temp+=i/(stelle*10); // <-- Dieser auch nicht } if(Math.pow(temp,wurzelExponent)>radikand) { stellen[stelle]=i-1; break; } stellen[stelle]=9; } // nur für's Debugging testSys.schreibeLog("temp: " + temp + "\t"); testSys.schreibeLog("Stelle " + stelle + ": " + stellen[stelle] + "\n"); } testSys.schreibeLog("\n"); // Nur noch Textformation String nachkommastellen=""; for(int i=1; i<=9; i++) { nachkommastellen += String.valueOf(stellen[i]); } testSys.schreibeLog("Wurzel: " + String.valueOf(stellen[0]) +"," + nachkommastellen + "\n"); } }
Danke
-
13.04.2010, 11:12 #2
Erstmal grundsätzlich folgendes:
1. Die (imo zufällige) Mischung von funktionslokalen und objektlokalen Variablen vermindern die Lesbarkeit und das Verständins ungemein. Bis auf "radikand" und "wurzelexponent" kann doch alles als Variable der "starte()" methode genutzt werden, oder?
2. Was hat "wurzelExponent" für einen Sinn? Das soll doch sicherlich die Zahl sein, mit der Du die jeweiligen Quadrate testest, oder? Die sollte dann natürlich nicht zufällig gewählt (wird bei der Erklärung bei Wiki ja auch nicht getan) sondern von 1 bis ... durchgetestet werden.
So, nu haste erstmal was zum drüber nachdenken...
Geändert von daboom (Morgen um 25:03 Uhr).
-
13.04.2010, 17:52 #3
Byte
- Registriert seit
- 11.2007
- Beiträge
- 32
Ok, ich vergaß zu erwähnen das nicht nur die zweite sondern jede beliebige Wurzel gezogen werden können. Um verschiedene zu testen, werden verschiedene generiert (zwischen 2 und 5, um das mal einzuschränken).
Was die Variablen angeht, hast du vollkommen recht. Sie sollten sogar da stehen, da sie ja Teil des zu testenden Algorithmus sind. Werde das verbessern und im ersten Post editieren.
Danke schon mal
e:
Ok, das mit dem 1. Post editieren geht hier wohl nicht, warum auch immer.
Ich habe jetzt mal aufgeräumt.
Das Problem bleibt das gleiche (wie erwartet).
Code:import algorithmustest.*; public class IntervallWurzel extends TestAlgorithmus { private double radikand; private int wurzelExponent; public void bereiteVor() { radikand = 100*Math.random(); testSys.schreibeLog("Aktueller Radikand: " + String.valueOf(radikand) + "\n"); while(wurzelExponent<=2) { wurzelExponent = (int) Math.round(5*Math.random()); } testSys.schreibeLog("Aktueller Wurzelexponent: " + String.valueOf(wurzelExponent) + "\n"); } public void starte() { double wurzel; int stellen[] = new int[10]; // [0] vor Komma, der Rest danach for(int stelle=0; stelle<10; stelle++) { //Auf 10 Stellen genau berechnen double temp=0.0; // der bisher berechnete Wert for(int j=0; j<=stelle-1; j++) { if(j==0) { temp = stellen[j]; } else { temp += stellen[j]/(j*10); // <-- Dieser Teil will nicht } } // temp erhöhen und prüfen, ob die stelle gefunden for(int i=0; i<9; i++) { if(stelle==0) { temp = i; } else { temp+=i/(stelle*10); // <-- Dieser auch nicht } if(Math.pow(temp,wurzelExponent)>radikand) { stellen[stelle]=i-1; break; } stellen[stelle]=9; } // nur für's Debugging testSys.schreibeLog("temp: " + temp + "\t"); testSys.schreibeLog("Stelle " + stelle + ": " + stellen[stelle] + "\n"); } testSys.schreibeLog("\n"); // Nur noch Textformation String nachkommastellen=""; for(int i=1; i<=9; i++) { nachkommastellen += String.valueOf(stellen[i]); } testSys.schreibeLog("Wurzel: " + String.valueOf(stellen[0]) +"," + nachkommastellen + "\n"); } }Geändert von psychofreak (13.04.2010 um 18:05 Uhr) Grund: Aktualliesierung
Stichworte
12

Zitieren

Lesezeichen