Upload
letuyen
View
213
Download
0
Embed Size (px)
Citation preview
Prof. Dr. Nikolaus Wulff
Programmieren in CProgrammieren in C
Felder, Schleifen und Fließkommaarithmetik
Prof. Dr. Nikolaus Wulff Programmieren in C 2
Addition von Zahlen
#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;
}
5
4
3
2
1
Prof. Dr. Nikolaus Wulff Programmieren in C 3
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.
int feld[3];feld[0] = 1;feld[1] = 2;feld[2] = 3; /* OK max. Index==2 */feld[3] = 4; /* Illegal! */
1
4
3
2
Prof. Dr. Nikolaus Wulff Programmieren in C 4
Addition der Feldelemente
#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;
}
5
4
3
2
1
Prof. Dr. Nikolaus Wulff Programmieren in C 5
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 6
Ausgabe der Argumente
• Die Argumente der Kommandozeilen sollen mit der der printf-Methode ausgegeben werden:
• Was passiert bei weniger als 3 Argumenten?
#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;
}
Prof. Dr. Nikolaus Wulff Programmieren in C 7
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 8
Syntax der while-Schleife
• Die while-Schleife hat eine sehr einfache Syntax:
• 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.
while( <expr> ) statement;
Prof. Dr. Nikolaus Wulff Programmieren in C 9
Die while-Schleife
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.
1
2
3
Prof. Dr. Nikolaus Wulff Programmieren in C 10
#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;
}
Addition per While-Schleife
Prof. Dr. Nikolaus Wulff Programmieren in C 11
Themperaturumrechnung• Es soll ein Programm zum Umrechnen von Celsius
in Fahrenheit Grade entwickelt werden.
• Das Programm soll beginnend bei einem Mini-mumwert alle Fahrenheitumrechnungen ausgeben bis ein maximaler Celsius Wert erreicht ist.
• Die Schrittweite wird entsprechend vorgegeben.
°F = °C * 9/5 + 32
Prof. Dr. Nikolaus Wulff Programmieren in C 12
Fahrenheit nach Celsius#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;}
12
3
45
6
Prof. Dr. Nikolaus Wulff Programmieren in C 13
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 14
Rundungsfehler bei int
fahrenheit = 9/5*celsius + 32;
fahrenheit = 9*celsius/5 + 32;
• Für arithmetische Berechnungen sind Gleitkommazahlen erforderlich.
• Große Fehler ergeben sich bei Divisionen mit Ganzzahlen (int/long).
Prof. Dr. Nikolaus Wulff Programmieren in C 15
Gleitkommaarithmetik
#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;}
12
34
Prof. Dr. Nikolaus Wulff Programmieren in C 16
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 17
Syntax der for-Schleife
• Die for-Schleife besteht aus drei Teilen:– <expr
1> der Initialisierung, z.B. i=0
– <expr2> der Abbruchbedingung, z.B. i < 10
– <expr3> der Inkre- oder Dekrementierung, z.B. i = i+1
• Die Teile werden unterschiedlich häufig ausgewertet:
– <expr1> wird einmal am Schleifenanfang bewertet
– <expr2> wird vor jeder Wiederholung bewertet
– <expr3> wird nach jeder Wiederholung bewertet
for( <expr1>; <expr
2>; <expr
3>)
statement;
Prof. Dr. Nikolaus Wulff Programmieren in C 18
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 Abbruchbe-dingung nicht erreicht wird:
• Dieses Programm läuft in einer Endlosschleife...
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); }
Prof. Dr. Nikolaus Wulff Programmieren in C 19
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:
• Nun terminiert das Programm wie gewünscht.
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); }