Aufgaben zum Praktikum Programmieren II



Ähnliche Dokumente
Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

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

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Faktura. IT.S FAIR Faktura. Handbuch. Dauner Str.12, D Mönchengladbach, Hotline: 0900/ (1,30 /Min)

Professionelle Seminare im Bereich MS-Office

Einfache kryptographische Verfahren

Leichte-Sprache-Bilder

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

Doku zur Gebäudebrüter Datenbank

teischl.com Software Design & Services e.u. office@teischl.com

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

Memeo Instant Backup Kurzleitfaden. Schritt 1: Richten Sie Ihr kostenloses Memeo-Konto ein

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

! " # $ " % & Nicki Wruck worldwidewruck

Anlegen eines DLRG Accounts

Berechnungen in Access Teil I

Fallbeispiel: Eintragen einer Behandlung

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Verschlüsselung. Kirchstraße 18 Steinfelderstraße Birkweiler Bad Bergzabern Fabian Simon Bfit09

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

Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.

Der Kalender im ipad

Internationales Altkatholisches Laienforum

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

Mediator 9 - Lernprogramm

Tevalo Handbuch v 1.1 vom

Hilfe zur Urlaubsplanung und Zeiterfassung

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Speichern. Speichern unter

WORKSHOP für das Programm XnView

Bedienungsanleitung Einsatzplanung. Bedienungsanleitung Einsatzplanung. Inhalt. Bedienung einer Plan-Tabelle

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

-Verschlüsselung mit S/MIME

Bilder zum Upload verkleinern

Anleitung über den Umgang mit Schildern

Schritt 1 - Registrierung und Anmeldung

Funktionsbeschreibung. Lieferantenbewertung. von IT Consulting Kauka GmbH

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Erstellen von x-y-diagrammen in OpenOffice.calc

4.1 Wie bediene ich das Webportal?

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

Anwendungsbeispiele Buchhaltung

Datenbanken Kapitel 2

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Eine Google adresse anlegen und loslegen

Erklärung zum Internet-Bestellschein

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Dokumentation zum Spielserver der Software Challenge

Thema Stichwort Programm Letzte Anpassung Serienbrief erstellen Ablauf

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

1 topologisches Sortieren

Handbuch zum Excel Formular Editor

Carolo Knowledge Base

Programmierkurs Java

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Wasserzeichen mit Paint-Shop-Pro 9 (geht auch mit den anderen Versionen. Allerdings könnten die Bezeichnungen und Ansichten etwas anders sein)

Grundlagen der Theoretischen Informatik, SoSe 2008

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Persönliches Adressbuch

ARCO Software - Anleitung zur Umstellung der MWSt

Microsoft Access 2013 Navigationsformular (Musterlösung)

Stapelverarbeitung Teil 1

Hinweise zum Übungsblatt Formatierung von Text:

Wie halte ich Ordnung auf meiner Festplatte?

Beispiel Shop-Eintrag Ladenlokal & Online-Shop im Verzeichnis 1

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Wie Sie beliebig viele PINs, die nur aus Ziffern bestehen dürfen, mit einem beliebigen Kennwort verschlüsseln: Schritt 1

efa elektronisches Fahrtenbuch im Berliner Ruder-Club

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

TYPO3-Zusatzkurs für

Einkaufslisten verwalten. Tipps & Tricks

Bedienungsanleitung für den SecureCourier

Windows 7 Winbuilder USB Stick

Zertifikat in dakota einlesen Wie lese ich mein Zertifikat in dakota.le ein?

Outlook Erstellen einer aus einer HTML - Vorlage INHALT

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

Kapitel 3 Frames Seite 1

Anzeige von eingescannten Rechnungen

PeDaS Personal Data Safe. - Bedienungsanleitung -

Newsletter. 1 Erzbistum Köln Newsletter

Lernwerkstatt 9 privat- Freischaltung

Seriendruck mit der Codex-Software

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Handbuch für Easy Mail in Leicht Lesen

Stand: Adressnummern ändern Modulbeschreibung

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

-Versand an Galileo Kundenstamm. Galileo / Outlook

Sicherer Datenaustausch mit EurOwiG AG

Erstellen einer digitalen Signatur für Adobe-Formulare

Erstellen der Barcode-Etiketten:

Folgeanleitung für Fachlehrer

Steganos Secure Schritt für Schritt-Anleitung für den Gastzugang SCHRITT 1: AKTIVIERUNG IHRES GASTZUGANGS

Versand einer Exportdatei per , USB-Stick, etc.

Neue Zugangsdaten für sg-online erstellen

ELO Print&Archive so nutzen Sie es richtig

Einfügen von Bildern innerhalb eines Beitrages

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

Transkript:

Aufgaben zum Praktikum Programmieren II Prof. Dr. Thomas Klinker Hochschule für Angewandte Wissenschaften Hamburg Department Informations- und Elektrotechnik 16. September 2013 1

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 1 Aufgabe 1: Knacken Sie den Caesar Code! Ein einfaches Verschlüsselungsverfahren, das schon der römische Kaiser Caesar benutzte, besteht darin, dass man jeden Buchstaben des Klartextes um eine feste Anzahl (z.b. drei) Positionen verschiebt. Aus dem Wort haus würde dann kdxv, und der Text Alle meine Entchen schwimmen auf dem See, schwimmen auf dem See! würde verschlüsselt lauten Dooh phlqh Hqwfkhq vfkzlpphq dxi ghp Vhh, vfkzlpphq dxi ghp Vhh! Wie man sieht, bleiben Groß- und Kleinschreibung erhalten. Wir nehmen der Einfachheit halber an, dass der Originaltext nur normale Buchstaben enthält und keine sprachspezifischen Sonderzeichen wie ä,ö,ü und auch keine Zahlen. Satzzeichen, Leerzeichen und Zeilenvorschubzeichen werden nicht mit verschlüsselt. Die Verschiebung erfolgt zyklisch, d.h. kommt man bei der Verschiebung über das Alphabet hinaus, fängt man vorne wieder an. Die Buchstaben x,y,z würden bei einer Verschiebung um drei Plätze also auf die Buchstaben a,b,c verschoben. Schreiben Sie als erstes ein Programm, welches Klartext über die Tastatur einliest und diesen verschlüsselt. Der chiffrierte Text soll in einer Textdatei gespeichert und zur Kontrolle auf der Console angezeigt werden. Zu Beginn muß das Programm natürlich den Schlüssel erfragen, also fragen, um wieviele Positionen im Alphabet der Klartext verschoben werden soll. Erweitern Sie das Programm nun dergestalt, dass es auch auf obige Weise verschlüsselten Text aus einer Textdatei einlesen und dekodieren kann. Der entschlüsselte Text soll in eine Ausgabedatei (ebenfalls eine Textdatei) geschrieben werden und zusätzlich auf dem Bildschirm angezeigt werden. Die Entschlüsselung ist aber komplizierter als die Verschlüsselung, und zwar aus folgendem Grund. Würde man den Schlüssel (also die Zahl der Positionen, um die das Alphabet bei der Kodierung verschoben wurde) kennen, so müßte man beim Dekodieren die Buchstaben des chiffrierten Textes lediglich um entsprechend viele Positionen zurückverschieben, und würde so leicht den Klartext erhalten. Normalerweise kennt man den Schlüssel aber natürlich nicht, er muß erst ermittelt werden. Da hilft die sogenannte Häufigkeitsanalyse. Der Buchstabe e kommt in deutschen Texten am häufigsten vor. Man muß also in dem verschlüsselten Text, der zu Beginn des Programms aus einer Textdatei eingelesen wird, zählen, wie oft jeder einzelne Buchstabe vorkommt. Der Buchstabe, der am häufigsten vorkommt, entspricht dann wahrscheinlich dem e, und um dessen Abstand zum e muß dann entsprechend zurückverschoben werden. Hierbei muß noch folgende Schwierigkeit beachtet werden. Es kann sein, daß in dem Originalext das e ausnahmsweise nicht der häufigste Buchstabe war. Die Häufigkeitsanalyse liefert dann nicht direkt, mit welchem Buchstaben das e verschlüsselt wurde. In diesem Fall muß man es mit dem zweithäufigsten Buchstaben im chiffrierten Text als Verschlüsselung des e probieren usw..., bis der richtige Schlüssel entdeckt wurde und der chiffrierte Text erfolgreich entschlüsselt werden konnte. Dieses Leistungsmerkmal muß Ihr Programm unbeding erfüllen, und es sollte ausreichend an verschiedene Beispieltexten getestet werden!

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 2 Für die Erstellung des Programms nachfolgend noch ein paar Hinweise: 1. Die normalen Kleinbuchstaben und die normalen Großbuchstaben haben aufeinanderfolgende ASCII-Codes, es sind jeweils 26 Stück, 2. Erinnern Sie sich, dass man mit char-größen rechnen kann: nr = e - a liefert die Position des e relativ zum a (also 4). Ist zeichen eine char-variable so kann man mit zeichen + 4 den Inhalt von zeichen um z.b. 4 Positionen verschieben. 3. Denken Sie außerdem daran, dass die Buchstaben sowohl bei der Kodierung als auch bei der Dekodierung zyklisch verschoben werden. Hierbei hilft wie so oft der Modulo-Operator (also der %-Operator). 4. Mit der Funktion isalpha(), enthalten in der Header-Datei <ctype.h>, können Sie prüfen, ob das betrachtete Zeichen ein Buchstabe ist. 5. Mit der Funktion isupper(), enthalten in der Header-Datei <ctype.h>, können Sie prüfen, ob das betrachtete Zeichen ein Großbuchstabe ist. 6. Mit der Funktion islower(), enthalten in der Header-Datei <ctype.h>, können Sie prüfen, ob das betrachtete Zeichen ein Kleinbuchstabe ist. 7. Weitere Details zu den Funktionen isalpha(), isupper() und islower() finden Sie mit der Hilfe (F1). 8. Die Verwendung der Funktionen getchar(), putchar(), fgetc() sowie fputc() zum Lesen und Schreiben von einzelnen Zeichen kann ebenfalls hilfreich sein. Weitere Details zu diesen Funktionen sollten Sie sich ebenfalls mit der Hilfe (F1) beschaffen. 9. Zu Beginn des Programms soll der Benutzer auswählen können, ob er verschlüsseln (chiffrieren) oder entschlüsseln (dechiffrieren) will. Wenn das zweite Programm fertig ist, sollten Sie folgende Texte entschlüsseln können: Snhmy bjnq jx xhmbjw nxy, bfljs bnw jx snhmy, xtsijws bjnq bnwjxsnhmy bfljs, nxy jx xhmbjw! Xjsjhf oder Kplzly Alea luaohlsa nslpjo cplsl l dpl hhhhhhhhh buk jjjjjjjjj. oder Jwakwfvw kgdd esf fauzl smxzsdlwf! Viel Spaß!

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 3 Aufgabe 2: Programmieren einer Adress-Datenbank mittels doppelt verketteter Liste! In dieser Aufgabe soll eine Adresskartei verwaltet werden, und zwar mittels einer doppelt verketteten Liste. Die verkettete Liste existiert dabei lediglich im Arbeitsspeicher, so daß die Daten am Ende des Programmdurchlaufs nicht mehr vorhanden sind, wenn sie nicht in einer Datei gespeichert werden. Jeder Datensatz soll folgende Daten beinhalten: Name, Vorname, Straße, PLZ, Stadt, Telefonnummer und email-adresse. Das Programm soll folgende Operationen ermöglichen: 1. Alphabetisches Einfügen eines Datensatzes, 2. Löschen eines Datensatzes, 3. Ändern der Adressdaten (folgende Daten eines Datensatzes sollen hierbei änderbar sein: Straße, PLZ, Stadt, Telefonnummer und email-adresse. 4. Anzeigen der aktuellen Liste auf dem Bildschirm. Die Struktur einer doppelt verketteten Liste ist in Abb. 1 dargestellt. Weitere Hinweise für das Arbeiten mit verketteten Listen werden in der Vorlesung gegeben und finden sich im Skript. First Last Daten Daten Daten Vorgaenger Naechster Vorgaenger Naechster Vorgaenger Naechster Abbildung 1: Schematische Darstellung einer doppelt verketteten Liste. Damit das Programm so funktioniert, wie man sich das von einer Datenbank vorstellt, müssen die Daten am Ende eines Programmdurchlaufs in einer Datei gespeichert werden, um bei einem späteren Durchlauf wieder benutzt werden zu können. Das Programm soll also zu Beginn das Öffnen einer Binär-Datei ermöglichen, die bereits vorhandene Datensätze enthält. Das Programm liest dann diese Datensätze ein, baut sie als doppelt verkettete Liste im Arbeitsspeicher auf und zeigt dann den gegenwärtigen Stand der Adresskartei auf dem Bildschirm an. Nun soll der Benutzer alle oben erwähnten Operationen, also Einfügen, Löschen oder Ändern eines Datensatzes ausführen können. Hat er die gewünschten Änderungen der Adresskartei abgeschlossen, so soll er entscheiden können, ob er die gesamte (aktualisierte) Liste wieder in der Datei abspeichern will. Bei der nächsten Ausführung des Programms kann dann mit diesen Daten weitergearbeitet werden.

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 4 Das Anzeigen der Daten auf dem Bildschirm sollte dabei nicht so erfolgen, daß alle Datensätze einfach hintereinander auf der Konsole angezeigt werden. Dies ist problematisch, da ja sehr viele Datensätze vorhanden sein könnten, und eine derartige Darstellung wäre zum einen unhandlich, zum anderen würden die gesamten Datensätze eventuell auch gar nicht auf die Konsole passen. Es soll deshalb immer nur ein aktueller Datensatz angezeigt werden, und man soll dann sowohl vorwärts als auch rückwärts durch die Liste navigieren können, um sich so alle Datensätze von Interesse ansehen zu können. Hier zeigt sich ein wesentlicher Vorteil einer doppelt verketteten Liste gegenüber einer einfach verketteten Liste. Das Anzeigen eines Datensatzes auf der Konsole und das Menue zum Navigieren könnte dabei wie folgt aussehen: Abbildung 2: Darstellung eines Datensatzes auf der Konsole. Für die graphische Ausgabe auf der Konsole könnten die Funktionen hilfreich sein, die in den Files Console.h und Console.cpp enthalten sind (download von homegage), insbesondere die Funktion cls() zum Bildschirmlöschen und die Funktion setcursor(zeile,spalte) zur Cursor- Positionierung. Zum Thema Testen des Programms: Dieses Programm muß wegen der vielen Aktionen, die es ausführen soll, besonders intensiv getestet werden. Ihr Programm kann nach oberflächlichem Testen durchaus noch systematische Fehler oder einfach Flüchtigkeitsfehler enthalten. Versuchen Sie deshalb, durch systematisches Testen möglichst vieler Programmdurchläufe das Vorhandensein von Fehlern so weit wie möglich auszuschließen. Wichtiger Hinweis: Schreiben Sie Ihr Programm unbedingt so, dass man sich durch ganz kleine Änderungen an dem Programm eine Datenbank für alle möglichen anderen Daten (z.b. eine CD-Sammlung oder ähnliches) erstellen kann, und somit das Programm sehr universell eingesetzt werden kann.

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 5 Aufgabe 3a: Sudoku-Checker. Hilft beim Lösen von Sudoku-Rätseln! Ich gehe davon aus, dass Ihnen Sudoku-Rätsel im wesentlichen bekannt sind. Ein typisches solches Rätsel ist in Abb. 3 dargestellt. Die Aufgabe ist, in die noch freien Plätze jeweils eine Zahl aus dem Abbildung 3: Ein Sudoku-Rätsel. Bereich von 1 bis 9 einzutragen. Dabei sind folgende drei Regeln zu beachten: 1) Jede Zahl darf in jeder Zeile nur einmal vorkommen (Zeilenregel), 2) Jede Zahl darf in jeder Spalte nur einmal vorkommen (Spaltenregel), 3) Jede Zahl darf in jedem Unterblock nur einmal vorkommen (Blockregel). Das zu erstellende Programm soll nun bei der Lösung solcher Sudokus helfen. Außerdem ist das Programm gedacht als Vorbereitung auf Aufgabe 4. Das Sudoku-Rätsel soll zu Beginn von einer Textdatei eingelesen werden. Dort hat es die Form: 0 1 0 6 4 0 0 0 9 6 0 0 0 0 0 8 0 0 0 2 0 0 3 9 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 8 0 0 9 0 0 4 7 0 0 0 0 0 3 1 0 0 0 0 1 0 0 0 8 0 0 0 0 0 3 0 0 0 0 5 6 0 0 0 1 4 0 Die 0 steht somit für einen leeren Platz. Aufgabe des Programms ist es nun, dem Benutzer die Eingabe von Zahlen auf den freien Plätzen zu ermöglichen. Das Programm prüft dabei, ob die Zahl erlaubt ist, ob also Zeilenregel, Spaltenregel und Blockregel für die eingegebene Zahl erfüllt sind. Sind die Regeln nicht erfüllt, wird die Zahl abgewiesen, und der Benutzer muss eine neue Zahl probieren. Die Eingabe der Zahl kann dabei über die Angabe von Zeile und Spalte des Feldes im Sudoku-Rätsel erfolgen, ober mittels Cursor-Steuerung mit Hilfe der Pfeiltasten. Letzteres ist sicher eleganter und für den Benutzer wesentlich angenehmer und somit vorzuziehen. Für das Positionieren des Cursors auf der Console kann die Funktion setcursor(int zeile, int spalte) aus der Datei Console.h benutzt werden.

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 6 Abbildung 4: Darstellung des Sudoku-Rätsel auf der Console. Zur komfortableren Benutzung des Programms sollten die (unveränderbaren) Originalzahlen des Sudoku-Rätsels in einer anderen Farbe dargestellt werden, als die Zahlen, die vom Spieler auf den freien Plätzen eingetragen werden, siehe Abb. 4 Hier ist die Funktion bool setcolor( int color ) aus der Datei Console.h hifreich. Die Originalzahlen dürfen natürlich nicht verändert werden. Das Programm muß dies sicherstellen. Ist eine Lösung gefunden, so soll diese in einer Textdatei gemäß dem oben beschriebenen Format abgespeicher werden können. Hinweis: Die Regeln können einerseits in Form eines Algorithmus, also mittels geeigneter Schleifen, implementiert werden, welche die entsprechenden Felder in einer Zeile, Spalte oder einem Block durchlaufen und so prüfen, ob eine bestimmte Zahl in einem bestimmten Feld eingetragen werden kann. Diese Vorgehensweise ist zeitaufwendig, und ihre Verwendung ist deshalb insbesondere bei einem rekursiven Algorithmus (siehe Aufgabe 3b) kritisch. Es ist somit wesentlich effizienter, die Regeln mit Hilfe einer geeigneten Datenstruktur zu implementieren. In dieser Datenstruktur wird wie in einer look-up-tabel einfach markiert, ob in einer bestimmten Zeile oder Spalte oder einem bestimmten Block eine bestimmte Zahl eingetragen wurde. Dies könnte z.b. so aussehen: int zeilenregel[size][size+1]; int spaltenregel[size][size+1]; int blockregel[size][size+1]; Hierbei steht SIZE=9 für die Größe des Sudoku-Feldes. Und weiter bedeutet zeilenregel[i][zahl] = 1, dass in der horizontalen Zeile i eine Zahl mit dem Wert zahl, mit 1 zahl SIZE, eingetragen wurde. Die entsprechende Stelle in der Datenstruktur, welche die Zeilenregel repräsentiert, wird also einfach von 0 auf 1 gesetzt. Analog bedeutet spaltenregel[j][zahl] = 1, dass in der vertikalen Spalte j eine Zahl mit dem Wert zahl, mit 1 zahl SIZE, eingetragen wurde. Und schließlich bedeutet blockregel[k][zahl] = 1, dass in dem entsprechenden Block k eine Zahl mit dem Wert zahl, mit 1 zahl SIZE, eingetragen wurde.

Programmieren in C - Teil II, Praktikumsaufgaben, Prof. Dr. Thomas Klinker 7 Aufgabe 3b: Sudoku-Solver. Löst Sudoku-Rätsel mit einem Backtracking-Algorithmus! In dieser Aufgabe soll ein Programm geschrieben werden, dass beliebige Sudoku-Rätsel vollständig löst, und zwar mit Hilfe eines rekursiven Backtracking-Algorithmus. In der Vorlesung wird ausführlich auf diese Algorithmen eingegangen. Damit sind für uns Sudoku-Rätsel, egal wie schwierig, in Zukunft kein Problem mehr. Das rekursive Verfahren geht dabei folgendermaßen vor: Beginnend mit dem Feld oben links versucht man, eine erlaubte Zahl einzusetzen, wobei man mit der 1 beginnt und dann solange fortfährt, bis eine erlaubte Zahl gefunden wurde. Konnte auf dem aktuellen Feld eine erlaubte Zahl eingetragen werden, so ruft sich die rekursive Funktion selber wieder auf und versucht, auf dem nächsten freien Feld, wieder mit 1 beginnend, eine erlaubte Zahl einzusetzen. Zeigt sich, dass es nicht möglich ist, auf dem aktuellen Feld eine erlaubte Zahl einzusetzen, weil alle Zahlen von 1 bis 9 auf diesem Feld nicht passen, so geht man wieder ein freies Feld zurück, löscht die dort zuletzt eingesetzte Zahl und probiert, die nächst größere Zahl gegenüber der zuletzt verwendeten einzusetzen (backtracking). Eine Lösung ist gefunden, wenn auf dem letzten Feld unten rechts eine erlaubte Zahl eingesetzt werden konnte. Normalerweise ist ein Sudoku-Rätsel eindeutig lösbar, d.h. es hat nur eine Lösung. Sollte ein Sudoku-Rätsel aber mehrere Lösungen haben, und will man alle Lösungen ermitteln, so fährt man nach dem Auffinden der ersten Lösung einfach in der oben beschriebenen Weise fort. Das heißt, nach dem Auffinden einer Lösung löscht man die auf dem letzten freien Feld eingetragene Zahl wieder und versucht, die nächst größere Zahl einzusetzen. Hat man alle Zahlen von der 1 bis zur 9 durchprobiert, geht man zurück auf das vorletzte freie Feld und versucht dort, soweit dies möglich ist, die nächst größere Zahl gegenüber der zuletzt verwendeten einzusetzen, und entwickelt sich so gegebenfalls immer weiter zurück, bis letztlich auf allen Feldern alle möglichen Zahlen durchprobiert wurden. Obwohl es ernorm viele Kombinationen gibt, die durchprobiert werden müssen, schafft es das Programm sehr schnell (in der Regel in weniger als einer Sekunde), die Lösung eines Sudoku-Rätsels zu finden. Das Programm soll zu Beginn das Sudoku-Rätsel von einer Textdatei einlesen (Format genau wie in Aufgabe 3), und dann die gefundene Lösung (bzw. die gefundenen Lösungen) in einer weiteren Datei (bzw. weiteren Dateien) abspeichern. Gehört nicht mehr zur Aufgabe! Falls Sie Gefallen an dieser Problemstellung gefunden haben, können Sie sich an die nächste Fragestellung wagen, und über einen Sudoku-Generator nachdenken, also ein Programm, welches eindeutig lösbare Sudoku-Rätsel erzeugt. Hierbei wird der bereits erstellte Sudoku-Solver sehr hilfreich sein.