Think Like a Programmer (eBook)

Typische Programmieraufgaben kreativ lösen am Beispiel von C++
eBook Download: PDF | EPUB
2013 | 1. Auflage
304 Seiten
MITP Verlags GmbH & Co. KG
978-3-8266-9604-6 (ISBN)
Systemvoraussetzungen
Systemvoraussetzungen
3,99 inkl. MwSt
  • Download sofort lieferbar
  • Zahlungsarten anzeigen

  • 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.

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.

Cover 1
Titel 3
Impressum 4
Inhaltsverzeichnis 5
Danksagungen 11
Einführung 13
Über dieses Buch 15
Voraussetzungen 16
Ausgewählte Themen 16
Programmierstil 16
Übungen 17
Warum C++? 17
Strategien zur Problemlösung 19
1.1 Klassische Rätsel 20
1.1.1 Fuchs, Gans und Getreidesack 21
Aufgabe: Wie kann der Fluss überquert werden? 21
1.1.2 Schiebepuzzles 25
Aufgabe: Verschieben der 8 26
Aufgabe: Verschieben der 5 27
1.1.3 Sudoku 30
Aufgabe: Vervollständigen eines Sudoku-Quadrats 31
1.1.4 Das Quarrasi-Schloss 33
Aufgabe: Öffnen des außerirdischen Schlosses 33
1.2 Gängige Verfahren zur Problemlösung 36
1.2.1 Niemals ohne Plan 37
1.2.2 Umformulieren der Aufgabenstellung 38
1.2.3 Zerlegung in Teilaufgaben 39
1.2.4 Mit Bekanntem anfangen 40
1.2.5 Reduktion der Problemstellung 41
1.2.6 Analogien suchen 42
1.2.7 Experimentieren 43
1.2.8 Nicht entmutigen lassen 44
1.3 Übungen 45
Wahre Rätsel 47
2.1 Verwendete C++-Syntax 47
2.2 Ausgabe von Mustern 48
Aufgabe: Halbiertes Quadrat 48
Aufgabe: Quadrat (Halbiertes Quadrat, Reduktion) 48
Aufgabe: Zeile (Halbiertes Quadrat, weitere Reduktion) 49
Aufgabe: Herunterzählen durch Hochzählen 50
Aufgabe: Hochkant stehendes Dreieck 51
2.3 Eingabeverarbeitung 54
Aufgabe: Test einer Luhn-Prüfsumme 54
2.3.1 Zerlegung der Aufgabenstellung 56
Aufgabe: Ziffer in Ganzzahl konvertieren 58
Aufgabe: Test einer Luhn-Prüfsumme fester Länge 60
Aufgabe: Test einer einfachen Prüfsumme fester Länge 60
Aufgabe: Positiv oder negativ 63
2.3.2 Zusammenstellen der Teillösungen 64
2.4 Statusverfolgung 66
Aufgabe: Entschlüsseln einer Botschaft 66
Aufgabe: Einlesen einer Zahl mit drei oder vier Ziffern 71
Aufgabe: Einlesen einer Zahl mit drei oder vier Ziffern, weiter vereinfacht 72
2.5 Fazit 81
2.6 Übungen 81
Arrays 85
3.1 Array-Grundlagen 86
3.1.1 Speichern 86
3.1.2 Kopieren 87
3.1.3 Zugriff und Suche 88
3.1.4 Sortieren 89
3.1.5 Statistische Werte 92
3.2 Aufgabenstellungen mit Arrays 93
Aufgabe: Modalwert berechnen 93
3.2.1 Refactoring 97
3.3 Arrays mit fest vorgegebenen Daten 100
3.4 Nicht-skalare Arrays 102
3.5 Mehrdimensionale Arrays 104
3.6 Wann werden Arrays verwendet? 108
3.7 Übungen 113
Zeiger und dynamische Speicherverwaltung 115
4.1 Zeiger-Grundlagen 115
4.2 Vorteile von Zeigern 117
4.2.1 Festlegung der Größe von Datenstrukturen zur Laufzeit 117
4.2.2 Größenänderung von Datenstrukturen 117
4.2.3 Gemeinsame Speichernutzung 118
4.3 Wann werden Zeiger verwendet? 119
4.4 Speicherverwaltung 120
4.4.1 Stack und Heap 120
4.4.2 Arbeitsspeicher 124
4.4.3 Lebensdauer 125
4.5 Aufgabenstellungen mit Zeigern 126
4.5.1 Zeichenketten variabler Länge 127
Aufgabe: Bearbeitung von Zeichenketten variabler Länge 127
4.5.2 Verkettete Listen 139
Aufgabe: Nachverfolgen einer unbekannten Zahl von Schülerdatensätzen 139
4.6 Fazit und Ausblick 148
4.7 Übungen 149
Klassen 151
5.1 Klassen-Grundlagen 151
5.2 Ziele bei der Verwendung von Klassen 153
5.2.1 Verkapselung 154
5.2.2 Wiederverwendung von Code 155
5.2.3 Zerlegung in Teilaufgaben 155
5.2.4 Information Hiding 156
5.2.5 Verständlichkeit 158
5.2.6 Ausdrucksfähigkeit 159
5.3 Eine einfache Klasse 159
Aufgabe: Notenliste 160
5.3.1 Grundgerüst einer Klasse 160
5.3.2 Unterstützende Methoden 165
5.4 Klassen mit dynamischen Daten 169
Aufgabe: Nachverfolgen einer unbekannten Zahl von Schülerdatensätzen 169
5.4.1 Hinzufügen eines Knotens 172
5.4.2 Umorganisieren einer Liste 175
5.4.3 Destruktor 179
5.4.4 Tiefe Kopien (Deep Copy) 180
5.4.5 Klassen mit dynamischen Daten im Überblick 185
5.5 Fehlervermeidung 186
5.5.1 Fingierte Klassen 187
5.5.2 Monotalente 188
5.6 Übungen 188
Rekursion 191
6.1 Grundlagen der Rekursion 191
6.2 Start- und Endrekursion 192
Aufgabe: Wie viele Papageien? 192
6.2.1 Lösungsweg 1 193
6.2.2 Lösungsweg 2 194
Aufgabe: Wer ist unser bester Kunde? 196
6.2.3 Lösungsweg 1 198
6.2.4 Lösungsweg 2 199
6.3 Das Hauptkonzept der Rekursion 201
Aufgabe: Berechnung der Summe eines Arrays von Ganzzahlen 202
6.4 Häufige Fehler 204
6.4.1 Zu viele Parameter 205
6.4.2 Globale Variablen 206
6.5 Rekursion bei dynamischen Datenstrukturen 208
6.5.1 Rekursion und verkettete Listen 208
Aufgabe: Negative Zahlen in einer einfach verketteten Liste zählen 210
6.5.2 Rekursion und Binärbäume 211
Aufgabe: Suche nach dem größten Wert in einem Binärbaum 213
6.6 Wrapper-Funktionen 214
Aufgabe: Anzahl der Blätter eines Binärbaums 214
6.7 Wann wird Rekursion verwendet? 217
6.7.1 Rekursion: Gegenargumente 218
Aufgabe: Ausgabe einer verketteten Liste 220
Aufgabe: Ausgabe einer verketteten Liste in umgekehrter Reihenfolge 220
6.8 Übungen 222
Wiederverwendung von Code 225
7.1 Sinnvolle und nicht sinnvolle Wiederverwendung von Code 225
7.2 Komponenten 227
7.2.1 Code-Blöcke 227
7.2.2 Algorithmen 227
7.2.3 Entwurfsmuster 228
7.2.4 Abstrakte Datentypen 229
7.2.5 Bibliotheken 230
7.3 Kenntnisse über Komponenten erweitern 230
7.3.1 Forschendes Lernen 231
Aufgabe: Klassenvorsteher 232
7.3.2 Lernen bei Bedarf 235
Aufgabe: Effizientes Durchlaufen einer Liste 236
7.4 Auswahl eines Komponententyps 244
7.4.1 Komponentenwahl in der Praxis 246
Aufgabe: Teilweise Sortierung 246
7.4.2 Vergleich der Ergebnisse 251
7.5 Übungen 251
Denken wie ein Programmierer 253
8.1 Das Gesamtkonzept 253
8.1.1 Stärken ausschöpfen, Schwächen lindern 254
8.1.2 Aufbau des Gesamtkonzepts 261
8.2 Beliebige Aufgabenstellungen in Angriff nehmen 262
Aufgabe: Schummeln beim Galgenmännchen 264
8.2.1 Wie man schummelt 265
8.2.2 Erforderliche Operationen zum Schummeln beim Galgenmännchen 267
8.2.3 Der erste Entwurf 269
8.2.4 Der erste Code 270
8.2.5 Analyse der ersten Ergebnisse 281
8.2.6 Die Kunst des Problemlösens 282
8.3 Programmierkenntnisse weiterentwickeln 283
8.3.1 Neue Programmiersprachen 284
8.3.2 Kenntnisse in bekannten Programmiersprachen erweitern 287
8.3.3 Zusätzliche Bibliotheken 288
8.3.4 Besuchen Sie einen Kurs 289
8.4 Fazit 289
8.5 Übungen 291
Stichwortverzeichnis 293

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...

Erscheint lt. Verlag 25.6.2013
Reihe/Serie mitp Professional
Verlagsort Frechen
Sprache deutsch
Themenwelt Mathematik / Informatik Informatik Programmiersprachen / -werkzeuge
Schlagworte Algorithmus • Datenstruktur • Datentyp • Entwurfsmuster • Problemlösen • Programmierkonzepte • Programmiersprache • Programmiersprache C++ • Programmierstil • Programmiertechnik • Programmierung • Rekursion • Software-Entwicklung • Suche
ISBN-10 3-8266-9604-2 / 3826696042
ISBN-13 978-3-8266-9604-6 / 9783826696046
Haben Sie eine Frage zum Produkt?
Wie bewerten Sie den Artikel?
Bitte geben Sie Ihre Bewertung ein:
Bitte geben Sie Daten ein:
PDFPDF (Ohne DRM)
Größe: 4,9 MB

Digital Rights Management: ohne DRM
Dieses eBook enthält kein DRM oder Kopier­schutz. Eine Weiter­gabe an Dritte ist jedoch rechtlich nicht zulässig, weil Sie beim Kauf nur die Rechte an der persön­lichen Nutzung erwerben.

Dateiformat: PDF (Portable Document Format)
Mit einem festen Seiten­layout eignet sich die PDF besonders für Fach­bücher mit Spalten, Tabellen und Abbild­ungen. Eine PDF kann auf fast allen Geräten ange­zeigt werden, ist aber für kleine Displays (Smart­phone, eReader) nur einge­schränkt geeignet.

Systemvoraussetzungen:
PC/Mac: Mit einem PC oder Mac können Sie dieses eBook lesen. Sie benötigen dafür einen PDF-Viewer - z.B. den Adobe Reader oder Adobe Digital Editions.
eReader: Dieses eBook kann mit (fast) allen eBook-Readern gelesen werden. Mit dem amazon-Kindle ist es aber nicht kompatibel.
Smartphone/Tablet: Egal ob Apple oder Android, dieses eBook können Sie lesen. Sie benötigen dafür einen PDF-Viewer - z.B. die kostenlose Adobe Digital Editions-App.

Zusätzliches Feature: Online Lesen
Dieses eBook können Sie zusätzlich zum Download auch online im Webbrowser lesen.

Buying eBooks from abroad
For tax law reasons we can sell eBooks just within Germany and Switzerland. Regrettably we cannot fulfill eBook-orders from other countries.

EPUBEPUB (Ohne DRM)
Größe: 2,7 MB

Digital Rights Management: ohne DRM
Dieses eBook enthält kein DRM oder Kopier­schutz. Eine Weiter­gabe an Dritte ist jedoch rechtlich nicht zulässig, weil Sie beim Kauf nur die Rechte an der persön­lichen Nutzung erwerben.

Dateiformat: EPUB (Electronic Publication)
EPUB ist ein offener Standard für eBooks und eignet sich besonders zur Darstellung von Belle­tristik und Sach­büchern. Der Fließ­text wird dynamisch an die Display- und Schrift­größe ange­passt. Auch für mobile Lese­geräte ist EPUB daher gut geeignet.

Systemvoraussetzungen:
PC/Mac: Mit einem PC oder Mac können Sie dieses eBook lesen. Sie benötigen dafür die kostenlose Software Adobe Digital Editions.
eReader: Dieses eBook kann mit (fast) allen eBook-Readern gelesen werden. Mit dem amazon-Kindle ist es aber nicht kompatibel.
Smartphone/Tablet: Egal ob Apple oder Android, dieses eBook können Sie lesen. Sie benötigen dafür eine kostenlose App.
Geräteliste und zusätzliche Hinweise

Zusätzliches Feature: Online Lesen
Dieses eBook können Sie zusätzlich zum Download auch online im Webbrowser lesen.

Buying eBooks from abroad
For tax law reasons we can sell eBooks just within Germany and Switzerland. Regrettably we cannot fulfill eBook-orders from other countries.

Mehr entdecken
aus dem Bereich
Entwicklung von GUIs für verschiedene Betriebssysteme

von Achim Lingott

eBook Download (2023)
Carl Hanser Verlag GmbH & Co. KG
39,99
Das Handbuch für Webentwickler

von Philip Ackermann

eBook Download (2023)
Rheinwerk Computing (Verlag)
49,90