C# Einführung - Grundlagen der Programmierung -

Werbung
C# Einführung
- Grundlagen der Programmierung Do, Hoang Viet ([email protected])
Draphony Games (http://www.draphony.de)
Grundlagen
01.12.2013
2
Grundbegriffe in der Entwicklung
• Quellcode
 Entwickler schreiben das Programm in einer Programmiersprache. Dieser Text wird
Quellcode genannt.
 Im Gegensatz zur natürlichen Sprache erfüllen Programmiersprache diverse
Anforderungen, die eine weitere maschinelle Verarbeitung erst ermöglich, u.a.
Eindeutigkeit
•
Gegenbeispiel aus Wikipedia: Jeder Mann liebt eine Frau. (Wikipedia Artikel)
• Compiler
 Der Quellcode muss mit Hilfe eines Programms in einer maschinenlesbare Sprache
übersetzt werden.
01.12.2013
3
Demo: „HelloWorld“
01.12.2013
4
Häufig gemachte Fehler
• C# unterscheidet zwischen Groß- und Kleinschreibung (engl. case-sensible)
 Console.WriteLine ist nicht das selbe wie console.writeline
• Absätze wie Leerzeichen, Tabulatoren sind optional
 In den meisten Fällen, lässt sich der Quellcode auch in einer einzigen Zeile schreiben.
(Daran haben später alle Spaß!)
• Eine Anweisung wird mit einem Semikolon beendet
 Console.WriteLine(“Hello World“);
 int a = 10;
• Copy & Paste von Folien
 In Powerpoint werden die Anführungsstriche den Länderspezifischen Normen
angepasst. Derartiges in der Programmierung nicht!
01.12.2013
5
Grundbegriffe in .net
• C# Compiler
 übersetzt Quellcode in CIL – Code
• Common Intermediate Language (CIL, früher MSIL)
 Zwischensprache, indem der Quellcode übersetzt wird
 „Assembler“ von .net
• JIT / Jitter (Just-In-Time compilation)
 Übersetzt den CIL–Code (zur Laufzeit) in maschinennahem Code
• Common Language Runtime (CLR)
 Ausführungsumgebung von .net – Anwendungen
01.12.2013
6
Grundbegriffe in .net
• Garbage Collector (GC)
 Verwaltet den Programmspeicher
 Verhindert „Speicherlecks“
• Framework Class Library (FCL)
 Von .net zur Verfügung gestellte Funktionalitäten
 Auflistung der Klassen (MSDN-Link)
• Common Language Infrastructure (CLI)
 Common Type System (CTS)
 Common Language Specification (CLS)
01.12.2013
7
Microsoft Visual Studio
• Quelldatei (engl. Source File)
 Datei, in dem der C# Code gespeichert wird.
 Diese Datei(en) werden vom Compiler übersetzt
• Projekt (engl. Project)
 Ein Projekt fasst Quelldateien zusammen
 Aus einem Projekt erzeugt Visual Studio eine Assembly (*.exe, *.dll o.ä.)
• Projektmappe (engl. Solution)
 Eine Projektmappe fasst Projekten zusammen
 Beispiel: Microsoft Office als Solution; Powerpoint, Word, etc. sind Projekte
• Entwicklungsumgebung (engl. Integrated Development Enviroment)
 Integriert Entwicklungstools (Compiler, Editor, Debugger, usw.) zu einer Einheit um
den Entwicklungsprozess zu unterstützen
01.12.2013
8
Syntax und Semantik
• Syntax
 Grammatikalische Regeln einer Programmiersprache
 Wird vom Compiler forciert, d.h. Compilerfehler wenn Regel verletzt wird
 Analogie zu natürliche Sprachen:
•
Ein Satz muss immer Subjekt und Prädikat besitzen
• Semantik
 Absicht des Entwickler / Kunden, d.h. was soll das Programm machen.
 Kann nicht überprüft werden
•
Tools für spezielle Bereiche vorhanden.
 Analogie zu natürliche Sprachen:
•
01.12.2013
Die Aussage vom Satz
9
HelloWorld im Detail
01.12.2013
10
Henne – Ei – Problem
01.12.2013
11
Die Klassenmethode „Main“
static void Main(string[] args) {
Console.WriteLine(“Hello World!“);
}
• Einstiegspunkt des Programm.
 Jedes Programm besitzt nur einen Einstiegspunkt
 Im Normalfall definiert jedes Programm nur eine Main – Methode
• Beispiele der Veranstaltung definieren mehrere Main – Methoden!
• Details später im Kapitel „Methoden“
 Parameter an das Programm werden in args gespeichert.
 Die Methode gibt eine ganze Zahl zurück.
•
01.12.2013
Der Wert 0 indiziert eine fehlerfreie Ausführung
12
Quellcode Kommentare
• Lesbarkeit von Quellcode erhöhen
• Kommentare in einem Quellcode werden vom Compiler ignoriert
• Quellcodekommentierung ist eine fundamentale Fertigkeit
• Zeilenkommentar:
 // das ist ein Kommentar
 Inhalt von // bis Zeilenende wird als Kommentar behandelt
• Blockkommentar:
 /* das ist ein Kommentar */
 Inhalt von /* bis zum */ wird als Kommentar behandelt (auch bei Zeilenumbrüchen!)
• Dokumentationskommentare
 Später im Abschnitt „Methoden“
01.12.2013
13
Konsolenausgabe
Console.WriteLine(<ausdruck>);
Console.Write(<ausdruck>);
• Gültige Werte für <ausdruck> sind:
 Strings:
•
Unicode Support
 Gleichungen:
 Platzhalter:
•
Console.WriteLine(“Das ist ein Text“);
Console.WriteLine(1 + 1);
Console.WriteLine(“1 addiert mit 2 ergibt {0}“, 1 + 2);
Alternativmöglichkeit im Tutorium
• Achtung!
 String müssen in Anführungsstrichen geschrieben werden. Ansonsten wird er als
Anweisungen interpretiert, was zu einem Compilerfehler führt.
 Vergleiche:
•
•
01.12.2013
Console.WriteLine(“1 + 1“);
Console.WriteLine(1 + 1);
14
Escape Zeichen
• Wie können Sonderzeichen dargestellt werden?
 Leerzeichen wie Zeilenumbrüche, Tabulatoren
 Internationale Zeichen wie „Một suất thịt chó“ oder chinesische Schriftzeichen
• Escape Zeichen
 \\ Backslash
 \“ Anführungsstriche




\n
\t
\v
\u
Zeilenumbruch
Tabulator
Vertikale Tabulator
Unicode character (in Hexa FFFF). Bspl: “Pi (\u03a0) and Sigma (\u03a3)„
 \x ASCII (in Hexa FF)
01.12.2013
15
Konsoleneingabe
Console.ReadLine();
• Blockiert die Programmausführung bis zur Benutzereingabe
 Programm rechnet im Hintergrund nichts nebenbei, sondern wartet auf die Eingabe
des Benutzers. Die Blockierung wird erst aufgehoben, wenn der Benutzer die „Enter“
Taste bestätigt.
• Anweisung lässt sich kombinieren:
 Console.WriteLine(Console.ReadLine());
• Was wird bei der folgende Anweisung ausgegeben? Warum?
 Console.WriteLine(“Console.ReadLine()“);
01.12.2013
16
Klasse „Program“
• C# ist eine Objektorientierte Programmiersprache
 Ein Programm ist ein Objekt, das mit anderen Objekten operiert.
 Jedes Objekt gehört zu einer Klasse.
 Analogie zur Welt:
•
Mensch als Klasse
•
Jeder Mensch ist ein Objekt der Klasse Mensch
•
Bei der Geburt wird die Funktion „Main“ aufgerufen. Diese wird bis zum Tot ausgeführt.
• Mehr zu Klassen, Objekte und Methoden später!
01.12.2013
17
Namensräume
• Motivation
 Um Namenskonflikte (2 unterschiedliche Bedeutungen mit dem selben Namen) zu
vermeiden, gibt es hierarchische Benennungsnormen.
 Erklärung am Beispiel: System.Console.WriteLine
•
System
Funktion ist Teil der FCL (Standardfunktionalität von .net)
•
Console
Alle Funktionen bzgl. der Konsole werden in einer Klasse gruppiert
•
WriteLine
eigentliche Funktion
• Abkürzung
 using System;
 danach kann statt System.Console.WriteLine kurz Console.WriteLine
geschrieben werden
• Tutorium:
 Programm schreiben, ohne using zu benutzen
01.12.2013
18
Variablen
01.12.2013
19
Variable: Grundlagen
• Deklaration
 Reservieren von Speichern für die Variable
 datentyp nameDerVariable;
 Beispiel: string name;
• Initialisierung




Zuweisung eines Anfangswertes für die Variable.
Eine Variable muss vorher deklariert werden bevor es initialisiert werden kann.
Allgemeine Syntax: nameDerVariable = wert;
Beispiel: name = „Alf“
• Verknüpfung möglich: Deklaration & Initialisierung
 Beispiel: string name = „alf“;
• Mehrere Variablen deklarieren
 Beispiel: int a, b, c;
• Initialisierung von einem, mehrere oder alle möglich
 Beispiel: int a, b=10, c;
01.12.2013
20
Datentypen
• Zeichenketten
• Boolescher Datentyp
 Einzige mögliche Werte sind true oder false
• Ganzzahlige Datentypen
 Unterscheidungsmerkmal:
•
Wertebereich und Speicherverbrauch
 Vertreter: byte, int, long, usw.
• Fließkommazahlen
 Unterscheidungsmerkmal:
•
Wertebereich, Speicherverbrauch, Genauigkeit nach dem Komma
 Vertreter: float, double, decimal, usw.
• Weiterführend:
 http://msdn.microsoft.com/en-us/library/ms228360%28v=VS.90%29.aspx
 http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx
01.12.2013
21
Ganzzahlige Typen
Datentyp
Speicherbedarf in Byte
Wertebereich
sbyte
1
−27
27 − 1
byte
1
0
28
short
2
−215
215 − 1
ushort
2
0
216
int
4
−231
231 − 1
uint
4
0
232
long
8
−263
263 − 1
ulong
8
0
264
char
2
0
216
Weiterführend: http://msdn.microsoft.com/en-us/library/exx3b86w.aspx
01.12.2013
22
Fließkommazahlen
Datentyp
Speicher
Genauigkeit
Wertebereich
float
4
7 Stellen
±1.5e−45 bis ±3.4e38
double
8
15 – 16 Stellen
±5.0e−324 bis ±1.7e308
decimal
16
28 – 29 Stellen
(-7.9 x 1028 bis 7.9 x 1028) / (100 bis 28)
Weiterführend: http://msdn.microsoft.com/en-us/library/9ahet949.aspx
01.12.2013
23
Variablennamen
• Variablennamen
 müssen mit einem Unterstrich oder einem Buchstaben beginnen
 dürfen Buchstaben (nach Unicode), Ziffern und den Unterstrich enthalten
 dürfen keine Leerzeichen enthalten
 dürfen keine reservierten C# Schlüsselwörter sein (engl. Keywords)
•
Auflistung: http://msdn.microsoft.com/en-us/library/x53a06bb.aspx
 Beispiele: Tồi, ThịtChó,
• Erinnerung: C# unterscheidet zwischen Groß- und Kleinschreibung
 Engl. „case-sensitive“
 Beispiel: 3 völlig unterschiedliche Variable!
01.12.2013
•
int
meinevariable;
•
string meineVariable;
•
bool
MeineVariable;
24
Namenskonvention
• Camel Case (deutsch: Binnenmajuskel)
 Beispiele:
•
personAlter
•
personName,
 Mehrere Wörter zusammen schreiben
 Anfangsbuchstaben werden groß geschrieben
 Allererste Buchstabe wird klein geschrieben
 Eigentlich „lowerCamelCase“
• Pascal Case
 Beispiele:
•
PersonAlter
•
PersonName
 Wie lowerCamelCase, aber allererste Buchstabe wird klein geschrieben
 Eigentlich UpperCamelCase
01.12.2013
25
Namenskonvention
• Ungarische Notation
 „ Charles Simonyi“, Amerikaner mit ungarische Abstammung
 Variablenamen besitzen einen Präfix
•
Datentyp: b, n
•
Verwendungszweck: i (Index), f (Flag)
•
Und weiteres (http://de.wikipedia.org/wiki/Ungarische_Notation)
 Beispiel:
•
bTot, nAlter
• Microsoft Guideline
 Keine ungarische Notation
 Variablen und Parameter in lowerCamelCase
 Methoden, Klassen und Namensräume in UpperCamelCase
 http://msdn.microsoft.com/en-us/library/ms229002.aspx
01.12.2013
26
Variablen: Theorie
• Variablen
 Variablen werden im RAM gespeichert und sind somit „flüchtig“. D.h. Werte gehen
verloren, wenn PC ausgeschaltet wird.
• C# ist eine streng-typisierte Programmiersprache (engl. strongly typed)
 Der Typ einer Variable ist vorher festzulegen (Deklaration) und bleibt danach fest!
 Gegenteil: „schwach-typisiert“ (engl. weak typed)
•
alf = „Alf Mustermann“, alf = 12;
•
Vertreter: PHP, Visual Basic 6, usw.
 In Literaturen auch als „stark typisiert“
 Begriffe: statische Typisierung, dynamische Typisierung
01.12.2013
27
Typumwandlung
• Text in Zahl umwandeln
 In einem String ist die Zahl „8“ ist für den Computer 56
 „56“ für den Computer 2 Zahlen 53 54
•
Parsen nötig!
 <typ>.Parse()
 Beispiel: Int.Parse(„86“)
• Zahl in Text umwandeln
 Beispiel: 56.ToString() oder a.ToString()
 ToString() ist für jeden Datentyp definiert.
 ToString() wird häufig implizit aufgerufen.
•
Beispiel: „1 + 1 = “ + 1
• Umwandeln zwischen verschiedenen Zahlentypen
 Implizite Umwandlung:
•
Von kleineren Typ in größeren Typ (Wertebereich); verlustfreie
 Explizite Umwandlung:
•
•
01.12.2013
Verluste können auftreten
Explizite Angabe nötig: typ a = (typ) b;
28
Demo: Typumwandlung
01.12.2013
29
Wertetypen und Verweistypen
• Wertetyp
 „Primitiven Typen“
 Speichert den Wert
 Werden im Stack
gespeichert
 Beispiel: int, double, char
01.12.2013
• Verweistyp
 „Objekte“
 Speichert eine
Speicheradresse, wo der
eigentliche Wert ist
 „null“ als Wert möglich
 Werden im Heap
gespeichert
 Beispiel: string
30
Deklaration mit implizite Typangabe
• Deklaration von Variablen explizite Typangabe
 Beispiel: var zahl = 1;
• Keine dynamische Typisierung!
 Der Compiler bestimmt zur Kompilierungszeit den Typ
• Konstrukt für anonyme Typen (primär bei LinQ, später)
 Microsoft rät selbst in seiner Guideline davon ab, dieses Konstrukt außerhalb zu
nutzen!
 „Glaubenskrieg“
01.12.2013
31
Operatoren
01.12.2013
32
Assoziation und Priorität
• Definition: Ausdruck
 Ein Ausdruck ist eine Verknüpfung von Variablen, Konstanten und Funktionen durch
Operatoren, die einen Wert zurückliefert.
 Beispiel: a + b, c + 2, 1 + 4 * 3,
• Auswertung von Ausdrücken
 Priorität von Operatoren (engl. precedence)
•
Beispiel: Punktrechnung vor Strichrechnung
 Assoziativität von Operatoren (engl. Associativity)
•
•
Linksassoziativität:
Bei gleiche Priorität, (meisten) von links nach rechts auswerten
Rechtsassoziativität: Bei gleiche Priorität, (meisten) von rechts nach links auswerten
 Klammerungen haben stets Vorrang
 Meisten Operatoren sind linksassoziativ
• Auflistung alle Operatoren (nach Priorität geordnet)
 http://msdn.microsoft.com/en-us/library/ms173145%28v=VS.100%29.aspx
 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx
01.12.2013
33
Arithmetische Operatoren
Operator
Funktion
Beispiel
+
Addition
1+2
3
-
Subtraktion
1–2
1
*
Multiplikation
1*2
2
/
Division
1/2
0
%
Restdivision („Modulo“)
1%2
1
Erläuterung:
• 1 / 2 = 0.5
• 0.5 ist keine ganze Zahl! Nachkommastellen werden einfach
weggeschnitten
• Lösungen
• 1.0 / 2 ?
• 1 / 2.0 ?
• (double) 1 / 2 ?
01.12.2013
34
Operatoren sind kontextabhängig
• Anwendung auf String: „Konkatenation“
 Beispiel: „1 + 1 = “
+ 1 liefert „1 + 1 = 1“
• Anwendung auf Zahlen: „Addition“
 Beispiel: 1 + 1 liefert 2
• Der + Operator hat 2 unterschiedliche Bedeutung, abhängig vom Datentyp
01.12.2013
35
Zusammengesetzte Zuweisungsoperatoren
Operator
Anwendung
Eigentliche Ausdruck
+=
a += 1
a=a+1
-=
a -= 1
a=a–1
*=
a *= 1
a=a*1
/=
a /= 1
a=a/1
%=
a %= 1
a=a%1
Inkrement- und Dekrementoperator
Operator
Anwendung
Eigentliche Ausdruck
++
a++ oder ++a
a=a+1
--
a– oder --a
a=a–1
01.12.2013
36
Demo: x++ Vs. ++x
01.12.2013
37
Boolesche Ausdrücke
(engl. Boolean Expression)
01.12.2013
38
Boolesche Ausdrücke
• Ausgangspunkt: Der Datentyp bool
 Beispiel: bool gK; // true oder false
 Ab wann ist ein Kunde ein „gute Kunde“?
• Kriterien für Beispiel:
 Kunde hat keine Schulden im Schufaverzeichnis
 gK = schufa == 0;
Vergleichsoperator
 Kunde öffnet Konto mit 5000€
Beschreibung
 gK = kapital > 5000;
==
Gleichheit
 Kunde hat festes Einkommen
 gK = hatEinkommen;
!=
Ungleichheit
<
Kleiner
<=
Kleiner gleich
>
Größer
>=
Größer gleich
• Aussagen verknüpfen?
 + Operator ist nicht definiert!
01.12.2013
39
Logische UND
• Syntax:
 Ausdr1 && Ausdr2
 Liefert true zurück, wenn Ausdr1 und Ausdr2 wahr ist. Ansonsten immer false.
• Analogie in natürliche Sprache:
•
„Wenn Ausdr1 und Ausdr2 stimmen“
•
„Wenn sowohl Ausdr1 als auch Ausdr2 stimmen“
• Beispiel:
 gK = schufa == 0 && kapital > 5000;
• Achtung! Wenn schufa != 0 gilt, wird sofort false zurück gegeben und
der Rest ignoriert! Dieser Umstand nennt sich short-circuiting.
 Lösung: Operator & statt && nehmen
01.12.2013
40
Logische ODER
• Syntax:
 Ausdr1 || Ausdr2
 Liefert nur false zurück, wenn Ausdr1 und Ausdr2 falsch sind. Ansonsten immer
true.
• Analogie in natürliche Sprache:
 Nicht mit dem oder aus der natürlichen Sprache verwechseln!
 „Wenn mindesten eines von beiden Aussagen gelten“
• Beispiel:
 gK = schufa == 0 || kapital > 5000;
• Achtung! Wenn schufa == 0 gilt, wird sofort true zurück gegeben und der
Rest ignoriert! Dieser Umstand nennt sich short-circuiting.
 Lösung: Operator | statt || nehmen
01.12.2013
41
Logische NICHT / Negationsoperator
• Syntax:
 !Ausdr1
 Liefert true zurück, wenn Ausdr1 falsch ist. Ansonsten false.
• Analogie in natürliche Sprache:
 „Das Gegenteil“
• Beispiel:
 sK = !(schufa == 0 && kapital > 5000);
• Frage: Ein Kunde ist ein schlechte Kunde, wenn er
 … wenn er einen Schufa Eintrag hat oder einen Startkapital von <5000€
 … wenn er einen Schufa Eintrag hat und einen Startkapital von <5000€
01.12.2013
42
Verzweigungen
(engl. Condition)
01.12.2013
43
Verzweigungen
• if – Anweisung
 Syntax: if (boolesche Ausdruck) { Anweisungen }
 Anweisungen werden nur ausgeführt, wenn der boolesche Ausdruck wahr
(true) ist.
 Der boolesche Ausdruck wird Bedingung genannt.
 Geschweifelten Klammern sind bei Einzelanweisung optional.
• if – else – Anweisung
 Syntax:
if (boolesche Ausdruck) { iAnweisungen }
else { eAnweisungen }
 iAnweisungen werden ausgeführt, wenn die Bedingung erfüllt ist. Ansonsten
werden die eAnweisungen ausgeführt.
 Geschweifelten Klammern sind bei Einzelanweisung optional.
01.12.2013
44
Verzweigungen
• Der bedingte Operator
 boolesche Ausdruck ? iAusdruck : eAusdruck
 Sowohl iAusdruck als auch eAusdruck müssen einen Wert zurückgeben und
dieser muss vom selben Typ sein.
 Beispiel:
•
Console.WriteLine(regen == true ? „Es wird nass.“ :
„nice!“);
• Verschachteln
 Sowohl iAnweisungen als auch eAnweisungen können selbst eine
Verzweigungsanweisung sein und fortführend.
• else – if – Ketten
 Spezielle Form der Verschachtelung um Rechenzeit zu sparen
 Der nächste if Block wird nur ausgeführt, wenn die vorherigen Bedingungen nicht
erfüllt sind.
01.12.2013
45
Demo: „e01_else_if.cs“
01.12.2013
46
Beispiel für switch-case
string wday = Console.ReadLine();
switch (wday) {
case "Monday":
Console.WriteLine("Neue Woche");
break;
case "Freitag":
Console.WriteLine("Wochenende!");
break;
default:
Console.WriteLine("Ungültige Wochentag");
break;
}
01.12.2013
47
switch - Anweisung
• Syntax:
switch(ausdruck) {
case wert1:
break;
case wert2:
break;
// …
default:
break;
}
• Alternative für spezielle else – if – Ketten
• default ist optional
01.12.2013
48
switch - Anweisung
• Jeder case muss mit einem break oder einem goto abgeschlossen werden.
 Außer leere Fälle!
• Für wert1, wert2, usw. müssen konstante Werte eingesetzt werden. Gültig
sind nur ganzzahlige Konstanten und Strings eingesetzt werden.
 Frage: Warum nicht Gleitkommazahlen?
 Antwort: Ungenauigkeit
• Mehr Informationen: http://msdn.microsoft.com/en-us/library/06tc147t.aspx
01.12.2013
49
Demo: „e02_switch.cs“
01.12.2013
50
Schleifen
(engl. Loop)
01.12.2013
51
for – Schleifen
• Syntax:
for(Initialisierung; Iterationsbedingung; Iterationsanweisung) {
Anweisungen
}
• Vor Schleife:
 Initialisierung ausführen
• Bei jedem Schleifendurchlauf wird:
 Davor: Iterationsbedingung prüfen
•
•
Bedingung erfüllt:
Bedingung nicht erfüllt:
Anweisungen ausführen
Code nach Schleife ausführen
 Danach: Iterationsanweisung ausführen
• Ein Schleifendurchgang wird Iteration genannt
01.12.2013
52
Demo: „e03_for.cs“
01.12.2013
53
for – Schleifen
• Alle Variablen, die im Initialisierung deklariert und initialisiert werden,
werden Schleifenvariablen genannt und sind nur innerhalb der Schleife gültig,
indem Sie definiert wurden.
• Sowohl Initialisierung, Iterationsbedingung als auch
Iterationsanweisung sind optional.
• Wenn die Iterationsbedingung nicht spezifiziert ist, wird die Schleife
endlos ausgeführt.
• Die geschweiften Klammern sind optional, wenn nur höchsten eine Anweisung
ausgeführt werden soll.
01.12.2013
54
Alternative Schleifenkonstrukte
• Gleichmächtig mit for – Schleife
• while – Schleife
 Syntax:
•
while(BoolescheAusdruck) { Anweisungen }
• do – while – Schleife
 Mindesten einer Iteration!
 Syntax:
•
do {Anweisungen} while(BoolescheAusdruck);
• Achtung: do-while braucht ein abschließendes Semikolon, aber while nicht.
01.12.2013
55
Demo: „e04_while.cs“
01.12.2013
56
Schleifensteuerung
• break
 Schleifenausführung komplett beenden
 In verschachtelte Schleifen, bezieht break immer nur auf die aktuelle Schleife
• continue
 Bricht die Durchführung der aktuellen Iteration ab.
 In verschachtelte Schleifen, bezieht continue immer nur auf die aktuelle Schleife
• Einsatzgebiet:
 Schleifensteuerungskonstrukte kommen insbesondere bei Endlosschleifen zum
Einsatz
01.12.2013
57
Demo: „e05_break.cs“
01.12.2013
58
Fehlerbehandlung
(engl. Exception Handling)
01.12.2013
59
try - catch
• Syntax:
try {
// …
}
catch(Exception) {
// …
}
• catch – Block wird nur ausgeführt, wenn Fehler auftreten. Man spricht von
„Exceptions geworfen“
• Mehrere catch Blöcke möglich
 Ähnlich wie bei switch – case
01.12.2013
60
Erweiterung: finally
• Anweisungen innerhalb von finally werden immer ausgeführt (ob mit oder ohne
Exception).
• Syntax:
try {
// Tue irgendwas
}
catch {
// Tue das, wenn ein Fehler auftritt
}
finally {
// Tue das auf jedenfall!
}
01.12.2013
61
Demo: „e06_try_c.cs“
01.12.2013
62
Was ist ein Array?
• Problemfrage:
 Große Anzahl an Variablen (Daten) verarbeiten
 Beispiel:
•
Pixel eines Bildes: mehrere Millionen Pixel
•
Native Lösung: Pixel pixel1, pixel2,…,pixel1000000;
• Lösung: Arrays!
 Definition: „Mehrere Variablen desselben Typs, die sich denselben Bezeichner teilen,
werden als Array bezeichnet.“
 Synonym: Datenfelder
01.12.2013
63
Array deklarieren
• Arrays müssen wie Variablen vor Ihrer Nutzung deklariert werden.
• Beispiele:
 int[]
zahlen;
 string[] namen;
• Syntax:
 type[] identifier;
• Vergleich zur Deklaration von Variablen
 int
zahl;
 string
01.12.2013
name;
64
Array initialisieren
• Im Gegensatz zu Variablen müssen, Arrays vor Ihrer Nutzung initialisiert werden.
• Beispiel:
 zahlen
 namen
= new int[10];
= new string[100];
• Syntax:
 identifier = new type[anzahl];
 Selbige Typ von der Deklaration
• Kombinierbar:
 type identifier = new type[anzahl];
• Die einzelnen Variablen des Arrays werden automatisch mit 0, null oder false
abhängig von ihrem Datentyp initialisiert. Die Variablen werden als Elemente
bezeichnet.
01.12.2013
65
Zugriff auf Elemente des Arrays
• Beispiel:
 Console.WriteLine(namen[0]);
• Syntax: Lesezugriff
 identifier[index];
• Syntax: Schreibzugriff
 identifier[index] = wert;
• Die Zählung beginnt mit 0.
• Überschreitet index die Größe vom Array, wirft .net eine Exception zurück
 Schutzmaßnahme gegen Angriffe
01.12.2013
66
Demo: „e01_init.cs“
Arrays deklarieren und initialisieren
Zugriff auf die Elemente vom Array
01.12.2013
67
Wertzuweisung bei der Initialisierung
• Beispiel:
string[] superhelden = new string[4] {
"Bruce Wayne", "Peter Parker", "Clark Kent", "Bruce Banner"
};
•
Syntax
type[] identifier = new type[] {
e1,e2,e3,…
};
•
Unabhängig von der Deklaration möglich
type[] identifier = new type[] {
e1,e2,e3,…
};
•
Dieses Sprachkonstrukt steht nur bei der Initialisierung des Array zur Verfügung!
01.12.2013
68
Initialisierung vom Array und Elementen
• Der Begriff Initialisierung ist bei Arrays zweideutig.
 Initialisierung des Arrays
 Initialisierung der Elemente vom Array.
• Die Deklaration ist nur für das Array selbst notwendig. Die Deklaration der
Elemente ist implizit.
• Technische Details:
 Was passiert bei der Deklaration des Array?
 Was passiert bei der Initialisierung des Array?
 Was passiert bei der Initialisierung der Elemente vom Array?
• Achtung! Die Größe eines Arrays ist fest
 Frage: Größe von Array verändern?
01.12.2013
69
foreach - Schleife
• Funktion:
 Alle Elemente eines Arrays einmal durchlaufen
 Nur Lesezugriff
• Syntax
type array = new type[numb];
foreach(type x in array) { expr }
• Beispiel
foreach (int x in zahlen) {
// Wertezuweisung ist nicht möglich
// x *= 2;
Console.Write(x + "\t");
}
01.12.2013
70
Nützliche Funktionen
Funktion
Beschreibung
v.Length
Anzahl vom Array v
Häufig auch als Länge bezeichnet
Array.Sort(v)
Array v sortieren
Array.Sort(k,v)
Array v mit k verknüpfen und v anschließend mit k als
Kriterium sortieren
Array.Reserve(v)
Die Anordnung umkehren
Array.CopyTo(s,si,d,di,n)
Kopiert n Element von Array s (ab Index si) in Array d (ab
Index di)
• Klasse „System.Array“
• Weitere Funktionen verfügbar!
 http://msdn.microsoft.com/en-us/library/system.array.aspx
01.12.2013
71
Demo: „e02_utils.cs“
Anwendung von Standardfunktionalitäten
01.12.2013
72
Array duplizieren
• Achtung! Fehler: (siehe „e03_dupl.cs“)
int[] X = new int[] {
1,2,3,4,5,6,7,8,9
};
int[] Y = X;
• Semantische Fehler!
 Die beiden Verweise X und Y zeigen auf dasselbe Array im Heap.
• Lösung: (Pseudocode)
 Leeren Array erzeugen mit selbige Länge wie Quellarray
 Alle Elemente kopieren
• Oder über v.Clone() und Casten
01.12.2013
73
Demo: „e03_dupl.cs“
Anwendung von Standardfunktionalitäten
01.12.2013
74
Mehrdimensionale Arrays
• Syntax: 2D Array
 type[,] = new type[r,c];
• Beispiel: 2D Array
 byte [,] Bild = new byte[1920, 1080];
• Syntax: 3D Array
 type[,,] = new type[x,y,z];
• Dimension unbegrenzt!
• Vorsicht! Nutzung von n-dimensionale Arrays
 Speicherverbrauch: 𝑑1 ∗ 𝑑2 ∗ 𝑑3 ∗ ⋯ 𝑑𝑛
 Beispiel: 1 Sekunde HD-Film
•
01.12.2013
1920 ∗ 1080 ∗ 25 = 51.840.000 (ca. 51 MB)
75
Klasse ArrayList
• Abstraktion von einem Array mit variable Länge
• Mischen von Typen innerhalb einer Liste erlaubt: String, int, etc.
• Neues Elemente aufnehmen
 alist.Add(e)
 alist.Insert(pos, e)
e der alist hinzufügen
e der alist an der Position pos hinzufügen
• Elemente aus der Liste löschen
 alist.Remove(e)
 alist.RemoveAt(i)
01.12.2013
Element e aus der Liste entfernen
Element an der Position i entfernen
76
Demo: „e04_alist.cs“
Erstellen einer ArrayList
Hinzufügen und Entfernen von Elementen
01.12.2013
77
Vielen Dank für die
Aufmerksamkeit
http://www.draphony.de
facebook.com/DraphonyGames
01.12.2013
78
Zugehörige Unterlagen
Herunterladen