Inhalt 4.2 Basisdatentypen und einfache Anweisungen

Werbung
Inhalt
Inhalt:
4. Programmiersprache C
4.1 Programmaufbau in C
4.2 Basisdatentypen und einfache Anweisungen
4.3 Steuerfluss-Konstrukte
4.4 Arbeit mit indizierten Größen (Felder)
4.5 Arbeit mit Pointern
4.6 Zeichen und Zeichenketten
4.7 Funktionen
…
Peter Sobe
Informatik I, Wintersem. 10/11
14
4.2 Basisdatentypen und einfache Anweisungen
Die Verarbeitung erfolgt durch Anweisungen, die die Werte der Variablen
verändern.
Variablen können Zahlenwerte, logische Werte (wahr, falsch), Zeichen,
Zeichenketten, Zeiger, Felder aufnehmen
Variablen müssen vor ihrer ersten Benutzung auf jeden Fall deklariert
worden sein.
Bezeichner (Namen für Variable, Funktionen, ...)
• Namen beginnen mit einem Buchstaben oder einem Unterstrich.
• Die weiteren Zeichen sind Buchstaben, Zahlen oder Unterstriche.
• Schlüsselworte der Sprache dürfen nicht als Name verwendet werden
Peter Sobe
Informatik I, Wintersem. 10/11
15
Variablennamen
Zulässige Variablennamen:
• a; i; j; k;
• _pointer;
• ganz_langer_name_24_undNochLaenger;
• name; Name; // Groß- und Kleinschreibung wird unterschieden
Nicht als Variablenname zulässig:
• 34Name; // Fehler Zahl am Anfang nicht erlaubt
• Strassen Name; // Leerzeichen nicht erlaubt: Strassen_Name
• Ölinhalt // Fehler, Umlaute verboten
• C&A; // Fehler; Sonderzeichen verboten
• while; // da es ein Schlüsselwort while bereits gibt
Variablenname sollten kurz sein, aber inhaltlich ihre Bedeutung
wiedergeben
Peter Sobe
Informatik I, Wintersem. 10/11
16
Variablennamen
Variablenname sollten kurz sein, aber inhaltlich ihre Bedeutung
wiedergeben, z.B.
int anzahl_patienten;
float gewicht;
Indexvariable und Zähler werden oft mit i, j, k oder z bezeichnet.
Beispiele für schlecht gewählte Variablennamen:
int meinkleinerschleifenzähler=0;
int grosserschleifenzaehler;
Peter Sobe
Informatik I, Wintersem. 10/11
17
Schlüsselwörter
Folgende C-Schlüsselworte dürfen nicht als Variablennamen
benutzt werden:
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if static while
In C++ weitere Schlüsselwörter:
asm export private true bool false protected try
catch friend public typeid class inline reinterpret_cast
typename const_cast mutable static_cast using delete
namespace template virtual dynamic_cast new this
wchar_t explicit operator throw
Peter Sobe
18
Konstanten
Konstanten und Zeichenfolgen (Literale)
Konstanten sind
• ganze Zahlen, z.B. 123, -465, 033, 0xab, 0XFF, 123L, 123UL,
• Gleitkommazahlen, z.B. 12.34, 12.45e-3, 0123, 1e20,
• Zeichenkonstanten, z.B. ‘a‘, ‘X‘, ‘\07‘, ‘\xb‘ und
• Aufzählungswerte, z.B. rot, Montag, ...
(wenn vorher entsprechend definiert)
Zeichenfolgen sind z.B.
• "Guten Morgen" (besteht aus Ein-Byte-Zeichen) und
• L"Guten Morgen" (besteht aus Mehr-Byte-Zeichen)
Peter Sobe
Informatik I, Wintersem. 10/11
19
Operatoren
Operatoren zur Anwendung auf eine oder zwei Variablen:
[] () . ->
++ -- & * + - ~ ! sizeof
/ % << >> < > <= >= == !=
^ | && || ? :
= *= /= %= += -= <<= >>= &= ^= |=
Beispiele:
a++; // a=a+1;
if (aussage1 && aussage2) {printf("zwei Aussagen \n");} // logisch UND
glück = liebe || geld; // logisch ODER
Interpunktionszeichen in C: { } . ;
Peter Sobe
Informatik I, Wintersem. 10/11
20
Trennzeichen (white spaces)
Trennzeichen der Sprache C sind:
Zwischenraum (space, blank), horizontaler Tabulator, neue Zeile
vertikaler Tabulator, Seitenvorschub (form feed)
→ siehe formatfreie Sprache
Leerzeichen und Zeilenumbrüche dürfen in C / C++ an beliebiger
Stelle außer in Namen stehen:
int var_i=17;
int var_i = 17;
int
var_i
= 17;
int var_
i=17; // ist aber verboten
Peter Sobe
Informatik I, Wintersem. 10/11
21
Elementare Datentypen (1)
Wertebereich
Genauigkeit
char = signed char
unsigned char
1 Byte
1 Byte
-2^7 ... +2^7-1
0 ... 2^8-1
2 Dezimalstellen,
z.B. ‚88‘ ist genau
int = signed int
unsigned int
4 Byte
4 Byte
-2^31 ... +2^31-1
0 ... 2^32-1
9 Dezimalstellen
short int = signed short int
unsigned short int
2 Byte
2 Byte
-2^15 ... +2^15-1
0 ... 2^16-1
4 Dezimalstellen
long int = signed long int
unsigned long int
8 Byte
8 Byte
-2^63 ... +2^63-1
0 ... 2^64-1
19 Dezimalstellen
(ab C99, 64 Bit)
bool (nur C++)
1 Byte
{true,false}
Die angegebenen Werte stellen Beispiele für 32-Bit Umgebungen
dar, sie sind implementierungsabhängig
Informatik I, Wintersem. 10/11
Peter Sobe
22
Elementare Datentypen (2)
Wertebereich
Genauigkeit
enum { list }
enum id { list }
enum id
4 Byte
4 Byte
4 Byte
2^32 verschiedene Werte
float
double
long double
4 Byte
8 Byte
10 Byte
ca. -10^38 ... +10^38
ca. –10^308 ... +10^308
ca. -10^4932 ... +10^4932
7 Dez.-Stellen
15 Dez.-Stellen
19 Dez.-Stellen
type*
void*
4 Byte
4 Byte
0...2^32-1
0...2^32-1
einzelne Bytes
im Speicher
adressierbar
type&
4 Byte
0...2^32-1
Peter Sobe
Informatik I, Wintersem. 10/11
23
Elementare Datentypen (3)
Datentypen für ganze Zahlen in C:
int, signed int, unsigned int,
long, signed long, unsigned long,
short, signed short, unsigned short
Beispiel:
int i = -64;
long li = 3;
Integer-Variablen werden für beispielsweise für zählbare Dinge
benutzt, oder für Index-Berechnungen.
Peter Sobe
Informatik I, Wintersem. 10/11
24
Elementare Datentypen (4)
Gleitkommazahlen:
float, double, long double
Beispiele:
double d = 64.3345;
double d1 = 1.234e-22; // ohne Leerzeichen zu schreiben
float f = 67.31f;
float f1 = 2.9744e-22f;
double x = 5.; // 5. entspricht 5.0
Gleitkommazahlen werden für Eigenschaften, Größen verwendet,
die als rationale oder reelle Zahlen angegeben werden, z.B.
Spannung (=4.5 V).
Peter Sobe
Informatik I, Wintersem. 10/11
25
Elementare Datentypen (5)
Wahrheitswerte (bool) mit den Werten true und false (nur C++)
Beispiele:
bool gefunden = true;
bool ende = false;
Einzelne Zeichen (char) - die Werte entsprechen in der Regel dem
ASCII-Zeichensatz
Beispiele:
char c = 64;
char c1 = ‘h’;
char c2 = ‘\n’;
Peter Sobe
Informatik I, Wintersem. 10/11
26
Zeichenkonstanten
Spezielle Zeichenkonstanten:
/* Zeilenvorschub: */ ‘\n’
/* Horizontaler Tabulator: */ ‘\t’
/* Vertikaler Tabulator: */ ‘\v’
/* Backspace: */ ‘\b’
/* Carriage-Return: */ ‘\r’
/* Form-Feed: */ ‘\f’
/* Alarm: */ ‘\a’
/* Backslash: */ ‘\\’
/* Fragezeichen: */ ‘\?’
/* Einfaches Anfuehrungszeichen: */ ‘\’’
/* Doppeltes Anfuehrungszeichen: */ ‘\”’
Peter Sobe
Informatik I, Wintersem. 10/11
27
Konstanten
Die Verwendung von Konstanten erhöht die Lesbarkeit des
Programms und macht es änderungsfreundlicher
Anstatt: umfang = 2 * radius * 3.14159;
Besser: const double PI = 3.14159;
umfang = 2 * radius * PI;
const heißt nur, dass die Variable nicht mehr verändert werden darf,
der Wert muss nicht schon zur Übersetzungs-Zeit bestimmt werden
können. Beispiel:
const double UmfangMeinKreis = 2.0 * radius * PI;
// radius muss keine Konstante sein
Peter Sobe
Informatik I, Wintersem. 10/11
28
Konstanten
Guter Programmierstil ist es, außer den Konstanten –1, 0 und 1
keine expliziten Zahlenkonstanten in seinem Programm zu
verwenden, sondern diese immer über const einen Namen
zuzuweisen.
Anstatt:
for (int i=0;i<10;i++)
spieler[i].anzahl_huetchen= …
Besser:
const int ANZAHL_DER_MITSPIELER = 10;
…
for (int i=0; i < ANZAHL_DER_MITSPIELER; i++)
spieler[i].anzahl_huetchen=…
Peter Sobe
Informatik I, Wintersem. 10/11
29
Typkonvertierungen
Ohne Angabe hat eine Gleitkommakonstante den Typ double.
double d = 0.6;
float f = 0.6;
...
d = f; // ergibt keine Warnung
f = d; // ergibt eine Warnung
Bei einer Zuweisung eines double an ein float wird eine Warnung
erwartet:
float ff = 0.5987654321987; // kann man mal ausprobieren
Peter Sobe
Informatik I, Wintersem. 10/11
30
Interne Darstellung von Gleitkommazahlen
0.6 ist im Binärsystem:
1001 1001 1001 1001 1001 1001 1001 1001 ...
32 Bits (Mantisse genannt)
Dieses bedeutet:
1* 1/2 + 0 * 1/4 + 0 *1/8 + 1 * 1/ 16 + 1* 1/ 32 ... * 1/268435456
und ergibt: 0.59999999776482500000
Wenn float nur 24-Bit zur Darstellung der Mantisse verwendet (ist
üblich, da normalerweise noch 8 Bit zur Darstellung des Exponenten
verwendet werden), ist die Genauigkeit noch etwas geringer.
Die Zuweisung dieser 24 Bit-Genauigkeit an eine double-Zahl
ergibt somit eine Warnung
Peter Sobe
Informatik I, Wintersem. 10/11
31
Explizite Typkonvertierungen
In einigen Fällen ist eine explizite Typkonvertierung unbedingt
erforderlich:
int a = 5;
int b = 2;
// In C/C++
double x = ((double) a ) / ((double) b); // x ist 2.5, sonst 2.0
In C++ auch erlaubt:
double x = double(a) / double(b)
// In C++ empfehlenswert:
double x = static_cast<double>(a) / static_cast<double>(b);
Peter Sobe
Informatik I, Wintersem. 10/11
32
Aufzählungstypen
Manchmal ist es sinnvoll, eine Vielzahl gleichartiger Konstanten zu
einer Menge zusammenzufassen. Jedes Element dieser Menge
bekommt eine Ordinalzahl Das erste Element erhält z.B. die
Ordinalzahl 0, das zweite 1 usw.,
Beispiel:
enum Wochentag { Mon, Die, Mit, Don, Fri, Sam, Son };
Wochentag Tag;
Tag = Mon;
Syntax von Aufzählungen:
enum AufzTyp { Bezeichnerl, Bezeichner2, ... } Variable;
enum { Bezeichnerl, Bezeichner2, ... } Variable;
enum AufzTyp { Bezeichnerl = 2, Bezeichner2, ... };
Peter Sobe
Informatik I, Wintersem. 10/11
33
Operatoren (1)
Binäre Operatoren
+
*
/
%
Addition
Subtraktion
Multiplikation
Division
Divisionsrest
<
<=
==
!=
>=
>
Vergl. auf kleiner
Vergl. auf kleiner oder gleich
Vergl. auf gleich
Vergl. auf ungleich
Vergl. auf größer oder gleich
Vergl. auf größer
Vergleich
Alle Typen
&
|
^
<<
>>
bitw. UND-Verknüpfung
bitw. ODER-Verknüpfung
bitw. Exkl.-Oder-Verknüpfung
bitw. Linksverschieben
bitw. Rechtsverschieben
Bitoperationen
Ganzzahlige
Typen
&&
||
log. UND-Verknüpfung
log. ODER-Verknüpfung
Logische
Verknüpfungen
Boolesche Werte
Peter Sobe
Arithmetik
Zahlen, mit
Einschränkung
Adressen
nur ganze Zahlen
Informatik I, Wintersem. 10/11
34
Operatoren (2)
Unäre Operatoren, Postfix- und Präfix-Operatoren
&
*
Adresse von
Inhalt von
Refernzierung
Dereferenzierung
alle Typen
Zeiger
+
-
pos. Vorzeichen
neg. Vorzeichen
Arithmetik
Zahlen
~
bitw. Invertierung
Bitoperationen
ganzz. Typen
!
logische Invertierung
Log. Verknüpfung
boolesche Werte
Typecast
C-Allzweck-Cast
viele Typen
(type)
sizeof
sizeof
++
--
Peter Sobe
sizeof expr.: Speicherbedarf
sizeof (type):Speicherbedarf
Inkrementierung
Dekrementierung
Ausdrücke
Typen
Postfix und Präfix
Informatik I, Wintersem. 10/11
ganzz. Typen
und Zeiger
35
Operatoren (3)
Zuweisungs-Operatoren und sonstige Operatoren
=
Wertzuweisung
Zuweisung
Alle Typen
+=
-=
*=
/=
%=
Addition
Subtraktion
Multiplikation
Division
Divisionsrest
Arithmetik
und
Zuweisung
Zahlen, mit
Einschränkungen,
Adressen
nur ganze Zahlen
&=
|=
^=
<<=
>>=
bitw. UND-Verknüpfung
bitw. ODER-Verknüpfung
bitw. Eckl.-Oder-Verkn.
bitw. Linksverschieben
bitw. Rechtsverschieben
Bitoperationen
und
Zuweisung
?:
,
Formulierung bed. Ausdrücke
Aufzählung in Klammerausdr.
ganzz. Typen
Ausdrücke
Ausdrücke
Fragezeichen-Operator zur verkürzten Formulierung
bedingter Ausdrücke, siehe 4.3
Peter Sobe
Informatik I, Wintersem. 10/11
36
Einfache Anweisungen
Arithmetische Operatoren
Einfache Zuweisung =
Beispiel: summe=64;
Addition + bzw. +=
Beispiele: summe = zahl + 61;
summe = summe + 4;
summe += 4;
Subtraktion - bzw. -=
Multiplikation * bzw. *=
Division / bzw. /=
Modulo-Operator % bzw. %=
und weitere Operatoren ...
Peter Sobe
Informatik I, Wintersem. 10/11
Jede Anweisung
wird durch ein
Semikolon
abgeschlossen
37
Initialisierung von Variablen, Vergleich
Deklaration und Initialisierung:
int i = 7; /* Speicherplatz wird reserviert, der mit 7 initialisiert wird */
Zuweisung:
i = 8; /* Vorhandener Speicherplatz wird mit neuem Wert belegt.*/
Vergleichsoperatoren
gleich ==
ungleich !=
kleiner <
kleiner gleich <=
größer >
größer gleich >=
Peter Sobe
Informatik I, Wintersem. 10/11
38
Vergleich
Beispiele:
if (zahl < 64) ...
if (zahl == 16) ...
if ((zahl >= 0) && (zahl <= 64)) ... // zahl aus dem Bereich [0..64]
bool bo = 5 > 7; // bo erhält den Wert false
int a = 5 > 7; // a erhält den Wert 0
int b = 5 < 7; // b erhält den Wert 1
Peter Sobe
Informatik I, Wintersem. 10/11
39
Logische Verknüpfungen
Logische Verknüpfungsoperatoren
• Logisches Und &&
• Logisches Oder ||
• Logisches Nicht !
Beispiele:
if ( (!(zahl < 0)) && (!(zahl > 64))) ... // Alle drei Abfragen sind gleich
if ( (zahl >= 0) && (zahl <= 64) ) ... // bedeutend, sie testen, ob zahl
if ( zahl >= 0 && zahl <= 64 ) ... // in dem Bereich 0..64 liegt
Peter Sobe
Informatik I, Wintersem. 10/11
40
Inkrement und Dekrement (1)
zahl = zahl + 1; // kann verkürzt werden zu
zahl += 1; // und nochmals zu
zahl++;
Entsprechend gibt es zahl--; für das Erniedrigen von zahl um 1.
Beachte:
„zahl++;“ und „++zahl;“ sind nicht unbedingt das gleiche.
Beispiel:
int zahl1 = 64;
int zahl2 = ++zahl1; // zahl2 und zahl1 sind nun beide 65
int zahl3 = zahl2++; // zahl3 ist 65 und zahl2 66.
Peter Sobe
Informatik I, Wintersem. 10/11
41
Inkrement und Dekrement (2)
Pre-Increment und Post-Increment als Funktionen
Pre-Increment:
Post-Increment:
int zahl2 = ++zahl1;
int zahl2 = zahl1++;
// entspricht
int zahl2 =PreInc(zahl1);
// entspricht
int zahl2 =PostInc(zahl1);
// mit
int PreInc(int& i)
{
i = i + 1;
return i;
}
// mit
int PostInc(int& i)
{
int temp=i;
i = i + 1;
return temp;
}
Peter Sobe
Informatik I, Wintersem. 10/11
42
Prioritäten von Operatoren
1
! ~ ++ -- + - * & sizeof (type)
unär, postfix, präfix
2
3
• /%
+-
binäre arithmetische
Operatoren
4
<< >>
Shift-Operationen
5
6
< <= > >=
== !=
Vergleichsoperatoren
7
8
9
&
^
|
Bitoperationen
10
11
&&
||
logische
Verknüpfungen
12
= += -= *= /= %= &= = |= <<= >>=
Zuweisungsoperatoren
13
,
Komma-Operator
1 ist die höchste Priorität, 13 die niedrigste
Peter Sobe
Informatik I, Wintersem. 10/11
43
Herunterladen