Informatik Teil 6: Einführung in die Programmierung



Ähnliche Dokumente
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Leichte-Sprache-Bilder

Wir arbeiten mit Zufallszahlen

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Primzahlen und RSA-Verschlüsselung

Professionelle Seminare im Bereich MS-Office

Informatik 1 Tutorial

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Grundlagen der Theoretischen Informatik, SoSe 2008

der Eingabe! Haben Sie das Ergebnis? Auf diesen schwarzen Punkt kommen wir noch zu sprechen.

Informationsblatt Induktionsbeweis

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Übungen zu C++ Kapitel 1

Abituraufgabe zur Stochastik, Hessen 2009, Grundkurs (TR)

Das Leitbild vom Verein WIR

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Erklärung zum Internet-Bestellschein

Repetitionsaufgaben Wurzelgleichungen

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Alle gehören dazu. Vorwort

Zahlen und das Hüten von Geheimnissen (G. Wiese, 23. April 2009)

1 Mathematische Grundlagen

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Anleitung über den Umgang mit Schildern

Second Steps in eport 2.0 So ordern Sie Credits und Berichte

Erstellen von x-y-diagrammen in OpenOffice.calc

Informatik I Tutorial

Eva Douma: Die Vorteile und Nachteile der Ökonomisierung in der Sozialen Arbeit

Leit-Bild. Elbe-Werkstätten GmbH und. PIER Service & Consulting GmbH. Mit Menschen erfolgreich

Sowohl die Malstreifen als auch die Neperschen Streifen können auch in anderen Stellenwertsystemen verwendet werden.

Übungen Programmieren 1 Felix Rohrer. Übungen

R ist freie Software und kann von der Website.

Fotostammtisch-Schaumburg

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

Computeria Rorschach Mit Excel Diagramme erstellen

Tangentengleichung. Wie lautet die Geradengleichung für die Tangente, y T =? Antwort:

Was ist Sozial-Raum-Orientierung?

Durch Wissen Millionär WerDen... Wer hat zuerst die Million erreicht? spielanleitung Zahl der spieler: alter: redaktion / autor: inhalt:

Zahlen auf einen Blick

FAQ Spielvorbereitung Startspieler: Wer ist Startspieler?

Text-Zahlen-Formatieren

Manager. von Peter Pfeifer, Waltraud Pfeifer, Burkhard Münchhagen. Spielanleitung

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Professionelle Seminare im Bereich MS-Office

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Technische Analyse der Zukunft

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt.

Zeichen bei Zahlen entschlüsseln

Mediator 9 - Lernprogramm

Die Post hat eine Umfrage gemacht

Zahlenwinkel: Forscherkarte 1. alleine. Zahlenwinkel: Forschertipp 1

EMIS - Langzeitmessung

Das Persönliche Budget in verständlicher Sprache

1 Vom Problem zum Programm

Was meinen die Leute eigentlich mit: Grexit?

Was ich als Bürgermeister für Lübbecke tun möchte

Fotos verkleinern mit Paint

Wichtige Forderungen für ein Bundes-Teilhabe-Gesetz

Wollen Sie einen mühelosen Direkteinstieg zum Online Shop der ÖAG? Sie sind nur einen Klick davon entfernt!

Erklärung zu den Internet-Seiten von

Fax einrichten auf Windows XP-PC

Tevalo Handbuch v 1.1 vom

Internet-Wissen. Browser:

Kulturelle Evolution 12

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Informatik für Schüler, Foliensatz 12 Pseudo-Zufallszahlen

Spielmaterial. Hallo! Ich bin der kleine AMIGO und zeige euch, wie dieses Spiel funktioniert. Viel Spaß! von Liesbeth Bos

Anwendungsbeispiele Buchhaltung

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Programmierkurs Java

PowerPoint: Text. Text

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Das muss drin sein. Hallo, wir sind die Partei: DIE LINKE.

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Berechnungen in Access Teil I

Statuten in leichter Sprache

1. Weniger Steuern zahlen

Was man mit dem Computer alles machen kann

Nachhilfe-Kurs Mathematik Klasse 13 Freie Waldorfschule Mitte

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

YouTube: Video-Untertitel übersetzen

Tutorial: Entlohnungsberechnung erstellen mit LibreOffice Calc 3.5

Viele Bilder auf der FA-Homepage

Excel Pivot-Tabellen 2010 effektiv

Fallbeispiel: Eintragen einer Behandlung

Überblick. Lineares Suchen

Was Sie bald kennen und können

AutoCAD Dienstprogramm zur Lizenzübertragung

Zwischenablage (Bilder, Texte,...)

Datensicherung. Beschreibung der Datensicherung

Herzlich Willkommen bei der BITel!

Punkt 1 bis 11: -Anmeldung bei Schlecker und 1-8 -Herunterladen der Software

Wichtig ist die Originalsatzung. Nur was in der Originalsatzung steht, gilt. Denn nur die Originalsatzung wurde vom Gericht geprüft.

Kurzanleitung zur Bereitstellung von Sachverhalten und Lösungen zum Universitätsrepetitorium auf dem Server unirep.rewi.hu-berlin.

Tipp III: Leiten Sie eine immer direkt anwendbare Formel her zur Berechnung der sogenannten "bedingten Wahrscheinlichkeit".

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Transkript:

Informatik Teil 6: Einführung in die Programmierung Gymnasium Icking 2011 Jörg D. Becker, Starnberg In der 7. Jahrgangsstufe stehen Programmierung, Internet und e-mail im Lehrplan. Am liebsten würden die Schüler Spiele und Apps für den ipod schreiben, aber dafür geben große Firmen Millionen aus, damit kann eine einstündige Lehrveranstaltung nicht konkurrieren. Aber immerhin kann man die Grundlagen dafür schaffen, indem man die wichtigsten Konzepte der Programmierung vermittelt. Ein bisschen Grafik machen wir auch, wenn auch mit der sehr geringen Auflösung von etwa 1200-1600 Pixeln! Aber das Prinzip ist ja von der Auflösung unabhängig. Wer mehr machen möchte, kann sich im Internet umschauen. Z.B. gibt es bei www.swingame.com Methoden für die Entwicklung von 2D-Spielen mit Pascal. Pascal ist heute Teil von Delphi, einer mächtigen professionellen Entwicklungsumgebung. Delphi ist allerdings kostenpflichtig. Für den Hausgebrauch gibt es folgende kostenlose Alternativen: Free Pascal (fpc = Free Pascal Compiler), kann als Text-Entwicklungsumgebung von der Konsole bzw. vom Terminal aus mit fp aufgerufen werden. Diese Version wird von der Tastatur aus gesteuert, was aber nach kurzer Einarbeitung sehr effizient ist. (Ein laufendes Programm kann jederzeit mit Strg+C abgebrochen werden.) Eine Alternative ist Lazarus ( Gott hat geholfen ), eine freie, Delphi-ähnliche Umgebung für fpc, die wie Delphi eine GUI-IDE zur Verfügung stellt und die Entwicklung von GUI-Anwendungen ermöglicht. Beide lassen sich aus dem Internet herunterladen, wobei man aufpassen muss, dass man die für sein Betriebssystem vorgesehene Version bekommt. Außerdem gibt es auch ein GNU-Pascal. Die Programme, die wir hier mit Delphi entwickeln, sind jedenfalls (bis auf die Compileranweisungen) mit fpc und Lazarus kompatibel. ist z.b. bei fpc überflüssig. Das Anton-Spiel Anton ist ein wenig einfältig, und er verliert nicht gerne. Deshalb hat er ein Spiel erfunden, das sehr simpel ist und bei dem er immer gewinnt. Das Spielbrett enthält ein Startfeld mit der Nummer 0 und weitere 30 Spielfelder. Außerdem gibt es eine Spielfigur, die ebenfalls Anton heißt, und einen Würfel. Nun würfelt Anton, und die Figur rückt um die der Augenzahl entsprechenden Felder vor. Anton gewinnt, wenn er das 30. Feld erreicht oder überschreitet. Da Anton auch noch faul ist, schreibt er ein Programm, das dem Computer des Spielen überläßt. Es sieht so aus: program Anton; var z, a, n: integer; randomize; n:=0; a:=0; z:=random(5)+1; a:=a+z; n:=n+1; until a >= 30; writeln ( Anton gewinnt in, n, Zügen! ); Dabei musste Anton bestimmte Regeln beachten (diese Regeln nennt man die Syntax einer Programmiersprache): Jedes Programm nt mit program <Name>;. 1

ist eine für Delphi notwendige Compiler-Anweisung, ohne die er z.b. die Prozedur writeln nicht findet. Andere Compiler benötigen hier evtl. andere oder gar keine Anweisungen. Danach folgt die Zutatenliste, d.h. es werden die Variablen deklariert; sie sind hier ganzzahlig (engl.: Integer). Die Namen der Variablen können frei gewählt werden, müssen aber mit einem Buchstaben nen und dürfen nur Buchstaben und Ziffern enthalten. Beispiele: a, z, phi, eps, Rosa, P2, r17. Groß- oder Kleinschreibung ist in Pascal ohne Bedeutung, Rosa, rosa oder rosa sind identisch. Das Rezept, also der Anweisungsteil, nt mit und endet mit. Den Befehl randomize; diskutieren wir weiter unten. Dann werden die Variablen a = Spielstand und n = Anzahl Züge initialisiert. a und n repräsentieren Speicherplätze, in die die Zahl 0 hineingeschrieben wird. Nun nt die Wiederholungsschleife. Es wird eine Zufallszahl zwischen 1 und 6 erzeugt ( random(5) erzeugt eine Zufallszahl zwischen 0 und 5, deshalb wird 1 addiert), und die Zahl wird in den Speicher z geschrieben. In der nächsten Anweisung a:=a+z; werden die in a und z gespeicherten Zahlen gelesen und addiert. Das Ergebnis wird wieder in den Speicher a geschrieben. Das Zeichen := besagt also keine Gleichheit, sondern eine Wertzuweisung. Ebenso wird die Zahl der Spielzüge aktualisiert. Ist a größer oder gleich 30, wird die Schleife beendet und die Siegesnachricht am Bildschirm ausgegeben. Writeln bedeutet write a line, das heißt nach der Ausgabe des Textes springt der Cursor an den Beginn der nächsten Zeile. Die Anführungszeichen... in writeln befinden sich rechts auf der Tastatur über dem Zeichen #. Der Befehl am Ende bewirkt, dass das Ausgabefenster nach Programmausführung erst geschlossen wird, wenn man die Return-Taste drückt. Bei manchen Compilern ist das nicht notwendig. Wer den Befehl randomize mal weglässt, wird sehen, dass Anton in aufeinanderfolgenden Spielen stets dieselbe Zahl an Zügen benötigt. Das könnte sein, wäre aber extrem unwahrscheinlich. Der Grund ist, dass der Computer (in der Regel) gar nicht würfeln kann, sondern deterministisch eine Zahlenfolge generiert, die ein bisschen wie eine Zufallsfolge aussieht; man nennt das Pseudozufallszahlen. Wir betrachten eine ganz simple (und in der Praxis unbrauchbare) Methode. Wir starten mit einer belieben vierstelligen Zahl, z.b. 4711. Diese Anfangszahl wird auch als seed bezeichnet. Wir quadrieren diese Zahl und erhalten 22193521. Wir nehmen die mittleren vier Ziffern heraus, also 1935. Wir quadrieren diese Zahl und erhalten _3744225. Wieder nehmen wir die mittleren Ziffern heraus, also 7442, usw. Die Folge 4 7 1 1 1 9 3 5 7 4 4 2 sieht dann ein bisschen aus wie eine Folge von Zufallszahlen zwischen 0 und 9. Wenn man also mit demselben Seed anfängt, bekommt man immer dieselbe Folge von Zahlen. Für bestimmte Probleme ist das erwünscht, für Anton aber nicht. Der Befehl randomize; bewirkt, dass der Zufallszahlengenerator jedes Mal mit einem anderen zufälligen Seed anfängt. Das Problem mit deterministischen Methoden besteht darin, dass irgendwann die Folge zyklisch wird, d.h. wieder von vorne nt. (Nimm für das oben beschriebene Verfahren mal 1000 als Seed.) Um wirklich gute Folgen von Zufallszahlen zu bekommen, darf man nichts dem Zufall überlassen, wie ich einmal in einem Buch gelesen habe. Obwohl das Spiel ganz simpel ist, lassen sich doch ein paar interessante Fragen stellen: 1. Wieviele Spielzüge braucht Anton mindestens? Wie groß ist die Wahrscheinlichkeit für diesen Spielverlauf? 2. Wieviele Spielzüge braucht Anton höchstens? Wie groß ist die Wahrscheinlichkeit für diesen Spielverlauf? 3. Wieviele Felder umfasst ein Spielzug im Mittel? 2

Das NIM-Spiel Anton hat auch eine Freundin, die Berta heißt. Berta will aber selbst spielen. Anton schreibt deshalb ein Programm, bei dem zwei Spieler gegeneinander spielen können. Berta schlägt das NIM-Spiel vor. Es ist nicht klar, wie der Name entstand; vielleicht ist es nach dem altenglischen nim benannt, was dasselbe heißt wie das deutsche nimm, oder es ist eine Abwandlung des deutschen Wortes. Das Spiel selbst ist wohl uralt. Man legt z (etwa 13 oder 21) Streichhölzer in eine Reihe. Jeder Spieler darf abwechselnd eins, zwei oder drei Streichhölzer wegnehmen. Wer das letzte Streichholz wegnehmen muss, hat verloren. Mit einem einfaches Programm, das als Spielleiter fungiert, können zwei Spieler nun über die Tastatur spielen. program nim; var z, n: integer; z:=21; n:=0; writeln ( Anton, wieviele Streichhoelzer nimmst du? ); readln (n); writeln ( Berta, wieviele Streichhoelzer nimmst du? ); readln (n); until z <= 1; writeln ( Fertig! ); Auch wenn das Programm so schon funktioniert, kann man es noch komfortabler gestalten. Wir wollen es erweitern, um folgende Funktionen einzubauen: Es soll die jeweils aktuelle Zahl der Streichhölzer angezeigt werden. Es soll verhindert werden, dass einer der Spieler schwindelt. Am Ende soll der Gewinner angezeigt werden. Wir haben hier ein paar neue Programmierstrukturen eingebaut:...until ist eine Schleife, die eine unbestimmt oft durchlauefn wird, bis eine Bedingung erfüllt wird. (Trifft die Bedingung nie zu, hört die Schleife erst auf, wenn der Strom ausfällt... oder wenn man das Programm beendet.) For i:=1 to z do ist eine Zählschleife, die genau z mal durchlaufen wird. i ist die Zählvariable, die in die Zutatenliste unter var eingetragen werden muss. if z=1 then leitet eine bedingte Anweisung ein. else leitet eine Anweisung ein, wenn die in if stehende Bedingung nicht zutrifft. Achtung: Am Ende der letzten Anweisung vor else darf kein Semikolon stehen! Eine Folge von mehreren Anweisungen muss in... end; eingeschlossen werden, wenn sie nach for, if oder else ausgeführt werden soll. Eine so eingeschlossene Folge wird als Block bezeichnet. 3

program nim2; var z, n, i: integer; z:=21; n:=0; writeln; writeln ( WILLKOMMEN ZUM NIM-SPIEL! ); writeln; for i:=1 to z do write (! ); writeln; writeln ( Anton, wieviele Streichhoelzer nimmst du, ); write ( 1, 2 oder 3? ); readln (n); until (n=1) or (n=2) or (n=3); for i:=1 to z do write (! ); writeln; if z=1 then writeln ( Anton hat gewonnen! ) else writeln ( Berta, wieviele Streichhoelzer nimmst du, ); write ( 1, 2 oder 3? ); readln (n); until (n=1) or (n=2) or (n=3); for i:=1 to z do write (! ); writeln; if z=1 then writeln ( Berta hat gewonnen! ); end; until z <= 1; Auch hier gibt es wieder interessante Fragen. Gibt es eine Gewinnstrategie? Liegt nur noch ein Holz da, hat der verloren, der als nächster ziehen muss. Wie ist die Situation, wenn noch 5 Hölzer da liegen? Wer als nächster zieht, kann 1, 2 oder 3 Hölzer ziehen; der andere kann in jedem Fall so viele Hölzer ziehen, dass genau eines liegen bleibt. Wie lässt sich diese Strategie fortsetzen? In der Spieltheorie werden Spiele, bei denen der Gewinn des einen gleich dem Verlust des anderen ist, als Nullsummenspiele bezeichnet. Man kann beweisen, dass es in Nullsummenspielen für einen der beiden Spieler eine todsichere Gewinnstrategie gibt. Das trifft auf das Nim-Speil ebenso zu wie für das Schachspiel - nur dass das Schachspiel so komplex ist, dass noch niemand diese Strategie finden konnte. Wie haben die Babylonier Wurzeln gezogen? Wenn a² = b ist, so schreibt man auch a = b und sagt, a sei die Wurzel aus b. Ist b eine Quadratzahl, so lässt sich die Wurzel leicht ziehen: b b 0 0 1 1 4 2 9 3 100 10 Aber was ist die Wurzel aus 2? Die Wurzel aus den meisten Zahlen ist irrational und kann exakt nur durch einen unendlichen Dezimalbruch ausgedrückt werden. Um alle Ziffern zu berechnen, bräuchte man unendlich viel Zeit und Speicherplatz. In der Praxis ist man daher mit endlich vielen Ziffern, also endlicher Genauigkeit, zufrieden. Was geschieht nun in einem Taschenrechner, wenn man 2 berechnet? Die Antwort darauf wussten schon die alten Babylonier usw., obwohl sie natürlich noch im Kopf, auf Tontafeln, auf Papyrus oder auf Pergament rechnen mussten. 4

Betrachten wir die Gleichung x = 1 2 ( x + a ) x Setzen wir auf der rechten Seite für x eine Zahl ein und für a ihr Quadrat, so erhält man als Ergebnis wieder die Zahl x. Was geschieht aber, wenn wir auf der rechten Seite irgendwelche Zahlen für x und a einsetzen? Dann bekommen wir natürlich als Ergebnis meist nicht x, sondern eine andere Zahl, die wir x neu nennen: x neu = 1 ( x + a ) 2 x Wir schreiben nun ein kleines Programm, das uns zeigt, wie sich diese Gleichung verhält, wenn man nun auf der rechten Seite x neu statt x einsetzt, und so fortfährt. Nachdem wir noch nicht wissen, wofuer das gut ist, nennen wir das Programm wofuer. program wofuer; var a, x, xneu: real; write ( Gib bitte a ein: ; readln (a); write ( Gib bitte x ein: ; readln (xneu); writeln ( Weiter jeweils mit return, Ende mit Strg + C ); x:=xneu; xneu:=0.5*(x+a/x); writeln ( xneu =, xneu); until 0 = 1; Da a, x und x neu nicht notwendigerweise ganze Zahlen sein müssen, geben wir als Variablentyp real ein; damit sind Dezimalbrüche ( Kommazahlen ) mit einer (vom Computersystem vorgegebenen) Anzahl von Dezimalstellen gemeint. Bei der Eingabe von Kommazahlen ist zu beachten, dass das Komma hier als Dezimalpunkt geschrieben werden muss, also z.b. 0.5 statt 0,5. Wir spielen dieses Spiel zunächst, indem wir für a eine Quadratzahl eingeben, also 4, 9, 36, 121 oder so. Für x geben wir irgendeine positive Zahl ein. Welche Beobachtung machen wir? In der Tat haben wir damit ein Verfahren gefunden, mit dem wir aus einer beliebigen positiven Zahl a mit beliebiger Genauigkeit eps die Wurzel ziehen können. program wurzel; var a, x, xneu, eps: real; write ( Aus welcher Zahl soll die Wurzel gezogen werden? ); readln (a); xneu:=1; eps:=1e-10; x:=xneu; xneu:=0.5*(x+a/x); until abs(xneu-x) < eps ; writeln ( Die Wurzel aus, a, ist, xneu); Als Startwert geben wir hier xneu := 1; ein. eps (Abkürzung für epsilon) ist die verlangte Genauigkeit; eps := 1E-10; bedeutet 1 10 10. (Ähnlich müsste man für 3.75 10 5 schreiben 3.75E5.) abs(xneu-x) bezeichnet den Absolutbetrag der Differenz, also x neu x. Wir können damit, wie die alten Babylonier, Wurzeln aus beliebigen Zahlen ziehen, also auch aus 2, aus 17, aus 7589, aus 0.75 oder aus 8.34579. 5

Die wenigsten Probleme können exakt gelöst werden; für viele Probleme gibt es aber ähnliche -Verfahren, oder iterative Verfahren, wie man sagt. Wenn man also mit dem Taschenrechner eine Wurzel zieht oder den Sinus von 37 ausrechnet, laufen im Hintergrund immer solche iterativen Verfahren ab. Eleganter wäre es aber nun noch, wenn wir einfach schreiben könnten x:=wurzel(a); Dazu müssen wir die Funktion wurzel erklären - siehe das Programm wurzel2.pas. Eine Funktion haben wir übrigens schon kennen gelernt: random. Sie ist schon eingebaut. program wurzel2; var a: real; function wurzel (a: real):real; var x, xneu, eps: real; xneu:=1; eps:=1e-10; x:=xneu; xneu:=0.5*(x+a/x); until abs(xneu-x) < eps ; wurzel := xneu; end; {Wurzel} {Hauptprogramm} write ( Aus welcher Zahl soll die Wurzel gezogen werden? ); readln (a); x:=wurzel(a); writeln ( Die Wurzel aus, a, ist, x); PS. Es gibt auch schon eine eingebaute Wurzelfunktion (engl.: square root): x:=sqrt(a); 6