Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Bernd Schürmann
Programmieren in C
Einführung in das Programmieren für Elektrotechniker
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Kapitel 1: Grundlagen
Von Neumann-Architektur
Vom Problem zum Programm
„Hello World“
Werkzeuge zur Programmausführung
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Informatik
Wissenschaft von der systematischen Verarbeitung von Informationen.
Algorithmus
Vorschrift zur systematischen Vorgehensweise zur Lösung von Problemen.
Im Großen:
Systematische Softwareentwicklung / Software Engineering.
Computer / Rechner
Berechnet Probleme, die geeignet durch Algorithmen beschrieben sind.
Grundbegriffe
jetzt VL-Ende
gleich VL-Ende
Vorlesung „Programmieren in C“
Einführung, Motivation
mehr in der Vorlesung „Architektur digitaler Systeme I“
Von Neumann-Architektur
Zum Verständnis von C-Programmen ist das
Verständnis der von Neumann-Architektur
Grundvoraussetzung.
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Teile eines Computer:
• Festplatte (Peripherie) mit Daten und Programmen
• Prozessor
mit Rechenwerk inkl. Registern und Steuerwerk
• (Arbeits-) Speicher
• Bus (Übertragungsleitungen)
Rechnerkomponenten
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
3. Schritt:
Programm ausführen:
• Anweisung/Befehl lesen
• Daten in Register
• Rechenwerk arbeitet
• Ergebnis in Register oder Arbeitsspeicher
A=b+c
A=7
Rechnerkomponenten
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Steuer- werk
(Befehlsregister)
Rechen- werk
(Registersatz)
Prozessor
Arbeits- speicher
Ein-/Ausgabe (Peripherie)
Datenbus
von Neumann-Computer
Referenzmodell (seit 1945)
Rechenwerkführt Rechenoperationen und logische Verknüpfungen durch
Steuerwerk: interpretiert Befehle und steuert die Befehlsabfolge
(Arbeits-/Haupt-) Speicher: speichert Programme und Daten
Ein-/Ausgabe: steuert E/A von Daten
Vorlesung „Programmieren in C“
Weitere Eigenschaften:
• Daten/Programme binär kodiert
• Daten und Programme ununterscheidbar
• bedingte Sprünge Steuer-
werk
(Befehlsregister)
Rechen- werk
(Registersatz)
Prozessor
Arbeits- speicher
Ein-/Ausgabe (Peripherie)
Datenbus
von Neumann-Computer
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Steuer- werk
(Befehlsregister)
Rechen- werk
(Registersatz)
Prozessor
Arbeits- speicher
Datenbus
von Neumann-Computer
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
von Neumann-Computer
11011110…10100101 01000110 11011011 00010010 00000000 11111111 01010101
…
… 00001111 01101001 11000011 01010101 11001111 01100110 00110100 10001010 0 …
232-1
neu = alt + 5;
4711
124
neu alt
add
• Daten/Programme binär kodiert
• Daten und Programme ununterscheidbar
add 4712, 4711, 5
Compiler (s.u.)
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Beispielaufgabe:
Berechnen Sie die Quersumme q einer natürlichen Zahl n.
( Lösung als C-Programm: später)
Algorithmen und Notationen
Vorlesung „Programmieren in C“
Beispielaufgabe:
Berechnen Sie die Quersumme q einer natürlichen Zahl n.
( Lösung als C-Programm: später)
Gegeben: natürliche Zahl n. Beispiel: n = 4711 q = 13
q = 0
solange n > 0: Rest r = n modulo 10 Quersumme q = q + r n = n / 10
Algorithmen und Notationen
n / 10
Rest r Quotient
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Definition: Algorithmus
Ein Algorithmus ist eine präzise, endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer, elementarer (Verarbeitungs-) Schritte.
Algorithmus ist unabhängig von konkreter Programmiersprache.
Dient nur der abstrakten Beschreibung eines funktionellen Lösungswegs.
Wichtige Aspekte wie Korrektheit, Aufwand, Anforderungen an Eingabegrößen und Zusicherungen (Garantien) für berechnete Resultate können allgemein abgeleitet werden.
Sie gelten damit für alle konkreten Realisierungen in einer Programmiersprache.
Algorithmen und Notationen
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Zur Formulierung von Algorithmen gibt es verschiedene Möglichkeiten ( Notationen)
Von abstrakten Beschreibungen bis zu konkreten Programmiersprachen, z.B.:
• Umgangssprachliche Beschreibungen
oft umfangreich und mehrdeutig.
• Flussdiagramme
Graphische Darstellung, schnell unübersichtlich.
• Mathematische Notationen (kein Algorithmus im engeren Sinn)
exakt und präzise.
• Pseudonotationen
informell und abstrakt.
• Programmiersprachen
präzise Beschreibung.
Algorithmen und Notationen
Algorithmen und Notationen
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Verwendung natürlicher Sprache.
Geeignet für erste Annäherung.
Beispiel: Quersumme
Geg.: natürliche Zahl n
Addiere den Rest der Division n durch 10 zur Quersumme und teile n durch 10.
Führe diese Berechnung solange aus, bis n Null ist.
Umgangssprachliche Notation
Algorithmen und Notationen
n mod[ulo] 10
Vorlesung „Programmieren in C“
Verwendung natürlicher Sprache.
Geeignet für erste Annäherung.
Beispiel: Euklidischer Algorithmus Euklid:
Wenn CD aber AB nicht misst, und man nimmt bei AB, CD abwechselnd immer das kleinere vom größeren weg, dann muss (schließlich) eine Zahl übrig bleiben, die die vorangehende misst.
Umgangssprachliche Notation
Algorithmen und Notationen
ggt (a, b)
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Verwendung natürlicher Sprache.
Geeignet für erste Annäherung.
Beispiel: Euklidischer Algorithmus
Man teilt die größere durch die kleinere Zahl.
Geht die Division auf, ist der Divisor der ggT.
Geht die Division nicht auf, bleibt ein Rest.
Dieser Rest ist der neue Divisor. Der alte Divisor wird zum Dividenden. Nun setzt man das Verfahren fort.
Nach endlich vielen Schritten erhält man den ggT.
Umgangssprachliche Notation
Algorithmen und Notationen
ggt (a, b)
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Verwendung natürlicher Sprache.
Geeignet für erste Annäherung.
Beispiel: Euklidischer Algorithmus
Geg.: a, b natürliche Zahlen; a>0; b≥0 1. Kopiere a nach a′ und b nach b′.
2. Falls b′=0: weiter bei Schritt (10).
3. Falls b′>a: weiter bei Schritt (8).
4. Berechne r = a′ mod b′.
5. Kopiere b′ nach a′.
6. Kopiere r nach b′.
7. Gehe zu Schritt (2).
8. Vertausche a′ und b′.
9. Gehe zu Schritt (2).
10. Ausgabe des Resultats a′.
Umgangssprachliche Notation
Algorithmen und Notationen
ggt (a, b)
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Beispiel: Quersumme
Flussdiagramme (engl. Flowchart)
Algorithmen und Notationen
START a = 4711 q = 0
n=0? → falsch q = q + 1 = 1 n = n / 10 = 471 n=0? → falsch q = q + 1 = 2 n = n / 10 = 47 n=0? → falsch q = q + 7 = 9 n = n / 10 = 4 n=0? → falsch q = q + 4 = 13 n = n / 10 = 0 n=0? → wahr Ausgabe: 13 ENDE
START Eingabe: n
n=0?
ENDE
q = 0
Ausgabe: q
q = q + (n mod 10) n = n / 10 true
false
Graphische Repräsentation eines Algorithmus.
n und q sind Variablen (
Speicherzellen), die immer wieder verändert werden.
später genauerVorlesung „Programmieren in C“
Wird i.d.R. zum Detailentwurf eingesetzt.
Aufbau
Spezielle graphische Symbole zur informellen Beschreibung von Aktionen.
Flusslinien verbinden graphische Symbole und legen Kontrollfluss fest.
Vorteile
Veranschaulichung des Kontrollflusses eines Programms
(d.h. Abfolge der Anweisungen, die bei einer Berechnung ausgeführt werden)
.
Schleifenkonstrukte lassen sich deutlich hervorheben, insbesondere bei mehreren Schleifen.
Flussdiagramme (engl. Flowchart)
Algorithmen und Notationen
q = 0
n=0?
Berechnungsschritt
Abfrage/Verzweigung
operationalisierte Problemlösung
prozedurale, imperative Programmierung
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Beispiel: Euklidischer Algorithmus
Flussdiagramme (engl. Flowchart)
Algorithmen und Notationen
START a =8, b =4 a′=8, b′=4 4=0? → false 4>8? → false r=0, a′=4, b′=0 0=0? → true Ausgabe: 4 ENDE
START Eingabe: a, b
b′=0?
ENDE
a′=a, b′=b
b′>a′?
Ausgabe: a′
c = a′
a′ = b′
b′ = c
r = a′ mod b′
a′ = b′
b′ = r true
false
false true
Graphische Repräsentation eines Algorithmus.
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Verwendung mathematischer Formeln.
Knappe und eindeutige Beschreibung.
Besonders geeignet für mathematische Probleme.
Beispiel: Quersumme
Mathematische Notation
Algorithmen und Notationen
0 n = 0
qs (n)=
n mod 10 + qs (n/10) sonst Rekursion
typisch für mathematische Beschreibung
deklarative Problemlösung
Kein Algorithmus nach obiger Definition
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Verwendung mathematischer Formeln.
Knappe und eindeutige Beschreibung.
Besonders geeignet für mathematische Probleme.
Beispiel: Euklidischer Algorithmus
Mathematische Notation
Algorithmen und Notationen
a b = 0
ggT (a, b) = ggT (b, a) b > a ggT (b, a mod b) sonst
Vorlesung „Programmieren in C“
Abstrakte Programmiersprache („Pseudocode“)
Verwendung allgemeiner Konzepte, die den üblichen Programmiersprachen gemeinsam sind
(z.B. Verzweigungen, Iterationen).
Basis für präzise Beschreibung von Algorithmen.
Leichte Übertragbarkeit auf spezielle Programmiersprachen.
Beispiel: Quersumme
Eingabe: natürliche Zahl n q = 0
while n > 0 do r n mod 10;
q q + r;
r r / 10;
Ausgabe: q
Pseudocode
Algorithmen und Notationen
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Abstrakte Programmiersprache („Pseudocode“)
Verwendung allgemeiner Konzepte, die den üblichen Programmiersprachen gemeinsam sind
(z.B. Verzweigungen, Iterationen).
Basis für präzise Beschreibung von Algorithmen.
Leichte Übertragbarkeit auf spezielle Programmiersprachen.
Beispiel: Euklidischer Algorithmus
Geg.: a, b natürliche Zahlen; a>0; b≥0 ggT(a,b) ≡ if b=0 then a
else if b>a then ggT(b,a)
else ggT(b,mod(a,b)) endif
endif
Pseudocode
Algorithmen und Notationen
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Kompromiss zwischen Anforderungen der Maschine und des Menschen.
Neben der mathem. Notation die präziseste Notation.
Abstrakt genug, um (gut) vom Menschen verstanden werden zu können.
Ermöglicht vollautomatische Ausführung durch Computer.
Programm
Beschreibung eines Algorithmus in einer konkreten, vom Rechner ausführbaren Programmiersprache.
(Höhere) Programmiersprache
Algorithmen und Notationen
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Das erste Programm
Hello, world!
/* File: hello_world.c */
#include <stdio.h>
int main (void) {
printf (”Hello, world!\n“);
return 0;
}
Standard-Beispiel seit Kernighan/Ritchie
Was macht das Programm? _____________________________
Vorlesung „Programmieren in C“ Hello, world!
Erläuterungen
(im Detail später) Funktion main ()
in C wird diese Funktion beim Aufruf ausgeführt
Hauptprogramm
Anweisungsblock
{ Ein Anweisungsblock wird durch geschweifte Klammern eingerahmt.
: Anweisungen im Block werden sequentiell ausgeführt.
} Anweisungen werden mit einem Semikolon abgeschlossen.
Funktion printf ()
Ein-/Ausgabefunktion „print formatted“
Funktion in der Bibliothek „stdio.h“ (später mehr)
Include
Direktive „include“ macht die Bibliothek(sfunktionen) bekannt.
Kommentare
Kommentare werden durch /* … */ eingerahmt.
Datenstruktur Zeichenkette
Zeichenketten werden durch Anführungszeichen “Hello, world!” eingerahmt.
/* File: hello_world.c */
#include <stdio.h>
int main (void) {
printf (”Hello, world!\n“);
return 0;
}
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Hello, world!
Erläuterungen
(im Detail später) Formatierung
Vorhandene Formatierung ist nicht erforderlich!
Möglich wäre auch:
#include <stdio.h>
int main(void){printf(”Hello, world!\n“);return 0;}
Übersichtlichkeit ginge verloren!
/* File: hello_world.c */
#include <stdio.h>
int main (void) {
printf (”Hello, world!\n“);
return 0;
}
Wichtig (in Prüfung notwendig):
• ausreichend kommentieren
• einrücken
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Hello, world!
Funktionen
Zentrales Strukturierungsmittel.
(Haupt-) Funktion „main“ und beliebige Unterfunktionen
Funktionsrümpfe und Blöcke
…
Typen
Datentypen
Funktionstypen
Anweisungen
Zentral für imperative Programmiersprachen (s.u.).
Bibliotheksfunktionen
Wiederverwendung von Funktionen spart Arbeit.
Kapselung von Systemsoftware.
Basiselemente eines Programms (Details später)
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Editieren
Übersetzen
(Binden)
Ausführen
Praxiseinschub:
Programmerzeugung und Ausführung
Vorlesung „Programmieren in C“ Arbeiten unter Unix
Terminal/Konsole starten
UNIX
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Unix
Editor
Erstellung und Bearbeitung von digitalen Daten (Dateien).
Funktionen und Komplexität abhängig vom Aufgabengebiet, z.B.
• Texteditoren (z.B. emacs, vim)
• html-/xml-Editoren
• sprachsensitive Editoren (unterstützen Syntax von Programmiersprachen)
• gedit
• gvim
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Unix
Programm übersetzen und ausführen
Übersetzen: gcc –o <Ausgabedatei> <C-Datei>
Ausführen: Aufrufen der Ausgabedatei
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Unix
Syntaxfehler (Beispiel)
Vorlesung „Programmieren in C“ Arbeiten unter Windows
Editor
• edit
• notepad
Windows
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Windows
Programm übersetzen und ausführen
Übersetzen: gcc –o <Ausgabedatei> <C-Datei>
Ausführen: Aufrufen der Ausgabedatei
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Windows
Syntaxfehler (Beispiel)
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Windows
C(++) Umgebung
Windows
Vorlesung „Programmieren in C“ Arbeiten unter Windows
C(++) Umgebung DEV C++
Windows
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Windows
Neues Projekt anlegen und speichern
Windows
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Windows
Programm übersetzen
Windows
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Arbeiten unter Windows
Programm ausführen
Windows
Vorlesung „Programmieren in C“ Testen
Goldene Regeln für Programmierer
Alles, was schiefgehen kann, wird auch schiefgehen.
Alles, was nicht schiefgehen kann, wird voraussichtlich doch schiefgehen.
Programme systematisch testen!
In der Praxis:
Debugging-Werkzeuge
Testumgebungen
Fehlerklassen
Syntaxfehler: vom Compiler entdeckt
Laufzeitfehler: viel schwerer zu entdecken
Testen
nicht in der Vorlesung
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Testen
Grundlegende Guidelines
Übliche Fehler, die alle machen(s.u.)
• Zuweisung ’=‘statt Vergleich ’==‘
if (x = 3) . . .: xwird 3 zugewiesen; Bedingung ist wahr
Semikolon fehlt
P = p + x entspricht p = p + xq = q + y;
q = q + y; Fehlermeldung „undeclared variable“
(ist nicht der Fehler).
Laufzeitfehler,
falls Variable ‚xq‘ existiert.
Analog: fehlende { }, ” “, /* */
Nicht deklarierte Variablen
Testen
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Programmiersprache C
Historie
eng mit der Entwicklung von UNIX verbunden
• erstes UNIX auf DEC-Rechnern in Assembler
(vgl. Vorlesung „Architektur digitaler Systeme I“)
• Ziel: portable/höhere Programmiersprache, die nahe genug an der Hardware ist
• Sprachmittel zur strukturierten Programmierung
• Möglichkeit der hardwarenahen Programmierung (z.B. Registerzugriff)
• Performance wie Assembler
Die Programmiersprache C
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Historie
Zunächst „B“ (Ableger von BCPL)
noch ohne Datentypen
1971: Ritchie: Weiterentwicklung zu C
1975: UNIX: 90% C, 10% Assembler
1978: „Kernighan/Ritchie, The C Programming Language“
zunächst Quasi-Standard (K&R-C)
Entwicklung vieler C-Dialekte
Portabilität gefährdet
Die Programmiersprache C
Programmiersprache C
Vorlesung „Programmieren in C“
Historie
1989: Standardisierung durch ANSI-Komitee: ANSI-C (x3.159-1985)
• (Teil) aller heutigen C-Compiler
• Auch Normierung der Standard-Bibliotheken, z.B. stdio.h
• 1990 durch ISO/IEC 9899 [C90] ersetzt
• 1999: Erweiterung um C++-Sprachkonstrukte: ISO/IEC 9899 [C99]
• 2011: Einführung des aktuellen Standards [C11]
Lehrbuch: C90
• Wird von (fast) allen Systemen unterstützt
• „Ausreichend“ für Einführungsvorlesung
Die Programmiersprache C
Programmiersprache C
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
C99-Standard
Erweiterung in der Sprache und Bibliotheken.
Objektorientierte Erweiterung: C++.
Beispiele
• Bei Funktionen ohne Rückgabewert wird nicht mehr intangenommen.
•long long int für 64-Bit-Zahlen, boolesche und komplexe Zahlen.
• Arrays variabler Länge.
• Einzeilige Kommentare mit //.
• Bessere Unterstützung der Codeoptimierung.
Die Programmiersprache C
Programmiersprache C
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
C11-Standard
Optionale Elemente aus C99 verpflichtend und umgekehrt.
Multithreading und atomare Operationen.
Beispiele
• Bessere Unterstützung von Unicode (utf-8, utf-16).
• Ausrichten von Strukturen im Speicher.
• Arrays variabler Länge nur noch optional.
• Entfernung der Funktion gets().
• Bessere Unterstützung der Codeoptimierung.
Die Programmiersprache C
Programmiersprache C
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Eigenschaften von C
HW-nah, d.h. gleiche „Objekte“ wie Prozessor/Assembler:
• Zahlen und Adressen
• Zeichen als Zahlen interpretiert
C-Datentypen (später vertieft):
• verschiedene Integer-Datentypen
• verschiedene Gleitkomma-Datentypen
• zusammengesetzte Datentypen:
• Strukturen
• Unions
• Bitfelder
• Adressen (Pointer)
direkter Zugriff auf Speicheradressen und Bitoperationen
oft Unterstützung des Zugriffs auf HW-Register über Bibliotheken (nicht ANSI-Std.) z.B. Visual C++-Compiler: _inp(), _outp(): Bibliotheksfunktionen, die x86-Befehlen
inund outentsprechen
Die Programmiersprache C
Programmiersprache C
Vorlesung „Programmieren in C“
Eigenschaften von C
enthält Elemente der strukturierten Programmierung
• Kontrollstrukturen
• Typkonzept (nicht streng, d.h. einige automatische Typkonvertierungen;
nicht bei unverträglichen Datentypen (Fehlermeldung))
Programmeinheiten getrennt übersetzbar
Vorteile: - ___________________________________
- ___________________________________
Die Programmiersprache C
Programmiersprache C
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Eigenschaften von C
Einordnung in die Familie der imperativen Programmiersprachen (basieren auf v. Neumann-Rechnermodell: Manipulation von Variablen im Speicher
↔ deklarative Sprachen (LISP, PROLOG, OPS5, …))
prozedural
objektorientiert
Die Programmiersprache C
FORTRAN
BASIC ALGOL60
BCPL C
Smalltalk
Modula Concurrent Pascal C++ Ada
Java C#
COBOL ALGOL68 SIMULA Pascal PL/I
prozedural
objektorientiert
Programmiersprache C
Vorlesung „Programmieren in C“
Einführung Bernd Schürmann
Eigenschaften von C
C++-Erweiterung (Folgevorlesung, neben Java)
• objektorientiertes Programmiermodell
• strengeres Typkonzept