Warum Kopfrechnen?

Wer gut im Kopfrechnen ist, beherrscht auch noch etwas, was viel essentieller ist: Er kann Ergebnisse abschätzen – das heißt Überschlagsweise prüfen, ob ein Ergebnis stimmt oder nicht. Auch wenn das Ergebnis von einem Taschenrechner errechnet wurde, lohnt es sich das Ergebnis kurz im Kopf überschlagen, denn schnell ist ein Fehler bei der Eingabe passiert.

Um nun Champions in den Grundrechnungsarten zu werden, müssen wir mal dem Computer beibringen was wir von ihm wollen. In unserem Fall ist das einfach. Das Programm soll sich zwei Zahlen aussuchen und dann bestimmen welche Rechenoperation wir durchführen sollen. Als nächstes soll das Programm uns die Aufgabe anzeigen und dann auf unsere Eingabe warten, als Letztes soll er noch unsere Eingabe mit dem korrekten Ergebnis überprüfen. Klingt ja so weit mal simpel ist es auch – eigentlich.
Bevor wir nun in die Tasten hauen, brauchen wir noch ein klein wenig Theorie. Ein Grundelement jeder Programmiersprache sind die sogenannten Variablen. Variablen, sind eigentlich nichts anderes als eine Art Platzhalter, in dem Werte gespeichert werden können – ähnlich wie in einem Formular. Variablen können Texte, Zahlen aber auch ganze Objekte speichern und bei bedarf auch wieder ausgeben. Variablen werden benannt, das heißt wir können ihnen einen Namen geben. Bewährt hat sich die Variable so zu nennen, das der Name den Zweck oder Inhalt (Wert) widerspiegelt. Was ich damit meine: wenn eine variable a heißt und irgendwann im laufe des Programms den Radius eines Kreises beinhalten soll, wäre es sinnvoll die Variable gleich Radius zu nennen.
Als zweites Rüstzeug brauchen wir Zufallszahlen, wir wollen ja nicht immer die gleichen Übungen machen.
Nun könnten wir uns einfach einen Zufallsgenerator programmieren, aber das würde das ganze sprengen, also verwenden wir einfach eine Python Funktion namens randint so wird es einfacher. Um diese Funktion zu verwenden müssen wir dem Python Interpreter zuerst beibringen, das wir diese Funktion verwenden wollen. Dies bewerkstelligen wir mit dem import Befehl.
Was wir noch brauchen sind Bedingungen, schließlich wollen wir ja auch wissen, ob wir richtig gerechnet haben. Bedingungen werden uns noch oft begegnen. Bedienungen werden in Programmiersprachen immer mit if then else abgebildet.

In Python also zum Beispiel.

a = 200
b = 33
if b > a:
   print("b ist größer als a")
elif a == b:
   print("a und b sind gleich")
else:
   print("a ist größer als b")

Was kommt bei unserem obigen Beispiel raus?
Versuchen wir es aus.
Gehen wir auf www.online-python.com und geben die obigen Zeilen ein. Wichtig dabei ist das Python Einrückungen als Strukturelement sieht, das heißt eingerückte Blöcke (z.B. mit Tab) werden als Block interpretiert. Bei unserem kleinen Programm werden die Zeilen zwischen if und elif bzw. Zwischen elif und else eingerückt, damit der Python Interpreter weiß das dies ein Programm Block ist bzw. zu der jeweiligen Bedingung gehört. Solche Blöcke aus Programmzeilen helfen auch die Übersichtlichkeit zu erhöhen.

So was haben wir nun gelernt. Wir können eine Variable deklarieren mit a=200 wobei hier die Variable als sogenannte Integer Variable bestimmt wird. Integer ist eine ganze Zahl. In Python gibt es im Gegensatz zu anderen Programmiersprachen kein absolutes Limit wie hoch oder niedrig eine Zahl ist, das Limit ist der Speicher des Computers – für unsere Zwecke reicht das vollkommen aus.
Eine Sonderfunktion hat in den meisten Programmiersprachen das =. Zum einem wird es meist verwendet um die Gleichheit zu überprüfen, wie in unserem Beispiel als Doppel = zum anderen auch als Zuweisung. Die Zeile a=200 heißt, weise der Variable a die Zahl 200 zu.

Nun wollen wir unser, im Kopf gerechnetes, Ergebnis dem Programm mitteilen, damit es uns sagt, ob wir richtig liegen oder nicht.
Mit input() können wir unserem Programm nun unser Ergebnis mitteilen.
Also schreiben wir unser kleinen Kopfrechentrainer ein klein wenig um:

a = 200
b = 33
print (str(a)+" + "+ str(b) + " = ?")
ergebnis = int(input()) #Hier warten wir auf die Eingabe des Benutzers
if a+b == ergebnis:
   print("richtig!!!")
else:
   print("falsch!!!")

Einen wichtigen Befehl habe ich vorher nicht erklärt int(). Dieser Wandelt einen String (Zeichenkette) oder eine Reale Zahl in einen Int um. Pyhton ist zwar recht flexibel was den Inhalt von Variablen angeht, nur wenn es um Vergleiche geht, kann nur ein String mit einem String oder Zahl mit Zahl verglichen werden. Eine Eingabe ist im Allgemeinen immer ein String, also müssen wir sie in eine Zahl (int) umwandeln, dies können wir mit dem Befehl int(input()) erreichen.

Die Zeile a+b == ergebnis überprüfen wir, ob wir richtig gerechnet haben oder nicht. Je nachdem geben wir “richtig” oder “falsch” aus. Wenn wir

Als nächstes wäre es schön, wenn unser Trainer nicht immer die gleiche Frage stellen würde – sonst wird es irgendwann mal fad. Also soll sich das Programm einfach zwei Zahlen aussuchen. Dies können wir mit einem Zufallszahlen Generator bewerkstelligen. Da Python das von sich aus nicht kann, müssen wir eine sogenannte Bibliothek importieren. Bibliotheken sind nicht anderes als eine Sammlung von Befehlen oder Methoden, die dann im eigenen Programm verwenden können.
Um nun Phyton Zufallszahlen beizubringen fügen wir als erste Zeile
from random import *
hinzu. Das war’s.
Als nächsten Schritt weisen wir unseren Variablen a und b eine Zufallszahl zu.
randint() ist unser Befehl dafür. randint() hat zwei sogenannte Parameter. Parameter sind Variablen, die in einer Funktion verwendet werden können und/oder die Funktion Steuern. Bei unserem randint() Befehl geben, die Parameter die kleinste und größte Zahl an, die zurückgegeben wird. Also randint(1,10) gibt eine zufällige Zahl zwischen eins und zehn zurück.
Wir wollen mal Hunderter-Zahlenraum Kopfrechen Champion werden, daher ändern wir unsere Zeilen a=200 und b=33 in

a=randint (1,100)
b=randint (1,100)

Und schon tut sich mit jeden Mal starten etwas anderes.
So schaut unser kleines Programm nun aus.

from random import *
a = randint(1,100)
b = randint(1,100)
print (str(a)+" + "+ str(b) + " = ?")
ergebnis = int(input()) #Hier warten wir auf die Eingabe des Benutzers
if a+b == ergebnis:
    print("richtig!!!")
else:
    print("falsch!!! richtig wäre: "+str(a+b))

Cool oder?

Jedoch ist es ein wenig Merkwürdig das wir es jedes mal starten müssen um eine Addition im Kopfrechnen zu können.
Um nun ein wenig Pep in die Sache zu bringen brauchen wir etwas das unsere Befehlszeilen immer wieder wiederholt, solange wir es wollen.
Dieses Problem hatten schon dir Urmütter und -väter der Programmiersprachen und haben die sogenannten Schleifen erfunden. Es gibt einfache Schleifen die einfach von 1 bis 10 oder Schleifen die solange schleifen bis ein Ereignis oder Bedingung eintritt.
Wir wollen solang wir Lust haben. Also nehmen wir mal eine Schleife die so lange den Code durchläuft bis wir sagen “Stopp!”.
Unser mittel der Wahl heißt while und im Speziellen while True – damit bewirken wir, dass die Schleife eigentlich niemals Endet, die Bedingung ist immer Wahr und kann nie falsch sein und abbrechen tut die while Schleife nur wenn die Bedingung nicht erfüllt ist.
Nun basteln wir um unseren Code unsere while Schleife und das ganze sieht nun so aus:

from random import *

while True:
a = randint(1,100)
b = randint(1,100)
print (str(a)+" + "+ str(b) + " = ?")
ergebnis = int(input()) #Hier warten wir auf die Eingabe des Benutzers
if a+b == ergebnis:
print("richtig!!!")
else:
print("falsch!!! richtig wäre: "+str(a+b))

Dabei sind zwei Dinge wichtig. Erstens die Einrückungen, die Python sagen das ein Block ist und zweitens das True mit großem T geschrieben wird.
Der Satz hinter dem Hashtag (#) ist ein sogenanntes Kommentar. Kommentare sind zum Einem wichtig damit der Programmiererin oder Programmierer auch noch nach Jahren weiß, was für eine grandiose Idee sie oder er umgesetzt hat und zum Anderen das eine andere Person diesen genialen Einfall nachvollziehen kann.
Das ganze funktioniert nun schon ganz gut aber halt ewig oder bis wir den Stopp Button drücken. Jedoch wäre es besser wir könnten einfach e oder x für Ende eingeben können und das Programm beendet sich dann ganz.
Gedacht getan: Was müssen wir tun? Ganz einfach die Eingabe überprüfen. Wenn wir jedoch in unserem jetzigen Code e eingeben würden, würde unser Programm sich mit einem Fehler beenden, da e sich nicht in einen String umwandeln lassen tut.
Was müssen wir also tun? Zuerst müssen wir die Eingabe des Benutzers prüfen, ob der Benutzer ein e eingeben hat und dann erst die Eingabe in einen Integer umwandeln.
Das Ganze sieht dann so aus:

from random import *

while True:
a = randint(1,100)
b = randint(1,100)
eingabe = input("(e für Ende) " + str(a)+" + "+ str(b) + " = ")
if eingabe == 'e':
   break
ergebnis = int(eingabe)
if a+b == ergebnis:
   print("richtig!!!")
else:
   print("falsch!!! richtig wäre: "+str(a+b))

Wir haben nun die if Abfrage eingebaut ob der Benutzer e gedrückt hat. Dabei fällt uns auf das wir e mit einfachen Hochkomma ‘ abfragen, dies deswegen, weil einzelne Buchstaben so gekennzeichnet werden, während Strings bzw. Texte mit doppeltem Hochkomma “ gekennzeichnet werden.
Weiters haben wir die Eingabe für den Benutzer etwas verbessert. Dem input Befehl kann eine Zeichenkette übergeben werden, hinter der der Befehl auf die Eingabe wartet.

So nun sieht das ganze ja schon ganz gut aus. Mit dem Programm werden wir sicher Addier-Meister. Wir wollen aber alle vier Kopfrechenarten trainieren.

Also erweitern wir unseren Trainer als nächstes um die Multiplikation.
Wir wollen den Trainer auch so gestalten, das er uns zufällige Additions- und Multiplikation Aufgaben aufgibt. Wir brauchen also noch eine Zufallszahl, die unsere Rechenart vorgibt. Zusammen mit ein paar weiteren Ifs nähern wir uns unserem Ziel:

from random import *
while True:
   rechenart = randint(1,2)
   rechenArtZeichen = ""
   a = randint(1,100)
   b = randint(1,100)
   if rechenart == 1:
      richtigesErgebnis = a+b
      rechenArtZeichen = "+"
   if rechenart == 2:
      richtigesErgebnis = ab rechenArtZeichen = ""
      eingabe = input("(e für Ende) " + str(a)+" "+rechenArtZeichen+" "+ str(b) + " = ") #Hier warten wir auf die Eingabe des Benutzers
   if eingabe == 'e':
      break
   ergebnis = int(eingabe)
   if richtigesErgebnis == ergebnis:
      print("richtig!!!")
   else:
      print("falsch!!! richtig wäre: "+str(richtigesErgebnis))

Wir haben nun ein paar neue Variablen eingefügt
rechenart beinhaltet welche Rechenoperation wir durchführen wollen, rechenArtZeichen brauchen wir damit wir dem Benutzer die Rechnung korrekt anzeigen können.
Addieren können wir schon wie im Schlaf. Nun wollen wir auch subtrahieren. Da wir jedoch bei den positiven Zahlen bleiben wollen, müssen wir noch einbauen das a immer größer als b ist, wenn nicht müssen wir sie vertauschen. Gesagt getan:


while True:
     rechenart = randint(1,3)
     rechenArtZeichen = ""
     a = randint(1,100)
     b = randint(1,100)
     #Addition
     if rechenart == 1:
        richtigesErgebnis = a+b
        rechenArtZeichen = "+"
     #Multiplikation
     if rechenart == 2:
        richtigesErgebnis = ab rechenArtZeichen = ""
     #Subtraktion
     if rechenart ==3:
        if a < b:
           temp = b
           b = a
           a=temp
       richtigesErgebnis = a-b
       rechenArtZeichen = "-"
     eingabe = input("(e für Ende) " + str(a)+" "+rechenArtZeichen+" "+ str(b) + " = ") #Hier warten wir auf die Eingabe des Benutzers
     if eingabe == 'e':
        break
     ergebnis = int(eingabe)
     if richtigesErgebnis == ergebnis:
         print("richtig!!!")
     else:
         print("falsch!!! richtig wäre: "+str(richtigesErgebnis)) 

So nun werden wir Meister in der Subtraktion nun kommt das Dividieren. Dividieren wollen wir für uns einfacher machen und wollen ohne Rest rechnen. Das ist etwas knifflig, aber dank einer kleiner Vorkalkulation aber machbar.

from random import *

gesamt = 0
richtige = 0
while True:
    rechenart = randint(1,4)
    rechenArtZeichen = ""
    a = randint(1,100)
    b = randint(1,100)
    if rechenart == 1:
        richtigesErgebnis = a+b
        rechenArtZeichen = "+"
    if rechenart == 2:
        richtigesErgebnis = a*b
        rechenArtZeichen = "*"
    if rechenart ==3:
        if a < b:
            temp = b
            b = a
            a=temp
        richtigesErgebnis = a-b
        rechenArtZeichen = "-"
    if rechenart ==4:
        if a < b:
            temp = b
            b = a
            a=temp
        m = a%b 
        if m > 0:
            a = a-m
        richtigesErgebnis = a/b
        rechenArtZeichen = "/"        
    eingabe = input("(e für Ende) " + str(a)+" "+rechenArtZeichen+" "+ str(b) + " = ") #Hier warten wir auf die Eingabe des Benutzers
    if eingabe == 'e':
        break
    if richtigesErgebnis == ergebnis:
        print("richtig!!!")
        richtige = richtige +1
    else:
        print("falsch!!! richtig wäre: "+str(richtigesErgebnis)) 

Mit der Zeile m=a%b bestimmen wir den Rest der Division wenn der Rest größer ist als 0 dann ziehen wir von a den Rest ab – und wir haben eine ganzzahlige Division.

Was fehlt eigentlich noch? Wir wollen noch wissen wie gut wir waren. Das können wir mit zwei Zählern bewerkstelligen. Einen für die Gesamtzahl an Fragen, einen für die Anzahl der richtigen Antworten.

from random import *

gesamt = 0
richtige = 0
while True:
    rechenart = randint(1,4)
    rechenArtZeichen = ""
    a = randint(1,100)
    b = randint(1,100)
    if rechenart == 1:
        richtigesErgebnis = a+b
        rechenArtZeichen = "+"
    if rechenart == 2:
        richtigesErgebnis = a*b
        rechenArtZeichen = "*"
    if rechenart ==3:
        if a < b:
            temp = b
            b = a
            a=temp
        richtigesErgebnis = a-b
        rechenArtZeichen = "-"
    if rechenart ==4:
        if a < b:
            temp = b
            b = a
            a=temp
        m = a%b 
        if m > 0:
            a = a-m
        richtigesErgebnis = a/b
        rechenArtZeichen = "/"        
    eingabe = input("(e für Ende) " + str(a)+" "+rechenArtZeichen+" "+ str(b) + " = ") #Hier warten wir auf die Eingabe des Benutzers
    if eingabe == 'e':
        break
    gesamt = gesamt +1
    ergebnis = int(eingabe)
    if richtigesErgebnis == ergebnis:
        print("richtig!!!")
        richtige = richtige +1
    else:
        print("falsch!!! richtig wäre: "+str(richtigesErgebnis)) 
print ("Du hast "+str(gesamt)+" Fragen beantwortet! Davon waren "+str(richtige)+"!")

Damit ist unser erstes Lernprogramm fertig.
Du kannst das Programm hier runterladen.