Samstag, 1. Dezember 2012

Primitive Datentypen - Variablen - Part 2

Hallo zusammen und herzlich willkommen bei der Fortsetzung zum Thema Variablen und primitive Datentypen!

Letztes Mal sind wir soweit gekommen, dass wir eine int-Variable mit 2 addiert haben und die Ergebnisse vor und nach der Addition ausgegeben haben.

In diesem Post schauen wir uns auch die anderen primitiven Datentypen genauer an, denn bei fast jedem Datentyp gibt es eine Besonderheit, die es zu beachten gilt.

Bis jetzt haben wir erst den Datentyp int genauer angeschaut. Doch wie sieht es z. B. bei dem ebenfalls häufig genutzten Datentyp double aus?
Wie aus der Tabelle des vorletzten Posts zu entnehmen ist, kann dieser sog. Gleitkommazahlen speichern, d. h. er speichert Zahlen mit einer bestimmten Anzahl an Dezimalstellen. Doch wenn wir einen double erstellen und diesen mit der uns in Deutschland üblichen Schreibweise initialisieren, also z. B. 3,234, werden wir uns über die Rechenergebnisse wundern, denn im englischen entspricht ein Komma einem Punkt und umgekehrt. Um also einer Variablen vom Typ double einen Wert zuzuweisen, müssen wir statt "2,234" "2.234" schreiben, also

double d = 2.234;
Wenn wir allerdings versuchen, einem float oder einem decimal, die ja auch Gleitkommazahlen speichern, den Wert auf die gleiche Schreibweise zuzuweisen, führt das aber zu einem Fehler:
Literale vom Typ "Double" können nicht implizit in den Typ "float" konvertiert werden. Verwenden Sie ein F-Suffix, um ein Literal mit diesem Typ zu erstellen.
Dieser Fehler tritt deswegen auf, da eine Gleitkommazahl in C# implizit (automatisch) ein double ist. Da der Computer aber nicht einfach so einen double in einen float oder decimal umwandeln kann, muss das mit unserer Hilfe geschehen. Das geht auf die verschiedensten Arten, die gängigste ist aber, einem float-Zuweisungswert ein f/F und einem decimal-Zuweisungswert ein m/M anzuhängen, also z. B.
float f = 2.234f;

Als nächstes wollen wir uns den Datentyp bool anschauen. Auf den ersten Blick kann man ihn fast nicht gebrauchen, da er nur 2 Werte, nämlich true und false speichern kann. Doch der erste Blick täuscht, denn dieser Datentyp wird im nächsten Post noch sehr wichtig werden, denn mit ihm kann man Bedingungen überprüfen.
Einem bool einem Wert zuzuweisen funktioniert nicht anders als bei anderen Datentypen:

bool b = true;

Auch ihm können wir Ausdrücke zuweisen, die allerdings etwas anders funktionieren, als beispielsweise bei einem int. Bei einem int können wir beispielsweise folgendes schreiben:

int i = 5 - 2;

Der int beinhaltet jetzt den Wert 3. Um einem bool mit einem sog. booleschen Ausdruck einen Wert zuzuweisen, müssen die Ausdrücke immer eine Bedingung aufstellen. Wenn diese Bedingung sich als falsch erweist, bekommt der bool den Wert false andernfalls true. Ein Beispiel. Wir nehmen zweimal einen int, weisen ihnen Werte zu und vergleichen die Werte:

int i = 5 - 2;
int j = 5 + 8;
bool b = i > j;

Wir haben zweimal einen int mit den Werten 3 und 13. Im booleschen Ausdruck wird überprüft, ob i größer ist als j. Da dies falsch ist, bekommt der boolesche Datentyp b den Wert falsch zugewiesen, was man auch mit einer Konsolenausgabe überprüfen kann:

Console.WriteLine(b);

Das "Ist-Kleiner-Als"-Zeichen (<) würde true ergeben. Dann gibt es noch die Möglichkeiten auf Kleiner-Gleich (<=), Größer-Gleich (>=), Ist-Ungleich (!=) und Ist-Gleich (==). Besonders beim Ist-Gleich ist darauf zu achten, dass man zweimal ein Gleichheitszeichen schreibt, da ein einfaches Gleichheitszeichen den Zuweisungsoperator und nicht den Vergleichsoperator darstellt! Man kann hiermit fast alles vergleichen, also auch string und andere Klassen.

Beim Datentyp string gibt es auch ein paar Regeln:
Der Text, mit dem man eine string-Variable initialisiert, wird in Anführungsstrichen angegeben und darf nicht einfach so geschrieben werden:

string s = "Hallo";

Was macht man aber, wenn man in der Zeichenkette ein Anführungszeichen enthalten haben will? Dazu gibt es die Escape-Sequenzen. Wenn wir ein Anführungszeichen haben will, ohne dass der string damit beendet wäre, schreiben wir einfach \" (Backslash und kein Slash!), um einen Zeilenumbruch zu erzeugen, schreiben wir in Windows \n (für New Line), um einen Backslash in der Zeichenkette zu haben, ist ein doppelter Backslash nötig (\\). Eine Liste der Escape-Sequenzen:

Escapesequenz
Beschreibung
\’xe »_
Einfaches Anführungszeichen
\\"
Doppeltes Anführungszeichen
\\
Umgekehrter Schrägstrich (Backslash)
\0
Null
\a
Alert (Warnung)
\b
Rückschritt
\f
Vorschub
\n
Neue Zeile
\r
Wagenrücklaufzeichen
\t
Tabulator
\v
Vertikaler Tabulator
\xdddd
Zeichen dddd, wobei d für eine Hexadezimalstelle steht

Was passiert, wenn ich einen string mit einem anderen addiere? Die Zeichenfolgen werden aneinander gehängt, auch wenn sie Zahlen enthalten.

string s = "Hallo";
string t = "Welt";
string vollständig = s + " " + t;
Console.WriteLine(vollständig);

Hier wird "Hallo Welt" ausgegeben. Das Leerzeichen, welches nach s eingefügt wird ist notwendig, um nicht die Ausgabe "HalloWelt" zu erzielen. Alternativ zur oben gezeigten Variante können wir auch den string in der WriteLine-Mehtode zusammenfügen, also:

Console.WriteLine(s + " " + t);

Es ist außerdem möglich, in der Console.WriteLine()- und in der Console.Write()-Methode Platzhalter für Variablen zu erschaffen:

Console.WriteLine("{0} {1}", s, t);
Die erste Variable nach dem Komma, die auch jeder andere Typ sein kann, also z. B. ein int oder float (sie werden automatisch von der Methode WriteLine() in ein string umgewandelt), bekommt den Platzhalter 0 zugewiesen, der 2. Platzhalter (also {1}) bekommt die zweite Variable zugewiesen, usw. Die Platzhalter müssen natürlich nicht nach der Reihenfolge angeordnet sein, also ist auch folgendes möglich:

Console.WriteLine("{1} {0}", s, t);
Hier wird allerdings die Reihenfolge vertauscht, die Ausgabe ist "Welt Hallo". 
Auch zweimal der gleich Platzhalter ist erlaubt:
Console.WriteLine("{0} {0}", s, t);
Hier wird "Hallo Hallo" ausgegeben.
Im nächsten Schritt programmieren wir einen kleinen Konsolen-Taschenrechner, der nur die Addition beherrscht. Der Programmcode ist mit Kommentaren versehen und erklärt sich daher selbst:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Taschenrechner
{
    class Program
    {
        static void Main(string[] args)
        {
            //Deklaration von der int-Variablen "zahl1"
            int zahl1;
            //Konsolenausgabe mit dem Text "Bitte geben Sie die erste Zahl ein" und nachfolgendem Zeilenumbruch
            Console.WriteLine("Bitte geben Sie die erste Zahl ein:");
            /********************************************************************************************************************************
             * Initialisierung der Variablen zahl1 mit dem vom Benutzer eingegebenem Wert.
             * Da die Methoden "ReadLine" und "Read" einen String liefern, muss dieser umgewandelt werden.
             * Das geschieht über die statische Klasse (auch Console ist eine solche) Convert
             * In dieser Klasse gibt es verschiedene Methoden, mit Hilfe derer man verschiedene primitive Datentypen in andere umwandeln kann
             * Wir nutzen hier die Methode "ToInt32", da wir den Text in einen int verwandeln müssen
             ********************************************************************************************************************************/
            zahl1 = Convert.ToInt32(Console.ReadLine());
            //Konsolenausgabe wie oben
            Console.WriteLine("Bitte geben Sie nun die zweite Zahl ein:");
            //Deklaration und Initialisierung von zahl2
            int zahl2 = Convert.ToInt32(Console.ReadLine());
            //Ausgabe des Ergebnisses. Es gelten die mathematischen Regeln. Damit hier nicht einfach nur zahl1 und zahl2 in strings umgewandelt werden
            //und dann ausgegeben werden und so bei einer Eingabe von 1 + 1 als Ergebnis 11 herauskommt, muss um diese Rechnung eine Klammer gesetzt werden,
            //damit erst das Ergebnis als int ausgerechnet wird und dann in einen string umgewandelt und ausgegeben wird
            Console.WriteLine("Ergebnis: " + (zahl1 + zahl2));
            //Alternativ dazu könnte man auch, wie folgt, eine neue Variable "ergebnis" deklarieren und ihr den Term zahl1 + zahl2 zuweisen
            //und diese Variable dann ausgeben:
            int ergebnis = zahl2 + zahl1; //Die Reihenfolge spielt hier wegen des Distributivgesetzes keine Rolle
            Console.WriteLine("Ergebnis: " + ergebnis); 
            //Und damit sich die Konsole nicht gleich wieder schließt...
            Console.ReadKey();
        }
    }
}
Da hier einige Kommentarzeilen zu lang waren, wurden sie in zwei Zeilen aufgeteilt, wodurch hier Fehler entstanden.
Wenn man hier eine Zahl eingibt, die größer als der Wertebereich eines int ist, wird eine sog. Exception geworfen. Da das Thema Exceptionbehandlung erst später durchgenommen wird, muss man sich mit dem Wertebereich begnügen oder einen anderen Datentyp wählen, was aber auch andere Codeänderungen nach sich trägt.
Dieser Taschenrechner ist sicherlich nicht der beste, aber immerhin kann er Addieren. Für diesen Post sind wir fertig mit dem Projekt. Herzlichen Glückwunsch.
Im nächsten Post geht es um die if-Anweisung, mit deren Hilfe wir auch die anderen Grundrechenarten in den Taschenrechner einbauen können.
Bis dahin,
Julian

Keine Kommentare:

Kommentar veröffentlichen