Abitur Informatik > Lineare Datenstrukturen

2013: Kopfrechentraining mit Frau Zusel

Aufgabenstellung

Die Aufgabe beginnt mit einem typischen Kopfrechenbeispiel, wie man es vielleicht aus der Klasse 5 oder 6 kennt.

Die Lehrerin, Frau Zusel, stellt eine Anfangsaufgabe, beispielsweise

3 + 5 = ?

Das Ergebnis, 8, wird dann von einem Schüler gesagt. Dann sagt Frau Zusel beispielsweise "mal 4". Die nächste Schülerin sagt dann 32. Und so geht das immer weiter, bis Frau Zusel keine Lust mehr hat oder jeder Schüler dran war.

Zumindest hat Frau Zusel das bisher immer so gemacht. Jetzt hat Frau Zusel aber einen Programmierkurs belegt und hört zum ersten Mal etwas von Schleifen. Also überlegt sie sich, beim Kopfrechnen immer die gleich fünf oder sechs Rechenoperationen zu verwenden und die dann in einer Schleife zu wiederholen.

In dem Material der Abituraufgabe sind die Rechenoperationen (*3, -4, *2, +1, -2) sowie die Startzahl 2 vorgegeben.

Teilaufgabe a)

Die erste Aufgabe für die Abiturienten ist jetzt, die ersten zehn Werte dieser Rechnung anzugeben, und dafür gibt es dann 2 Punkte.

Teilaufgabe b)

Da Frau Zusel nun diesem Programmierkurs gemacht hat, will sie das Kopfrechnen natürlich auch in einem Programm simulieren, damit sie die Ergebnisse ihrer Schüler besser überprüfen kann. Frau Zusel hält viel von objektorientierter Programmierung, und dazu hat sie erst mal zwei Java-Klassen Aktion und Aktionskette implementiert:

public class Aktion
{
    char operator;
    int  argument;
    String aktionstext;
    
    public Aktion(String pAktionstext)
    {
        aktionstext = pAktionstext;
        operator = aktionstext.charAt(0);
        String argStr = aktionstext.substring(1,aktionstext.length());   
        argument = Integer.parseInt(argStr);
    }
    
    public char gibOperator()
    {
       return operator;
    }
    
    public String gibAktionstext()
    {
       return aktionstext;
    }
    
    public int gibErgebnis(int pWert)
    {
       if (operator == '+') return pWert + argument; else
       if (operator == '-') return pWert - argument; else
       if (operator == '*') return pWert * argument; else
       if (operator == '/') return pWert / argument; else
       return 0;
    }
}

So könnte zum Beispiel eine Implementation dieser Klasse aussehen. In der Abituraufgabe wird allerdings keine Implementation verlangt, den Schülern wird nur die Dokumentation der Klasse gegeben:

Beschreibung siehe folgenden Text

Die Klasse Aktion steht für eine einzelne Rechenaktion. Ruft man den Konstruktor mit dem Parameter "+4" auf, und anschließend gibErgebnis() mit dem Parameter 3, dann liefert die sondierende Methode gibErgebnis() den Wert 7 zurück, weil auf den Wert 3 die Operation +4 ausgeführt wird.

Die Frage, die sich nun stellt, ist die folgende: Wie kann man mehrere solche Aktionen sinnvoll speichern. Den Schülern werden in der Aufgabenstellung dazu zwei Vorschläge gemacht:

  1. Speicherung in einem Array mit Objekten der Klasse Aktion
  2. Speicherung in einer Liste

Die Aufgabe der Abiturienten ist es nun, sowohl für den Vorschlag 1 wie auch für den Vorschlag 2 drei Methoden der Klasse Aktionskette zu implementieren:

public void zurErstenAktion()
public void zurNaechstenAktion()
public Aktion gibAktuelleAktion()

Für diese Aufgabe gibt es bis zu 16 Punkte. In den Erwartungen findet man dann eine für Abituraufgaben typische völlig überfrachtete Implementation, auf die kein normaler Mensch gekommen wäre, der den Umgang mit Arrays gewohnt ist - nach dem Motto "Warum einfach, wenn's auch kompliziert geht?". Aber darauf will ich hier jetzt nicht weiter eingehen.

Teilaufgabe c)

In der nächsten Teilaufgabe sollen die Kandidaten die Klassen Aktion und Aktionskette in ein Implementationsdiagramm überführen, wobei sie die für die Implementation notwendigen zusätzlichen Attribute nicht berücksichtigen sollen. Diese Aufgabe für 8 Punkte ist nicht besonders schwer, es müssen lediglich die Klassennamen oben in die Kästen geschrieben werden, das Kästchen für die Attribute bleibt frei, und in das Kästchen für die Methoden werden die vorgegebenen Methoden in der UML-Syntax geschrieben, zum Beispiel

+gibAktionstext(): String

Bei der Listendarstellung der Aktionskette wird es etwas interessanter, aus dem Attribut-Kasten geht jetzt ein Pfeil zu einem List-Kasten mit dem Inhaltsobjekt Aktion.

Teilaufgabe d)

Nun soll endlich die Simulation des Kopfrechnens realisiert werden. Es soll eine Methode

public List werteBestimmen(int pStart, int pSchritte)

für die Klasse Aktionskette implementiert werden. Dabei ist pStart der Startwert der Rechnung, und pSchritte die Anzahl der Rechenschritte.

In der Implementation wird zunächst ein Objekt der Klasse List erstellt:

List ergebnis = new List();

Dann wird zur ersten Aktion gegangen und eine int-Variable aktuell auf den Startwert gesetzt. Die Schritte werden dann mit einer for-Schleife durchlaufen, in der zunächst die aktuelle Aktion in einer lokalen Variablen der Klasse Aktion gespeichert wird:

Aktion op = gibAktuelleAktion();

Von diesem Objekt kann dann die Methode gibErgebnis() auf die int-Variable aktuell angewandt. Das Ergebnis dieser Rechnung wird dann in dem Listen-Objekt ergebnis gespeichert:

ergebnis.append(new Integer(aktuell));

Anschließend wird zur nächsten Aktion gesprungen, und die for-Schleife wird erneut durchlaufen.

Teilaufgabe e)

Wie immer bei solchen Abituraufgaben kommt nun ein Java-Quelltext der Marke "WasMacheIch", den die Kandidaten analysieren müssen. Dabei ist sogar eine Bewertungsaufgabe in die Aufgabenstellung integriert, die es durchaus in sich hat. Die zu analysierende Methode ermittelt nämlich die Anzahl der Fehler, die ein Schüler bei der Berechnung gemacht hat. Allerdings werden Folgefehler mitgezählt, die sich zwangsläufig ergeben, wenn an einer Stelle der Kette ein Fehler gemacht wurde. Und das ist sicherlich nicht fair gegenüber den zu überprüfenden Schülern.