1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Java-Problem

Discussion in 'Programmieren' started by psychofreak, Apr 12, 2010.

Thread Status:
Not open for further replies.
  1. 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".

    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");
        }
    }
    Haupziel soll es sein, diesen Code zum laufen zu bringen. Sonstige Kritiken können natürlich auch mitgeteilt werden, aber wenn, dann konstruktiv.

    Danke
     
  2. daboom

    daboom Megabyte

    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... ;)
     
  3. Ok, ich verga&#223; zu erw&#228;hnen das nicht nur die zweite sondern jede beliebige Wurzel gezogen werden k&#246;nnen. Um verschiedene zu testen, werden verschiedene generiert (zwischen 2 und 5, um das mal einzuschr&#228;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&#228;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&#246;hen und pr&#252;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&#252;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");
        }
    }
     
    Last edited: Apr 13, 2010
Thread Status:
Not open for further replies.

Share This Page