Grundlagen der Programmierung
Prof. Dr. Alexandra Mikityuk
HTW Berlin
Ein Akkumulator ist eine Variable, die Werte über die Schleife hinweg „einsammelt".
int akku = startwert; // 1. Initialisieren
for (int i = 0; i < n; i++)
{
akku = akku ○ arr[i]; // 2. Kombinieren
}
// ○ steht für: +, *, ++, …
Berechne die Summe aller Zahlen im Array.
summe = 0 (neutrales Element für +)Mit dem Array {3, 7, 2, 5} — wie wächst die Summe?
| Schritt | i | arr[i] | Berechnung | summe |
|---|---|---|---|---|
| Start | — | — | — | 0 |
| 1 | 0 | 3 | 0 + 3 | 3 |
| 2 | 1 | 7 | 3 + 7 | 10 |
| 3 | 2 | 2 | 10 + 2 | 12 |
| 4 | 3 | 5 | 12 + 5 | 17 ✓ |
#include <stdio.h>
int main()
{
int zahlen[4] = {3, 7, 2, 5};
int summe = 0; // Startwert für +: 0
for (int i = 0; i < 4; i++)
{
summe = summe + zahlen[i];
// Kurzform: summe += zahlen[i];
}
printf("Die Summe ist: %d\n", summe);
return 0;
}
summe += zahlen[i] ist identisch mitsumme = summe + zahlen[i]
summe = 0?Für die Addition gilt:
Mit Start bei 0 ist das erste Ergebnis genau das erste Array-Element — die Summe wird nicht verfälscht.
int summe; // NICHT initialisiert!
for (...) {
summe += zahlen[i]; // Zufallswert!
}
Ohne Initialisierung enthält summe einen zufälligen Wert → falsches Ergebnis.
Erst die Summe sammeln, dann durch die Anzahl teilen.
#include <stdio.h>
int main()
{
int zahlen[4] = {3, 7, 2, 5};
int summe = 0;
int anzahl = 4;
for (int i = 0; i < anzahl; i++)
{
summe += zahlen[i];
}
double schnitt = (double)summe / anzahl;
printf("Summe: %d\n", summe);
printf("Durchschnitt: %.2f\n", schnitt);
return 0;
}
Bei int / int rechnet C ganzzahlig — der Rest fällt weg.
int summe = 17;
int anzahl = 4;
double d = summe / anzahl;
int / int = int → abgerundet.
int summe = 17;
int anzahl = 4;
double d = (double)summe / anzahl;
(double)int / int = double
double casten — bevor dividiert wird.
Wie viele Zahlen sind größer als 5?
Antwort: 3 Zahlen (7, 8, 9)
zaehler = 0#include <stdio.h>
int main()
{
int zahlen[6] = {3, 7, 2, 8, 5, 9};
int zaehler = 0; // Startwert: 0
for (int i = 0; i < 6; i++)
{
if (zahlen[i] > 5) // Bedingung prüfen
{
zaehler++; // zaehler = zaehler + 1
}
}
printf("%d Zahlen sind groesser als 5\n", zaehler);
return 0;
}
if (bedingung)
→ nur dann zaehler++
Das Muster bleibt gleich — nur die Bedingung in if (…) ändert sich.
if (zahlen[i] % 2 == 0)
zaehler++;
if (zahlen[i] % 2 != 0)
zaehler++;
if (zahlen[i] > 0)
zaehler++;
if (zahlen[i] == 5)
zaehler++;
if (bedingung) zaehler++;
Gleiches Muster wie die Summe — nur multiplizieren statt addieren.
#include <stdio.h>
int main()
{
int zahlen[4] = {3, 7, 2, 5};
int produkt = 1; // Startwert für *: 1
for (int i = 0; i < 4; i++)
{
produkt = produkt * zahlen[i];
// Kurzform: produkt *= zahlen[i];
}
printf("Das Produkt ist: %d\n", produkt);
return 0;
}
produkt = 1?1 ist das neutrale Element der Multiplikation.
Startwert: 0
weil 0 + x = x
Startwert: 1
weil 1 × x = x
produkt = 0 wäre das Ergebnis immer 0 — denn 0 × x = 0.
n! = 1 × 2 × 3 × … × n — z.B. 5! = 120
#include <stdio.h>
int main()
{
int n = 5;
int fakultaet = 1; // Produkt startet bei 1
for (int i = 1; i <= n; i++)
{
fakultaet *= i; // 1, 2, 6, 24, 120
}
printf("%d! = %d\n", n, fakultaet);
return 0;
}
Schleife startet bei i = 1 und nutzt i <= n — wir multiplizieren mit den Zahlen selbst, nicht mit Array-Indizes.
Summe und Bedingung: nur die geraden Zahlen aufsummieren.
#include <stdio.h>
int main()
{
int zahlen[6] = {3, 8, 5, 2, 7, 4};
int summe = 0;
for (int i = 0; i < 6; i++)
{
if (zahlen[i] % 2 == 0) // nur gerade
{
summe += zahlen[i];
}
}
printf("Summe der geraden Zahlen: %d\n", summe);
// 8 + 2 + 4 = 14
return 0;
}
summe += mit einem if.
Zwei Akkumulatoren in einer Schleife: Durchschnitt und Bestanden-Zähler.
#include <stdio.h>
int main()
{
int noten[8] = {2, 1, 3, 2, 5, 1, 4, 2};
int summe = 0;
int bestanden = 0;
for (int i = 0; i < 8; i++)
{
summe += noten[i];
if (noten[i] <= 4)
bestanden++;
}
double schnitt = (double)summe / 8;
printf("Durchschnitt: %.2f\n", schnitt);
printf("Bestanden: %d von 8\n", bestanden);
return 0;
}
Mehrere Akkumulatoren teilen sich eine Schleife — kein doppelter Durchlauf nötig.
Was gibt dieses Programm aus?
int arr[3] = {1, 2, 3};
int summe = 0;
for (int i = 0; i < 3; i++)
summe += arr[i];
printf("%d", summe);
| i | arr[i] | summe |
|---|---|---|
| Start | — | 0 |
| 0 | 1 | 0 + 1 = 1 |
| 1 | 2 | 1 + 2 = 3 |
| 2 | 3 | 3 + 3 = 6 |
Wie viele gerade Zahlen werden gezählt?
int arr[5] = {1, 4, 2, 6, 3};
int count = 0;
for (int i = 0; i < 5; i++)
if (arr[i] % 2 == 0)
count++;
printf("%d", count);
| i | arr[i] | % 2 == 0? | count |
|---|---|---|---|
| 0 | 1 | ❌ Nein | 0 |
| 1 | 4 | ✅ Ja | 1 |
| 2 | 2 | ✅ Ja | 2 |
| 3 | 6 | ✅ Ja | 3 |
| 4 | 3 | ❌ Nein | 3 |
Was ist der korrekte Startwert für ein Produkt?
int produkt = ???;
for (int i = 0; i < n; i++)
produkt *= arr[i];
i = 1 startenJeder Akkumulator hat seinen eigenen, passenden Startwert.
| Operation | Startwert | Grund |
|---|---|---|
| ➕ Summe | 0 | 0 + x = x |
| ✖️ Produkt | 1 | 1 × x = x |
| 🔢 Zähler | 0 | noch nichts gezählt |
| ⬆️ Maximum | arr[0] | erstes Element als Vergleichswert |
| ⬇️ Minimum | arr[0] | erstes Element als Vergleichswert |
int summe = 0; // Start: 0
for (i = 0; i < n; i++)
{
summe += arr[i];
}
double schnitt =
(double)summe / n;
Cast nicht vergessen — sonst rundet C ab.
+=, Start bei 0.
int zaehler = 0; // Start: 0
for (i = 0; i < n; i++)
{
if (bedingung)
{
zaehler++;
}
}
arr[i] > 5arr[i] % 2 == 0arr[i] == wertint produkt = 1; // Start: 1, NICHT 0!
for (i = 0; i < n; i++)
{
produkt *= arr[i];
}
Mit produkt = 0 bleibt das Ergebnis immer 0.
Bei Multiplikation immer mit 1 starten.