CSharp Intro
Einführung in die Entwicklung mit C#
Basics
Wir verwenden in der Schule die Entwicklungsumgebung Jetbrains Rider um Programme mit der Programmiersprache C# zu entwickeln.
Voraussetzungen:
- Dotnet SDK muss installiert sein
- Jetbrains Rider muss installiert sein
Wir programmieren in C#
Popularität
C# ist eine der 10 populärsten Programmiersprachen. Quelle
Unsere Plattform ist .NET
Eine Plattform bietet alle Werkzeuge (Tools), die man benötigt um Software zu erstellen (build) und zu betreiben (run).
- .NET Plattform
- Kostenlos, Open Source Software
- Läuft auf unterschiedlichsten Typen von Computern
- Windows
- Linux
- Mac
- Android
- iOS
- Funktioniert mit unterschiedlichen Programmiersprachen
- Wir verwenden C#
- Andere: F#, Visual Basic
Übungsumgebung
- Manchmal möchte man gerne etwas auf einem Computer ausprobieren, auf dem kein .NET installiert ist
- zB Computer der Eltern
- Computer in einer öffentlichen Bibliothek
- Es gibt Online Entwicklungsumgebungen
- Achtung
- Manche dieser Umgebungen sind nicht aktuell
- Manche sind speziell dafür gemacht um Vorab-Versionen (Previews) auszuprobieren
- Online Entwicklungsumgebungen sollten nicht euer primäres Entwicklungstool sein, nutzt Rider!
Ordner Management
- Überlegt euch zu Beginn des Schuljahres eine Ordnerstruktur, damit ihr eure Projekte und unterlagen jederzeit wiederfindet.
- Tipp:
- Einen Ordner für jedes Schuljahr
- C:\HTL\2023_24
- C:\HTL\2024_25
- Einen Unterordner für jedes Fach
- C:\HTL\2024_25\SEW
- C:\HTL\2024_25\MEDT
- Einen Unterordner für jede Übung/Unterrichtseinheit
- C:\HTL\2024_25\SEW\001-Intro
- C:\HTL\2024_25\SEW\002-Calculator
- Einen Ordner für jedes Schuljahr
- Überlegt euch ein für euch sinnvolles Nummerierungsschema. Vermeidet Leer-, Sonderzeichen und Umlaute in Ordner- und Dateinamen
Praxis
- Erstellt ein neues Projekt mit Rider
- Wählt als Projekttyp eine Konsolenanwendung
- Nennt die Solution HelloWorld
- Nennt das Projekt ebenfalls HelloWorld
- Macht euch mit der Oberfläche in Rider vertraut
- Versucht das Programm auszuführen, und eine Konsolenausgabe zu erzeugen.
- Versucht das Programm zu debuggen und einen Breakpoint zu setzen, bei dem das Programm anhält.
Statements
Unser erstes Programm besteht aus 2 Zeilen. Die erste Zeile ist ein Kommentar, die zweite ein Statement.
Statements und Kommentare
- Wir verwenden Kommentare, damit andere Personen unser Programm besser verstehen.
- Kommentare starten mit zwei Schrägstrichen
- Sind für den Programmierer, nicht für den Computer
- Werden vom Compiler ignoriert
- Ein Statement ist eine Aktion, die das Programm durchführen soll
- Muss mit einem Strichpunkt enden
- Kann in einer oder mehreren Zeilen stehen (für komplexere Szenarien)
- Werden von oben nach unten der Reihe nach ausgeführt.
Übung: mehrere Statements
- Fragen:
- wie viele Kommentare sind in diesem Programm?
- wie viele Statements?
Was ist Console.WriteLine?
- Eine Funktion die von .NET zur Verfügung gestellt wird
- Der volle Name heißt
System.Console.WriteLine
- In modernen Versionen von C# kann man das
System.
weglassen.
- In modernen Versionen von C# kann man das
- Gibt den Text in der Konsole aus und geht zur nächsten Zeile (Zeilenumbruch)
- Es gibt auch
Console.Write
(ohneLine
)- geht nicht zur nächsten Zeile (kein Zeilenunmbruch)
Übung: Kochrezept
- Schreib ein Programm, das ein Kochrezept in der Konsole ausgibt.
- Erstelle dein eigenes Rezept und kopiere nicht nur einfach das Beispiel.
- Formattiere die Ausgabe, zB:
- Verwende Überschriften in GROSSBUCHSTABEN
- Unterstreiche Überschriften mit speziellen Zeichen, wie =, *, oder -
- Verwende ASCII Art
Tips
\n
ist eine Escape Sequence. Damit wird ein Zeilenumbruch eingefügt- mit
Console.Clear()
kann der Inhalt der Konsole gelöscht werden. - Die Konsole unterstützt Farben
- muss for
Console.WriteLine
gemacht werden Console.BackgroundColor
ändert den HintergrundConsole.ForegroundColor
ändert die Schriftfarbe
- muss for
Übung
Verbessere dein Rezept, indem du Farben verwendest.
Literals, Constants
- Ein Literal ist ein Wert der in deinem Programm vorkommt. zB:
- String literal:
"Hello World"
- Character literal:
'A'
- Integer literal:
42
- Floating point literal:
3.1415
- Boolean literal:
true
,false
- String literal:
- Eine Konstante ist ein Name für ein Literal
- Der Wert kann sich nicht ändern!
- Werden üblicherweise in GROSSBUCHSTABEN geschrieben
- zB:
const int ANSWER = 42;
oderconst string GREETING = "Hello World";
Variables
- Eine Variable ist ein Name für einen Wert, der sich ändern kann.
- Wird üblicherweise in kleinbuchstaben geschrieben.
- zB:
int answer = 42;
oderstring greeting = "Hello World";
- Übung:
- Schreibe ein Programm in dem Literale, Konstanten und Variablen verwendet werden.
- Versuche einer Variable eine Konstante zuzuweisen und umgekehrt. Was ist möglich?
Datentypen
- Der Datentyp definiert welche Werte eine Konstante oder eine Variable annehmen kann. zB:
- string (Zeichenkette/Text)
- char (einzelnes Zeichen)
- int (ganze Zahl)
- float, double (Gleitkommazahl)
- boolean (Wahrheitswert)
- Wir werden uns Datentypen später noch näher ansehen.
Beispiele
Console.ReadLine
- Eine Funktion, von .NET zur Verfügung gestellt, so wie
Console.WriteLine
- Voller Name:
System.Console.ReadLine
- Liest einen Text von Standard Input
- aktuell ist das die Tastatur
- kann auch geändert werden
- Es gibt auch
Console.ReadKey
- Liest nur einen einzelnen Buchstaben
- Pausiert das Programm bis der Benutzer eine Taste gedrückt hat
Datentypen
- C# hat viele Datentypen. Wir benötigen am Anfang:
Datentyp | Beschreibung |
---|---|
string | Abfolge von 0 oder mehreren (Unicode) Zeichen |
char | Einzelnes (Unicode) Zeichen |
bool | Wahrheitswert (true oder false ) |
int , long , short , etc. | Ganzzahlige numerische Werte (keine Kommazahlen) |
float , double , decimal | Gleitkommazahlen. Faustregel: double für mathematische Berechnungen, decimal für Geldbeträge |
Literale der Datentypen
Datentyp | Beispiel | Bemerkung |
---|---|---|
string | "Hello World" | doppelte Anführungszeichen |
char | 'A' | einfache Anführungszeichen |
bool | true , false | |
int | 42 | |
long | 42L | Suffix L (=long) |
float | 42f | Suffix f (=float) |
double | 42d | Suffix d (=double) |
decimal | 42m | Suffix m (=money) |
String Parsing
- Parsing wird das Verfahren genannt, einen String in einen anderen Datentyp zu konvertieren
- zB
- Wir bitten den Benutzer eine Zahl einzugeben
Console.ReadLine
liefert immer einen string, wir bekommen daher einen String in dem eine Zahl steht, zB"42"
- Wir müssen den String-Wert parsen, um ihn in einen Integer-Wert umzuwandeln
Übung
- Erstelle ein Programm bei dem der Benutzer zwei Zahlen eingeben muss.
- Die Zahlen werden in Integer-Werte konvertiert
- Die Summe der beiden Werte wird berechnet und ausgegeben
- Bonusaufgabe: Der Benutzer soll wählen können, ob addiert, oder subtrahiert wird.
Math
- Die Klasse
Math
enthält viele nützliche Funktionen und Konstanten- PI, Absolutwert, Trigonometrische Funktionen (sin, tan, cos, etc)
- So wie bei
Console
ist der volle NameSystem.Math
Math - Merkliste
Funktion/Konstante | Beschreibung |
---|---|
Math.PI | Die Konstante |
Math.Abs | Absolutwert einer Zahl |
Math.Floor | Abrunden |
Math.Ceiling | Aufrunden |
Math.Min , Math.Max | Gibt die kleinere/größere von zwei Zahlen zurück |
Math.Pow | Potenz |
Math.Round | Rundet zur nächsten Zahl abhängig von der angegebenen Anzahl an Nachkommastellen |
Übung
- Erstelle ein Konsolenprogramm zur Berechnung einer Kreisfläche.
- Der Radius soll vom Benutzer eingegeben werden.
- Die Formel:
Expressions
- Eine Expression (Ausdruck) ist eine Berechnung, deren Ergebnis ein Wert eines bestimmten Datentyps ist.
- zB
length * width
- Ergebnis ist eine Zahlnumber % 2
- Ergebnis ist eine Zahlremainder == 0
- Ergebnis ist ein Wahrheitswertnumber > 5
- Ergebnis ist ein Wahrheitswert"The next number is " + number
- Das Ergebnis ist ein String
- Expressions enden nicht mit einem Strichpunkt
- Eine Zuweisung kann den Wert einer Expression einer Variable zuweisen. Die ganze Zeile ist dann ein Statement.
int area = length * width;
Advanced Integer Literals
- Verwende das Prefix
0x
to für Hexadezimalwerte- zB:
0x10 == 16
- zB:
- Verwende das Prefix
0b
für Binärwerte- zB:
0b1000 == 8
- zB:
- Verwende
_
um Ziffern zu gruppieren- Dient nur der Lesbarkeit und hat sonst keine Auswirkung
- zB
1_000_000
für eine Million
Code Blocks
- Mit geschwungenen Klammern
{}
können Statements zu Blöcken gruppiert werden.
Nested Code Blocks
- Blöcke können verschachtelt werden
- Die Verwendung von Einrückung hilft beim Lesen und schützt vor Fehlern
Warum Code Blocks?
- Die Sichtbarket von Variablen/Konstanten ist auf einen Block limitiert
- Man sagt: Der Block ist der Scope der Variablen
- Variablen können verwendet werden in ihrem Block und in darunter verschachtelten Blöcken
Warum Code Blocks (2)
- Man kann denselben Variablennamen in unterschiedlichen Blöcken verwenden
- Es sind dann unterschiedliche Variablen obwohl sie denselben Namen haben
- Grund: Unterschiedlicher Scope
Warum Code Blocks (3)
- Code Blocks werden verwendet um …
- einen Block nur auszuführen, wenn eine Bedingung erfüllt ist (if-Statement)
- einen Block mehrfach ausführen (Schleifen)
- einem Block einen Namen zu geben (Methoden)
if-Statement
switch-Statement
while-Loop
do-while-Loop
for-Loop
foreach-Loop
Arrays
Arrays (2)
- Die Anzahl der Dimensionen eines Arrays wird festgelegt wenn die Variable deklariert wird.
- Die Länge jeder Dimension wird festgelegt wenn die Instanz des Arrays erstellt wird.
- Diese Werte können sich nach der Erstellung nicht mehr ändern.
- Wir müssen also bei Arrays immer schon bei der Erstellung wissen, wie groß das Array werden wird.
Übung
- Erstelle ein mehrdimensionales Array, das ein Schachbrett abbildet.
- Ein Schachbrett hat 8x8=64 Felder
- Nummeriere die Felder von 1 bis 64 durch
Listen
- Eine Liste ist ein Datentyp, der mehrere Elemente aufnehmen kann, ähnlich einem Array.
- Im Unterschied zum Array, kann eine Liste beliebig wachsen und schrumpfen.
Zufallszahlen
- Verwende
Random.Shared.Next
- Voller Name:
System.Random.Shared.Next
- Generiert eine zufällige Zahl
- Man kann die minimale Zahl (inklusive) und die maximale Zahl (exklusive) angeben
Übung
- Joker
- Tip für Level 1:
- Verwende ganzzahlige Divisionen
1234 / 100 == 12
- Tip für Level 2:
- Verwende den Modulo-Operator
1234 % 100 == 34
- Tip für Level 1:
String Interpolation
- Ist das Einfügen von Werten in einen String.
- Das Ergebnis ist ein neuer String.
- Für String Interpolation muss ein String mit einem Dollarzeichen beginnen. Eingefügte Werte werden mit geschwungenen Klammern gekennzeichnet.
Methoden
- Methoden erlauben es einem Code Block einen Namen zuzuweisen
- Besonders wichtig wenn wir denselben Block öfter verwenden möchten
- Don’t repeat yourself - DRY
- Die Parameter a und b sind Werte die an die Methode übergeben werden. Innerhalb der Methode sind sie wie lokale (block-scoped) Variablen zu verwenden.
- Vor dem Methodennamen muss angegeben werden welchen Datentyp der Rückgabewert hat.
void
- Was wenn eine Methode keinen Rückgabewert hat?
- void ist ein spezielles Schlüsselwort genau für diesen Fall
Expression-bodied methods
- Einzeilige Methoden können verkürzt geschrieben werden
Übung: Fizz Buzz
- Gib alle Zahlen zwischen 1 und 30 auf der Konsole aus
-
Ersetze jede Zahl die durch 3 teilbar ist mit dem Wort Fizz
-
Ersetze jede Zahl die durch 5 teilbar ist mit dem Wort Buzz
-
Ersetze jede Zahl die durch 3 UND 5 teilbar ist mit Fizz Buzz
-
Gib ein Komma zwischen jeder Zahl aus
-
Packe die Logik um eine Zahl in einen String für die Ausgabe zu konvertieren in eine Methode:
string ToFizzBuzz(int number) { ... }
-
Geforderte Ausgabe: 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz
-
Übungsbeispiele
- Hier eine Liste zum selbstständigen Üben
Rosetta Code
- ist eine Website die bekannte Programmieraufgaben für verschiedene Sprachen listet
- Rosetta Code: C Sharp
C# Rückschau
- Bis jetzt haben wir gelernt Programme zu schreiben, die von oben nach unten, Statement für Statement durchlaufen.
- Um flexibler zu werden können wir auch den Ablauf mit Verzweigungen und Schleifen beeinflussen.
- Außerdem können wir wiederverwendbare Code-Blöcke definieren, sogenannte Methoden.
- Wir können mit unterschiedlichen Datentypen umgehen und Arrays und Listen verwenden.
C# OOP
- Wir lernen nun nach und nach Teile der objektorientierten Programmierung (OOP) kennen
- OOP folgt vier Prinzipien:
- Kapselung (engl. Encapsulation)
- Vererbung (engl. Inheritance)
- Polymorphismus (engl. Polymorphism)
- Abstraktion (engl. Abstraction)
- Wir werden diese im Laufe der Zeit kennenlernen
C# OOP (2)
- Mit der Objektorientierung wurde ein neues Paradigma in der Welt der Programmierung etabliert.
- Die Objektorientierung ist das zur Zeit vorherrschende Programmierparadigma
- Objektorientierung ist dem menschlichen Denken nachempfunden.
C# OOP (3)
- Das objektorientierte Programmierparadigma ist für Menschen leicht verständlich, da es menschlichen Denkmustern nachempfunden ist.
- Alle relevanten Größen und Abläufe werden in objektorientierten Programmen durch Objekte beschrieben. Soll in einem Spiel beispielsweise ein Drache dargestellt werden, existiert dafür im Programm ein Objekt Dragon. Genauso existiert für ein Schwert ein Objekt Sword und für ein Schloss das Objekt Castle usw.
- Ein Programm kann damit as System von Objekten verstanden werden, die untereinander Nachrichten austauschen.
C# Objekte
- Objekte können durch folgende Metriken beschrieben werden:
- ihre Eigenschaften
- ihr Zustand
- ihr Verhalten
C# Objekte - Eigenschaften
- Objekte besitzen Eigenschaften, sogenannte Properties.
- Eigenschaften werden verwendet um Objekte näher zu beschreiben.
- Für das Objekt Flugschiff sind beispielsweise folgende Eigenschaften bekannt:
- X und Y Koordinaten
- Speed
- Cost
- PullForce
- …
C# Objekte - Zustand
- Der Zustand eines Objekts wird durch die Summe, der in den Eigenschaften eines Objekts gespeicherten Werte beschrieben
- zB:
- X: 3
- Y: 4
- Speed: 35
- Cost: 1000000
- PullForce: 37
C# Objekte - Verhalten
- Das Verhalten von Objekten wird durch Operationen beschrieben, die ein Objekt durchführen kann. Die Operationen eines Objekts werden durch die Methoden eines Objekts abstrahiert, die in den Klassen definiert sind, zu denen die Objekte gehören.
C# Klassen
- Klassen sind Baupläne für Objekte. In einer Klasse wird bestimmt welche Eigenschaften und welches Verhalten ein Objekt hat. Klassen werden auch als Objekttypen.
- Klassen und Objekte sind die zentralen Konzepte der objektorientierten Programmierung.
C# Klassen (2)
- Ein Objekt gehört immer zu einer bestimmten Klasse. Die Klasse wird als der Objekttyp eines Objekts bezeichnet. Objekte sind Instanzen ihrer Klasse. Für jede Klasse kann es beliebig viele Instanzen geben. Klassen existieren genau einmal in einem Programm.
- Klassen sind Vorlagen für Objekte. Sie definieren die innere Zusammensetzung von Objekten.
C# Klassen - Bsp
C# Objektinstanzen
- Von einer Klasse können mehrere Instanzen (Objekte) erstellt werden.
- Jede dieser Objektinstanzen kann unterschiedliche Werte für die einzelnen Properties erhalten.
- Wir verwenden den Klassennamen bei Variablen wie einen Datentyp.
- Mit dem Schlüsselwort
new
wird eine neue Objektinstanz einer Klasse erzeugt.
C# Objektinstanzen - Bsp
C# Klassen - Aufbau
C# Konstruktor
- Die Objektinstanzierung ist ein zentrales Konzept der OOP, welches ermöglicht Objekte aus Klassen zu erstellen.
- Im Zuge der Instanziierung eines Objekts wird der Konstruktor einer Klasse aufgerufen.
- Im Konstruktor kann die Objektinstanz initialisiert werden, damit diese bereit für die Verwendung ist.