info_ref2011:musterloesungen - Informatik 2015

Ein Paar Worte zu den hier vorgestellen Musterlösungen:

  1. Es sind nur Musterlösungen, d.h. es gibt noch viele andere Wege zum Ziel.
  2. Im Text unten seht ihr immer nur die eigentlichen Funktionen, den Rest des Programms könnt ihr jeweils herunterladen.
  3. Der Code ist ausführlich kommentiert, zusätzlich sind die „Knackpunkte“ der Funktionen nochmals beschrieben.
  4. 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. Der Kopf der Funktion sieht folgendermaßen aus:

function fibonacci($anzahl,$text="")

Das zweite Argument wird hirbei vorbelegt, dadurch wird es optional und wir müssen es beim Aufruf der Funktion nicht angeben (können aber natürlich, wenn wir wollen!)

function fibonacci($anzahl,$text="" ){
    $n1 = 1;		           //Erstes Folgenglied der Fibonacci-Folge
    $n2 = 1;	                   //Zweites Folgenglied der Fibonacci-Folge
    $n = 0;		           //n wird später das jeweils neu berechnete Folgenglied
    $ergebnis = array($n1,$n2);    //$ergebnis wird später das Array, dass an das Hauptprogramm zurückgegeben wird; wir können die ersten zwei Folgenglieder schonmal reinsetzen
    for($i = 2; $i < $anzahl; $i++){		
	$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)
	$n2 = $n;			//und das gerade berechnete ($n) wird zum 2ten Folgenglied
	$ergebnis[$i] = $n;		//nun noch das gerade berechnete zu dem Array hinzufügen
 
    }
    if ($text == "element")		//Wird die Funktion mit dem Parameter "element" aufgerufen soll nur das entsprechende Folgenglied 
	return $n;			//zurückgegeben werden
     else
	return $ergebnis;		//ansonsten das Array
}

Das komplette Beispiel könnt ihr hier fertig anschauen und dann auch runterladen: fibonacci.php

Notendurchschnittsfunktion

Hier solltet ihr eine Funktion erstellen, die als Argument ein Array gefüllt mit Noten entgegennimmt, den Durchschnitt berechet und diesen dann zurückgibt. Der Knackpunkt ist hier die for-Schleife: Wir müssen alle Noten aus dem Array nehmen und aufaddieren.

$summe = $summe + $noten[$i];

In jedem Schleifendurchgang wird die „neue Summe“ aus der Addition von „alter Summe“ und des aktuellen Arraywertes erhalten.

function durchschnitt($noten){
    //count($noten) gibt die Länge von $noten zurück, also wieviele Noten eingegeben wurden.
    //Diese Zahl wird in der Variablen $anzahl_noten gespeichert
    $anzahl_noten = count($noten);
 
    $summe = 0
    for($i = 0; $i < $anzahl_noten; $i++){
        $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:notendurchschnitt_1.php

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 „2:1:1“, welche als String gegeben ist, mit der vorgegebenen Funktion explode aufzutrennen. Die einzelnen Teile (also 2,1,1) werden in einem weiteren Array gespeichert.

function gesamtschnitt($schr,$mndl,$prakt,$gewichtung){
    $schnitt_schr = durchschnitt($schr);
    $schnitt_mndl = durchschnitt($mndl);
    $schnitt_prakt = durchschnitt($prakt);
 
    //Wir trennen den String "2:1:1" mit dem Trennzeichen ":" auf. die einzelnen Teilstrings werden in einem Array gespeichert"    
    $gewichtungsarray = explode(":",$gewichtung);
 
    //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, mündlichen und praktischen Notendurchschnitte benutzen wir natürlich die vorher geschriebene Funktion durchnschnitt() Hier könnt ihr wieder das fertige Programm anschauen und runterladen: notendurchschnitt_2.php

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.

function mnf($a,$b,$c){
    //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/(2*$a);
	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,$x_2);
	return $ergebnis;
    }
 
}

Die von PHP bereitgestellte Funktion sqrt() berechnet die Wurzel der ihr übergebenen Zahl. Hier gibt's das komplette Beispiel: mitternachtsformel.php

Skalarprodukt

Nochmal die Gedächtnisstütze zum anguggen:

http://www.rither.de/a/mathematik/lineare-algebra-und-analytische-geometrie/winkel/winkel-zwischen-vektor-und-vektor/

Der Kopf der Funktion sieht folgendermaßen aus:

function sprodukt($a,$b,$text="")

Das zweite Argument wird hierbei vorbelegt, dadurch wird es optional und wir müssen es beim Aufruf der Funktion nicht angeben (können aber natürlich, wenn wir wollen!) Für die Fallunterscheidung verwenden wir wieder eine if-Abfrage. Um den Winkel zwischen den Vektoren zu berechnen gehen wir folgendermaßen vor:

  1. Wir berechnen das Skalarprodukt der Vektoren.
  2. Dann jeweils deren Länge. abs() gibt den Betrag zurück, sqrt() berechnet die Wurzel.
  3. acos() ist der normale cos^(-1), wird allerdings im Bogenmaß ausgerechnet.
  4. Um den Winkel im Gradmaß zu erhalten benutzen wir die Funktion rad2deg().
function sprodukt($a,$b,$text=""){
    if ($text == "winkel") {
        $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: skalarprodukt.php

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:

$ergebnis[0]=$a[1]*$b[2]-$a[2]*$b[1];

Beim einen Fall der if-Verzweigung wir eben noch die Fläche berechnet.

function kreuzprodukt($a,$b,$text=""){ 
    if ($text == "flaeche"){
        $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;   
     }
     else{
         $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];
         return $ergebnis;    
     }    
}

Vollständiges Beispiel hier: kreuzprodukt.php

Drucken/exportieren