Grundlagen der Programmierung
Ein Algorithmus ist eine Schritt-für-Schritt-Anleitung zur Lösung eines Problems.
Wie ein Kochrezept - aber für den Computer!
Wann zählen wir aufwärts und wann abwärts?
✅ Standard für Arrays durchlaufen
✅ Summe berechnen
✅ Elemente zählen
✅ Array umgekehrt ausgeben
✅ Countdown
✅ Elemente löschen
#include <stdio.h> int main() { int zahlen[5] = {10, 20, 30, 40, 50}; printf("Array vorwärts:\n"); for (int i = 0; i < 5; i++) { printf("zahlen[%d] = %d\n", i, zahlen[i]); } return 0; }
#include <stdio.h> int main() { int zahlen[5] = {10, 20, 30, 40, 50}; printf("Array rückwärts:\n"); for (int i = 4; i >= 0; i--) { printf("zahlen[%d] = %d\n", i, zahlen[i]); } return 0; }
#include <stdio.h> int main() { printf("Raketenstart!\n\n"); /* Countdown von 10 bis 1 */ for (int i = 10; i >= 1; i--) { printf("%d...\n", i); } printf("\n🚀 LIFTOFF!\n"); return 0; }
Wie tauschen wir die Werte von zwei Variablen?
Problem: Der ursprüngliche Wert von a wird überschrieben, bevor wir ihn speichern!
Wir brauchen einen "Zwischenspeicher" - wie beim Umräumen von Gläsern!
#include <stdio.h> int main() { int a = 5; int b = 3; int temp; printf("Vorher: a = %d, b = %d\n", a, b); /* Tauschen mit Hilfsvariable */ temp = a; // 1. Wert von a sichern a = b; // 2. b nach a kopieren b = temp; // 3. Gesicherten Wert nach b printf("Nachher: a = %d, b = %d\n", a, b); return 0; }
Das gleiche Prinzip funktioniert auch mit Array-Elementen:
#include <stdio.h> int main() { int zahlen[5] = {10, 20, 30, 40, 50}; int temp; printf("Vorher: %d, %d, %d, %d, %d\n", zahlen[0], zahlen[1], zahlen[2], zahlen[3], zahlen[4]); /* Element 0 und Element 4 tauschen */ temp = zahlen[0]; zahlen[0] = zahlen[4]; zahlen[4] = temp; printf("Nachher: %d, %d, %d, %d, %d\n", zahlen[0], zahlen[1], zahlen[2], zahlen[3], zahlen[4]); return 0; }
Wie finden wir die größte Zahl in einem Array?
| Schritt | Element | Vergleich | max |
|---|---|---|---|
| Start | zahlen[0] = 7 | - | 7 |
| i = 1 | zahlen[1] = 3 | 3 > 7? ❌ Nein | 7 |
| i = 2 | zahlen[2] = 12 | 12 > 7? ✅ Ja! | 12 |
| i = 3 | zahlen[3] = 5 | 5 > 12? ❌ Nein | 12 |
| i = 4 | zahlen[4] = 9 | 9 > 12? ❌ Nein | 12 |
| Ende | - | - | 12 ✓ |
#include <stdio.h> int main() { int zahlen[5] = {7, 3, 12, 5, 9}; int max; /* Erstes Element als Startwert */ max = zahlen[0]; /* Alle weiteren Elemente prüfen */ for (int i = 1; i < 5; i++) { if (zahlen[i] > max) { max = zahlen[i]; } } printf("Das Maximum ist: %d\n", max); return 0; }
⚠️ Nur beim Maximum/Minimum-Algorithmus!
Der Grund: Wir setzen max = zahlen[0] vor der Schleife als Startwert.
→ Element [0] wurde also schon verwendet! Es wäre sinnlos, zahlen[0] > zahlen[0] zu prüfen.
n-1 Vergleiche (optimal)
n Vergleiche (1 unnötig: zahlen[0] > zahlen[0])
i = 0, weil alle Elemente durchlaufen werden müssen.
Fast identisch zum Maximum - nur das Vergleichszeichen ändert sich!
#include <stdio.h> int main() { int zahlen[5] = {7, 3, 12, 5, 9}; int min; /* Erstes Element als Startwert */ min = zahlen[0]; /* Alle weiteren Elemente prüfen */ for (int i = 1; i < 5; i++) { if (zahlen[i] < min) // Nur dieses Zeichen ändert sich! { min = zahlen[i]; } } printf("Das Minimum ist: %d\n", min); return 0; }
#include <stdio.h> int main() { int zahlen[5] = {7, 3, 12, 5, 9}; int min, max; /* Beide mit erstem Element initialisieren */ min = zahlen[0]; max = zahlen[0]; for (int i = 1; i < 5; i++) { if (zahlen[i] < min) min = zahlen[i]; if (zahlen[i] > max) max = zahlen[i]; } printf("Minimum: %d\n", min); printf("Maximum: %d\n", max); printf("Spannweite: %d\n", max - min); return 0; }
Manchmal brauchen wir nicht nur den Wert, sondern auch wo er steht:
#include <stdio.h> int main() { int zahlen[5] = {7, 3, 12, 5, 9}; int maxPos = 0; // Position des Maximums for (int i = 1; i < 5; i++) { if (zahlen[i] > zahlen[maxPos]) { maxPos = i; // Neue Position merken } } printf("Maximum %d steht an Position %d\n", zahlen[maxPos], maxPos); return 0; }
#include <stdio.h> int main() { int noten[6] = {2, 1, 3, 2, 4, 1}; int beste = noten[0]; int schlechteste = noten[0]; for (int i = 1; i < 6; i++) { if (noten[i] < beste) // Kleinere Note = besser! beste = noten[i]; if (noten[i] > schlechteste) // Größere Note = schlechter! schlechteste = noten[i]; } printf("Beste Note: %d\n", beste); printf("Schlechteste Note: %d\n", schlechteste); return 0; }
Was ist der Wert von a und b nach diesem Code?
A) a = 10, b = 20
B) a = 20, b = 10
C) a = 20, b = 20
D) a = 10, b = 10
Die Werte wurden erfolgreich getauscht!
| Zeile | a | b | temp |
|---|---|---|---|
| Anfang | 10 | 20 | ? |
| temp = a | 10 | 20 | 10 |
| a = b | 20 | 20 | 10 |
| b = temp | 20 | 10 | 10 |
Was gibt dieses Programm aus?
A) 0
B) 4
C) 5
D) 20
Alle Elemente sind gleich → das Maximum ist 5.
max = arr[0] → max wird 5Welche Ausgabe erzeugt diese Schleife?
A) 1 2 3
B) 3 2 1
C) 3 2 1 0
D) 0 1 2 3
| i | i >= 1? | Ausgabe | Danach |
|---|---|---|---|
| 3 | ✅ Ja | 3 | i-- → 2 |
| 2 | ✅ Ja | 2 | i-- → 1 |
| 1 | ✅ Ja | 1 | i-- → 0 |
| 0 | ❌ Nein | - | Schleife endet |
• Array durchlaufen
• Summe berechnen
• Elemente zählen
• Min/Max finden
• Rückwärts ausgeben
• Countdown
• Elemente entfernen
• Palindrom prüfen
i >= 0 (nicht i > 0),
sonst wird Element [0] übersprungen!
Heute gelernt: Swap, Maximum, Minimum, Schleifenrichtungen
Diese Bausteine brauchen wir für fast jeden Algorithmus!