Seite 4 von 25 ErsteErste 1234567814 ... LetzteLetzte
Ergebnis 46 bis 60 von 369

Thema: Ein Narr lernt Java

  1. #46
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Ich glaube zwar, es jetzt halbwegs verstanden zu haben, aber ich kann ja mal ein Beispiel bringen:
    PHP-Code:
    public class AbstandPunktEbene {

        
    /**
         * @param args
         */
        
    public static double abstPktEbene(Ebene ePunkt p)
        {
            
    e.hnf(); //Funktionsaufruf ohne Zuweisung? Da die Funktion weiter unten ein Array zurückgibt, macht das hier irgendwie keinen Sinn.
            
    double d=0;
            
    int i=0;
            for(
    03i++) {
                
    e.hnf()[i] * p.koord(i); //Hier kannst du Klammern sparen Funktionsaufrufe und Arrayindices haben eine höhere Priorität als die Arimethik, die wiederrum folgt Punkt vor Strich, etc.
            
    }
            return(
    Math.abs(e.nullabstand()));
        }


        public static 
    void main(String[] args) {
            
    double[] koordE = new double[3], koordP = new double[3];
            
            
    koordE[0] = 1;
            
    koordE[1] = 2;
            
    koordE[2] = 2;
            
    koordP[0] = 1;
            
    koordP[1] = -1;
            
    koordP[2] = -1;
            
    double b = -3;
            
            
    Ebene e = new Ebene(koordE,b);        
            
    Punkt p = new Punkt(koordP);
            
    System.out.println("Der Abstand der Ebene vom Nullpunkt beträgt " Math.abs(E.Nullabstand()));
            
    double d abstPktEbene(e,p);
            
    System.out.println("Der Abstand von E zu P beträgt " d);
        }

    Wenn ich hier die Methode nicht static mache, dann will er nicht Aber klar, ich hab ja kein Objekt konstruiert, zu dem die Methode gehört, sondern die Methode soll zwei Objekte aus verschiedenen Klassen nehmen und damit was machen. Das ergibt ja schon Sinn , nur warum das "statisch" heißt, das klingt so, als wäre das Gegenstück "dynamisch"
    statisch <-> dynamisch ist insofern schon nicht ganz falsch, als dass man von Objekt bezogenen Methoden davon ausgeht, dass der Objektzustand für den Ablauf der Methode relevant ist, sich also dynamisch ändern kann. Während er bei statischen Methoden davon unabhängig ist.

    Übrigens ist es in Java Konvention, das Variablen und Methoden mit Kleinbuchstaben beginnen, Klassen mit einen Großbuchstaben und Konstanten nur in Großbuchstaben geschrieben werden. Außerdem sollte Eclipse dir eigentlich automatisch einrücken. Immer wenn eine geschweifte Klammer aufgeht, kommt ein Tab mehr dazu und Leerzeichen rund um arithmetische Operatoren und vor und hinter "=" helfen auch der Lesbarkeit. Das ist nicht nur damit wir es besser lesen können, sondern dan findet man auch selbst schneller Fehler.
    Papoy!

  2. #47
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Gute Idee an sich. Aber: Dann könnte ich auch die Klasse "Punkt" erweitern, und wenn ich den Abstand einer Gerade und einer Ebene rechnen will, muss ich die Klasse Gerade oder die Klasse Ebene erweitern. Und für den Abstand zweier Geraden... Deswegen werd ich wohl eher eine Klasse "Abstände" schreiben, die keine Objekte bekommt, sondern nur all die gewünschten Methoden.
    Eine Utilityklasse Abstände ist in der Tat sinnvoller. Das kann ich aus der Praxis bestätigen. Sonst verliert man sehr schnell den Überblick.

    Dein Projektvorhaben ist übrigens recht umfangreich, dafür dass du kaum Javaerfahrung hast. Es könnte einfacher sein, sich erstmal durch ein Tutorial zu schlagen.
    Papoy!

  3. #48
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Zitat Zitat von Tzu Iop Beitrag anzeigen
    Eine Utilityklasse Abstände ist in der Tat sinnvoller. Das kann ich aus der Praxis bestätigen. Sonst verliert man sehr schnell den Überblick.
    Dem schließe ich mich an. Wollte mit dem Beispiel nur darauf hinweisen, wie objektorientierte Programmierung gedacht ist Bei Pegrin sah es so aus, als wenn er jede Methode in ein neues Objekt haut.
    Dein Projektvorhaben ist übrigens recht umfangreich, dafür dass du kaum Javaerfahrung hast. Es könnte einfacher sein, sich erstmal durch ein Tutorial zu schlagen.
    Ja, ohne die Grundlagen schreibst du den Code für diese “recht simple“ Sache noch zehnmal um. Mit geringer Lernkurve.

  4. #49
    Ausgetreten
    Gast
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Gute Idee an sich. Aber: Dann könnte ich auch die Klasse "Punkt" erweitern, und wenn ich den Abstand einer Gerade und einer Ebene rechnen will, muss ich die Klasse Gerade oder die Klasse Ebene erweitern. Und für den Abstand zweier Geraden... Deswegen werd ich wohl eher eine Klasse "Abstände" schreiben, die keine Objekte bekommt, sondern nur all die gewünschten Methoden.
    Vorab: Ich denke auch, dass der Weg vorerst das Beste ist.

    Das ist so eine Situation wo Vererbung ins Spiel kommen könnte. Du machst eine Klasse GeoObjekt mit der Methode messeAbstandZu(GeoObjekt geo) und Ebene, Punkt und Gerade erben davon (im Java-Kontext: erweitern die Klasse).

    Du denkst aber noch zu imperativ, deswegen würde das hier jetzt vielleicht zu weit führen.

  5. #50
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Zitat Zitat von Kaiserin Uschi Beitrag anzeigen
    Vorab: Ich denke auch, dass der Weg vorerst das Beste ist.

    Das ist so eine Situation wo Vererbung ins Spiel kommen könnte. Du machst eine Klasse GeoObjekt mit der Methode messeAbstandZu(GeoObjekt geo) und Ebene, Punkt und Gerade erben davon (im Java-Kontext: erweitern die Klasse).

    Du denkst aber noch zu imperativ, deswegen würde das hier jetzt vielleicht zu weit führen.
    Punkte, Geraden und Ebenen haben eigentlich keine gemeinsamen Eigenschaften. Es ist eher so, dass man aus Punkten Geraden definieren kann und aus Geraden Ebenen, usw.. Der Abstand zwischen zwei Punkten ist etwas völlig andere als der Abstand zwischen einem Punkt und einer Gerade. Da schachtelt man nur wieder if-else-Konstrukte und hat dann doch wieder die Einzelfunktionen.

    Wenn man es unbedingt an die Klassen binden wollte, dann lieber durch ein Interface, dass distTo-Methoden hat, wo jeweils jede geometrische Klasse einmal als Argument vorkommt. Aber dann habe ich wieder Redundanz, weil der Abstand zwischen einem Punkt und Ebene ist ja das gleiche wie zwischen einer Ebene und einem Punkt, aber ich hätte trotzdem zwei Methoden.
    Papoy!

  6. #51
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Zitat Zitat von Tzu Iop Beitrag anzeigen
    PHP-Code:
     public class AbstandPunktEbene 

        
    /** 
         * @param args 
         */ 
        
    public static double abstPktEbene(Ebene ePunkt p
        { 
            
    e.hnf(); //Funktionsaufruf ohne Zuweisung? Da die Funktion weiter unten ein Array zurückgibt, macht das hier irgendwie keinen Sinn.  
    //Doch! das normiert die Ebene ;-)
            
    double d=0
            
    int i=0
            for(
    03i++) { 
                
    e.hnf()[i] * p.koord(i); //Hier kannst du Klammern sparen Funktionsaufrufe und Arrayindices haben eine höhere Priorität als die Arimethik, die wiederrum folgt Punkt vor Strich, etc.  
    // Das war die Suche nach nem Bug, da lag er aber nicht. Vergessen wieder zu ändern ;)
            

            return(
    Math.abs(e.nullabstand())); 
        } 


        public static 
    void main(String[] args) { 
            
    double[] koordE = new double[3], koordP = new double[3]; 
             
            
    koordE[0] = 1
            
    koordE[1] = 2
            
    koordE[2] = 2
            
    koordP[0] = 1
            
    koordP[1] = -1
            
    koordP[2] = -1
            
    double b = -3
             
            
    Ebene e = new Ebene(koordE,b);         
            
    Punkt p = new Punkt(koordP); 
            
    System.out.println("Der Abstand der Ebene vom Nullpunkt beträgt " Math.abs(E.Nullabstand())); 
            
    double d abstPktEbene(e,p); 
            
    System.out.println("Der Abstand von E zu P beträgt " d); 
        } 


    statisch <-> dynamisch ist insofern schon nicht ganz falsch, als dass man von Objekt bezogenen Methoden davon ausgeht, dass der Objektzustand für den Ablauf der Methode relevant ist, sich also dynamisch ändern kann. Während er bei statischen Methoden davon unabhängig ist.

    Übrigens ist es in Java Konvention, das Variablen und Methoden mit Kleinbuchstaben beginnen, Klassen mit einen Großbuchstaben und Konstanten nur in Großbuchstaben geschrieben werden. Außerdem sollte Eclipse dir eigentlich automatisch einrücken. Immer wenn eine geschweifte Klammer aufgeht, kommt ein Tab mehr dazu und Leerzeichen rund um arithmetische Operatoren und vor und hinter "=" helfen auch der Lesbarkeit. Das ist nicht nur damit wir es besser lesen können, sondern dan findet man auch selbst schneller Fehler.
    Ja, das hab ich mal fix geändert, danke

    Zitat Zitat von Tzu Iop Beitrag anzeigen

    Dein Projektvorhaben ist übrigens recht umfangreich, dafür dass du kaum Javaerfahrung hast. Es könnte einfacher sein, sich erstmal durch ein Tutorial zu schlagen.
    Ein Tutorial habe ich durch, naja, größtenteils. Ohne Projekt macht man ja dann doch nix...
    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Dem schließe ich mich an. Wollte mit dem Beispiel nur darauf hinweisen, wie objektorientierte Programmierung gedacht ist Bei Pegrin sah es so aus, als wenn er jede Methode in ein neues Objekt haut.


    Ja, ohne die Grundlagen schreibst du den Code für diese “recht simple“ Sache noch zehnmal um. Mit geringer Lernkurve.
    Die Grundlagen sind mir größtenteils bekannt, selbst wenn man das vielleicht nicht glaubt Es scheitert teils an blöden Fehlern, wie z.B. diesem visibility-Error oder dass mir nicht klar war, wie ich eine Methode schreibe, die Arrays von bestimmten Typ benutzt und ggf umschreibt.

    Zitat Zitat von Kaiserin Uschi Beitrag anzeigen
    Vorab: Ich denke auch, dass der Weg vorerst das Beste ist.

    Das ist so eine Situation wo Vererbung ins Spiel kommen könnte. Du machst eine Klasse GeoObjekt mit der Methode messeAbstandZu(GeoObjekt geo) und Ebene, Punkt und Gerade erben davon (im Java-Kontext: erweitern die Klasse).
    Hmmm... halte ich für nicht so sinnvoll, weil die mathematischen Operationen sehr unterschiedlich sind. Ich wüsste nicht, was die Methode messeAbstandZu(GeoObjekt geo) überhaupt tun soll - also, was sie ausgeben soll. Aber vielleicht ist das
    Du denkst aber noch zu imperativ, deswegen würde das hier jetzt vielleicht zu weit führen.
    der Grund dafür, das ich mir das nicht vorstellen kann. Aber geh gerne mal ins Detail! Ich will ja lernen, wie man objektorientiert programmiert, mein Projekt soll genau dazu dienen, das Programm, das entsteht, brauch ich sicher nich, die paar Formeln kann ich mir noch merken
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  7. #52
    Ausgetreten
    Gast
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Hmmm... halte ich für nicht so sinnvoll, weil die mathematischen Operationen sehr unterschiedlich sind. Ich wüsste nicht, was die Methode messeAbstandZu(GeoObjekt geo) überhaupt tun soll - also, was sie ausgeben soll. Aber vielleicht ist das
    Na, wenn das stimmt was du un Tzu sagen (wovon ich mal stark ausgehe), dann kannst du erst einmal vergessen was ich gerade gesagt habe. Ich kenne mich da wohl doch zu wenig mit den geometrischen Grundlagen aus.

  8. #53
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    PHP-Code:

    public class Tests {    
       public static 
    double[] add(double[] adouble[] b){     
          
    double[] sum;      
          if(
    a.length b.length){         
             
    sum=b;     
          }     
          else{         
             
    sum=a;     
          }     
          
    int i;     
          for(
    i=0;iMath.min(a.lengthb.length);i++){
             
    sum[i]=a[i]+b[i];     
          }     
          return(
    sum); 
       }     
       public static 
    void main(String[] args) {     
          
    double[] = {1,2,2};     
          
    double[] = {1,0,1};     
          
    double[] xArraymethods.add(e,u);     
          for(
    int i=0ix.lengthi++){         
             
    System.out.println(e[i]+"+"+u[i]+"="+x[i]);                 
          }                 
       }

    Erwartete Ausgabe:
    Code:
    1.0+1.0=2.0 
    2.0+0.0=2.0
    2.0+1.0=3.0
    Tatsächliche Ausgabe:
    Code:
    2.0+1.0=2.0 
    2.0+0.0=2.0 
    3.0+1.0=3.0
    Das heißt, die methode add verändert auch den ersten eingespeisten array. Sieht jemand, warum? Ist bestimmt wieder völlig trivial, aber ich seh's nciht
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  9. #54
    Ausgetreten
    Gast
    PHP-Code:
    public class Tests {    
       public static 
    double[] add(double[] adouble[] b){     
          
    double[] sum;      
          if(
    a.length b.length){         
             
    sum=b;     //Fehler liegt hier. Jede Änderung an sum ändert auch b. Bei Arrays ist es so, dass mit dem =-Operator nur Referenz angelegt wird
          
    }     
          else{         
             
    sum=a;     //hier das gleiche. Jede Änderung an sum würde hier a ändern
          
    }     
          
    int i;     
          for(
    i=0;iMath.min(a.lengthb.length);i++){
             
    sum[i]=a[i]+b[i];     
          }     
          return(
    sum); 
       }     
       public static 
    void main(String[] args) {     
          
    double[] = {1,2,2};     
          
    double[] = {1,0,1};     
          
    double[] xArraymethods.add(e,u);     //sollte hier nicht Tests.add() aufgerufen werden
          
    for(int i=0ix.lengthi++){         
             
    System.out.println(e[i]+"+"+u[i]+"="+x[i]);                 
          }                 
       }

    Siehe Kommentare. Du musst eine Kopie von a bzw. b anlegen. Wimre ist das bei Arrays die Methode clone(). Gibt aber auch ArrayCopy irgendwo. (und zwar da: http://www.java-samples.com/showtuto...tutorialid=641)
    Geändert von Ausgetreten (03. Februar 2012 um 14:17 Uhr)

  10. #55
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Ich Idiot, das wusste ich mal Ein echter Klassiker! passiert mir nicht nochmal

    Ja, eigentlich sollte Tests.add() aufgerufen werden, hab die Methode aus Gründen der Einfachheit aus der Arraymethods rüberkopiert.

    Danke
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  11. #56
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Dass für zwei arrays die Abfrage a==b auch false ausgeben kann, wenn Array.equals(a,b) true ausgibt, hängt wohl auch damit zusammen?
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  12. #57
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Alles was keine BuiltIns sind, also die kleingeschriebene Typen, ergibt bei der Zuweisung immer nur eine Shallowcopy und keine Deepcopy, da bei der Zuweisung nur die Referenz kopiert wird. Echte Kopien muss man eigentlich immer von Hand machen.

    PHP-Code:
     import java.util.Arrays;

    public class 
    Tests {    
       public static 
    double[] add(double[] adouble[] b){     
          
    double[] sum;      
          if(
    a.length b.length){         
             
    sum Arrays.copyOf(aa.length);
             for(
    int i b.lengthi++) { // Du kannst die Zählervariable auch erst im for definieren, das ist sogar bevorzugt, da sie so nicht nach außerhalb der Schleife sichtbar ist.
                
    sum[i] += b[i];     
             }
          }     
          else{         
             
    sum Arrays.copyOf(bb.length);
             for(
    int i a.lengthi++) {
                
    sum[i] += a[i];     
             }     
          }    
          return(
    sum); 
       } 
    edit:
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Dass für zwei arrays die Abfrage a==b auch false ausgeben kann, wenn Array.equals(a,b) true ausgibt, hängt wohl auch damit zusammen?
    Ja, es werden nur die Refrenzen verglichen. Das "==" klappt nur bei BuiltIn. Für alles andere gibts die Interfaces java.lang.Comparable und java.util.Comparator. Wobei Comparable idR zu bevorzugen ist.
    Papoy!

  13. #58
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Ich hab jetzt ne ganz schicke Lösung gefunden für meine Addiermethode:
    PHP-Code:
    public static double[] add(double[] adouble[] b){        
       
    double[] sum = new double[Math.min(a.lengthb.length)];         
       for(
    int i=0;iMath.min(a.lengthb.length);i++){            
          
    sum[i]=a[i]+b[i];        
       }        
       return(
    sum);    

    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  14. #59
    Minion Avatar von Tzu Iop
    Registriert seit
    28.10.05
    Ort
    Im EG ohne Aufzug *schulterzuck*
    Beiträge
    6.377
    Geht auch allerdings geht bei der Addition halt der überstehende Teil des längeren Arrays verloren.
    Papoy!

  15. #60
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Ja, das ist so vorgesehen, es gibt auch die Variante, bei der der überstehende Teil übernommen wird.
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

Seite 4 von 25 ErsteErste 1234567814 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •