Vorlesung 2: Programmieren mit C URL zur Lehrveranstaltung http://www.fbmnd.fh-frankfurt.de/~raimann Folien zur Vorlesung, Übungsaufgaben,... Dr. J. Raimann 1
Dev C++ Kostenlose C/C++-Entwicklungsumgebung Download der aktuellen Version unter folgender URL http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe -> anschließend muss ein Mirror-Server für den Download ausgewählt werden (z.b. Düsseldorf) siehe auch Website des Herstellers: http://www.bloodshed.net Es können auch andere Entwicklungsumgebungen verwendet werden, wie z.b. MS Visual C++ (Express Edition) http://www.microsoft.com/germany/express/product/visualcplusplusexpress.aspx Literatur Die Programmiersprache C, hrsg. von RRZN, Universität Hannover, KFA (erhältlich bei H. Ünsal (Geb. 1, Raum 348), Kosten: 4,00 ) Siehe dazu auch: http://www.fh-frankfurt.de/de/fh_ffm/verwaltung_einrichtungen / abteilungen/ rechenzentrum/arbeitsbereiche/it_service_centre/rrzn_handbuecher.html Brian W. Kernighan/ Dennis M. Ritchie: "Programmieren in C", Hanser/Prentice Hall, 1990 J. Goll/U. Bröckl/M. Dausmann: C als erste Programmiersprache, Vom Einsteiger zum Profi, 4. Aufl., Teubner, 2003 H. Erlenkötter/V. Reher: Programmiersprache C: eine strukturierte Einführung, rororo Taschenbuch Im Internet J. Wolf: C von A bis Z, - Das umfassende Handbuch für Linux, Unix und Windows; 2. aktualisierte und erweiterte Auflage 2006, zu finden unter http://www.galileocomputing.de/openbook/c_von_a_bis_z/ Diverse C-Einführungen im WWW Dr. J. Raimann 2
"The only way to learna new programming language is by writing programs in it" Brian W. Kernighan/Dennis M. Ritchie: The C Programming Language, 1978 Unterscheidung der Programmiersprachen Maschinensprache (binäre Zeichenfolgen) Maschinennahe Sprache (Assembler, mit mnemotechnischen Abkürzungen für die Binärfolgen) n, z.b. Fortran, 1957 Cobol, 1960 Algol, 1960 Basic, 1965 PL/1, 1967 Pascal, 1974 C, ab 1972 Ada, 1979 Java, 1995 Dr. J. Raimann 3
Schematischer Ablauf der Problemlösung mit dem Computer Problem/ Aufgabenstellung Nachdenken Algorithmus Programmieren Programm in höherer Progr.sprache Übersetzen Programm in Maschinensprache Programmlauf Problemlösung Von der Idee zum Programm Summe zweier natürlicher Zahlen a und b Computer lateinisch computare, soviel wie rechnen Festlegung Algorithmus: c = a + b Quelldatei (Source-File) erstellt mit Editor Übersetzerprogramm (Compiler) IDE = Integrated Development Environment Assembler / Maschinensprache LOAD a,%r0 LOAD b,%r1 Linker (Verbindung von fertigen Objekten) ADD %r0,%r1 STORE %r1,c Software Dr. J. Raimann 4
Editieren Kompilieren Linken Programmieren bedeutet einen Algorithmus in einer definierten Sprache zu beschreiben -> Editieren Geschriebene Programme müssen vor der Ausführung kompiliert, d.h. in Maschinensprache übersetzt werden (Compiler). Zusätzlich werden häufig schon vorhandene Funktionen aus Funktionsbibliotheken in das Programm eingebunden (Linker). Das Ergebnis des Linkens und Kompilierens ist eine.exe-datei in Maschinensprache, die vom Prozessor abgearbeitet werden kann Hilfsmittel zur Beschreibung von Algorithmen Umgangssprache Pseudocode Programmablaufplan Datenflußplan Struktogramm Einlesen X Einlesen Y Wenn X > Y Dann Z = X Sonst Z = Y Ausgabe Z Der Motor M läuft solange die Tasten A und B gedrückt werden. Dr. J. Raimann 5
Geschichte der Programmiersprache C (1) 1972 bis 1978: D. M. Ritchie, K.Thompson und B. W. Kernighan (Bell Laboratories der Fa. AT & T) entwickeln die Programmiersprache C parallel zu dem Betriebssystem Unix, dessen wesentliche Teile in C geschrieben sind Zielsetzung: eine höhere Programmiersprache zu entwickeln, mit der das Betriebssystem UNIX neu geschrieben und auf andere Rechnertypen portiert werden konnte C sollte die strukturierte Programmierung unterstützen und dennoch so schnell wie Assembler sein Geschichte der Programmiersprache C (2) Von ALGOL wurde die Möglichkeit der strukturierten Programmierung für C übernommen. Hinsichtlich des Zeigerkonzepts besteht eine gewisse Ähnlichkeit mit der von N. Wirth entwickelten Programmiersprache Pascal. 1989: Standardisierung durch ANSI ab 1980: C++ als objektorientierte Erweiterung von C (B. Stroustrup) Dr. J. Raimann 6
Vorteile von C universell einsetzbar maschinennäher als die meisten anderen höheren Programmiersprachen -> kompakte und schnelle Codes Nachteile von ASSEMBLER-Sprachen wurden vermieden Gute, schnelle und auch kostenfreie Compiler erhältlich Klar definierter Sprachstandard, weitgehend unabhängig von speziellen Hardware-Konfigurationen und Betriebssystemen. C-Programme sind daher in hohem Maße portabel. Große Anzahl von Operatoren ermöglicht eine effiziente und kompakte Programmierung C erzwingt eine strukturierte Programmierung C enthält verhältnismäßig wenig Sprachelemente Umfangreiche Bibliotheken mit Standard-Funktionen verfügbar Nachteile von C C-Programme sind oft schwer lesbar C verführt zu trickreichem und undurchsichtigem Programmieren Es gibt in C viele Fallen (insbesondere im Zusammenhang mit Zeigern), die zu unvorhergesehenen Nebenwirkungen und Fehlem führen können, ohne dass der Compiler durch eine Fehlermeldung oder Warnung darauf aufmerksam machen würde. Viele Fehler, z.b. Bereichsüberschreitungen bei der Indizierung von Arrays, werden nicht vom Compiler abgefangen Fehlende strenge Typisierung von C ist nachteilig (strenge Typisierung heißt: für einen definierten Datentyp sind nur definierte Operationen zulässig) Dr. J. Raimann 7
Erstes C-Programm: Hello, World #include <stdio.h> /* Erstes C-Programm */ #include <stdlib.h> int main (void) { printf ("HELLO, WORLD\n") ; system("pause"); return 0 ; } Grundlegende Eigenschaften und Elemente von C Programmtext wird formatfrei eingegeben Programmzeilen werden mit Semikolon ; abgeschlossen Kommentare werden in /*... */ eingeschlossen mit # beginnende Anweisungen sind sogenannte Präprozessor- Anweisungen der Funktionskörper wird durch geschweifte Klammern { } begrenzt Die Funktion main, die jedes C-Programm besitzen muss, stellt das Hauptprogramm dar Mit return kann ein Wert an das aufrufende Programm zurückgegeben werden \n ist eine sogenannte ESC-Sequenz, die einen Zeilenvorschub erzeugt Dr. J. Raimann 8
Grundlegende Eigenschaften und Elemente von C keine Unterscheidung von Funktionen und Prozeduren Unterscheidung von Groß-/Kleinschreibung Namen (Bezeichner) können Ziffern, Buchstaben und den Unterstrich _ enthalten, wobei jedoch das erste Zeichen keine Ziffer sein darf. Zwischen Klein- und Großbuchstaben wird unterschieden. Namen dürfen keine Schlüsselwörter enthalten, da diese als Sprachbestandteile von C eine vordefinierte Bedeutung haben. C-Schlüsselwörter werden klein geschrieben der Befehl system ("PAUSE"); bewirkt, dass das Ausgabefenster bis zum Drücken einer Taste stehen bleibt. Um system verwenden zu können muss die Library stdlib.h in das Programm eingebunden werden Die Ausgabe-Funktion printf (formatierte Ausgabe) #include <stdio.h> #include <stdlib.h> main() { printf("der Befehl printf kann "); printf("nicht nur Texte ausgeben \n"); printf("sondern auch rechnen:\n\n"); printf("das Produkt von 13 * 7 ist %i \n", 13 * 7); system("pause"); } %i = Formatangabe, fungiert als Platzhalter; der Wert von 13*7 wird hier eingesetzt und als Zahl formatiert ausgegeben \n = Escape-Sequenz -> Zeilenendezeichen (newline) Dr. J. Raimann 9
Ausgabe mit printf Prototyp/Funktion ist definiert in stdio.h Wichtige Formatanweisungen in Zeichenketten (Escape-Sequenzen): C Schlüsselwörter (1) auto break case char const continue Speicherklassenbezeichner Zum Herausspringen aus Schleifen oder der switch-anweisung Auswahl-Fall in switch-anweisung Typ-Bezeichner Attribut für Typangabe Fortsetzungsanweisung default Standardeinsprungmarke in switch- Anweisung do double else Teil einer Schleifen-Anweisung Typ-Bezeichner Teil einer Einfach- oder Mehrfachalternative Dr. J. Raimann 10
C Schlüsselwörter (2) enum extern float for goto if int long Aufzählungstyp-Bezeichner Speicherklassenbezeichner Typ-Bezeichner Schleifenanweisung Sprunganweisung Teil einer Alternative oder bedingten Anweisung Typ-Bezeichner Typ-Modifizierer bzw. Typ-Bezeichner register Speicherklassen-Bezeichner return short Rücksprung-Anweisung Typ-Modifizierer bzw. Typ-Bezeichner C Schlüsselwörter (3) signed Typ-Modifizierer bzw. Typ-Bezeichner sizeof Operator zur Bestimmung der Größe von Variablen static Speicherklassenbezeichner struct Strukturvereinbarung switch Auswahlanweisung typedef Typnamenvereinbarung union Datenstruktur mit Alternativen unsigned Typ-Modifizierer bzw. Typ-Bezeichner void Typ-Bezeichner volatile Attribut für Typangabe while Schleifenanweisung Dr. J. Raimann 11