Aufgaben: Der Entwicklungsprozess
Diese Phasen der Entwicklung eines Programms sind durcheinandergeraten: (a) das Programm mit verschiedenen Daten testen, (b) den Quelltext bearbeiten, (c) gefundene…
Diese Phasen der Entwicklung eines Programms sind durcheinandergeraten: (a) das Programm mit verschiedenen Daten testen, (b) den Quelltext bearbeiten, (c) gefundene Fehler beheben (Debugging), (d) das Programm ausführen. Bringe sie in eine sinnvolle Reihenfolge und erkläre, was in jeder Phase gemacht wird. Berücksichtige dabei, dass beim Testen möglicherweise ein Schritt zurück nötig ist.
Erkläre, was ein „Bug“ in einem Programm ist und was Debuggen bedeutet. Gib ein einfaches Beispiel für einen Fehler, den das Programm eines Geldautomaten haben könnte,…
Erkläre, was ein „Bug“ in einem Programm ist und was Debuggen bedeutet. Gib ein einfaches Beispiel für einen Fehler, den das Programm eines Geldautomaten haben könnte, und welche Folge er für den Nutzer hätte.
Die Abbildung zeigt den Arbeitszyklus der Entwicklung eines Programms, aber eine seiner Etappen ist mit einem Fragezeichen verdeckt, wie in der Abbildung gezeigt. Gib…
Die Abbildung zeigt den Arbeitszyklus der Entwicklung eines Programms, aber eine seiner Etappen ist mit einem Fragezeichen verdeckt, wie in der Abbildung gezeigt.
Gib an, welche Etappe im Zyklus fehlt, worin sie besteht und warum der „nein“-Pfeil die Arbeit zurück zur Bearbeitung des Codes führt.
Erkläre, was eine Trace- oder Protokollmeldung (Log) in einem Programm ist und wie sie hilft, einen Fehler zu finden (sie zeigt, wo das Programm entlanggelaufen ist und…
Erkläre, was eine Trace- oder Protokollmeldung (Log) in einem Programm ist und wie sie hilft, einen Fehler zu finden (sie zeigt, wo das Programm entlanggelaufen ist und mit welchen Werten).
Programme haben Versionen (1.0, 1.1, 2.0 ...). Erkläre, wozu es dient, Versionen des Codes zu speichern, und was du tun kannst, wenn die neueste Version schlechter…
Programme haben Versionen (1.0, 1.1, 2.0 ...). Erkläre, wozu es dient, Versionen des Codes zu speichern, und was du tun kannst, wenn die neueste Version schlechter funktioniert als die vorherige.
Erkläre, was ein Testfall ist, und schreibe zwei Testfälle für ein Programm, das zwei Zahlen addiert: einen mit normalen Werten und einen mit einem besonderen Wert. Gib…
Erkläre, was ein Testfall ist, und schreibe zwei Testfälle für ein Programm, das zwei Zahlen addiert: einen mit normalen Werten und einen mit einem besonderen Wert. Gib jeweils die Eingabe und das erwartete Ergebnis an.
Die Dokumentation begleitet das Programm. Erkläre, welche zwei Dinge sie mindestens erklären sollte (was das Programm tut und wie man es benutzt) und warum ein…
Die Dokumentation begleitet das Programm. Erkläre, welche zwei Dinge sie mindestens erklären sollte (was das Programm tut und wie man es benutzt) und warum ein undokumentiertes Programm schlecht „altert“, wenn ein Team daran arbeitet.
Unterscheide zwischen einem Fehler, der beim Kompilieren auftritt (das Programm startet gar nicht erst), und einem Fehler, der zur Laufzeit auftritt (es startet,…
Unterscheide zwischen einem Fehler, der beim Kompilieren auftritt (das Programm startet gar nicht erst), und einem Fehler, der zur Laufzeit auftritt (es startet, scheitert aber bei bestimmten Daten), mit je einem Beispiel.
Erkläre den Unterschied zwischen einem Syntaxfehler und einem Logikfehler, mit je einem Beispiel in einem Programm, das den Durchschnitt von drei Noten berechnet. Welche…
Erkläre den Unterschied zwischen einem Syntaxfehler und einem Logikfehler, mit je einem Beispiel in einem Programm, das den Durchschnitt von drei Noten berechnet. Welche der beiden Fehlerarten verhindert die Ausführung des Programms und welche lässt die Ausführung zu, liefert aber falsche Ergebnisse?
Ein Programm, das zwei Zahlen dividiert, funktioniert in fast allen Tests richtig, schlägt aber fehl, wenn der Divisor 0 ist. Erkläre, was Grenzwerte oder Sonderfälle…
Ein Programm, das zwei Zahlen dividiert, funktioniert in fast allen Tests richtig, schlägt aber fehl, wenn der Divisor 0 ist. Erkläre, was Grenzwerte oder Sonderfälle beim Testen sind, warum man sie immer testen muss, und nenne zwei weitere Werte, mit denen du dieses Programm testen würdest.
Erkläre, was die Modularisierung eines Programms ist (es in Funktionen oder Module aufzuteilen), und analysiere zwei Vorteile, die sie bringt, wenn die Entwicklung in…
Erkläre, was die Modularisierung eines Programms ist (es in Funktionen oder Module aufzuteilen), und analysiere zwei Vorteile, die sie bringt, wenn die Entwicklung in einem Team mehrerer Personen erfolgt: Denke an die Arbeitsaufteilung, an das Testen und an das Auffinden von Fehlern.
Eine Schleife in einem Programm hört nie auf. Erkläre, wo du temporäre Ausgabemeldungen zur Diagnose platzieren würdest (innerhalb der Schleife, mit Anzeige der…
Eine Schleife in einem Programm hört nie auf. Erkläre, wo du temporäre Ausgabemeldungen zur Diagnose platzieren würdest (innerhalb der Schleife, mit Anzeige der Laufvariablen in jedem Durchlauf) und was du in diesen Meldungen beobachten würdest, um die Ursache zu finden.
Um ein Programm zu testen, das Personen ab 65 Jahren einen Rabatt gewährt, lege drei Testfälle fest: einen mit einem normalen Wert, einen mit dem genauen Grenzwert und…
Um ein Programm zu testen, das Personen ab 65 Jahren einen Rabatt gewährt, lege drei Testfälle fest: einen mit einem normalen Wert, einen mit dem genauen Grenzwert und einen mit einem fehlerhaften Wert (negatives oder unmögliches Alter), jeweils mit dem erwarteten Ergebnis. Begründe deine Auswahl.
Erkläre, was Refactoring ist (den Code verbessern, ohne zu ändern, was er tut), und beschreibe zwei typische Refactorings (Variablen mit klaren Namen umbenennen, aus…
Erkläre, was Refactoring ist (den Code verbessern, ohne zu ändern, was er tut), und beschreibe zwei typische Refactorings (Variablen mit klaren Namen umbenennen, aus wiederholtem Code eine Funktion extrahieren), mit je einem Beispiel.
Ein Codefragment verwendet die Variablen x, y2 und zzz, um den Preis, die Mehrwertsteuer und den Gesamtbetrag zu speichern. Schreibe diese Namen sinnvoll um und erkläre,…
Ein Codefragment verwendet die Variablen x, y2 und zzz, um den Preis, die Mehrwertsteuer und den Gesamtbetrag zu speichern. Schreibe diese Namen sinnvoll um und erkläre, warum die Wahl der Namen ein Mittel gegen Fehler ist (der Code dokumentiert sich selbst).
Zwei Personen eines Teams bearbeiten gleichzeitig dieselbe Datei des Projekts und beim Zusammenführen der Änderungen tritt ein Konflikt auf. Erkläre, was ein…
Zwei Personen eines Teams bearbeiten gleichzeitig dieselbe Datei des Projekts und beim Zusammenführen der Änderungen tritt ein Konflikt auf. Erkläre, was ein Merge-Konflikt ist, wie man ihn löst (beide Versionen prüfen und entscheiden) und welche zwei Arbeitsgewohnheiten im Team ihn verhindern (die Arbeit nach Modulen aufteilen, Änderungen häufig integrieren).
Im Abrechnungssystem einer Schülergenossenschaft wurde festgestellt, dass beim Erstellen der monatlichen Rechnung der zu zahlende Gesamtbetrag einiger Mitglieder falsch…
Im Abrechnungssystem einer Schülergenossenschaft wurde festgestellt, dass beim Erstellen der monatlichen Rechnung der zu zahlende Gesamtbetrag einiger Mitglieder falsch ist. Ihnen liegen die folgenden Systemprotokolle vor:
-
Mitglied 101: 2 Einkäufe zu je 15,00 € -> abgerechneter Gesamtbetrag: 30,00 € (erwartet: 30,00 €).
-
Mitglied 102: 1 Einkauf zu 50,00 € mit Aktionsrabatt von 10 % (5,00 €) und Bearbeitungsgebühr von 3,00 € -> abgerechneter Gesamtbetrag: 47,50 € (erwartet: 48,00 €).
-
Mitglied 103: 1 Einkauf zu 20,00 € und Rückgabe von 1 Artikel zu 5,00 € (-5,00 €) -> abgerechneter Gesamtbetrag: 25,00 € (erwartet: 15,00 €).
-
Formulieren Sie eine begründete Hypothese zum logischen Fehler bzw. zum Fehler in der Reihenfolge der Operationen, der den Fehler bei Mitglied 102 und Mitglied 103 erklärt.
-
Entwerfen Sie die Debugging-Strategie, um Ihre Hypothesen zu bestätigen: Geben Sie an, welche minimalen Testdaten Sie eingeben würden, um den Fehler zu isolieren, an welchen Stellen des Programmablaufs Sie Haltepunkte (Breakpoints) setzen würden und welche konkreten Variablen Sie Schritt für Schritt untersuchen müssten.
Ein Teammitglied zeigt Ihnen die folgende C++-Funktion, die den Endpreis inklusive Mehrwertsteuer berechnet und einen Rabatt gewährt, wenn der Kunde Mitglied ist, und…
Ein Teammitglied zeigt Ihnen die folgende C++-Funktion, die den Endpreis inklusive Mehrwertsteuer berechnet und einen Rabatt gewährt, wenn der Kunde Mitglied ist, und behauptet: „Wenn sie ohne Fehler und Warnungen kompiliert, kann sie zur Laufzeit unmöglich fehlschlagen; man muss sie nicht testen."
float berechneEndpreis(float basis, bool istMitglied) {
float gesamt = basis;
if (istMitglied = true) {
gesamt = gesamt * 0.90f;
}
gesamt = gesamt * 1.21f;
return gesamt;
}
-
Sagen Sie begründet die Ausgabe der Funktion für einen Kunden ohne Mitgliedschaft (
istMitglied = false) bei einem Grundpreis von 100,00 € voraus. Entspricht sie dem erwarteten Verhalten? Erklären Sie, warum der Compiler dies nicht als Fehler zurückweist. -
Begründen Sie anhand dieses Beispiels den Unterschied zwischen dem, was die syntaktische Prüfung des Compilers garantiert, und dem, was dynamische Softwaretests nachweisen.
-
Schlagen Sie eine Korrektur des Codes vor und schreiben Sie einen konkreten Testfall, der den Fehler aufzeigen würde, wenn die Korrektur nicht angewendet wäre.
Entwerfen Sie einen Testplan für ein Programm, das zwei Zahlen abfragt und deren Quotienten ausgibt: Erstellen Sie eine Tabelle mit mindestens sechs Testfällen (Paare…
Entwerfen Sie einen Testplan für ein Programm, das zwei Zahlen abfragt und deren Quotienten ausgibt: Erstellen Sie eine Tabelle mit mindestens sechs Testfällen (Paare von Eingabewerten, darunter normale Werte, Grenzwerte und fehlerhafte Werte), dem erwarteten Ergebnis jedes Falls und dem, was das Programm bei ungültiger Eingabe tun sollte. Begründen Sie die Auswahl jedes Falls.
Ein Skript zur Wettersimulation schlägt bei etwa jeder zwanzigsten Ausführung mit einer unerwarteten Ausnahme fehl, doch bei manueller Ausführung Schritt für Schritt…
Ein Skript zur Wettersimulation schlägt bei etwa jeder zwanzigsten Ausführung mit einer unerwarteten Ausnahme fehl, doch bei manueller Ausführung Schritt für Schritt tritt der Fehler nie auf (das Programm verwendet Echtzeit-Anfragen an eine API und eine Funktion zur Erzeugung von Zufallszahlen).
-
Begründen Sie, warum dieser Fehler als nicht deterministisch (Heisenbug) eingestuft wird, und benennen Sie die zwei Quellen der Variabilität, die verhindern, dass er sich nach Belieben reproduzieren lässt.
-
Entwerfen Sie einen technischen Aktionsplan, um den Fehler kontrolliert zu reproduzieren, ohne passiv darauf zu warten, dass er zufällig auftritt (erklären Sie, wie Sie den Pseudozufallszahlengenerator behandeln und die externen Netzwerkaufrufe entkoppeln würden).
-
Welches Testverfahren würden Sie nach der Lokalisierung und Behebung des Defekts anwenden, um zu belegen, dass der Fehler vollständig verschwunden ist und es sich nicht nur um einen statistischen Zufall handelt?
Das Intranet der Schule implementiert ein Authentifizierungsmodul mit folgenden Anforderungen: Benutzername: 4 bis 12 alphanumerische Zeichen, Groß- und Kleinschreibung…
Das Intranet der Schule implementiert ein Authentifizierungsmodul mit folgenden Anforderungen:
-
Benutzername: 4 bis 12 alphanumerische Zeichen, Groß- und Kleinschreibung wird nicht unterschieden.
-
Passwort: zwischen 8 und 16 Zeichen, Groß- und Kleinschreibung wird unterschieden, mit mindestens einer Ziffer und einem Sonderzeichen.
-
Sicherheit: vorübergehende Sperrung des Kontos für 15 Minuten nach drei aufeinanderfolgenden fehlgeschlagenen Versuchen.
Entwerfen Sie einen sorgfältigen Testplan in Form einer Tabelle mit mindestens sechs von Ihnen entworfenen Testfällen. Für jeden Fall müssen Sie angeben: Kennung, Eingabewerte (Benutzername und Passwort), vorheriger Systemzustand, erwartetes Ergebnis und welches spezifische Risiko in Bezug auf Logik, Grenzwerte oder Sicherheit Sie damit überprüfen.
Ein Programmierer behauptet, „eine einzeilige Funktion braucht keine Tests, weil sie selbsterklärend ist", und präsentiert diese in C++ geschriebene Funktion: 1. Sagen…
Ein Programmierer behauptet, „eine einzeilige Funktion braucht keine Tests, weil sie selbsterklärend ist", und präsentiert diese in C++ geschriebene Funktion:
bool esImpar(int n) {
return (n % 2 == 1);
}
-
Sagen Sie die Ausgabe der Funktion für
n = 7,n = 0undn = -7voraus. Erklären Sie technisch, warum in einem dieser Fälle ein unerwartetes Ergebnis entsteht, und stützen Sie sich dabei darauf, wie der Modulo-Operator (%) in dieser Sprache negative Operanden behandelt. -
Korrigieren Sie den Ausdruck so, dass die Funktion für jede ganze Zahl mathematisch korrekt ist.
-
Widerlegen Sie anhand dieses Falls mit zwei technischen Argumenten die Idee, bei kurzen oder scheinbar trivialen Algorithmen auf Unit-Tests zu verzichten.
Das Überwachungssystem eines Gewächshauses wurde in einer einzigen Datei innerhalb einer einzigen Funktion mit 400 Zeilen programmiert. Der Code liest nacheinander drei…
Das Überwachungssystem eines Gewächshauses wurde in einer einzigen Datei innerhalb einer einzigen Funktion mit 400 Zeilen programmiert. Der Code liest nacheinander drei analoge Bodenfeuchtesensoren aus, berechnet den Mittelwert, wertet Schwellenwerte aus, steuert über einen digitalen Pin ein Magnetventil, speichert das Verlaufsprotokoll in einer Textdatei und sendet eine Warn-E-Mail, wenn die Feuchtigkeit unter 30 % fällt.
-
Begründen Sie ausführlich drei gravierende technische Probleme, die diese Architektur verursacht, wenn ein sporadisch auftretender Fehler gesucht oder automatisierte Unit-Tests durchgeführt werden sollen.
-
Entwerfen Sie eine modulare Umstrukturierung (Refactoring) des Programms: Zerlegen Sie die Funktion in mindestens vier unabhängige Funktionen. Legen Sie für jede den Namen, die Eingabeparameter mit Typ, den Rückgabewert und die eigene, einzige Verantwortung fest.
-
Erklären Sie, wie Ihr Entwurf es ermöglichen würde, den Entscheidungsalgorithmus für die Bewässerung durch simulierte Daten zu testen, ohne dass die physischen Sensoren am Mikrocontroller angeschlossen sind.
Eine Gruppe von drei Schülerinnen und Schülern wird zehn Wochen lang eine Anwendung zur Anwesenheitskontrolle für die Schule entwickeln. Um Verzögerungen und…
Eine Gruppe von drei Schülerinnen und Schülern wird zehn Wochen lang eine Anwendung zur Anwesenheitskontrolle für die Schule entwickeln. Um Verzögerungen und gescheiterte Abgaben in letzter Minute zu vermeiden, sollen Sie die Arbeitsmethodik des Teams strukturieren:
-
Entwerfen Sie einen Zeitplan mit vier überprüfbaren Meilensteinen bzw. Lieferergebnissen und erklären Sie, welche objektiven Kriterien erfüllt sein müssen, bevor der Übergang zum nächsten Meilenstein freigegeben wird.
-
Legen Sie ein formales Protokoll für die Überprüfung durch Kollegen (Code-Review) fest: Bestimmen Sie, wer wessen Code prüft, welche Checkliste mit Mindestqualitätskriterien erfüllt sein muss, bevor eine Änderung akzeptiert wird, und wie Meinungsverschiedenheiten gelöst werden.
-
Legen Sie eine Richtlinie zum „Code-Freeze" (Code Freeze) fest und begründen Sie sie: In welcher Woche muss er greifen, welche Arten von Änderungen sind ab diesem Zeitpunkt strikt verboten und welche Aufgaben muss das Team bis zur endgültigen Abgabe ausschließlich übernehmen?
Herausforderung des Themas. Als Nachwuchs-Softwareanalystin bzw. -analyst entwerfen Sie ein Python-Skript (Sie können eine kostenlose Webumgebung wie Replit nutzen), das…
Herausforderung des Themas. Als Nachwuchs-Softwareanalystin bzw. -analyst entwerfen Sie ein Python-Skript (Sie können eine kostenlose Webumgebung wie Replit nutzen), das die täglichen Energiekosten auswertet, um das Energiesparen im Haushalt zu fördern.
Gehen Sie in drei Phasen vor:
-
Datenerfassung: Rufen Sie die Website der Bundesnetzagentur (SMARD) auf und notieren Sie den offiziellen Preis ($€/\text{kWh}$) für $6$ verschiedene Zeitfenster des heutigen Tages.
-
Entwurf und Codierung: Wenden Sie den Softwareentwicklungsprozess an. Skizzieren Sie zuerst den Algorithmus und übertragen Sie ihn dann nach Python. Das Programm muss die Daten in einer Liste speichern, mit einer Schleife den durchschnittlichen Tageskostenwert berechnen und Verzweigungen (
if-else) verwenden, die Warnungen ausgeben, wenn der Preis den Schwellenwert von $0,18$ €/kWh übersteigt. -
Debugging und Endprodukt: Führen Sie Tests mit Grenzwerten durch und beheben Sie Laufzeitfehler. Verfassen Sie einen kurzen Bericht, der den sauberen, kommentierten Code, einen Screenshot des Ergebnisses in der Konsole und zwei Vorschläge für einen effizienten Verbrauch in Ihrem Haushalt auf Grundlage Ihrer Daten enthält.
Bewertet werden:
-
Sorgfalt im Entwicklungsprozess (vorheriger Algorithmenentwurf, textuelle Codierung und Debugging).
-
Korrekte Verwendung von Kontrollstrukturen (Sequenz, Verzweigung und Schleife) und der Syntax der Sprache.
-
Genauigkeit im Umgang mit realen Daten und Tragfähigkeit der energetischen Schlussfolgerungen.