Imperatives Programmieren: Bekannte Konzepte und Beispiele
Definition:
Imperatives Programmieren: Programmierparadigma, bei dem Anweisungen in einer bestimmten Reihenfolge ausgeführt werden.
Details:
- Sequenz von Befehlen: Befehle werden nacheinander ausgeführt.
- Kontrollstrukturen: Anweisungen, die den Fluss des Programms steuern (z.B. Schleifen, Bedingungsabfragen).
- Variablen: Speicherplätze für Daten, die während der Programmausführung verändert werden können.
- Prozeduren und Funktionen: Wiederverwendbare Codeblöcke, die bestimmte Aufgaben ausführen.
Objektorientiertes Programmieren: Klassen, Objekte und Vererbung
Definition:
Objektorientiertes Programmieren basiert auf den Konzepten Klassen, Objekte und Vererbung.
Details:
- Klassen: Baupläne für Objekte, definieren Eigenschaften (Attribute) und Methoden.
- Objekte: Instanzen einer Klasse, besitzen konkrete Werte für die Attribute.
- Vererbung: Mechanismus, bei dem eine Klasse (Unterklasse) Eigenschaften und Methoden einer anderen Klasse (Oberklasse) übernimmt.
- Syntax (Beispiel in Python):
class Oberklasse: def __init__(self, attribut): self.attribut = attribut def methode(self): pass class Unterklasse(Oberklasse): def __init__(self, attribut, neues_attribut): super().__init__(attribut) self.neues_attribut = neues_attribut def neue_methode(self): pass
Funktionales Programmieren: Funktionen als erste Bürger, Rekursion
Definition:
Funktionales Programmieren: Funktionen werden als Daten behandelt, können als Argumente verwendet und von anderen Funktionen zurückgegeben werden.
Details:
- Funktionen als erste Bürger: Funktionen können wie Variablen behandelt werden.
- Rekursion: Eine Funktion ruft sich selbst auf, meist mit Basiskondition und Rekursionsschritt.
- Beispiel:
f(n) = n * f(n-1)
mit f(0) = 1
- Vorteile: Oft klarere und kürzere Programme, insbesondere bei Listen- und Baumoperationen.
- Nachteile: Kann zu höherem Speicherverbrauch und schlechterer Performance führen.
Sortier- und Suchalgorithmen: Grundkonzepte und Optimierungen
Definition:
Grundlegende Techniken zum Ordnen von Daten und Finden spezifischer Elemente in einer Datenstruktur.
Details:
- Sortieralgorithmen: Bubble Sort, Merge Sort, Quicksort, Heapsort
- Suchalgorithmen: Lineare Suche, Binäre Suche
- Komplexität: Bestimme Laufzeiten mit \(\text{O}(n)\), \(\text{O}(n \log n)\), \(\text{O}(n^2)\)
- Stabilität und In-Situ-Sortierung
- Optimierungen: Tuning von Pivot-Auswahl bei Quicksort, Einfügen von Insertion Sort in Merge Sort
- Data-Structures: Arrays, Listen, Heaps für effiziente Implementierung
Rekursion und iterative Algorithmen: Methoden und Beispiele
Definition:
Rekursion und iterative Algorithmen sind Methoden zur Lösung von Problemen, wobei Rekursion auf sich selbst zurückgreift und Iteration wiederholte Anweisungen nutzt.
Details:
- Rekursion: Ein Verfahren ruft sich selbst auf.
- Iterative Algorithmen: Schleifen wie 'for', 'while'.
- Basisfall: Rekursion endet, um Endlosschleifen zu vermeiden.
- Beispiele Rekursion: Fakultät, Fibonacci.
- Beispiele Iteration: Berechnung von Summen, Durchlaufen von Listen.
- Komplexität: Rekursion kann höheren Speicherbedarf haben (Stapelüberlauf).
- Iterative Algorithmen: Effizienter in Bezug auf Speicher.
- Beispiele:
- Fibonacci-Rekursion: \texttt{def fib(n): return n if n<=1 else fib(n-1) + fib(n-2)}
- Fibonacci-Iterativ: \texttt{def fib(n): a, b = 0, 1; for _ in range(n): a, b = b, a+b; return a}
- Umwandlung: Rekursive Algorithmen oft in iterative übertragbar.
Hash-Tabellen: Effiziente Speichermechanismen und ihre Implementierung
Definition:
Hash-Tabellen speichern Daten effizient mittels Schlüssel-Wert-Paaren.
Details:
- Nutzen Hash-Funktionen, die einem Schlüssel einen Speicherplatz zuweisen.
- Typische Operationen: Einfügen (\textit{insert}), Suchen (\textit{lookup}), und Löschen (\textit{delete}).
- \textbf{Komplexität}: Durchschnittliche O(1) Zeit für grundlegende Operationen.
- \textbf{Kollisionen}: Werden mit Techniken wie Verkettung oder offener Adressierung behandelt.
- \textbf{Belastungsfaktor} (\textit{load factor}): Verhältnis der Anzahl der Elemente zur Kapazität der Hash-Tabelle; beeinflusst Leistung.
- Implementiert in vielen Programmiersprachen, z.B. \texttt{dict} in Python, \texttt{HashMap} in Java.
- Effizienter Speichermechanismus bei großen Datenmengen und häufigen Datenzugriffen.
Fehlerbehebung und Debugging: Techniken zur Problemlösung
Definition:
Identifikation, Analyse und Behebung von Fehlfunktionen im Code
Details:
- Debugging-Tools: z.B. gdb, Eclipse Debugger
- Logging: Verwende Logausgaben, um Programmfluss und Zustände zu analysieren
- Breakpoints: Unterbrechen des Programms an bestimmten Stellen zur Analyse
- Schrittweises Ausführen: Codezeilen einzeln ausführen, um Fehler schrittweise zu finden
- Unit-Tests: Automatisierte Tests für einzelne Codeeinheiten
- Code Reviews: Durchsicht des Codes durch andere Entwickler
Versionierung mit Git: Werkzeuge zur Versionskontrolle und Kollaboration
Definition:
Git ist ein verteiltes Versionskontrollsystem zur Verfolgung von Änderungen im Quellcode während der Softwareentwicklung.
Details:
- Verteilen und Zusammenführen von Änderungen: Git ermöglicht das gleichzeitige Arbeiten mehrerer Entwickler an einem Projekt.
- Branching: Erstellen von isolierten Entwicklungszweigen für unterschiedliche Funktionen oder Bugfixes.
- Commit-Historie: Nachvollziehbare Änderungshistorie mit Verweisen auf spezifische Änderungen.
- Tags: Markieren von spezifischen Punkten in der Historie (z.B. Releases).
- Remote Repositories: Zusammenarbeit über zentrale Server wie GitHub oder GitLab.
- Wichtige Befehle:
git init
(Initialisieren), git clone
(Klonen), git commit
(Änderungen speichern), git push
(Änderungen hochladen), git pull
(Änderungen herunterladen)