1. Lehrjahr · LF5

Erst planen, dann programmieren

Dieser Lernpfad folgt deinen C#-Unterrichtsprojekten: vom ersten Konsolenprogramm über Preis- und Downloadrechner bis zu Klassen, Kapselung, Vererbung und Interfaces.

Werkzeuge

Die Begriffe hinter dem Code

BegriffEinfach erklärt
AlgorithmusEine eindeutige, endliche Schrittfolge zur Lösung eines Problems – noch unabhängig von C#.
QuellcodeDer von Menschen geschriebene Programmtext.
SyntaxRegeln, nach denen gültiger Code aufgebaut ist.
CompilerÜbersetzt und prüft Quellcode für die spätere Ausführung.
IDEEntwicklungsumgebung mit Editor, Build, Ausführung und Debugger, zum Beispiel Visual Studio.
DebuggerUnterbricht ein Programm an Breakpoints und zeigt Werte sowie Ablauf schrittweise.
.NET-Projekt: Program.cs enthält Code, die .csproj-Datei beschreibt das Projekt. bin/ enthält Build-Ergebnisse, obj/ temporäre Zwischendateien.

Pseudocode

Logik vor Syntax

Pseudocode beschreibt den Ablauf in verständlichen Schritten. Für einen Downloadrechner könnte er so aussehen:

START
  LIES dateigroesseMB
  LIES geschwindigkeitMbit
  megabyteProSekunde ← geschwindigkeitMbit / 8
  sekunden ← dateigroesseMB / megabyteProSekunde

  WENN sekunden < 60
    GIB sekunden AUS
  SONST WENN sekunden < 3600
    GIB sekunden / 60 AUS
  SONST
    GIB sekunden / 3600 AUS
ENDE

Ein UML-Aktivitätsdiagramm stellt denselben Ablauf grafisch dar: Startknoten, Aktionen, Kontrollflüsse, Entscheidung mit Guard Conditions und Endknoten.

C#-Grundlagen

Variablen, Ein- und Ausgabe

Console.Write("Dateigröße in MB: ");
double dateigroesse = double.Parse(Console.ReadLine()!);

Console.Write("Geschwindigkeit in Mbit/s: ");
double datenrate = double.Parse(Console.ReadLine()!);

double sekunden = dateigroesse / (datenrate / 8);
Console.WriteLine($"Dauer: {sekunden:F2} Sekunden");

Robuster ist TryParse, weil falsche Eingaben nicht sofort eine Ausnahme auslösen:

if (!double.TryParse(Console.ReadLine(), out double datenrate)
    || datenrate <= 0)
{
    Console.WriteLine("Bitte eine positive Zahl eingeben.");
    return;
}
TypGeeignet fürBeispiel
intGanze Zahlenint anzahl = 5;
doubleGleitkommarechnungendouble temperatur = 22.5;
decimalDezimalwerte, besonders Gelddecimal preis = 12.50m;
boolWahr oder falschbool aktiv = true;
charEin einzelnes Zeichenchar note = 'A';
stringZeichenkettestring name = "Server";

Kontrollstrukturen

Entscheiden und wiederholen

if / else

Prüft Bedingungen und verzweigt. Gut für Bereiche und zusammengesetzte Regeln wie eine Passwortvalidierung.

switch

Ordnet einzelne, klar unterscheidbare Auswahlwerte einem Fall zu, etwa Vertragslaufzeiten von 6, 12 oder 24 Monaten.

for

Geeignet, wenn Anzahl oder Index wichtig ist – zum Beispiel jedes Element eines Arrays bearbeiten.

while

Wiederholt, solange eine Bedingung gilt – zum Beispiel ein Menü bis zur Auswahl „Beenden“.

double[] temperaturen = { 22.5, 24.0, 23.8, 25.5 };
double summe = 0;

for (int i = 0; i < temperaturen.Length; i++)
{
    summe += temperaturen[i];
}

double durchschnitt = summe / temperaturen.Length;
Index beachten: Das erste Array-Element hat Index 0. Der letzte gültige Index ist immer Length - 1.

Code lesen

Was gibt das Programm aus?

Aufgabe 1

Objektorientierung

Objekte schützen ihre gültigen Zustände

Eine Klasse ist ein Bauplan, ein Objekt eine konkrete Instanz. Felder speichern Zustand; Properties ermöglichen kontrollierten Zugriff; Methoden beschreiben Verhalten; der Konstruktor erzeugt einen sinnvollen Anfangszustand.

class Fahrzeug
{
    public string Marke { get; }
    public decimal Tagespreis { get; private set; }
    public bool Verfuegbar { get; private set; } = true;

    public Fahrzeug(string marke, decimal tagespreis)
    {
        Marke = marke;
        Tagespreis = tagespreis;
    }

    public decimal Mieten(int tage)
    {
        if (!Verfuegbar || tage <= 0)
            throw new InvalidOperationException();

        Verfuegbar = false;
        return tage * Tagespreis;
    }
}
K
Kapselung

Interne Daten werden geschützt und nur über kontrollierte Zugriffe verändert.

V
Vererbung

Eine abgeleitete Klasse übernimmt gemeinsame Merkmale einer Basisklasse und kann Verhalten überschreiben.

A
Abstrakte Klasse

Liefert gemeinsamen Zustand oder Code, kann aber nicht direkt instanziiert werden.

I
Interface

Definiert einen Vertrag über Fähigkeiten, etwa IZahlbar oder INotAus, ohne eine Klassenhierarchie zu erzwingen.

S
static

Gehört zur Klasse selbst statt zu einem einzelnen Objekt, etwa eine Hilfsmethode oder ein gemeinsamer Zähler.

Selbst programmieren

Aufgaben in sinnvoller Reihenfolge

  1. Preisvergleich: Zwei Anbieter, Laufzeit und Rabatt einlesen; Kosten berechnen und günstigeren Anbieter ausgeben.
  2. Downloadrechner: Datenmenge und Datenrate einlesen; Ausgabe passend in Sekunden, Minuten oder Stunden.
  3. Passwortprüfung: Länge, Großbuchstabe, Zahl und Sonderzeichen einzeln prüfen und verständliches Feedback geben.
  4. Temperatur-Array: Durchschnitt, Minimum, Maximum und Anzahl oberhalb eines Grenzwerts bestimmen.
  5. Autovermietung: Fahrzeugklasse mit gültigen Properties, Mieten, Fahren und Rückgabe modellieren.
  6. Automatisierung: Abstrakte Roboter-Basisklasse und getrennte Interfaces für Not-Aus und Fernsteuerung entwerfen.

Schreibe zu jeder Aufgabe zuerst Ein-/Ausgabe, Regeln und Pseudocode auf. Teste anschließend Normalfall, Randfall und falsche Eingabe.