Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Vorlesung 4: Formatierte Eingabe, Datentypen float und double Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Inhalt • Zweierkomplement / Zahlensysteme / Umrechnung • Beispielprogramm Eingabe – Verarbeitung – Ausgabe • Formatierte Eingabe mit scanf • Datentyp float • Datentyp double • Mathematische Funktionen mit Datentyp double (Bibliothek math.h) Dr. J. Raimann 1 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Organisatorisches • • Klausurtermin: Montag, 7.7.2008 von 16-17 Uhr Ort: Gebäude 8 / Raum 107 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Ergänzung: Zweierkomplement • • Dr. J. Raimann Unterscheidung +/• Anhand des ersten (obersten) Bits • Bei negativen Zahlen: 1, z.B. 1000 0000 entspricht -128 dezimal • Bei positiven Zahlen: 0, z.B. 0000 0001 entspricht +1 dezimal Überlauf 2 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Zahlensysteme • Dezimalsystem • Binärsystem • Hexadezimalsystem • Oktalsystem sind Stellenwertsysteme (Positionssysteme) – d.h. die Wertigkeit der jeweiligen Ziffer ergibt sich durch den Wert der Stelle (Position) multipliziert mit dem Wert der Ziffer. – Der Wert der Zahl ergibt sich durch Addition der Werte der jeweiligen Stellen. • Beispiel: – 123 dezimal = 1 Hunderter + 2 Zehner + 3 Einer = 1 * 102 + 2 * 101 + 3 * 100 – 101 dual = 1 Vierer + 0 Zweier + 1 Einer = 1 * 22 + 0 * 21 + 1 * 20 = 5 dezimal – 7F hexadezimal = 7 Sechzehner + 15 Einer = 7 * (16)1 + 15 * (16)0 = 127 dezimal Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Umrechnung zwischen Zahlensystemen "Restwertmethode": Teilen durch die jeweilige Basis des Zahlensystems Beispiel 1: 142 Dezimalsystem -> Oktalsystem ? • 142 / 8 = 17 Restwert 6 (der Restwert wird aus 142 mod 8 berechnet) • 17 / 8 = 2 Restwert 1 • 2/8=0 Restwert 2 • 142 dezimal ist demnach 216 im Oktalsystem. Beispiel 2: 79 Dezimalsystem -> Binärsystem ? • 79 / 2 = 39 Restwert 1 • 39 / 2 = 19 Restwert 1 • 19 / 2 = 9 Restwert 1 • 9/2=4 Restwert 1 • 4/2=2 Restwert 0 • 2/2=1 Restwert 0 • 1/2=0 Restwert 1 • 79 dezimal ist demnach 1001111 im Binärsystem. Dr. J. Raimann 3 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Aufbau eines (einfachen) C-Programms: Standard-Template #include <stdio.h> #include <stdlib.h> int main(void) { ... Programm-Code ... system("pause"); } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispielprogramm Eingabe – Verarbeitung - Ausgabe #include <stdio.h> #include <stdlib.h> int main(void) { int x,y; printf("\n\t\tRechenprogramm \n\n"); printf("\nBitte x eingeben :"); scanf("%i", &x); printf("\nBitte y eingeben :"); scanf("%i",&y); printf("\n\n %i + %i ist %i",x,y,x+y); printf("\n\n %i - %i ist %i",x,y,x-y); printf("\n\n %i * %i ist %i",x,y,x*y); printf("\n\n %i / %i ist %i",x,y,x/y); system("pause"); } Dr. J. Raimann 4 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Eingabe – Verarbeitung - Ausgabe Eingabe Verarbeitung Variablendefinition int x,y; z.B. x+y scanf("%i", &x); scanf("%i",&y); Einlesen in Variable erfolgt mittels Adressoperator & Eingabeanweisung Fachhochschule Frankfurt am Main FB 2 Ausgabe printf("\n\n %i + %i ist %i", x,y,x+y); Ausgabeanweisung Modul 12: Höhere Programmiersprache SS 2008 Formatierte Eingabe mit scanf • Mit scanf können Werte eingelesen werden • Prototyp definiert in stdio.h • int scanf (%Steuerstring, Parameter, ..); • Ähnliche Formatanweisungen wie bei printf • %c Zeichen • %s String • %i Ganzzahl • %f Gleitkommazahl • Modifizierer (für Formatanweisungen) • l long z.B. %lf, %Lf • h short • Rückgabewert der Funktion • Anzahl der erfolgreich eingelesenen Werte • bei Fehler in Konvertierung erfolgt Abbruch, d.h. Ignorieren der weiteren eingelesen Werte Dr. J. Raimann 5 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Besonderheiten bei der Verwendung von scanf • Werden Zeichenketten mit scanf eingelesen, so werden diese nur bis zum ersten Whitespace-Zeichen (Leerzeichen, Tab, ...) gelesen. • Dieses Problem kann folgendermaßen umgangen werden: scanf("%[a-zA_Z \t]", ctext); • Liest alle in den Klammern [] angegebenen Zeichen (inkl. Leerzeichen, Tab) Oder scanf("%[^\n]", ctext); • Liest alle Zeichen bis zum Neuzeile-Zeichen \n Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Fließkommazahlen • • • Fließkommazahlen (auch als Gleitkomma- oder Gleitpunktzahlen bezeichnet) sind Zahlen mit Nachkommastellen. Der C-Standard kennt die folgenden drei Fließkommatypen: – den Typ float für Zahlen mit einfacher Genauigkeit, – den Typ double für Fließkommazahlen mit doppelter Genauigkeit, – den Typ long double für zusätzliche Genauigkeit. Darstellung – Darstellung mit Dezimalpunkt 0.0001001 – oder mit Exponent und Dezimalpunkt 1.001*10-4 100.1 1.001*102 Mantisse Exponent Basis Dr. J. Raimann 6 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispiel-Deklaration Datentyp float float fresult_div; fresult_div = 5.0 / 7.0; • Mit dem Datentyp float können Fließkommazahlen mit einfacher Genauigkeit dargestellt werden. Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Genauigkeit Fließkomma-Datentypen Dr. J. Raimann float 4 Byte in der Regel -3.4*1038 bis +3.4*1038 double 8 Byte in der Regel -1.7*10308 bis +1.7*10308 long double 10 Byte in der Regel -l.1*104932 bis +1.1*104932 7 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Beispielprogramm Datentyp float #include <stdlib.h> #include <stdio.h> int main(void) { float fresult_div; fresult_div = 5.0 / 7.0; printf("%f\n", fresult_div ); system("PAUSE"); } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Datentyp double • • • • Dr. J. Raimann Für Fließkommazahlen mit »doppelter Genauigkeit« Doppelte Genauigkeit bezieht sich dabei auf die Anzahl an wirksamen Nachkommastellen und damit auch auf den Wertebereich. Der Datentyp double kann Fließkommazahlen im Bereich 1.7E-308 bis 1.7E+308 mit fünfzehnstelliger Genauigkeit darstellen. Der Formatstring für double-Werte lautet %lg (oder %lf). 8 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Mathematische Funktionen mit Datentyp double (Bibliothek math.h) • • • • • • • sin cos tan sqrt exp log log10 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispielprogramm Datentyp double #include <stdlib.h> #include <stdio.h> #include <math.h> int main(void) { double dzahl, dsqrt; printf("Bitte eine Zahl eingeben: "); scanf("%lf",&dzahl); dsqrt = sqrt(dzahl); printf("Die Quadratwurzel von %lf ist %lf\n", dzahl, dsqrt); system("PAUSE"); } Dr. J. Raimann 9