=0); dezi=Math.abs(dezi); do { if (dezi%16 < 10) Bin=dezi%16+Bin; else Bin=(char)(´A´+dezi%16-10)+Bin; dezi=dezi/16; } while (dezi !=0); Bin = "0x" + Bin; if (!vz) Bin="-"+Bin;">

Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

DVG1 - Methoden1 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while (dezi !=0); switch.

Ähnliche Präsentationen


Präsentation zum Thema: "DVG1 - Methoden1 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while (dezi !=0); switch."—  Präsentation transkript:

1 DVG1 - Methoden1 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while (dezi !=0); switch (dezi%16) { } case 10 : Bin = "A"+Bin; break; case 11 : Bin = "B"+Bin; break; case 12 : Bin = "C"+Bin; break; case 13 : Bin = "D"+Bin; break; case 14 : Bin = "E"+Bin; break; case 15 : Bin = "F"+Bin; break; default : Bin = dezi%16+Bin; Bin = "0x" + Bin; if (!vz) Bin="-"+Bin; dezi = dezi/16;

2 DVG1 - Methoden2 int dezi = Integer.parseInt(args[0]); String Bin =""; boolean vz=(dezi>=0); dezi=Math.abs(dezi); do { if (dezi%16 < 10) Bin=dezi%16+Bin; else Bin= (´A´+dezi%16-10)+Bin; dezi=dezi/16; } while (dezi !=0); Bin = "0x" + Bin; if (!vz) Bin="-"+Bin;

3 DVG1 - Methoden3 int dezi = Integer.parseInt(args[0]); String Bin =""; boolean vz=(dezi>=0); dezi=Math.abs(dezi); do { if (dezi%16 < 10) Bin=dezi%16+Bin; else Bin=(char)(´A´+dezi%16-10)+Bin; dezi=dezi/16; } while (dezi !=0); Bin = "0x" + Bin; if (!vz) Bin="-"+Bin;

4 DVG1 - Methoden4 int dezi = Integer.parseInt(args[0]); String Bin =""; boolean vz=(dezi>=0); dezi=Math.abs(dezi); do { if (dezi%2 < 10) Bin=dezi%2 +Bin; else Bin=(char)(´A´+dezi%2 -10)+Bin; dezi=dezi/2 ; } while (dezi !=0); Bin = "" + Bin; if (!vz) Bin="-"+Bin;

5 DVG1 - Methoden5 int dezi = Integer.parseInt(args[0]); String Bin =""; boolean vz=(dezi>=0); dezi=Math.abs(dezi); do { if (dezi%8 < 10) Bin=dezi%8 +Bin; else Bin=(char)(´A´+dezi%8 -10)+Bin; dezi=dezi/8 ; } while (dezi !=0); Bin = "0" + Bin; if (!vz) Bin="-"+Bin;

6 DVG1 - Methoden6 // Parametrisierung int b = 16; String pref = "0X"; int dezi = Integer.parseInt(args[0]); String Bin =""; { boolean vz=(dezi>=0); dezi=Math.abs(dezi); do { if (dezi%b < 10) Bin=dezi%b +Bin; else Bin=(char)(´A´+dezi%b -10)+Bin; dezi=dezi/b ; } while (dezi !=0); Bin = pref + Bin; if (!vz) Bin="-"+Bin; }

7 DVG1 - Methoden7 // Methode static String convertBase ( int dezi, int b, String pref) { String Bin =""; boolean vz=(dezi>=0); dezi=Math.abs(dezi); do { if (dezi%b < 10) Bin=dezi%b +Bin; else Bin=(char)(´A´+dezi%b -10)+Bin; dezi=dezi/b ; } while (dezi !=0); Bin = pref + Bin; if (!vz) Bin="-"+Bin; return Bin; }

8 DVG1 - Methoden8 Methoden

9 DVG1 - Methoden9 Methoden-Definition n Definition: public static mtyp name (typ p1, typ p2,..., typ pN) {.... // Koerper der Methode, beliebige Anweisungen } mtyp definiert den Typ des Wertes der Methode, gibt die Methode keinen Wert zurück muß void angegeben werden. p1, p2,..., pN sind die Parameter der Methode. n Im Körper von Methoden können beliebige Variablen definiert werden. Diese sind nur innerhalb der Methode bekannt. n Methoden können nur in Klassen definiert werden. ==> Es gibt keine Methoden innerhalb von Methoden. Hat die Methode keine Parameter, ist die leere Parameterliste () anzugeben.

10 DVG1 - Methoden10 Methoden-Aufruf Klassenname.Methodenname(p1, p2,..., pN) innerhalb von Ausdrücken oder Klassenname.Methodenname(p1, p2,..., pN); auch möglich wenn die Methode einen Wert zurückgibt, dieser wird dann ignoriert. p1, p2,..., pN können beliebige Ausdrücke sein n Die Ausdrücke werden berechnet und auf Hilfsvariable zugewiesen. n Die Hilfsvariablen werden der Methode übergeben call by value. n Die Werte außerhalb der Methode werden nicht geändert.

11 DVG1 - Methoden11 return-Anweisung Wenn mtyp==void angegeben wurde, kann die Anweisung return ; zum Verlassen der Methode verwendet werden. Fehlt die return - Anweisung wird die Methode am Ende verlassen. Wenn mtyp!=void angegeben wurde, muß mindestens eine Anweisung return ausdruck; enthalten sein die den Wert der Methode berechnet und die Methode verläßt. ausdruck wird in den Typ mtyp konvertiert.

12 DVG1 - Methoden12 public static String convBase(int dezi, int b, String pref) { boolean vz=(dezi>=0); dezi=Math.abs(dezi); String Bin =""; do { if (dezi%b < 10) { Bin=dezi%b+Bin; } else { Bin=(char)('A'+dezi%b-10)+Bin; } dezi=dezi/b; } while (dezi !=0); Bin =pref+Bin; if (!vz) Bin="-"+Bin; return Bin; } public static void main (String[]args) { int dezi = Integer.parseInt(args[0]); System.out.println(dezi+" ist in binaer:"+convBase(dezi,2,"")); System.out.println(dezi+" ist in oktal: "+convBase(dezi,8,"0")); System.out.println(dezi+" ist in hexadezimal: "+convBase(dezi,16,"0X")); }

13 DVG1 - Methoden13 Überladene Methoden n Methoden können überladen werden, d.h. es gibt innerhalb einer Klasse mehrere Methoden mit gleichem Namen, aber unterschiedlicher Parameterliste, d.h. mit unterschiedlicher Anzahl von Parametern oder unterschiedlichen Typen. Der Typ der Methode spielt für die Unterscheidung der Methoden keine Rolle. n Beim Aufruf einer überladenen Methode wird die Menge aller bekannten Methoden in folgenden Schritten eingeschränkt:

14 DVG1 - Methoden14 Name der Methode stimmt überein Anzahl der Parameter stimmt überein Wenn es genau eine Methode gibt deren Parameter dem Typ nach genau mit dem Aufruf übereinstimmen, so wird diese gewählt. ==> Ende Die berechneten Parameter können in die entsprechenden Typen der Methoden-Definition umgewandelt werden. Erfüllt keine Methode diese Bedingungen, ist der Aufruf unzulässig. ==> Ende Existiert für eine Methode eine andere Methode, sodaß alle Parameter der einen Methode in die Typen der anderen konvertiert werden können, wird die andere gestrichen. Bleibt genau eine Methode übrig, so wird diese aufgerufen. ==> Ende Wenn mehrere Methoden übrigbleiben, ist der Aufruf unzulässig. ==> Ende

15 DVG1 - Methoden15 n Beispiel: public static void m (int p1, double p2){...} // m1 public static void m (double p1, int p2){...} // m2 public static void m (double p1, double p2){...} // m3 int i1=0, i2=0; float f1=0f, f2=0f; double d1=0, d2=0; m(i1,d1); // m1 m(d1,i1); // m2 m(d1,d2); // m3 m(f1,f2); // m3 m(i1,f2); // m1 m(i1,i2); // unzulässig alle Methoden haben passende Parameter, m3 wird eliminiert, da m1 spezifischer ist m1 und m2 erfüllen alle Bedingungen, damit ist der Aufruf nicht entscheidbar, also unzulässig.

16 DVG1 - Methoden16 public static int max (int x, int y) { return (x>y)?x:y; } public static long max (long x, long y) { return (x>y)?x:y; } public static float max (float x, float y) { return (x>y)?x:y; } public static double max (double x, double y) { return (x>y)?x:y; }

17 DVG1 - Methoden17 wert = methode(ausdr1, ausdr2,..., ausdrN); h2 = ausdr2 hN = ausdrN h1 = ausdr1 wert = h0 aufrufende Methode aufgerufene Methode Anweisungen der Methode methode werden abgearbeitet, dabei werden die formalen Parameter mit den Werten h1, h2,..., hN belegt h0=return ausdruck;

18 DVG1 - Methoden18 public class testfak { public static long fakultaet (long n) { long fak=1; while (n>1) fak*=n--; return fak; } public static void main (String [] args) { long n = Long.parseLong(args[0]); long f = fakultaet(n); System.out.println(n + "! = " + f); } }

19 DVG1 - Methoden19 System.out.println(n + "! = " + f); long f = h0; h1>1 long fak=1; long n = Long.parseLong(args[0]); h1=n; fak*=h1--; true h0=fak; false

20 DVG1 - Methoden20 Seiteneffekte n Haupteffekte: –Eingaben über Parameter –Ausgaben über den Wert n Seiteneffekte: –Lesen aus Dateien –Lesen im Dialog –Beeinflussung der Arbeitsweise einer Methode durch globale Variable –Schreiben in Dateien –Ausgaben im Dialog –Verändern von globalen Variablen

21 DVG1 - Methoden21 Methode Parameter 1Parameter NParameter 2 Wert Globale Variable Dateien Globale Variable Dateien

22 DVG1 - Methoden22 public class testfak { static boolean debug = false; public static long fakultaet (long n) { long fak=1; if (debug) System.out.println(fak(+n+)); while (n>1) fak*=n--; return fak; } public static void main (String [] args) { long n = Long.parseLong(args[0]); long f = fakultaet(n); System.out.println(n + "! = " + f); } }

23 DVG1 - Methoden23 rekursive Methoden n Methoden die sich direkt oder indirekt selbst aufrufen. –direkte Rekursion: Methode ruft sich selbst auf z.B.: Berechnung der Fakultät mit n!=n*(n-1)! public static long fakultaet(long n) { return (n>0)?n*fakultaet(n-1):1; } –indirekte Rekursion: Methode ruft eine andere Methode auf, die dann die erste Methode aufruft z.B.: A n =B n +B n-1, B n =2*A n-1 +B n-2 wenn n>1, A 0 =A 1 =B 0 =B 1 =1 public static long A(long n) { return (n>1)?B(n)+B(n-1):1; } public static long B(long n) { return (n>1)?2*A(n-1)+B(n-2):1; }

24 DVG1 - Methoden24 n Es muß vom Programmierer sichergestellt werden, daß keine unendlichen Rekursionen auftreten. Z.B. durch Indizes und Abbruchbedingungen (in den Beispielen n). n Rekursive Aufrufe erfordern einen sehr hohen Systemaufwand. Man sollte sie nur nutzen, wo es sinnvoll ist. z.B.: –fakultaet(n) ==> fakultaet(n-1) ==>... ==> fakultaet(0) also n+1 Aufrufe o.k. (?) –A(n) ==> B(n), B(n-1) ==> (A(n-1),B(n-2)),(A(n-2),B(n-3)) ==>... also ca. 2 n Aufrufe ==> nur für kleine n realistisch !!!! Die Methoden werden sehr oft mit den gleichen Parametern aufgerufen. n Rekursionen lassen sich immer vermeiden.

25 DVG1 - Methoden25 public static long A (long n) { long ak=1, akm1=1; long bk=1, bkm1=1, bkm2; for (long k=2;k<=n;k++) { bkm2=bkm1; bkm1=bk; akm1=ak; bk=2*akm1+bkm2; ak=bk+bkm1; } return ak; } public static long A(long n) { return (n>1)?B(n)+B(n-1):1; } public static long B(long n) { return (n>1)?2*A(n-1)+B(n-2):1; }

26 DVG1 - Methoden26 Beispiel: Binomialkoeffizienten

27 DVG1 - Methoden27 Beweis durch vollständige Induktion:

28 DVG1 - Methoden28 neue Rekursionsformel:

29 DVG1 - Methoden29 mögliche Berechnungsformeln

30 DVG1 - Methoden30 public class binomial1 { static boolean debug = true; public static long fakultaet(long n) { long fak=1; if (debug) System.out.print("fakultaet("+n+") = "); while (n>1) fak*=n--; if (debug) System.out.println(fak); return fak; } public static long binomial (long n, long k) { if (debug) System.out.println("binomial("+n+","+k+")"); return fakultaet(n)/(fakultaet(k)*fakultaet(n-k)); } public static void main (String [] args) { long n = Long.parseLong(args[0]); long k = Long.parseLong(args[1]); long b = binomial(n,k); System.out.println("binomial("+n+","+k+") = "+b); }

31 DVG1 - Methoden31 public class binomial2 { static boolean debug = true; public static long binomial (long n, long k) { if (debug) System.out.println("binomial("+n+","+k+")"); if (k>0) return n*binomial(n-1,k-1)/k; return 1; } public static void main (String [] args) { long n = Long.parseLong(args[0]); long k = Long.parseLong(args[1]); long b = binomial(n,k); System.out.println("binomial("+n+","+k+") = "+b); }

32 DVG1 - Methoden32 public class binomial3 { static boolean debug = true; public static long binomial (long n, long k) { if (debug) System.out.println("binomial("+n+","+k+")"); if ((n>k)&(k>0)) return binomial(n-1,k-1)+binomial(n-1,k); return 1; } public static void main (String [] args) { long n = Long.parseLong(args[0]); long k = Long.parseLong(args[1]); long b = binomial(n,k); System.out.println("binomial("+n+","+k+") = "+b); }

33 DVG1 - Methoden33 Vergleich n Methode 1 –einfache Formel –nur für kleine n, da n! berechnet wird –sehr schnell, da keine Rekursion n Methode 2 –liefert auch für recht große n und k brauchbare Werte –schnell, da nur k-fache Rekursion –Achtung: Reihenfolge wichtig n Methode 3 –funktioniert prinzipiell für den größten Bereich –für mittlere n nicht mehr brauchbar wegen der großen Rechenzeit 2 n -fache Rekursion


Herunterladen ppt "DVG1 - Methoden1 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while (dezi !=0); switch."

Ähnliche Präsentationen


Google-Anzeigen