Zum Inhalt
wannacode

Variablen und Typen

Kurz gesagt: Eine Variable ist ein Platz im Speicher mit Name, Typ und Wert; der Typ sagt, was sie speichert: int eine ganze Zahl, double eine Kommazahl, bool ja oder nein, string Text.

Problem

Der Preis steht an drei Stellen

In einem Onlineshop taucht ein Preis an mehreren Stellen auf: im Katalog, im Warenkorb und an der Kasse. Steht er überall als Zahl da, passiert Folgendes:

Console.WriteLine("Kopfhörer: 49.90 €");
Console.WriteLine("Im Warenkorb: Kopfhörer, 49.90 €");
Console.WriteLine("Zu zahlen: 49.90 €");

Morgen sind die Kopfhörer im Angebot. Du musst jedes 49.90 finden und ändern. Vergisst du eins, sieht der Kunde zwei verschiedene Preise.

Die Idee

Eine Variable: ein Name für einen Wert

Schreib den Preis einmal hin und gib ihm einen Namen. Danach schreibst du überall den Namen.

double price = 49.90;
Console.WriteLine("Kopfhörer: " + price + " €");
Console.WriteLine("Im Warenkorb: Kopfhörer, " + price + " €");
Console.WriteLine("Zu zahlen: " + price + " €");
Ausgabe
Kopfhörer: 49.9 €
Im Warenkorb: Kopfhörer, 49.9 €
Zu zahlen: 49.9 €

double price = 49.90; erzeugt eine Variable: einen Platz im Speicher mit einem Namen (price), einem Typ (double, eine Kommazahl) und einem Wert (49.90). Wo im Code price steht, holt das Programm den Wert von dort.

+ zwischen Text und einem Wert verbindet beide zu einem Text. Deshalb stehen die Leerzeichen innerhalb der Anführungszeichen.

Die Null am Ende ist verschwunden: Aus 49.90 wurde 49.9. Für die Zahl ist das dasselbe. Wie du den Preis mit zwei Nachkommastellen zeigst, siehst du in der Lektion über Eingabe und Ausgabe.

Genauer, für Neugierige
  • Ein Name beginnt mit einem Buchstaben und hat keine Leerzeichen. Schreib ihn klein und beginne jedes weitere Wort mit einem Großbuchstaben: price, pricePerNight. Groß- und Kleinbuchstaben zählen: price und Price sind zwei verschiedene Namen.
  • Die Sprache erlaubt auch Namen mit Umlauten (größe), aber tu es nicht. Code auf der ganzen Welt hat lateinische Namen ohne Sonderzeichen, und so schreiben auch deine Kollegen.
  • Eine Variable, der du noch keinen Wert gegeben hast, kannst du nicht benutzen. Der Compiler bricht mit einem Fehler ab.
  • Wenn dein Computer 49,9 mit Komma ausgibt, liegt das an den deutschen (oder anderen europäischen) Regionaleinstellungen. C# folgt ihnen, wenn es eine Zahl in Text umwandelt. Die Beispiele im Kurs verwenden einen Punkt.

Die Idee

Arten von Werten

Der Typ sagt, was die Variable speichern kann. Das sind die wichtigsten:

string name = "Rucksack";
double price = 39.90;
int stock = 12;
bool onSale = true;
char size = 'M';
Console.WriteLine(name + ", Größe " + size);
Console.WriteLine("Preis: " + price + " €");
Console.WriteLine("Auf Lager: " + stock + " Stück");
Console.WriteLine("Im Angebot: " + onSale);
Ausgabe
Rucksack, Größe M
Preis: 39.9 €
Auf Lager: 12 Stück
Im Angebot: True
  • int: eine ganze Zahl, zum Beispiel eine Anzahl.
  • double: eine Kommazahl, zum Beispiel ein Preis oder ein Gewicht. Im Code ist das Dezimaltrennzeichen ein Punkt: 39.90.
  • bool: ja oder nein, true oder false.
  • char: ein Zeichen, in einfachen Anführungszeichen: 'M'.
  • string: Text, in doppelten Anführungszeichen: "Rucksack". Das ist ein String (eine Zeichenkette), eine Folge von Zeichen.

true im Code wird als True ausgegeben. So wandelt C# boolesche Werte in Text um.

Genauer, für Neugierige

string ist ein anderer Name für System.String. Die primitiven Typen (int, double, bool, char und so weiter) speichern den Wert selbst. string ist ein Referenztyp: Die Variable speichert einen Verweis auf den Text. Der Unterschied wird im Modul „Klassen und Objekte“ wichtig.

Die Zahlentypen und die anderen primitiven Typen in C#:

Typ Größe Werte
byte 1 Byte von 0 bis 255 (ohne Vorzeichen)
sbyte 1 Byte von -128 bis 127
short 2 Byte von -32 768 bis 32 767
ushort 2 Byte von 0 bis 65 535 (ohne Vorzeichen)
int 4 Byte von -2 147 483 648 bis 2 147 483 647
uint 4 Byte von 0 bis 4 294 967 295 (ohne Vorzeichen)
long 8 Byte von -9 223 372 036 854 775 808 bis 9 223 372 036 854 775 807
ulong 8 Byte von 0 bis 18 446 744 073 709 551 615 (ohne Vorzeichen)
float 4 Byte Kommazahl, bis etwa ±3,4 · 10³⁸, etwa 6 bis 9 gültige Ziffern
double 8 Byte Kommazahl, bis etwa ±1,8 · 10³⁰⁸, etwa 15 bis 17 gültige Ziffern
decimal 16 Byte Kommazahl, bis etwa ±7,9 · 10²⁸, 28 bis 29 gültige Ziffern, exakt im Zehnersystem
char 2 Byte ein Unicode-Zeichen, Codes von 0 bis 65 535
bool 1 Byte true oder false

u im Namen steht für unsigned, ohne Vorzeichen: nur null und positive Zahlen. byte hat kein Vorzeichen, auch ohne u, und seine Variante mit Vorzeichen ist sbyte. decimal ist der Typ für Geld. double speichert Zahlen im Binärsystem, und manche Kommazahlen wie 0.1 lassen sich nicht exakt darstellen. Bei einer Summe aus Tausenden Zahlungen sammeln sich diese kleinen Unterschiede an.

Eine Zahl im Code ist ein int oder ein double, außer du sagst etwas anderes. L am Ende macht eine Zahl zum long, f zum float, m zum decimal. Ohne m lässt sich die Zeile decimal balance = 1250.75; nicht kompilieren. Unterstriche zwischen den Ziffern machen sie nur besser lesbar:

long population = 8_100_000_000L;
float weight = 1.5f;
decimal balance = 1250.75m;
Console.WriteLine(population + " " + weight + " " + balance);
Ausgabe
8100000000 1.5 1250.75

Probier es aus

Finde den Fehler

Das Programm soll einen Einkauf ausgeben. Es lässt sich nicht kompilieren. In welcher Zeile ist der Fehler?

Wähle die Zeile mit dem Fehler.

Die Idee

= speichert eine Kopie

Das Zeichen = ist nicht „gleich“ wie in der Mathematik. Es bedeutet: Nimm den Wert rechts und speichere ihn in die Variable links. Das heißt Zuweisung. Der alte Wert der Variable ist weg.

Steht rechts eine andere Variable, wird eine Kopie ihres Werts in diesem Moment gespeichert. Die beiden Variablen bleiben nicht verbunden:

int seats = 40;
int seatsAtStart = seats;
seats = 37;
Console.WriteLine("Am Anfang: " + seatsAtStart);
Console.WriteLine("Jetzt: " + seats);
Ausgabe
Am Anfang: 40
Jetzt: 37

seatsAtStart bekommt 40. Danach wird seats zu 37, aber die Kopie in seatsAtStart bleibt 40.

Probier es aus

Welcher Wert bleibt?

Was gibt das Programm aus?

int roomA = 12;
int roomB = 20;
roomA = roomB;
roomB = 25;
Console.WriteLine(roomA + " und " + roomB);
Antwort

Problem

Die Maße sind vertauscht

Ein Programm für Fotoabzüge bekommt die Maße vertauscht: Breite 120 und Höhe 80, dabei sollten sie 80 x 120 sein. Es sieht so aus, als müsstest du nur das eine ins andere speichern und zurück:

int width = 120;
int height = 80;
width = height;
height = width;
Console.WriteLine(width + " x " + height);
Ausgabe
80 x 80

Herausgekommen ist 80 x 80. Wo ist die 120 geblieben?

Sieh es dir an

Tauschen mit einer Hilfsvariable

int width = 120;
int height = 80;
int temp = width;
width = height;
height = temp;
Console.WriteLine(width + " x " + height); // 80 x 120
Schritt für Schritt, in Worten
  1. Breite und Höhe wurden vertauscht eingegeben: 120 und 80.
  2. temp = width: Eine Kopie von 120 kommt in temp. In width bleibt 120.
  3. width = height: Eine Kopie von 80 kommt in width. Die alte 120 ist dort weg, aber in temp gesichert.
  4. height = temp: 120 kommt aus temp zurück in height.
  5. Getauscht: 80 x 120.

In der naiven Version speichert width = height die 80 in width, und die alte 120 ist weg. Wenn danach height = width kommt, steht in width schon 80, und die wird zurückkopiert.

Die Lösung ist eine dritte Variable, eine Hilfsvariable temp. Sie hebt die 120 auf, bevor width überschrieben wird. Danach kommt die 120 aus temp in height, und die Maße sind 80 x 120.

Probier es aus

Bring den Tausch in die richtige Reihenfolge

Im Shop tauschen zwei Kollegen ihre Schichten. morning ist „Ivan“, und evening ist „Maria“. Bring die Zeilen in die richtige Reihenfolge, damit die beiden tauschen.

  1. evening = temp;
  2. Console.WriteLine("Morgens: " + morning + ", abends: " + evening);
  3. morning = evening;
  4. string temp = morning;

Die Idee

var: der Typ wird abgeleitet

Wenn der Typ am Wert zu erkennen ist, kannst du stattdessen var schreiben:

var city = "Plovdiv";
var nights = 3;
var pricePerNight = 65.0;
Console.WriteLine(city + ": " + nights + " Nächte zu je " + pricePerNight + " €");
Ausgabe
Plovdiv: 3 Nächte zu je 65 €

Der Compiler erkennt selbst, dass "Plovdiv" Text ist, 3 ein int und 65.0 ein double. Das heißt Typinferenz (type inference).

var bedeutet nicht „kein Typ“. Der Typ wird vom ersten Wert bestimmt und ändert sich danach nicht:

var nights = 3;
nights = "drei";
Meldung des Compilers
error CS0029: Cannot implicitly convert type 'string' to 'int'

Im Kurs schreiben wir den Typ meistens ausdrücklich hin, damit du ihn siehst.

Genauer, für Neugierige
  • var braucht sofort einen Wert: var nights; lässt sich nicht kompilieren, weil der Typ nirgends herzuleiten ist.
  • var gibt es nur für Variablen innerhalb von Main (und in den anderen Methoden, die im Modul „Methoden“ kommen).
  • C# hat auch dynamic: Damit wird der Typ erst geprüft, während das Programm läuft, nicht beim Kompilieren. Es wird selten verwendet, für Daten aus anderen Systemen. Im Kurs brauchen wir es nicht.

Übung

Deine Variablen

Löse die Aufgaben in deinem Editor. Die Werte stehen im Code, ohne Eingabe über die Tastatur. Das Einlesen kommt in der nächsten Lektion.

1. Tausch. Im oberen Regal stehen 15 Bücher, im unteren 27. Speichere sie in zwei Variablen, tausche ihre Werte und gib sie vorher und nachher aus.

Ausgabe
Vorher: oben 15, unten 27
Nachher: oben 27, unten 15

2. Alter. Speichere einen Namen und ein Alter in zwei Variablen und gib sie in einem Satz aus.

Ausgabe
Maria ist 19 Jahre alt.

3. Eine Hotelkarte. Speichere in Variablen den Namen des Hotels (Text), die Sterne (eine ganze Zahl), die Bewertung (eine Kommazahl), ob es Frühstück gibt (ja oder nein) und die Kategorie (ein Zeichen). Gib sie aus.

Ausgabe
Hotel „Seestern“
Sterne: 4
Bewertung: 8.7
Frühstück: True
Kategorie: B

Weitere Aufgaben

  • Drei im Kreis. Drei Kassen haben zu Tagesbeginn 120, 85 und 240 €. Verschiebe die Beträge im Kreis: Der erste kommt in die zweite Kasse, der zweite in die dritte, der dritte in die erste. Verwende eine Hilfsvariable. Gib 240 120 85 aus.
  • Dasselbe mit var. Schreib Aufgabe 3 mit var überall. Die Ausgabe soll sich nicht ändern.
  • Ein Fehler mit Absicht. Speichere Text in einem int und eine Kommazahl in einem int. Lies, was der Compiler sagt.

Test

Teste dich

1. Was macht die Zeile int count = 5;?
2. Welcher Typ passt für einen Preis wie 12.99?
3. int a = 5; int b = a; a = 9; Was ist b?
4. Warum braucht der Tausch zweier Werte eine dritte Variable?
5. Was stimmt nach var nights = 3;?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·