Vorlesung 3 Flashcards
Typen konvertieren
- Wir wissen: In C ist jeder Variable ein Datentyp zugeordnet.
- Variablen lassen sich aber auch in andere Datentypen konvertieren.
- Motivation:
- Es ist ein größerer Wertebereich erforderlich.
- Es ist eine höhere Präzision erforderlich.
- Variablen unterschiedlichen Typs werden miteinander verrechnet.
- Unterschieden wird:
- Implizite Typkonvertierung
- Explizite Typkonvertierung
Implizite Typkonvertierung
- Implizite Typkonvertierung findet automatisch statt, wenn arithmetische
Operatoren auf zwei Operanden von unterschiedlichem Typ angewendet
werden. - Beispiel:
int i;
float f;
i = 15;
f = 1.23f;
i + f;
Das Ergebnis der Addition ist vom Typ float.
● Treffen an einem Operator zwei Variablen/Literalen unterschiedlichen Typs
aufeinander, so hat das Ergebnis den „größeren“ Typ und es wird dessen
Arithmetik verwendet.
* Priorität: long double > double > float > unsigned long
> long (int) > unsigned int > int
* Die kleineren Typen (unsigned) char/short werden in jeden Fall in
(unsigned) int gewandelt
* Genaue Definition siehe z.B.
Dausmann, Bröckl, Goll, C als erste Programmiersprache, 6. Auflage, Kapitel 7.7
Bei Zuweisung einer Variablen an eine Variable mit „kleinerem“ Typ wird
versucht, den Typ so gut wie möglich zu erhalten.
char i;
double f;
f = 1.23;
i = f; «<i wird zu 1
f = 2.3e12;
i = f; «< nicht definiert
weiteres beispiel:
int i, j, k;
double f, g, h;
char c;
i = 2;
j = 3;
h = 3.0;
f = i / j;
g = i / h;
printf(“f = %g\n”, f);
printf(“g = %g\n”, g);
k = 65;
c = k;
printf(“%c\n”, c);
Explizite Typkonvertierung
● Gelegentlich kommt es vor, dass der Typ einer Variablen nicht den
Anforderungen genügt, z.B.
* mit einem int soll plötzlich wie mit einer Gleitkommazahl gerechnet werden
* ein int soll als Zeichen interpretiert werden
● Explizite Typkonvertierung:
(typ)var interpretiert var als wäre sie vom Typ typ
int a = 5, b = 2;
printf(“Gleitkommadivision: %g\n”, (double)a / (double)b);
Funktionen
- Häufig beinhalten Programme Teile, die wiederverwendet oder mehrfach
ausgeführt werden müssen. - Beispiel: Standardfunktionen für Ein- und Ausgabe
- Dieser Code wird in einer Funktion definiert, die an den entsprechenden
Stellen aufgerufen wird. - Vorteile:
+ kürzere Programme
+ einfache Wartung (Korrektur, Erweiterung)
Benutzen von Funktionen
● Aufruf über den Namen (Bezeichner) der Funktion
● Funktionen können Parameter besitzen. Diese müssen beim Aufruf in
Klammern angegeben werden:
● Funktionen können einen Rückgabewert besitzen:
double x, y = 3;
x = sin(2);
cos(y);
stdio.h
● In der Datei stdio.h sind Ein-und Ausgabefunktionen definiert.
● Einbinden mit #include <stdio.h>
● Operationen für Bildschirm-Ein- und Ausgabe wie auch für Dateioperationen
● Gehört zu den mitgelieferten Standardbibliotheken</stdio.h>
putchar() und getchar()
● putchar: Schreibt ein Zeichen auf Bildschirm
● getchar: Liest ein Zeichen von Tastatur
#include <stdio.h>
int main()
{
char z;
/* Zeichen einlesen */
z = getchar();
/* Zeichen wieder auf Bildschirm schreiben */
putchar(z);
return 0;
}</stdio.h>
Ausgabe mit printf()
● Formatierte Ausgabe von Variablen und Literalen (Grundtypen)
● Rückgabewert: Anzahl der tatsächlich ausgegebenen Zeichen
● Syntax: int printf (formatstring [,parameter])
● Beispiel:
#include <stdio.h>
...
int alter;
alter = 15;
printf("Hans ist %d Jahre alt.\n", alter);</stdio.h>
Der Formatstring von printf()
include <stdio.h></stdio.h>
● Der Formatstring besteht aus Ausgabetext und/oder Formatanweisungen.
● Text wird unverändert ausgegeben.
● Formatanweisungen bestehen aus Prozentzeichen % und Zeichen, die den
Datentyp angeben.
● Die Formatanweisung
wird durch den nächsten,
noch nicht bearbeiteten
Parameter von printf
ersetzt.
…
int a, b, c;
a = 5;
b = 7;
c = a + b;
printf(“%d + %d = %d\n”, a, b, c);
Die wichtigsten Formatanweisungen
%d, %i int (auch short int und char); dezimal mit Vorzeichen
%u int; dezimal ohne Vorzeichen
%o int; oktal ohne Vorzeichen
%x, %X int; hexadezimal mit kleinen bzw. Großen Buchstaben
%c char; Zeichen (ein Buchstabe / eine Ziffer, …)
%s char*; Zeichenkette bis Zeichen ‚\0’ gelesen wird
%f, %e, %g Fließkommaschreibweise (e/E = Exponatenschreibweise klein/groß)
float/double
%lf, %le, %lg Fließkommaschreibweise (e/E = Exponatenschreibweise klein/groß)
float/double
%Lf, %Le, %Lg Fließkommaschreibweise (e/E = Exponatenschreibweise klein/groß)
long double
Alle Formatanweisungen und weitere Erläuterungen finden sich in
den man-Pages zu printf
Erweiterte Formatanweisungen
● ermöglicht z.B. numerische Werte spaltenweise auszugeben oder die Anzahl
der Dezimalstellen zu begrenzen
● Syntax:
* %[flags][width][.preci][l]type
● flags:
* -: linksbündige Ausgabe
* +: Vorzeichenausgabe auch bei positiven Zahlen
* #: Alternative Darstellung (s. man-page)
* 0: Auffüllen mit Nullen für Breite
* Leerzeichen: Leerzeichen vor positiver Zahl
● Syntax:
* %[flags][width][.preci][l]type
● width: minimale Breite des Ausgabefeldes
* wenn Ausgabe größer: Breitenangabe wird ignoriert
* wenn Ausgabe kleiner: linksbündig werden Leerzeichen eingefügt
● .preci: Anzahl der auszugebenden Dezimalstellen bei Fließkommazahlen
● l: long-Version des Datentyps
● type ist eine einfache Formatanweisung
Eingabe mit scanf()
● Dient zur formatierten Eingabe von Variablen
● Rückgabewert: Anzahl der tatsächlich eingelesenen Eingaben (evtl.
Fehlerkorrektur)
● Syntax: int scanf (formatstring [,parameter])
Der Formatstring von scanf()
● Der Formatstring besteht Formatanweisungen, Whitespaces und anderen
Zeichen
* Formatanweisungen bestehen aus Prozentzeichen % und Zeichen, das den
Datentyp der Eingabe angibt
* Whitespaces passen zu einem Leerraum jeder Größe
* Andere Zeichen passen nur zu sich selbst
● Eingaben werden an die als Parameter übergebenden Adressen
geschrieben, d.h. vor den Variablennamen muss das Zeichen & geschrieben
werden
Von-Neumann-Rechnerkonzept
- Beschrieben von John von Neumann 1945/46
- Fast alle modernen, gebräuchlichen Computer basieren im Wesentlichen auf
diesem Konzept - Allgemeine Struktur, unabhängig vom Problem
- Hauptkomponenten: Rechenwerk, Steuerwerk, Arbeitsspeicher,
Ein-/Ausgabeeinheit, Verbindungsbus - Programme und Daten liegen im selben Speicher.
- Speicher ist in gleichgroße Zellen aufgeteilt, Zugriff über
fortlaufende Adressen - Befehle und Daten werden binär gespeichert.
- Programme werden taktgesteuert sequentiell abgearbeitet
(Ausnahme: Sprungbefehle, bedingte Verzweigungen). - Arithmetische, logische und Transportbefehle, bedingte Sprünge,
Ein- und Ausgabe-Befehle, Unterbrechung
Von-Neumann-Prinzip: Komponenten
● Rechenwerk (Arithmetic Logic Unit,
ALU): führt Rechenoperationen und
logische Verknüpfungen aus
● Steuerwerk (Leitwerk, Control Unit):
steuert die Befehlsabfolge, interpretiert
die Anweisungen eines Programms
● Speicherwerk: Speichert Programme
und Daten
● Ein-/Ausgabewerk: steuert Ein- und
Ausgabe (z.B. Tastatur, Monitor)