19
Prof. Dr. Nikolaus Wulff Programmieren in C Programmieren in C Felder, Schleifen und Fließkommaarithmetik

Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

  • Upload
    letuyen

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

Prof. Dr. Nikolaus Wulff

Programmieren in CProgrammieren in C

Felder, Schleifen und Fließkommaarithmetik

Page 2: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 3: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 4: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 5: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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;

}

Page 6: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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;

}

Page 7: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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:

Page 8: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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;

Page 9: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 10: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 11: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 12: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 13: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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;

Page 14: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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).

Page 15: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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

Page 16: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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;}

Page 17: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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;

Page 18: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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); }

Page 19: Programmieren in C Einfache Beispiele · Prof. Dr. Nikolaus Wulff Programmieren in C 3 Felder • Felder (engl. Arrays) werden durch eckige Klammern hinter dem Variablennamen deklariert

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); }