Technische Probleme lösen mit C/C++ (eBook)

Von der Analyse bis zur Dokumentation
eBook Download: PDF | EPUB
2016 | 3. Auflage
362 Seiten
Carl Hanser Fachbuchverlag
978-3-446-45169-8 (ISBN)

Lese- und Medienproben

Technische Probleme lösen mit C/C++ -  Norbert Heiderich,  Wolfgang Meyer
Systemvoraussetzungen
Systemvoraussetzungen
26,99 inkl. MwSt
  • Download sofort lieferbar
  • Zahlungsarten anzeigen
Programmieren lernen mit Beispielen aus der Technik
Anhand von konkreten Beispielen aus dem technisch-wissenschaftlichen und mathematischen Bereich vermittelt dieses Lehrbuch Programmier- und Dokumentationstechniken. Es eignet sich ideal für Fachschüler und Bachelor-Studierende.
Aufbauend auf einer gut verständlichen und fundierten Einführung in die Arbeit mit C/C++ geht es Schritt für Schritt zur professionellen Softwareentwicklung. Vorkenntnisse sind nicht erforderlich.
Sie lösen unter anderem Probleme wie die Umrechnung von Temperatursystemen oder die Programmierung eines eigenen Funktionsplotters. Die Probleme sind nach steigendem Schwierigkeitsgrad geordnet ? von einfachen Anwendungen wie der Reihung von Widerständen bis hin zu komplexen Fragestellungen aus der Schaltalgebra. Die Beispiele werden mit Microsoft Visual C++ umgesetzt, das kostenlos verfügbar ist.
Die 3. Auflage wird umfassend aktualisiert und um Beispiele zur objektorientierten Programmierung erweitert.
Die gut verständliche Einführung und die vielen technischen Beispiele machen dieses Lehrbuch zum idealen Begleiter für Fachschüler und Bachelor-Studierende.

Dipl.-Math. Norbert Heiderich arbeitet als Lehrer u.a. für Programmierung am Berufskolleg des Kreises Kleve in Kleve.
Dipl.-Ing. Dipl.-Ing. Wolfgang Meyer war Leiter des Heinz-Nixdorf-Berufskollegs. Er unterrichtete Datenverarbeitungstechnik und Programmieren.

Dipl.-Math. Norbert Heiderich arbeitet als Lehrer u.a. für Programmierung am Berufskolleg des Kreises Kleve in Kleve. Dipl.-Ing. Dipl.-Ing. Wolfgang Meyer war Leiter des Heinz-Nixdorf-Berufskollegs. Er unterrichtete Datenverarbeitungstechnik und Programmieren.

Inhalt 8
Einleitung 14
1 Systematik der Problemlösung 18
1.1 Phasen der Programmentwicklung 18
1.2 Software-Lebenszyklus 20
1.3 Software-Entwicklungsverfahren 22
2 Erste Gehversuche mit C/C++ 27
2.1 Warum gerade C/C++? 27
2.2 Compiler und Interpreter 29
2.3 Übersetzen eines C/C++-Programms 31
2.4 Programmstart 32
3 Die Entwicklungsumgebung Visual C++ 33
3.1 Installation von VC++ 33
3.2 Starten von VC++ 35
3.3 Erstellen eines neuen Projektes 37
3.3.1 Win32-Projekte 38
3.3.1.1 Variante 1 – VC++ leistet Vorarbeit 39
3.3.1.2 Variante 2 – leeres Projekt 40
3.3.2 CLR-Projekte 43
3.4 Übersetzen eines eigenen Programms 45
3.5 Ausführen eines eigenen Programms 48
3.6 Paradigmen der Projektorganisation 48
4 Grundlegende Sprach- und Steuerungselemente 51
4.2 Datentypen und Variablen 52
4.2.1 Variablennamen 53
4.2.2 Ganzzahlige Variablen 53
4.2.3 Fließkommazahlen 55
4.2.4 Zeichen 56
4.2.5 Felder 57
4.2.5.1 Eindimensionale Felder 57
4.2.5.2 Mehrdimensionale Felder 58
4.2.5.3 Zugriff auf die Elemente eines Feldes 60
4.2.5.4 Startwertzuweisung für ein- und mehrdimensionale Arrays 62
4.2.6 Zeichenketten 64
4.3 Konstanten 65
4.4 Operatoren 66
4.4.1 Vorzeichenoperatoren 66
4.4.2 Arithmetische Operatoren 66
4.4.2.1 Addition + 66
4.4.2.2 Subtraktion ? 66
4.4.2.3 Multiplikation * 67
4.4.2.4 Division / 67
4.4.2.5 Modulo % 67
4.4.2.6 Zuweisung = 67
4.4.2.7 Kombinierte Zuweisungen 68
4.4.2.8 Inkrementierung ++ 68
4.4.2.9 Dekrementierung -- 69
4.4.3 Vergleichsoperatoren 69
4.4.3.1 Gleichheit == 69
4.4.3.2 Ungleichheit != 69


4.4.3.5 Kleiner gleich < =
4.4.3.6 Größer gleich > =
4.4.4 Logische Operatoren 71
4.4.4.1 Logisches NICHT ! 71
4.4.4.2 Logisches UND & &
4.4.4.3 Logisches ODER || 71
4.4.5 Typumwandlungsoperator 72
4.4.6 Speicherberechnungsoperator 72
4.4.7 Bedingungsoperator 73
4.4.8 Indizierungsoperator 74
4.4.9 Klammerungsoperator 74
4.5 Anweisungen und Blöcke 76
4.6 Alternationen 76
4.6.1 Einfache Abfragen (if – else) 76
4.6.2 Mehrfachabfragen (else – if) 77
4.6.3 Die switch-case-Anweisung 78
4.7 Iterationen 80
4.7.1 Zählergesteuerte Schleifen (for) 80
4.7.2 Kopfgesteuerte Schleifen (while) 84
4.7.3 Fußgesteuerte Schleifen (do – while) 85
4.7.4 Schleifenabbruch (continue) 86
4.7.5 Schleifenabbruch (break) 87
4.7.6 Schleifenumwandlungen 89
4.8 Funktionen 89
4.8.1 Formaler Aufbau einer Funktion 90
4.8.1.1 Der Funktionskopf 91
4.8.1.2 Der Funktionsrumpf 92
4.8.2 Datentyp und Deklaration einer Funktion – Prototyping 93
4.8.3 Das Prinzip der Parameterübergabe 98
4.8.3.1 Aufrufverfahren call by value 98
4.8.3.2 Aufrufverfahren call by reference 100
4.8.3.3 Adressoperator, Zeiger und Dereferenzierung 103
4.8.4 Regeln für ein erfolgreiches Prototyping 104
4.8.5 Die exit()-Funktion 105
4.8.6 Rekursive Funktionen 105
4.9 Ein- und Ausgabe 108
4.9.1 Formatierte Eingabe mit scanf() 108
4.9.2 Formatierte Ausgabe mit printf() 109
4.9.3 Arbeiten mit Dateien 110
4.9.3.1 Öffnen der Datei 111
4.9.3.2 Verarbeiten der Datensätze 111
4.9.3.3 Schließen der Datei 112
4.9.3.4 stdio.h 112
4.9.3.5 fflush() und stdin 114
5 Strukturierte Programmierung 115
5.1 Problemstellung 116
5.2 Problemanalyse 117
5.3 Struktogramm nach Nassi-Shneiderman 120
5.3.1 Sequenz 122
5.3.2 Alternation 124
5.3.3 Verschachtelung 125
5.3.4 Verzweigung 126
5.3.5 Schleifen 128
5.3.5.1 Zählergesteuerte Schleife 128
5.3.5.2 Kopfgesteuerte Schleife 132
5.3.5.3 Fußgesteuerte Schleifen 134
5.3.5.4 Endlosschleifen 135
5.3.5.5 Kriterien zur Schleifenauswahl 135
5.3.6 Programm- oder Funktionsaufruf 135
5.3.7 Aussprung 136
5.3.8 Rechnergestützte Erstellung von Struktogrammen 137
5.3.8.1 StruktEd 137
5.3.8.2 hus-Struktogrammer 144
5.4 Flussdiagramm nach DIN 66001 152
5.5 Programmerstellung 154
5.6 Programmtest 154
5.7 Programmlauf 155
5.8 Dokumentation nach DIN 66230 156
5.8.1 Funktion und Aufbau des Programms 156
5.8.2 Programmkenndaten 157
5.8.3 Betrieb des Programms 158
5.8.4 Ergänzungen 158
5.9 Aspekte des Qualitätsmanagements EN-ISO 9000 159
5.10 Algorithmus – was ist das? 160
5.11 EVA-Prinzip 166
5.12 Programmierung von Formelwerken 167
6 Lösung einfacher Probleme 172
6.1 Umrechnung von Temperatursystemen 172
6.2 Flächenberechnung geradlinig begrenzter Flächen (Polygone) 178
6.2.1 Erste Problemvariation: Berechnung der Schwerpunktkoordinaten S(xS yS) von polygonförmig begrenzten Flächen
6.2.2 Zweite Problemvariation: Suche nach einem „günstigen“ Treffpunkt 186
6.3 Berechnung einer Brückenkonstruktion 187
6.4 Schaltjahrüberprüfung 191
6.5 Ein Problem aus der Energiewirtschaft 197
6.6 Logarithmische Achsenteilung 207
7 Objektorientierte Programmierung (OOP) 215
7.1 Modellbildung mittels Abstraktion 215
7.2 Klassen und Objekte 216
7.3 Attribute und Methoden einer Klasse 219
7.4 Bruchrechnung mit OOP 220
7.5 Vererbung 229
7.6 Strings 236
7.7 Typumwandlungen 237
7.8 Strukturierte Programmierung vs. OOP 241
8 Lösung fortgeschrittener Probleme 242
8.1 Grafische Darstellung funktionaler Abhängigkeiten 242
8.1.1 Welt- und Screenkoordinaten 244
8.1.2 Koordinatentransformationen 246
8.1.3 Darstellung der Sinusfunktion 252
8.1.4 Darstellung quadratischer Parabeln 256
8.1.5 Spannungsteilerkennlinien 259
8.2 Lösung technisch-wissenschaftlicher Probleme 261
8.2.1 Widerstandsreihen E6 bis E96 261
8.2.2 Farbcodierung von Widerständen nach DIN 41429 264
8.2.3 Fourier-Synthese periodischer empirischer Funktionen 267
8.2.4 Fourier-Analyse empirischer Funktionen 275
8.3 Nullstellenbestimmung von Funktionen 280
8.3.1 Inkrementverfahren und Intervallhalbierung 280
8.3.2 Die regula falsi 285
8.3.3 Das Newton-Verfahren 287
8.4 Numerische Integration 290
8.4.1 Riemannsche Unter- und Obersummen 290
8.4.2 Trapezregel 294
8.4.3 Simpsonsche Regel 299
8.4.4 Effektivwertberechnungen 304
8.5 Einbindung eigener Klassen 306
8.5.1 Das „Platinenproblem“ als objektorientierte Konsolenanwendung 306
8.5.2 Das „Platinenproblem“ in der Erweiterung mit grafischer Benutzeroberfläche 311
9 Lösung komplexer Probleme 315
9.1 Kurvendiskussion und Funktionsplotter am Beispiel ganzrationaler Funktionen bis 3. Ordnung 315
9.2 Ausgleichsrechnung – Bestimmung der „besten“ Geraden in einer Messreihe 318
9.3 Digitaltechnik 328
10 Tabellen und Übersichten 342
10.1 Datentypen und ihre Wertebereiche 342
10.2 Vergleich der Symbole nach DIN 66 001 und der Nassi-Shneiderman-Darstellung 343
10.3 Schlüsselwörter ANSI C 344
10.4 Erweiterte Schlüsselwörter C++ 346
10.5 ASCII-Tabelle 349
10.6 Standardfunktionen und ihre Zuordnung zu den Header-Dateien (Include) 351
Literatur 355
Index 356

2 Erste Gehversuche mit C/C++

Dieses Kapitel beschäftigt sich mit einigen grundlegenden Aspekten der Programmiersprache C/C++. Neben der Frage, warum es sinnvoll ist, gerade mit C/C++ zu arbeiten, werden Funktionsweisen der Komponenten der Entwicklungsumgebung betrachtet und erläutert. In den folgenden Kapiteln werden zunächst Beispiele in klassischem C als Konsolenanwendungen realisiert, bevor später objektorientiert mit C++ weitergearbeitet wird. Dann sind die Beispiele auch mit grafischen Oberflächen ausgestattet.

2.1  Warum gerade C/C++?

Wer C/C++ erlernen will, hat sich für eine Programmiersprache entschieden, die auf fast allen Rechnertypen und unter fast allen Betriebssystemen verfügbar ist. Es steht Ihnen, anders als bei vielen anderen Programmiersprachen, auf den verschiedensten Entwicklungsplattformen eine genormte Standard-Bibliothek zur Verfügung. Damit gelingt eine einheitliche Implementierung der mit dieser Programmiersprache erstellten Programme mit sehr hoher Geschwindigkeit.

C wird auch als Highlevel-Assembler bezeichnet, also als Programmiersprache, die sehr nah an der Maschinensprache ist. Dies beruht auf der Tatsache, dass der Kern (bzw. Kernel) aller gängigen Betriebssysteme in C geschrieben wurde. Damit eignet sich C/C++ auch in besonderem Maße für die Systemprogrammierung, also für Programme, die für den Betrieb von Rechenanlagen erforderlich sind.

Dank der relativ einfachen Struktur und dem geringen Umfang der eigentlichen Sprache, d.h. der verfügbaren Schlüsselworte der Programmiersprache, war es möglich, C-Compiler, also spezielle Programme zur Übersetzung des vom Programmierer erstellten Codes in eine maschinenverständliche Sprache, für alle Arten von Prozessorplattformen zu entwickeln, so dass die Programmiersprache C/C++ heute für die gesamte Leistungspalette vom Mikrocontroller bis zu High-End-Rechnern verfügbar ist. Für den Entwickler von Software bedeutet dies: Egal für welche Prozessorplattform programmiert wird, einen C-Compiler wird man für das relevante Zielsystem bekommen. Man braucht sich nicht um eine Programmierung zu kümmern, die spezifisch für den jeweiligen Zielprozessor ist. In den meisten Fällen wird es möglich sein, die auf einer Plattform entwickelte Anwendung auf einer anderen Plattform auszuführen. Der erforderliche Anpassungsaufwand ist in aller Regel sehr überschaubar.

Das bedeutet nicht, dass man fertige Programme von einer Plattform auf eine andere übertragen kann (etwa von einem Windows-PC auf einen Linux-PC) und diese dann auf der neuen Plattform (also unter Linux) sofort wieder funktionieren. Vielmehr ist nur die problemlose Übertragung der Quelltexte auf ein neues System gemeint, auf dem diese dann mit dem entsprechenden Compiler und Linker (ein Linker oder Binder ist ein Programm, das einzelne Programmmodule zu einem ausführbaren Programm verbindet) in ein funktionierendes Programm umzuwandeln sind!

Die Tatsache, dass Programme, die in C/C++ geschrieben werden, sehr klein sind (nur in Assembler — also Maschinensprache — geschriebene Programme sind noch kleiner), macht C/C++ zu einer wichtigen Programmiersprache im Bereich Embedded Systems (also Systemen, die stark einschränkenden Randbedingungen unterliegen, wie geringe Kosten, Platz-, Energie- und Speicherverbrauch) und der Mikrocontroller-Programmierung, wo Speicherplatz ebenfalls sehr kostbar ist.

Ein C/C++-Programm wird mithilfe eines Compilers (dem Übersetzer des Quelltextes) aus einer oder mehreren einfachen Textdateien zu Objektcodedateien übersetzt. Diese Objektcodedateien werden anschließend von einem Linker (bzw. Linkage-Editor = Binder, Werkzeug für das Zusammenfügen übersetzter Programmteile) mit den erforderlichen Systembibliotheken zu einer ausführbaren Datei (der Executable — oder kurz EXE-Datei) zusammengebunden.

Jedes ausführbare C/C++-Programm besitzt eine Hauptfunktion. In C wird diese Hauptfunktion als bezeichnet.

Damit das Betriebssystem erkennen kann, wo der Einstiegspunkt für den Ablauf eines C/C++-Programms zu finden ist, muss diese Namenskonvention unbedingt eingehalten werden. Auch wenn andere Entwicklungsumgebungen als das Visual Studio von Microsoft oder andere Compiler eingesetzt werden, ändert sich an diesem Einstiegspunkt nichts. Variieren kann allenfalls die Parametrisierung (also die Art, Anzahl oder der Datentyp der Übergabeparameter) dieser Hauptfunktion. Dieser Aspekt wird später in Kapitel 4.8, in dem es um Funktionen gehen wird, noch ausführlich erläutert.

Darüber hinaus ist es natürlich auch möglich, eigene Programme und/oder Funktionen in eigenen Bibliotheken zusammenzufassen, um diese später erneut benutzen zu können. Diese Bibliotheken können bei einem späteren Bindevorgang durch den Linker wieder verwendet werden, damit diese dann zu einem neuen Programm hinzugebunden werden.

2.2  Compiler und Interpreter

Die höheren Programmiersprachen (dazu zählen u.a. FORTRAN, ALGOL und C/C++) sind entwickelt worden, damit die Beschreibung eines Lösungsverfahrens, der Algorithmus, in einer für Menschen einfacher lesbaren Form erfolgen kann und nicht in Maschinencode vorliegen muss. Der Programmierer als der Anwender solcher Programmiersprachen soll sich also auf die Lösung seiner konkreten Aufgabenstellung konzentrieren können, ohne sich zu sehr mit den Interna des Rechners beschäftigen zu müssen. Ein weiterer, nicht zu vernachlässigender Vorteil ist, dass Programmiersprachen normalerweise unabhängig von der Maschine sind, auf der die Programme ausgeführt werden.

Die Tatsache, dass es zwei verschiedene Verfahren zur Erzeugung von Programmen gibt, deutet das Problem an, das sich hinter der Verwendung einer Programmiersprache verbirgt: die Programme können nicht mehr direkt und unmittelbar vom Computer gelesen und zur Ausführung gebracht werden, sondern sie müssen erst in eine vom Computer interpretierbare passende Darstellungsform gebracht werden.

Eine Möglichkeit Quellprogramme (also die vom Programmierer erstellten und für den Programmierer lesbaren Textdateien mit den Programmen) zu übersetzen, sind Interpreter. Bei ihnen wird das Programm Zeile für Zeile gelesen und bewertet, wobei Schreibfehler oder Verstöße gegen die Regeln der Programmiersprache, Syntaxfehler, festgestellt werden. Danach führt der Interpreter die mit den Anweisungen verbundenen Befehle und Aktionen aus. Die Arbeitsweise solcher Interpreter kann wie in Bild 2.1 dargestellt werden.

 

Bild 2.1 Arbeitsweise eines Interpreters

Der große Vorteil interpretierter Programme besteht darin, dass es möglich ist, schnell einmal etwas auszuprobieren oder während des Programmablaufs einzugreifen und Werte von Variablen zu betrachten oder zu verändern. Für professionelle Projekte dagegen sind Interpreter eher ungeeignet. Zuerst einmal ist da das Problem der mangelnden Geschwindigkeit zu nennen. Denn egal, ob ein Programm zum ersten oder tausendsten Mal ausgeführt wird, alle zugehörigen Programmzeilen durchlaufen immer wieder den Zyklus: Lesen — Bewerten — Ausführen.

Außerdem ist nur ein geringer Schutz des Quellcodes vor Eingriffen von außen gegeben. Der Anwender hat jederzeit die Möglichkeit den Code zu manipulieren, ohne sich mit dem Programmierer abzusprechen. Es entstehen so in der Praxis ziemlich schnell alternative Programmversionen, die bei einem neuen Release zu großen Problemen führen.

Der andere Lösungsansatz, um ein ausführbares Programm zu erzeugen, führt über den Einsatz eines Compilers. Ein Compiler ist ein Programm, das einen Quellcode einliest und ihn zunächst auf syntaktische Fehler untersucht. Werden keine wirklichen Fehler festgestellt, so wird der Quellcode in eine maschinenlesbare Form übersetzt.

Nach dem abschließenden Schritt des Bindens (Linken) liegt das Programm in einer Form vor, die auf dem Rechner, auf dem es verarbeitet wurde, lauffähig (also ausführbar) ist (engl. executable, daher die Extension (Programmendung) EXE). Dieses Programm kann nun unabhängig von Quellcode und Compiler ausgeführt werden. Diese Arbeitsweise lässt sich wie in Bild 2.2 darstellen.

 

Bild 2.2 Arbeitsweise eines Compilers und Linkers

Der große Vorteil dieser Vorgehensweise liegt darin, dass die Programme ohne Preisgabe des Quellcodes lauffähig sind. So können z.B. auch im Quellcode verwendete Betriebsgeheimnisse von keinem Anwender mehr eingesehen werden. Vor allen Dingen aber laufen solche Programme sehr viel schneller ab als interpretierte Programme, da ja die Interpretation jedes Programmstatements (also jeder Programmzeile) entfällt. Die Überprüfung hat bereits bei der Kompilierung (also der Übersetzung in die Object-Datei) stattgefunden. Ein gewisser Nachteil besteht zweifellos darin, dass nun bei jeder Programmänderung der komplette Zyklus Editieren — Übersetzen — Starten durchlaufen werden muss, bevor man etwas in einem Programm ausprobieren kann. Das kostet in der Testphase natürlich etwas mehr Zeit als bei interpretativen Programmen. Denn auch beim Auftreten eines syntaktischen Fehlers muss man immer erst wieder das Programm in den Editor laden, den Fehler beheben und die Übersetzung (Kompilierung) von neuem starten.

Deutlich entschärft wird dieses Problem dadurch, dass die meisten Compiler heutzutage mit einer sogenannten integrierten Entwicklungsumgebung ausgestattet sind, in der der Editor und der Compiler eine...

Erscheint lt. Verlag 8.8.2016
Verlagsort München
Sprache deutsch
Themenwelt Mathematik / Informatik Informatik Programmiersprachen / -werkzeuge
Schlagworte Entwicklungsumgebungen • Microsoft Visual Studio C++ • Programmiersprachen • Programmierung • Softwareentwicklung • VC++
ISBN-10 3-446-45169-2 / 3446451692
ISBN-13 978-3-446-45169-8 / 9783446451698
Haben Sie eine Frage zum Produkt?
Wie bewerten Sie den Artikel?
Bitte geben Sie Ihre Bewertung ein:
Bitte geben Sie Daten ein:
PDFPDF (Wasserzeichen)
Größe: 9,2 MB

DRM: Digitales Wasserzeichen
Dieses eBook enthält ein digitales Wasser­zeichen und ist damit für Sie persona­lisiert. Bei einer missbräuch­lichen Weiter­gabe des eBooks an Dritte ist eine Rück­ver­folgung an die Quelle möglich.

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 (Wasserzeichen)
Größe: 27,6 MB

DRM: Digitales Wasserzeichen
Dieses eBook enthält ein digitales Wasser­zeichen und ist damit für Sie persona­lisiert. Bei einer missbräuch­lichen Weiter­gabe des eBooks an Dritte ist eine Rück­ver­folgung an die Quelle möglich.

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