Arbeiten mit .NET: C-Sharp/ Grundlagen/ Bestandteile/ Anweisungen: Übungen
Übung 1 | Definitionen | Zur Lösung |
Welche der folgenden Aussagen sind wahr, welche sind falsch?
- Eine Anweisung wird mit einem Komma beendet.
- Wenn eine Anweisung in einer weiteren Zeile fortgesetzt werden soll, muss dies am Ende der Zeile durch einen Unterstrich _ deutlich gemacht werden.
- Eine Anweisung kann durch Leerzeichen oder Tabulatoren gegliedert werden.
- Mehrere Anweisungen dürfen zusammen in eine Zeile geschrieben werden.
- Wenn ein Klassenname mit dem Namespace zusammen angegeben wird, dürfen diese beiden Bestandteile nicht in verschiedenen Zeilen stehen.
- Eine Befehlszeile darf nicht länger als 255 Zeichen werden.
Übung 2 | Einfache Anweisungen | Zur Lösung |
Finden Sie in den folgenden Codezeilen die Fehler und berichtigen Sie. Es geht nur um Fehler, die sich auf dieses Kapitel beziehen.
string = cartype
cartype := args[0];
double brutto = 17.90
brutto / 1.19;
DateTime.Today.AddDays(-7);
Übung 3 | Methoden | Zur Lösung |
Erstellen Sie für die folgenden Situationen jeweils den Aufruf und die Verwendung einer Methode. Geben Sie für eine "eigene" Methode außerdem an, wie sie innerhalb ihrer Klasse deklariert sein muss.
- Ein Auto (also ein Objekt der Car-Klasse) soll gestartet werden.
- Ein Auto soll gestartet werden; die Methode soll angeben, ob der Versuch erfolgreich war.
- Die Dezimalzahl 417.83 soll in einen String konvertiert werden.
- Die Dezimalzahl 417.83 soll in einen String konvertiert werden und gleichzeitig an der Console ausgegeben werden.
- Ein Auto soll mit der Methode Delay gestoppt werden.
- Holen Sie sich das Datum, das von heute an 10 Tage in der Zukunft liegt. Hinweis: Jedes Datum kennt die Methode AddDays mit einem passenden Argument.
- Zu diesem Datum soll der Wochentag verwendet werden.
Übung 4 | Erzeugen von Objekten | Zur Lösung |
Was ist an den folgenden Anweisungen falsch, mit denen jeweils ein Objekt der Car-Klasse erzeugt wird?
Car firstCar = Car("NSU", "688 cm³", 471);
Car secondCar = new Car();
Car thirdCar = new Car("NSU Prinz", 942);
new Car("NSU Ro 80", "1988 cm³", 26);
Übung 5 | Verzweigungen | Zur Lösung |
Definieren Sie in der Car-Klasse eine Methode GetSpeedRegion mit folgendem Inhalt:
- Sie soll als String eine Angabe darüber machen, wie schnell das Auto aktuell ist: bei 0 km/h "Stillstand", bei 1–9 km/h "Schrittgeschwindigkeit", bis zu 30 km/h "Wohnbereich", bis zu 50 km/h "innerorts", dann "Landstraße", "Bundesstraße", "Autobahn" und "unbegrenzt".
- Dieser String ist zunächst als Variable result zu deklarieren.
- Dividieren Sie dann die Geschwindigkeit mit '/' durch 10 und beachten Sie die sogenannte Integer-Division, bei der der Rest abgeschnitten wird: "10 / 10" liefert 1, "11 / 10" liefert 1, "19 / 10" liefert 1, "20 / 10" liefert 2 usw.
- Dieser Zwischenwert temp wird in einer switch-Anweisung ausgewertet; jeder Zweig muss eine if-Anweisung enthalten, ob die Geschwindkeit einem bestimmten Wert entspricht.
- Die Variable result wird als Rückgabewert der Methode verwendet. Hinweis: Dieser Schritt wird ebenso in der Methode ShowSignals der Car-Klasse benutzt.
Übung 6 | Verzweigungen | Zur Lösung |
Verbessern Sie die Lösung der vorigen Aufgabe mit folgendem Trick: Wenn der aktuelle Wert der Geschwindigkeit zuerst um 1 verringert wird und dann die Division durch 10 ausgeführt wird, landet der Grenzwert in derselben Gruppe wie die nachfolgenden Werte. Beachten Sie die Regel "Punkt-vor-Strich" und den Hinweis zur Integer-Division.
Übung 7 | Schleifen | Zur Lösung |
Berechnen Sie, wie viele Weizenkörner der Erfinder des Schachs der Legende nach zu erhalten hat (siehe Weizenkornlegende). Bauen Sie für die erste Formel, die dort im Abschnitt Mathematische Berechnung genannt wird, eine Schleife nach der folgenden Anleitung:
- Deklarieren Sie zwei Variablen vom Typ UInt64, die jeweils mit 0 initialisiert werden.
- Die eine Variable soll das Ergebnis enthalten.
- Die zweite Variable ist für die aktuelle 2er-Potenz gedacht, also den Wert, der addiert werden soll.
- Die Schleife geht von Feld 1 bis 64.
- Innerhalb der Schleife wird zuerst der Additionswert zugewiesen: bei Feld 1 mit dem Startwert 1, bei allen anderen Feldern durch Multiplikation mit 2.
- Dieser Additionswert wird dem (bisherigen) Ergebnis hinzu addiert.
Hinweis: Andere Typen als UInt64 führen zu einem Laufzeitfehler, ebenso wie ein anderer Ablauf der Teilrechnungen.
Lösung zu Übung 1 | Definitionen | Zur Übung |
Die Aussagen 3, 4 sind wahr, die Aussagen 1, 2, 5, 6 sind falsch.
Lösung zu Übung 2 | Einfache Anweisungen | Zur Übung |
- Zu einer Deklaration gehören Datentyp und Name der Variablen direkt hintereinander (ohne Gleichheitszeichen). Diese Anweisung ist mit Semikolon zu beenden.
string cartype;
- Die Zuweisung erfolgt mit einem einfachen Gleichheitszeichen (ohne Doppelpunkt).
cartype = args[0];
- Es fehlt wieder das Semikolon am Ende. Dadurch glaubt der Compiler, dass die Anweisung in der nächsten Zeile fortgesetzt wird, und bringt verwirrende Fehlermeldungen.
double brutto = 17.90;
- Das ist eine Rechenvorschrift, die nur in einer Zuweisung stehen darf, und zwar rechts vom Gleichheitszeichen.
double netto = brutto / 1.19;
- Das ist formal nicht falsch, nämlich als Aufruf einer Methode. Aber das Ergebnis wird nicht benutzt, also ist dieser Aufruf sinnlos.
DateTime oneWeekAgo = DateTime.Today.AddDays(-7);
Lösung zu Übung 3 | Methoden | Zur Übung |
mycar.Start(); // Aufruf
public void Start() { ... } // Deklaration
bool successful = mycar.Start(); // Aufruf
public bool Start() { ... } // Deklaration
string s = 417.83.ToString(); // Aufruf
Console.WriteLine( 417.83.ToString() ); // Aufruf
mycar.Delay(mycar.Speed); // Aufruf
DateTime future = DateTime.Today.AddDays(10); // Aufruf
string s = future.ToString("dddd"); // Aufruf
Lösung zu Übung 4 | Erzeugen von Objekten | Zur Übung |
- Das Schlüsselwort new fehlt, mit dem ein neues Objekt erzeugt wird.
- Der einfache Konstruktor kann wegen der Deklaration private nicht verwendet werden. Dies wurde unter OOP - Ein erster Einblick erläutert.
- Es gibt nur (zulässige) Konstruktoren mit 3 oder 6 Argumenten, aber keinen mit 2 Argumenten.
- Das Objekt wird zwar erzeugt, aber keiner Variablen zugewiesen und ist deshalb sinnlos.
Lösung zu Übung 5 | Verzweigungen | Zur Übung |
public string GetSpeedRegion()
{
string result;
int temp = Speed / 10;
switch(temp) {
case 0: // Geschwindigkeit 0 bis 9
if(Speed == 0)
result = "Stillstand";
else
result = "Schrittgeschwindigkeit";
break;
case 1: // Geschwindigkeit 10 bis 29
case 2:
result = "Wohnbereich";
break;
case 3: // Geschwindigkeit 30 bis 49
case 4:
if(Speed == 30)
result = "Wohnbereich";
else
result = "innerorts";
break;
case 5: // Geschwindigkeit 50 bis 79
case 6:
case 7:
if(Speed == 50)
result = "innerorts";
else
result = "Landstraße";
break;
case 8: // Geschwindigkeit 80 bis 99
case 9:
if(Speed == 80)
result = "Landstraße";
else
result = "Bundesstraße";
break;
case 10: // Geschwindigkeit 100 bis 129
case 11:
case 12:
if(Speed == 100)
result = "Bundesstraße";
else
result = "Autobahn";
break;
default: // Geschwindigkeit ab 130
if(Speed == 130)
result = "Autobahn";
else
result = "unbegrenzt";
break;
}
return result;
}
Lösung zu Übung 6 | Verzweigungen | Zur Übung |
public string GetSpeedRegion()
{
string result;
int temp = (Speed-1) / 10;
switch(temp) {
case 0: // Geschwindigkeit 0 bis 10
switch(Speed) {
case 0:
result = "Stillstand";
break;
case 10:
result = "Wohnbereich";
break;
default:
result = "Schrittgeschwindigkeit";
break;
}
break;
case 1: // Geschwindigkeit 11 bis 30
case 2:
result = "Wohnbereich";
break;
case 3: // Geschwindigkeit 31 bis 50
case 4:
result = "innerorts";
break;
case 5: // Geschwindigkeit 51 bis 80
case 6:
case 7:
result = "Landstraße";
break;
case 8: // Geschwindigkeit 81 bis 100
case 9:
result = "Bundesstraße";
break;
case 10: // Geschwindigkeit 101 bis 130
case 11:
case 12:
result = "Autobahn";
break;
default: // Geschwindigkeit ab 131
result = "unbegrenzt";
break;
}
return result;
}
Der Zweig für case 0 kann weiterhin mit if dargestellt werden:
// switch-Verschachtelung durch if ersetzt
case 0: // Geschwindigkeit 0 bis 10
if(Speed == 0)
result = "Stillstand";
else if(Speed == 10) {
result = "Wohnbereich";
else
result = "Schrittgeschwindigkeit";
break;
Lösung zu Übung 7 | Schleifen | Zur Übung |
static void Main()
{
UInt64 result = 0;
UInt64 diff = 0;
for ( int x1 = 1; x1 <= 64; x1++ )
{
if (x1 > 1)
{
diff = diff * 2;
}
else
{
diff = 1;
}
result = result + diff;
}
Console.WriteLine(result);
Console.ReadKey();
}