Einführung in C
Zu erwerbende Kenntnisse
Um Software zu entwickeln, werden folgende Kenntnisse und
Fertigkeiten benötigt:
- Sicherer Umgang mit dem zu verwendenden
Computersystem
Als Softwareentwickler sollten Sie mit dem Computersystem vertraut
sein, für das Sie Software entwickeln wollen.
Sie sollten wissen, wie sich existierende Programme verhalten, da
die Nutzer von Ihren Programmen ein ähnliches Verhalten
erwarten.
- Programmiersprache
Sie müssen die verwendete Programmiersprache - hier im Beispiel C -
beherrschen.
- Entwicklungsumgebung, Entwicklungstools
Je nach verwendetem Betriebssystem steht Ihnen entweder eine
graphische Nutzeroberfläche zur Verfügung oder eine Kollektion
einzelner Tools wie Editor, Compiler, Linker...
- Bibliotheken
Auf jedem Entwicklungssystem sind Bibliotheken vorhanden, die
bestimmte häufig genutzte Funktionen implementieren.
Als Mindestbestandteil ist dabei die C-Runtime-Library vorhanden,
deren Funktionsumfang durch die C-Standards genormt ist. Darüber
hinaus sind meist weitere Bibliotheken vorhanden.
Um diese Bibliotheken effektiv nutzen zu können, benötigen Sie
einen Überblick, welche Funktionen für welchen Zweck zur Verfügung
stehen.
- Coding Standards
Programmierstandards enthalten Regeln, wie eine Programmiersprache
einzusetzen ist. Dabei werden meist bestimmte Sprachkonstrukte und
Funktionen verboten. Für andere wird festgelegt, wie sie zu
verwenden sind. Ein Teil der Regeln ist meist zwingend zu befolgen,
ein anderer Teil der Regeln wird empfohlen.
Ziel ist, die Sicherheit und Zuverlässigkeit der erzeugten
Programme zu erhöhen, die Lesbarkeit und Wartbarkeit des Quellcodes
zu verbessern und typische Fehler zu vermeiden.
In bestimmten Branchen ist eine Zertifizierung erforderlich, d.h.
die Einhaltung der Regeln muss nachgewiesen werden.
Beispiele für Coding Standards sind der CERT C Coding
Standard 〈1〉
(allgemeiner Standard) und MISRA-C 〈2〉 (Automobilindustrie).
Da die Herausgeber des Cert C Coding Standard ihr Regelwerk im
Internet veröffentlicht haben, wird hier im Text vornehmlich darauf
Bezug genommen. Allerdings werden nicht alle Regeln vorgestellt,
nur die sich thematisch anbietenden. Ein vollständiges Studium
aller Regeln wird empfohlen, siehe Link oben.
Auf das Zitieren von MISRA-C wird hier verzichtet, auf der MISRA-Webseite 〈3〉 können gedruckte Versionen und
PDF-Dokumente erworben werden.
Ein weiteres Standardwerk sind die GNU Coding
Standards 〈4〉. Auch
wenn Sie Ihre Software nicht unter einer GNU Lizenz
veröffentlichen, können Sie diesem Standard hilfreiche Hinweise zum
Programmieren entnehmen.
Verzeichnis hsmet
Im Text finden Sie mitunter die Formulierung "im Verzeichnis
hsmet".
Die Beispielprogramme und weiteren Dateien für diesen Kurs sind als
Archivdatei hsmet.zip verfügbar.
Das Verzeichnis hsmet erhalten Sie, indem Sie die Archivdatei
auspacken.
Lehrveranstaltung "Informatik 2"
In der Lehrveranstaltung wird nur ein Teil der hier im
Theorie-Teil dargestellten Themen behandelt bzw. verwendet,
insbesondere:
- Programmiersprache C
- Häufig auftretende Problemstellungen (jeweils die
Windows-Variante)
Der Theorie-Teil enthält auch darüber hinausgehende
Informationen, diese sind für interessierte Studierende gedacht und
mit "Weiterführende Informationen für Interessierte, kein
Prüfungsgegenstand" markiert.
Es erfolgt keine strikte Trennung zwischen Vorlesung und Übung.
Beide werden zu einer Zeiteinheit von 4h (hier Übung genannt)
zusammengefasst, die jeweils Vorlesungsteile mit praktischen
Übungen kombiniert.
Für die Lehrveranstaltung sind für Vorlesung und Übung
4 Semesterwochenstunden vorgesehen, insgesamt also 60 Stunden
Lehrveranstaltung.
Der gleiche Zeitaufwand - also nochmals 60 Stunden - muss für
individuelle Beschäftigung mit dem Stoff eingeplant werden. Hierzu
zählen insbesondere das selbständige Programmieren entweder der
vorgegebenen Übungsaufgaben oder auch selbst gewählter Themen sowie
die Vor- und Nachbereitung der Theorieteile.
Datenfluss
- Editor
Mit dem Editor bearbeiten Sie Quelltexte in der Programmiersprache
C, die Quelltexte sind an der Dateiendung *.c (bzw. *.cpp für C++)
zu erkennen.
- Compiler
Aus jeder Quelltextdatei wird mit dem Compiler eine Objektdatei
erstellt. Diese hat unter Windows die Dateiendung *.obj, unter
Linux/Unix die Dateiendung *.o. Die Objektdateien enthalten
Maschinenbefehle, die den Instruktionen des zugehörigen Quelltextes
entsprechen, initialisierte Variablen und eine Symboltabelle. Die
Symboltabelle wird bei Verwendung mehrerer Quelltext- bzw.
Objektdateien dazu benötigt, die Verknüpfungen zwischen den
Inhalten der Module herzustellen.
- Linker
Aus den Objektdateien wird dann mit dem Linker das ausführbare
Programm erstellt, indem die Objektdateien und Bibliotheken
zusammengefügt werden.
Arbeitsumgebung
Die konkreten erforderlichen Schritte zum Einstellen der
Arbeitsumgebung und zum Erstellen von Projekten hängen stark von
der verwendeten Arbeitsumgebung ab, auch von der Versionsnummer der
verwendeten Software. Sie können u.a. folgende Arbeitsumgebungen
verwenden:
Windows
- Verwendung von MS Visual Studio
Eine IDE (integrated development environment, integrierte
Entwicklungsumgebung) bietet beim Programmieren Hilfestellung
dahingehend, dass die Projekterstellung GUI-basiert vorgenommen
wird, Funktionen zum automatischen Vervollständigen vorhanden sind,
bei Fehlermeldungen des Compilers gleich zur zugehörigen
Quelltext-Position gesprungen wird...
Nachteilig ist allerdings, dass auch die Bedienung der IDE etwas
Einarbeitung erfordert.
Für die Übung "Informatik 2" wird MS Visual Studio unter
Windows benutzt.
- Verwendung von nmake und einem beliebigen Editor
Sie können Quelltexte auch mit einem beliebigen Editor bearbeiten
und Compiler und Linker durch das Programm nmake starten lassen.
Dies erfordert allerdings Kenntnisse, wie die zugehörige
Steuerdatei "makefile" aufzubauen ist und wird nicht für Anfänger
empfohlen.
Linux/Unix
- Beliebiger Editor und make
Unter Linux ist die einfachste Methode, mit dem Programmieren zu
beginnen, die Verwendung eines beliebigen Editors in Kombination
mit dem Programm "make".
Als Editor verwende ich selbst vim. GUI-basierte Editoren wie z.B.
gedit sind ebenfalls gut geeignet.
Wichtig ist, dass der Editor über einen automatischen Einzug
(automatische Einrückung) verfügt, dies kann meist in den
Einstellungen aktiviert werden.
Eine Anzeige der Zeilennummern und die Möglichkeit, in bestimmte
Zeilen zu springen, sind ebenfalls hilfreich.
- Integrierte Entwicklungsumgebungen
Zwei häufig unter Linux/Unix eingesetzte Entwicklungsumgebungen
sind Code::Blocks 〈5〉 und Eclipse 〈6〉.
Beide sollten über das Paketmanagement der jeweiligen
Linux-Distribution installierbar sein. Unter Scientific Linux und
evtl. auch anderen RHEL-Clones ist Code::Blocks im EPEL-Repository
verfügbar.
Da Eclipse in der Standardausführung hauptsächlich auf das
Programmieren in Java ausgerichtet ist, wird zusätzlich noch das
Plugin Eclipse-CDT benötigt.
Die Verwendung integrierter Entwicklungsumgebungen unter Linux wird
hier im Text nicht behandelt.
Externe Links
1 |
http://www.securecoding.cert.org/ |
2 |
http://de.wikipedia.org/wiki/MISRA-C |
3 |
http://www.misra.org.uk |
4 |
http://www.gnu.org/prep/standards/standards.html |
5 |
http://www.codeblocks.org |
6 |
http://www.eclipse.org |
Inhaltsverzeichnis
1 Theorie |
|
1.1 Die
Programmiersprache C |
|
|
1.1.1
Einführungsbeispiel |
|
|
1.1.2
Variablen, Kommentare |
|
|
1.1.3
Zuweisungen und Berechnungen |
|
|
1.1.4
Algorithmen-Grundstrukturen |
|
|
1.1.5 Funktionen |
|
|
1.1.6
Felder, Adressen und Zeiger |
|
|
1.1.7
Zeichenketten, const |
|
|
1.1.8
Nutzerdefinierte Datentypen |
|
|
1.1.9 Ausgabe mit
printf, Eingabe mit scanf |
|
|
1.1.10
Ganzzahlige Berechnungen |
|
|
1.1.11
Gleitkomma-Berechnungen |
|
|
1.1.12
Mehrere Quelltext-Module |
|
|
1.1.13 Der
Präprozessor |
|
|
1.1.14 Die
main-Funktion |
|
|
1.1.15 Zeiger auf
Funktionen, Callbacks |
|
1.2 Häufig auftretende
Problemstellungen |
|
|
1.2.1
Dynamische Speicherverwaltung |
|
|
1.2.2
Dateien lesen und schreiben |
|
|
|
1.2.2.1 Ein-/Ausgabe mit
FILE-Struktur |
|
|
1.2.3
Ressource-Freigabe und Test auf Erfolg |
|
|
1.2.4 Sortieren
und suchen mit qsort und bsearch |
|
|
1.2.5 Datum und
Uhrzeit |
|
|
1.2.6 Informationen über
Datei abrufen |
|
|
1.2.7 Datei
löschen |
|
|
1.2.8
Aktuelles Verzeichnis ermitteln |
|
|
1.2.9
Zugriffsrechte auf Datei setzen |
|
|
1.2.10
Verzeichnis durchsuchen |
|
1.3 make / nmake |
|
1.4 C unter
Windows |
|
1.5 C unter
Linux/Unix |
|
1.6 Portable
Programmierung |
2 Übungen |
|
2.1 Bevor es
losgeht... |
|
2.2 Übung 1 |
|
|
2.2.1
Einführungsbeispiel |
|
|
2.2.2 Online-Hilfe |
|
|
2.2.3
Variation des Programmes |
|
|
2.2.4
Steuerzeichen |
|
|
2.2.5
Compiler-Fehler |
|
|
2.2.6 Variable,
Wertangaben, Ausgabe von Werten |
|
|
2.2.7
Sequentielle Abarbeitung, Eingabe mit scanf() |
|
|
2.2.8
if-Anweisung |
|
2.3 Übung 2 |
|
|
2.3.1
Entscheidungsoperator |
|
|
2.3.2
for-Schleife |
|
|
2.3.3
while-Schleife |
|
|
2.3.4
do-while-Schleife |
|
2.4 Übung 3 |
|
|
2.4.1
Funktionen |
|
|
2.4.2 Felder |
|
|
2.4.3 Zeiger auf
Felder |
|
2.5 Übung 4 |
|
|
2.5.1 Strings |
|
|
2.5.2
Datenstrukturen |
|
2.6 Übung 5 |
|
|
2.6.1
Zeiger auf Datenstrukturen |
|
|
2.6.2
Vergleichs- und Logikoperatoren |
|
|
2.6.3
Bitschiebe-Operatoren |
|
2.7 Übung 6 |
|
|
2.7.1
Berechnung |
|
|
2.7.2 Mehrere
Module |
|
2.8 Übung 7 |
|
|
2.8.1
Sichtbarkeit von Variablen |
|
|
2.8.2
Dynamische Speicherverwaltung |
|
|
2.8.3
Binärdaten lesen und schreiben |
|
2.9 Übungen 8-9 |
|
2.10 Übungen
10-11 |
|
2.11 Übungen
12-13 |
3
Praktische Hinweise, Screenshots |
|
3.1 MS Visual
Studio |
|
|
3.1.1
Arbeitsumgebung einrichten |
|
|
3.1.2 Neues
Projekt anlegen |
|
|
3.1.3
*.exe-Datei erstellen |
|
|
3.1.4 *.exe-Datei
starten |
|
|
3.1.5
Compiler-Fehler |
|
3.2 Linux,
Editor und make |
|
|
3.2.1
Arbeitsumgebung einrichten |
4 Anhang |
|
4.1 Technische
Details |
|
|
4.1.1
Gleitkommazahlen |
5 Links,
Literatur |
Stichwort-Index
- #define
-
- #error
-
- #ifdef
-
- #include
-
- #pragma
-
- 64-Bit-Zahlen
-
- _chmod
-
- _CRT_SECURE_NO_WARNINGS
-
- _finite
-
- _fpclass
-
- _FPCLASS_ND
-
- _FPCLASS_PD
-
- _getcwd
-
- _unlink
-
- _USE_MATH_DEFINES
-
- Abrunden
-
- acos
-
- acosh
-
- Adressoperator
-
- Aktuelles Verzeichnis (Linux/Unix)
-
- Aktuelles Verzeichnis (Windows)
-
- Arbeitsumgebung
-
- argc/argv
-
- Arithmetische Operatoren
-
- Array
-
- Array-Initialisierung
-
- asin
-
- asinh
-
- Assoziativität
-
- atan
-
- atan2
-
- atanh
-
- Aufrunden
-
- auto
-
- automatische Variable
-
- Backslash-Sequenz
-
- Bedingte Compilierung
-
- Betrag
-
- Binär lesen
-
- Binärdatei
-
- Binäres Schreiben
-
- Bitweise Operatoren
-
- Callback-Funktion
-
- calloc
-
- ceil
-
- char
-
- chmod
-
- const
-
- cos
-
- cosh
-
- Datei-Informationen
-
- Datei-Zugriffsrechte setzen (Linux/Unix)
-
- Datei-Zugriffsrechte setzen (Windows)
-
- Dateideskriptor
-
- Dateien löschen (Linux/Unix)
-
- Dateien löschen (Windows)
-
- Datentypen
-
- Definition
-
- Deklaration
-
- Dekrement-Operator
-
- denormalized
-
- Division durch 0
-
- do/while
-
- double
-
- Dynamisch angeforderten Speicher
freigeben
-
- Dynamisch Speicher anfordern
-
- e (Basis des natürlichen Logarithmus
-
- Einrückung
-
- Entscheidungsoperator
-
- enum
-
- Ergebnistyp
-
- exp
-
- Exponentialfunktion
-
- extern
-
- fabs
-
- fclose
-
- Feld
-
- Feld-Initialisierung
-
- Feldelement
-
- feof
-
- fgetc
-
- fgets
-
- FILE
-
- float
-
- floor
-
- fopen
-
- fopen_s
-
- for
-
- fprintf
-
- fputc
-
- fputs
-
- fread
-
- free
-
- fscanf
-
- Funktion
-
- Funktionen
-
- Funktionsargumente
-
- Funktionsdefinition
-
- Funktionsdeklaration
-
- Funktionsname
-
- fwrite
-
- Ganzzahlen-Vergleich
(vorzeichenbehaftet/vorzeichenlos)
-
- getcwd
-
- Gleitkomma-Exception
-
- Gleitkomma-Vergleiche
-
- Gleitkommazahlen
-
- globale Variable
-
- Header-Datei
-
- hsmet
-
- Identifier
-
- if/else
-
- INF
-
- Inkrement-Operator
-
- int
-
- intmax_t
-
- isalnum
-
- isalpha
-
- isascii
-
- isblank
-
- iscntrl
-
- isdigit
-
- isfinite
-
- isgraph
-
- isgreater
-
- isgreaterequal
-
- isless
-
- islessequal
-
- islessgreater
-
- islower
-
- isnormal
-
- isprint
-
- ispunct
-
- isspace
-
- isunordered
-
- isupper
-
- isxdigit
-
- Kommentar
-
- limits.h
-
- Literale
-
- localtime_r
-
- localtime_s
-
- log
-
- log10
-
- Logarithmus zur Basis 10
-
- Logische Operatoren
-
- lokale Variable
-
- long
-
- long double
-
- long long
-
- lvalue
-
- M_E
-
- M_PI
-
- M_PI_2
-
- M_PI_4
-
- M_SQRT2
-
- main
-
- Makro
-
- malloc
-
- math.h
-
- Mikrocontroller
-
- Minimal- und Maximalwerte
-
- Module
-
- modulweite Variable
-
- NAN
-
- natürlicher Logarithmus
-
- nichtnormalisierte Gleitkommazahl
-
- normalisierte Gleitkommazahl
-
- PATH
-
- persistente lokale Variable
-
- Platzhalter
-
- Potenz
-
- pow
-
- printf
-
- Programmstruktur
-
- Projekt
-
- Prototyp
-
- register
-
- Reservierte Wörter
-
- Ressourcen-Freigabe
-
- rint
-
- Runden
-
- scanf
-
- Sequentielle Abarbeitung
-
- short
-
- Sichtbarkeit von Variablen und Funktionen
-
- sin
-
- sinh
-
- size_t
-
- sizeof
-
- Speicherklasse
-
- Speicherklassen
-
- Sprungmarke
-
- Sprungmarken-Kette
-
- sqrt
-
- stat
-
- static
-
- Statuscode
-
- stdio.h
-
- strcat
-
- strchr
-
- strcmp
-
- strcpy
-
- string.h
-
- Strings
-
- strlen
-
- struct
-
- Strukturierte Programmierung
-
- switch
-
- tan
-
- tanh
-
- test
-
- Textausgabe portabel
-
- Textausgabe Windows
-
- Textdatei
-
- time
-
- tolower
-
- toupper
-
- typedef
-
- uintmax_t
-
- union
-
- unlink
-
- unsigned
-
- Variablen-Definition
-
- Variablen-Deklaration
-
- Variablen-Initialisierung
-
- Variablendeklaration
-
- Vergleichsoperatoren
-
- Verkürzte Operatoren
-
- Verzeichnis hsmet
-
- Vorrang
-
- Vorzeichenbehaftete ganze Zahlen
-
- Vorzeichenlose ganze Zahlen
-
- wchar_t
-
- Wertzuweisung
-
- while
-
- Wurzel
-
- Zeichenketten
-
- Zeichentyp
-
- Zeichenweise lesen
-
- Zeiger
-
- Zeilenende
-
- Zeilenweise lesen
-
- Zeit (Linux/Unix)
-
- Zeit (Windows)
-
- Zuweisung
-
- Überlauf
-
- Überlauf-Erkennung (vorzeichenbehaftete
Ganzzahlen)
-
- Überlauf-Erkennung (vorzeichenlose
Ganzzahlen)
-