Informatik ¨ubungen f ¨ur Naturwissenschaftler

Werbung
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
Herunterladen