Informatikübungen für Naturwissenschaftler Einführung in die Programmiersprache C Rudolf Pfeiffer [email protected] www.ap.univie.ac.at/users/Rudolf.Pfeiffer Institut für Experimentalphysik der Universität Wien SS 2002 Version vom 23. Mai 2002 Informatikübungen für Naturwissenschaftler – p.1 Einleitung Was dieser Kurs bietet: Einführung in die Programmiersprache C Numerik für Naturwissenschaftler (anhand von Programmbeispielen) Was dieser Kurs nicht bietet: Einführung in ein bestimmtes Betriebssystem Details über Computerhardware Informatikübungen für Naturwissenschaftler – p.2 Programmieren – Wozu? Programmieren macht Spaß! Nicht für alle Aufgaben eines Naturwissenschaftlers gibt es bereits fertige Lösungen (Ansteuern spezieller Meßgeräte, Simulationen, . . . ) Programmierkenntnisse machen sich gut im Lebenslauf (eines Naturwissenschaftlers) Informatikübungen für Naturwissenschaftler – p.3 Informatikübungen für Naturwissenschaftler – p.4 Programmiersprachen – Oder wie zum Teufel bringe ich den Computer dazu, daß zu tun, was ich will? Maschinensprache Computer verstehen nur Maschinensprache Maschinensprache ist eine Abfolge von 0 und 1, die Zahlenkombination für einen bestimmten Maschinenbefehl nennt man Opcode Jede CPUa verwendet ihre eigene Maschinensprache – z. B.: 10001001 11011000 ( 0x89D8) bedeutet für einen Intel 8086: Lade den Inhalt des BX Registersb in das AX Register Offensichtlich ist es sehr mühsam, einen Computer in Maschinensprache zu programmieren a Central Processing Unit, das Gehirn des Computers. b Register sind kleine aber sehr schnelle Speicherzellen direkt in der CPU. Informatikübungen für Naturwissenschaftler – p.5 Assemblersprache Für jeden Opcode werden leichter zu merkende Mnemonics a verwendet – z. B. schreibt man statt 10001001 11011000 nun mov ax,bx Da Computer nur Maschinensprache verstehen, braucht man ein Programm, das den Assembler-Quelltext in Maschinensprache übersetzt – einen sog. Assembler Wie Maschinensprache abhängig von der verwendeten CPU, sehr mühsam und fehlerträchtig a Das erste M ist stumm. Informatikübungen für Naturwissenschaftler – p.6 Hochsprachen Ausdruck-Abstraktion, z. B. x = a + b[i]; statt direkt Register und Speicherzellen ansprechen Kontroll-Abstraktion, z. B. if (x == y) p = q; else a = b; statt entsprechende jmp-Befehle direkt zu codieren Daten-Abstraktion Programme werden in einem sehr einfachen Englisch geschrieben Informatikübungen für Naturwissenschaftler – p.7 Sprachen, Compiler, Interpreter Hochsprachen: z. B. Fortran, Cobol, C, C++, Ada, . . . Programme in diesen Sprachen müssen erst in Maschinensprache übersetzt werden Compiler: das gesamte Programm wird auf einmal übersetzt und die Übersetzung in einer Datei gespeichert Interpreter: das Programm wird jedesmal neu vom Interpreter übersetzt (interpretiert), die Übersetzung aber nicht gespeichert; interpretierte Programme sind langsamer als compilierte Informatikübungen für Naturwissenschaftler – p.8 Einführung in die Programmiersprache C Informatikübungen für Naturwissenschaftler – p.9 Literatur Peter Monadjemi und Eckart Winkler: Jetzt lerne ich C. Markt & Technik, München, 1998.a Herbert Schildt: C Ent-Packt. mitp, Bonn, 2001. Brian W. Kernighan und Dennis M. Ritchie: Programmieren in C. Hanser, München, 2. Auflage, 1988. Stephen Prata: C Primer Plus. Sams Publishing, Indianapolis, 4. Auflage, 2002. a Alle void main() durch int main(void) ersetzen! Informatikübungen für Naturwissenschaftler – p.10 Warum C? Praktisch auf jedem System gibt es einen C Compiler C Programme sind weitgehend portabel C Programme sind sehr kompakt und effizient C ist ausdrucksstark, d. h. es können viele Ausdrücke sehr kompakt geschrieben werden (Nachteil für Anfänger) Informatikübungen für Naturwissenschaftler – p.11 Geschichte von C 1971/72: von B. W. Kernighan und D. M. Ritchie bei den Bell Laboratories entwickelt 1989: ANSI Standard (ANSI C89, 1990 auch als ISO Standard) 1999: ANSI/ISO Standard C99 (wird noch von wenigen Compilern unterstützt; interessante Erweiterungen für Naturwissenschaftler, z. B. komplexe Zahlen, Arrays mit variabler Länge, . . . ) Informatikübungen für Naturwissenschaftler – p.12 Hallo, Welt! 1–3: ein mehrzeiliger Kommentar; alles zwischen /* und */ wird vom Compiler ignoriert 5: damit der Compiler die Funktion printf() kennt 7–8: die Funktion main() liefert einen Wert vom Typ int zurück und übernimmt keine Parameter (void); #include <stdio.h> jedes Programm muß genau eine Funktion main() haben, da hier die Programmausführung beginnt int 9: hier beginnt der Funktionsrumpf von main() main (void) 10: die Funktion printf() wird mit dem Argument { printf ("\aHallo, Welt!\n"); "\aHallo, Welt!\n" aufgerufen; alles zwischen den Anführungszeichen "..." ist ein String (Zeichenkette), \a und \n sind Escape-Sequenzen return 0; 12: die Funktion main() liefert 0 an das Betriebssy} /* main() */ stem zurück (erfolgreiche Programmausführung) /* * hallo.c */ 13: hier endet die Funktion main() Informatikübungen für Naturwissenschaftler – p.13 Escape-Sequenzen \a: Alarm, meist ein Piepton \b: Löscht das letzte ausgegebene Zeichen \n: Cursor an den Anfang einer neuen Zeile \r: Cursor an den Anfang der aktuellen Zeile \t: eine Tabulatorposition weiter \\: Backslash (\) \": Anführungszeichen (") \’: Apostroph (’) Informatikübungen für Naturwissenschaftler – p.14 Variablen Variablen müssen vor ihrer Verwendung deklariert werden die Deklaration besteht aus dem Typ der Variablen und ihrem Namen die Anweisung int a, b; erzeugt die Variablen a und b mit dem Typ int Variablen koönnen bei der Deklaration mit einem Wert initialisiert werden, z. B.: double zahl = 10.0; die Namen von Variablen, Funktionen und Konstanten werden Bezeichner genannt Informatikübungen für Naturwissenschaftler – p.15 Bezeichner Bezeichner können aus den folgenden Zeichen bestehen a, b, c, . . . , z (Kleinbuchstaben des englischen Alphabets) A, B, C, . . . , Z (Großbuchstaben des englischen Alphabets) 0, 1, 2, . . . 9 (Ziffern) dem Sonderzeichen _ (Underscore) das erste Zeichen darf keine Ziffer sein Groß-/Kleinschreibung wird unterschieden: zahl, Zahl und ZAHL sind verschiedene Bezeichner Informatikübungen für Naturwissenschaftler – p.16 C Schlüsselwörter Dürfen nicht als Bezeichner verwendet werden! auto, extern, static, register, inlinea char, short, int, long, unsigned, signed, float, double, void, _Bool, _Complex, _Imaginary if, else, switch, case, break, default, for, do, while, continue, goto, return enum, struct, union const, volatile, restrict typedef, sizeof a Unterstrichen: nur ANSI/ISO C99. Informatikübungen für Naturwissenschaftler – p.17 Ganzzahltypen (Integer) chara , short, int, long, long longb Alle Integer (außer charc ) sind standardmäßig vorzeichenbehaftet (signed), mit dem Präfix unsigned deklariert man vorzeichenlose Typen char : mind. 8 bit short: mind. 16 bit ( ) long : mind. 32 bit ( ) int : entweder äquivalent zu short (auf 16 bit Maschinen) oder zu long (auf 32 bit Maschinen) a char kann als kleiner int mißbraucht“ werden. ” Nur in ANSI/ISO C99, mind. 64 bit. c Ob char signed oder unsigned ist, ist implementationsabhängig. b Informatikübungen für Naturwissenschaftler – p.18 float: mind. 6 Stellen, Gleitkommatypen double: mind. 10 Stellen, typ. (Intel) 15 Stellen, long double: mind. 10 Stellen, typ. (Intel) 18 Stellen, Informatikübungen für Naturwissenschaftler – p.19 Ausgabe von Zahlen Erfolgt mittels printf(). Das erste Argument ist ein Formatstring, der angibt, welchen Typ die folgenden Argumente haben: int i; printf ("%d", i); float f; printf ("%5.3f", f); %5.3f bedeutet: die ausgegebene Zahl ist mindestens 5 Zeichen breit und hat 3 Nachkommastellen double d; printf ("%f", d); Bei float und double kann man auch %e (Exponentialschreibweise) oder %g (normale oder Exponentialschreibweise je nach Größe der Zahl) schreiben Informatikübungen für Naturwissenschaftler – p.20 Eingabe von Zahlen Erfolgt mittels scanf(). Das erste Argument ist wieder ein Formatstring, der angibt, welchen Typ die einzulesenden Variablen haben: int i; scanf ("%d", &i);a float f; scanf ("%f", &f); double d; scanf ("%lf", &d);b a & ist der Adreß-Operator (siehe später); unbedingt notwendig! b Bei der Eingabe ist der Format-Spezifizierer %lf für double-Variable unbedingt notwendig! Informatikübungen für Naturwissenschaftler – p.21 Ausdrücke (expressions) Ausdrücke bestehen aus Operatoren und Operanden in C gibt es unäre Operatoren (1 Operand), binäre Operatoren (2 Operanden) und einen ternären Operator (3 Operanden) jeder Ausdruck hat einen Wert und kann daher Teil eines größeren Ausdrucks sein ein Ausdruck ist „wahr“, wenn er einen Wert ungleich 0 hat Informatikübungen für Naturwissenschaftler – p.22 Operatoren arithmetisch: *, /, % (Modulus, nur für int-Typen), +, relational: <, <=, >, >=, == (gleich), != (ungleich) logisch: ! (Negation), && (logisches UND), || (logisches ODER) bitweise: ˜ (Negation), << (left shift), >> (right shift), & (UND), ˆ (XOR), | (ODER) Zuweisung: =, +=, -=, *=, /=, %=, <<=, >>=, &=, ˆ=, |= (a += b; entspricht a = a + b;) In-/Dekrement: ++, -- Informatikübungen für Naturwissenschaftler – p.23 Operatorprioritäten 1. (), [], ., -> LR 2. !, ˜, - (unär), ++, --, &, * (unär), (Typ), sizeof RL 3. * (binär), /, % LR 4. +, - LR 5. <<, >> LR 6. <, <=, >, >= LR 7. ==, != LR 8. & LR 9. ˆ LR 10. | LR 11. && LR 12. || LR 13. ? : (ternär, bedingte Bewertung) RL 14. =, +=, -=, *=, /=, %=, <<=, >>=, &=, ˆ=, |= RL 15. , (Komma-Operator) LR Informatikübungen für Naturwissenschaftler – p.24 Anweisungen (statements) Anweisungen sind die kleinsten Bausteine eines Programms Ausdrucks-Anweisung: jeder Ausdruck, der mit einem Semikolon abgeschlossen wird Null-Anweisung: besteht nur aus einem Semikolon Deklarations-Anweisung: jede Variablendeklaration ist eine Anweisung (und muß daher mit einem ; abgeschlossen werden) Block-Anweisung: Klammert man eine beliebige Anzahl von Anweisungen mit { und } ein, kann man sie im wesentlichen als eine Anweisung verwenden Kontroll-Anweisungen: if, else, switch, for, while, do Informatikübungen für Naturwissenschaftler – p.25 if- und if/else-Anweisung if (Ausdruck) Anweisung1 if (Ausdruck) Anweisung1 else Anweisung2 Wenn Ausdruck wahr ist (einen Wert ungleich 0 hat), wird Anweisung1 ausgeführt Wenn Ausdruck falsch ist, geschieht entweder gar nichts oder es wird Anweisung2 ausgeführt Sollen mehrere Anweisungen ausgeführt werden, müssen sie mit { und } zu einer Blockanweisung zusammmengefaßt werden Der else-Zweig bezieht sich immer auf das letzte if Informatikübungen für Naturwissenschaftler – p.26 for-Anweisung for (Init; Test; ReInit) Anweisung Der Init-Ausdruck wird einmal vor der Schleife ausgewertet Der Test-Ausdruck wird vor jedem Schleifendurchlauf ausgewertet; sobald der Ausdruck falsch ist, wird das Programm hinter der Schleife fortgesetzt Der ReInit-Ausdruck wird nach jedem Schleifendurchlauf ausgewertet Anweisung kann wieder eine Block-Anweisung sein Informatikübungen für Naturwissenschaftler – p.27 while-Anweisung while (Ausdruck) Anweisung Solange Ausdruck wahr ist, wird Anweisung ausgeführt Mehrere Anweisungen in der Schleife müssen wieder zu einer Block-Anweisung zusammengefaßt werden Informatikübungen für Naturwissenschaftler – p.28 do-Anweisung do { Anweisung } while (Ausdruck); Solange Ausdruck wahr ist, wird Anweisung ausgeführt Anweisung wird immer mindestens einmal ausgeführt Das Semikolon hinter while (); ist essentiell Auch wenn nur eine Anweisung ausgeführt werden soll, werden i. allg. geschwungene Klammern gesetzt Informatikübungen für Naturwissenschaftler – p.29 break- und continue-Anweisung Mit einer break-Anweisung kann man eine Schleife an einer beliebigen Stelle beenden Mit einer continue-Anweisung kann man von einer beliebigen Stelle aus an den Kopf der Schleife springen Bei mehreren verschachtelten Schleifen wirken sich break und continue nur auf die innerste Schleife aus; möchte man aus allen verschachtelten Schleifen herausspringen, muß man die goto-Anweisung verwenden Informatikübungen für Naturwissenschaftler – p.30 goto-Anweisung { ... goto marke; ... marke: ... } goto marke; springt sofort zum Label marke: Mit goto kann man nicht zwischen Funktionen hinund herspringen Informatikübungen für Naturwissenschaftler – p.31 switch-Anweisung if (n == 1) Anweisung1 else if (n == 2 || n == 3) Anweisung2 else Anweisung3 switch (n) { case 1 : Anweisung1 break; case 2 : case 3 : Anweisung2 break; default: Anweisung3 break; } if-else-Ketten können mit einer switch-Anweisung übersichtlicher gestaltet werden. Allerdings muß das Argument von switch ein Integer sein Informatikübungen für Naturwissenschaftler – p.32 Felder (Arrays) Mit der Deklaration int werte[10]; legt man ein 10-elementiges Array namens werte an, wobei jedes Element den Typ int hat Einzelne Elemente werden mittels werte[i] angesprochen Die Elemente werden von 0 bis Anzahl-1 durchnummeriert Informatikübungen für Naturwissenschaftler – p.33 Zeiger (Pointer) Mit der Deklaration int *p; legt man einen Zeiger auf einen int an Ein Zeiger enthält keinen Wert des Typs, auf den er zeigt, sondern nur die Adresse im Speicher, an der ein Wert des entsprechenden Typs steht Vor der Verwendung muß ein Zeiger immer initialisiert werden, z. B. mit dem Adressoperator &: int i; int *pi = &i; Mit *p kann der Wert, auf den p zeigt ausgelesen bzw. verändert werden Informatikübungen für Naturwissenschaftler – p.34 Zeigerarithmetik Informatikübungen für Naturwissenschaftler – p.35 Funktionen Informatikübungen für Naturwissenschaftler – p.36