Arbeiten mit .NET: Grundlagen: Datentypen/ Andere Typen

Aus Wikibooks
Zur Navigation springen Zur Suche springen

In diesem Kapitel besprechen wir einige weitere Datentypen. Diese sind ausnahmslos als Strukturen definiert und sind somit Wertetypen. – Boolean ist grundlegend für die gesamte praktische Arbeit; die anderen Typen sind als Beispiele für viele weitere Datentypen zu verstehen.

Boolean[Bearbeiten]

Der Datentyp System.Boolean steht für einen logischen Wert. Eine Variable dieses Typs kann nur zwei verschiedene Werte annehmen: entweder true oder false.[1]

In anderen Programmiersprachen sind logische Werte so definiert, dass die ganze Zahl 1 für "true" steht und alles andere für "false"; oder es wird 0 als "false" definiert und alles andere als "true". .NET ist auch in dieser Hinsicht ganz eindeutig: Es gelten die Werte true und false; diese haben nichts mit Zahlen zu tun. Dies hat auch Auswirkungen darauf, wie logische Werte zugewiesen und Vergleiche ausgeführt werden.

Es wird auch von booleschen Werten gesprochen; die Variablen heißen vorzugsweise boolesche Variable. Zeigen wir wie üblich ein paar Beispiele zu ihrer Verwendung:

C#-Quelltext
static void Main(string[] args)
{
	int i1 = 123;
	double d1 = i1 / 10.0;
	Boolean b1 = true;              // direkte Zuweisung von true
	Boolean b2 = i1 == 135;         // Zuweisung als Ergebnis der Gleichheitsprüfung
	// direkte Ausgabe mit Boolean.TrueString bzw. Boolean.FalseString
	Console.WriteLine(b1);         
	Console.WriteLine(b2);         
	// gesteuerte Ausgabe mit eigenen Strings
	Console.WriteLine(b2         ? "wahr"   : "falsch");
	Console.WriteLine(12.3 == d1 ? "gleich" : "ungleich");
	Console.ReadKey();
}
VB.NET-Quelltext
Sub Main()
	Dim i1 as Integer = 123
	Dim d1 As Double  = i1 / 10.0
	Dim b1 As Boolean = true              ' direkte Zuweisung von true
	Dim b2 As Boolean = (i1 = 135)        ' Zuweisung als Ergebnis der Gleichheitsprüfung
	' direkte Ausgabe mit Boolean.TrueString bzw. Boolean.FalseString
	Console.WriteLine(b1)         
	Console.WriteLine(b2)         
	' gesteuerte Ausgabe mit eigenen Strings
	Console.WriteLine(IIf(b2,        "wahr",   "falsch"))
	Console.WriteLine(IIf(12.3 = d1, "gleich", "ungleich"))
	Console.ReadKey()
End Sub
Crystal Clear app terminal.png Ausgabe
True
False
falsch
gleich

Boolesche Variable werden wie folgt benutzt:

  • Vergleiche beliebiger Datentypen liefern als Ergebnis immer einen booleschen Wert. Diese werden unter Vergleichsoperatoren behandelt.
  • Boolesche Werte können in Kombinationen geprüft werden. Dies wird unter Boolesche Operatoren behandelt.
  • Bei allen Verfahren in den Abschnitten zu Kontrollstrukturen, d.h. zur Kontrolle des Programmablaufs, werden stets boolesche Werte als Ergebnis verwendet, ob Bedingungen erfüllt sind oder nicht.
  • In den Abschnitten zu Typumwandlungen werden behandelt:
    • Umwandlung eines booleschen Wertes in einen String
    • Umwandlung eines Strings in einen booleschen Wert

Die wichtigste Bedeutung sind die Bedingungen bei Kontrollstrukturen.

Datum und Uhrzeit[Bearbeiten]

Für die Verarbeitung von Datum und Uhrzeit sowie Zeitspannen gibt es zwei Datentypen. Beides sind Strukturen, also Wertetypen.

Klassenname CLS Standard Minimum Maximum
DateTime nein 01.01.0001 00:00:00 01.01.0001 00:00:00 31.12.9999 23:59:59
TimeSpan nein 0 –263 Ticks
≈ – 10675199 Tage
263–1 Ticks
≈ + 10675199 Tage

DateTime[Bearbeiten]

Der Datentyp System.DateTime steht für die Speicherung eines Zeitpunktes, also von Datum und Uhrzeit. Er wird gerechnet in Ticks, wobei 1 Tick 100 Nanosekunden entspricht, und gezählt vom 1. Januar des Jahres 1 um 00:00 Uhr. Daraus ergibt sich auch der mögliche Maximalwert. Genauer: Alle DateTime-Werte beziehen sich auf den Gregorianischen Kalender. Zusätzlich wird registriert, ob es sich um eine UTC-Angabe (Coordinated Universal Time, entspricht GMT), um eine lokale Zeitangabe (ggf. mit Sommerzeit) oder nicht um eine spezielle Zeit handelt.

Hinweis: In Programmierer-Foren liest man immer wieder Formulierungen der Art: "Ich habe einen DateTime der Form tt.mm.jjjj und möchte ihn als jjjj/mm/dd haben." Durch die Erläuterung, was ein DateTime ist, sollte schon klar sein, dass eine solche Formulierung völlig abwegig ist: Die genannten Schreibweisen sind nur verschiedene Darstellungen als Zeichenketten für dasselbe Datum.

Attention green.svg

Ein DateTime ist ein DateTime ist ein DateTime.
"tt.mm.jjjj" oder "jjjj/mm/dd" o.a. sind nur besondere Schreibweisen als Zeichenketten, aber keine abweichenden Formen von DateTime.


Für einen DateTime-Wert stehen die folgenden Angaben zur Verfügung:

  • Year, Month, Day
  • Hour, Minute, Second, Millisecond, Ticks
  • Date, TimeOfDay
  • DayOfYear, DayOfWeek, Kind (nämlich die Art der Zeit: UTC, lokal, Unspecified)

Die aktuellen Werte können mit DateTime.Today, DateTime.Now (lokale Zeit) bzw. DateTime.UtcNow (UTC) abgefragt werden. Außerdem gibt es viele Konstruktoren; einige werden im folgenden Beispiel genannt. Für die Ausgabe haben wir uns auf DateTime.Now beschränkt.

C#-Quelltext
static void Main(string[] args)
{
	// ein paar Möglichkeiten, einen DateTime zu erzeugen
	DateTime d1 = new DateTime();                 // Standardwert
	Write(d1);         
	d1 = new DateTime(500000000000000000);        // Anzahl der Ticks
	Write(d1);         
	d1 = new DateTime(2010, 4, 1);                // nach Jahr, Monat, Tag
	Write(d1);         
	d1 = new DateTime(2009, 12, 31, 18, 14, 23);  // Datum + Uhrzeit
	Write(d1);         
	d1 = DateTime.Today;                          // aktuelles Datum
	Write(d1);         
	d1 = DateTime.Now;                            // ... mit Uhrzeit
	Write(d1);         
	d1 = DateTime.UtcNow;                         // ... nach UTC
	Write(d1);         
}

static void Write(DateTime d0)
{
	// mehrere Möglichkeiten, die Bestandteile anzuzeigen
	Console.WriteLine(d0);
	Console.WriteLine( String.Format("Jahr: {0}  Monat: {1}  Tag: {2}", 
                                          d0.Year, d0.Month, d0.Day) );
	Console.WriteLine( String.Format("Std. {0}  min. {1}  sek. {2}", 
                                          d0.Hour, d0.Minute, d0.Second) );
	Console.WriteLine( "Langversion:  " + d0.ToLongDateString() + "   " + d0.ToLongTimeString() );
	Console.WriteLine( String.Format("Der {0}. Tag im Jahr, der {1}. Tag der Woche = {2} / {3}",
 	                                  d0.DayOfYear, (int)d0.DayOfWeek, 
                                          d0.DayOfWeek, d0.ToString("dddd") ) );
	Console.WriteLine("---------------------------------------");
}
VB.NET-Quelltext
Sub Main()
	' ein paar Möglichkeiten, einen DateTime zu erzeugen
	Dim d1 As DateTime = New DateTime()          ' Standardwert
	Write(d1)
	d1 = new DateTime(500000000000000000)        ' Anzahl der Ticks
	Write(d1)
	d1 = new DateTime(2010, 4, 1)                ' nach Jahr, Monat, Tag
	Write(d1)
	d1 = new DateTime(2009, 12, 31, 18, 14, 23)  ' Datum + Uhrzeit
	Write(d1)
	d1 = DateTime.Today                          ' aktuelles Datum
	Write(d1)
	d1 = DateTime.Now                            ' ... mit Uhrzeit
	Write(d1)
	d1 = DateTime.UtcNow                         ' ... nach UTC
	Write(d1)
	Console.ReadKey()
End Sub

Sub Write(d0 As DateTime)
	' mehrere Möglichkeiten, die Bestandteile anzuzeigen
	Console.WriteLine(d0)
	Console.WriteLine( String.Format("Jahr: {0}  Monat: {1}  Tag: {2}", _ 
                                          d0.Year, d0.Month, d0.Day) )
	Console.WriteLine( String.Format("Std. {0}  min. {1}  sek. {2}", _
                                          d0.Hour, d0.Minute, d0.Second) )
	Console.WriteLine( "Langversion:  " + d0.ToLongDateString() + "   " + d0.ToLongTimeString() )
	Console.WriteLine( String.Format("Der {0}. Tag im Jahr, der {1}. Tag der Woche = {2} / {3}", _
				d0.DayOfYear, CInt(d0.DayOfWeek), d0.DayOfWeek, d0.ToString("dddd") ) )
	Console.WriteLine("---------------------------------------")
End Sub
Crystal Clear app terminal.png Ausgabe
10.03.2010 11:51:53
Jahr: 2010  Monat: 3  Tag: 10
Std. 11  min. 51  sek. 53
Langversion:  Mittwoch, 10. März 2010   11:51:53
Der 69. Tag im Jahr, der 3. Tag der Woche = Wednesday / Mittwoch
---------------------------------------

Nacheinander werden verschiedene Datumsangaben – teilweise mit Uhrzeit – festgelegt. Jeder Wert wird an die Write-Methode übergeben und dort mit diversen Bestandteilen ausgegeben.

Hinweis zu DayOfWeek: Dabei handelt es sich um einen Wert der DayOfWeek-Enumeration zwischen 0 für Sonntag und 6 für Samstag/Sonnabend. Mit d0.DayOfWeek wird immer die englische Bezeichnung des Wochentags ausgegeben; über Parameter der ToString-Methode kann die Kurz- oder Langfassung aus einer anderen Sprache abgefragt werden.

DateTime-Werte können wie folgt genutzt werden:

  • In den Abschnitten zu Datentypen verarbeiten werden behandelt:
    • Vergleiche zwischen DateTime-Werten
  • In den Abschnitten zu Typumwandlungen werden behandelt:
    • Umwandlung eines DateTime in einen String
    • Umwandlung eines Strings in einen DateTime

Wie mit DateTime-Werten gerechnet werden kann, wird kurz unter Berechnungen und ausführlich unter Rechnen mit Datum und Zeit behandelt.

TimeSpan[Bearbeiten]

Der Datentyp System.TimeSpan steht für die Speicherung einer Zeitspanne, also eines Zeitraums von Tagen, Stunden usw. Er wird ebenfalls gerechnet in Ticks, kann aber negative Werte ebensogut enthalten wie positive. Ein Wert kann direkt zugewiesen werden; er ist aber sehr oft das Ergebnis eines Vergleichs (der Abstand) zwischen zwei DateTime-Werten.

Für einen TimeSpan-Wert stehen die folgenden Angaben zur Verfügung:

  • Days, Hours, Minutes, Seconds, Milliseconds, Ticks
  • TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds

Die Total-Werte zeigen den betreffenden Wert als ganzzahligen Anteil und den Rest als Bruchteil an. Die anderen Werte teilen den ganzen Wert in die betreffenden Anteile auf. Dies wird im folgenden Beispiel gezeigt.

C#-Quelltext
static void Main(string[] args)
{
	// ein paar Möglichkeiten, einen TimeSpan zu erzeugen
	DateTime d1 = new DateTime(2010, 1, 1);
	TimeSpan t1 = DateTime.Now - d1;     // Abstand vom Jahresanfang 2010
	Write(t1);
	t1 = DateTime.Now - DateTime.Today;  // Abstand seit Tagesanfang
	Write(t1);
	t1 = new TimeSpan(500000000000);     // Anzahl der Ticks
	Write(t1);
	t1 = new TimeSpan(3, 16, 0);         // Std., Min., Sek.
	Write(t1);
	t1 = new TimeSpan(2, 8, 0, 0);       // Tage, Std., Min., Sek.
	Write(t1); 
	Console.ReadKey();
}

static void Write(TimeSpan d0)
{
	// mehrere Möglichkeiten, die Bestandteile anzuzeigen
	Console.WriteLine(d0);
	Console.WriteLine( String.Format("   {0} Tage   {1} Std.   {2} min.   {3} sek.", 
	                               d0.Days, d0.Hours, d0.Minutes, d0.Seconds) );
        Console.Write("   TotalDays ..: ");
	Console.WriteLine(d0.TotalDays);
        Console.Write("   TotalHours .: ");
	Console.WriteLine(d0.TotalHours);
        Console.Write("   TotalMinutes: ");
	Console.WriteLine(d0.TotalMinutes);
}
VB.NET-Quelltext
Sub Main()
	' ein paar Möglichkeiten, einen TimeSpan zu erzeugen
	Dim d1 As DateTime = new DateTime(2010, 1, 1)
	Dim t1 As TimeSpan = DateTime.Now - d1     ' Abstand vom Jahresanfang 2010
	Write(t1)
	t1 = DateTime.Now - DateTime.Today  ' Abstand seit Tagesanfang
	Write(t1)
	t1 = New TimeSpan(500000000000)     ' Anzahl der Ticks
	Write(t1)
	t1 = New TimeSpan(3, 16, 0)         ' Std., Min., Sek.
	Write(t1)
	t1 = New TimeSpan(2, 8, 0, 0)       ' Tage, Std., Min., Sek.
	Write(t1)
	Console.ReadKey()
End Sub

Sub Write(d0 As TimeSpan)
	' mehrere Möglichkeiten, die Bestandteile anzuzeigen
	Console.WriteLine(d0)
	Console.WriteLine( String.Format("   {0} Tage   {1} Std.   {2} min.   {3} sek.", _
	                               d0.Days, d0.Hours, d0.Minutes, d0.Seconds) )
        Console.Write("   TotalDays ..: ")
	Console.WriteLine(d0.TotalDays)
        Console.Write("   TotalHours .: ")
	Console.WriteLine(d0.TotalHours)
        Console.Write("   TotalMinutes: ")
	Console.WriteLine(d0.TotalMinutes)
End Sub
Crystal Clear app terminal.png Ausgabe
13:16:45.2968750
   0 Tage   13 Std.   16 min.   45 sek.
   TotalDays ..: 0,553302047164352
   TotalHours .: 13,2792491319444
   TotalMinutes: 796,754947916667

Diese Ausgabe zeigt einige Möglichkeiten am Beispiel "Abstand seit Tagesanfang".

Berechnungen[Bearbeiten]

Mit DateTime- und TimeSpan-Werten können die unterschiedlichsten Berechnungen erledigt werden.

Vergleich zweier DateTime-Werte

Zwei DateTime-Werte können voneinander subtrahiert werden; das Ergebnis ist ein TimeSpan-Wert. Je nachdem, welches Datum früher und welches später liegt, ist das Ergebnis positiv, 0 oder negativ.

Der erste TimeSpan im vorigen Code-Beispiel ist auf diese Weise entstanden.

Einen Wert verändern

Es gibt diverse Methoden wie Add, AddYears, AddDays, AddSeconds, mit denen ein DateTime-Wert um eine genaue Zeitspanne (durch einen TimeSpan) oder um eine Anzahl Jahre, Tage, Sekunden usw. verändert werden kann. Die Zeitspanne bzw. Anzahl kann auch negativ sein: Bei einem positiven Wert geht man in Richtung Zukunft, bei einem negativen Wert in Richtung Vergangenheit.

In gleicher Weise gibt es Methoden wie Add, Subtract usw., mit denen ein TimeSpan-Wert verändert werden kann.

Hinweis: Bei DateTime- und TimeSpan-Werten handelt es sich um Wertetypen. Das Ergebnis ist also immer ein neuer Wert, auch wenn es derselben Variablen zugewiesen wird.

Datum und Zeit verknüpfen

Es kommt immer wieder vor, dass ein Datum mit einer Uhrzeit zusammengefasst werden soll.

Für WinForms-Anwendungen gibt es den DateTimePicker, mit dem entweder ein Datum oder eine Uhrzeit ausgewählt werden kann. Man braucht also zwei Controls: Bei der Variante Datum erhält man mit DateTimePicker.Value das Datum mit der Uhrzeit 00:00:00, bei der Variante Uhrzeit erhält man damit die Uhrzeit zusammen mit dem aktuellen Datum. Dann ist das Datum mit der Zeit zu verbinden.

Für diese Aufgabe gibt es eine umständliche Lösung, für die der gesuchte DateTime-Wert aus den Einzelteilen zusammengesetzt wird (Variante 1), und eine praktische Lösung, die passende Möglichkeiten von DateTime benutzt (Variante 2):

C#-Quelltext
static void Main(string[] args)
{
	DateTime d1 = new DateTime(2010, 5, 21);  // ein bestimmtes Datum 
	DateTime d2 = DateTime.Now;               // eine bestimmte Zeit
	Console.WriteLine(d1);
	Console.WriteLine(d2);
	// Variante 1: Bestandteile zusammensetzen
	DateTime d3 = new DateTime(d1.Year, d1.Month, d1.Day,
	                           d2.Hour, d2.Minute, d2.Second);
	Console.WriteLine(d3);
	// Variante 2: beides verbinden
	d3 = d1.Add(d2.TimeOfDay);
	Console.WriteLine(d3);
	Console.ReadKey();
}
VB.NET-Quelltext
Sub Main()
	Dim d1 As DateTime = new DateTime(2010, 5, 21)  ' ein bestimmtes Datum 
	Dim d2 As DateTime = DateTime.Now               ' eine bestimmte Zeit
	Console.WriteLine(d1)
	Console.WriteLine(d2)
	' Variante 1: Bestandteile zusammensetzen
	Dim d3 As DateTime = new DateTime(d1.Year, d1.Month, d1.Day, _
	                                  d2.Hour, d2.Minute, d2.Second)
	Console.WriteLine(d3)
	' Variante 2: beides verbinden
	d3 = d1.Add(d2.TimeOfDay)                       
	Console.WriteLine(d3)
	Console.ReadKey()
End Sub
Crystal Clear app terminal.png Ausgabe
21.05.2010 00:00:00   // das Datum
10.03.2010 17:28:03   // die Uhrzeit mit "irgendeinem" Datum
21.05.2010 17:28:03   // beides verknüpft

Weitere Beispiele werden unter Rechnen mit Datum und Zeit behandelt. Mehr Informationen sind natürlich in der .NET-Hilfe zu finden.

Point, Size[Bearbeiten]

Als Beispiele für weitere Wertetypen sollen hier System.Drawing.Point und System.Drawing.Size genannt werden, die vor allem für WinForms-Anwendungen von Bedeutung sind.

Der Datentyp Point steht für ganzzahlige (x,y)-Koordinaten (genauer: vom Typ Int32) und bezeichnet einen Punkt, z.B. die Position eines Pixels auf dem Bildschirm oder beim Ausdruck auf dem Papier. Er enthält den X-Wert und den Y-Wert und bietet Verfahren zum Rechnen mit Punkten, z.B. zum Verschieben.

Der Datentyp Size speichert ein geordnetes Paar (x,y) ganzer Zahlen und bezeichnet meistens Breite und Höhe eines Rechtecks. Er enthält den Width-Wert und den Height-Wert und bietet Verfahren zum Rechnen mit diesen Größen.

Im folgenden Beispiel zeigen wir ein paar Möglichkeiten, um aus einem gegebenen Punkt einen neuen zu berechnen; dabei wird Size für die Größe der Verschiebung benutzt. Fügen Sie dazu im Projekt-Explorer per Rechtsclick auf "Referenzen" einen Verweis auf die Assembly System.Drawing.dll hinzu.

C#-Quelltext
using System;
using System.Drawing;

namespace Wikibooks.CSharp.ConsoleApp
{
	class Program
	{
		static void Main(string[] args)
		{
			Point start = new Point(100, 50);
			Console.WriteLine(start);
			Point final = start + new Size(200, 50);
			Console.WriteLine(final);
			final = Point.Add(final, new Size(130, 30) );
			Console.WriteLine(final);
			final.X = final.X  30;
			Console.WriteLine(final);
			Console.ReadKey();
		}
	}
}
VB.NET-Quelltext
Imports System
Imports System.Drawing

Namespace Wikibooks.VBNet.ConsoleApp
	Module Program
		Sub Main()
			Dim start As Point = new Point(100, 50)
			Console.WriteLine(start)
			Dim final As Point = start + new Size(200, 50)
			Console.WriteLine(final)
			final = Point.Add(final, new Size(130, 30) )
			Console.WriteLine(final)
			final.X = final.X - 30
			Console.WriteLine(final)
			Console.ReadKey()
		End Sub
	End Module
End Namespace
Crystal Clear app terminal.png Ausgabe
{X=100,Y=50}
{X=300,Y=100}
{X=430,Y=130}
{X=400,Y=130}

Übrigens gibt es auch die Typen PointF und SizeF, die Koordinaten bzw. Größe mit Single-Werten speichern.

Zusammenfassung[Bearbeiten]

Es gibt noch viele weitere Datentypen. Beispielhaft haben wir kennengelernt:

  • Boolean steht für die logischen Werte true/false und dient zur Steuerung im Programmablauf.
  • DateTime enthält einen Zeitpunkt mit Datum und/oder Uhrzeit, TimeSpan bezeichnet eine Zeitdauer.
  • Point und Size werden z.B. für Positionen und Größen auf dem Bildschirm verwendet.

Alle diese Datentypen sind Strukturen und somit Wertetypen.

Übungen[Bearbeiten]

Übung 1 Der Datentyp Boolean Zur Lösung

Welche der folgenden Aussagen sind wahr, welche sind falsch?

  1. Der Boolean-Datentyp ist ein Wertetyp.
  2. Eine Boolean-Variable kann die Werte wahr, falsch, unbekannt annehmen.
  3. Der Wert true entspricht der Zahl 1, der Wert false der Zahl 0.
  4. Einer booleschen Variable kann ein Wert dadurch zugewiesen werden, dass das Ergebnis einer Prüfung auf Gleichheit bestimmt wird.
  5. Einer booleschen Variable kann ein Wert dadurch zugewiesen werden, dass das Ergebnis einer Prüfung auf "größer/gleich" bestimmt wird.
  6. Das Ergebnis einer Prüfung kann zur Steuerung des Programmablaufs verwendet werden.
  7. Für diese Prüfung muss eine einzelne Prüfung (keine Kombination von Prüfung) eingesetzt werden.

Übung 2 Datum und Zeit – Definition Zur Lösung

Welche der folgenden Aussagen sind wahr, welche sind falsch?

  1. Der Datentyp DateTime stellt ein Datum mit Uhrzeit dar.
  2. Der Datentyp DateTime ist ein Referenztyp.
  3. Der Datentyp DateTime speichert die Tage als ganze Zahl und die Uhrzeit als Bruchteil (Dezimalanteil) eines Tages.
  4. Der Datentyp TimeSpan ist ein Wertetyp.
  5. Der Datentyp TimeSpan speichert die Dauer als ganze Zahl.
  6. Der Datentyp DateTime kann auch negative Werte enthalten.
  7. Der Datentyp TimeSpan kann auch negative Werte enthalten.
  8. Wenn man einen DateTime-Wert von einem anderen DateTime-Wert subtrahiert, erhält man einen neuen DateTime-Wert.
  9. Mit Day bekommt man das Datum, das in einem DateTime-Wert enthalten ist.
  10. Mit Time bekommt man die Uhrzeit, die in einem DateTime-Wert enthalten ist.
  11. Mit Day bekommt die Anzahl der Tage eines TimeSpan-Wertes.
  12. Bei einem DateTime-Wert kann zwischen der lokalen Uhrzeit und der UTC unterschieden werden.
  13. Bei einem TimeSpan-Wert kann zwischen der lokalen Uhrzeit und der UTC unterschieden werden.

Übung 3 Datum und Zeit – Verarbeitung Zur Lösung

Erstellen Sie ein Programm zur Altersbestimmung. Gehen Sie dazu wie folgt vor:

  1. Deklarieren Sie Variable für Ihre Geburt und das heutige Datum sowie eine Variable für das Alter (wie üblich als Jahr).
  2. Lassen Sie die Uhrzeit der Geburt ausgeben.
  3. Berechnen Sie das aktuelle Alter. Fügen Sie dabei mit if insgesamt drei Bedingungen ein, ob der Geburtstag im laufenden Jahr schon vorbei ist oder nicht. (Die Bedingungen können einzeln oder verknüpft angegeben sein.) Lassen Sie das Ergebnis ausgeben.
  4. Lassen Sie einen Glückwunsch ausgeben, wenn heute Geburtstag ist.
  5. Lassen Sie das Geburtsdatum ausgeben unter Einschluss des Wochentags.

Benutzen Sie Console.Write für die Ausgabe fester Texte und Variabler; nur dort, wo die Zeile zu Ende ist, wird Console.WriteLine verwendet.

Übung 4 Die Typen Point und Size Zur Lösung

Welche der folgenden Aussagen sind richtig, welche sind falsch?

  1. Ein Point enthält zwei Werte vom Typ Int16.
  2. Die Bestandteile eines Point-Wertes stehen für die (x,y)-Koordinaten eines Punktes.
  3. Die Bestandteile eines Point-Wertes werden als X-Wert und Y-Wert benutzt.
  4. Ein Size enthält zwei Werte vom Typ Int16.
  5. Die Bestandteile eines Size-Wertes stehen z.B. für die Breite und Höhe eines Rechtecks.
  6. Die Bestandteile eines Size-Wertes werden als X-Wert und Y-Wert benutzt.
  7. Zu einem Point-Wert kann ein Size-Wert addiert werden; dies führt zu einem entsprechend verschobenen Point-Wert.
  8. Ein Point-Wert kann nicht dadurch geändert werden, dass der X-Wert direkt geändert wird.
Lösungen

Lösung zu Übung 1 Der Datentyp Boolean Zur Übung

Die Aussagen 1, 4, 5, 6 sind richtig, die Aussagen 2, 3, 7 sind falsch.

Lösung zu Übung 2 Datum und Zeit – Definition Zur Übung

Die Aussagen 1, 4, 5, 7, 12 sind richtig, die Aussagen 2, 3, 6, 8, 9, 10, 11, 13 sind falsch.

Lösung zu Übung 3 Datum und Zeit – Verarbeitung Zur Übung

Bei Nummer 3 muss einer der Teile a, b, c gültig sein, die beiden anderen fehlen bzw. müssen auskommentiert werden.

C#-Quelltext
static void Main(string[] args)
{
	// 1. Deklarationen
	DateTime today = DateTime.Now;
	DateTime birth = new DateTime(1963, 11, 27, 2, 30, 0);
	int alter;

	// 2. Geburtszeit
	Console.Write("Die Geburtszeit war: ");
	Console.WriteLine(birth.TimeOfDay);

	// 3. das aktuelle Alter
	alter = today.Year - birth.Year;
	// 3a. drei Bedingungen nacheinander
//	if ( today.Month < birth.Month ) {
//		alter = alter - 1;
//	} else if ( today.Month == birth.Month ) {
//		if (today.Day < birth.Day)
//			alter = alter - 1;
//	}
	// 3b. zwei Bedingungen nacheinander
	if ( today.Month < birth.Month ) {
		alter = alter - 1;
	} else if ( today.Month == birth.Month && today.Day < birth.Day) {
		alter = alter - 1;
	}
	// 3c. drei Bedingungen zusammen
//	if ( ( today.Month < birth.Month )
//	    	|| (today.Month == birth.Month && today.Day < birth.Day) ) {
//		alter = alter - 1;
//	}
	Console.Write("Das aktuelle Alter beträgt: ");
	Console.Write(alter);
	Console.WriteLine(" Jahre.");

	// 4. ist heute Geburtstag?
	if ( today.Month == birth.Month && today.Day == birth.Day ) {
		Console.WriteLine("Herzlichen Glückwunsch zum heutigen Geburtstag!");
	}

	// 5. der Geburtstag in Langfassung
	Console.WriteLine(birth.ToLongDateString());
	Console.ReadKey();
}
VB.NET-Quelltext
Sub Main()
	' 1. Deklarationen
	Dim today As DateTime = DateTime.Now
	Dim birth As DateTime = new DateTime(1963, 11, 27, 2, 30, 0)
	Dim alter As Integer
		
	' 2. Geburtszeit
	Console.Write("Die Geburtszeit war: ")
	Console.WriteLine(birth.TimeOfDay)
			
	' 3. das aktuelle Alter
	alter = today.Year - birth.Year
	' 3a. drei Bedingungen nacheinander
'	If ( today.Month < birth.Month ) Then
'		alter = alter - 1
'	Else If ( today.Month = birth.Month ) Then
'		If (today.Day < birth.Day)
'			alter = alter - 1
'		End If
'	End If
	' 3b. zwei Bedingungen nacheinander
	If ( today.Month < birth.Month ) Then
		alter = alter - 1
	Else If ( today.Month = birth.Month And today.Day < birth.Day) Then
		alter = alter - 1
	End If
	' 3c. drei Bedingungen zusammen
'	If ( ( today.Month < birth.Month ) _
'	  	Or (today.Month = birth.Month And today.Day < birth.Day) ) Then
'		alter = alter - 1
'	End If
	Console.Write("Das aktuelle Alter beträgt: ")
	Console.Write(alter)
	Console.WriteLine(" Jahre.")

	' 4. ist heute Geburtstag?
	If ( today.Month = birth.Month And today.Day = birth.Day ) Then
		Console.WriteLine("Herzlichen Glückwunsch zum heutigen Geburtstag!")
	End If
	
	' 5. der Geburtstag in Langfassung
	Console.WriteLine(birth.ToLongDateString())
	Console.ReadKey()
End Sub

Lösung zu Übung 4 Die Typen Point und Size Zur Übung

Die Aussagen 2, 3, 5, 7 sind richtig, die Aussagen 1, 4, 6, 8 sind falsch.


  1. Der Begriff Boolean ist nach dem Mathematiker George Boole, dem Begründer der booleschen Algebra, benannt.