C# Übungen
Hier finden Sie die Übungen zum Buch C# Programmieren Lernen ohne Vorkenntnisse: .NET-Programmierung für Anfänger.
Am Ende der Seite finden Sie den Link zu den Lösungen.
Kapitel 2
1) Erstellen Sie ein Programm, das die Summe der Zahlen 6, 8, 12 und 16 berechnet. Das Endergebnis soll über die Konsole ausgegeben werden.
Kapitel 3
1) Erstellen Sie ein Programm, das die Fakultät der Zahl 9 berechnet und auf der Konsole ausgibt.
Hinweis: Die Fakultät einer positiven Ganzzahl n ist definiert als 1 * 2 * 3 * … * (n-1) * n. Die Fakultät von 0 beträgt 1, die Fakultät von negativen Zahlen und nicht ganzen Zahlen ist nicht definiert.
Kapitel 4
1) In Aufgabe 3.1 haben Sie ein Programm erstellt, mit dem Sie die Fakultät einer Zahl herausfinden können.
Prüfen Sie nun, bis zu welchem Grenzwert Sie mit diesen Programm korrekt die Fakultät von Zahlen berechnen können. (Denken Sie daran: die Datentypen haben nur einen begrenzten Wertebereich. Wird dieser überschritten, tritt ein Überlauf auf).
Berechnen Sie dazu die Fakultäten der Zahlen 10 bis 20 mit dem Programm und vergleichen Sie sie mit dem korrekten Ergebnis. Das korrete Ergebnis einer Fakultät können Sie z.B. mit Hilfe von Google bestimmen: geben Sie z.B. 10! in die Suchmaske ein, um die Fakultät von 10 herauszufinden.
2) Schreiben Sie ein Programm, dass den maximalen Wert, den eine Variable vom Typ uint
speichern kann, herausfindet.
Hinweis: Sie können dazu eine Variable vom Typ uint
mit 0 initialisieren und in einer while-Schleife wiederholt jeweils um 1 vergrößern. Formulieren Sie die Schleifen-Bedingung so, dass die Schleife abbricht, wenn ein Überlauf geschieht (weil dann der maximale Wert erreicht ist).
Kapitel 5
1) Gegeben sei der folgende Code:
int dividend = 13;
int divisor = 3;
Erweitern Sie den Code, sodass die Division dividend / divisor durchgeführt wird. Allerdings soll das Ergebnis jetzt in einer double
-Variable gepeichert werden. Es soll das korrekte Ergebnis der Division als Gleitkommawert in der Variable gespeichert werden, nicht das Ergebnis der ganzzahligen Division.
2) Erstellen Sie ein Programm, das die folgende Berechnung durchführt:
Ergebnis = 1 * 2 / 3 * 4 / 5 * 6 / … / 99 * 100
Verwenden Sie den Datentypen double
zum Speichern des Ergebnisses als Fließkommawert.
Das Ergebnis soll auf der Konsole ausgegeben werden.
Kapitel 6
1) Schreiben Sie eine Methode „floatingEquality“, die zwei Gleitkommazahlen auf Gleichheit prüft, dabei jedoch eine Toleranz von 0,001 erlaubt (d.h. wenn sich die beiden Zahlen maximal um 0,001 unterscheiden sollen sie als gleich angesehen werden).
Hinweis: Um den Betrag einer Zahl berechnen zu können, gibt es die Funtion System.Math.Abs():
Console.WriteLine(System.Math.Abs(-22));
Diese Code-Zeile erzeugt die Ausgabe „22“.
2) Schreiben Sie eine Methode „charToAscii“, die für einen übergebenen chart-Wert den ASCII-Code des Zeichens bestimmt.
3) Schreiben Sie eine Methode „asciiToChar“, die einen int-Wert als ASCII-Code interpretiert und das entsprechende Zeichen zurück gibt.
4) Schreiben Sie eine Methode „simpleBoolDecider“, die zwei double-Werte als Argumente annimmt und einen boolschen Wert zurück liefert. Wenn arg1 < 5 ist soll die Methode false als Ergebnis liefern. Zudem soll auch false als Ergebnis geliefert werden, wenn die Summe von arg1 und arg2 größer als 100 ist. In allen anderen Fällen soll die Methode true als Ergebnis liefern. 5) Schreiben Sie eine Methode „simpleBoolDecider2“, die zwei double-Werte als Argumente annimmt und einen boolschen Wert zurück liefert. Die Methode soll genau dann true als Ergebnis liefern, wenn arg1 > arg2 ist und wenn gleichzeitig die Methode simpleBoolDecider aus Übung 6.4 für die übergebenden Argumente true liefert. In allen anderen Fällen soll die Methode false als Ergebnis liefern.
6) Schreiben Sie eine Methode „maximumSum“ die einen int-Wert als Argument nimmt und einen int-Wert zurück gibt. Für nicht-positive Eingaben soll die Methode direkt 0 als Ergebnis liefern. Bei positiven Eingaben soll so lange eine Aufsummierung der natürlichen Zahlen vorgenommen werden (d.h. 1 + 2 + 3 + …) bis die Summe den als Parameter übergebenen Wert erreicht oder überschreitet.
Zurückgegeben werden soll der letzte Summenwert, der kleiner als der übergebene int-Wert ist. (Beispiel: maximumSum wird mit dem Argument 9 aufgerufen. Dann soll als Ergebnis 6 zurück gegeben werden, weil 1 + 2 + 3 = 6 und damit noch kleiner als 9 ist, 1 + 2 + 3 + 4 = 10 jedoch bereits größer als 9 ist. 6 ist damit der letzte Summenwert, der noch kleiner als 9 ist.)
7) Schreiben Sie eine Methode „stringSum“, die als Eingabeparameter zwei Strings enthält und einen int-Wert zurück gibt. In den Strings sollen jeweils ganze Zahlen enthalten sein (also z.B. String arg1 = „5“;). Berechnen Sie die Summe der in den Strings enthaltenen Zahlen und geben sie als int-Wert zurück.
8)
a) Erstellen Sie eine Klasse Kaffeemaschine. Die Klasse soll zwei öffentlich lesbare und privat schreibbare Eigenschaften wasser und bohnen besitzen, die den aktuellen Füllstand von Wasser (in kg) und die aktuelle Füllmenge an Kaffeebohnen (ebenfalls in kg) angeben.
Zudem soll eine weitere öffentlich lesbare und privat schreibbare Eigenschaft gesamtMengeKaffeProduziert vorhanden sein, die angibt, wieviel Kaffee die Maschine insgesamt schon produziert hat (in kg).
Die Klasse soll zudem zwei statische private Attribute maxWasser und maxBohnen haben, die die maximale Kapazität von Wasser und Kaffeebohnen angeben. Setzen Sie die Werte jeweils auf 2,5.
b) Schreiben Sie zunächst einen Konstruktor der Klasse, der die drei nicht-statischen Eigenschaften jeweils mit 0 initialisiert.
c) Ergänzen Sie im nächsten Schritt die beiden folgenden Methoden:
public double wasserAuffuellen(double menge);
public double bohnenAuffuellen(double menge);
Die Methoden sollen jeweils den Wasserfüllstand und die Menge der enthaltenen Kaffeebohnen gemäß des übergebenen Parameters anpassen. Es muss darauf geachtet werden, dass die maximale Füllmenge (die in den statischen Attributen maxWasser und maxBohnen gespeichert ist) jeweils nicht überschritten wird. Zurückgegeben werden soll jeweils die tatsächliche Menge, um die das Wasser bzw. die Kaffeebohnen aufgefüllt wurden.
d) Implementieren Sie die folgende Methode:
public bool macheKaffee(double menge, double verhaeltnisWasserBohnen);
Es soll nun ein Kaffee zubereitet werden. Die Gesamtmenge an produziertem Kaffee wird über den Parameter menge (in kg) angegeben. Der Parameter verhaeltnisWasserBohnen gibt an, in welchem Verhältnis Wasser und Bohnen für die Zubereitung des Kaffees verwendet werden:
1 bedeutet, dass gleich viel Wasser und Bohnen verwendet werden
2 bedeutet, dass doppelt soviel Wasser wie Bohnen verwenden werden
0,5 bedeutet, dass halb soviel Wasser wie Bohnen verwendet werden
Beispiel: Als Menge wird 0,15 angegeben, als Verhältnis 2. Dann soll der Kaffee aus 0,1 kg Wasser und 0,05 kg Bohnen produziert werden.
Prüfen Sie zunächst, ob noch genügend Wasser und Bohnen für die vollständige Zubereitung der gewünschten Menge vorhanden sind. Nur wenn das der Fall ist, passen Sie den Füllstand von Wasser und Bohnen entsprechend an. Zudem soll der Parameter gesamtMengeKaffeProduziert um die produzierte Menge vergrößert werden.
Wenn nicht genügend Wasser oder Bohnen für die vollständige Zubereitung vorhanden sind, soll kein Kaffee zubereitet werden, d.h. die Füllstände sollen auch nicht geändert werden.
Der Rückgabewert soll angeben, ob der Kaffee zubereitet wurde (true) oder nicht (false).
9) Erweitern Sie das Programm aus Teil 8.
a) Führen Sie eine neue Klasse KaffeeGeschaeft ein. Die Klasse soll ein privates Attribut _preisProKg besitzen, das den Preis pro kg Kaffee angibt. Führen Sie jetzt eine Eigenschaft preisProKg ein, mit der der Wert des Attributes öffentlich gelesen und auch geschrieben werden kann. Stellen Sie jedoch sicher, dass niemals ein Wert unter 5 und niemals ein Wert über 30 zugewiesen wird.
b) Schreiben Sie einen Konstruktor, der die Eigenschaft mit einem als Konstruktorparameter übergebenen Wert initialisiert.
c) Implementieren Sie die folgende Methode:
public double kaufeKaffee(Kaffeemaschine maschine, double menge);
Die Methode soll die Kaffee-Füllmenge der übergebenen Maschine gemäß des übergebenen Parameters menge erhöhen. Der Gesamtpreis für den hinzugefügten Kaffee soll von der Methode zurück gegeben werden.
Kapitel 7
1) Verwenden Sie die Klasse Kaffeemaschine aus der vorherigen Übung.
Erstellen Sie eine (beliebige) neue Klasse, die die folgende Methode besitzt:
public void kaffeemaschinenAngleichen(Kaffeemaschine maschine1, Kaffeemaschine maschine2);
Die Methode soll die folgende Funktionalität aufweisen: wenn die beiden übergebenen Maschinen einen unterschiedlichen Wasser- oder Kaffeebohnen-Füllstand haben, soll der Füllstand der Maschine mit dem niedrigeren Füllstand so weit aufgefüllt werden, bis beide Maschinen den gleichen Füllstand an Wasser und Kaffeebohnen haben.
2) Fügen Sie eine weitere Methode fuellMich hinzu. Diese soll eine Referenz auf ein Kaffeemaschinen-Objekt und einen double-Wert als Parameter erhalten und keinen Wert zurückgeben.
Wenn der Wasser-Füllstand der übergebenen Kaffeemaschine niedriger als der übergebene double-Wert ist, soll das Wasser der Maschine so lange aufgefüllt werden, bis der angegebene Füllstand erreicht ist.
Wird eine null-Referenz als Kaffeemaschine übergeben, soll eine neue Kaffeemaschine erzeugt werden und diese mit der angegebenen Menge an Wasser befüllt werden. Das neue Kaffeemaschine-Objekt soll auch außerhalb der Methode fuellMich nutzbar sein.
Kapitel 8
1) Erstellen Sie die Equals-Methode für die Klasse Kaffeemaschine aus den vorherigen Übungen.
bool Equals(object other);
Zwei Kaffeemaschinen sollen dann gleich sein, wenn sie identische Wasser- und Kaffeebohnen-Füllstände haben.
2) Überschreiben Sie nun noch die Methode GetHashCode der Klasse Kaffeemaschine.
Bei Kaffeemaschinen-Objekten, für die die Methode Equals eine Gleichheit angibt, soll auch der HashCode identisch sein. Unterschiedliche Kaffeemaschinen sollen unterschiedliche Hashcodes haben.
Tipp: Erstellen Sie zunächst eine geeignete string-Repräsentation für Kaffeemaschine-Instanzen. Da der Datentyp string die Methode GetHashCode von der Basisklasse object geerbt hat, können Sie danach die Methode GetHashCode auf dieser string-Repräsentation aufrufen.
3) Überladen Sie nun auch die Operatoren == und != für die Klasse Kaffeemaschine.
4) In dieser Übung sollen Sie eine einfache Nahrungskette im Tierreich implementieren.
a) Zunächst benötigen Sie eine abstrakte Basisklasse „Tier“. Es sollen drei Eigenschaften vorhanden sein: ein Gleitkommawert aktuellesGewicht, der das aktuelle Gewicht des Tieres angibt (protected Schreibzugriff, public Lesezugriff), ein Gleitkommawert initialGewicht, der das initiale Gewicht des Tieres angibt (private Schreibzugriff, public Lesezugriff) sowie einen boolschen Wert isAlive, der angibt, ob das Tier lebendig oder tot ist (private Schreibzugriff, public Lesezugriff).
Erstellen Sie einen Konstruktor für die abstrakte Klasse, der diese drei Eigenschaften initialisiert: das Tier soll zu Beginn immer lebendig sein und das Gewicht sowie das initiale Gewicht soll über einen Konstruktor-Parameter angegeben werden (d.h. sowohl aktuelles als auch initiales Gewicht werden zunächst auf denselben Wert gesetzt, der dem Konstruktor übergeben wird). Wenn Sie später die einzelnen Unterklassen implementieren, sollen Sie im Konstruktor der Unterklassen jeweils den Konstruktor der abstrakten Basisklasse aufrufen.
b) Die Basisklasse „Tier“ soll eine abstrakte protected-Methode besitzen: die Methode „canEat“ soll eine Referenz auf ein Tier-Objekt übergeben bekommen und einen boolschen Wert zurück liefern. Denken Sie daran: da es sich um eine abstrakte Methode handelt, darf Sie in der Basisklasse noch nicht implementiert werden, sondern erst später in den konkreten Unterklassen. Mit der Methode soll später herausgefunden werden können, ob ein Tier ein anderes Tier fressen kann.
Außerdem soll die Klasse eine öffentliche Methode „wirdGetoetet“ beinhalten. Für diese Methode geben wir die Implementierung direkt in der Basisklasse an, es soll einfach das Attribut, das angibt ob das Tier lebendig ist, auf „false“ gesetzt werden.
c) Zudem soll die Basisklasse „Tier“ noch eine öffentliche Methode „eat“ besitzen: diese soll ebenfalls eine Referenz auf ein Tier-Objekt erhalten und keinen Rückgabewert besitzen. Diese Methode implementieren wir direkt in der Basisklasse. Der Sinn der Methode ist es, dass das als Argument übergebene Tier vom aktuellen Tier aufgefressen wird (d.h. tier1.eat(tier2) bedeutet, dass tier2 von tier1 aufgefressen wird).
Bei der Implementierung gehen Sie daher folgendermaßen vor: zunächst wird mit der Methode „canEat“ überprüft, ob das aktuelle Tier das übergebene Tier überhaupt fressen kann.
(Beachten Sie: „canEat“ haben wir in der Basisklasse „Tier“ noch garnicht implementiert, dennoch können wir die Methode bereits nutzen. Von der abstrakten Oberklasse „Tier“ können keine Instanzen erstellt werden, daher kann die Methode „eat“, die wiederum „canEat“ aufruft, noch nicht aufgerufen werden. Erst in den später zu erstellenden konkreten Unterklassen wird man „eat“ aufrufen können. Dort erstellen wir dann jedoch auch jeweils eine Implementierung für „canEat“, sodass bei der Ausführung von „eat“ dann jeweils die „canEat“ Methode der jeweiligen Unterklasse verwendet wird.)
Wenn das Tier nicht gefressen werden kann, beenden wir die Methodenausführung von „eat“ und führen keine weiteren Operationen aus. Wenn das übergebene Tier jedoch gefressen werden kann, addieren wir das Gewicht des gefressenen Tierers zum aktuellen Gewicht des fressenden Tieres und passen dessen aktuelles Gewicht dementsprechend an. Zudem rufen wir auf dem gefressenen Tier die Methode „wirdGetoetet“ auf, um zu signalisieren, dass das Tier jetzt tot ist.
d) Weiterhin erstellen wir eine öffentliche Methode „verdauen“. Diese Methode erhält keinen Parameter und hat auch keinen Rückgabewert. Stattdessen wird in dieser Methode lediglich das Gewicht des Tieres nach folgender Systematik verändert: wenn das aktuelle Gewicht nicht größer als das initiale Gewicht ist, wird keine Veränderung durchgeführt. Wenn das aktuelle Gewicht größer ist als das initiale Gewicht, wird das Gewicht um 95 % des „zusätzlichen“ Gewichtes reduziert.
(Beispiel: Das initiale Gewicht beträgt 50 (Gramm), das aktuelle Gewicht beträgt 150 (Gramm). Dann beträgt das zusätzliche Gewicht also 100 Gramm und dieses wird nun um 95 % reduziert. Dann bleiben lediglich 5 Gramm vom zusätzlichen Gewicht übrig, d.h. das neue aktuelle Gewicht beträgt 50 Gramm (Initialgewicht) + 5 Gramm (zusätzliches Gewicht) = 55 Gramm)
Das initiale Gewicht bleibt immer unverändert.
e) Nun erstellen wir konkrete Unterklassen von „Tier“, nämlich „Eichhoernchen“, „Baummarder“ und „Uhu“. Wir müssen also für jede dieser Unterklassen jeweils die Methode „canEat“ implementieren. Zudem müssen wir für jede dieser Unterklassen einen Konstruktor erstellen, der den Konstruktor der Basisklasse aufruft und Gewicht, initiales Gewicht und den „Lebendigkeitsstatus“ initialisiert.
Nachdem wir die Konstruktoren für alle drei Klassen angelegt haben, machen wir uns an die Implementierung der Methode „canEat“ für die 3 Klassen. Wir starten mit dem „Eichhoernchen“: dieses steht ganz unten in der Nahrungskette und kann daher keines der anderen Tiere fressen. Die Methode „canEat“ gibt daher immer „false“ zurück.
Der „Baummarder“ steht über dem Eichhoernchen in der Nahrungskette und kann ein lebendiges Eichhoernchen also auffressen. Die Methode „canEat“ soll also beim „Baummarder“ genau dann „true“ zurückgeben, wenn das als Parameter übergebene Tier ein „Eichhoernchen“ ist und wenn beide Tiere noch lebendig sind. In allen anderen Fällen soll die Methode false zurück geben.
Der „Uhu“ steht an der Spitze der Nahrungskette, er kann sowohl „Eichhoernchen“ als auch „Baummarder“ fressen. Die Methode „canEat“ soll beim „Uhu“ also genau dann „true“ zurück geben, wenn entweder ein „Eichhoernchen“ oder ein „Baummarder“ als Parameter übergeben wird und wenn beide Tiere noch lebendig sind.
f) Wir können den Subklassen nun noch beliebige weitere Methoden hinzufügen. Beispielhaft fügen wir dem „Uhu“ eine Methode „fliegen“ hinzu (keine Übergabeparameter, kein Rückgabewert). Einziger Effekt soll eine Reduktion des Gewichtes um 10 (Gramm) sein, jedoch nur bis zur Untergrenze des Initialgewichtes.
g) Erstellen Sie nun einige Instanzen und probieren aus, ob das Verhalten Ihrer Klassen dem erwarteten Verhalten entspricht. Sie können dazu z.B. nach jeder Operation Gewicht und Lebendigkeitsstatus eines Objektes überprüfen und mittels „Console.WriteLine()“ über die Konsole ausgeben.
Kapitel 9
1) Erstellen Sie eine generische Klasse „Arena“, die zwei Typparameter (T und V) nimmt, die beide jeweils mit einer Unterklasse von „Tier“ aus Kapitel 8 belegt werden müssen. In der Arena treten die Tiere nun gegeneinander an. Die Klasse soll eine einzelne Methode „showdown“ besitzen, die einen Parameter vom Typ T und einem vom Typ V erhält (d.h. zwei Instanzen von (möglicherweise unterschiedlichen) Subklassen von „Tier“). Als Resultat soll ein Objekt vom Typ „Tier“ zurück gegeben werden.
Da zwei Tiere übergeben wurden, soll dasjenige (Tier-)Objekt zurückgegeben werden, das ein Zusammentreffen der beiden Tiere überlebt (d.h. wenn es einem Tier möglich ist, das andere zu fressen). Wenn beide Tiere das Zusammentreffen überleben, soll die null-Referenz zurückgegeben werden.
2) Führen Sie die gleiche Aufgabe wie in Übung 9.1 aus. Verwenden Sie dabei jedoch keine generische Klasse, sondern lediglich eine generische Methode „showdown“.
Kapitel 10
1) Schreiben Sie eine Methode „stringKonkat“, die als Argument ein Array von Strings übergeben bekommt. Als Ergebnis soll ein String zurückgegeben werden, der die Konkatenation (d.h. Aneinanderreihung) aller Strings aus dem Eingabe-Array enthält.
2) Schreiben Sie eine Methode „arraySum“, die als Argument ein Array von int-Werten übergeben bekommt und die Summe der in dem Array enthaltenen Werte berechnet und zurück gibt.
3) Schreiben Sie eine Methode „arraySumTwist“, die als Argument ein Array von int-Werten bekommt und die die Summe der in dem Array enthaltenen Werte, die größer als 10 sind, berechnet und zurück gibt. Alle Elemente des Arrays, die nicht größer als 10 sind, sollen bei der Summenberechnung ignoriert werden.
Hinweis: Sie müssen an der Lösung von Übung 10.2 nur eine Zeile ändern, wenn Sie den Fragezeichen-Operator ?: einsetzen.
4) In Übung 7.1 haben Sie eine Methode kaffeemaschinenAngleichen geschrieben, die die Füllstände der beiden übergebenen Kaffeemaschinen angeglichen hat.
Erstellen Sie jetzt eine verallgemeinerte Methode alleKaffeemaschinenAngleichen:
public void alleKaffeemaschinenAngleichen(List<Kaffeemaschine> alleMaschinen)
Hier sollen die Wasser- und Bohnen-Füllstände von allen Maschinen so angepasst werden, dass sie dem Füllstand der Maschine mit dem höchsten Wasser- bzw. Bohnen-Füllstand entsprechen (d.h. nach Beendigung der Methode haben alle Maschinen den gleichen Wasser- und Kaffeebohnen-Füllstand).
5) Erstellen Sie eine Methode „listCount“, die als Parameter eine Liste von string-Elementen erhält und einen int-Wert zurück liefert. Der int-Wert soll die Anzahl der Elemente der Liste angeben, die mit einem großen „D“ starten.
6) Erstellen Sie eine Methode „setInsert“, die als Parameter eine HashSet von int-Elementen sowie einen einzelnen int-Wert „maxVal“ erhält. Die Methode soll keinen Wert zurückgeben.
void setInsert(HashSet<int> mySet, int maxVal);
Die Methode soll das folgende Verhalten aufweisen:
Beginnend mit 1 sollen so lange fortlaufende int-Werte, die noch nicht in der Menge enthalten sind, hinzugefügt werden, bis die Summe aller in der Menge enthaltenen Werte den gelieferten Parameter „maxVal“ überschreiten würden. Der Wert, der zur Überschreitung von maxVal führen würde, soll nicht mehr eingefügt werden. Sofern die Summe der in der Menge enthaltenen Werte bereits zu Beginn den „maxVal“ erreicht oder überschreitet, sollen keine weiteren Elemente eingefügt werden.
Beispiel: Die Menge enthält initial die Werte (2,3,4) und es wird 20 als „maxVal“ angegeben. Die initiale Summe der Werte der Menge beträgt 9, daher werden noch die Werte 1 und 5 hinzugefügt. Dann beträgt die Summe der Werte 15, durch das nachfolgende Einfügen von 6 würde der Maximalwert der Summe von 20 überschritten, daher werden keine weiteren Werte mehr eingefügt.
6) Erstellen Sie zunächst ein Dictionary, das jeder der Ziffern von 0 bis 9 die ausgeschriebene Zahl als String zuordnet (also 0 => „Null“, 1 => „Eins“, usw). Nun erstellen Sie eine Methode „int2String“ die einen int-Wert als Parameter erhält und einen String zurück gibt. Der zurückgegebene String soll eine Aneinanderreihung der ausgeschriebenen Zahlen der einzelnen Ziffern aus denen der int-Wert besteht, enthalten. Verwenden Sie dazu das initial erstellte Dictionary. Beispiel: für die Eingabe 5390 soll der zurückgegebene String „FünfDreiNeunNull“ enthalten.
Hinweis: Schauen Sie sich nochmal die String-Operationen aus Kapitel 6.8.1 sowie die Konvertierungsmöglichkeiten aus Kapitel 6.8.3 an. Um ein einzelnes char-Zeichen in einen string zu konvertieren, können Sie die Methode „ToString“ verwenden: String str = ch.ToString();
Kapitel 11
1) Erstellen Sie eine Methode „division“, die eine Division von zwei int-Werten durchführt. Führen Sie damit eine Division durch 0 aus und starten Sie das Programm. Das Programm sollte durch das Auftreten einer Exception abstürzen und eine Fehlermeldung ausgeben. Finden Sie mit Hilfe der Fehlermeldung heraus, welche Exception ausgelöst wird und ändern Sie die Methode „division“ so ab, dass diese Exception abgefangen wird. Es soll eine hilfreiche Hinweismeldung ausgegeben werden (Console.WriteLine()) und als Ergebnis 0 zurück geliefert werden.
2) Erstellen Sie eine Methode fak, die die Fakultät einer Ganzzahl berechnet.
int fak(int n);
Hinweis: Die Fakultät einer positiven Ganzzahl n ist definiert als 1 * 2 * 3 * … * (n-1) * n. Die Fakultät von 0 beträgt 1, die Fakultät von negativen Zahlen und nicht ganzen Zahlen ist nicht definiert.
Wenn die Methode mit einem negativen Wert als Parameter aufgerufen wird, soll eine „ArgumentException“ mit einem hilfreichen Hinweistext ausgelöst werden. Rufen Sie die Methode innerhalb einer „main“-Hauptmethode auf und fangen Sie die Exception dort ab und geben den Hinweistext aus.
Kapitel 12
1) Erstellen Sie die Methode getOperator:
Func<int, int, int> GetOperator(char opr);
Die Methode soll ein Delegat vom Typ Func
Wird ‚+‘ übergeben, soll eine Methode, die zwei Zahlen addiert, zurück gegeben werden.
Wird ‚-‚ übergeben, soll eine Methode, die zwei Zahlen subtrahiert, zurück gegeben werden.
Wird ‚*‘ übergeben, soll eine Methode, die zwei Zahlen multipliziert, zurück gegeben werden.
Wird ‚/‘ übergeben, soll eine Methode, die zwei Zahlen dividiert, zurück gegeben werden.
In allen anderen Fällen soll eine Methode zurück gegeben werden, die immer 0 als Ergebnis liefert.
2) Erweitern Sie die Klasse Kaffeemaschine aus Kapitel 7 und 8 um ein Event KaffeIstZubereitet. Das Event soll immer dann ausgesendet werden, wenn ein Kaffee zubereitet wurde.
Erstellen Sie nun eine neue Klasse Kaffeetrinker. Fügen Sie dieser eine Methode hinzu, um das Event KaffeIstZubereitet zu registrieren. Im Handler soll eine Ausgabe auf der Konsole gemacht werden: „Yam!“
3) In Übung 10.5 haben Sie eine Methode listCount erstellt, die die Anzahl der Elemente in einer Liste, die mit einem großen „D“ starten, zählt. Schreiben Sie diese Methode erneut und nutzen Sie diesmal die LINQ-Features von C#.
4) Erstellen Sie die Methode arraySumTwist aus Übung 10.3 mit Hilfe der LINQ-Features von C#.
Kapitel 13
1) Schreiben Sie zunächst eine Funktion „berechneSumme“, die die Summe der ersten n ganzen Zahlen berechnet.
Erstellen Sie nun zwei Threads, die diese Methode gleichzeitig ausführen. Gestalten Sie die Threads so, dass jeweils nach Beendigung der Berechnung eine Nachricht ausgegeben wird, z.B. „Thread 1 hat die Berechnung beendet und folgendes Ergebnis erhalten: 5050“. Führen Sie das erstellte Programm nun mehrmals aus und variieren dabei den Parameter n für die beiden Aufrufe von „berechneSumme“ in den beiden Threads.
z.B. 1. Aufruf 10 und 20 verwenden, 2. Aufruf 30000 und 20000 verwenden, 3. Aufruf 40000 und 40000 verwenden, 4. Aufruf 10 und 1000000 verwenden, usw. Beobachten Sie jeweils, welcher Thread als erstes seine Arbeit beendet hat. Insbesondere in den Fällen, in denen Sie die Methode in beiden Threads mit dem gleichen Parameter aufrufen sollte es relativ zufällig sein, welcher Thread seine Arbeit als erstes beendet.
2) Ändern Sie das Server-Programm aus Kapitel 13.2.3 so ab, dass es nicht nach einer Verbindung mit einem Clienten beendet wird, sondern dass sich danach noch weitere Clienten verbinden können. Nach der Änderung sollten Sie das Client-Programm mehrmals starten können, ohne die Server-Anwendung ebenfalls neustarten zu müssen.
3) Schreiben Sie eine Methode „urlContains“, die als Argumente zwei String-Parameter „url“ und „search“ erhält und deren Rückgabetyp bool ist. Die Methode soll den Inhalt, der über die Internetadresse „url“ abgerufen werden kann, auslesen und true zurück liefern, falls der Teilstring „search“ innerhalb des Inhalts der Internetadresse gefunden werden kann, ansonsten false.
Kapitel 14
1) Ändern Sie die in Kapitel 14 erstelle GUI-Anwendung so ab, dass in der Historie für jedes Zahlenpaar nicht nur die Summe angegeben wird, sondern auch auch das Ergebnis einer Subtraktion sowie das Ergebnis einer Multiplikation der beiden Werte.
Beispiellösungen
Unsere Lösungsvorschläge können Sie auf der folgenden Seite herunter laden:
Eine ausführliche Liste unserer Buchempfehlungen für C# finden Sie hier.
Unsere Buchempfehlungen
Oder sehen Sie sich die vollständige Liste der Empfehlungen für C# an.Wir haben auch eine Empfehlung für einen C#-Fernkurs parat.