🏠 Zurück zur Startseite

Vorlesung 3

Verschiedene Arten von Daten

Grundlagen der Programmierung in C

Prof. Dr. Alexandra Mikityuk

HTW Berlin - Wintersemester 2025/26

In dieser Vorlesung lernen Sie:
✅ Zahlen speichern, ausgeben und vom Benutzer einlesen
✅ Mit verschiedenen Datentypen arbeiten
✅ Berechnungen durchführen
✅ Fehler finden und beheben

📊 Warum brauchen wir verschiedene Datentypen?

Innerhalb eines Programms müssen unterschiedliche Daten ermittelt, gespeichert, weiterverarbeitet und ausgegeben werden.

Ein Beispiel: Einkauf im Geschäft

Wir tätigen einen Einkauf in einem Geschäft. Schritt für Schritt lernen Sie weitere Programmierelemente kennen, die Ihnen die Möglichkeit geben, diesen Einkauf immer realistischer zu gestalten.

Daten können sein:

  • Zahlen (z.B. Anzahl der Äpfel: 2)
  • Kommazahlen (z.B. Preis pro Apfel: 1,45 Euro)
  • Texte (kommen später)

Daten bekannt machen und speichern

💾 Variablen und Datentypen

Einzelne Daten werden in Variablen gespeichert. Variablen können ihren Wert verändern.

In C gibt es unterschiedliche Typen von Variablen. Jeder dieser sogenannten Datentypen hat einen eigenen Einsatzzweck und bietet bestimmte Vorteile.

Die wichtigsten Datentypen:

Datentyp Beschreibung Beispiel
int Ganze Zahlen 2, -5, 100
double Zahlen mit Nachkommastellen 1.45, 3.14, -2.5

Deklaration und Zuweisung

📝 Deklaration

Eine Deklaration dient dazu, einer Variablen einen Namen zu geben und sie einem Datentyp zuzuordnen. Eine Variable kann erst nach einer Deklaration verwendet werden.

/* Deklaration */
int anzahl;
double preis;

⬅️ Zuweisung

Eine Variable kann per Zuweisung einen Wert erhalten. Die Zuweisung wird mithilfe des Zeichens = notiert. Die Variable auf der linken Seite erhält den Wert, der auf der rechten Seite des Gleichheitszeichens steht.

/* Zuweisung */
anzahl = 2;
preis = 1.45;

⚠️ Wichtig: Vor der ersten Zuweisung hat eine Variable einen zufälligen Wert!

Regeln für Variablennamen

✅ Erlaubt:

  • Buchstaben (a-z, A-Z)
  • Ziffern (0-9)
  • Unterstrich (_)

❌ Nicht erlaubt:

  • Deutsche Umlaute (ä, ö, ü) und ß
  • Der Name darf nicht mit einer Ziffer beginnen
  • Schlüsselwörter der Sprache C (z.B. int, double, return)

💡 Gute Praxis: camelCase

Verwenden Sie aussagekräftige Namen! Wenn Sie mehrere Preise speichern möchten, nennen Sie die Variablen zum Beispiel preisApfel und preisBanane.

Diese Schreibweise nennt sich camelCase, wegen des "Kamelhöckers" mitten im Wort.

Wie gebe ich Daten auf dem Bildschirm aus?

🖥️ Die Funktion printf()

Sie können zu jedem Zeitpunkt des Programms den aktuellen Wert einer Variablen auf dem Bildschirm ausgeben. Dazu werden sogenannte Platzhalter benötigt.

Platzhalter in printf():

  • %d oder %i - für int (ganze Zahlen)
  • %f - für double (Kommazahlen)
#include <stdio.h>

int main() {
    /* Deklaration mit Initialisierung */
    int anzahl = 2;
    double preis = 1.45;

    /* Ausgabe */
    printf("Anzahl: %d\n", anzahl);
    printf("Preis: %f Euro\n", preis);
    printf("Preis: %.2f Euro\n", preis);

    return 0;
}

Formatierte Ausgabe

📏 Ausgabe mit %.2f

Der Wert der Variablen anzahl steht am Ende der ersten Ausgabe. Der Wert der Variablen preis wird jeweils mitten in der zweiten und dritten Ausgabe eingebettet.

Ohne genauere Angabe führt %f zu einer Formatierung der Ausgabe auf sechs Nachkommastellen.

Durch die Angabe %.2f findet eine Formatierung auf zwei Nachkommastellen statt.

Ausgabe des Programms:

Anzahl: 2
Preis: 1.450000 Euro
Preis: 1.45 Euro

⚠️ Dezimalpunkt beachten: In C verwenden wir immer einen Dezimalpunkt anstelle des deutschen Dezimalkommas.

Wie kann der Benutzer Daten eingeben?

⌨️ Die Funktion scanf()

Ein Programm wird erst interaktiv, wenn sein Benutzer die Möglichkeit hat, Eingaben zu machen. Dazu setzen Sie als Entwickler die Funktion scanf() ein.

So funktioniert scanf():

  • Das Programm hält an und wartet auf eine Eingabe
  • Nach der Eingabe per Tastatur betätigt der Benutzer die Taste
  • Das Programm läuft weiter, speichert die eingegebenen Daten und verarbeitet sie

⚠️ Adressoperator & beachten!

Bei scanf() werden Platzhalter benötigt, wie bei der Funktion printf(). Wichtig:
• Für int verwenden Sie %d
• Für double verwenden Sie beim Einlesen %lf (nicht %f!)

Außerdem muss vor dem Namen der Variablen das Zeichen & angegeben werden. Dabei handelt es sich um den sogenannten Adressoperator, der auf die Adresse der Variablen im Speicher verweist.

scanf() Beispiel

#include <stdio.h>
int main() {
    /* Deklaration */
    int anzahl;
    double preis;

    /* Erste Eingabe */
    printf("Anzahl eingeben: ");
    scanf("%d", &anzahl);

    /* Zweite Eingabe */
    printf("Preis in Euro eingeben: ");
    scanf("%lf", &preis);

    /* Ausgabe */
    printf("Anzahl: %d\n", anzahl);
    printf("Preis: %.2f Euro\n", preis);

    return 0;
}

Beispielausgabe:

Anzahl eingeben: 3
Preis in Euro eingeben: 1.35
Anzahl: 3
Preis: 1.35 Euro

⚠️ Stolperfallen bei scanf()

Häufige Fehler:

  • Dezimalpunkt: Er muss bei der Eingabe wiederum die englische Schreibweise beachten, also mit einem Dezimalpunkt statt einem Dezimalkomma.
  • Falsche Eingaben: Sollte er mehrere Eingaben auf einmal vornehmen, Buchstaben statt Ziffern eingeben oder ein Komma statt eines Punkts, führt dies leider zu einem unerwarteten Programmverlauf.

Aber auch Sie als Entwickler könnten Fehler machen. Hier sind einige Tipps, die Sie beim Einsatz der Funktion scanf() beachten sollten:

  • Innerhalb der Anführungsstriche sollte allein der Platzhalter notiert werden, also nur %d oder %lf, nicht etwa %d\n oder %.2lf.
  • Vergessen Sie nicht, den Adressoperator & zu notieren.

Fehler bei der Ausführung

⚠️ Was passiert bei Fehlern?

Das Gefährliche an den genannten Fehlern des Entwicklers: Es sind keine Syntaxfehler. Das Programm wird also leider übersetzt, ohne sichtbare Fehlermeldung.

Erst während der Laufzeit des Programms treten Fehler auf, weil zum Beispiel eine Variable nicht den richtigen Eingabewert erhalten hat und in der Folge ein unverständliches Ergebnis auftritt.

💡 Vielfalt der Programmierung

Sie werden sich fragen: Wieso meldet der Compiler diese Fehler nicht als Syntaxfehler?

Der Grund liegt unter anderem in der Vielfalt der Programmierung mit C. Es gibt auch Operationen für andere Einsatzzwecke, die genau diese Schreibweise erfordern, die hier zunächst als falsch erscheint.

Berechnungen mit Operatoren

🧮 Grundrechenarten

In diesem Abschnitt führen wir einige Berechnungen im Bereich der Grundrechenarten durch. Wir benutzen die Operatoren:

Operator Operation Beispiel
+ Addition a + b
- Subtraktion a - b
* Multiplikation a * b
/ Division a / b

Punkt vor Strich: Wie in der Mathematik gilt auch in C die Regel Punktrechnung vor Strichrechnung. Die Operatoren * und / haben also Vorrang vor den Operatoren + und -. Sie können zusätzlich Klammern setzen, um die Reihenfolge der Berechnung zu beeinflussen.

Berechnungsbeispiel: Einkauf

#include <stdio.h>
int main() {
    /* Deklaration, teilweise mit Initialisierung */
    int anzahlApfel = 2, anzahlBirne = 4;
    double preisApfel = 1.45, preisBirne = 0.85;
    double summeRechnung, preisMittel, preisDifferenz;

    /* Berechnung */
    summeRechnung = anzahlApfel * preisApfel
                  + anzahlBirne * preisBirne;
    preisMittel = summeRechnung / (anzahlApfel + anzahlBirne);
    preisDifferenz = preisApfel - preisBirne;

    /* Ausgabe */
    printf("Summe der Rechnung: %.2f Euro\n", summeRechnung);
    printf("Mittlerer Preis: %.2f Euro\n", preisMittel);
    printf("Preis-Differenz: %.2f Euro\n", preisDifferenz);

    return 0;
}

Ausgabe:

Summe der Rechnung: 6.30 Euro
Mittlerer Preis: 1.05 Euro
Preis-Differenz: 0.60 Euro

⚠️ Vorsicht bei der Division!

Ganzzahldivision

⚠️ Eine Rechenoperation, an der eine ganze Zahl und eine Zahl mit Nachkommastellen beteiligt sind, ergibt in C eine Zahl mit Nachkommastellen.

Beispiel: Bei der Berechnung des mittleren Preises pro Artikel wird eine double-Variable durch die Summe von zwei int-Variablen geteilt. Es ergibt sich ein double-Wert.

💡 Hinweis: Ganzzahldivision

Falls an einer Division zwei ganze Zahlen beteiligt sind, ergibt sich wiederum eine ganze Zahl. Sollten sich Nachkommastellen ergeben, werden diese abgeschnitten.

Beispiel: 11 durch 4 ergibt den Wert 2 und nicht etwa 2.75, wie es mathematisch richtig wäre.

Als Abhilfe kann zum Beispiel Folgendes dienen:

  • Sie schreiben 11.0 / 4 oder 11 / 4.0, geben also eine der beiden Zahlen als double-Wert an.
  • Sie schreiben 1.0 * 11 / 4, multiplizieren also einen double-Wert mit der ersten Zahl.

Entwicklung eines Programms

📋 Schritt für Schritt zum fertigen Programm

Bei der Entwicklung Ihrer eigenen Programme sollten Sie Schritt für Schritt vorgehen. Stellen Sie sich zuerst einige Überlegungen an, wie das gesamte Programm aufgebaut sein soll, und zwar auf Papier.

💡 Teile eines Programms

Aus welchen Teilen sollte es nacheinander bestehen? Versuchen Sie nicht, das gesamte Programm mit all seinen komplexen Bestandteilen auf einmal zu schreiben! Dies ist der größte Fehler, den Einsteiger (und manchmal auch Fortgeschrittene) machen können.

Empfohlenes Vorgehen:

  1. Einfache Version: Schreiben Sie zunächst eine einfache Version des ersten Programmteils. Anschließend testen Sie sie. Erst nach einem erfolgreichen Test fügen Sie den folgenden Programmteil hinzu.
  2. Nach jeder Änderung testen: Nach jeder Änderung testen Sie wiederum. Sollte sich ein Fehler zeigen, so wissen Sie, dass er aufgrund der letzten Änderung aufgetreten ist.
  3. Komplexere Version: Nach dem letzten Hinzufügen haben Sie eine einfache Version Ihres gesamten Programms. Nun ändern Sie einen Teil Ihres Programms in eine komplexere Version ab. Auf diese Weise testen Sie Ihr Programm Schritt für Schritt komplexer, bis Sie schließlich das fertige Programm so erstellt haben, wie es Ihren anfänglichen Überlegungen auf Papier entspricht.

Fehler suchen

🐛 Debugging

Sollte eines Ihrer Programme unerwartete Ergebnisse haben, so müssen Sie sich auf die Suche nach dem Fehler machen und diesen beseitigen.

Was ist Debugging?

Die verschiedenen Entwicklungsumgebungen bieten Ihnen einige Möglichkeiten für dieses sogenannte Debugging. Ich beschreibe diese Vorgänge anhand der Entwicklungsumgebung Visual Studio Code. In den anderen Umgebungen funktioniert die Fehlersuche auf vergleichbare Art und Weise.

Debugging-Werkzeuge:

🔴 1. Haltepunkte (Breakpoints)

Klicken Sie einmal auf den grauen Balken vor einer Programmzeile. Es wird ein roter Punkt angezeigt.

8 int main() {
9     int anzahl = 5;
10     double preis = 2.50;
11     printf("Anzahl: %d\n", anzahl);

👁️ 2. Watch-Fenster (Variablen beobachten)

Über DEBUG → Start Debugging können Sie die Werte Ihrer Variablen in Echtzeit beobachten.

VARIABLES
▼ Local
anzahl 5
preis 2.500000
summe 12.500000

⏭️ 3. Einzelschrittverfahren (Step Over / Step Into)

Mit F10 (Step Over) oder F11 (Step Into) führen Sie das Programm Zeile für Zeile aus.

Tipp: Beobachten Sie, wie sich die Variablenwerte im Watch-Fenster ändern, während Sie Zeile für Zeile durchgehen!

Debugging in der Praxis

🔍 Programm Zeile für Zeile durchlaufen

📍 Beispiel: Debugging-Session

So sieht eine typische Debugging-Session in VS Code aus:

8 int main() {
9   int apfel = 2, birne = 4;
10   double p1 = 1.45, p2 = 0.85;
11   double summe;
12
13   summe = apfel * p1 + birne * p2;
14   printf("Summe: %.2f\n", summe);
VARIABLES
▼ Local
apfel 2
birne 4
p1 1.45
p2 0.85
summe ???

Gelbe Markierung: Aktuelle Zeile (wird als nächstes ausgeführt)
Roter Punkt: Breakpoint
Variablen-Panel: Zeigt aktuelle Werte (summe hat noch keinen Wert)

⌨️ Wichtige Tastenkombinationen:

  • F5 - Start Debugging / Continue
  • F10 - Step Over (nächste Zeile)
  • F11 - Step Into (in Funktion hineinspringen)
  • Shift+F5 - Stop Debugging

💡 Debugging-Tipp:

Setzen Sie Breakpoints an kritischen Stellen und verwenden Sie F10, um Zeile für Zeile zu gehen. Beobachten Sie im Variables-Panel, wie sich die Werte ändern. So finden Sie Fehler in der Logik Ihres Programms!

Eine Übungsaufgabe

💻 Rabattberechnung

Schreiben Sie ein Programm in der Datei u_daten.c. Es soll die folgende Ausgabe ermöglichen (hier mit Eingaben des Benutzers):

Erster Artikel, Anzahl: 5
Erster Artikel, Preis in Euro: 2.10

Zweiter Artikel, Anzahl: 2
Zweiter Artikel, Preis in Euro: 1.60

Summe ohne Rabatt: 13.70 Euro
Summe mit Rabatt: 10.96 Euro

📝 Aufgabenstellung:

Der Benutzer soll also Anzahl und Preis für zwei verschiedene eingekaufte Artikel eingeben. Anschließend wird die Summe der Rechnung ermittelt. Außerdem wird ein Rabatt von 20 % gewährt.

Als Letztes soll die Summe einschließlich des eingerechneten Rabatts ausgegeben werden. Wählen Sie geeignete Variablennamen, und kommentieren Sie Ihr Programm ausreichend.

💡 Lösung: Rabattberechnung

#include <stdio.h>

int main() {
    /* Deklaration */
    int anzahl1, anzahl2;
    double preis1, preis2;
    double summeOhneRabatt, summeMitRabatt;

    /* Eingabe erster Artikel */
    printf("Erster Artikel, Anzahl: ");
    scanf("%d", &anzahl1);
    printf("Erster Artikel, Preis in Euro: ");
    scanf("%lf", &preis1);

    /* Eingabe zweiter Artikel */
    printf("\nZweiter Artikel, Anzahl: ");
    scanf("%d", &anzahl2);
    printf("Zweiter Artikel, Preis in Euro: ");
    scanf("%lf", &preis2);

    /* Berechnungen */
    summeOhneRabatt = anzahl1 * preis1 + anzahl2 * preis2;
    summeMitRabatt = summeOhneRabatt * 0.8; // 20% Rabatt = 80% bezahlen

    /* Ausgabe */
    printf("\nSumme ohne Rabatt: %.2f Euro\n", summeOhneRabatt);
    printf("Summe mit Rabatt: %.2f Euro\n", summeMitRabatt);

    return 0;
}

💡 Erklärung:

Der Rabatt von 20% bedeutet, dass der Kunde nur 80% bezahlen muss. Daher multiplizieren wir mit 0.8 (was 80% entspricht).

Alternative: summeMitRabatt = summeOhneRabatt - (summeOhneRabatt * 0.2);

📚 Zusammenfassung

Was haben wir gelernt?

💾 Variablen

  • Deklaration von Variablen
  • Datentypen: int und double
  • Initialisierung und Zuweisung
  • Namensregeln (camelCase)

🖥️ Ein- und Ausgabe

  • printf() für Ausgabe
  • Platzhalter: %d, %f
  • scanf() für Eingabe
  • Adressoperator &

🧮 Berechnungen

  • Grundrechenarten: +, -, *, /
  • Punkt vor Strich
  • Ganzzahldivision beachten!

🐛 Debugging

  • Haltepunkte setzen
  • Watch-Fenster nutzen
  • Einzelschrittverfahren
  • Schritt für Schritt entwickeln

🎯 Nächste Schritte:

Üben Sie die Konzepte mit der Übungsaufgabe! Experimentieren Sie mit verschiedenen Datentypen und Berechnungen. Nutzen Sie den Debugger, um Ihr Programm besser zu verstehen.

⚡ Initialisierung - Kompakter Code

Vergleich: Deklaration + Zuweisung vs. Initialisierung

Vorher (2 Schritte):

/* Deklaration */
int anzahl;
double preis;

/* Zuweisung */
anzahl = 2;
preis = 1.45;

Jetzt (1 Schritt):

/* Initialisierung */
int anzahl = 2;
double preis = 1.45;


⚡ Initialisierung = Deklaration + Zuweisung in einem Schritt

Die Variablen erhalten bereits bei der Deklaration einen Wert. Dies macht das Programm kompakter und übersichtlicher.

Wichtig: Die Werte können sich nach wie vor im Verlauf des Programms ändern!

Programmausgabe:

Anzahl: 2
Preis: 1.450000 Euro
Preis: 1.45 Euro

📏 Formatierte Ausgabe

Der Wert der Variablen anzahl steht am Ende der ersten Ausgabe. Der Wert der Variablen preis wird jeweils mitten in der zweiten und dritten Ausgabe eingebettet. Ohne genauere Angabe führt %f zu einer Formatierung der Ausgabe auf sechs Nachkommastellen. Durch die Angabe %.2f findet eine Formatierung auf zwei Nachkommastellen statt.

Mehrere Deklarationen

📝 Mehrere Variablen desselben Typs

Mehrere Variablen desselben Typs können Sie durch Komma getrennt innerhalb einer Anweisung deklarieren und auch initialisieren.

/* Mehrere Variablen in einer Zeile */
int anzahlApfel = 2, anzahlBirne = 4;
double preisApfel = 1.45, preisBirne = 0.85;

⚠️ Achtung bei Mehrfachdeklarationen!

Es werden zwei verschiedene Artikel eingekauft, in unterschiedlicher Anzahl. Weitere Variablen werden für die Ergebnisse der Rechenoperationen deklariert.

Tipp: Für bessere Lesbarkeit können Sie auch jede Variable in einer eigenen Zeile deklarieren!

/* Alternative: Jede Variable einzeln */
int anzahlApfel = 2;
int anzahlBirne = 4;
double preisApfel = 1.45;
double preisBirne = 0.85;

Printf Platzhalter im Detail

🔢 Formatierungsoptionen

Platzhalter Bedeutung Beispiel
%d oder %i Ganze Zahl (int) 42
%f Kommazahl (double) 3.140000
%.2f 2 Nachkommastellen 3.14
%.0f Keine Nachkommastellen 3
%5d Mindestens 5 Zeichen breit    42
int zahl = 42;
double pi = 3.14159;

printf("Zahl: %d\n", zahl);
// Ausgabe: Zahl: 42

printf("Pi: %f\n", pi);
// Ausgabe: Pi: 3.141590

printf("Pi: %.2f\n", pi);
// Ausgabe: Pi: 3.14

printf("Zahl: %5d\n", zahl);
// Ausgabe: Zahl: 42

Scanf im Detail

⌨️ Wichtige Details zu scanf()

⚠️ Unterschiede bei int und double:

  • int: Verwenden Sie %d (genau wie bei printf)
  • double: Verwenden Sie %lf (NICHT %f!)
int alter;
double groesse;

printf("Alter eingeben: ");
scanf("%d", &alter);
// %d für int

printf("Größe in Metern: ");
scanf("%lf", &groesse);
// %lf für double (nicht %f!)

💡 Warum &-Zeichen?

Das &-Zeichen vor dem Variablennamen ist der Adressoperator. Er gibt scanf() die Adresse der Variable im Speicher, sodass die Funktion den eingelesenen Wert dort ablegen kann.

Merke: Bei scanf() immer & vor dem Variablennamen!

Operator-Vorrangregeln

📐 Punkt vor Strich

Wie in der Mathematik gilt: Punktrechnung vor Strichrechnung. Die Operatoren * und / haben also Vorrang vor den Operatoren + und -. Sie können zusätzlich Klammern setzen, um die Reihenfolge der Berechnung zu beeinflussen.

int a = 10, b = 5, c = 2;
int ergebnis1, ergebnis2, ergebnis3;

ergebnis1 = a + b * c;
// = 10 + (5 * 2) = 10 + 10 = 20

ergebnis2 = (a + b) * c;
// = (10 + 5) * 2 = 15 * 2 = 30

ergebnis3 = a / b + c;
// = (10 / 5) + 2 = 2 + 2 = 4

💡 Vorrangtabelle:

Priorität Operatoren Beschreibung
1 (höchste) ( ) Klammern
2 * / % Multiplikation, Division, Modulo
3 (niedrigste) + - Addition, Subtraktion

Datenumwandlung (Type Conversion)

🔄 Automatische Typumwandlung

Eine Rechenoperation, an der eine ganze Zahl und eine Zahl mit Nachkommastellen beteiligt sind, ergibt in C eine Zahl mit Nachkommastellen.

int anzahl = 5;
double preis = 2.50;
double summe;

summe = anzahl * preis;
// int * double = double
// Ergebnis: 12.50

⚠️ Problem: Ganzzahldivision

Bei der Berechnung des mittleren Preises pro Artikel wird eine double-Variable durch die Summe von zwei int-Variablen geteilt. Es ergibt sich ein double-Wert.

int a = 11, b = 4;
double ergebnis;

ergebnis = a / b;
// int / int = int!
// Ergebnis: 2.00 (FALSCH!)

ergebnis = 1.0 * a / b;
// double * int / int = double
// Ergebnis: 2.75 (RICHTIG!)

⚠️ Häufige Fehler vermeiden

Typische Anfängerfehler

1. Adressoperator bei scanf vergessen:

// FALSCH:
scanf("%d", anzahl);
// Fehlt &

// RICHTIG:
scanf("%d", &anzahl);
// Mit &

2. Falscher Platzhalter bei scanf für double:

// FALSCH:
scanf("%f", &preis);
// %f ist falsch

// RICHTIG:
scanf("%lf", &preis);
// %lf für double

3. Variable nicht deklariert:

// FALSCH:
anzahl = 5;
// Variable nicht deklariert!

// RICHTIG:
int anzahl = 5;
// Zuerst deklarieren

4. Dezimalkomma statt Dezimalpunkt:

// FALSCH:
double preis = 1,45;
// Komma ist falsch!

// RICHTIG:
double preis = 1.45;
// Punkt verwenden!

Vielen Dank!

Fragen?

Prof. Dr. Alexandra Mikityuk

📧 HTW Berlin

🏢 Raum 308

📞 +49 30 5019-2664

📝 Übungsaufgabe nicht vergessen!

Schreiben Sie das Rabatt-Programm und testen Sie es ausführlich.

1 / 27