Arbeiten mit .NET: C-Sharp/ Grundlagen/ Bestandteile/ Anweisungen: Übungen

Übung 1 Definitionen Zur Lösung

Welche der folgenden Aussagen sind wahr, welche sind falsch?

  1. Eine Anweisung wird mit einem Komma beendet.
  2. Wenn eine Anweisung in einer weiteren Zeile fortgesetzt werden soll, muss dies am Ende der Zeile durch einen Unterstrich _ deutlich gemacht werden.
  3. Eine Anweisung kann durch Leerzeichen oder Tabulatoren gegliedert werden.
  4. Mehrere Anweisungen dürfen zusammen in eine Zeile geschrieben werden.
  5. Wenn ein Klassenname mit dem Namespace zusammen angegeben wird, dürfen diese beiden Bestandteile nicht in verschiedenen Zeilen stehen.
  6. 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.

  1. Ein Auto (also ein Objekt der Car-Klasse) soll gestartet werden.
  2. Ein Auto soll gestartet werden; die Methode soll angeben, ob der Versuch erfolgreich war.
  3. Die Dezimalzahl 417.83 soll in einen String konvertiert werden.
  4. Die Dezimalzahl 417.83 soll in einen String konvertiert werden und gleichzeitig an der Console ausgegeben werden.
  5. Ein Auto soll mit der Methode Delay gestoppt werden.
  6. 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.
  7. 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ösungen

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
  1. Zu einer Deklaration gehören Datentyp und Name der Variablen direkt hintereinander (ohne Gleichheitszeichen). Diese Anweisung ist mit Semikolon zu beenden.
    string cartype;
    
  2. Die Zuweisung erfolgt mit einem einfachen Gleichheitszeichen (ohne Doppelpunkt).
    cartype = args[0];
    
  3. 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;
    
  4. Das ist eine Rechenvorschrift, die nur in einer Zuweisung stehen darf, und zwar rechts vom Gleichheitszeichen.
    double netto = brutto / 1.19;
    
  5. 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
  1. mycar.Start();                                 // Aufruf
    
    public void Start() { ... }                    // Deklaration
    
  2. bool successful = mycar.Start();               // Aufruf
    
    public bool Start() { ... }                    // Deklaration
    
  3. string s = 417.83.ToString();                  // Aufruf
    
  4. Console.WriteLine( 417.83.ToString() );        // Aufruf
    
  5. mycar.Delay(mycar.Speed);                      // Aufruf
    
  6. DateTime future = DateTime.Today.AddDays(10);  // Aufruf
    
  7. string s = future.ToString("dddd");            // Aufruf
    

Lösung zu Übung 4 Erzeugen von Objekten Zur Übung
  1. Das Schlüsselwort new fehlt, mit dem ein neues Objekt erzeugt wird.
  2. Der einfache Konstruktor kann wegen der Deklaration private nicht verwendet werden. Dies wurde unter OOP - Ein erster Einblick erläutert.
  3. Es gibt nur (zulässige) Konstruktoren mit 3 oder 6 Argumenten, aber keinen mit 2 Argumenten.
  4. 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();
}