/* Aufgabe 16 - Funktionen : L O T T O ( N ) Der sogenannte Binomialkoeffizient ( K ) (lies N über K) beschreibt, wieviele Möglichkeiten es gibt, aus N vorgegebenen Elementen eine Teilmenge von K Elementen auszuwählen. Z.B. gibt es 5 über 3 Kombinationsmöglichkeiten, 3 "Richtige" aus einer Gruppe von 5 Zahlen auszuwählen. N über K ist definiert als N! / ( K! * (N-K)! ). Dabei steht "X!" für die Fakultät von X, also für 1*2*3*...*X. ... */ public class l16 { public static void main( String args[] ) { System.out.println( "Lotto-Moeglichkeiten : " + binom( 49 , 6 ) ) ; } static double fak( int n ) { int i ; double f = 1.0 ; for ( i=1 ; i<=n ; i++ ) f *= i ; return f ; } static double binom( int N, int K ) { return fak( N ) / ( fak( K ) * fak( N-K ) ) ; } } /* Aufgabe 17 - Sortieren / Funktion mit Array als Referenzparameter Schreiben Sie eine Funktion sort, die ein als Parameter übergebenes Array von Zahlen der Größe nach sortiert. In der Main-Funktion sollen Sie das Array mit Werten vorbesetzen, ihre Funktion sort aufrufen und das sortierte Array ausgeben. */ public class l17 { public static void main( String[] args ) { int[] a1= {1,3,5,2,3,4,6} ; int i1 ; sort( a1 ) ; for ( i1=0 ; i1 < 7 ; i1++ ) System.out.println(a1[i1]) ; } // hier startet das Programm static void sort( int[] l1 ) // hier gibt es ganz viele { int index , laenge , tauschwert ; // verschiedene Lösungen for ( laenge = l1.length ; laenge > 0 ; laenge -- ) for ( index = 1 ; index < laenge ; index ++ ) if ( l1[index] < l1[index-1] ) { tauschwert = l1[index] ; l1[index] = l1[index-1] ; l1[index-1] = tauschwert ; } } } Musterlösungen Seite 1 von 12 /* Aufgabe 18 : Pallindrome 18.1. Schreiben Sie ein Programm, das einen (in der main-Funktion gegebenen) String rückwärts ausgibt. Hinweis: wenn s ein String ist, liefert s.charAt(0) den 1. Buchstaben und s.lenght() die Länge des Strings 18.2. Ein Pallindrom ist ein Wort, das von vorne und von hinten gelesen gleich lautet. Schreiben Sie eine Funktion, die testet und zurückgibt, ob ein als Parameter übergebener String ein Pallindrom ist. Ihre main-Funktion soll diese Funktion mehrfach (mit verschiedenen Teststrings) aufrufen und jeweils das Ergebnis (ist oder ist kein Pallindrom) ausgeben. */ public class l18 // pallindrom { public static void main( String[] args ) { String p = "otto" ; System.out.println( pal(p) ) ; String p2 = "otito" ; System.out.println( pal(p2) ) ; String p3 = "abcda" ; System.out.println( pal(p3) ) ; String p4 = "abccda" ; System.out.println( pal(p4) ) ; } // hier startet das Programm static boolean pal( String s ) // gibt true oder false zurück { int i1 , l = s.length() ; boolean pali = true ; // bisher kein Unterschied da for ( i1=0 ; i1 < l/2 ; i1++ ) if ( s.charAt(i1) != s.charAt(l-i1-1) ) pali = false ; // ein Unterschied genügt ! return pali ; } } /* Aufgabe A19 : Polygone (mit Arrays) A19.1. Die X-Koordinaten und die Y-koordinaten eines Polygons sollen Punkt für Punkt in zwei Arrays X und Y in der main-Funktion festgelegt werden. Sie dürfen annehmen, daß beide Arrays X und Y gleich lang sind. Schreiben Sie eine Funktion, die jeweils aus den X- und Y-Koordinaten zweier Punkte (also ohne das ganze Polygon zu sehen) den Punkteabstand berechnet und eine main-Funktion, die mit Hilfe Ihrer Funktion den Polygonumfang berechnet. A19.2. Ändern Sie Ihr Programm so, daß es die Polygonfläche berechnet. Wenn (X0,Y0) , (X1,Y1) , (X2,Y2) , ... , (Xn,Yn) , (X0,Y0) die Eckpunkte des Polygons sind (der n+1-te Punkt ist gleich dem 0-ten), dann lautet die Formel für die Fläche: (X0*Y1-Y0*X1)/2 + (X1*Y2-Y1*X2)/2 + (X2*Y3-Y2*X3)/2 + ... + (Xn*Y0-X0*Yn)/2 Der Betrag Vorzeichen eingegeben eingegeben dieser Formel berechnet den Flächeninhalt; das ist positiv, wenn die Punktfolge gegen den Uhrzeigersinn wurde, und negativ wenn die Punkte im Uhrzeigersinn wurden. */ Musterlösungen Seite 2 von 12 public class l19 // Polygonumfang und -fläche { public static void main( String[] args ) // hier startet das Programm { double umfang = 0.0 ; // 19.1 double flaeche = 0.0 ; // 19.2 int ecke ; double[] X = { 0, 3, 0 } ; double[] Y = { 0, 0, 4 } ; for ( ecke=1 ; ecke < X.length ; ecke++ ) { umfang += abstand( X[ecke-1], Y[ecke-1], X[ecke], Y[ecke] ) ; flaeche += areal( X[ecke-1], Y[ecke-1], X[ecke], Y[ecke] ) ; } umfang += abstand( X[0], Y[0], X[X.length-1], Y[X.length-1] ) ; flaeche += areal( X[0], Y[0], X[X.length-1], Y[X.length-1] ) ; System.out.println( "Der Umfang ist " + umfang ) ; System.out.println( "Die Fläche ist " + flaeche ) ; // 19.1 // 19.2 // 19.1 // 19.2 } static double abstand( double p1x, double p1y, double p2x, double p2y ) { return Math.sqrt( (p1x-p2x)*(p1x-p2x) + (p1y-p2y)*(p1y-p2y) ) ; } static double areal( double p1x, double p1y, double p2x, double p2y ) { return ( p1x * p2y - p1y * p2x ) / 2 ; } } /* Aufgabe 20 Polygone mit class punkt 20.1. Lösen Sie die Aufgabe 19.1. (Berechnung des Polygonumfangs und Berechnung der Polygonfläche) mit einer Klasse punkt. Ihre main-Funktion soll eine Reihe von Polygon-Eckpunkten definieren, z.B. durch punkt[] polygon = { new punkt(0,4) new punkt(3,0) , new punkt(0,0) } ; die main-Funktion soll das Polygon automatisch schließen, d.h., die main-Funktion soll aus der Array-Länge polygon.length die Eckenanzahl ermitteln und entsprechend oft eine Funktion abstand Aufrufen. Ihre Funktion abstand soll hier (zur Übung) 2 Parameter vom Typ punkt bekommen. (Es geht später noch eleganter.) 20.2. Erweitern Sie Ihre main-Funktion so, daß sie berechnet, welche beiden Punkte zueinander am nächsten sind und den Punktabstand ausgibt (die Kordinaten der Punkte sollen nicht mit ausgegeben werden) */ class punkt { public double x , y ; public punkt(double a,double b){ x=a ; y=b; } } Musterlösungen Seite 3 von 12 public class l20 // Polygon mit class punkt { public static void main( String[] args ) // hier startet das Programm { double umfang = 0.0 ; int ecke ; punkt[] polygon = { new punkt(0,4) , new punkt(3,0) , new punkt(0,0) } ; for ( ecke=1 ; ecke < polygon.length ; ecke++ ) umfang += abstand( polygon[ecke-1], polygon[ecke] ) ; umfang += abstand( polygon[polygon.length-1], polygon[0] ) ; System.out.println( "Der Umfang ist " + umfang ) ; // 20.2. double minabstand = abstand( polygon[0] , polygon[1] ) ; int ecke2 ; for ( ecke=2 ; ecke < polygon.length ; ecke++ ) for ( ecke2=0 ; ecke2 < ecke ; ecke2++ ) if ( abstand( polygon[ecke] , polygon[ecke2] ) < minabstand ) minabstand = abstand( polygon[ecke] , polygon[ecke2] ) ; System.out.println( "minimaler Punktabstand ist " + minabstand ) ; } static double abstand( punkt p1 , punkt p2 ) { return( Math.sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ) ) ; } } /* Aufgabe 21 : Vererbung und Aggregation 21.1. Schreiben Sie ein Programm mit zwei Klassen (punkt und farbpunkt) und einer Klasse a21 für die main-Funktion. Farbpunkt soll eine Unterklasse von punkt sein und zusätzlich ein int-Attribut für die Farbe enthalten (die int-Werte betragen z.B. 0 für schwarz, 1 für gelb , ..., 15 für weiß). Beide Klassen sollen einen Konstruktor erhalten, mit dem alle ihre Attribute gesetzt werden können, und eine Funktion zeige, die alle Attributwerte ausgibt. Ihre Klasse punkt soll eine Funktion zum Verschieben eines Punktes um delta_X und delta_Y enthalten, Ihre Klasse farbpunkt soll eine Funktion anbieten, mit der die Farbe eines Punktes auf einen anderen int-Wert gesetzt werden kann. Ihre main-Funktion soll einen Punkt und einen Farbpunkt definieren, beide um (3,7) verschieben und anschließend die Daten beider Punkte zur Kontrolle ausgeben. 21.2. Ergänzen Sie (zu der Klasse punkt aus 21.1.) eine Klasse Dreieck mit einem Konstruktor, der die Eckpunkte eines Dreiecks setzt, einer Funktion zeige, die die Koordinaten aller 3 Ecken zeigt und einer Funktion verschiebe, die das ganze Dreieck um delta_X, delta_Y verschiebt. Hinweis: Das Dreieck soll aus 3 Eckpunkten bestehen, d.h., es soll die Klasse Punkt als Attributtyp verwenden, nicht von ihr erben! In Ihrer main-Funktion sollen Sie zu Testzwecken ein Dreieck definieren, verschieben und seine Koordinaten anzeigen lassen. */ Musterlösungen Seite 4 von 12 class punkt { public double x , y ; public punkt(double a,double b){ x=a ; y=b; } public void move(double delta_X,double delta_Y){ x+=delta_X ; y+=delta_Y; } public void zeige() { System.out.println( "(" + x + "," + y + ")" ) ; } } class farbpunkt extends punkt { public int farbe ; public farbpunkt( double a, double b, int f ) { super(a,b); farbe = f ; } public void setzeFarbe( int neu ) { farbe = neu ; } public void zeige() { System.out.print( "Farbnr " + farbe + " : " ) ; super.zeige() ; } } class dreieck //a21.2 { public punkt a,b,c ; public dreieck( punkt p1,punkt p2,punkt p3 ) { a=p1 ; b=p2 ; c=p3 ; } public void move( double delta_X, double delta_Y ) { a.move(delta_X,delta_Y) ; b.move(delta_X,delta_Y) ; c.move(delta_X,delta_Y) ; } public void zeige() { System.out.println( "Dreieck:") ; a.zeige(); b.zeige() ; c.zeige() ; } } public class l21 { public static void main( String[] args ) { punkt p1 = new punkt(30,40) ; farbpunkt fp2 = new farbpunkt(60,80,15) ; p1.move(3,7) ; fp2.move(3,7) ; p1.zeige() ; fp2.zeige() ; // hier startet das Programm dreieck d3 = new dreieck( new punkt(10,20), new punkt(30,40), new punkt(50,60) ) ; d3.move(2,3) ; d3.zeige() ; //a21.2 //a21.2 //a21.2 //a21.2 } } Musterlösungen Seite 5 von 12 /* Aufgabe 23 : Dateien und Tastatureingabe 23.1. Legen Sie eine Datei "f1.txt" in Ihrem aktuellen Verzeichnis mit folgendem Inhalt an: 7 56 173 abc7def ijk Kopieren Sie das anliegende Programm und lassen es laufen. Erweitern bzw. verändern Sie das Programm so, daß es die Dateigröße Ihrer Datei f1.txt (incl. Leer- und Sonderzeichen) ausgibt. 23.2. Schreibstil von Journalisten Erweitern Sie Ihr Programm so, daá es z„hlt, wieviele Ausrufezeichen und wieviele Punkte in dem Text vorkommen. Wenn mindestes soviele Punkte wie Ausrufezeichen im Text vorkommen, soll Ihr Programm melden: "Das ist ein normaler Text". Wenn aber mehr Ausrufezeichen als Punkte im Text vorkommen, soll Ihr Programm sagen "Das ist ja BILD-Stil !" Ändern Sie die Eingabedatei entsprechend ab und testen Sie verschiedene Eingabetexte. 23.3. Buchstabenhäufigkeiten Die Verk„ufer des Spieles Scrabble wollen Ihr Spiel jetzt auch in den osteurop„ischen L„ndern vertreiben. Um die Spielchancen ausgewogen zu gestalten, ben”tigen Sie dringend ein Programm, das die H„ufigkeiten von Buchstaben in vorgegebenen Textdateien z„hlt und ausgibt. Helfen Sie den armen Spieleverk„ufern mit einem Programm, das die H„ufigkeiten aller Buchstaben ausgibt. Hinweis: Beschränken Sie sich zur Vereinfachung in Ihrem Eingabetext auf die Buchstaben 'A' bis 'Z' und ignorieren Sie Kleinbuchstaben und Umlaute. Sie k”nnen Ihr Programm A23.2 erweitern. 23.4. Erweitern Sie Ihr Programm aus 23.2 oder 23.3 so, daß es Sie nach dem Namen der Eingabedatei fragt, d.h., daß Sie den Namen der Eingabedatei an der Tastatur eingeben können. */ Musterlösungen Seite 6 von 12 import java.io.* ; public class l23 { public static void main( String[] args ) // hier startet das Programm { try { System.out.println( "Welche Datei soll ich analysieren?" ); // 23.4 BufferedReader ein1 = new BufferedReader( // 23.4 new InputStreamReader(System.in) ) ; // 23.4 String s1 = ein1.readLine() ; // 23.4 FileInputStream is = new FileInputStream( s1 ) ; // 23.4 // 23.1-23.3 nur: FileInputStream is = new FileInputStream( "f1.txt" ) ; BufferedReader ein = new BufferedReader( new InputStreamReader (is) ) ; String s = ein.readLine() ; int zeichenanzahl = 0 ; int punktanzahl = 0 ; int ausrufezeichen = 0 ; int[] anzahl = new int[256] ; char zeichen ; while (s != null) { // Zeile verarbeiten - hier: for (int i=0; i<s.length(); i++) { zeichenanzahl ++ ; zeichen = s.charAt(i) ; if ( zeichen == '.' ) punktanzahl ++ ; if ( zeichen == '!' ) ausrufezeichen ++ ; if ( zeichen >= 'a' && zeichen <='z' ) anzahl[ zeichen ] ++ ; // // // // 23.1 23.2. 23.2. 23.3. // // // // 23.1 23.2+3 23.2 23.2 // 23.3 } zeichenanzahl += 2 ; s = ein.readLine(); // für CR und LF (Zeilenende) // 23.1 // nächste Zeile holen } ein.close() ; // Eingabedatei schließen - entfällt bei System.in System.out.println( zeichenanzahl + " Zeichen in der Datei" ) ; // 23.1 if ( punktanzahl >= ausrufezeichen ) System.out.println( "Normaler Text" ) ; else System.out.println( "Das ist ja Bild-Stil" ) ; // 23.2 for( zeichen = 'a' ; zeichen <= 'p' ; zeichen ++ ) { System.out.println( "Buchstabe " + zeichen + " gibt es " + anzahl[zeichen] + " mal" ) ; } // 23.3 } catch (Exception e) { System.out.println(e) ; } // Ausnahmebehandlung } } /* Aufgabe 24/25: Schadstoffmeßreihe: Ein Umweltforschungsinstitut hat zu verschiedenen Tageszeiten Luftproben ausgewertet und unter anderem den Kohlenmonoxid-Gehalt bestimmt. Die Kohlenmonoxid-Anteile sollen (einer pro Zeile) über die Tastutur eingegeben werden, und die Eingabe wird durch Eingabe eines negativen Wertes abgeschlossen. Für weitere Arbeiten braucht das Institut dringend folgende Programme: Musterlösungen Seite 7 von 12 24.1. Ein Programm soll aus den eingegebenen Werten den größten und den kleinsten Kohlenmonoxid-Anteil und den Mittelwert berechnen und auf dem Bildschirm ausgeben. 24.2. Erweitern Sie das Programm so, daß es die am Bildschirm eingegeben Zahlen in einer Datei abspeichert (einen Wert pro Zeile). Der Benutzer soll den Dateinamen frei wählen können, indem er ihn an der Tastatur eingibt. Sehen Sie sich zur Kontrolle den Inhalt der erzeugten Datei auf dem Bildschirm an. Aufgabe 25: Eigene Dateien lesen: 25. Schreiben Sie ein neues Programm (eine neue Datei a25.java), das die von Aufgabe 24.2. geschriebene Datei liest und die gespeicherten Werte (einen Wert pro Zeile) am Bildschirm ausgibt. */ import java.io.* ; public class l24 { public static void main( String[] args ) // hier startet das Programm { try { System.out.println( "In welche Datei soll ich schreiben?" ); // 24.2 BufferedReader ein = new BufferedReader( // 24.2 new InputStreamReader(System.in) ) ; // 24.2 String s = ein.readLine() ; // 24.2 FileOutputStream os = new FileOutputStream( "f1.out" ) ; // 24.2 PrintWriter aus = new PrintWriter( new OutputStreamWriter (os) ) ; // 24.2 double summe = 0 , wert , min = 100.0 , max = 0.0 ; int wertanzahl = 0 ; // Anteile zwischen 0 und 100 % try { System.out.println( "Bitte CO-Gehalt eingeben " + " ( Abbruch mit negativem Wert )" ); s = ein.readLine() ; wert = (new Double(s)).doubleValue() ; while ( wert>= 0 ) { if ( wert<min ) min = wert ; if ( wert>max ) max = wert ; wertanzahl ++ ; summe += wert ; aus.println(s) ; // 24.2 System.out.println( "Bitte CO-Gehalt eingeben " + " ( Abbruch mit negativem Wert )" ); s = ein.readLine() ; wert = (new Double(s)).doubleValue() ; } } catch (Exception e) { System.out.println(e) ; } // Ausnahmebehandlung aus.close() ; if ( wertanzahl>0 ) { System.out.println( "Mittelwert : " + summe/wertanzahl ) ; System.out.println( "Minimum : " + min ) ; System.out.println( "Maximum : " + max ) ; } else System.out.println( "keinen Wert eingegeben" ) ; } catch (Exception e) { System.out.println(e) ; } // Ausnahmebehandlung } } Musterlösungen Seite 8 von 12 /* Aufgabe 24/25: Schadstoffmeßreihe: Ein Umweltforschungsinstitut hat zu verschiedenen Tageszeiten Luftproben ausgewertet und unter anderem den Kohlenmonoxid-Gehalt bestimmt. Die Kohlenmonoxid-Anteile sollen (einer pro Zeile) über die Tastutur eingegeben werden, und die Eingabe wird durch Eingabe eines negativen Wertes abgeschlossen. Für weitere Arbeiten braucht das Institut dringend folgende Programme: 24.1. Ein Programm soll aus den eingegebenen Werten den größten und den kleinsten Kohlenmonoxid-Anteil und den Mittelwert berechnen und auf dem Bildschirm ausgeben. 24.2. Erweitern Sie das Programm so, daß es die am Bildschirm eingegeben Zahlen in einer Datei abspeichert (einen Wert pro Zeile). Der Benutzer soll den Dateinamen frei wählen können, indem er ihn an der Tastatur eingibt. Sehen Sie sich zur Kontrolle den Inhalt der erzeugten Datei auf dem Bildschirm an. Aufgabe 25: Eigene Dateien lesen: 25. Schreiben Sie ein neues Programm (eine neue Datei a25.java), das die von Aufgabe 24.2. geschriebene Datei liest und die gespeicherten Werte (einen Wert pro Zeile) am Bildschirm ausgibt. */ import java.io.* ; public class l25 { public static void main( String[] args ) // hier startet das Programm { try { System.out.println( "Welche Datei soll ich analysieren?" ); BufferedReader ein1 = new BufferedReader( new InputStreamReader(System.in) ) ; String s1 = ein1.readLine() ; FileInputStream is = new FileInputStream( s1 ) ; BufferedReader ein = new BufferedReader( new InputStreamReader (is) ) ; try { String s = ein.readLine() ; while (s != null) { // Zeile verarbeiten - hier: System.out.println( s ) ; s = ein.readLine(); // nächste Zeile holen } } catch (Exception e) { System.out.println(e) ; } // Ausnahmebehandlung ein.close() ; // Eingabedatei schließen } catch (Exception e) { System.out.println(e) ; } // Ausnahmebehandlung } } Musterlösungen Seite 9 von 12 /* Aufgaben 26 und 27 (Funktionsobjekten als Parameter in Funktionen): A26: Nullstelle allgemein / Schnittpunkte von Funktionen 26.1. Schreiben Sie eine Funktion Nullstelle, die die Nullstelle von beliebigen Funktions-Objekten berechnet (z.B. die Nullstelle vom Tangens zwischen 3 und 4, oder die Nullstelle vom Cotangens zwischen 1 und 2). Sie können dazu Ihre Lösung zur Aufgabe 15 verallgemeinern. Ihre Funktion Nullstelle soll ein Objekt der Klasse function als Parameter haben, d.h. man soll ihr ein beliebiges function-Objekt als Parameter übergeben können (z.B. Tangens) und Startwerte für die Intervallhalbierung. Testen Sie Ihre Nullstellenfunktion, indem sie u.a. die Nullstelle des Tangens im Intervall [6,7] , des Tangens im Intervall [3,4] , des Tangens im Intervall [-0.5,1.5] und des Cotangens im Intervall [1,2] Cotangens(x)=cos(x)/sin(x) von Ihrer Nullstellenfunktion berechnen und in der main-Funktion (!) ausgeben lassen. (Dazu müssen Sie auch Tangens und Cotangens als Unterklasse von function mit je einer run()-Methode programmieren.) Sie sollen voraussetzen, daß man die Funktion Nullstelle von der main-Funktion nur mit solchen function-Objekten und Intervallen aufruft, für die es auch eine Nullstelle gibt, die durch Intervallschachtelung gefunden werden kann. 26.2. Schreiben Sie eine Funktion Schnittpunkt, die (wie die Funktion Nullstelle) durch Intervallschachtelung einen Schnittpunkt von 2 als Parameter übergebenen function-Objekten berechnet. Wie bei der Nullstellenfunktion sollen Sie voraussetzen, daß man die Funktion Schnittpunkt im Hauptprogramm nur mit solchen function-Objekten und Intervallen aufruft, für die es auch einen Schnittpunkt gibt, der durch Intervallschachtelung gefunden werden kann. 26.3. (Zusatzaufgabe:) Evtl. sind Ihre Funktionen Schnittpunkt und Nullstelle recht ähnlich codiert. Wie kann man es vermeiden, die Intervallschachtelung doppelt zu codieren ? =========================================================================== 27. Aufgabe : Numerisches Integrieren: 27.1. Schreiben Sie eine Funktion Integriere, die Ihnen das Integral der Quadrat-Funktion x |-> x*x im jeweils übergebenen Intervall berechnet. Ihre main-Funktion soll die Intervallgrenzen festlegen und das Ergebnis Ihrer Funktion ausgeben. Ihre Funktion Integriere soll Rechtecke aufsummieren: Die Grundseite alle Rechtecke ist dx (z.B. dx = 0.1), die Höhe der Rechtecke ergibt sich aus dem Funktionswert an der Stelle x. Beispiel: Gesucht ist die Fläche unter der Parabel im Intervall von 1 bis 2: Bei dx=0.1 hat das erste Rechteck die Höhe 1.0*1.0, das nächste Rechteck hat die Höhe 1.1*1.1, usw. Kontrollieren Sie, wie sich die Genauigkeit verbessert, wenn Sie dx auf 0.01 und auf 0.001 setzen. 27.2. Verallgemeinern Sie Ihre Funktion Integriere so, daß sie beliebige function-Objekte integrieren kann, und testen Sie diese verallgemeinerte Funktion, indem Sie das Integral von x |-> x*x*x im Intervall von 0 bis 1 und das Integral von x |-> sin(x) im Intervall von 0 bis 3.14 berechnen. (Dazu müssen Sie für Quadrat, Kubik und Sinus auch als je eine Unterklasse von function programmieren) Überprüfen Sie jeweils Ihre Ergebnisse ! */ Musterlösungen Seite 10 von 12 class function // nützlich für alternative Nullstellenberechnung { public double run(double x){ return 0; } ; // wird für Nullfunktion genutzt (s.u.) } class sinus extends function { public double run(double x){ return Math.sin(x) ; } } class cosinus extends function { public double run(double x){ return Math.cos(x) ; } } class differenz extends function // nützlich für alternative Schnittberechnung { function F,G ; public differenz( function f, function g ) { F=f ; G=g ; } public double run(double x){ return F.run(x) - G.run(x) ; } } public class l26 { public static void main( String[] args ) // hier startet das Programm { // FileInputStream is = new FileInputStream("t16.class") ; // BufferedReader ein = new BufferedReader( new InputStreamReader( System.in )) ; function f = new sinus() ; function g = new cosinus() ; final double Untergrenze = -1 ; final double Obergrenze = 1 ; System.out.println( "Die Nullstelle zwischen " + Untergrenze + " und " + Obergrenze + " liegt bei " + nullstelle( f , Untergrenze, Obergrenze ) ) ; //1. Lösung System.out.println( "Die Nullstelle zwischen " + Untergrenze + " und " + Obergrenze + " liegt bei " + Nullstelle( f , Untergrenze, Obergrenze ) ) ; //Alternative System.out.println( "Der Schnittpunkt zwischen " + Untergrenze + " und " + Obergrenze + " liegt bei " + Schnittstelle( f , g , Untergrenze, Obergrenze ) ) ; // 1.Lös. System.out.println( "Der Schnittpunkt zwischen " + Untergrenze + " und " + Obergrenze + " liegt bei " + schnittstelle( f , g , Untergrenze, Obergrenze ) ) ; //Altern. System.out.println( "Das Integral zwischen " + 0 + " und " + Math.PI + " ist " + integral( f , 0, Math.PI ) ) ; } // hier ist die main-Funktion zuende // die folgende Funktion berechnet die Nullstelle zwischen ug und og // eine Alternative Implementierung s.u. static double nullstelle( function f , double ug, double og ) { // hier deklarieren Sie bei Bedarf lokale Variablen final double epsilon = 0.0000001 ; double m ; do { m = (ug+og) / 2 ; if ( f.run(ug) * f.run(m) <= 0 ) og = m ; else ug = m ; } while ( Math.abs(og-ug) > epsilon ) ; return m ; } // hier ist die Funktion nullstelle zuende Musterlösungen Seite 11 von 12 // die folgende Funktion berechnet die Schnittstelle zwischen ug und og // eine Alternative Implementierung s.u. static double Schnittstelle( function f, function g, double ug, double og ) { double epsilon = 0.0000001 ; double m ; do { m = (ug+og) / 2 ; if ( ( f.run(ug)-g.run(ug) ) * ( f.run(m) - g.run(m) ) <= 0 ) og = m ; else ug = m ; } while ( Math.abs(og-ug) > epsilon ) ; return m ; } // hier ist die Funktion Schnittstelle zuende // die folgende Funktion berechnet auch die Nullstelle zwischen ug und og // alternative Implementierung – sofern Schnittstelle schon implementiert ist static double Nullstelle( function f , double ug, double og ) { function nullFunktion = new function() ; return Schnittstelle( f , nullFunktion , ug , og ) ; } // die folgende Funktion berechnet auch die Schnittstelle zwischen ug und og // alternative Implementierung – sofern nullstelle schon implementiert ist static double schnittstelle( function f, function g, double ug, double og ) { differenz d = new differenz(f,g) ; return nullstelle( d , ug , og ) ; } // a27.2: Integral einer beliebigen Funktion static double integral( function f, double ug, double og ) { double step=(og-ug)/100 , flaeche = 0 ; int i=0 ; for( ; i<100 ; i++ ) { flaeche += f.run(ug+i*step) * step ; } return flaeche ; } } Musterlösungen Seite 12 von 12