Informatik Vorlesung 04 Wiederholung Felder (Arrays), string 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1
Ein C++ Programm: Wiederholung #include <iostream> using namespace std; int main() // Der Variablen a a wird der Wert 33 zugewiesen int a = 3; // Ausgabe (der String Geben "Geben Sie Sie " wird ausgegeben) cout << Geben "Geben Sie bitte eine ganze Zahl ein: ein:" << endl; int b; // Eingabe (Tastatureingabe) cin >> b; system ("pause"); return 0; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 2
Ein C++ Programm: Wiederholung #include <iostream> using namespace std; int main() // if...else-anweisung (Verzweigung) int a = 5, b = 7; // Der Variablen a wird der Wert 3 zugewiesen if int(a a < = b) 3; // cout Ausgabe << "Variable (der String a ist Geben kleiner Sie b"; wird ausgegeben) cout << Geben Sie bitte eine ganze Zahl ein: << endl; else int b; // Eingabe (Tastatureingabe) cin cout >> b; << "Variable a ist groesser(gleich) b"; system ("pause"); return 0; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 3
Ein C++ Programm: Wiederholung #include <iostream> using namespace std; int main() // Der Operationen Variablen a wird der Wert 3 zugewiesen int a = 3; 5, b = 7; // a = Ausgabe a + b; (der String // Geben Addition Sie wird ausgegeben) cout b = b << Geben a + 13; Sie bitte // eine Subtraktion ganze Zahl ein: << endl; int a = b; 23 - (a * b) + 9; // Multiplikation // a = Eingabe (a / b) (Tastatureingabe) * 3; // Division cin b = >> a % b; b; // Modulo system ("pause"); return 0; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 4
Ein C++ Programm: Wiederholung #include <iostream> using namespace std; int main() // Der Schleifen Variablen (while) a wird der Wert 3 zugewiesen int a i = 3; 0; // Wiederhole solange i < 7 // while Ausgabe (i < (der 7) String Geben Sie wird ausgegeben) cout << Geben Sie bitte eine ganze Zahl ein: << endl; intcout b; << i << "-te Runde." << endl; // Eingabe i = i + (Tastatureingabe) 1; // oder i++; cin >> b; system ("pause"); return 0; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 5
Ein C++ Programm: Wiederholung #include <iostream> using namespace std; int main() // Der Schleifen Variablen (do...while) a wird der Wert 3 zugewiesen int a i = 3; 0; // Die Bedingung wird erst nach der Iteration überprüft // do Ausgabe (der String Geben Sie wird ausgegeben) cout << Geben Sie bitte eine ganze Zahl ein: << endl; intcout b; << i << "-te Runde." << endl; // Eingabe i = i + (Tastatureingabe) 1; // oder i++; cin >> b; while (i < 7); // Wiederhole solange i < 7 system ("pause"); return 0; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 6
Ein C++ Programm: Wiederholung #include <iostream> using namespace std; int main() // Der Variablen a wird der Wert 3 zugewiesen // Schleifen (for) int a = 3; int i; // Wiederhole solange i < 7 // Ausgabe (der String Geben Sie wird ausgegeben) for (i = 0; i < 7; i++) cout << Geben Sie bitte eine ganze Zahl ein: << endl; int b; cout << i << "-te Runde." << endl; // Eingabe (Tastatureingabe) cin >> b; system ("pause"); return 0; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 7
Felder (Arrays) Ein Feld (Array) ist eine Sammlung von Werten des selben Datentyps. Die Elemente eines Arrays haben alle den selben Datentyp. Jedes Element hat eine feste Nummer, Index genannt. Mit Hilfe des Indexes kann man auf das Feldelement zugreifen. 0 1 2 3 4 Apfel-Array 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 8
Felder (Arrays) Die Größe oder Länge eines Arrays muss konstant sein. Dies kann über einen ganzzahligen Wert, z. B. 5, oder über den Wert einer Konstante bestimmt werden. Die Länge kann nicht über den Wert einer Variable bestimmt werden. Bespiele: double a[10]; // Größe 10 const int N = 5; // Konstante N int b[n]; // Größe 5 0 1 2 3 4 Apfel-Array 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 9
Eindimensionales Feld Definition: int a[10]; (Die Größe des Arrays muss konstant sein, in diesem Fall 10.) Zugriff: a[3] = 59; cin >> a[3]; cout << a[3]; int var = a[3]; Wert ins Feld schreiben Wert aus Feld lesen Index darf eine Variable, Konstante oder ein Ausdruck sein. Feldelemente (hier int-werte) a: Index: 13 35 27 59 0 1 2 3 4 5 6 7 8 9 Indizierung startet bei 0. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 10
Felder (Arrays) Das folgende Beispiel zeigt eine Motivation für den Einsatz von Feldern: Nur bei Verwendung eines Felds ist es möglich, eine Schleife zur Bearbeitung aller Feldelemente zu nutzen. Ohne Array: int z0, z1, z2, z3, z4, z5, z6, z7, z8, z9; cout << "10 Zahlen:\n"; cout << "> "; cin >> z0; cout << "> "; cin >> z1; cout << "> "; cin >> z2;... cout << "> "; cin >> z9; Mit Array: int i; int z [10]; cout << "10 Zahlen:\n"; for (i = 0; i < 10; i++) cout << "> "; cin >> z [i]; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 11
Eindimensionales Feld (Schema) Schema zum Bearbeiten eines kompletten Felds Man nutzt eine Schleife (for-schleife am besten geeignet), um den kompletten Indexbereich zu durchlaufen. const int Size =...; // Hier Größe angeben int feld [Size]; // Index 0... Size-1 for (int i = 0; i < Size; i++) // tue etwas mit Feldelement Nr. i... feld [i]... Die durchgeführte Aktion (tue etwas...) kann z. B. sein: Feld einlesen, ausgeben, berechnen, Feldelemente summieren, Maximum berechnen, etc. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 12
Zweidimensionales Feld zwei Indexe Definition: int matrix[5][4]; ( [Anzahl Zeilen] [Anzahl Spalten] ) Zugriff: matrix [3][1] = 59; matrix: 0 2.Index (Spalte): 0 1 2 3 1.Index (Zeile): 1 2 3 4 59 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 13
Zweidimensionales Feld (Schema) Sequentieller Zugriff auf alle Elemente eines zweidimensionalen Feldes: int matrix [nzeilen][nspalten];... for (z = 0; z < nzeilen; z++) for (s = 0; s < nspalten; s++) // tue etwas mit matrix [z][s]... matrix [z][s]... Beispiel: Ausgabe des Inhaltes const int nzeilen = 3; const int nspalten = 2; int matrix [nzeilen][nspalten]; for (int z = 0; z < nzeilen; z++) for (int s = 0; s < nspalten; s++) cout << "[" << z << "] [" << s << "]: " << matrix [z][s] << endl; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 14
Einschub: Datentyp char Eine char-variable ist 1 Byte groß und enthält einen Wert im Bereich 0... 255 (oder -128... 127). Sie kann als Zahl oder als Zeichen interpretiert werden. ASCII-Code 0...31 127 32...47 58...64 91...96 123...126 Zeichen Steuerzeichen (nicht darstellbar) (z. B. neue Zeile) Escape-Sequenzen Sonderzeichen (z. B. +, -,!, #, etc.) 48...57 0, 1,...,9 65...90 A,B,...,Z 97...122 a,b,...,z 128...255 erweiterter Zeichensatz (z. B. Umlaute, graphische Zeichen, etc.) 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 15
Einschub: Datentyp char Steuerzeichen und einige andere Zeichen können als so genannte Escape- Sequenz (Zeichen '\' + weiteres Zeichen) eingegeben werden: Escape- Sequenz ASCII-Code dezimal hexadezimal Bedeutung \a 7 0x07 Bell (Piepzeichen) \b 8 0x08 Backspace (1 Position zurück) \f 12 0x0C Formfeed (Seitenvorschub) \n 10 0x0A Linefeed (neue Zeile) \r 13 0x0D Carriage return (Zeilenanfang) \t 9 0x09 Tabulator (horizontal) \\ 92 0x5C Backslash (entwertet) \' 44 0x2C Single quote (entwertet) \" 34 0x22 Double quote (entwertet) \0 0 0x00 Null-Zeichen (String-Ende) wichtig 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 16
Einschub: Datentyp char Der Datentyp char kann auch zur Speicherung von kleinen ganzen Zahlen verwendet werden. Leider ist es vom System abhängig, ob diese Zahlen im Bereich 0... 255 oder -128... 127 liegen (bei Visual Studio letzteres). Um die Sache eindeutig zu machen, gibt es die Möglichkeit, den Datentyp char genauer zu spezifizieren: unsigned char : Bereich 0... 255 signed char : Bereich -128... 127 Das Schlüsselwort unsigned kann auch bei int (oder short oder long) für nichtnegative Zahlen verwendet werden. short oder short int sind 16-Bit-Integers (-2 15... 2 15-1) oder long oder long int sind 32-Bit-Integers (-2 31... 2 31-1) 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 17
Einschub: type cast Manchmal ist es notwendig, den Datentyp eines Wert zu ändern. Dies kann man durch eine explizite Typumwandlung (engl. type cast) tun. Type cast: ( neuer Datentyp ) wert Beispiele: (double) 5 -> 5.0 (int) 2.7 -> 2 (char) 65 -> 'A' (int) 'A' -> 65 Ein type cast kann auch auf einen Ausdruck oder eine Variable angewandt werden. Achtung: Wert und Datentyp der Variablen werden dadurch nicht verändert. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 18
Zeichenketten (char-arrays) Zeichenketten (auch Strings genannt) dienen zur Speicherung von Texten und sind als Konstanten schon von der Ausgabe her bekannt, z. B.: cout << "Zahl eingeben: "; Es ist aber auch möglich, Texte in Zeichenketten-Variablen zu speichern. Eine Möglichkeit ist, dazu sogenannte C-Strings zu verwenden, das sind char-arrays. Beispiel: char land [30]; cin >> land; cout << land; // Variablendefinition // Eingabe: Hessen // Ausgabe: Hessen An diesem Beispiel lässt sich eine Besonderheit der Strings erkennen: Im Gegensatz zu anderen Arrays kann man die Ein- und Ausgabe "am Stück" machen, d. h., ohne Schleife. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 19
Zeichenketten (char-arrays) Frage: Woran erkennt das Programm, wo der String zu Ende ist? (Die Variable land hat Platz für 30 char, "Hessen" benötigt aber nur 6.) Antwort: Ein spezielles Zeichen (mit ASCII-Code 0) wird als Ende-Markierung automatisch an den String angehängt. land: Index: H e s s e n \0 0 1 2 3 4 5 6 Dies gilt auch für String-Konstanten: So besteht der String "HALLO" aus den 6 Zeichen 'H', 'A', 'L', 'L', 'O und '\0'. Somit ist auch klar, was der Unterschied zwischen 'A' und "A" ist: 'A' ist ein Einzelzeichen (char), "A" ist ein char-array, das aus den zwei Zeichen 'A' und '\0' besteht. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 20
Zeichenketten (char-arrays) Nützliche Funktionen bei char-arrays (C-Strings) strlen (s) cin >> s; cout << s; cin.getline (s, n); strcpy_s (s1, n, s2); strcat_s (s1, n, s2); strcmp (s1, s2) Liefert die aktuelle Länge des Strings (ohne 0-Zeichen). Liest ein Wort von der Konsole in den String s ein. Gibt den String s auf dem Bildschirm aus. Liest eine komplette Textzeile in den String s ein (maximal n Zeichen werden geschrieben). Kopiert den String s2 in den String s1 (max. n Zeichen). Hängt den String s2 an den String s1 an (von engl. concatenate, verketten). Dabei wird s1 auf n Zeichen begrenzt. Vergleicht die Strings s1 und s2: Liefert 0, falls beide gleich sind, < 0, falls s1 alphabetisch vor s2 steht, > 0, falls s1 alphabetisch nach s2 steht, 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 21
Zeichenketten (Datentyp string) Mit Hilfe des Datentyps (der Klasse) string (nur in C++ verfügbar) ist es möglich, Zeichenketten beliebiger Länge zu speichern und zu manipulieren. Um mit string arbeiten zu können, muss die entsprechende Header-Datei in das Programm eingebunden werden: #include <string> Die Handhabung ist wesentlich praktischer und sicherer, als bei den 0-terminierten char-arrays (sog. C-Strings). string s = "LEARN"; 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 22
Zeichenketten (Datentyp string) Ein- und Ausgabe von string-variablen cin >> s; cout << s; Liest ein Wort (bis zum nächsten Trennzeichen) in den String s ein. Beliebige Wortlänge. Gibt den String s aus. getline (cin, s); Liest eine komplette Textzeile (bis zum Newline) in den String s ein. Beliebige Textlänge. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 23
Zeichenketten (Datentyp string) Weitere string-funktionen (s1 ist string, s2 kann string oder C-String sein) s1 [i] s1.substr (i, n) s1.c_str () s1.size () s1.empty () s1 + s2 s1 += s2; s1 = s2; s1 == s2 <, <=, >, >=,!= Gibt das i-te Zeichen (beginnend mit 0) des Strings zurück. Gibt einen Substring zurück, der aus n Zeichen ab Position i besteht. Gibt s1 als C-String zurück. Liefert die aktuelle Länge des Strings als unsigned-datentyp. Liefert true, wenn s1 leer ist, sonst false. Liefert die Verkettung von s1 und s2 (geht auch für char s2). Hängt den Inhalt von s2 an s1 an (geht auch für char s2). Kopiert den Inhalt von s2 nach s1 (geht auch für char s2). Liefert true, wenn s1 und s2 gleich sind, sonst false. Vergleichen Strings. Dabei werden die Zeichen nach ASCII-Code geordnet.!= ist das Gegenteil von ==. 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 24
Ende Vielen Dank! 19. November 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 25