Sie sind hier
E-Book

Think Like a Programmer

Typische Programmieraufgaben kreativ lösen am Beispiel von C++

AutorV. Anton Spraul
Verlagmitp Verlags GmbH & Co. KG
Erscheinungsjahr2013
Seitenanzahl304 Seiten
ISBN9783826696039
FormatePUB/PDF
Kopierschutzkein Kopierschutz/DRM
GerätePC/MAC/eReader/Tablet
Preis3,99 EUR

  • Von der Aufgabe zur Lösung - so gehen Sie vor
  • Probleme analysieren und schrittweise bearbeiten
  • Systematisches Vorgehen lernen und anwenden

Aus dem Inhalt:
  • Strategien zur Problemlösung
  • Eingabeverarbeitung
  • Statusverfolgung
  • Arrays
  • Zeiger und dynamische Speicherverwaltung
  • Klassen
  • Rekursion
  • Wiederverwendung von Code
  • Rekursive und iterative Programmierung
  • Denken wie ein Programmierer

Sie lernen unter anderem:
  • Probleme in diskrete Einzelteile zerlegen, die sich leichter lösen lassen
  • Funktionen, Klassen und Bibliotheken möglichst effizient nutzen und wiederholt verwenden
  • die perfekte Datenstruktur für eine Aufgabenstellung auswählen
  • anspruchsvollere Programmiertechniken wie Rekursion und dynamischen Speicher einsetzen
  • Ihre Gendanken ordnen und Strategien entwickeln, um bestimmte Problemkategorien in Angriff zu nehmen

Über den Autor:


V. Anton Spraul gibt seit mehr als 15 Jahren Kurse zur Einführung in die Programmierung und Computerwissenschaften. In diesem Buch vereint er die Techniken, mit denen er in zahlreichen Einzelstunden Programmierschülern geholfen hat.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe

Einführung


Bereitet es Ihnen Mühe, Programme zu schreiben, obwohl Sie davon überzeugt sind, Programmiersprachen eigentlich verstanden zu haben? Lesen Sie manchmal ein ganzes Kapitel in einem Buch über Programmierung und nicken dabei ständig wissend, aber es fällt Ihnen dennoch schwer, das Gelesene in Ihren eigenen Programmen umzusetzen? Können Sie im Internet gefundene Beispielprogramme so gut verstehen, dass Sie anderen die Bedeutung jeder einzelnen Codezeile erklären können, aber glauben, einen Krampf im Kopf zu haben, wenn Sie einer Programmieraufgabe gegenüberstehen und den leeren Bildschirm Ihres Texteditors sehen?

So geht es nicht nur Ihnen. Ich unterrichte seit mehr als 15 Jahren Programmierung, und den meisten meiner Studenten ist es irgendwann während ihrer Ausbildung ebenfalls so ergangen. Bei der hier fehlenden Fähigkeit handelt es sich darum, Problemlösungen zu finden, also anhand der Beschreibung einer bestimmten Aufgabe ein neues Programm zu schreiben, das diese Problemstellung löst. Nicht jede Art der Programmierung erfordert umfangreiches Lösen von Problemen. Falls Sie ein bereits bestehendes Programm nur geringfügig ändern, debuggen oder um Testcode ergänzen, geschieht die Programmierung möglicherweise so „mechanisch”, dass Ihr Erfindungsreichtum gar nicht erst auf die Probe gestellt wird. Früher oder später erfordern jedoch alle Programme das Lösen von Problemstellungen, und alle guten Programmierer können das.

Problemlösungen zu finden ist schwierig. Bei manchen Menschen, den „Naturtalenten” (in der Welt der Programmierung das Pendant zu begabten Athleten im Sport), scheint es so einfach zu sein. Diese wenigen Auserwählten übersetzen komplizierte Ideen wie im Schlaf in Quellcode. Wenn man ein Java-Gleichnis bemühen möchte, könnte man sagen, dass der Java-Code kompiliert im Gehirn abläuft, während wir anderen eine virtuelle Maschine verwenden müssen, die den Code nur interpretiert.

Als Programmierer kein Naturtalent zu sein, ist aber auch nicht weiter schlimm. Wäre dem so, gäbe es nur sehr wenige Programmierer auf der Welt. Dessen ungeachtet sind mir schon zu viele achtbare angehende Programmierer begegnet, die sich zu lange frustriert abmühen. Schlimmstenfalls geben sie das Programmieren komplett auf und sind davon überzeugt, ihr Ziel nie zu erreichen und dass nur Leute mit einer angeborenen Gabe gute Programmierer sind.

Warum aber ist es so schwierig, zu erlernen, Programmieraufgaben zu lösen?

Zum Teil liegt es daran, dass das Lösen von Problemen und das Erlernen der Syntax einer Programmiersprache ganz unterschiedliche Tätigkeiten sind und daher völlig andere „Muskeln” des Verstands beanspruchen. Beim Erlernen der Syntax einer Programmiersprache, dem Lesen von Quellcode und dem Auswendiglernen einer Programmierschnittstelle (API, englisch Application Programming Interface) handelt es sich um vornehmlich analytische Vorgänge in der linken Hirnhälfte. Ein originelles Programm unter Verwendung der vorher erlernten Werkzeuge und Fähigkeiten zu schreiben, ist hingegen eine Aktivität der rechten, kreativen Hirnhälfte.

Nehmen wir an, Sie möchten einen Zweig entfernen, der in die Regenrinne Ihres Hauses gelangt ist, aber Ihre Leiter ist zu kurz, um den Zweig zu erreichen. Sie begeben sich in Ihre Garage und suchen nach irgendeinem Objekt (oder einer Kombination von Objekten), das es Ihnen erlaubt, den Zweig aus der Regenrinne zu entfernen. Gibt es eine Möglichkeit, die Leiter zu verlängern? Gibt es ein Objekt, das Sie auf der Leiter stehend dazu verwenden könnten, den Zweig zu erreichen und fortzuschaffen? Vielleicht könnten Sie auch vom Inneren des Hauses aus einfach aufs Dach steigen und den Zweig von ober her zu fassen bekommen. Das ist mit Problemlösen gemeint, und es handelt sich dabei um eine kreative Tätigkeit. Ob Sie es glauben oder nicht, wenn Sie ein Programm erstmals entwerfen, sind Ihre Denkvorgänge und diejenigen der Person, die den Zweig entfernen möchte, ziemlich ähnlich und unterscheiden sich deutlich von den Denkvorgängen einer Person, die eine bereits vorhandene for-Schleife debuggt.

Allerdings legen die meisten Bücher über Programmierung ihren Schwerpunkt auf Syntax und Semantik. Nun sind Syntax und Semantik einer Programmiersprache natürlich unverzichtbar, aber sie sind nur der erste Schritt beim Lernen, wie man in der Sprache programmiert. Die meisten Bücher für Programmieranfänger führen im Wesentlichen vor, wie man ein Programm versteht, nicht, wie man eines schreibt. Diejenigen Bücher, die sich auf das Schreiben von Programmen konzentrieren, sind häufig tatsächlich „Kochbücher”, in denen „Rezepte” für bestimmte Gegebenheiten aufgeführt sind. Derartige Bücher können zwecks Zeitersparnis durchaus wertvoll sein, sind aber ungeeignet, um zu lernen, eigenständig Code zu schreiben. Denken Sie an Kochbücher im eigentlichen Sinn. Auch wenn hervorragende Köche Kochbücher besitzen, wird niemand, der sich nur auf Kochbücher verlässt, zu einem großartigen Koch. Ein exzellenter Koch kennt sich mit Zutaten, deren Vorbereitung und Garmethoden aus und weiß, wie er diese miteinander kombinieren muss, um fantastische Gerichte zuzubereiten. Um eine leckere Mahlzeit anzurichten, benötigt ein wirklich guter Koch nur eine vollständig ausgestattete Küche. In vergleichbarer Weise kennt sich ein ausgezeichneter Programmierer mit der Syntax der Sprache, Anwendungsframeworks, Algorithmen und den Prinzipien der Softwareentwicklung aus und versteht es, diese miteinander zu verbinden, um tolle Programme zu erstellen. Geben Sie einem exzellenten Programmierer eine Liste mit Vorgaben und lassen Sie ihn dann auf eine vollständig ausgerüstete Programmierumgebung los; es werden großartige Dinge geschehen!

Bei der Ausbildung von Programmierern gibt es gegenwärtig im Bereich des Problemlösens kaum Orientierungshilfen. Stattdessen geht man davon aus, dass Programmierer, die Zugriff auf alle erforderlichen Programmierwerkzeuge besitzen, irgendwann schon lernen werden, gute Programme zu schreiben, wenn sie dazu aufgefordert werden. Das lässt sich auch nicht völlig von der Hand weisen, aber von jetzt bis „irgendwann” kann ein ziemlich langer Zeitraum sein. Vom Programmieranfänger bis zum abgeklärten Programmierer ist es ein langer und steiniger Weg, und zu viele der Leute, die sich auf den Weg gemacht haben, erreichen ihr Ziel nie.

Anstatt durch Versuch und Irrtum zu lernen, können Sie sich das Lösen von Problemen auch systematisch aneignen. Darum geht es in diesem Buch. Sie können Techniken zum Ordnen Ihrer Gedanken und Verfahren zum Auffinden von Lösungen und Strategien für bestimmte Arten von Problemen erlernen. Lassen Sie Ihrer Kreativität beim Studieren der verschiedenen Ansätze freien Lauf. Geben Sie sich hier keiner Täuschung hin: Programmieren und insbesondere das Lösen von Problemen sind kreative Tätigkeiten. Kreativität bleibt rätselhaft und niemand vermag genau zu sagen, wie ein kreativer Kopf funktioniert. Wenn wir aber imstande sind, das Komponieren von Musik zu erlernen und Ratschläge zum kreativen Schreiben zu befolgen, oder uns zeigen lassen können, wie man malt, dann können wir auch lernen, Aufgabenstellungen beim Programmieren kreativ zu lösen. Dieses Buch möchte Ihnen nicht vorschreiben, was genau Sie tun sollen. Es soll Ihnen vielmehr dabei helfen, Ihre verborgenen Problemlösungsfähigkeiten weiterzuentwickeln, sodass Sie dann schon wissen werden, was zu tun ist. Es geht hier vor allem darum, Ihnen dabei zu helfen, ein Programmierer zu werden, wie er im Buche steht.

Mein Ziel ist es, dass Sie (und alle anderen Leser des Buchs) es lernen, beliebige Programmieraufgaben systematisch in Angriff zu nehmen und dabei zuversichtlich sind, die jeweilige Aufgabe schließlich lösen zu können. Ich wünsche mir, dass Sie nach der Lektüre des Buchs wie ein Programmierer denken und dass Sie sich für einen Programmierer halten.

Über dieses Buch


Nachdem die Notwendigkeit dieses Buches erläutert wurde, sind noch einige Bemerkungen dazu nötig, um was es sich beim vorliegenden Buch eigentlich handelt – und um was nicht.

Voraussetzungen


In diesem Buch wird davon ausgegangen, dass Ihnen die grundlegende Syntax und die Semantik der Programmiersprache C++ geläufig sind und Sie bereits damit begonnen haben, Programme zu schreiben. In den meisten Kapiteln wird von Ihnen erwartet, dass Sie bestimmte C++-Grundlagen kennen. In diesen Kapiteln finden Sie eingangs einen Überblick über diese Grundlagen. Machen Sie sich keine Sorgen, falls Sie noch im Begriff sind, die Sprache zu erlernen. Es gibt eine Vielzahl ausgezeichneter Bücher über C++ und Sie können das Lösen von Problemen und die Syntax gleichzeitig erlernen. Sie müssen jedoch die jeweils relevante Syntax erlernt haben, bevor Sie versuchen, die Aufgabenstellungen eines Kapitels in Angriff zu nehmen.

Ausgewählte Themen


Die im Buch behandelten Themen decken die Bereiche ab, bei denen ich Programmieranfänger am häufigsten mit Schwierigkeiten habe kämpfen sehen. Diese Bereiche stellen gleichzeitig einen umfassenden Querschnitt der für Anfänger und fortgeschrittene Anfänger maßgeblichen Themengebiete dar.

Ich muss jedoch betonen, dass es sich hier nicht um ein „Kochbuch” mit Algorithmen oder...

Blick ins Buch
Inhaltsverzeichnis
Cover1
Titel3
Impressum4
Inhaltsverzeichnis5
Danksagungen11
Einführung13
Über dieses Buch15
Voraussetzungen16
Ausgewählte Themen16
Programmierstil16
Übungen17
Warum C++?17
Strategien zur Problemlösung19
1.1 Klassische Rätsel20
1.1.1 Fuchs, Gans und Getreidesack21
Aufgabe: Wie kann der Fluss überquert werden?21
1.1.2 Schiebepuzzles25
Aufgabe: Verschieben der 826
Aufgabe: Verschieben der 527
1.1.3 Sudoku30
Aufgabe: Vervollständigen eines Sudoku-Quadrats31
1.1.4 Das Quarrasi-Schloss33
Aufgabe: Öffnen des außerirdischen Schlosses33
1.2 Gängige Verfahren zur Problemlösung36
1.2.1 Niemals ohne Plan37
1.2.2 Umformulieren der Aufgabenstellung38
1.2.3 Zerlegung in Teilaufgaben39
1.2.4 Mit Bekanntem anfangen40
1.2.5 Reduktion der Problemstellung41
1.2.6 Analogien suchen42
1.2.7 Experimentieren43
1.2.8 Nicht entmutigen lassen44
1.3 Übungen45
Wahre Rätsel47
2.1 Verwendete C++-Syntax47
2.2 Ausgabe von Mustern48
Aufgabe: Halbiertes Quadrat48
Aufgabe: Quadrat (Halbiertes Quadrat, Reduktion)48
Aufgabe: Zeile (Halbiertes Quadrat, weitere Reduktion)49
Aufgabe: Herunterzählen durch Hochzählen50
Aufgabe: Hochkant stehendes Dreieck51
2.3 Eingabeverarbeitung54
Aufgabe: Test einer Luhn-Prüfsumme54
2.3.1 Zerlegung der Aufgabenstellung56
Aufgabe: Ziffer in Ganzzahl konvertieren58
Aufgabe: Test einer Luhn-Prüfsumme fester Länge60
Aufgabe: Test einer einfachen Prüfsumme fester Länge60
Aufgabe: Positiv oder negativ63
2.3.2 Zusammenstellen der Teillösungen64
2.4 Statusverfolgung66
Aufgabe: Entschlüsseln einer Botschaft66
Aufgabe: Einlesen einer Zahl mit drei oder vier Ziffern71
Aufgabe: Einlesen einer Zahl mit drei oder vier Ziffern, weiter vereinfacht72
2.5 Fazit81
2.6 Übungen81
Arrays85
3.1 Array-Grundlagen86
3.1.1 Speichern86
3.1.2 Kopieren87
3.1.3 Zugriff und Suche88
3.1.4 Sortieren89
3.1.5 Statistische Werte92
3.2 Aufgabenstellungen mit Arrays93
Aufgabe: Modalwert berechnen93
3.2.1 Refactoring97
3.3 Arrays mit fest vorgegebenen Daten100
3.4 Nicht-skalare Arrays102
3.5 Mehrdimensionale Arrays104
3.6 Wann werden Arrays verwendet?108
3.7 Übungen113
Zeiger und dynamische Speicherverwaltung115
4.1 Zeiger-Grundlagen115
4.2 Vorteile von Zeigern117
4.2.1 Festlegung der Größe von Datenstrukturen zur Laufzeit117
4.2.2 Größenänderung von Datenstrukturen117
4.2.3 Gemeinsame Speichernutzung118
4.3 Wann werden Zeiger verwendet?119
4.4 Speicherverwaltung120
4.4.1 Stack und Heap120
4.4.2 Arbeitsspeicher124
4.4.3 Lebensdauer125
4.5 Aufgabenstellungen mit Zeigern126
4.5.1 Zeichenketten variabler Länge127
Aufgabe: Bearbeitung von Zeichenketten variabler Länge127
4.5.2 Verkettete Listen139
Aufgabe: Nachverfolgen einer unbekannten Zahl von Schülerdatensätzen139
4.6 Fazit und Ausblick148
4.7 Übungen149
Klassen151
5.1 Klassen-Grundlagen151
5.2 Ziele bei der Verwendung von Klassen153
5.2.1 Verkapselung154
5.2.2 Wiederverwendung von Code155
5.2.3 Zerlegung in Teilaufgaben155
5.2.4 Information Hiding156
5.2.5 Verständlichkeit158
5.2.6 Ausdrucksfähigkeit159
5.3 Eine einfache Klasse159
Aufgabe: Notenliste160
5.3.1 Grundgerüst einer Klasse160
5.3.2 Unterstützende Methoden165
5.4 Klassen mit dynamischen Daten169
Aufgabe: Nachverfolgen einer unbekannten Zahl von Schülerdatensätzen169
5.4.1 Hinzufügen eines Knotens172
5.4.2 Umorganisieren einer Liste175
5.4.3 Destruktor179
5.4.4 Tiefe Kopien (Deep Copy)180
5.4.5 Klassen mit dynamischen Daten im Überblick185
5.5 Fehlervermeidung186
5.5.1 Fingierte Klassen187
5.5.2 Monotalente188
5.6 Übungen188
Rekursion191
6.1 Grundlagen der Rekursion191
6.2 Start- und Endrekursion192
Aufgabe: Wie viele Papageien?192
6.2.1 Lösungsweg 1193
6.2.2 Lösungsweg 2194
Aufgabe: Wer ist unser bester Kunde?196
6.2.3 Lösungsweg 1198
6.2.4 Lösungsweg 2199
6.3 Das Hauptkonzept der Rekursion201
Aufgabe: Berechnung der Summe eines Arrays von Ganzzahlen202
6.4 Häufige Fehler204
6.4.1 Zu viele Parameter205
6.4.2 Globale Variablen206
6.5 Rekursion bei dynamischen Datenstrukturen208
6.5.1 Rekursion und verkettete Listen208
Aufgabe: Negative Zahlen in einer einfach verketteten Liste zählen210
6.5.2 Rekursion und Binärbäume211
Aufgabe: Suche nach dem größten Wert in einem Binärbaum213
6.6 Wrapper-Funktionen214
Aufgabe: Anzahl der Blätter eines Binärbaums214
6.7 Wann wird Rekursion verwendet?217
6.7.1 Rekursion: Gegenargumente218
Aufgabe: Ausgabe einer verketteten Liste220
Aufgabe: Ausgabe einer verketteten Liste in umgekehrter Reihenfolge220
6.8 Übungen222
Wiederverwendung von Code225
7.1 Sinnvolle und nicht sinnvolle Wiederverwendung von Code225
7.2 Komponenten227
7.2.1 Code-Blöcke227
7.2.2 Algorithmen227
7.2.3 Entwurfsmuster228
7.2.4 Abstrakte Datentypen229
7.2.5 Bibliotheken230
7.3 Kenntnisse über Komponenten erweitern230
7.3.1 Forschendes Lernen231
Aufgabe: Klassenvorsteher232
7.3.2 Lernen bei Bedarf235
Aufgabe: Effizientes Durchlaufen einer Liste236
7.4 Auswahl eines Komponententyps244
7.4.1 Komponentenwahl in der Praxis246
Aufgabe: Teilweise Sortierung246
7.4.2 Vergleich der Ergebnisse251
7.5 Übungen251
Denken wie ein Programmierer253
8.1 Das Gesamtkonzept253
8.1.1 Stärken ausschöpfen, Schwächen lindern254
8.1.2 Aufbau des Gesamtkonzepts261
8.2 Beliebige Aufgabenstellungen in Angriff nehmen262
Aufgabe: Schummeln beim Galgenmännchen264
8.2.1 Wie man schummelt265
8.2.2 Erforderliche Operationen zum Schummeln beim Galgenmännchen267
8.2.3 Der erste Entwurf269
8.2.4 Der erste Code270
8.2.5 Analyse der ersten Ergebnisse281
8.2.6 Die Kunst des Problemlösens282
8.3 Programmierkenntnisse weiterentwickeln283
8.3.1 Neue Programmiersprachen284
8.3.2 Kenntnisse in bekannten Programmiersprachen erweitern287
8.3.3 Zusätzliche Bibliotheken288
8.3.4 Besuchen Sie einen Kurs289
8.4 Fazit289
8.5 Übungen291
Stichwortverzeichnis293

Weitere E-Books zum Thema: Programmiersprachen - Softwareentwicklung

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

Programmieren lernen in PHP 5

E-Book Programmieren lernen in PHP 5
Format: PDF

Mit der Version 5 erreicht PHP einen bemerkenswerten Reifegrad, der PHP zu einer festen Größe in der Welt der Webprogrammierung macht. Gerade die leichte Erlernbarkeit macht PHP zur idealen…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Weitere Zeitschriften

FREIE WERKSTATT

FREIE WERKSTATT

Die Fachzeitschrift FREIE WERKSTATT berichtet seit der ersten Ausgaben 1994 über die Entwicklungen des Independent Aftermarkets (IAM). Hauptzielgruppe sind Inhaberinnen und Inhaber, Kfz-Meisterinnen ...

bank und markt

bank und markt

Zeitschrift für Banking - die führende Fachzeitschrift für den Markt und Wettbewerb der Finanzdienstleister, erscheint seit 1972 monatlich. Leitthemen Absatz und Akquise im Multichannel ...

Burgen und Schlösser

Burgen und Schlösser

aktuelle Berichte zum Thema Burgen, Schlösser, Wehrbauten, Forschungsergebnisse zur Bau- und Kunstgeschichte, Denkmalpflege und Denkmalschutz Seit ihrer Gründung 1899 gibt die Deutsche ...

Courier

Courier

The Bayer CropScience Magazine for Modern AgriculturePflanzenschutzmagazin für den Landwirt, landwirtschaftlichen Berater, Händler und generell am Thema Interessierten, mit umfassender ...

dental:spiegel

dental:spiegel

dental:spiegel - Das Magazin für das erfolgreiche Praxisteam. Der dental:spiegel gehört zu den Top 5 der reichweitenstärksten Fachzeitschriften für Zahnärzte in Deutschland (laut LA-DENT 2011 ...

Die Versicherungspraxis

Die Versicherungspraxis

Behandlung versicherungsrelevanter Themen. Erfahren Sie mehr über den DVS. Der DVS Deutscher Versicherungs-Schutzverband e.V, Bonn, ist der Interessenvertreter der versicherungsnehmenden Wirtschaft. ...

IT-BUSINESS

IT-BUSINESS

IT-BUSINESS ist seit mehr als 25 Jahren die Fachzeitschrift für den IT-Markt Sie liefert 2-wöchentlich fundiert recherchierte Themen, praxisbezogene Fallstudien, aktuelle Hintergrundberichte aus ...