💻

Vorlesung 2

Willkommen zurück!
Datentypen in C

Fortgeschrittene Algorithmen und Programmierung
Wintersemester 2025/26
Prof. Dr. Alexandra Mikityuk
📍 Raum C308 | 🏫 HTW Berlin

Drücken Sie → oder Leertaste zum Starten

Herzlich willkommen zurück!

Nach der Pause wieder einsteigen

Nach einer Pause ist es normal, dass einiges "eingerostet" ist. Keine Sorge - wir starten mit einer gründlichen Wiederholung!

💡 Unser Ziel heute:
Wir festigen die Grundlagen und vertiefen unser Verständnis von Datentypen in C. Schritt für Schritt, mit vielen praktischen Beispielen!
  • Wiederholung: Eingabe und Ausgabe
  • Datentypen verstehen und richtig einsetzen
  • Zahlensysteme und ihre Bedeutung
  • Praktische Beispiele aus dem echten Leben

Themen der heutigen Vorlesung

Teil 1: Grundlagen

  • scanf() und Eingabeverarbeitung
  • Warum Datentypen wichtig sind
  • Integer-Datentypen im Detail
  • Signed vs. Unsigned

Teil 2: Vertiefung

  • Fließkommazahlen verstehen
  • Zahlensysteme (Oktal, Hexadezimal)
  • Praktische Anwendungsbeispiele
  • Häufige Fehler vermeiden

Schnelle Wiederholung: C-Programm Struktur

Bevor wir in die Tiefe gehen, erinnern wir uns an die Grundstruktur eines C-Programms. Jedes C-Programm folgt diesem grundlegenden Aufbau:

  1. Bibliotheken einbinden - Wir holen uns Funktionen, die wir brauchen
  2. main() Funktion - Der Startpunkt des Programms
  3. Variablen deklarieren - Speicherplatz reservieren
  4. Operationen ausführen - Ein- und Ausgabe, Berechnungen
  5. Rückgabewert - Programm beenden mit return 0
// 1. Bibliotheken einbinden (stdio = Standard Input/Output) #include <stdio.h> // 2. Hauptfunktion - hier startet unser Programm int main() { // 3. Deklaration: Variablen anlegen int alter; // 4. Ausgabe an den Benutzer printf("Wie alt sind Sie? "); // 4. Eingabe vom Benutzer lesen scanf("%d", &alter); // 4. Ergebnis ausgeben printf("Sie sind %d Jahre alt.\n", alter); // 5. Programm erfolgreich beenden return 0; }

scanf() - Daten vom Benutzer einlesen

Was macht scanf()?

scanf() ist die wichtigste Funktion zum Einlesen von Benutzereingaben. Sie wartet, bis der Benutzer etwas eintippt und Enter drückt, und speichert dann die Eingabe in einer Variable.

Zwei wichtige Teile:
1️⃣ Format-String (z.B. "%d") - sagt scanf, welchen Typ wir erwarten
2️⃣ Adresse der Variable (mit &) - wohin die Eingabe gespeichert werden soll

int zahl; scanf("%d", &zahl); // %d = Integer (ganze Zahl) float preis; scanf("%f", &preis); // %f = Float (Kommazahl) char buchstabe; scanf(" %c", &buchstabe); // %c = Character (Zeichen), Leerzeichen vor %c!
⚠️ Wichtig: Das & (Ampersand) vor dem Variablennamen ist entscheidend! Es gibt die Speicheradresse der Variable an scanf() weiter. Ohne & kann scanf() nicht wissen, wo die Eingabe gespeichert werden soll → Programm stürzt ab!

Mehrere Werte gleichzeitig einlesen

scanf() kann mehrere Werte in einem Aufruf einlesen:

int tag, monat, jahr; // Drei Werte einlesen, durch Leerzeichen getrennt printf("Geben Sie ein Datum ein (TT MM JJJJ): "); scanf("%d %d %d", &tag, &monat, &jahr); printf("Datum: %d.%d.%d\n", tag, monat, jahr);
📝 Beispiel-Eingabe:
15 10 2025

Ausgabe:
Datum: 15.10.2025

Format-Spezifizierer im Überblick

Spezifizierer Datentyp Beschreibung Beispiel
%d oder %i int Ganze Zahl (dezimal) 42, -17
%f float Fließkommazahl 3.14, -0.5
%lf double Doppelt genaue Fließkommazahl 3.14159265
%c char Einzelnes Zeichen 'A', '5', '@'
%s char[] Zeichenkette (String) "Hallo"

Quiz: scanf() verstehen

Was ist die korrekte Syntax, um einen Integer einzulesen?

A) scanf("%d", zahl);
B) scanf("%d", &zahl);
C) scanf(&zahl, "%d");
D) scanf(zahl);

Warum sind Datentypen wichtig?

Datentypen bestimmen:

  • Speicherplatz: Wie viele Bytes im Speicher belegt werden
  • Wertebereich: Welche Zahlen gespeichert werden können
  • Operationen: Welche Berechnungen möglich sind
  • Genauigkeit: Wie präzise Berechnungen sind
💡 Analogie:
Stellen Sie sich vor, Sie sortieren Kleidung:
char = kleine Schublade (1 Byte) - für ein Socke
int = mittlere Schublade (4 Bytes) - für ein T-Shirt
double = große Schublade (8 Bytes) - für eine Jacke

Integer-Datentypen in C

Integer = ganze Zahlen (ohne Nachkommastellen). C bietet verschiedene Integer-Typen mit unterschiedlichen Größen und Wertebereichen.

Warum verschiedene Größen? Je größer der Typ, desto mehr Speicher braucht er. Für kleine Zahlen (z.B. Alter) reicht ein kleiner Typ. Für große Zahlen (z.B. Weltbevölkerung) brauchen wir einen größeren Typ.

Typ Größe Wertebereich (signed) Praktische Verwendung
char 1 Byte (8 Bit) -128 bis 127 Zeichen, sehr kleine Zahlen (Alter, Noten)
short 2 Bytes (16 Bit) -32,768 bis 32,767 Kleine Zahlen (Jahr, Temperatur)
int 4 Bytes (32 Bit) -2,147,483,648 bis 2,147,483,647 Standard! Bevölkerung, Entfernungen
long 8 Bytes (64 Bit) -9,223,372,036,854,775,808 bis 9,223,... ,807 Sehr große Zahlen (Astronomie, Finanzen)
💡 Faustregel: Verwenden Sie int für die meisten ganzzahligen Berechnungen. Nur bei speziellen Anforderungen (sehr klein/groß) andere Typen wählen!

Praxis: Verschiedene Integer-Typen

#include <stdio.h> int main() { // Verschiedene Integer-Typen deklarieren char alter_katze = 5; // Kleine Zahl short hoehe_raum = 280; // Raumhöhe in cm int einwohner = 3850000; // Einwohner Berlin long entfernung = 384400000; // Erde-Mond in Metern printf("Katze ist %d Jahre alt\n", alter_katze); printf("Raumhöhe: %d cm\n", hoehe_raum); printf("Berlin: %d Einwohner\n", einwohner); printf("Entfernung zum Mond: %ld m\n", entfernung); return 0; }
📝 Beachten Sie: Für long verwenden wir %ld in printf()!

Signed vs. Unsigned - Was ist der Unterschied?

Signed (mit Vorzeichen) und unsigned (ohne Vorzeichen) bestimmen, ob eine Variable negative Zahlen speichern kann oder nicht.

Der Trick: Beide verwenden gleich viel Speicher (z.B. 4 Bytes bei int), aber unsigned nutzt das Bit, das normalerweise für das Vorzeichen (+/-) verwendet wird, für den Wert selbst → doppelt so große positive Zahlen möglich!

signed (mit Vorzeichen)

  • Standard in C
  • ✅ Kann positiv UND negativ sein
  • ⚠️ Ein Bit für das Vorzeichen
  • 📊 Symmetrischer Bereich um 0
signed int temp = -15; // Bereich: -2,147,483,648 // bis +2,147,483,647 // (ca. ±2.1 Milliarden)

unsigned (ohne Vorzeichen)

  • ✅ Nur positive Zahlen (≥ 0)
  • Doppelter positiver Bereich!
  • ✅ Alle Bits für den Wert
  • ⚠️ KEINE negativen Zahlen!
unsigned int alter = 25; // Bereich: 0 // bis 4,294,967,295 // (ca. 4.3 Milliarden)

Wann verwende ich unsigned?

✅ Gute Beispiele für unsigned:

  • Alter: Kann nie negativ sein
  • Anzahl: Zählen von Objekten (0, 1, 2, ...)
  • Größen: Dateigröße, Array-Länge
  • IDs: Benutzer-IDs, Produkt-Nummern
// Praktische Beispiele unsigned int alter = 30; // Alter ist nie negativ unsigned int anzahl_studenten = 450; // Anzahl nie negativ unsigned long dateigroesse = 1024000; // Bytes sind nie negativ // ABER: Temperatur NICHT unsigned! int temperatur = -5; // Kann negativ sein!

Quiz: Signed vs. Unsigned

Welcher Datentyp ist für die Temperatur in Celsius am besten geeignet?

A) unsigned int
B) int
C) unsigned char
D) char

💡 Tipp: Denken Sie daran, dass Temperaturen unter 0°C möglich sind!

Fließkommazahlen (Floating Point)

Fließkommazahlen (auch Gleitkommazahlen) sind Datentypen für Zahlen mit Dezimalstellen. Sie folgen dem IEEE 754 Standard und verwenden eine wissenschaftliche Notation intern.

Typ Größe Genauigkeit Wertebereich
float 4 Bytes (32 Bit) ~6-7 Dezimalstellen ±3.4 × 1038
double 8 Bytes (64 Bit) ~15-17 Dezimalstellen ±1.8 × 10308
long double 10-16 Bytes* ~18-19 Dezimalstellen ±1.1 × 104932
⚠️ Wichtig: Fließkommazahlen sind nicht exakt! Sie sind Näherungswerte aufgrund der binären Darstellung. Ein einfaches Beispiel: 0.1 + 0.2 ergibt in C nicht exakt 0.3, sondern 0.30000000000000004!
💡 Hinweis: *long double Größe ist plattformabhängig (Windows, Linux, Mac können unterschiedlich sein)

float vs. double - Was wählen?

float verwenden:

  • Grafikanwendungen
  • Einfache Berechnungen
  • Speicherplatz ist knapp
  • Weniger Genauigkeit OK
Beispiel:
Bildschirmkoordinaten,
Spiele-Physik

double verwenden:

  • Wissenschaftliche Berechnungen
  • Finanzberechnungen
  • Hohe Genauigkeit nötig
  • Standard in C!
Beispiel:
Banksystem,
Ingenieursberechnungen
💡 Faustregel: Im Zweifelsfall double verwenden!

Praxis: Fließkommazahlen - Der Genauigkeitsunterschied

Was passiert hier? Wir speichern Pi (π) in float und double. float ~6-7 Stellen genau, double ~15-17 Stellen. %.10f = 10 Nachkommastellen zeigen, %.20lf = 20 Stellen (l=long).

#include <stdio.h> int main() { float pi_float = 3.14159265358979; // float speichert nicht alles! double pi_double = 3.14159265358979323846; // double ist präziser printf("float: %.10f\n", pi_float); // 10 Nachkommastellen printf("double: %.20lf\n", pi_double); // 20 Nachkommastellen // Kreisfläche: A = π * r² double radius = 5.0; double flaeche = pi_double * radius * radius; printf("\nKreis Radius %.2lf cm → Fläche: %.2lf cm²\n", radius, flaeche); return 0; }
📊 Ausgabe:
float: 3.1415927410
↑ Ungenau ab Stelle 7!

double: 3.14159265358979311600
↑ Genau bis Stelle 15!
💡 Wichtig: Für präzise Berechnungen (Wissenschaft, Finanzen) immer double verwenden!

Zahlensysteme - Warum mehrere Systeme?

Warum nicht nur Dezimalzahlen?

Computer arbeiten intern mit Binärzahlen (0 und 1). Um mit dem Computer zu kommunizieren, verwenden Programmierer oft andere Zahlensysteme, die kompakter sind als Binär, aber näher an der Hardware-Darstellung als Dezimal.

Beispiel: Die Binärzahl 11111111 ist schwer zu lesen, aber als FF (hexadezimal) oder 377 (oktal) viel übersichtlicher!

System Basis Ziffern Verwendung in der Praxis
Binär 2 0-1 Computer-Hardware, Bits, Boolesche Logik
Oktal 8 0-7 Unix-Dateiberechtigungen (chmod 755), alte Systeme
Dezimal 10 0-9 Alltag, normale Zahlen, Benutzereingaben
Hexadezimal 16 0-9, A-F RGB-Farben (#FF5733), Speicheradressen, Debugging
💡 Fun Fact: Hexadezimal ist besonders praktisch, weil 16 = 2⁴ ist. Jede Hex-Ziffer entspricht exakt 4 Bits (Binärziffern)! Das macht Umrechnungen sehr einfach.

Binärsystem (Basis 2)

Die Sprache des Computers

Computer verstehen nur zwei Zustände: An (1) oder Aus (0). Deshalb verwenden sie das Binärsystem (Basis 2). Jede Stelle hat einen Wert: 20, 21, 22, 23, ...

Wichtig: In C gibt es keine direkte Syntax für Binärzahlen (außer in neueren Standards mit 0b Präfix), aber das Verständnis ist fundamental!

Beispiel: Die Binärzahl 1101 → Dezimal

Stelle: 2⁰
Wert: 8 4 2 1
Bit: 1 1 0 1
Rechnung: 1×8 1×4 0×2 1×1

= 8 + 4 + 0 + 1 = 13 (dezimal)

💡 Merkhilfe: Jede Binärstelle ist eine Potenz von 2: 1, 2, 4, 8, 16, 32, 64, 128, 256...

Dezimalsystem (Basis 10)

Das System, das wir kennen

Jede Stelle hat einen Wert: 100, 101, 102, ...

Beispiel: Die Zahl 2025

Stelle: 10³ 10² 10¹ 10⁰
Wert: 1000 100 10 1
Ziffer: 2 0 2 5
Rechnung: 2×1000 0×100 2×10 5×1

= 2000 + 0 + 20 + 5 = 2025

Oktalsystem (Basis 8)

Oktal: 8 Ziffern (0-7). Nach 7 kommt 10 (oktal) = 8 (dezimal). In C: führende 0 kennzeichnet Oktal.

⚠️ Vorsicht! int x = 0100; ist NICHT 100, sondern 64 (dezimal)!
💡 Notation: Oktal=0..., Binär=0b... (C23), Hex=0x...
int oktal = 0755; // Oktal (beginnt mit 0) printf("Oktal 0755 = Dezimal %d\n", oktal); // Ausgabe: 493 // Vorsicht bei führenden Nullen! int a = 100; // dezimal 100 int b = 0100; // oktal = dezimal 64 !!!
📐 Umrechnung 0755:
7×8² + 5×8¹ + 5×8⁰
= 7×64 + 5×8 + 5×1
= 493
💡 Praktisch:
Unix-Berechtigungen:
chmod 0755
→ rwxr-xr-x

Hexadezimalsystem (Basis 16)

Ziffern 0-9 und Buchstaben A-F

In C: Hexadezimalzahlen beginnen mit 0x oder 0X

Hex: 01234567 89ABCDEF
Dez: 01234567 89101112131415

Hexadezimal in der Praxis

int hex = 0xFF; // Hexadezimal (beginnt mit 0x) printf("Hex 0xFF = Dezimal %d\n", hex); // Ausgabe: Hex 0xFF = Dezimal 255 // Farben in RGB (Rot, Grün, Blau) int rot = 0xFF0000; // Reines Rot int gruen = 0x00FF00; // Reines Grün int blau = 0x0000FF; // Reines Blau
Umrechnung: 0xFF (hex) → dezimal

F×16¹ + F×16⁰ = 15×16 + 15×1 = 240 + 15 = 255
💡 Praktisch: Hexadezimal ist kompakt für große Zahlen:
0xFFFFFFFF = 4,294,967,295 (dezimal)

Zahlensysteme im Vergleich

Dezimal Binär Oktal Hexadezimal In C Code
0 0000 00 0x0 0, 00, 0x0
8 1000 010 0x8 8, 010, 0x8
15 1111 017 0xF 15, 017, 0xF
16 10000 020 0x10 16, 020, 0x10
255 11111111 0377 0xFF 255, 0377, 0xFF
// Alle drei Zahlen sind identisch! int a = 255; // Dezimal int b = 0377; // Oktal int c = 0xFF; // Hexadezimal // a == b == c → alle sind 255!

Quiz: Zahlensysteme

Was ist der dezimale Wert von 0x10?

A) 10
B) 16
C) 8
D) 1

💡 Tipp: 0x bedeutet hexadezimal (Basis 16)!

Häufige Fehler vermeiden

❌ Typische Fehler und wie man sie vermeidet:

❌ FALSCH

// Fehler 1: & vergessen int x; scanf("%d", x); // ❌ // Fehler 2: Falscher Typ float preis; scanf("%d", &preis); // ❌ // Fehler 3: Integer Overflow char big = 200; // ❌ zu groß!

✅ RICHTIG

// Richtig: & verwenden int x; scanf("%d", &x); // ✅ // Richtig: Passender Typ float preis; scanf("%f", &preis); // ✅ // Richtig: Passender Typ int big = 200; // ✅

Zusammenfassung

Was haben wir gelernt?

  • scanf() zum Einlesen von Benutzereingaben (mit &!)
  • Integer-Typen: char, short, int, long
  • signed vs. unsigned - Wann welchen verwenden?
  • Float-Typen: float, double, long double
  • Zahlensysteme: Dezimal, Oktal (0...), Hexadezimal (0x...)
  • Häufige Fehler und wie man sie vermeidet
📚 Nächste Vorlesung:
Type Casting, Konstanten, Zufallszahlen und Operatoren!

Vielen Dank!

Fragen? Üben Sie weiter!

Prof. Dr. Alexandra Mikityuk
Raum: C308
Sprechstunde: Nach Vereinbarung

Tipp: Probieren Sie die Beispiele selbst aus!
Experimentieren ist der beste Weg zum Lernen.

💻 Übung macht den Meister!
Schreiben Sie eigene kleine Programme mit verschiedenen Datentypen.
🏠 Zurück zur Startseite
1 / 28