Programmieren in C Felder, Schleifen und Fließkommaarithmetik Prof. Dr. Nikolaus Wulff
Addition von Zahlen 1 2 3 4 5 #include <stdio.h> int main() { int x,y,z,sum; x = 1; y = 2; z = 4; sum = x + y + z; /* Summe ausgeben */ printf("summe = %d \n", sum); return 0; Prof. Dr. Nikolaus Wulff Programmieren in C 2
Felder Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert. Auf die einzelnen Elemente des Feldes wird dann mit einem Index zugegriffen. Beim Feld mit N Elementen erfolgt die Zählung nach C Konvention von 0 bis N-1. 1 2 3 4 int feld[3]; feld[0] = 1; feld[1] = 2; feld[2] = 3; /* OK max. Index==2 */ feld[3] = 4; /* Illegal! */ Prof. Dr. Nikolaus Wulff Programmieren in C 3
Addition der Feldelemente 1 2 3 4 5 #include <stdio.h> int main() { int sum, feld[3]; feld[0] = 1; feld[1] = 2; feld[2] = 4; sum = feld[0] + feld[1] + feld[2]; /* Summe ausgeben */ printf("summe = %d \n", sum); return 0; Prof. Dr. Nikolaus Wulff Programmieren in C 4
Auswertung der Kommandozeile Vom Betriebssystem werden an die main-methode die Argumente übergeben, mit der das Programm gestartet wurde. Hierzu wird ein int als Anzahl für die Argumente und ein Zeichenketten Feld/Array mit den einzelnen Argumenten an die main-methode übergeben. #include <stdio.h> int main(int argc, char* argv[]) { printf("# Argumente = %d \n", argc); return 0; Prof. Dr. Nikolaus Wulff Programmieren in C 5
Ausgabe der Argumente Die Argumente der Kommandozeilen sollen mit der der printf-methode ausgegeben werden: #include <stdio.h> int main(int argc, char* argv[]) { printf("# Argumente = %d \n", argc); printf("0. Arg = %s \n", argv[0]); printf("1. Arg = %s \n", argv[1]); printf("2. Arg = %s \n", argv[2]); return 0; Was passiert bei weniger als 3 Argumenten? Prof. Dr. Nikolaus Wulff Programmieren in C 6
NullPointer argv[0] ist der Programm Name. argv[1],..., argv[argc-1] sind die Argumente. Wird versucht mehr als die argc-1 Argumente auszugeben, so ist dies ein Fehler und führt zu einem NullPointer: Prof. Dr. Nikolaus Wulff Programmieren in C 7
Syntax der while-schleife Die while-schleife hat eine sehr einfache Syntax: while( <expr> ) statement; Die auf die while-bedingung folgende Anweisung sollte aus Gründen der Les- und Warbarkeit immer in geschweifte Klammern, als Block, geschrieben werden. C kennt keine boolschen Ausdrücke wie false und true. 0 entspricht in C dem logischen Wert false. Die Anweisung {statement; wird so lange ausgeführt, bis <expr> einen Wert gleich 0 liefert. Prof. Dr. Nikolaus Wulff Programmieren in C 8
Die while-schleife 1 2 3 int main(int argc, char *argv[]) { int index; index = 0; printf("# Args %d \n",argc); while(index < argc) { printf("%d. Arg %s\n",index,argv[index]); index = index + 1; return 0; Die while Schleife 3 2 wird so lange ausgeführt, bis die Bedingung index < argc verletzt ist. So wird ein unzulässiger Index vermieden. Prof. Dr. Nikolaus Wulff Programmieren in C 9
Addition per While-Schleife #include <stdio.h> int main() { int i, sum, feld[] = {0,1,2; i = sum = 0; while(i < 3) { sum = sum + feld[i]; i = i + 1; /* Schleifen Ende */ /* Summe ausgeben */ printf("summe = %d \n", sum); return 0; Prof. Dr. Nikolaus Wulff Programmieren in C 10
Themperaturumrechnung Es soll ein Programm zum Umrechnen von Celsius in Fahrenheit Grade entwickelt werden. F = C * 9/5 + 32 Das Programm soll beginnend bei einem Minimumwert alle Fahrenheitumrechnungen ausgeben bis ein maximaler Celsius Wert erreicht ist. Die Schrittweite wird entsprechend vorgegeben. Prof. Dr. Nikolaus Wulff Programmieren in C 11
Fahrenheit nach Celsius 1 2 3 4 5 6 #include <stdio.h> int main() { int fahr, celsius; int min, max, step; min = -40; step = 10; max = 110; celsius = min; while(celsius < max) { fahr = 9*celsius/5 + 32; printf("%3d C sind %3d F\n", celsius,fahr); celsius = celsius + step; return 0; Prof. Dr. Nikolaus Wulff Programmieren in C 12
Ganz- und Gleitzahlen Ganz- und Gleitzahlen werden unterschiedlich behandelt: Bei Ganzzahlenarithmetik werden Nachkommastellen abgeschnitten. D. h. 9/5=1.8 wird zu 1 und 5/9=0.555555 zu 0 verkürzt, wenn eine int Variable verwendet wird! Die beiden auf dem ersten Blick identischen Anweisungen liefern vollkommen unterschiedliche Ergebnisse. fahrenheit = 9/5*celsius + 32; fahrenheit = 9*celsius/5 + 32; Prof. Dr. Nikolaus Wulff Programmieren in C 13
Rundungsfehler bei int fahrenheit = 9*celsius/5 + 32; Große Fehler ergeben sich bei Divisionen mit Ganzzahlen (int/long). fahrenheit = 9/5*celsius + 32; Für arithmetische Berechnungen sind Gleitkommazahlen erforderlich. Prof. Dr. Nikolaus Wulff Programmieren in C 14
Gleitkommaarithmetik 1 2 3 4 #include <stdio.h> int main() { float fahr, celsius; float min, max, step; min = -40; step = 10; max = 110; celsius = min; while(celsius < max) { fahr = 9.0/5.0*celsius + 32.0; printf("%5.1f C sind %5.1f F\n",celsius,fahr); celsius = celsius + step; return 1; Prof. Dr. Nikolaus Wulff Programmieren in C 15
Die for-schleife Das Hochzählen einer Variable bis zu einem bestimmten Wert kommt in der Datenverarbeitung so häufig vor, das C hierfür noch eine andere Schleifenvariante definiert, die for-schleife: #include <stdio.h> int main() { float f, c; for(c=0; c < 100; c = c + 10) { f = 9.0/5.0*c + 32.0; printf("%5.1f C sind %5.1f F\n", c, f); return 1; Prof. Dr. Nikolaus Wulff Programmieren in C 16
Syntax der for-schleife Die for-schleife besteht aus drei Teilen: <expr 1 > der Initialisierung, z.b. i=0 <expr 2 > der Abbruchbedingung, z.b. i < 10 <expr 3 > der Inkre- oder Dekrementierung, z.b. i = i+1 for( <expr 1 >; <expr 2 >; <expr 3 >) statement; Die Teile werden unterschiedlich häufig ausgewertet: <expr 1 > wird einmal am Schleifenanfang bewertet <expr 2 > wird vor jeder Wiederholung bewertet <expr 3 > wird nach jeder Wiederholung bewertet Prof. Dr. Nikolaus Wulff Programmieren in C 17
Fallstricke bei Schleifen Wird die Kombination aus Schleifenbewertung und -inkrementierung falsch programmiert, kann es zu schweren Fehlverhalten kommen. Dies passiert häufig dann wenn die Abbruchbedingung nicht erreicht wird: for(c = 0; c < 100; c = c - 10) { /* loop for ever */ f = 9.0/5.0*c + 32.0; printf("%5.1f = %5.1f F\n", c, f); Dieses Programm läuft in einer Endlosschleife... Prof. Dr. Nikolaus Wulff Programmieren in C 18
Rückwärts Zählen Um rückwärts zu Zählen müssen die Start- und die Abbruchbedingung der Schleife entsprechend angepasst werden. Z.B. Start=100 C, Ende =0 C und dann in Schritten von 10 C rückwärts: for(c = 100; c >= 0; c = c - 10) { /* decrement by 10 */ f = 9.0/5.0*c + 32.0; printf("%5.1f = %5.1f F\n", c, f); Nun terminiert das Programm wie gewünscht. Prof. Dr. Nikolaus Wulff Programmieren in C 19