info_ref2011:musterloesungen
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
info_ref2011:musterloesungen [12.05.2011 19:08] – bauer | info_ref2011:musterloesungen [14.05.2011 16:29] (aktuell) – bauer | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ==== Fibonacci Folge ==== | + | Ein Paar Worte zu den hier vorgestellen Musterlösungen: |
+ | - Es sind nur Musterlösungen, | ||
+ | - Im Text unten seht ihr immer nur die eigentlichen Funktionen, den Rest des Programms könnt ihr jeweils herunterladen. | ||
+ | - Der Code ist ausführlich kommentiert, | ||
+ | - So, alle Musterlösungen sind nun da. Bei Fehlern meldet euch bitte! | ||
+ | |||
+ | Und nun viel Spass :-) | ||
+ | |||
+ | ===== Fibonacci Folge ===== | ||
Es war eine Funktion zu erstellen, die als Parameter eine natürliche Zahl entgegen nimmt, dann die Fibonnaci Folge bis zu dieser natürlichen Zahl ausrechnet, in ein Array packt und dieses dann an das Hauptprogramm zurück gibt. | Es war eine Funktion zu erstellen, die als Parameter eine natürliche Zahl entgegen nimmt, dann die Fibonnaci Folge bis zu dieser natürlichen Zahl ausrechnet, in ein Array packt und dieses dann an das Hauptprogramm zurück gibt. | ||
Der Kopf der Funktion sieht folgendermaßen aus: | Der Kopf der Funktion sieht folgendermaßen aus: | ||
Zeile 9: | Zeile 18: | ||
<code php> | <code php> | ||
function fibonacci($anzahl, | function fibonacci($anzahl, | ||
- | $n1 = 1; //Erstes Folgenglied der Fibonacci-Folge | + | |
- | $n2 = 1; //Zweites Folgenglied der Fibonacci-Folge | + | $n2 = 1; //Zweites Folgenglied der Fibonacci-Folge |
- | $n = 0; //n wird später das jeweils neu berechnete Folgenglied | + | $n = 0; //n wird später das jeweils neu berechnete Folgenglied |
- | $ergebnis = array($n1, | + | $ergebnis = array($n1, |
- | for($i = 2; $i < $anzahl; $i++){ | + | for($i = 2; $i < $anzahl; $i++){ |
- | $n = $n1+$n2; //das jeweils neue Folgenglied ist die Summer der beiden vorhergehenden | + | $n = $n1+$n2; //das jeweils neue Folgenglied ist die Summer der beiden vorhergehenden |
- | $n1 = $n2; //Bevor wir das wieder das neue Folgenglied berechnen, wird das vorhergehende Folgenglied ($n2) zum ersten ($n1) | + | $n1 = $n2; //Bevor wir das wieder das neue Folgenglied berechnen, wird das vorhergehende Folgenglied ($n2) zum ersten ($n1) |
- | $n2 = $n; //und das gerade berechnete ($n) wird zum 2ten Folgenglied | + | $n2 = $n; //und das gerade berechnete ($n) wird zum 2ten Folgenglied |
- | $ergebnis[$i] = $n; //nun noch das gerade berechnete zu dem Array hinzufügen | + | $ergebnis[$i] = $n; //nun noch das gerade berechnete zu dem Array hinzufügen |
- | } | + | |
- | if ($text == " | + | if ($text == " |
- | return $n; // | + | return $n; // |
- | else | + | |
- | return $ergebnis; //ansonsten das Array | + | return $ergebnis; //ansonsten das Array |
- | } | + | } |
- | ?> | + | |
</ | </ | ||
- | Das komplette Beispiel könnt ihr hier runterladen: | + | Das komplette Beispiel könnt ihr hier fertig anschauen und dann auch runterladen: |
+ | |||
+ | |||
+ | |||
+ | ===== Notendurchschnittsfunktion ===== | ||
+ | |||
+ | Hier solltet ihr eine Funktion erstellen, die als Argument ein Array gefüllt mit Noten entgegennimmt, | ||
+ | Der Knackpunkt ist hier die **for-Schleife**: | ||
+ | <code php> | ||
+ | $summe = $summe + $noten[$i]; | ||
+ | </ | ||
+ | In jedem Schleifendurchgang wird die "neue Summe" aus der Addition von "alter Summe" und des aktuellen Arraywertes erhalten. | ||
+ | <code php> | ||
+ | function durchschnitt($noten){ | ||
+ | // | ||
+ | //Diese Zahl wird in der Variablen $anzahl_noten gespeichert | ||
+ | $anzahl_noten = count($noten); | ||
+ | |||
+ | $summe = 0 | ||
+ | for($i = 0; $i < $anzahl_noten; | ||
+ | $summe = $summe + $noten[$i]; | ||
+ | } | ||
+ | |||
+ | //Jetzt müssen wir noch die Summe durch die Anzahl der Noten teilen | ||
+ | $ergebnis = $summe / $anzahl_noten; | ||
+ | |||
+ | //Und das Ergebnis mit dem Befehl return wieder an das Hauptprogramm zurückgegeben. | ||
+ | return $ergebnis; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Hier könnt ihr wieder das fertige Programm anschauen und runterladen: | ||
+ | |||
+ | ===== Notendurschnittsfunktion Erweiterung ===== | ||
+ | Diesmal sollte eine Funktion geschrieben werden, die bei Eingabe von 3 Notenarrays und einer Gewichtung den Gesamtschnitt ausrechnet: | ||
+ | Der Knackpunkt war hier, die Gewichtung **" | ||
+ | |||
+ | <code php> | ||
+ | function gesamtschnitt($schr, | ||
+ | $schnitt_schr = durchschnitt($schr); | ||
+ | $schnitt_mndl = durchschnitt($mndl); | ||
+ | $schnitt_prakt = durchschnitt($prakt); | ||
+ | |||
+ | //Wir trennen den String " | ||
+ | $gewichtungsarray = explode(":", | ||
+ | |||
+ | //Nun ganz normal den Schnitt berechnen. array_sum() berechnet die Summe Zahlen im Array | ||
+ | $ergebnis = ($schnitt_schr * $gewichtungsarray[0] + $schnitt_mndl * $gewichtungsarray[1] + $schnitt_prakt * $gewichtungsarray[2]) / array_sum($gewichtungsarray); | ||
+ | |||
+ | return $ergebnis; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Zur Berechnung der schriftlichen, | ||
+ | Hier könnt ihr wieder das fertige Programm anschauen und runterladen: | ||
+ | |||
+ | ===== Mitternachtsformel ===== | ||
+ | Mit dieser Formel lässt sich bekanntlich die Lösungen einer quadratischen Gleichung | ||
+ | ax^2+bx+c = 0 errechnen. | ||
+ | |||
+ | Wir müssen also einfach diese 3 Koeffizienten einlesen und eine Funktion schreiben, die die drei möglichen Fälle mit einer **if-Verzweigung** abfrägt. | ||
+ | |||
+ | <code php> | ||
+ | function mnf($a, | ||
+ | //Der Ausdruck unter der Wurzel heißt Diskriminante und entscheidet, | ||
+ | //ob die Gleichung 1,2 oder keine Lösung hat | ||
+ | $diskriminante = $b*$b - 4*$a*$c; | ||
+ | |||
+ | if ($diskriminante == 0) { //Eine Lösung | ||
+ | $ergebnis = -$b/ | ||
+ | return $ergebnis; | ||
+ | } | ||
+ | else if ($diskriminante < 0 ){ //Keine Lösung | ||
+ | return "Keine reelle Lösung"; | ||
+ | } | ||
+ | else if ($diskriminante > 0) { //zwei Lösungen | ||
+ | $x_1 = (-$b + sqrt($diskriminante) ) / (2*$a); | ||
+ | $x_2 = (-$b - sqrt($diskriminante) ) / (2*$a); | ||
+ | $ergebnis = array($x_1, | ||
+ | return $ergebnis; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Die von PHP bereitgestellte Funktion **sqrt()** berechnet die Wurzel der ihr übergebenen Zahl. | ||
+ | Hier gibt's das komplette Beispiel: {{: | ||
+ | |||
+ | ===== Skalarprodukt ===== | ||
+ | |||
+ | Nochmal die Gedächtnisstütze zum anguggen: | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | Der Kopf der Funktion sieht folgendermaßen aus: | ||
+ | <code php> | ||
+ | function sprodukt($a, | ||
+ | </ | ||
+ | Das zweite Argument wird hierbei **vorbelegt**, | ||
+ | Für die Fallunterscheidung verwenden wir wieder eine **if-Abfrage**. | ||
+ | Um den Winkel zwischen den Vektoren zu berechnen gehen wir folgendermaßen vor: | ||
+ | - Wir berechnen das Skalarprodukt der Vektoren. | ||
+ | - Dann jeweils deren Länge. **abs()** gibt den Betrag zurück, **sqrt()** berechnet die Wurzel. | ||
+ | - **acos()** ist der normale cos^(-1), wird allerdings im **Bogenmaß** ausgerechnet. | ||
+ | - Um den Winkel im Gradmaß zu erhalten benutzen wir die Funktion **rad2deg()**. | ||
+ | |||
+ | <code php> | ||
+ | function sprodukt($a, | ||
+ | if ($text == " | ||
+ | $skal = $a[0]*$b[0]+$a[1]*$b[1]+$a[2]*$b[2]; | ||
+ | $laenge_a = abs(sqrt($a[0]*$a[0]+$a[1]*$a[1]+$a[2]*$a[2])); | ||
+ | $laenge_b = abs(sqrt($b[0]*$b[0]+$b[1]*$b[1]+$b[2]*$b[2])); | ||
+ | $winkel = acos($skal / ($laenge_a * $laenge_b)); | ||
+ | $winkel = rad2deg($winkel); | ||
+ | return $winkel; | ||
+ | } | ||
+ | else { | ||
+ | $ergebnis = $a[0]*$b[0]+$a[1]*$b[1]+$a[2]*$b[2]; | ||
+ | return $ergebnis; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Wie immer hier das fertige Programm: {{: | ||
+ | |||
+ | ===== Kreuzprodukt ===== | ||
+ | Das Kreuzprodukt ist in der analytischen Geometrie der Oberstufe seeehr hilfreich. Ein Grund mehr darüber mal ein Programm zu schreiben: | ||
+ | Wichtig: Beim Kreuzprodukt kommt wieder ein **Vektor** heraus: | ||
+ | <code php> | ||
+ | $ergebnis[0]=$a[1]*$b[2]-$a[2]*$b[1]; | ||
+ | </ | ||
+ | ^^So berechnet ihr den obersten Eintrag des Vektors und speichert in einem Array $ergebnis an der Stelle 0. Und das muss eben für die zwei anderen Stellen noch berechnet werden. | ||
+ | Beim einen Fall der if-Verzweigung wir eben noch die Fläche berechnet. | ||
+ | |||
+ | |||
+ | <code php> | ||
+ | function kreuzprodukt($a, | ||
+ | if ($text == " | ||
+ | $ergebnis[0] = $a[1]*$b[2]-$a[2]*$b[1]; | ||
+ | $ergebnis[1] = $a[2]*$b[0]-$a[0]*$b[2]; | ||
+ | $ergebnis[2] = $a[0]*$b[1]-$a[1]*$b[0]; | ||
+ | $flaeche = sqrt($ergebnis[0]*$ergebnis[0]+$ergebnis[1]*$ergebnis[1]+$ergebnis[2]*$ergebnis[2]); | ||
+ | return $flaeche; | ||
+ | } | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | Vollständiges Beispiel hier: {{: | ||
info_ref2011/musterloesungen.1305227322.txt.gz · Zuletzt geändert: 12.05.2011 19:08 von bauer